Merge remote-tracking branch 'ParadiseSS13/master' into multi-instance-support

This commit is contained in:
AffectedArc07
2021-10-12 20:27:07 +01:00
168 changed files with 4097 additions and 8536 deletions
+7 -5
View File
@@ -465,7 +465,7 @@ SS13 has a lot of legacy code that's never been updated. Here are some examples
```DM
//Bad
var/datum/db_query/query_watch = SSdbcore.NewQuery("SELECT reason FROM [format_table_name("watch")] WHERE ckey='[target_ckey]'")
//Good
var/datum/db_query/query_watch = SSdbcore.NewQuery("SELECT reason FROM [format_table_name("watch")] WHERE ckey=:target_ckey", list(
"target_ckey" = target_ckey
@@ -502,11 +502,13 @@ in the SQL/updates folder.
* Queries must never specify the database, be it in code, or in text files in the repo.
### Mapping Standards
* For map edit PRs, we do not accept 'change for the sake of change' remaps, unless you have very good reasoning to do so. Maintainers reserve the right to close your PR if we disagree with your reasoning.
* Map Merge
* The following guideline for map merging applies to people who are **NOT** using StrongDMM, please see the StrongDMM section if you are.
* You **MUST** run Map Merge prior to opening your PR when updating existing maps to minimize the change differences (even when using third party mapping programs such as FastDMM.)
* Failure to run Map Merge on a map after using third party mapping programs (such as FastDMM) greatly increases the risk of the map's key dictionary becoming corrupted by future edits after running map merge. Resolving the corruption issue involves rebuilding the map's key dictionary;
* StrongDMM
* When using StrongDMM, the following options **MUST** be enabled to avoid file bloat. They can be found under `File > Preferences > Save Options` in SDMM.
* Map save format: This **MUST** be set to **TGM** if you do not want to run Map Merge. Enabling this setting means SDMM will automatically map merge, letting you skip manual merging.
@@ -526,10 +528,10 @@ in the SQL/updates folder.
* NEVER run cables under wall turfs.
* Keep floor turf variations to a minimum. Generally, more than 3 floor turf types in one room is bad design.
* Run air pipes together where possible. The first example below is to be avoided, the second is optimal:
![image](https://user-images.githubusercontent.com/12197162/120011088-d22c7400-bfd5-11eb-867f-7b137ac5b1b2.png) ![image](https://user-images.githubusercontent.com/12197162/120011126-dfe1f980-bfd5-11eb-96b2-c83238a9cdcf.png)
* Pipe layouts should be logical and predictable, easy to understand at a glance. Always avoid complex layouts like in this example:
* Pipe layouts should be logical and predictable, easy to understand at a glance. Always avoid complex layouts like in this example:
![image](https://user-images.githubusercontent.com/12197162/120619480-ecda6f00-c453-11eb-9d9f-abf0d1a99c34.png)
* Decals are to be used sparingly. Good map design does not require warning tape around everything. Decal overuse contributes to maptick slowdown.
+14
View File
@@ -599,6 +599,20 @@ CREATE TABLE `2fa_secrets` (
PRIMARY KEY (`ckey`) USING BTREE
) COLLATE='utf8mb4_general_ci' ENGINE=InnoDB;
--
-- Table structure for table `pai_saves`
--
CREATE TABLE `pai_saves` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`ckey` VARCHAR(50) NOT NULL COLLATE 'utf8mb4_general_ci',
`pai_name` LONGTEXT NULL DEFAULT NULL COLLATE 'utf8mb4_general_ci',
`description` LONGTEXT NULL DEFAULT NULL COLLATE 'utf8mb4_general_ci',
`preferred_role` LONGTEXT NULL DEFAULT NULL COLLATE 'utf8mb4_general_ci',
`ooc_comments` LONGTEXT NULL DEFAULT NULL COLLATE 'utf8mb4_general_ci',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `ckey` (`ckey`) USING BTREE
) COLLATE='utf8mb4_general_ci' ENGINE=InnoDB;
--
-- Table structure for table `instance_data_cache`
--
+12 -10
View File
@@ -1,11 +1,13 @@
# Updates DB from 25 to 26 -AffectedArc07
# Adds a new table for instance data caching, and server_id fields on other tables
# NOTE: If this line makes it into the final PR I will be upset with myself
# Updates DB from 25-25, -AffectedArc07
# Adds a pAI saves table to the DB
CREATE TABLE `instance_data_cache` (
`server_id` VARCHAR(50) NOT NULL COLLATE 'utf8mb4_general_ci',
`key_name` VARCHAR(50) NOT NULL COLLATE 'utf8mb4_general_ci',
`key_value` VARCHAR(50) NOT NULL COLLATE 'utf8mb4_general_ci',
`last_updated` TIMESTAMP NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
PRIMARY KEY (`server_id`, `key_name`) USING HASH
) COLLATE='utf8mb4_general_ci' ENGINE=MEMORY;
CREATE TABLE `pai_saves` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`ckey` VARCHAR(50) NOT NULL COLLATE 'utf8mb4_general_ci',
`pai_name` LONGTEXT NULL DEFAULT NULL COLLATE 'utf8mb4_general_ci',
`description` LONGTEXT NULL DEFAULT NULL COLLATE 'utf8mb4_general_ci',
`preferred_role` LONGTEXT NULL DEFAULT NULL COLLATE 'utf8mb4_general_ci',
`ooc_comments` LONGTEXT NULL DEFAULT NULL COLLATE 'utf8mb4_general_ci',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `ckey` (`ckey`) USING BTREE
) COLLATE='utf8mb4_general_ci' ENGINE=InnoDB;
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -362,12 +362,6 @@
"bf" = (
/turf/simulated/wall/mineral/plastitanium/nodiagonal,
/area/syndicate_depot/outer)
"bg" = (
/obj/effect/spawner/random_spawners/syndicate/layout/spacepod,
/turf/simulated/floor/plasteel{
icon_state = "dark"
},
/area/syndicate_depot/core)
"bh" = (
/obj/machinery/light{
dir = 1;
@@ -1758,7 +1752,7 @@ aD
aM
at
aD
bg
aD
bn
bu
bz
@@ -290,8 +290,13 @@
/turf/simulated/floor/plating,
/area/shuttle/abandoned)
"by" = (
/obj/structure/spacepoddoor,
/turf/simulated/floor/plating,
/obj/machinery/door_control{
id = "whiteshippoddoor";
name = "Pod Door Control";
pixel_x = -24;
pixel_y = 24
},
/turf/simulated/floor/mineral/titanium,
/area/shuttle/abandoned)
"bz" = (
/obj/machinery/door/airlock/public/glass{
@@ -304,11 +309,10 @@
/turf/simulated/floor/plating,
/area/shuttle/abandoned)
"bC" = (
/obj/structure/spacepoddoor,
/obj/machinery/door/poddoor/multi_tile/two_tile_ver{
id_tag = "whiteshippoddoor"
},
/turf/simulated/floor/plating,
/turf/simulated/floor/mineral/titanium,
/area/shuttle/abandoned)
"bD" = (
/obj/machinery/door_control{
File diff suppressed because it is too large Load Diff
+2 -2
View File
@@ -66,8 +66,8 @@
#define ACCESS_PARAMEDIC 66
#define ACCESS_BLUESHIELD 67
#define ACCESS_SALVAGE_CAPTAIN 69 // Salvage ship captain's quarters
#define ACCESS_MECHANIC 70
#define ACCESS_PILOT 71
// #define ACCESS_MECHANIC 70 // AA07 2021-10-02 - Removed: Kept for history sake
// #define ACCESS_PILOT 71 // AA07 2021-10-02 - Removed: Kept for history sake
#define ACCESS_NTREP 73
#define ACCESS_MAGISTRATE 74
#define ACCESS_MINISAT 75
-2
View File
@@ -18,8 +18,6 @@
#define ismecha(A) (istype(A, /obj/mecha))
#define isspacepod(A) (istype(A, /obj/spacepod))
#define iseffect(A) (istype(A, /obj/effect))
#define isclothing(A) (istype(A, /obj/item/clothing))
+2 -2
View File
@@ -58,7 +58,7 @@
#define JOB_NANO (1<<0)
#define JOB_BLUESHIELD (1<<1)
#define JOB_BARBER (1<<3)
#define JOB_MECHANIC (1<<4)
// #define JOB_MECHANIC (1<<4) // AA07 2021-10-02 - Removed: Kept for history sake
#define JOB_BRIGDOC (1<<5)
#define JOB_JUDGE (1<<6)
#define JOB_PILOT (1<<7)
// #define JOB_PILOT (1<<7) // AA07 2021-10-02 - Removed: Kept for history sake
+1 -1
View File
@@ -25,7 +25,7 @@
#define AUTOLATHE 4 //Uses glass/metal only.
#define CRAFTLATHE 8 //Uses fuck if I know. For use eventually.
#define MECHFAB 16 //Remember, objects utilising this flag should have construction_time and construction_cost vars.
#define PODFAB 32 //Used by the spacepod part fabricator. Same idea as the mechfab
// #define PODFAB 32 //Used by the spacepod part fabricator. Same idea as the mechfab // AA 2021-10-02 - Removed. Kept for flag consistency.
#define BIOGENERATOR 64 //Uses biomass
#define SMELTER 128 //uses various minerals
//Note: More then one of these can be added to a design but imprinter and lathe designs are incompatable.
+4 -5
View File
@@ -77,13 +77,12 @@
for(var/geartype in subtypesof(/datum/gear))
var/datum/gear/G = geartype
var/use_name = initial(G.display_name)
var/use_category = initial(G.sort_category)
if(G == initial(G.subtype_path))
if(G == initial(G.main_typepath))
continue
if(!use_name)
if(!initial(G.display_name))
stack_trace("Loadout - Missing display name: [G]")
continue
if(!initial(G.cost))
@@ -96,8 +95,8 @@
if(!GLOB.loadout_categories[use_category])
GLOB.loadout_categories[use_category] = new /datum/loadout_category(use_category)
var/datum/loadout_category/LC = GLOB.loadout_categories[use_category]
GLOB.gear_datums[use_name] = new geartype
LC.gear[use_name] = GLOB.gear_datums[use_name]
GLOB.gear_datums[geartype] = new geartype
LC.gear[geartype] = GLOB.gear_datums[geartype]
GLOB.loadout_categories = sortAssoc(GLOB.loadout_categories)
for(var/loadout_category in GLOB.loadout_categories)
+4
View File
@@ -16,6 +16,10 @@
if(default) return default
if(List && List.len)return pick(List)
/proc/sanitize_json(json_input)
if(length(json_input) && istext(json_input))
return json_decode(json_input)
return list()
//more specialised stuff
-2
View File
@@ -1777,8 +1777,6 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
/obj/item/robot_parts = "ROBOT_PARTS",
/obj/item/seeds = "SEED",
/obj/item/slime_extract = "SLIME_CORE",
/obj/item/spacepod_equipment/weaponry = "POD_WEAPON",
/obj/item/spacepod_equipment = "POD_EQUIP",
/obj/item/stack/sheet/mineral = "MINERAL",
/obj/item/stack/sheet = "SHEET",
/obj/item/stack/tile = "TILE",
-1
View File
@@ -6,7 +6,6 @@ GLOBAL_LIST_INIT(landmarks_list, list()) //list of all landmarks created
GLOBAL_LIST_INIT(surgery_steps, list()) //list of all surgery steps |BS12
GLOBAL_LIST_INIT(side_effects, list()) //list of all medical sideeffects types by thier names |BS12
GLOBAL_LIST_INIT(mechas_list, list()) //list of all mechs. Used by hostile mobs target tracking.
GLOBAL_LIST_INIT(spacepods_list, list()) //list of all space pods. Used by hostile mobs target tracking.
GLOBAL_LIST_INIT(joblist, list()) //list of all jobstypes, minus borg and AI
GLOBAL_LIST_INIT(airlocks, list()) //list of all airlocks
GLOBAL_LIST_INIT(singularities, list()) //list of all singularities
@@ -7,6 +7,8 @@
var/forward_all_ahelps = TRUE
/// Admin role to ping if no admins are online. Disables if empty string
var/admin_role_id = ""
/// Mentor role to ping if no mentors are online. Disables if empty string
var/mentor_role_id = ""
/// List of all URLs for the main webhooks
var/list/main_webhook_urls = list()
/// List of all URLs for the admin webhooks
@@ -21,6 +23,7 @@
CONFIG_LOAD_BOOL(webhooks_enabled, data["enable_discord_webhooks"])
CONFIG_LOAD_BOOL(forward_all_ahelps, data["forward_all_ahelps"])
CONFIG_LOAD_STR(admin_role_id, data["admin_role_id"])
CONFIG_LOAD_STR(mentor_role_id, data["mentor_role_id"])
CONFIG_LOAD_LIST(main_webhook_urls, data["main_webhook_urls"])
CONFIG_LOAD_LIST(mentor_webhook_urls, data["mentor_webhook_urls"])
CONFIG_LOAD_LIST(admin_webhook_urls, data["admin_webhook_urls"])
+33
View File
@@ -5,6 +5,8 @@ SUBSYSTEM_DEF(discord)
var/enabled = FALSE
/// Last time the administrator ping was dropped. This ensures administrators cannot be mass pinged if a large chunk of ahelps go off at once (IE: tesloose)
var/last_administration_ping = 0
/// Last time the mentor ping was dropped. This ensures mentors cannot be mass pinged if a large chunk of mhelps go off at once.
var/last_mentor_ping = 0
/datum/controller/subsystem/discord/Initialize(start_timeofday)
if(GLOB.configuration.discord.webhooks_enabled)
@@ -75,6 +77,27 @@ SUBSYSTEM_DEF(discord)
for(var/url in GLOB.configuration.discord.admin_webhook_urls)
SShttp.create_async_request(RUSTG_HTTP_METHOD_POST, url, dwp.serialize2json(), list("content-type" = "application/json"))
/datum/controller/subsystem/discord/proc/send2discord_simple_mentor(content)
var/alerttext
var/list/mentorcounter = staff_countup(R_MENTOR)
var/active_mentors = mentorcounter[1]
var/inactive_mentors = mentorcounter[3]
var/add_ping = FALSE
if(active_mentors <= 0)
add_ping = TRUE
if(inactive_mentors)
alerttext = "| **ALL MENTORS AFK**"
else
alerttext = "| **NO MENTORS ONLINE**"
var/message = "[content] [alerttext][add_ping ? handle_mentor_ping() : ""]"
var/datum/discord_webhook_payload/dwp = new()
dwp.webhook_content = message
for(var/url in GLOB.configuration.discord.mentor_webhook_urls)
SShttp.create_async_request(RUSTG_HTTP_METHOD_POST, url, dwp.serialize2json(), list("content-type" = "application/json"))
// Helper to make administrator ping easier
/datum/controller/subsystem/discord/proc/handle_administrator_ping()
// Check if a role is even set
@@ -86,3 +109,13 @@ SUBSYSTEM_DEF(discord)
return "<@&[GLOB.configuration.discord.admin_role_id]>"
return ""
/datum/controller/subsystem/discord/proc/handle_mentor_ping()
if(GLOB.configuration.discord.mentor_role_id)
if(last_mentor_ping > world.time)
return " *(Role pinged recently)*"
last_mentor_ping = world.time + 60 SECONDS
return " <@&[GLOB.configuration.discord.mentor_role_id]>"
return ""
+1 -1
View File
@@ -57,7 +57,7 @@ GLOBAL_DATUM_INIT(crew_repository, /datum/repository/crew, new())
if(C.sensor_mode >= SUIT_SENSOR_TRACKING)
var/area/A = get_area(H)
crewmemberData["area"] = sanitize(A.name)
crewmemberData["area"] = sanitize_simple(A.name)
crewmemberData["x"] = pos.x
crewmemberData["y"] = pos.y
-8
View File
@@ -461,10 +461,6 @@ GLOBAL_VAR_INIT(record_id_num, 1001)
clothes_s = new /icon('icons/mob/clothing/uniform.dmi', "detective_s")
clothes_s.Blend(new /icon('icons/mob/clothing/feet.dmi', "brown"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/clothing/suit.dmi', "detective"), ICON_OVERLAY)
if("Security Pod Pilot")
clothes_s = new /icon('icons/mob/clothing/uniform.dmi', "secred_s")
clothes_s.Blend(new /icon('icons/mob/clothing/feet.dmi', "jackboots"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/clothing/suit.dmi', "bomber"), ICON_OVERLAY)
if("Brig Physician")
clothes_s = new /icon('icons/mob/clothing/uniform.dmi', "medical_s")
clothes_s.Blend(new /icon('icons/mob/clothing/feet.dmi', "white"), ICON_UNDERLAY)
@@ -484,10 +480,6 @@ GLOBAL_VAR_INIT(record_id_num, 1001)
clothes_s = new /icon('icons/mob/clothing/uniform.dmi', "atmos_s")
clothes_s.Blend(new /icon('icons/mob/clothing/feet.dmi', "black"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/clothing/belt.dmi', "utility"), ICON_OVERLAY)
if("Mechanic")
clothes_s = new /icon('icons/mob/clothing/uniform.dmi', "mechanic_s")
clothes_s.Blend(new /icon('icons/mob/clothing/feet.dmi', "orange"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/clothing/belt.dmi', "utility"), ICON_OVERLAY)
if("Roboticist")
clothes_s = new /icon('icons/mob/clothing/uniform.dmi', "robotics_s")
clothes_s.Blend(new /icon('icons/mob/clothing/feet.dmi', "black"), ICON_UNDERLAY)
+6 -2
View File
@@ -17,6 +17,7 @@
var/list/stage5 = list("Oh the humanity!")
var/transformation_text = null
var/new_form = /mob/living/carbon/human
var/job_role = null
/datum/disease/transformation/stage_act()
..()
@@ -40,8 +41,8 @@
if(istype(affected_mob, /mob/living/carbon) && affected_mob.stat != DEAD)
if(stage5)
to_chat(affected_mob, pick(stage5))
if(jobban_isbanned(affected_mob, new_form))
affected_mob.death(1)
if(jobban_isbanned(affected_mob, job_role))
affected_mob.death()
return
if(affected_mob.notransform)
return
@@ -133,6 +134,7 @@
stage4 = list("<span class='danger'>Your skin feels very loose.</span>", "<span class='danger'>You can feel... something...inside you.</span>")
stage5 = list("<span class='danger'>Your skin feels as if it's about to burst off!</span>")
new_form = /mob/living/silicon/robot
job_role = "Cyborg"
/datum/disease/transformation/robot/stage_act()
@@ -165,6 +167,7 @@
stage4 = list("<span class='danger'>Your skin feels very tight.</span>", "<span class='danger'>Your blood boils!</span>", "<span class='danger'>You can feel... something...inside you.</span>")
stage5 = list("<span class='danger'>Your skin feels as if it's about to burst off!</span>")
new_form = /mob/living/carbon/alien/humanoid/hunter
job_role = ROLE_ALIEN
/datum/disease/transformation/xeno/stage_act()
..()
@@ -248,3 +251,4 @@
stage5 = list("<span class='danger'>You have become a morph.</span>")
transformation_text = "<span class='userdanger'>This transformation does NOT make you an antagonist if you were not one already. If you were not an antagonist, you should not eat any steal objectives or the contents of the armory.</span>"
new_form = /mob/living/simple_animal/hostile/morph
job_role = ROLE_MORPH
+4
View File
@@ -85,6 +85,10 @@
original = null
return ..()
/datum/mind/proc/get_display_key()
var/clientKey = current?.client.get_display_key()
return clientKey ? clientKey : key
/datum/mind/proc/transfer_to(mob/living/new_character)
var/datum/atom_hud/antag/hud_to_transfer = antag_hud //we need this because leave_hud() will clear this list
var/mob/living/old_current = current
+3 -3
View File
@@ -96,10 +96,10 @@
invocation_type = "none"
action_icon_state = "vampire_bats"
shapeshift_type = /mob/living/simple_animal/hostile/scarybat/batswarm
current_shapes = list(/mob/living/simple_animal/hostile/scarybat/batswarm)
shapeshift_type = /mob/living/simple_animal/hostile/scarybat/adminvampire
current_shapes = list(/mob/living/simple_animal/hostile/scarybat/adminvampire)
current_casters = list()
possible_shapes = list(/mob/living/simple_animal/hostile/scarybat/batswarm)
possible_shapes = list(/mob/living/simple_animal/hostile/scarybat/adminvampire)
/obj/effect/proc_holder/spell/targeted/shapeshift/hellhound
name = "Lesser Hellhound Form"
-13
View File
@@ -55,10 +55,6 @@ GLOBAL_LIST_INIT(all_supply_groups, list(SUPPLY_EMERGENCY,SUPPLY_SECURITY,SUPPLY
var/list/announce_beacons = list() // Particular beacons that we'll notify the relevant department when we reach
var/special = FALSE //Event/Station Goals/Admin enabled packs
var/special_enabled = FALSE
/// The number of times one can order a cargo crate, before it becomes restricted. -1 for infinite
var/order_limit = -1
/// Number of times a crate has been ordered in a shift
var/times_ordered = 0
/// List of names for being done in TGUI
var/list/ui_manifest = list()
@@ -197,15 +193,6 @@ GLOBAL_LIST_INIT(all_supply_groups, list(SUPPLY_EMERGENCY,SUPPLY_SECURITY,SUPPLY
containername = "special ops crate"
hidden = 1
/datum/supply_packs/emergency/syndicate
name = "ERROR_NULL_ENTRY"
contains = list(/obj/item/storage/box/syndicate)
cost = 140
containertype = /obj/structure/closet/crate
containername = "crate"
hidden = 1
order_limit = 5
//////////////////////////////////////////////////////////////////////////////
//////////////////////////// Security ////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
-7
View File
@@ -147,13 +147,6 @@
detected_mech = TRUE
increase_alert("Hostile mecha detected: [E]")
/area/syndicate_depot/core/proc/saw_pod(obj/spacepod/P)
if(detected_pod)
return
detected_pod = TRUE
if(!called_backup)
increase_alert("Hostile spacepod detected: [P]")
/area/syndicate_depot/core/proc/saw_double_agent(mob/living/M)
if(detected_double_agent)
return
+1 -13
View File
@@ -1112,14 +1112,6 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
name = "\improper Chief Engineer's office"
icon_state = "engine_control"
/area/engine/mechanic_workshop
name = "\improper Mechanic Workshop"
icon_state = "engine"
/area/engine/mechanic_workshop/hanger
name = "\improper Hanger Bay"
icon_state = "engine"
/area/engine/supermatter
name = "\improper Supermatter Engine"
icon_state = "engine"
@@ -1488,10 +1480,6 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
name = "\improper Head of Security's Office"
icon_state = "sec_hos"
/area/security/podbay
name = "\improper Security Podbay"
icon_state = "securitypodbay"
/area/security/detectives_office
name = "\improper Detective's Office"
icon_state = "detective"
@@ -1544,7 +1532,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/area/security/vacantoffice2
name = "\improper Vacant Office"
icon_state = "security"
/area/security/permasolitary
name = "Solitary Confinement"
icon_state = "solitary"
+1 -1
View File
@@ -11,7 +11,7 @@ GLOBAL_LIST_INIT(possible_changeling_IDs, list("Alpha","Beta","Gamma","Delta","E
name = "changeling"
config_tag = "changeling"
restricted_jobs = list("AI", "Cyborg")
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Blueshield", "Nanotrasen Representative", "Security Pod Pilot", "Magistrate", "Brig Physician", "Internal Affairs Agent", "Nanotrasen Navy Officer", "Special Operations Officer", "Syndicate Officer", "Solar Federation General")
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Blueshield", "Nanotrasen Representative", "Magistrate", "Brig Physician", "Internal Affairs Agent", "Nanotrasen Navy Officer", "Special Operations Officer", "Syndicate Officer", "Solar Federation General")
protected_species = list("Machine")
required_players = 15
required_enemies = 1
+1 -1
View File
@@ -48,7 +48,7 @@ GLOBAL_LIST_EMPTY(all_cults)
/datum/game_mode/cult
name = "cult"
config_tag = "cult"
restricted_jobs = list("Chaplain", "AI", "Cyborg", "Internal Affairs Agent", "Security Officer", "Warden", "Detective", "Security Pod Pilot", "Head of Security", "Captain", "Head of Personnel", "Blueshield", "Nanotrasen Representative", "Magistrate", "Brig Physician", "Nanotrasen Navy Officer", "Special Operations Officer", "Syndicate Officer", "Solar Federation General")
restricted_jobs = list("Chaplain", "AI", "Cyborg", "Internal Affairs Agent", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Blueshield", "Nanotrasen Representative", "Magistrate", "Brig Physician", "Nanotrasen Navy Officer", "Special Operations Officer", "Syndicate Officer", "Solar Federation General")
protected_jobs = list()
required_players = 30
required_enemies = 3
+2 -2
View File
@@ -463,7 +463,7 @@
var/jobtext = ""
if(ply.assigned_role)
jobtext = " the <b>[ply.assigned_role]</b>"
var/text = "<b>[ply.key]</b> was <b>[ply.name]</b>[jobtext] and"
var/text = "<b>[ply.get_display_key()]</b> was <b>[ply.name]</b>[jobtext] and"
if(ply.current)
if(ply.current.stat == DEAD)
text += " <span class='redtext'>died</span>"
@@ -480,7 +480,7 @@
return text
/proc/printeventplayer(datum/mind/ply)
var/text = "<b>[ply.key]</b> was <b>[ply.name]</b>"
var/text = "<b>[ply.get_display_key()]</b> was <b>[ply.name]</b>"
if(ply.special_role != SPECIAL_ROLE_EVENTMISC)
text += " the [ply.special_role]"
text += " and"
@@ -372,10 +372,6 @@
to_chat(S, "<span class='warning'>This cryopod control computer should be preserved, it contains useful items and information about the inhabitants. Aborting.</span>")
return FALSE
/obj/structure/spacepoddoor/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
to_chat(S, "<span class='warning'>Disrupting this energy field would overload us. Aborting.</span>")
return FALSE
/turf/simulated/wall/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
var/isonshuttle = istype(loc, /area/shuttle)
for(var/turf/T in range(1, src))
@@ -412,10 +408,6 @@
to_chat(S, "<span class='warning'>Attempting to dismantle this machine would result in an immediate counterattack. Aborting.</span>")
return FALSE
/obj/spacepod/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
to_chat(S, "<span class='warning'>Destroying this vehicle would destroy us. Aborting.</span>")
return FALSE
/obj/machinery/clonepod/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
if(occupant)
to_chat(S, "<span class='warning'>Destroying this machine while it is occupied would result in biological and sentient resources to be harmed. Aborting.</span>")
+1 -1
View File
@@ -13,7 +13,7 @@
/datum/game_mode/revolution
name = "revolution"
config_tag = "revolution"
restricted_jobs = list("Security Officer", "Warden", "Detective", "Internal Affairs Agent", "AI", "Cyborg","Captain", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer", "Blueshield", "Nanotrasen Representative", "Security Pod Pilot", "Magistrate", "Brig Physician")
restricted_jobs = list("Security Officer", "Warden", "Detective", "Internal Affairs Agent", "AI", "Cyborg","Captain", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer", "Blueshield", "Nanotrasen Representative", "Magistrate", "Brig Physician")
required_players = 20
required_enemies = 1
recommended_enemies = 3
+1 -1
View File
@@ -74,7 +74,7 @@ Made by Xhuis
required_enemies = 2
recommended_enemies = 2
restricted_jobs = list("AI", "Cyborg")
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Head of Personnel", "Captain", "Blueshield", "Nanotrasen Representative", "Security Pod Pilot", "Magistrate", "Brig Physician", "Internal Affairs Agent", "Nanotrasen Navy Officer", "Special Operations Officer", "Syndicate Officer", "Solar Federation General")
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Head of Personnel", "Captain", "Blueshield", "Nanotrasen Representative", "Magistrate", "Brig Physician", "Internal Affairs Agent", "Nanotrasen Navy Officer", "Special Operations Officer", "Syndicate Officer", "Solar Federation General")
/datum/game_mode/shadowling/announce()
to_chat(world, "<b>The current game mode is - Shadowling!</b>")
+1 -1
View File
@@ -11,7 +11,7 @@
name = "traitor"
config_tag = "traitor"
restricted_jobs = list("Cyborg")//They are part of the AI if he is traitor so are they, they use to get double chances
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Blueshield", "Nanotrasen Representative", "Security Pod Pilot", "Magistrate", "Internal Affairs Agent", "Brig Physician", "Nanotrasen Navy Officer", "Special Operations Officer", "Syndicate Officer", "Solar Federation General")
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Blueshield", "Nanotrasen Representative", "Magistrate", "Internal Affairs Agent", "Brig Physician", "Nanotrasen Navy Officer", "Special Operations Officer", "Syndicate Officer", "Solar Federation General")
required_players = 0
required_enemies = 1
recommended_enemies = 4
+1 -1
View File
@@ -2,7 +2,7 @@
name = "traitor+vampire"
config_tag = "traitorvamp"
traitors_possible = 3 //hard limit on traitors if scaling is turned off
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Blueshield", "Nanotrasen Representative", "Security Pod Pilot", "Magistrate", "Chaplain", "Brig Physician", "Internal Affairs Agent", "Nanotrasen Navy Officer", "Special Operations Officer", "Solar Federation General")
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Blueshield", "Nanotrasen Representative", "Magistrate", "Chaplain", "Brig Physician", "Internal Affairs Agent", "Nanotrasen Navy Officer", "Special Operations Officer", "Solar Federation General")
restricted_jobs = list("Cyborg")
secondary_restricted_jobs = list("AI")
required_players = 10
+1 -1
View File
@@ -9,7 +9,7 @@
name = "vampire"
config_tag = "vampire"
restricted_jobs = list("AI", "Cyborg")
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Blueshield", "Nanotrasen Representative", "Security Pod Pilot", "Magistrate", "Chaplain", "Brig Physician", "Internal Affairs Agent", "Nanotrasen Navy Officer", "Special Operations Officer", "Syndicate Officer", "Solar Federation General")
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Blueshield", "Nanotrasen Representative", "Magistrate", "Chaplain", "Brig Physician", "Internal Affairs Agent", "Nanotrasen Navy Officer", "Special Operations Officer", "Syndicate Officer", "Solar Federation General")
protected_species = list("Machine")
required_players = 15
required_enemies = 1
+4 -8
View File
@@ -133,9 +133,9 @@
ACCESS_HEADS, ACCESS_CAPTAIN, ACCESS_CARGO, ACCESS_MAILSORTING, ACCESS_CHAPEL_OFFICE, ACCESS_CE, ACCESS_CHEMISTRY, ACCESS_CLOWN, ACCESS_CMO,
ACCESS_COURT, ACCESS_CONSTRUCTION, ACCESS_CREMATORIUM, ACCESS_JANITOR, ACCESS_ENGINE, ACCESS_EVA, ACCESS_EXTERNAL_AIRLOCKS, ACCESS_FORENSICS_LOCKERS,
ACCESS_GENETICS, ACCESS_GATEWAY, ACCESS_BRIG, ACCESS_HOP, ACCESS_HOS, ACCESS_HYDROPONICS, ACCESS_CHANGE_IDS, ACCESS_KEYCARD_AUTH, ACCESS_KITCHEN,
ACCESS_LAWYER, ACCESS_LIBRARY, ACCESS_MAGISTRATE, ACCESS_MAINT_TUNNELS, ACCESS_HEADS_VAULT, ACCESS_MEDICAL, ACCESS_MECHANIC, ACCESS_MIME,
ACCESS_LAWYER, ACCESS_LIBRARY, ACCESS_MAGISTRATE, ACCESS_MAINT_TUNNELS, ACCESS_HEADS_VAULT, ACCESS_MEDICAL, ACCESS_MIME,
ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM, ACCESS_MORGUE, ACCESS_NETWORK, ACCESS_NTREP, ACCESS_PARAMEDIC, ACCESS_ALL_PERSONAL_LOCKERS,
ACCESS_ENGINE_EQUIP, ACCESS_PSYCHIATRIST, ACCESS_QM, ACCESS_RD, ACCESS_RC_ANNOUNCE, ACCESS_ROBOTICS, ACCESS_TOX, ACCESS_RESEARCH, ACCESS_SECURITY, ACCESS_PILOT,
ACCESS_ENGINE_EQUIP, ACCESS_PSYCHIATRIST, ACCESS_QM, ACCESS_RD, ACCESS_RC_ANNOUNCE, ACCESS_ROBOTICS, ACCESS_TOX, ACCESS_RESEARCH, ACCESS_SECURITY,
ACCESS_SURGERY, ACCESS_TECH_STORAGE, ACCESS_TELEPORTER, ACCESS_THEATRE, ACCESS_TCOMSAT, ACCESS_TOX_STORAGE, ACCESS_VIROLOGY, ACCESS_WEAPONS, ACCESS_XENOBIOLOGY,
ACCESS_XENOARCH)
@@ -158,13 +158,13 @@
if(REGION_GENERAL) //station general
return list(ACCESS_KITCHEN, ACCESS_BAR, ACCESS_HYDROPONICS, ACCESS_JANITOR, ACCESS_CHAPEL_OFFICE, ACCESS_CREMATORIUM, ACCESS_LIBRARY, ACCESS_THEATRE, ACCESS_LAWYER, ACCESS_MAGISTRATE, ACCESS_CLOWN, ACCESS_MIME)
if(REGION_SECURITY) //security
return list(ACCESS_SEC_DOORS, ACCESS_WEAPONS, ACCESS_SECURITY, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_FORENSICS_LOCKERS, ACCESS_COURT, ACCESS_PILOT, ACCESS_HOS)
return list(ACCESS_SEC_DOORS, ACCESS_WEAPONS, ACCESS_SECURITY, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_FORENSICS_LOCKERS, ACCESS_COURT, ACCESS_HOS)
if(REGION_MEDBAY) //medbay
return list(ACCESS_MEDICAL, ACCESS_GENETICS, ACCESS_MORGUE, ACCESS_CHEMISTRY, ACCESS_PSYCHIATRIST, ACCESS_VIROLOGY, ACCESS_SURGERY, ACCESS_CMO, ACCESS_PARAMEDIC)
if(REGION_RESEARCH) //research
return list(ACCESS_RESEARCH, ACCESS_TOX, ACCESS_TOX_STORAGE, ACCESS_GENETICS, ACCESS_ROBOTICS, ACCESS_XENOBIOLOGY, ACCESS_XENOARCH, ACCESS_MINISAT, ACCESS_RD, ACCESS_NETWORK)
if(REGION_ENGINEERING) //engineering and maintenance
return list(ACCESS_CONSTRUCTION, ACCESS_MAINT_TUNNELS, ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_EXTERNAL_AIRLOCKS, ACCESS_TECH_STORAGE, ACCESS_ATMOSPHERICS, ACCESS_MINISAT, ACCESS_CE, ACCESS_MECHANIC)
return list(ACCESS_CONSTRUCTION, ACCESS_MAINT_TUNNELS, ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_EXTERNAL_AIRLOCKS, ACCESS_TECH_STORAGE, ACCESS_ATMOSPHERICS, ACCESS_MINISAT, ACCESS_CE)
if(REGION_SUPPLY) //supply
return list(ACCESS_MAILSORTING, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM, ACCESS_CARGO, ACCESS_QM)
if(REGION_COMMAND) //command
@@ -334,10 +334,6 @@
return "Nanotrasen Rep."
if(ACCESS_PARAMEDIC)
return "Paramedic"
if(ACCESS_MECHANIC)
return "Mechanic Workshop"
if(ACCESS_PILOT)
return "Security Pod Pilot"
if(ACCESS_MAGISTRATE)
return "Magistrate"
if(ACCESS_MINERAL_STOREROOM)
+2 -36
View File
@@ -12,11 +12,11 @@
access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS,
ACCESS_TELEPORTER, ACCESS_EXTERNAL_AIRLOCKS, ACCESS_ATMOSPHERICS, ACCESS_EMERGENCY_STORAGE, ACCESS_EVA,
ACCESS_HEADS, ACCESS_CONSTRUCTION, ACCESS_SEC_DOORS,
ACCESS_CE, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_TCOMSAT, ACCESS_MINISAT, ACCESS_MECHANIC, ACCESS_MINERAL_STOREROOM)
ACCESS_CE, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_TCOMSAT, ACCESS_MINISAT, ACCESS_MINERAL_STOREROOM)
minimal_access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS,
ACCESS_TELEPORTER, ACCESS_EXTERNAL_AIRLOCKS, ACCESS_ATMOSPHERICS, ACCESS_EMERGENCY_STORAGE, ACCESS_EVA,
ACCESS_HEADS, ACCESS_CONSTRUCTION, ACCESS_SEC_DOORS,
ACCESS_CE, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_TCOMSAT, ACCESS_MINISAT, ACCESS_MECHANIC, ACCESS_MINERAL_STOREROOM)
ACCESS_CE, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_TCOMSAT, ACCESS_MINISAT, ACCESS_MINERAL_STOREROOM)
minimal_player_age = 21
exp_requirements = 1200
exp_type = EXP_TYPE_ENGINEERING
@@ -117,37 +117,3 @@
dufflebag = /obj/item/storage/backpack/duffel/atmos
box = /obj/item/storage/box/engineer
/datum/job/mechanic
title = "Mechanic"
flag = JOB_MECHANIC
department_flag = JOBCAT_KARMA
total_positions = 1
spawn_positions = 1
is_engineering = 1
supervisors = "the chief engineer"
department_head = list("Chief Engineer")
selection_color = "#fff5cc"
access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS, ACCESS_MECHANIC, ACCESS_EXTERNAL_AIRLOCKS, ACCESS_MINERAL_STOREROOM)
minimal_access = list(ACCESS_MAINT_TUNNELS, ACCESS_EMERGENCY_STORAGE, ACCESS_MECHANIC, ACCESS_EXTERNAL_AIRLOCKS, ACCESS_MINERAL_STOREROOM)
outfit = /datum/outfit/job/mechanic
/datum/outfit/job/mechanic
name = "Mechanic"
jobtype = /datum/job/mechanic
uniform = /obj/item/clothing/under/rank/mechanic
belt = /obj/item/storage/belt/utility/full
shoes = /obj/item/clothing/shoes/workboots
head = /obj/item/clothing/head/hardhat
l_ear = /obj/item/radio/headset/headset_eng
id = /obj/item/card/id/engineering
r_pocket = /obj/item/t_scanner
pda = /obj/item/pda/engineering
backpack_contents = list(
/obj/item/pod_paint_bucket = 1
)
backpack = /obj/item/storage/backpack/industrial
satchel = /obj/item/storage/backpack/satchel_eng
dufflebag = /obj/item/storage/backpack/duffel/engineering
box = /obj/item/storage/box/engineer
+4 -7
View File
@@ -175,7 +175,7 @@
if(allow_loadout && H.client && length(H.client.prefs.active_character.loadout_gear))
for(var/gear in H.client.prefs.active_character.loadout_gear)
var/datum/gear/G = GLOB.gear_datums[gear]
var/datum/gear/G = GLOB.gear_datums[text2path(gear) || gear]
if(G)
var/permitted = FALSE
@@ -185,16 +185,13 @@
else
permitted = TRUE
if(G.whitelisted && (G.whitelisted != H.dna.species.name || !is_alien_whitelisted(H, G.whitelisted)))
permitted = FALSE
if(!permitted)
to_chat(H, "<span class='warning'>Your current job or whitelist status does not permit you to spawn with [gear]!</span>")
to_chat(H, "<span class='warning'>Your current job or whitelist status does not permit you to spawn with [G.display_name]!</span>")
continue
if(G.slot)
if(H.equip_to_slot_or_del(G.spawn_item(H), G.slot, TRUE))
to_chat(H, "<span class='notice'>Equipping you with [gear]!</span>")
to_chat(H, "<span class='notice'>Equipping you with [G.display_name]!</span>")
else
gear_leftovers += G
else
@@ -217,7 +214,7 @@
if(isturf(placed_in))
to_chat(H, "<span class='notice'>Placing [G.display_name] on [placed_in]!</span>")
else
to_chat(H, "<span class='notice'>Placing [G.display_name] in [placed_in.name].</span>")
to_chat(H, "<span class='notice'>Placing [G.display_name] in your [placed_in.name].</span>")
continue
if(H.equip_to_appropriate_slot(G))
to_chat(H, "<span class='notice'>Placing [G.display_name] in your inventory!</span>")
+2 -39
View File
@@ -10,13 +10,13 @@
selection_color = "#ffdddd"
req_admin_notify = 1
access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT,
ACCESS_FORENSICS_LOCKERS, ACCESS_PILOT, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_ALL_PERSONAL_LOCKERS,
ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_ALL_PERSONAL_LOCKERS,
ACCESS_RESEARCH, ACCESS_ENGINE, ACCESS_MINING, ACCESS_MEDICAL, ACCESS_CONSTRUCTION, ACCESS_MAILSORTING,
ACCESS_HEADS, ACCESS_HOS, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_WEAPONS)
minimal_access = list(ACCESS_EVA, ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT,
ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_ALL_PERSONAL_LOCKERS,
ACCESS_RESEARCH, ACCESS_ENGINE, ACCESS_MINING, ACCESS_MEDICAL, ACCESS_CONSTRUCTION, ACCESS_MAILSORTING,
ACCESS_HEADS, ACCESS_HOS, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_PILOT, ACCESS_WEAPONS)
ACCESS_HEADS, ACCESS_HOS, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_WEAPONS)
minimal_player_age = 21
exp_requirements = 1200
exp_type = EXP_TYPE_SECURITY
@@ -222,40 +222,3 @@
backpack = /obj/item/storage/backpack/medic
satchel = /obj/item/storage/backpack/satchel_med
dufflebag = /obj/item/storage/backpack/duffel/medical
/datum/job/pilot
title = "Security Pod Pilot"
flag = JOB_PILOT
department_flag = JOBCAT_KARMA
total_positions = 1
spawn_positions = 1
is_security = 1
supervisors = "the head of security"
department_head = list("Head of Security")
selection_color = "#ffeeee"
access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_MAINT_TUNNELS, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_PILOT, ACCESS_EXTERNAL_AIRLOCKS)
minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_MAINT_TUNNELS, ACCESS_WEAPONS, ACCESS_PILOT, ACCESS_EXTERNAL_AIRLOCKS)
minimal_player_age = 7
outfit = /datum/outfit/job/pilot
/datum/outfit/job/pilot
name = "Security Pod Pilot"
jobtype = /datum/job/pilot
uniform = /obj/item/clothing/under/rank/security/pod_pilot
suit = /obj/item/clothing/suit/jacket/pilot
gloves = /obj/item/clothing/gloves/color/black
shoes = /obj/item/clothing/shoes/jackboots
l_ear = /obj/item/radio/headset/headset_sec/alt
id = /obj/item/card/id/security
l_pocket = /obj/item/flash
suit_store = /obj/item/gun/energy/gun/advtaser
pda = /obj/item/pda/security
backpack_contents = list(
/obj/item/restraints/handcuffs = 1
)
implants = list(/obj/item/implant/mindshield)
backpack = /obj/item/storage/backpack/security
satchel = /obj/item/storage/backpack/satchel_sec
dufflebag = /obj/item/storage/backpack/duffel/security
box = /obj/item/storage/box/engineer
+1 -5
View File
@@ -17,7 +17,6 @@ GLOBAL_LIST_INIT(engineering_positions, list(
"Chief Engineer",
"Station Engineer",
"Life Support Specialist",
"Mechanic"
))
@@ -78,7 +77,6 @@ GLOBAL_LIST_INIT(security_positions, list(
"Detective",
"Security Officer",
"Brig Physician",
"Security Pod Pilot",
"Magistrate"
))
@@ -98,10 +96,8 @@ GLOBAL_LIST_INIT(whitelisted_positions, list(
"Blueshield",
"Nanotrasen Representative",
"Barber",
"Mechanic",
"Brig Physician",
"Magistrate",
"Security Pod Pilot",
"Magistrate"
))
+7 -14
View File
@@ -48,7 +48,7 @@ GLOBAL_LIST_INIT(cloner_biomass_items, list(\
var/obj/effect/countdown/clonepod/countdown
var/list/brine_types = list("corazone", "perfluorodecalin", "epinephrine", "salglu_solution") //stops heart attacks, heart failure, shock, and keeps their O2 levels normal
var/list/missing_organs
var/list/missing_organs = list()
var/organs_number = 0
light_color = LIGHT_COLOR_PURE_GREEN
@@ -338,9 +338,9 @@ GLOBAL_LIST_INIT(cloner_biomass_items, list(\
progress += (100 - MINIMUM_HEAL_LEVEL)
var/milestone = CLONE_INITIAL_DAMAGE / organs_number
// Doing this as a #define so that the value can change when evaluated multiple times
#define INSTALLED (organs_number - LAZYLEN(missing_organs))
#define INSTALLED (organs_number - length(missing_organs))
while((progress / milestone) > INSTALLED && LAZYLEN(missing_organs))
while((progress / milestone) > INSTALLED && length(missing_organs))
var/obj/item/organ/I = pick_n_take(missing_organs)
I.safe_replace(occupant)
@@ -494,9 +494,7 @@ GLOBAL_LIST_INIT(cloner_biomass_items, list(\
clonemind = null
for(var/i in missing_organs)
qdel(i)
missing_organs.Cut()
QDEL_LIST(missing_organs)
occupant.SetLoseBreath(0) // Stop friggin' dying, gosh damn
occupant.setOxyLoss(0)
for(var/datum/disease/critical/crit in occupant.viruses)
@@ -523,9 +521,7 @@ GLOBAL_LIST_INIT(cloner_biomass_items, list(\
message += "<i>Is this what dying is like? Yes it is.</i>"
to_chat(occupant, "<span class='warning'>[message]</span>")
SEND_SOUND(occupant, sound('sound/hallucinations/veryfar_noise.ogg', 0, 1, 50))
for(var/i in missing_organs)
qdel(i)
missing_organs.Cut()
QDEL_LIST(missing_organs)
clonemind = null
spawn(40)
qdel(occupant)
@@ -577,10 +573,7 @@ GLOBAL_LIST_INIT(cloner_biomass_items, list(\
malfunction(go_easy = TRUE)
/obj/machinery/clonepod/proc/maim_clone(mob/living/carbon/human/H)
LAZYINITLIST(missing_organs)
for(var/i in missing_organs)
qdel(i)
missing_organs.Cut()
QDEL_LIST(missing_organs)
H.setCloneLoss(CLONE_INITIAL_DAMAGE, FALSE)
H.setBrainLoss(BRAIN_INITIAL_DAMAGE)
@@ -604,7 +597,7 @@ GLOBAL_LIST_INIT(cloner_biomass_items, list(\
I.forceMove(src)
missing_organs += I
organs_number = LAZYLEN(missing_organs)
organs_number = length(missing_organs)
H.updatehealth()
/obj/machinery/clonepod/proc/check_brine()
+2
View File
@@ -257,6 +257,7 @@
enemy_name = "Cuban Pete"
name = "Outbomb Cuban Pete"
add_hiddenprint(user)
updateUsrDialog()
// *** THE ORION TRAIL ** //
@@ -962,6 +963,7 @@
to_chat(user, "<span class='notice'>You override the cheat code menu and skip to Cheat #[rand(1, 50)]: Realism Mode.</span>")
name = "The Orion Trail: Realism Edition"
desc = "Learn how our ancestors got to Orion, and try not to die in the process!"
add_hiddenprint(user)
newgame()
emagged = 1
+2 -13
View File
@@ -257,8 +257,8 @@
board_name = "RD Console"
desc = "Swipe a Scientist level ID or higher to reconfigure."
build_path = /obj/machinery/computer/rdconsole/core
req_access = list(ACCESS_TOX) // This is for adjusting the type of computer we're building - in case something messes up the pre-existing robotics or mechanics consoles
var/list/access_types = list("R&D Core", "Robotics", "E.X.P.E.R.I-MENTOR", "Mechanics", "Public")
req_access = list(ACCESS_TOX) // This is for adjusting the type of computer we're building - in case something messes up the pre-existing robotics console
var/list/access_types = list("R&D Core", "Robotics", "E.X.P.E.R.I-MENTOR", "Public")
/obj/item/circuitboard/rdconsole/robotics
board_name = "RD Console - Robotics"
@@ -268,10 +268,6 @@
board_name = "RD Console - E.X.P.E.R.I-MENTOR"
build_path = /obj/machinery/computer/rdconsole/experiment
/obj/item/circuitboard/rdconsole/mechanics
board_name = "RD Console - Mechanics"
build_path = /obj/machinery/computer/rdconsole/mechanics
/obj/item/circuitboard/rdconsole/public
board_name = "RD Console - Public"
build_path = /obj/machinery/computer/rdconsole/public
@@ -281,10 +277,6 @@
board_name = "Exosuit Control Console"
build_path = /obj/machinery/computer/mecha
/obj/item/circuitboard/pod_locater
board_name = "Pod Location Console"
build_path = /obj/machinery/computer/podtracker
/obj/item/circuitboard/rdservercontrol
board_name = "RD Server Control"
build_path = /obj/machinery/computer/rdservercontrol
@@ -426,9 +418,6 @@
if("E.X.P.E.R.I-MENTOR")
board_name = "RD Console - E.X.P.E.R.I-MENTOR"
build_path = /obj/machinery/computer/rdconsole/experiment
if("Mechanics")
board_name = "RD Console - Mechanics"
build_path = /obj/machinery/computer/rdconsole/mechanics
if("Public")
board_name = "RD Console - Public"
build_path = /obj/machinery/computer/rdconsole/public
-2
View File
@@ -48,9 +48,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
/datum/job/judge,
/datum/job/blueshield,
/datum/job/nanotrasenrep,
/datum/job/pilot,
/datum/job/brigdoc,
/datum/job/mechanic,
/datum/job/barber,
/datum/job/chaplain
)
+2 -2
View File
@@ -261,7 +261,7 @@
icon_state = "oldcomp"
icon_screen = "library"
icon_keyboard = null
name = "DoorMex Control Computer"
name = "\improper DoorMex control computer"
circuit = /obj/item/circuitboard/olddoor
@@ -343,7 +343,7 @@
return
/obj/structure/deathsquad_tele
name = "Mech Teleporter"
name = "mech teleporter"
density = 0
anchored = 1
icon = 'icons/obj/stationobjs.dmi'
@@ -1,41 +0,0 @@
/obj/machinery/computer/podtracker
name = "pod tracking console"
icon = 'icons/obj/computer.dmi'
icon_keyboard = "tech_key"
icon_screen = "rdcomp"
light_color = LIGHT_COLOR_PURPLE
req_access = list(ACCESS_ROBOTICS)
circuit = /obj/item/circuitboard/pod_locater
/obj/machinery/computer/podtracker/attack_ai(mob/user)
return attack_hand(user)
/obj/machinery/computer/podtracker/attack_hand(mob/user)
ui_interact(user)
/obj/machinery/computer/podtracker/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
ui = new(user, src, ui_key, "PodTracking", name, 400, 500, master_ui, state)
ui.open()
/obj/machinery/computer/podtracker/ui_data(mob/user)
var/list/data = list()
var/list/pods = list()
for(var/obj/item/spacepod_equipment/misc/tracker/TR in GLOB.pod_trackers)
if(TR.my_atom)
var/obj/spacepod/my_pod = TR.my_atom
var/podname = capitalize(sanitize(my_pod.name))
var/pilot = "None"
var/passengers = list()
if(my_pod.pilot)
pilot = my_pod.pilot
if(my_pod.passengers)
for(var/mob/M in my_pod.passengers)
passengers += M.name
var/passengers_text = english_list(passengers, "None")
pods.Add(list(list("name" = podname, "podx" = my_pod.x, "pody" = my_pod.y, "podz" = my_pod.z, "pilot" = pilot, "passengers" = passengers_text)))
data["pods"] = pods
return data
@@ -710,18 +710,6 @@ to destroy them and players will be able to make replacements.
/obj/item/stock_parts/micro_laser = 1,
/obj/item/stack/sheet/glass = 1)
/obj/item/circuitboard/podfab
board_name = "Spacepod Fabricator"
build_path = /obj/machinery/mecha_part_fabricator/spacepod
board_type = "machine"
origin_tech = "programming=2;engineering=2"
req_components = list(
/obj/item/stock_parts/matter_bin = 2,
/obj/item/stock_parts/manipulator = 1,
/obj/item/stock_parts/micro_laser = 1,
/obj/item/stack/sheet/glass = 1)
/obj/item/circuitboard/clonepod
board_name = "Clone Pod"
build_path = /obj/machinery/clonepod
-1
View File
@@ -248,7 +248,6 @@
/obj/item/reagent_containers/hypospray/CMO,
/obj/item/clothing/accessory/medal/gold/captain,
/obj/item/clothing/gloves/color/black/krav_maga/sec,
/obj/item/spacepod_key,
/obj/item/nullrod,
/obj/item/key,
/obj/item/door_remote,
+2
View File
@@ -178,6 +178,8 @@ About the new airlock wires panel:
if(SSradio)
SSradio.remove_object(src, frequency)
radio_connection = null
for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds)
diag_hud.remove_from_hud(src)
return ..()
/obj/machinery/door/airlock/handle_atom_del(atom/A)
-25
View File
@@ -1,25 +0,0 @@
/obj/structure/spacepoddoor
name = "podlock"
desc = "Why it no open!!!"
icon = 'icons/effects/beam.dmi'
icon_state = "n_beam"
density = 0
anchored = 1
var/id = 1.0
/obj/structure/spacepoddoor/Initialize()
..()
air_update_turf(1)
/obj/structure/spacepoddoor/CanAtmosPass(turf/T)
return 0
/obj/structure/spacepoddoor/Destroy()
var/turf/T = get_turf(src)
. = ..()
T.air_update_turf(TRUE)
/obj/structure/spacepoddoor/CanPass(atom/movable/A, turf/T)
if(istype(A, /obj/spacepod))
return ..()
else return 0
+1 -5
View File
@@ -516,7 +516,7 @@ GLOBAL_LIST_EMPTY(turret_icons)
var/list/targets = list() //list of primary targets
var/list/secondarytargets = list() //targets that are least important
var/static/things_to_scan = typecacheof(list(/obj/mecha, /obj/spacepod, /obj/vehicle, /mob/living))
var/static/things_to_scan = typecacheof(list(/obj/mecha, /obj/vehicle, /mob/living))
for(var/A in typecache_filter_list(view(scan_range, src), things_to_scan))
var/atom/AA = A
@@ -528,10 +528,6 @@ GLOBAL_LIST_EMPTY(turret_icons)
var/obj/mecha/ME = A
assess_and_assign(ME.occupant, targets, secondarytargets)
if(istype(A, /obj/spacepod))
var/obj/spacepod/SP = A
assess_and_assign(SP.pilot, targets, secondarytargets)
if(istype(A, /obj/vehicle))
var/obj/vehicle/T = A
if(T.has_buckled_mobs())
+1 -1
View File
@@ -20,7 +20,7 @@
#define RCS_SHIP_LOG 10 // View Shipping Label Log
//Radio list
#define ENGI_ROLES list("Atmospherics","Mechanic","Engineering","Chief Engineer's Desk","Telecoms Admin")
#define ENGI_ROLES list("Atmospherics","Engineering","Chief Engineer's Desk","Telecoms Admin")
#define SEC_ROLES list("Warden","Security","Brig Medbay","Head of Security's Desk")
#define MISC_ROLES list("Bar","Chapel","Kitchen","Hydroponics","Janitorial")
#define MED_ROLES list("Virology","Chief Medical Officer's Desk","Medbay")
+1 -4
View File
@@ -98,15 +98,12 @@
/obj/machinery/suit_storage_unit/security/secure
secure = TRUE
/obj/machinery/suit_storage_unit/security/pod_pilot
req_access = list(ACCESS_PILOT)
/obj/machinery/suit_storage_unit/security/hos
name = "Head of Security's suit storage unit"
suit_type = /obj/item/clothing/suit/space/hardsuit/security/hos
mask_type = /obj/item/clothing/mask/gas/sechailer/hos
req_access = list(ACCESS_HOS)
/obj/machinery/suit_storage_unit/security/hos/secure
secure = TRUE
-2
View File
@@ -41,7 +41,6 @@
"Engine Technician" = "engradio",
"Life Support Specialist" = "engradio",
"Maintenance Technician" = "engradio",
"Mechanic" = "engradio",
"Station Engineer" = "engradio",
// Central Command
"Emergency Response Team Engineer" = "dsquadradio", // I know this says deathsquad but the class for responseteam is neon green. No.
@@ -92,7 +91,6 @@
"Internal Affairs Agent" = "secradio",
"Magistrate" = "secradio",
"Security Officer" = "secradio",
"Security Pod Pilot" = "secradio",
"Warden" = "secradio",
// Supply
"Quartermaster" = "supradio",
+1 -1
View File
@@ -368,7 +368,7 @@
if(!is_teleport_allowed(z) && !admin_usage)
to_chat(M, "You can't use this here.")
return
if(power_station && power_station.engaged && !panel_open && !blockAI(M) && !istype(M, /obj/spacepod))
if(power_station && power_station.engaged && !panel_open && !blockAI(M))
if(!teleport(M) && isliving(M)) // the isliving(M) is needed to avoid triggering errors if a spark bumps the telehub
visible_message("<span class='warning'>[src] emits a loud buzz, as its teleport portal flickers and fails!</span>")
playsound(loc, 'sound/machines/buzz-sigh.ogg', 50, FALSE)
+20 -4
View File
@@ -1120,10 +1120,26 @@
ads_list = list("Probably not bad for you!","Don't believe the scientists!","It's good for you!","Don't quit, buy more!","Smoke!","Nicotine heaven.","Best cigarettes since 2150.","Award-winning cigs.")
vend_delay = 34
icon_state = "cigs"
products = list(/obj/item/storage/fancy/cigarettes/cigpack_robust = 12, /obj/item/storage/fancy/cigarettes/cigpack_uplift = 6, /obj/item/storage/fancy/cigarettes/cigpack_random = 6, /obj/item/reagent_containers/food/pill/patch/nicotine = 10, /obj/item/storage/box/matches = 10,/obj/item/lighter/random = 4,/obj/item/storage/fancy/rollingpapers = 5)
products = list(
/obj/item/storage/fancy/cigarettes/cigpack_robust = 12,
/obj/item/storage/fancy/cigarettes/cigpack_uplift = 6,
/obj/item/storage/fancy/cigarettes/cigpack_midori = 6,
/obj/item/storage/fancy/cigarettes/cigpack_random = 6,
/obj/item/reagent_containers/food/pill/patch/nicotine = 10,
/obj/item/storage/box/matches = 10,
/obj/item/lighter/random = 4,
/obj/item/storage/fancy/rollingpapers = 5)
contraband = list(/obj/item/lighter/zippo = 4)
premium = list(/obj/item/clothing/mask/cigarette/cigar/havana = 2, /obj/item/storage/fancy/cigarettes/cigpack_robustgold = 1)
prices = list(/obj/item/storage/fancy/cigarettes/cigpack_robust = 60, /obj/item/storage/fancy/cigarettes/cigpack_uplift = 80, /obj/item/storage/fancy/cigarettes/cigpack_random = 120, /obj/item/reagent_containers/food/pill/patch/nicotine = 70, /obj/item/storage/box/matches = 10,/obj/item/lighter/random = 60, /obj/item/storage/fancy/rollingpapers = 20)
premium = list(/obj/item/clothing/mask/cigarette/cigar/havana = 2,
/obj/item/storage/fancy/cigarettes/cigpack_robustgold = 1)
prices = list(/obj/item/storage/fancy/cigarettes/cigpack_robust = 60,
/obj/item/storage/fancy/cigarettes/cigpack_uplift = 80,
/obj/item/storage/fancy/cigarettes/cigpack_midori = 100,
/obj/item/storage/fancy/cigarettes/cigpack_random = 120,
/obj/item/reagent_containers/food/pill/patch/nicotine = 70,
/obj/item/storage/box/matches = 10,
/obj/item/lighter/random = 60,
/obj/item/storage/fancy/rollingpapers = 20)
refill_canister = /obj/item/vending_refill/cigarette
/obj/machinery/vending/cigarette/free
@@ -1798,7 +1814,7 @@
/obj/item/clothing/head/soft/sec = 4,
/obj/item/clothing/head/soft/sec/corp = 4,
/obj/item/clothing/suit/armor/secjacket = 4,
/obj/item/clothing/suit/jacket/pilot = 2,
/obj/item/clothing/suit/jacket/secbomber = 2,
/obj/item/clothing/suit/hooded/wintercoat/security = 4,
/obj/item/clothing/gloves/color/black = 4,
/obj/item/clothing/accessory/armband/sec = 6,
@@ -148,7 +148,7 @@
//////////////////////////// ARMOR BOOSTER MODULES //////////////////////////////////////////////////////////
/obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster //what is that noise? A BAWWW from TK mutants.
name = "Armor Booster Module (Close Combat Weaponry)"
name = "armor booster module (Close combat weaponry)"
desc = "Boosts exosuit armor against armed melee attacks. Requires energy to operate."
icon_state = "mecha_abooster_ccw"
origin_tech = "materials=4;combat=4"
@@ -166,7 +166,7 @@
/obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster
name = "Armor Booster Module (Ranged Weaponry)"
name = "armor booster module (Ranged weaponry)"
desc = "Boosts exosuit armor against ranged attacks. Completely blocks taser shots. Requires energy to operate."
icon_state = "mecha_abooster_proj"
origin_tech = "materials=4;combat=3;engineering=3"
@@ -186,7 +186,7 @@
////////////////////////////////// REPAIR DROID //////////////////////////////////////////////////
/obj/item/mecha_parts/mecha_equipment/repair_droid
name = "Repair Droid"
name = "repair droid"
desc = "Automated repair droid. Scans exosuit for damage and repairs it. Can fix almost all types of external or internal damage."
icon_state = "repair_droid"
origin_tech ="magnets=3;programming=3;engineering=4"
@@ -193,7 +193,7 @@
/obj/item/mecha_parts/mecha_equipment/rcd
name = "Mounted RCD"
name = "mounted RCD"
desc = "An exosuit-mounted Rapid Construction Device. (Can be attached to: Any exosuit)"
icon_state = "mecha_rcd"
origin_tech = "materials=4;bluespace=3;magnets=4;powerstorage=4;engineering=4"
+23 -23
View File
@@ -64,12 +64,12 @@
return
/obj/item/mecha_parts/mecha_equipment/weapon/energy
name = "General Energy Weapon"
name = "general energy weapon"
size = 2
/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser
equip_cooldown = 8
name = "CH-PS \"Firedart\" Laser"
name = "\improper CH-PS \"Firedart\" Laser"
icon_state = "mecha_laser"
origin_tech = "magnets=3;combat=3;engineering=3"
energy_drain = 30
@@ -78,7 +78,7 @@
harmful = TRUE
/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/disabler
name = "CH-PD Disabler"
name = "\improper CH-PD Disabler"
origin_tech = "combat=3"
projectile = /obj/item/projectile/beam/disabler
projectiles_per_shot = 2
@@ -87,7 +87,7 @@
/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy
equip_cooldown = 10
name = "CH-LC \"Solaris\" Laser Cannon"
name = "\improper CH-LC \"Solaris\" Laser Cannon"
icon_state = "mecha_laser"
origin_tech = "magnets=4;combat=4;engineering=3"
energy_drain = 60
@@ -105,7 +105,7 @@
/obj/item/mecha_parts/mecha_equipment/weapon/energy/tesla
equip_cooldown = 35
name = "P-X Tesla Cannon"
name = "\improper P-X Tesla Cannon"
desc = "A weapon for combat exosuits. Fires bolts of electricity similar to the experimental tesla engine"
icon_state = "mecha_laser"
origin_tech = "materials=4;engineering=4;combat=6;magnets=6"
@@ -116,7 +116,7 @@
/obj/item/mecha_parts/mecha_equipment/weapon/energy/xray
equip_cooldown = 35
name = "S-1 X-Ray Projector"
name = "\improper S-1 X-Ray Projector"
desc = "A weapon for combat exosuits. Fires beams of X-Rays that pass through solid matter."
icon_state = "mecha_laser"
origin_tech = "materials=3;combat=5;magnets=2;syndicate=2"
@@ -126,13 +126,13 @@
harmful = TRUE
/obj/item/mecha_parts/mecha_equipment/weapon/energy/xray/triple
name = "X-XR Triple-barrel X-Ray Stream Projector"
name = "\improper X-XR Triple-barrel X-Ray Stream Projector"
projectiles_per_shot = 3
projectile_delay = 1
/obj/item/mecha_parts/mecha_equipment/weapon/energy/immolator
equip_cooldown = 35
name = "ZFI Immolation Beam Gun"
name = "\improper ZFI Immolation Beam Gun"
desc = "A weapon for combat exosuits. Fires beams of extreme heat that set targets on fire."
icon_state = "mecha_laser"
origin_tech = "materials=4;engineering=4;combat=6;magnets=6"
@@ -143,7 +143,7 @@
/obj/item/mecha_parts/mecha_equipment/weapon/energy/pulse
equip_cooldown = 30
name = "eZ-13 mk2 Heavy pulse rifle"
name = "eZ-13 mk2 Heavy Pulse Rifle"
icon_state = "mecha_pulse"
energy_drain = 120
origin_tech = "materials=3;combat=6;powerstorage=4"
@@ -172,7 +172,7 @@
/obj/item/mecha_parts/mecha_equipment/weapon/energy/taser
name = "PBT \"Pacifier\" Mounted Taser"
name = "\improper PBT \"Pacifier\" Mounted Taser"
icon_state = "mecha_taser"
origin_tech = "combat=3"
energy_drain = 20
@@ -182,7 +182,7 @@
size = 1
/obj/item/mecha_parts/mecha_equipment/weapon/honker
name = "HoNkER BlAsT 5000"
name = "\improper HoNkER BlAsT 5000"
icon_state = "mecha_honker"
energy_drain = 200
equip_cooldown = 150
@@ -242,7 +242,7 @@
return
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic
name = "General Ballisic Weapon"
name = "general ballisic weapon"
size = 2
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/action_checks(atom/target)
if(..())
@@ -272,7 +272,7 @@
return
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/carbine
name = "FNX-66 Carbine"
name = "\improper FNX-66 Carbine"
icon_state = "mecha_carbine"
origin_tech = "materials=4;combat=4"
equip_cooldown = 5
@@ -298,7 +298,7 @@
return 0
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot
name = "LBX AC 10 \"Scattershot\""
name = "\improper LBX AC 10 \"Scattershot\""
icon_state = "mecha_scatter"
origin_tech = "combat=4"
equip_cooldown = 20
@@ -311,7 +311,7 @@
harmful = TRUE
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg
name = "Ultra AC 2"
name = "\improper Ultra AC 2"
icon_state = "mecha_uac2"
origin_tech = "combat=4"
equip_cooldown = 10
@@ -325,11 +325,11 @@
harmful = TRUE
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg/dual
name = "XMG-9 Autocannon"
name = "\improper XMG-9 Autocannon"
projectiles_per_shot = 6
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack
name = "SRM-8 Light Missile Rack"
name = "\improper SRM-8 Light Missile Rack"
icon_state = "mecha_missilerack"
origin_tech = "combat=5;materials=4;engineering=4"
projectile = /obj/item/missile
@@ -361,7 +361,7 @@
return
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/heavy
name = "SRX-13 Heavy Missile Launcher"
name = "\improper SRX-13 Heavy Missile Launcher"
heavy_missile = 1
/obj/item/missile
@@ -383,7 +383,7 @@
return
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang
name = "SGL-6 Flashbang Launcher"
name = "\improper SGL-6 Flashbang Launcher"
icon_state = "mecha_grenadelnchr"
origin_tech = "combat=4;engineering=4"
projectile = /obj/item/grenade/flashbang
@@ -409,7 +409,7 @@
return
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang/clusterbang//Because I am a heartless bastard -Sieve
name = "SOB-3 Clusterbang Launcher"
name = "\improper SOB-3 Clusterbang Launcher"
desc = "A weapon for combat exosuits. Launches primed clusterbangs. You monster."
origin_tech = "combat=4;materials=4"
projectiles = 3
@@ -425,7 +425,7 @@
return//Extra bit of security
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/banana_mortar
name = "Banana Mortar"
name = "banana mortar"
icon_state = "mecha_bananamrtr"
projectile = /obj/item/grown/bananapeel
fire_sound = 'sound/items/bikehorn.ogg'
@@ -455,7 +455,7 @@
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/mousetrap_mortar
name = "Mousetrap Mortar"
name = "mousetrap mortar"
icon_state = "mecha_mousetrapmrtr"
projectile = /obj/item/assembly/mousetrap
fire_sound = 'sound/items/bikehorn.ogg'
@@ -485,7 +485,7 @@
return
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/bola
name = "PCMK-6 Bola Launcher"
name = "\improper PCMK-6 Bola Launcher"
icon_state = "mecha_bola"
origin_tech = "combat=4;engineering=4"
projectile = /obj/item/restraints/legcuffs/bola
+2 -2
View File
@@ -1,5 +1,5 @@
/turf/simulated/floor/mech_bay_recharge_floor
name = "Mech Bay Recharge Station"
name = "mech bay recharge station"
icon = 'icons/mecha/mech_bay.dmi'
icon_state = "recharge_floor"
@@ -10,7 +10,7 @@
temperature = TCMB
/obj/machinery/mech_bay_recharge_port
name = "Mech Bay Power Port"
name = "mech bay power port"
density = 1
anchored = 1
dir = EAST
-33
View File
@@ -460,39 +460,6 @@
component_parts += new /obj/item/stack/sheet/glass(null)
RefreshParts()
/**
* # Spacepod Fabricator
*
* Spacepod variant of [/obj/machinery/mecha_part_fabricator].
*/
/obj/machinery/mecha_part_fabricator/spacepod
name = "spacepod fabricator"
allowed_design_types = PODFAB
req_access = list(ACCESS_MECHANIC)
/obj/machinery/mecha_part_fabricator/spacepod/New()
..()
QDEL_LIST(component_parts)
component_parts = list()
component_parts += new /obj/item/circuitboard/podfab(null)
component_parts += new /obj/item/stock_parts/matter_bin(null)
component_parts += new /obj/item/stock_parts/matter_bin(null)
component_parts += new /obj/item/stock_parts/manipulator(null)
component_parts += new /obj/item/stock_parts/micro_laser(null)
component_parts += new /obj/item/stack/sheet/glass(null)
RefreshParts()
/obj/machinery/mecha_part_fabricator/spacepod/Initialize(mapload)
. = ..()
categories = list(
"Pod_Weaponry",
"Pod_Armor",
"Pod_Cargo",
"Pod_Parts",
"Pod_Frame",
"Misc"
)
/**
* # Robotic Fabricator
*
+2 -2
View File
@@ -69,7 +69,7 @@
return TRUE
/obj/item/mecha_parts/mecha_tracking
name = "Exosuit tracking beacon"
name = "exosuit tracking beacon"
desc = "Device used to transmit exosuit data."
icon = 'icons/obj/device.dmi'
icon_state = "motion2"
@@ -174,7 +174,7 @@
ai_beacon = TRUE
/obj/item/storage/box/mechabeacons
name = "Exosuit Tracking Beacons"
name = "exosuit tracking beacons"
/obj/item/storage/box/mechabeacons/New()
..()
+69 -69
View File
@@ -12,7 +12,7 @@
/obj/item/mecha_parts/chassis
name="Mecha Chassis"
name = "mecha chassis"
icon_state = "backbone"
var/datum/construction/construct
flags = CONDUCT
@@ -31,83 +31,83 @@
/////////// Ripley
/obj/item/mecha_parts/chassis/ripley
name = "Ripley Chassis"
name = "\improper Ripley chassis"
/obj/item/mecha_parts/chassis/ripley/New()
..()
construct = new /datum/construction/mecha/ripley_chassis(src)
/obj/item/mecha_parts/part/ripley_torso
name="Ripley Torso"
desc="A torso part of Ripley APLU. Contains power unit, processing core and life support systems."
name = "\improper Ripley torso"
desc = "A torso part of Ripley APLU. Contains power unit, processing core and life support systems."
icon_state = "ripley_harness"
origin_tech = "programming=2;materials=2;biotech=2;engineering=2"
/obj/item/mecha_parts/part/ripley_left_arm
name="Ripley Left Arm"
desc="A Ripley APLU left arm. Data and power sockets are compatible with most exosuit tools."
name = "\improper Ripley left arm"
desc = "A Ripley APLU left arm. Data and power sockets are compatible with most exosuit tools."
icon_state = "ripley_l_arm"
/obj/item/mecha_parts/part/ripley_right_arm
name="Ripley Right Arm"
desc="A Ripley APLU right arm. Data and power sockets are compatible with most exosuit tools."
name = "\improper Ripley right arm"
desc = "A Ripley APLU right arm. Data and power sockets are compatible with most exosuit tools."
icon_state = "ripley_r_arm"
/obj/item/mecha_parts/part/ripley_left_leg
name="Ripley Left Leg"
desc="A Ripley APLU left leg. Contains somewhat complex servodrives and balance maintaining systems."
name = "\improper Ripley left leg"
desc = "A Ripley APLU left leg. Contains somewhat complex servodrives and balance maintaining systems."
icon_state = "ripley_l_leg"
/obj/item/mecha_parts/part/ripley_right_leg
name="Ripley Right Leg"
desc="A Ripley APLU right leg. Contains somewhat complex servodrives and balance maintaining systems."
name = "\improper Ripley right leg"
desc = "A Ripley APLU right leg. Contains somewhat complex servodrives and balance maintaining systems."
icon_state = "ripley_r_leg"
///////// Gygax
/obj/item/mecha_parts/chassis/gygax
name = "Gygax Chassis"
name = "\improper Gygax chassis"
/obj/item/mecha_parts/chassis/gygax/New()
..()
construct = new /datum/construction/mecha/gygax_chassis(src)
/obj/item/mecha_parts/part/gygax_torso
name="Gygax Torso"
desc="A torso part of Gygax. Contains power unit, processing core and life support systems. Has an additional equipment slot."
name = "\improper Gygax torso"
desc = "A torso part of Gygax. Contains power unit, processing core and life support systems. Has an additional equipment slot."
icon_state = "gygax_harness"
origin_tech = "programming=2;materials=4;biotech=3;engineering=3"
/obj/item/mecha_parts/part/gygax_head
name="Gygax Head"
desc="A Gygax head. Houses advanced surveilance and targeting sensors."
name = "\improper Gygax head"
desc = "A Gygax head. Houses advanced surveilance and targeting sensors."
icon_state = "gygax_head"
origin_tech = "programming=2;materials=4;magnets=3;engineering=3"
/obj/item/mecha_parts/part/gygax_left_arm
name="Gygax Left Arm"
desc="A Gygax left arm. Data and power sockets are compatible with most exosuit tools and weapons."
name = "\improper Gygax left arm"
desc = "A Gygax left arm. Data and power sockets are compatible with most exosuit tools and weapons."
icon_state = "gygax_l_arm"
origin_tech = "programming=2;materials=4;engineering=3"
/obj/item/mecha_parts/part/gygax_right_arm
name="Gygax Right Arm"
desc="A Gygax right arm. Data and power sockets are compatible with most exosuit tools and weapons."
name = "\improper Gygax right arm"
desc = "A Gygax right arm. Data and power sockets are compatible with most exosuit tools and weapons."
icon_state = "gygax_r_arm"
origin_tech = "programming=2;materials=4;engineering=3"
/obj/item/mecha_parts/part/gygax_left_leg
name="Gygax Left Leg"
name = "\improper Gygax left leg"
icon_state = "gygax_l_leg"
origin_tech = "programming=2;materials=4;engineering=3"
/obj/item/mecha_parts/part/gygax_right_leg
name="Gygax Right Leg"
name = "\improper Gygax right leg"
icon_state = "gygax_r_leg"
origin_tech = "programming=2;materials=4;engineering=3"
/obj/item/mecha_parts/part/gygax_armour
name="Gygax Armour Plates"
name = "\improper Gygax armour plates"
icon_state = "gygax_armour"
origin_tech = "materials=6;combat=4;engineering=4"
@@ -115,44 +115,44 @@
//////////// Durand
/obj/item/mecha_parts/chassis/durand
name = "Durand Chassis"
name = "\improper Durand chassis"
/obj/item/mecha_parts/chassis/durand/New()
..()
construct = new /datum/construction/mecha/durand_chassis(src)
/obj/item/mecha_parts/part/durand_torso
name="Durand Torso"
name = "\improper Durand torso"
icon_state = "durand_harness"
origin_tech = "programming=2;materials=3;biotech=3;engineering=3"
/obj/item/mecha_parts/part/durand_head
name="Durand Head"
name = "\improper Durand head"
icon_state = "durand_head"
origin_tech = "programming=2;materials=3;magnets=3;engineering=3"
/obj/item/mecha_parts/part/durand_left_arm
name="Durand Left Arm"
name = "\improper Durand left arm"
icon_state = "durand_l_arm"
origin_tech = "programming=2;materials=3;engineering=3"
/obj/item/mecha_parts/part/durand_right_arm
name="Durand Right Arm"
name = "\improper Durand right arm"
icon_state = "durand_r_arm"
origin_tech = "programming=2;materials=3;engineering=3"
/obj/item/mecha_parts/part/durand_left_leg
name="Durand Left Leg"
name = "\improper Durand left leg"
icon_state = "durand_l_leg"
origin_tech = "programming=2;materials=3;engineering=3"
/obj/item/mecha_parts/part/durand_right_leg
name="Durand Right Leg"
name = "\improper Durand right leg"
icon_state = "durand_r_leg"
origin_tech = "programming=2;materials=3;engineering=3"
/obj/item/mecha_parts/part/durand_armor
name="Durand Armour Plates"
name = "\improper Durand armour plates"
icon_state = "durand_armor"
origin_tech = "materials=5;combat=4;engineering=4"
@@ -161,7 +161,7 @@
////////// Firefighter
/obj/item/mecha_parts/chassis/firefighter
name = "Firefighter Chassis"
name = "\improper Firefighter chassis"
/obj/item/mecha_parts/chassis/firefighter/New()
..()
@@ -170,41 +170,41 @@
////////// HONK
/obj/item/mecha_parts/chassis/honker
name = "H.O.N.K Chassis"
name = "\improper H.O.N.K chassis"
/obj/item/mecha_parts/chassis/honker/New()
..()
construct = new /datum/construction/mecha/honker_chassis(src)
/obj/item/mecha_parts/part/honker_torso
name="H.O.N.K Torso"
name = "\improper H.O.N.K torso"
icon_state = "honker_harness"
/obj/item/mecha_parts/part/honker_head
name="H.O.N.K Head"
name = "\improper H.O.N.K head"
icon_state = "honker_head"
/obj/item/mecha_parts/part/honker_left_arm
name="H.O.N.K Left Arm"
name = "\improper H.O.N.K left arm"
icon_state = "honker_l_arm"
/obj/item/mecha_parts/part/honker_right_arm
name="H.O.N.K Right Arm"
name = "\improper H.O.N.K right arm"
icon_state = "honker_r_arm"
/obj/item/mecha_parts/part/honker_left_leg
name="H.O.N.K Left Leg"
name = "\improper H.O.N.K left leg"
icon_state = "honker_l_leg"
/obj/item/mecha_parts/part/honker_right_leg
name="H.O.N.K Right Leg"
name = "\improper H.O.N.K right leg"
icon_state = "honker_r_leg"
////////// Reticence
/obj/item/mecha_parts/chassis/reticence
name = "Reticence Chassis"
name = "\improper Reticence chassis"
/obj/item/mecha_parts/chassis/reticence/New()
..()
@@ -226,34 +226,34 @@
construct.action(new /obj/effect/dummy/mecha_emote_step(msg), M)
/obj/item/mecha_parts/part/reticence_torso
name = "Reticence Torso"
name = "\improper Reticence torso"
icon_state = "reticence_harness"
/obj/item/mecha_parts/part/reticence_head
name = "Reticence Head"
name = "\improper Reticence head"
icon_state = "reticence_head"
/obj/item/mecha_parts/part/reticence_left_arm
name = "Reticence Left Arm"
name = "\improper Reticence left arm"
icon_state = "reticence_l_arm"
/obj/item/mecha_parts/part/reticence_right_arm
name = "Reticence Right Arm"
name = "\improper Reticence right arm"
icon_state = "reticence_r_arm"
/obj/item/mecha_parts/part/reticence_left_leg
name = "Reticence Left Leg"
name = "\improper Reticence left leg"
icon_state = "reticence_l_leg"
/obj/item/mecha_parts/part/reticence_right_leg
name = "Reticence Right Leg"
name = "\improper Reticence right leg"
icon_state = "reticence_r_leg"
////////// Phazon
/obj/item/mecha_parts/chassis/phazon
name = "Phazon Chassis"
name = "\improper Phazon chassis"
/obj/item/mecha_parts/chassis/phazon/New()
..()
@@ -265,81 +265,81 @@
to_chat(user, "<span class='warning'>The anomaly core socket only accepts bluespace anomaly cores!</span>")
/obj/item/mecha_parts/part/phazon_torso
name="Phazon Torso"
name = "\improper Phazon torso"
icon_state = "phazon_harness"
origin_tech = "programming=4;materials=4;bluespace=4;plasmatech=5"
/obj/item/mecha_parts/part/phazon_head
name="Phazon Head"
name = "\improper Phazon head"
icon_state = "phazon_head"
origin_tech = "programming=3;materials=3;magnets=3"
/obj/item/mecha_parts/part/phazon_left_arm
name="Phazon Left Arm"
name = "\improper Phazon left arm"
icon_state = "phazon_l_arm"
origin_tech = "materials=3;bluespace=3;magnets=3"
/obj/item/mecha_parts/part/phazon_right_arm
name="Phazon Right Arm"
name = "\improper Phazon right arm"
icon_state = "phazon_r_arm"
origin_tech = "materials=3;bluespace=3;magnets=3"
/obj/item/mecha_parts/part/phazon_left_leg
name="Phazon Left Leg"
name = "\improper Phazon left leg"
icon_state = "phazon_l_leg"
origin_tech = "materials=3;bluespace=3;magnets=3"
/obj/item/mecha_parts/part/phazon_right_leg
name="Phazon Right Leg"
name = "\improper Phazon right leg"
icon_state = "phazon_r_leg"
origin_tech = "materials=3;bluespace=3;magnets=3"
/obj/item/mecha_parts/part/phazon_armor
name="Phazon armor"
desc="Phazon armor plates. They are layered with plasma to protect the pilot from the stress of phasing and have unusual properties."
name = "\improper Phazon armor"
desc = "Phazon armor plates. They are layered with plasma to protect the pilot from the stress of phasing and have unusual properties."
icon_state = "phazon_armor"
origin_tech = "materials=4;bluespace=4;plasmatech=5"
///////// Odysseus
/obj/item/mecha_parts/chassis/odysseus
name = "Odysseus Chassis"
name = "\improper Odysseus Chassis"
/obj/item/mecha_parts/chassis/odysseus/New()
..()
construct = new /datum/construction/mecha/odysseus_chassis(src)
/obj/item/mecha_parts/part/odysseus_head
name="Odysseus Head"
name = "\improper Odysseus head"
icon_state = "odysseus_head"
/obj/item/mecha_parts/part/odysseus_torso
name="Odysseus Torso"
desc="A torso part of Odysseus. Contains power unit, processing core and life support systems."
name = "\improper Odysseus torso"
desc = "A torso part of Odysseus. Contains power unit, processing core and life support systems."
icon_state = "odysseus_torso"
origin_tech = "programming=2;materials=2;biotech=2;engineering=2"
/obj/item/mecha_parts/part/odysseus_left_arm
name="Odysseus Left Arm"
desc="An Odysseus left arm. Data and power sockets are compatible with most exosuit tools."
name = "\improper Odysseus left arm"
desc = "An Odysseus left arm. Data and power sockets are compatible with most exosuit tools."
icon_state = "odysseus_l_arm"
/obj/item/mecha_parts/part/odysseus_right_arm
name="Odysseus Right Arm"
desc="An Odysseus right arm. Data and power sockets are compatible with most exosuit tools."
name = "\improper Odysseus right arm"
desc = "An Odysseus right arm. Data and power sockets are compatible with most exosuit tools."
icon_state = "odysseus_r_arm"
/obj/item/mecha_parts/part/odysseus_left_leg
name="Odysseus Left Leg"
desc="An Odysseus left leg. Contains somewhat complex servodrives and balance maintaining systems."
name = "\improper Odysseus left leg"
desc = "An Odysseus left leg. Contains somewhat complex servodrives and balance maintaining systems."
icon_state = "odysseus_l_leg"
/obj/item/mecha_parts/part/odysseus_right_leg
name="Odysseus Right Leg"
desc="A Odysseus right leg. Contains somewhat complex servodrives and balance maintaining systems."
name = "\improper Odysseus right leg"
desc = "A Odysseus right leg. Contains somewhat complex servodrives and balance maintaining systems."
icon_state = "odysseus_r_leg"
/*/obj/item/mecha_parts/part/odysseus_armour
name="Odysseus Carapace"
name = "\improper Odysseus carapace"
icon_state = "odysseus_armour"
origin_tech = "materials=3;engineering=3")*/
+2 -4
View File
@@ -11,7 +11,7 @@
var/list/allowed_types = list() //Types of mech that the kit will work on.
/obj/item/paintkit/titansfist
name = "APLU \"Ripley\" customisation kit"
name = "\improper APLU \"Ripley\" customisation kit"
desc = "A kit containing all the needed tools and parts to turn an APLU \"Ripley\" into a Titan's Fist worker mech."
icon_state = "paintkit_2"
@@ -21,10 +21,8 @@
allowed_types = list("ripley","firefighter")
/obj/item/paintkit/mercenary
name = "Mercenary APLU \"Ripley\" kit"
name = "\improper mercenary APLU \"Ripley\" kit"
desc = "A kit containing all the needed tools and parts to turn an APLU \"Ripley\" into an old Mercenaries APLU."
new_name = "APLU \"Strike the Earth!\""
new_desc = "Looks like an over worked, under maintained Ripley with some horrific damage."
new_icon = "earth"
@@ -1,4 +1,4 @@
/// Ion trails for spacepods and other space-flying things
/// Ion trails for jetpacks, ion thrusters and other space-flying things
/obj/effect/particle_effect/ion_trails
name = "ion trails"
icon_state = "ion_trails"
@@ -3,8 +3,7 @@
icon = 'icons/mob/screen_gen.dmi'
icon_state = "x2"
var/list/result = list(
/turf/simulated/floor/plasteel = 1,
/turf/simulated/floor/plating = 1,
/datum/nothing = 1,
/obj/effect/decal/cleanable/blood/splatter = 1,
/obj/effect/decal/cleanable/blood/oil = 1,
/obj/effect/decal/cleanable/fungus = 1)
@@ -37,25 +36,25 @@
/obj/effect/spawner/random_spawners/blood_maybe
name = "blood maybe"
result = list(
/turf/simulated/floor/plating = 20,
/datum/nothing = 20,
/obj/effect/decal/cleanable/blood/splatter = 1)
/obj/effect/spawner/random_spawners/blood_often
name = "blood often"
result = list(
/turf/simulated/floor/plating = 5,
/datum/nothing = 5,
/obj/effect/decal/cleanable/blood/splatter = 1)
/obj/effect/spawner/random_spawners/oil_maybe
name = "oil maybe"
result = list(
/turf/simulated/floor/plating = 20,
/datum/nothing = 20,
/obj/effect/decal/cleanable/blood/oil = 1)
/obj/effect/spawner/random_spawners/oil_maybe
name = "oil often"
result = list(
/turf/simulated/floor/plating = 5,
/datum/nothing = 5,
/obj/effect/decal/cleanable/blood/oil = 1)
/obj/effect/spawner/random_spawners/wall_rusted_probably
@@ -73,37 +72,37 @@
/obj/effect/spawner/random_spawners/cobweb_left_frequent
name = "cobweb left frequent"
result = list(
/turf/simulated/floor/plating = 1,
/datum/nothing = 1,
/obj/effect/decal/cleanable/cobweb = 1)
/obj/effect/spawner/random_spawners/cobweb_right_frequent
name = "cobweb right frequent"
result = list(
/turf/simulated/floor/plating = 1,
/datum/nothing = 1,
/obj/effect/decal/cleanable/cobweb2 = 1)
/obj/effect/spawner/random_spawners/cobweb_left_rare
name = "cobweb left rare"
result = list(
/turf/simulated/floor/plating = 10,
/datum/nothing = 10,
/obj/effect/decal/cleanable/cobweb = 1)
/obj/effect/spawner/random_spawners/cobweb_right_rare
name = "cobweb right rare"
result = list(
/turf/simulated/floor/plating = 10,
/datum/nothing = 10,
/obj/effect/decal/cleanable/cobweb2 = 1)
/obj/effect/spawner/random_spawners/dirt_frequent
name = "dirt frequent"
result = list(
/turf/simulated/floor/plating = 1,
/datum/nothing = 1,
/obj/effect/decal/cleanable/dirt = 1)
/obj/effect/spawner/random_spawners/dirt_rare
name = "dirt rare"
result = list(
/turf/simulated/floor/plating = 10,
/datum/nothing = 10,
/obj/effect/decal/cleanable/dirt = 1)
/obj/effect/spawner/random_spawners/fungus_maybe
@@ -307,9 +306,3 @@
name = "80pc vaultdoor 20pc wall"
result = list(/obj/machinery/door/airlock/hatch/syndicate/vault = 4,
/turf/simulated/wall/mineral/plastitanium/nodiagonal = 1)
/obj/effect/spawner/random_spawners/syndicate/layout/spacepod
name = "50pc loot spacepod"
result = list(/obj/spacepod/syndi = 1,
/obj/spacepod/syndi/unlocked = 1)
@@ -61,7 +61,7 @@
/obj/effect/spawner/window/reinforced/polarized
name = "electrochromic reinforced window spawner"
icon_state = "pwindow_spawner"
icon_state = "ewindow_spawner"
window_to_spawn_regular = /obj/structure/window/reinforced/polarized
window_to_spawn_full = /obj/structure/window/full/reinforced/polarized
@@ -71,8 +71,6 @@
laser_act(target, user, params)
/obj/item/laser_pointer/proc/laser_act(atom/target, mob/living/user, params)
if( !(user in (viewers(7,target))) )
return
if(!diode)
to_chat(user, "<span class='notice'>You point [src] at [target], but nothing happens!</span>")
return
@@ -82,6 +80,9 @@
if(HAS_TRAIT(user, TRAIT_CHUNKYFINGERS))
to_chat(user, "<span class='warning'>Your fingers can't press the button!</span>")
return
if(!(target in view(7, get_turf(src)))) // Use the turf as center so it won't use the potential xray of the user
to_chat(user, "<span class='warning'>There is something in the way!</span>")
return
add_fingerprint(user)
@@ -170,7 +170,7 @@ effective or pretty fucking useless.
GLOB.active_jammers -= src
/obj/item/teleporter
name = "\improper Syndicate teleporter"
name = "syndicate teleporter"
desc = "A strange syndicate version of a cult veil shifter. Warrenty voided if exposed to EMP."
icon = 'icons/obj/device.dmi'
icon_state = "syndi-tele"
@@ -208,24 +208,32 @@ effective or pretty fucking useless.
charges++
/obj/item/teleporter/emp_act(severity)
var/teleported_something = FALSE
if(prob(50 / severity))
if(istype(loc, /mob/living/carbon/human))
var/mob/living/carbon/human/user = loc
to_chat(user, "<span class='userdanger'>[src] buzzes and activates!</span>")
attempt_teleport(user, TRUE)
else
visible_message("<span class='danger'>[src] activates and blinks out of existence!</span>")
do_sparks(2, 1, src)
qdel(src)
else //Well, it either is on a floor / locker, and won't teleport someone, OR it's in someones bag. As such, we need to check the turf to see if people are there.
var/turf/teleport_turf = get_turf(src)
for(var/mob/living/user in teleport_turf)
if(!teleported_something)
teleport_turf.visible_message("<span class='danger'>[src] activates sporadically, teleporting everyone around it!</span>")
teleported_something = TRUE
attempt_teleport(user, TRUE)
if(!teleported_something)
visible_message("<span class='danger'>[src] activates and blinks out of existence!</span>")
do_sparks(2, 1, src)
qdel(src)
/obj/item/teleporter/proc/attempt_teleport(mob/user, EMP_D = FALSE)
dir_correction(user)
if(!charges)
if(!charges && !EMP_D) //If it's empd, you are moving no matter what.
to_chat(user, "<span class='warning'>[src] is still recharging.</span>")
return
var/mob/living/carbon/C = user
var/turf/mobloc = get_turf(C)
var/mob/living/M = user
var/turf/mobloc = get_turf(M)
var/list/turfs = new/list()
var/found_turf = FALSE
var/list/bagholding = user.search_contents_for(/obj/item/storage/backpack/holding)
@@ -233,7 +241,7 @@ effective or pretty fucking useless.
if(!is_teleport_allowed(T.z))
break
if(!(length(bagholding) && !flawless)) //Chaos if you have a bag of holding
if(get_dir(C, T) != C.dir)
if(get_dir(M, T) != M.dir)
continue
if(T in range(user, inner_tp_range))
continue
@@ -247,13 +255,14 @@ effective or pretty fucking useless.
if(found_turf)
if(user.loc != mobloc) // No locker / mech / sleeper teleporting, that breaks stuff
to_chat(C, "<span class='danger'>[src] will not work here!</span>")
charges--
to_chat(M, "<span class='danger'>[src] will not work here!</span>")
if(charges > 0) //While we want EMP triggered teleports to drain charge, we also do not want it to go negative charge, as such we need this check here
charges--
var/turf/destination = pick(turfs)
if(tile_check(destination) || flawless) // Why is there so many bloody floor types
var/turf/fragging_location = destination
telefrag(fragging_location, user)
C.forceMove(destination)
M.forceMove(destination)
playsound(mobloc, "sparks", 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
new/obj/effect/temp_visual/teleport_abductor/syndi_teleporter(mobloc)
playsound(destination, "sparks", 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
@@ -264,7 +273,7 @@ effective or pretty fucking useless.
else // Emp activated? Bag of holding? No saving throw for you
get_fragged(user, destination)
else
to_chat(C, "<span class='danger'>[src] will not work here!</span>")
to_chat(M, "<span class='danger'>[src] will not work here!</span>")
/obj/item/teleporter/proc/tile_check(turf/T)
if(istype(T, /turf/simulated/floor) || istype(T, /turf/space))
@@ -294,8 +303,8 @@ effective or pretty fucking useless.
else
saving_throw = NORTH // just in case
var/mob/living/carbon/C = user
var/turf/mobloc = get_turf(C)
var/mob/living/M = user
var/turf/mobloc = get_turf(M)
var/list/turfs = list()
var/found_turf = FALSE
for(var/turf/T in range(destination, saving_throw_distance))
@@ -314,7 +323,7 @@ effective or pretty fucking useless.
var/turf/new_destination = pick(turfs)
var/turf/fragging_location = new_destination
telefrag(fragging_location, user)
C.forceMove(new_destination)
M.forceMove(new_destination)
playsound(mobloc, "sparks", 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
new /obj/effect/temp_visual/teleport_abductor/syndi_teleporter(mobloc)
new /obj/effect/temp_visual/teleport_abductor/syndi_teleporter(new_destination)
@@ -332,11 +341,12 @@ effective or pretty fucking useless.
playsound(destination, "sparks", 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
playsound(destination, "sound/magic/disintegrate.ogg", 50, TRUE)
destination.ex_act(rand(1,2))
for(var/obj/item/W in user)
if(istype(W, /obj/item/implant))
continue
if(!user.unEquip(W))
qdel(W)
if(iscarbon(user)) //don't want cyborgs dropping their stuff
for(var/obj/item/W in user)
if(istype(W, /obj/item/implant))
continue
if(!user.unEquip(W))
qdel(W)
to_chat(user, "<span class='biggerdanger'>You teleport into the wall, the teleporter tries to save you, but--</span>")
user.gib()
+2 -2
View File
@@ -734,7 +734,7 @@
registered_name = "HoS"
icon_state = "HoS"
access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT,
ACCESS_FORENSICS_LOCKERS, ACCESS_PILOT, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_ALL_PERSONAL_LOCKERS,
ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_ALL_PERSONAL_LOCKERS,
ACCESS_RESEARCH, ACCESS_ENGINE, ACCESS_MINING, ACCESS_MEDICAL, ACCESS_CONSTRUCTION, ACCESS_MAILSORTING,
ACCESS_HEADS, ACCESS_HOS, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_WEAPONS)
@@ -762,7 +762,7 @@
access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS,
ACCESS_TELEPORTER, ACCESS_EXTERNAL_AIRLOCKS, ACCESS_ATMOSPHERICS, ACCESS_EMERGENCY_STORAGE, ACCESS_EVA,
ACCESS_HEADS, ACCESS_CONSTRUCTION, ACCESS_SEC_DOORS,
ACCESS_CE, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_TCOMSAT, ACCESS_MINISAT, ACCESS_MECHANIC, ACCESS_MINERAL_STOREROOM)
ACCESS_CE, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_TCOMSAT, ACCESS_MINISAT, ACCESS_MINERAL_STOREROOM)
/obj/item/card/id/clown
name = "Pink ID"
+3
View File
@@ -262,6 +262,9 @@ LIGHTERS ARE IN LIGHTERS.DM
pixel_x = rand(-5, 5)
pixel_y = rand(-5, 5)
/obj/item/clothing/mask/cigarette/rollie/nicotine
list_reagents = list("nicotine" = 40)
/obj/item/cigbutt/roach
name = "roach"
@@ -231,8 +231,7 @@
/obj/item/holosign_creator/security,
/obj/item/melee/classic_baton/telescopic,
/obj/item/restraints/legcuffs/bola,
/obj/item/clothing/mask/gas/sechailer,
/obj/item/spacepod_key)
/obj/item/clothing/mask/gas/sechailer)
/obj/item/storage/belt/security/sec/populate_contents()
new /obj/item/flashlight/seclite(src)
@@ -293,6 +293,7 @@
desc = "You can't understand the runes, but the packet smells funny."
icon_state = "midoripacket"
item_state = "midoripacket"
cigarette_type = /obj/item/clothing/mask/cigarette/rollie/nicotine
/obj/item/storage/fancy/cigarettes/cigpack_shadyjims
name ="\improper Shady Jim's Super Slims"
+1 -1
View File
@@ -158,7 +158,7 @@
deductcharge(hitcost)
return
if(isrobot(M)) // Can't stunbaton borgs
if(issilicon(M)) // Can't stunbaton borgs and AIs
return ..()
if(!isliving(M))
@@ -183,6 +183,7 @@
*/
/obj/item/twohanded/fireaxe // DEM AXES MAN, marker -Agouri
icon_state = "fireaxe0"
item_state = "fireaxe0"
name = "fire axe"
desc = "Truly, the weapon of a madman. Who would think to fight fire with an axe?"
force = 5
@@ -75,7 +75,7 @@
if(istype(W, /obj/item/pen))
var/decalselection = input("Please select a decal") as null|anything in list("Atmospherics", "Bartender", "Barber", "Blueshield", "Brig Physician", "Captain",
"Cargo", "Chief Engineer", "Chaplain", "Chef", "Chemist", "Civilian", "Clown", "CMO", "Coroner", "Detective", "Engineering", "Genetics", "HOP",
"HOS", "Hydroponics", "Internal Affairs Agent", "Janitor", "Magistrate", "Mechanic", "Medical", "Mime", "Mining", "NT Representative", "Paramedic", "Pod Pilot",
"HOS", "Hydroponics", "Internal Affairs Agent", "Janitor", "Magistrate", "Medical", "Mime", "Mining", "NT Representative", "Paramedic",
"Prisoner", "Research Director", "Security", "Syndicate", "Therapist", "Virology", "Warden", "Xenobiology")
if(!decalselection)
return
@@ -2,7 +2,7 @@
/obj/structure/closet/fireaxecabinet
name = "fire axe cabinet"
desc = "There is small label that reads \"For Emergency use only\" along with details for safe use of the axe. As if."
var/obj/item/twohanded/fireaxe/fireaxe = new/obj/item/twohanded/fireaxe
var/obj/item/twohanded/fireaxe/fireaxe
icon_state = "fireaxe1000"
icon_closed = "fireaxe1000"
icon_opened = "fireaxe1100"
@@ -15,6 +15,10 @@
locked = TRUE
var/smashed = FALSE
/obj/structure/closet/fireaxecabinet/populate_contents()
fireaxe = new/obj/item/twohanded/fireaxe(src)
update_icon() // So its initial icon doesn't show it without the fireaxe
/obj/structure/closet/fireaxecabinet/examine(mob/user)
. = ..()
. += "<span class='notice'>Use a multitool to lock/unlock it.</span>"
+3 -2
View File
@@ -94,9 +94,9 @@
if(density)
smooth = SMOOTH_FALSE
clear_smooth_overlays()
icon_state = "fwall_opening"
flick("fwall_opening", src)
else
icon_state = "fwall_closing"
flick("fwall_closing", src)
/obj/structure/falsewall/update_icon()
if(density)
@@ -297,6 +297,7 @@
/obj/structure/falsewall/sandstone
name = "sandstone wall"
desc = "A wall with sandstone plating."
icon = 'icons/turf/walls/sandstone_wall.dmi'
icon_state = "sandstone"
mineral = /obj/item/stack/sheet/mineral/sandstone
walltype = /turf/simulated/wall/mineral/sandstone
+3 -1
View File
@@ -508,6 +508,7 @@
/obj/structure/window/reinforced/polarized
name = "electrochromic window"
desc = "Adjusts its tint with voltage. Might take a few good hits to shatter it."
glass_amount = 2
var/id
/obj/machinery/button/windowtint
@@ -674,8 +675,9 @@
/obj/structure/window/full/reinforced/polarized
name = "electrochromic window"
desc = "Adjusts its tint with voltage. Might take a few good hits to shatter it."
glass_amount = 4
var/id
/obj/structure/window/full/reinforced/tinted
name = "tinted window"
desc = "It looks rather strong and opaque. Might take a few good hits to shatter it."
+78 -32
View File
@@ -624,43 +624,89 @@ GLOBAL_VAR_INIT(nologevent, 0)
////////////////////////////////////////////////////////////////////////////////////////////////ADMIN HELPER PROCS
/proc/is_special_character(mob/M as mob) // returns 1 for specail characters and 2 for heroes of gamemode
if(!SSticker || !SSticker.mode)
return 0
/**
* A proc that return whether the mob is a "Special Character" aka Antagonist
*
* Arguments:
* * M - the mob you're checking
* *
*/
/proc/is_special_character(mob/M)
if(!SSticker.mode)
return FALSE
if(!istype(M))
return 0
if((M.mind in SSticker.mode.head_revolutionaries) || (M.mind in SSticker.mode.revolutionaries))
if(SSticker.mode.config_tag == "revolution")
return 2
return 1
if(M.mind in SSticker.mode.cult)
if(SSticker.mode.config_tag == "cult")
return 2
return 1
if(M.mind in SSticker.mode.syndicates)
if(SSticker.mode.config_tag == "nuclear")
return 2
return 1
if(M.mind in SSticker.mode.wizards)
if(SSticker.mode.config_tag == "wizard")
return 2
return 1
if(M.mind in SSticker.mode.changelings)
if(SSticker.mode.config_tag == "changeling")
return 2
return 1
if(M.mind in SSticker.mode.abductors)
if(SSticker.mode.config_tag == "abduction")
return 2
return 1
return FALSE
if(isrobot(M))
var/mob/living/silicon/robot/R = M
if(R.emagged)
return 1
if(M.mind&&M.mind.special_role)//If they have a mind and special role, they are some type of traitor or antagonist.
return 1
return TRUE
if(M.mind.special_role)//If they have a mind and special role, they are some type of traitor or antagonist.
return TRUE
return FALSE
return 0
/**
* A proc that return an array of capitalized strings containing name of the antag types they are
*
* Arguments:
* * M - the mob you're checking
*/
/proc/get_antag_type_strings_list(mob/M) // return an array of all the antag types they are with name
var/list/antag_list = list()
if(!SSticker.mode || !istype(M) || !M.mind)
return FALSE
if(M.mind in SSticker.mode.head_revolutionaries)
antag_list += "Head Rev"
if(M.mind in SSticker.mode.revolutionaries)
antag_list += "Revolutionary"
if(M.mind in SSticker.mode.cult)
antag_list += "Cultist"
if(M.mind in SSticker.mode.syndicates)
antag_list += "Nuclear Operative"
if(M.mind in SSticker.mode.wizards)
antag_list += "Wizard"
if(M.mind in SSticker.mode.changelings)
antag_list += "Changeling"
if(M.mind in SSticker.mode.abductors)
antag_list += "Abductor"
if(M.mind in SSticker.mode.vampires)
antag_list += "Vampire"
if(M.mind in SSticker.mode.vampire_enthralled)
antag_list += "Vampire Thrall"
if(M.mind in SSticker.mode.shadows)
antag_list += "Shadowling"
if(M.mind in SSticker.mode.shadowling_thralls)
antag_list += "Shadowling Thrall"
if(M.mind.has_antag_datum(/datum/antagonist/traitor))
antag_list += "Traitor"
if(M.mind.has_antag_datum(/datum/antagonist/mindslave))
antag_list += "Mindslave"
if(isrobot(M))
var/mob/living/silicon/robot/R = M
if(R.emagged)
antag_list += "Emagged Borg"
if(!length(antag_list) && M.mind.special_role) // Snowflake check. If none of the above but still special, then other antag. Technically not accurate.
antag_list += "Other Antag(s)"
return antag_list
/**
* A proc that return a string containing all the singled out antags . Empty string if not antag
*
* Usually, you'd return a FALSE, but since this is consumed by javascript you're in
* for a world of hurt if you pass a byond FALSE which get converted into a fucking string anyway and pass for TRUE in check. Fuck.
* It always append "(May be other antag)"
* Arguments:
* * M - the mob you're checking
* *
*/
/proc/get_antag_type_truncated_plaintext_string(mob/M as mob)
var/list/antag_list = get_antag_type_strings_list(M)
if(length(antag_list))
return antag_list.Join(" &amp; ") + " " + "(May be other antag)"
return ""
/datum/admins/proc/spawn_atom(object as text)
set category = "Debug"
+13 -10
View File
@@ -363,17 +363,20 @@ GLOBAL_LIST_INIT(admin_verbs_ticket, list(
if(!check_rights(R_ADMIN))
return
if(!isliving(mob))
return
if(mob)
if(mob.invisibility == INVISIBILITY_OBSERVER)
mob.invisibility = initial(mob.invisibility)
to_chat(mob, "<span class='danger'>Invisimin off. Invisibility reset.</span>")
mob.add_to_all_human_data_huds()
//TODO: Make some kind of indication for the badmin that they are currently invisible
else
mob.invisibility = INVISIBILITY_OBSERVER
to_chat(mob, "<span class='notice'>Invisimin on. You are now as invisible as a ghost.</span>")
mob.remove_from_all_data_huds()
if(mob.invisibility == INVISIBILITY_OBSERVER)
mob.invisibility = initial(mob.invisibility)
mob.add_to_all_human_data_huds()
to_chat(mob, "<span class='danger'>Invisimin off. Invisibility reset.</span>")
log_admin("[key_name(mob)] has turned Invisimin OFF")
else
mob.invisibility = INVISIBILITY_OBSERVER
mob.remove_from_all_data_huds()
to_chat(mob, "<span class='notice'>Invisimin on. You are now as invisible as a ghost.</span>")
log_admin("[key_name(mob)] has turned Invisimin ON")
SSblackbox.record_feedback("tally", "admin_verb", 1, "Invisimin")
/client/proc/player_panel_new()
set name = "Player Panel"
+5 -5
View File
@@ -65,7 +65,7 @@
}
function expand(id,job,name,real_name,image,key,ip,antagonist,mobUID,client_ckey,eyeUID){
function expand(id,job,name,real_name,image,key,ip,antagonists,mobUID,client_ckey,eyeUID){
clearAll();
@@ -89,8 +89,8 @@
if(eyeUID)
body += "|<a href='?src=[UID()];adminplayerobservefollow="+eyeUID+"'>EYE</a>"
body += "<br>"
if(antagonist > 0)
body += "<font size='2'><a href='?src=[UID()];check_antagonist=1'><font color='red'><b>Antagonist</b></font></a></font>";
if(antagonists)
body += "<font size='2'><a href='?src=[UID()];check_antagonist=1'><font color='red'><b>"+antagonists+"</b></font></a></font>";
body += "</td></tr></table>";
@@ -227,7 +227,7 @@
var/color = "#e6e6e6"
if(i%2 == 0)
color = "#f2f2f2"
var/is_antagonist = is_special_character(M)
var/antagonist_string = get_antag_type_truncated_plaintext_string(M)
var/M_job = ""
@@ -305,7 +305,7 @@
<td align='center' bgcolor='[color]'>
<span id='notice_span[i]'></span>
<a id='link[i]'
onmouseover='expand("item[i]","[M_job]","[M_name]","[M_rname]","--unused--","[M_key]","[M.lastKnownIP]",[is_antagonist],"[M.UID()]","[client_ckey]","[M_eyeUID]")'
onmouseover='expand("item[i]","[M_job]","[M_name]","[M_rname]","--unused--","[M_key]","[M.lastKnownIP]","[antagonist_string]","[M.UID()]","[client_ckey]","[M_eyeUID]")'
>
<b id='search[i]'>[M_name] - [M_rname] - [M_key] ([M_job])</b>
</a>
+1 -9
View File
@@ -47,16 +47,8 @@ GLOBAL_LIST_INIT(adminhelp_ignored_words, list("unknown", "the", "a", "an", "of"
SSdiscord.send2discord_simple_noadmins("**\[Adminhelp]** [key_name(src)]: [msg]", check_send_always = TRUE)
if("Mentorhelp")
var/alerttext
var/list/mentorcount = staff_countup(R_MENTOR)
var/active_mentors = mentorcount[1]
var/inactive_mentors = mentorcount[3]
if(active_mentors <= 0)
if(inactive_mentors)
alerttext = " | **ALL MENTORS AFK**"
else
alerttext = " | **NO MENTORS ONLINE**"
log_admin("[selected_type]: [key_name(src)]: [msg] - heard by [active_mentors] non-AFK mentors.")
SSdiscord.send2discord_simple(DISCORD_WEBHOOK_MENTOR, "[key_name(src)]: [msg][alerttext]")
SSdiscord.send2discord_simple_mentor("[key_name(src)]: [msg]")
+2 -2
View File
@@ -357,8 +357,8 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention)
pai.real_name = pai.name
pai.key = choice.key
card.setPersonality(pai)
for(var/datum/paiCandidate/candidate in GLOB.paiController.pai_candidates)
if(candidate.key == choice.key)
for(var/datum/pai_save/candidate in GLOB.paiController.pai_candidates)
if(candidate.owner.ckey == choice.ckey)
GLOB.paiController.pai_candidates.Remove(candidate)
SSblackbox.record_feedback("tally", "admin_verb", 1, "Make pAI") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+1 -1
View File
@@ -203,7 +203,7 @@
log_world("### MassVarEdit by [src]: [O.type] (A/R [accepted]/[rejected]) [variable]=[html_encode("[O.vars[variable]]")]([list2params(value)])")
log_admin("[key_name(src)] mass modified [original_name]'s [variable] to [O.vars[variable]] ([accepted] objects modified)")
message_admins("[key_name_admin(src)] mass modified [original_name]'s [variable] to [O.vars[variable]] ([accepted] objects modified)")
message_admins("[key_name_admin(src)] mass modified [original_name]'s [variable] to [html_encode("[O.vars[variable]]")] ([accepted] objects modified)")
/proc/get_all_of_type(T, subtypes = TRUE)
var/list/typecache = list()
+4 -4
View File
@@ -355,7 +355,7 @@ GLOBAL_LIST_INIT(VVpixelmovement, list("step_x", "step_y", "step_size", "bound_h
return
log_world("### ListVarEdit by [src]: [(O ? O.type : "/list")] [objectvar]: ADDED=[var_value]")
log_admin("[key_name(src)] modified [original_name]'s [objectvar]: ADDED=[var_value]")
message_admins("[key_name_admin(src)] modified [original_name]'s [objectvar]: ADDED=[var_value]")
message_admins("[key_name_admin(src)] modified [original_name]'s [objectvar]: ADDED=[html_encode("[var_value]")]")
/client/proc/mod_list(list/L, atom/O, original_name, objectvar, index, autodetect_class = FALSE)
if(!check_rights(R_VAREDIT))
@@ -495,7 +495,7 @@ GLOBAL_LIST_INIT(VVpixelmovement, list("step_x", "step_y", "step_size", "bound_h
return
log_world("### ListVarEdit by [src]: [O.type] [objectvar]: REMOVED=[html_encode("[original_var]")]")
log_admin("[key_name(src)] modified [original_name]'s [objectvar]: REMOVED=[original_var]")
message_admins("[key_name_admin(src)] modified [original_name]'s [objectvar]: REMOVED=[original_var]")
message_admins("[key_name_admin(src)] modified [original_name]'s [objectvar]: REMOVED=[html_encode("[original_var]")]")
return
if(VV_TEXT)
@@ -514,7 +514,7 @@ GLOBAL_LIST_INIT(VVpixelmovement, list("step_x", "step_y", "step_size", "bound_h
return
log_world("### ListVarEdit by [src]: [(O ? O.type : "/list")] [objectvar]: [original_var]=[new_var]")
log_admin("[key_name(src)] modified [original_name]'s [objectvar]: [original_var]=[new_var]")
message_admins("[key_name_admin(src)] modified [original_name]'s varlist [objectvar]: [original_var]=[new_var]")
message_admins("[key_name_admin(src)] modified [original_name]'s varlist [objectvar]: [original_var]=[html_encode("[new_var]")]")
/proc/vv_varname_lockcheck(param_var_name)
if(param_var_name in GLOB.VVlocked)
@@ -630,5 +630,5 @@ GLOBAL_LIST_INIT(VVpixelmovement, list("step_x", "step_y", "step_size", "bound_h
SEND_GLOBAL_SIGNAL(COMSIG_GLOB_VAR_EDIT, args)
log_world("### VarEdit by [src]: [O.type] [variable]=[html_encode("[var_new]")]")
log_admin("[key_name(src)] modified [original_name]'s [variable] to [var_new]")
var/msg = "[key_name_admin(src)] modified [original_name]'s [variable] to [var_new]"
var/msg = "[key_name_admin(src)] modified [original_name]'s [variable] to [html_encode("[var_new]")]"
message_admins(msg)
@@ -25,7 +25,6 @@
"Locker Toilets",
"Maintenance Bar",
"Medical Secondary Storage",
"Mechanic Workshop",
"Port Emergency Storage",
"Psych Room",
"Toxins Launch Room",
@@ -206,9 +206,7 @@
immunity = list(TYPE_GROUND)
area_blacklist = list(/area/maintenance)
area_whitelist = list(/area/hallway,
/area/escapepodbay,
/area/engine/mechanic_workshop,
/area/security/podbay)
/area/escapepodbay)
/datum/mob_type/bluespace
name = "Bluespace"
@@ -213,9 +213,6 @@
to_chat(user, "<span class='warning'>The communicator buzzes, and you hear the voice again: 'Oh really now?' You hear a clicking sound. 'Team, get back here. We have trouble'. Then the line goes dead.</span>")
for(var/thing in GLOB.landmarks_list)
var/obj/effect/landmark/L = thing
if(L.name == "wildwest_syndipod")
var/obj/spacepod/syndi/P = new /obj/spacepod/syndi(get_turf(L))
P.name = "Syndi Recon Pod"
if(L.name == "wildwest_syndibackup")
var/mob/living/simple_animal/hostile/syndicate/ranged/space/R = new /mob/living/simple_animal/hostile/syndicate/ranged/space(get_turf(L))
R.name = "Syndi Recon Team"
+3
View File
@@ -114,6 +114,9 @@
/// Is the client watchlisted
var/watchlisted = FALSE
/// Client's pAI save
var/datum/pai_save/pai_save
/client/vv_edit_var(var_name, var_value)
switch(var_name)
// I know we will never be in a world where admins are editing client vars to let people bypass TOS
+10 -6
View File
@@ -147,14 +147,10 @@
karma_purchase(karma,5,"job","Brig Physician")
if("3")
karma_purchase(karma,30,"job","Nanotrasen Representative")
if("5")
if("4")
karma_purchase(karma,30,"job","Blueshield")
if("6")
karma_purchase(karma,30,"job","Mechanic")
if("7")
if("5")
karma_purchase(karma,45,"job","Magistrate")
if("9")
karma_purchase(karma,30,"job","Security Pod Pilot")
return
if(href_list["KarmaBuy2"])
var/karma=verify_karma()
@@ -202,6 +198,11 @@
..() //redirect to hsrc.Topic()
/client/proc/get_display_key()
var/fakekey = src?.holder?.fakekey
return fakekey ? fakekey : key
/client/proc/is_content_unlocked()
if(!prefs.unlock_content)
to_chat(src, "Become a BYOND member to access member-perks and features, as well as support the engine that makes this game possible. <a href='http://www.byond.com/membership'>Click here to find out more</a>.")
@@ -286,6 +287,8 @@
log_client_to_db(tdata) // Make sure our client exists in the DB
pai_save = new(src)
// This is where we load all of the clients stuff from the DB
if(SSdbcore.IsConnected())
// Load in all our client data from the DB
@@ -453,6 +456,7 @@
GLOB.clients -= src
SSinstancing.update_playercache() // Clear us out
QDEL_NULL(chatOutput)
QDEL_NULL(pai_save)
if(movingmob)
movingmob.client_mobs_in_contents -= mob
UNSETEMPTY(movingmob.client_mobs_in_contents)
@@ -0,0 +1,8 @@
/datum/client_login_processor/pai_save
priority = 40
/datum/client_login_processor/pai_save/get_query(client/C)
return C.pai_save.get_query()
/datum/client_login_processor/pai_save/process_result(datum/db_query/Q, client/C)
C.pai_save.load_data(Q)
+6 -28
View File
@@ -115,7 +115,7 @@
if(!isemptylist(player_alt_titles))
playertitlelist = list2params(player_alt_titles)
if(!isemptylist(loadout_gear))
gearlist = list2params(loadout_gear)
gearlist = json_encode(loadout_gear)
var/datum/db_query/firstquery = SSdbcore.NewQuery("SELECT slot FROM characters WHERE ckey=:ckey ORDER BY slot", list(
"ckey" = C.ckey
@@ -438,7 +438,7 @@
//socks
socks = query.item[49]
body_accessory = query.item[50]
loadout_gear = params2list(query.item[51])
loadout_gear = query.item[51]
autohiss_mode = text2num(query.item[52])
//Sanitize
@@ -507,6 +507,7 @@
socks = sanitize_text(socks, initial(socks))
body_accessory = sanitize_text(body_accessory, initial(body_accessory))
loadout_gear = sanitize_json(loadout_gear)
if(!player_alt_titles)
player_alt_titles = new()
@@ -1379,29 +1380,6 @@
clothes_s.Blend(new /icon('icons/mob/clothing/back.dmi', "satchel"), ICON_OVERLAY)
else if(job_karma_high)
switch(job_karma_high)
if(JOB_MECHANIC)
clothes_s = new /icon(uniform_dmi, "mechanic_s")
clothes_s.Blend(new /icon('icons/mob/clothing/feet.dmi', "orange"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/clothing/belt.dmi', "utility"), ICON_OVERLAY)
clothes_s.Blend(new /icon('icons/mob/clothing/head.dmi', "hardhat0_yellow"), ICON_OVERLAY)
switch(backbag)
if(2)
clothes_s.Blend(new /icon('icons/mob/clothing/back.dmi', "engiepack"), ICON_OVERLAY)
if(3)
clothes_s.Blend(new /icon('icons/mob/clothing/back.dmi', "satchel-eng"), ICON_OVERLAY)
if(4)
clothes_s.Blend(new /icon('icons/mob/clothing/back.dmi', "satchel"), ICON_OVERLAY)
if(JOB_PILOT)
clothes_s = new /icon(uniform_dmi, "secred_s")
clothes_s.Blend(new /icon('icons/mob/clothing/feet.dmi', "jackboots"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/clothing/suit.dmi', "bomber"), ICON_OVERLAY)
switch(backbag)
if(2)
clothes_s.Blend(new /icon('icons/mob/clothing/back.dmi', "securitypack"), ICON_OVERLAY)
if(3)
clothes_s.Blend(new /icon('icons/mob/clothing/back.dmi', "satchel-sec"), ICON_OVERLAY)
if(4)
clothes_s.Blend(new /icon('icons/mob/clothing/back.dmi', "satchel"), ICON_OVERLAY)
if(JOB_BRIGDOC)
clothes_s = new /icon(uniform_dmi, "medical_s")
clothes_s.Blend(new /icon('icons/mob/clothing/feet.dmi', "white"), ICON_UNDERLAY)
@@ -1480,11 +1458,11 @@
/datum/character_save/proc/get_gear_metadata(datum/gear/G)
. = loadout_gear[G.display_name]
/datum/character_save/proc/get_gear_metadata(datum/gear/G) // NYI
. = loadout_gear[G.type]
if(!.)
. = list()
loadout_gear[G.display_name] = .
loadout_gear[G.type] = .
/datum/character_save/proc/get_tweak_metadata(datum/gear/G, datum/gear_tweak/tweak)
var/list/metadata = get_gear_metadata(G)
@@ -96,29 +96,17 @@
if(href_list["preference"] == "gear")
if(href_list["toggle_gear"])
var/datum/gear/TG = GLOB.gear_datums[href_list["toggle_gear"]]
if(TG.display_name in active_character.loadout_gear)
active_character.loadout_gear -= TG.display_name
var/datum/gear/TG = GLOB.gear_datums[text2path(href_list["toggle_gear"])]
if(TG && (TG.type in active_character.loadout_gear))
active_character.loadout_gear -= TG.type
else
if(TG.donator_tier && user.client.donator_level < TG.donator_tier)
to_chat(user, "<span class='warning'>That gear is only available at a higher donation tier than you are on.</span>")
return
var/total_cost = 0
var/list/type_blacklist = list()
for(var/gear_name in active_character.loadout_gear)
var/datum/gear/G = GLOB.gear_datums[gear_name]
if(istype(G))
if(!G.subtype_cost_overlap)
if(G.subtype_path in type_blacklist)
continue
type_blacklist += G.subtype_path
total_cost += G.cost
build_loadout(TG)
if((total_cost + TG.cost) <= max_gear_slots)
active_character.loadout_gear += TG.display_name
else if(href_list["gear"] && href_list["tweak"])
var/datum/gear/gear = GLOB.gear_datums[href_list["gear"]]
else if(href_list["gear"] && href_list["tweak"]) // NYI
var/datum/gear/gear = GLOB.gear_datums[text2path(href_list["gear"])]
var/datum/gear_tweak/tweak = locate(href_list["tweak"])
if(!tweak || !istype(gear) || !(tweak in gear.gear_tweaks))
return
@@ -10,17 +10,27 @@ GLOBAL_LIST_EMPTY(gear_datums)
..()
/datum/gear
var/display_name //Name/index. Must be unique.
var/description //Description of this gear. If left blank will default to the description of the pathed item.
var/path //Path to item.
var/cost = 1 //Number of points used. Items in general cost 1 point, storage/armor/gloves/special use costs 2 points.
var/slot //Slot to equip to.
var/list/allowed_roles //Roles that can spawn with this item.
var/whitelisted //Term to check the whitelist for..
/// Displayed name of the item listing.
var/display_name
/// Description of the item listing. If left blank will default to the description of the pathed item.
var/description
/// Typepath of the item.
var/path
/// Loadout points cost to select the item listing.
var/cost = 1
/// Slot to equip the item to.
var/slot
/// List of job roles which can spawn with the item.
var/list/allowed_roles
/// Loadout category of the item listing.
var/sort_category = "General"
var/list/gear_tweaks = list() //List of datums which will alter the item after it has been spawned.
var/subtype_path = /datum/gear //for skipping organizational subtypes (optional)
var/subtype_cost_overlap = TRUE //if subtypes can take points at the same time
/// List of datums which will alter the item after it has been spawned. (NYI)
var/list/gear_tweaks = list()
/// Set on empty category datums to skip them being added to the list. (/datum/gear/accessory, /datum/gear/suit/coat/job, etc.)
var/main_typepath = /datum/gear
/// Does selecting a second item with the same `main_typepath` cost loadout points.
var/subtype_selection_cost = TRUE
/// Patreon donator tier needed to select this item listing.
var/donator_tier = 0
/datum/gear/New()
@@ -1,203 +1,215 @@
/*
######################################################################################
## ##
## IMPORTANT README ##
## ##
## Changing any /datum/gear typepaths --WILL-- break people's loadouts. ##
## The typepaths are stored directly in the `characters.gear` column of the DB. ##
## Please inform the server host if you wish to modify any of these. ##
## ##
######################################################################################
*/
/datum/gear/accessory
subtype_path = /datum/gear/accessory
main_typepath = /datum/gear/accessory
slot = slot_tie
sort_category = "Accessories"
/datum/gear/accessory/scarf
display_name = "scarf"
display_name = "Scarf"
path = /obj/item/clothing/accessory/scarf
/datum/gear/accessory/scarf/red
display_name = "scarf, red"
display_name = "Scarf, red"
path = /obj/item/clothing/accessory/scarf/red
/datum/gear/accessory/scarf/green
display_name = "scarf, green"
display_name = "Scarf, green"
path = /obj/item/clothing/accessory/scarf/green
/datum/gear/accessory/scarf/darkblue
display_name = "scarf, dark blue"
display_name = "Scarf, dark blue"
path = /obj/item/clothing/accessory/scarf/darkblue
/datum/gear/accessory/scarf/purple
display_name = "scarf, purple"
display_name = "Scarf, purple"
path = /obj/item/clothing/accessory/scarf/purple
/datum/gear/accessory/scarf/yellow
display_name = "scarf, yellow"
display_name = "Scarf, yellow"
path = /obj/item/clothing/accessory/scarf/yellow
/datum/gear/accessory/scarf/orange
display_name = "scarf, orange"
display_name = "Scarf, orange"
path = /obj/item/clothing/accessory/scarf/orange
/datum/gear/accessory/scarf/lightblue
display_name = "scarf, light blue"
display_name = "Scarf, light blue"
path = /obj/item/clothing/accessory/scarf/lightblue
/datum/gear/accessory/scarf/white
display_name = "scarf, white"
display_name = "Scarf, white"
path = /obj/item/clothing/accessory/scarf/white
/datum/gear/accessory/scarf/black
display_name = "scarf, black"
display_name = "Scarf, black"
path = /obj/item/clothing/accessory/scarf/black
/datum/gear/accessory/scarf/zebra
display_name = "scarf, zebra"
display_name = "Scarf, zebra"
path = /obj/item/clothing/accessory/scarf/zebra
/datum/gear/accessory/scarf/christmas
display_name = "scarf, christmas"
display_name = "Scarf, christmas"
path = /obj/item/clothing/accessory/scarf/christmas
/datum/gear/accessory/scarf/stripedred
display_name = "scarf, striped red"
display_name = "Scarf, striped red"
path = /obj/item/clothing/accessory/stripedredscarf
/datum/gear/accessory/scarf/stripedgreen
display_name = "scarf, striped green"
display_name = "Scarf, striped green"
path = /obj/item/clothing/accessory/stripedgreenscarf
/datum/gear/accessory/scarf/stripedblue
display_name = "scarf, striped blue"
display_name = "Scarf, striped blue"
path = /obj/item/clothing/accessory/stripedbluescarf
/datum/gear/accessory/holobadge
display_name = "holobadge, pin"
display_name = "Holobadge, pin"
path = /obj/item/clothing/accessory/holobadge
allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer", "Security Pod Pilot")
allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer")
/datum/gear/accessory/holobadge_n
display_name = "holobadge, cord"
display_name = "Holobadge, cord"
path = /obj/item/clothing/accessory/holobadge/cord
allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer", "Security Pod Pilot")
allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer")
/datum/gear/accessory/tieblue
display_name = "tie, blue"
display_name = "Tie, blue"
path = /obj/item/clothing/accessory/blue
/datum/gear/accessory/tiered
display_name = "tie, red"
display_name = "Tie, red"
path = /obj/item/clothing/accessory/red
/datum/gear/accessory/tieblack
display_name = "tie, black"
display_name = "Tie, black"
path = /obj/item/clothing/accessory/black
/datum/gear/accessory/tiehorrible
display_name = "tie, vomit green"
display_name = "Tie, vomit green"
path = /obj/item/clothing/accessory/horrible
/datum/gear/accessory/stethoscope
display_name = "stethoscope"
display_name = "Stethoscope"
path = /obj/item/clothing/accessory/stethoscope
allowed_roles = list("Chief Medical Officer", "Medical Doctor", "Paramedic", "Brig Physician")
/datum/gear/accessory/cowboyshirt
display_name = "cowboy shirt, black"
display_name = "Cowboy shirt, black"
path = /obj/item/clothing/accessory/cowboyshirt
/datum/gear/accessory/cowboyshirt/short_sleeved
display_name = "cowboy shirt, short sleeved black"
display_name = "Cowboy shirt, short sleeved black"
path = /obj/item/clothing/accessory/cowboyshirt/short_sleeved
/datum/gear/accessory/cowboyshirt/white
display_name = "cowboy shirt, white"
display_name = "Cowboy shirt, white"
path = /obj/item/clothing/accessory/cowboyshirt/white
/datum/gear/accessory/cowboyshirt/white/short_sleeved
display_name = "cowboy shirt, short sleeved white"
display_name = "Cowboy shirt, short sleeved white"
path = /obj/item/clothing/accessory/cowboyshirt/white/short_sleeved
/datum/gear/accessory/cowboyshirt/pink
display_name = "cowboy shirt, pink"
display_name = "Cowboy shirt, pink"
path = /obj/item/clothing/accessory/cowboyshirt/pink
/datum/gear/accessory/cowboyshirt/pink/short_sleeved
display_name = "cowboy shirt, short sleeved pink"
display_name = "Cowboy shirt, short sleeved pink"
path = /obj/item/clothing/accessory/cowboyshirt/pink/short_sleeved
/datum/gear/accessory/cowboyshirt/red
display_name = "cowboy shirt, red"
display_name = "Cowboy shirt, red"
path = /obj/item/clothing/accessory/cowboyshirt/red
/datum/gear/accessory/cowboyshirt/red/short_sleeved
display_name = "cowboy shirt, short sleeved red"
display_name = "Cowboy shirt, short sleeved red"
path = /obj/item/clothing/accessory/cowboyshirt/red/short_sleeved
/datum/gear/accessory/cowboyshirt/navy
display_name = "cowboy shirt, navy"
display_name = "Cowboy shirt, navy"
path = /obj/item/clothing/accessory/cowboyshirt/navy
/datum/gear/accessory/cowboyshirt/navy/short_sleeved
display_name = "cowboy shirt, short sleeved navy"
display_name = "Cowboy shirt, short sleeved navy"
path = /obj/item/clothing/accessory/cowboyshirt/navy/short_sleeved
/datum/gear/accessory/locket
display_name = "gold locket"
display_name = "Gold locket"
path = /obj/item/clothing/accessory/necklace/locket
/datum/gear/accessory/necklace
display_name = "simple necklace"
display_name = "Simple necklace"
path = /obj/item/clothing/accessory/necklace
/datum/gear/accessory/corset
display_name = "corset, black"
display_name = "Corset, black"
path = /obj/item/clothing/accessory/corset
/datum/gear/accessory/corsetred
display_name = "corset, red"
display_name = "Corset, red"
path = /obj/item/clothing/accessory/corset/red
/datum/gear/accessory/corsetblue
display_name = "corset, blue"
display_name = "Corset, blue"
path = /obj/item/clothing/accessory/corset/blue
/datum/gear/accessory/armband_red
display_name = "armband"
display_name = "Armband"
path = /obj/item/clothing/accessory/armband
/datum/gear/accessory/armband_civ
display_name = "armband, blue-yellow"
display_name = "Armband, blue-yellow"
path = /obj/item/clothing/accessory/armband/yb
/datum/gear/accessory/armband_job
subtype_path = /datum/gear/accessory/armband_job
subtype_cost_overlap = FALSE
main_typepath = /datum/gear/accessory/armband_job
subtype_selection_cost = FALSE
/datum/gear/accessory/armband_job/sec
display_name = " armband, security"
display_name = "Armband, security"
path = /obj/item/clothing/accessory/armband/sec
allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer", "Brig Physician", "Security Pod Pilot")
allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer", "Brig Physician")
/datum/gear/accessory/armband_job/cargo
display_name = "cargo armband"
display_name = "Armband, cargo"
path = /obj/item/clothing/accessory/armband/cargo
allowed_roles = list("Quartermaster","Cargo Technician", "Shaft Miner")
/datum/gear/accessory/armband_job/medical
display_name = "armband, medical"
display_name = "Armband, medical"
path = /obj/item/clothing/accessory/armband/med
allowed_roles = list("Chief Medical Officer", "Medical Doctor", "Coroner", "Paramedic", "Brig Physician")
/datum/gear/accessory/armband_job/emt
display_name = "armband, EMT"
display_name = "Armband, EMT"
path = /obj/item/clothing/accessory/armband/medgreen
allowed_roles = list("Paramedic", "Brig Physician")
/datum/gear/accessory/armband_job/engineering
display_name = "armband, engineering"
display_name = "Armband, engineering"
path = /obj/item/clothing/accessory/armband/engine
allowed_roles = list("Chief Engineer","Station Engineer", "Life Support Specialist")
/datum/gear/accessory/armband_job/hydro
display_name = "armband, hydroponics"
display_name = "Armband, hydroponics"
path = /obj/item/clothing/accessory/armband/hydro
allowed_roles = list("Botanist")
/datum/gear/accessory/armband_job/sci
display_name = "armband, science"
display_name = "Armband, science"
path = /obj/item/clothing/accessory/armband/science
allowed_roles = list("Research Director","Scientist", "Roboticist")
@@ -1,24 +1,37 @@
/*
######################################################################################
## ##
## IMPORTANT README ##
## ##
## Changing any /datum/gear typepaths --WILL-- break people's loadouts. ##
## The typepaths are stored directly in the `characters.gear` column of the DB. ##
## Please inform the server host if you wish to modify any of these. ##
## ##
######################################################################################
*/
/datum/gear/lipstick
display_name = "lipstick, red"
display_name = "Lipstick, red"
path = /obj/item/lipstick
sort_category = "Cosmetics"
/datum/gear/lipstick/black
display_name = "lipstick, black"
display_name = "Lipstick, black"
path = /obj/item/lipstick/black
/datum/gear/lipstick/jade
display_name = "lipstick, jade"
display_name = "Lipstick, jade"
path = /obj/item/lipstick/jade
/datum/gear/lipstick/purple
display_name = "lipstick, purple"
display_name = "Lipstick, purple"
path = /obj/item/lipstick/purple
/datum/gear/lipstick/blue
display_name = "lipstick, blue"
display_name = "Lipstick, blue"
path = /obj/item/lipstick/blue
/datum/gear/lipstick/lime
display_name = "lipstick, lime"
display_name = "Lipstick, lime"
path = /obj/item/lipstick/lime
@@ -1,7 +1,20 @@
/*
######################################################################################
## ##
## IMPORTANT README ##
## ##
## Changing any /datum/gear typepaths --WILL-- break people's loadouts. ##
## The typepaths are stored directly in the `characters.gear` column of the DB. ##
## Please inform the server host if you wish to modify any of these. ##
## ##
######################################################################################
*/
/datum/gear/donor
donator_tier = 2
sort_category = "Donor"
subtype_path = /datum/gear/donor
main_typepath = /datum/gear/donor
/datum/gear/donor/furgloves
display_name = "Fur Gloves"
@@ -1,136 +1,149 @@
/*
######################################################################################
## ##
## IMPORTANT README ##
## ##
## Changing any /datum/gear typepaths --WILL-- break people's loadouts. ##
## The typepaths are stored directly in the `characters.gear` column of the DB. ##
## Please inform the server host if you wish to modify any of these. ##
## ##
######################################################################################
*/
/datum/gear/dice
display_name = "a d20"
display_name = "D20"
path = /obj/item/dice/d20
/datum/gear/uplift
display_name = "a pack of Uplifts"
display_name = "Pack of Uplifts"
path = /obj/item/storage/fancy/cigarettes/cigpack_uplift
/datum/gear/robust
display_name = "a pack of Robusts"
display_name = "Pack of Robusts"
path = /obj/item/storage/fancy/cigarettes/cigpack_robust
/datum/gear/carp
display_name = "a pack of Carps"
display_name = "Pack of Carps"
path = /obj/item/storage/fancy/cigarettes/cigpack_carp
/datum/gear/midori
display_name = "a pack of Midoris"
display_name = "Pack of Midoris"
path = /obj/item/storage/fancy/cigarettes/cigpack_midori
/datum/gear/smokingpipe
display_name = "smoking pipe"
display_name = "Smoking pipe"
path = /obj/item/clothing/mask/cigarette/pipe
cost = 2
/datum/gear/lighter
display_name = "a cheap lighter"
display_name = "Cheap lighter"
path = /obj/item/lighter
/datum/gear/matches
display_name = "a box of matches"
display_name = "Box of matches"
path = /obj/item/storage/box/matches
/datum/gear/candlebox
display_name = "a box candles"
display_name = "Box of candles"
description = "For setting the mood or for occult rituals."
path = /obj/item/storage/fancy/candle_box/full
/datum/gear/rock
display_name = "a pet rock"
display_name = "Pet rock"
path = /obj/item/toy/pet_rock
/datum/gear/camera
display_name = "a camera"
display_name = "Camera"
path = /obj/item/camera
/datum/gear/redfoxplushie
display_name = "a red fox plushie"
display_name = "Red fox plushie"
path = /obj/item/toy/plushie/red_fox
/datum/gear/blackcatplushie
display_name = "a black cat plushie"
display_name = "Black cat plushie"
path = /obj/item/toy/plushie/black_cat
/datum/gear/voxplushie
display_name = "a vox plushie"
display_name = "Vox plushie"
path = /obj/item/toy/plushie/voxplushie
/datum/gear/lizardplushie
display_name = "a lizard plushie"
display_name = "Lizard plushie"
path = /obj/item/toy/plushie/lizardplushie
/datum/gear/deerplushie
display_name = "a deer plushie"
display_name = "Deer plushie"
path = /obj/item/toy/plushie/deer
/datum/gear/carpplushie
display_name = "a carp plushie"
display_name = "Carp plushie"
path = /obj/item/toy/carpplushie
/datum/gear/sechud
display_name = "a classic security HUD"
display_name = "Classic security HUD"
path = /obj/item/clothing/glasses/hud/security
allowed_roles = list("Head of Security", "Warden", "Security Officer", "Security Pod Pilot", "Internal Affairs Agent","Magistrate")
allowed_roles = list("Head of Security", "Warden", "Security Officer", "Internal Affairs Agent","Magistrate")
/datum/gear/cryaonbox
display_name = "a box of crayons"
display_name = "Box of crayons"
path = /obj/item/storage/fancy/crayons
/datum/gear/cane
display_name = "a walking cane"
display_name = "Walking cane"
path = /obj/item/cane
/datum/gear/cards
display_name = "a deck of standard cards"
display_name = "Deck of standard cards"
path = /obj/item/deck/cards
/datum/gear/doublecards
display_name = "a double deck of standard cards"
display_name = "Double deck of standard cards"
path = /obj/item/deck/doublecards
/datum/gear/tarot
display_name = "a deck of tarot cards"
display_name = "Deck of tarot cards"
path = /obj/item/deck/tarot
/datum/gear/headphones
display_name = "a pair of headphones"
display_name = "Headphones"
path = /obj/item/clothing/ears/headphones
/datum/gear/fannypack
display_name = "a fannypack"
display_name = "Fannypack"
path = /obj/item/storage/belt/fannypack
/datum/gear/blackbandana
display_name = "bandana, black"
display_name = "Bandana, black"
path = /obj/item/clothing/mask/bandana/black
/datum/gear/purplebandana
display_name = "bandana, purple"
display_name = "Bandana, purple"
path = /obj/item/clothing/mask/bandana/purple
/datum/gear/orangebandana
display_name = "bandana, orange"
display_name = "Bandana, orange"
path = /obj/item/clothing/mask/bandana/orange
/datum/gear/greenbandana
display_name = "bandana, green"
display_name = "Bandana, green"
path = /obj/item/clothing/mask/bandana/green
/datum/gear/bluebandana
display_name = "bandana, blue"
display_name = "Bandana, blue"
path = /obj/item/clothing/mask/bandana/blue
/datum/gear/redbandana
display_name = "bandana, red"
display_name = "Bandana, red"
path = /obj/item/clothing/mask/bandana/red
/datum/gear/goldbandana
display_name = "bandana, gold"
display_name = "Bandana, gold"
path = /obj/item/clothing/mask/bandana/gold
/datum/gear/skullbandana
display_name = "bandana, skull"
display_name = "Bandana, skull"
path = /obj/item/clothing/mask/bandana/skull
/datum/gear/mob_hunt_game
@@ -143,54 +156,54 @@
//////////////////////
/datum/gear/mug
display_name = "random coffee mug"
display_name = "Coffee mug, random"
description = "A randomly colored coffee mug. You'll need to supply your own beverage though."
path = /obj/item/reagent_containers/food/drinks/mug
sort_category = "Mugs"
/datum/gear/novelty_mug
display_name = "novelty coffee mug"
display_name = "Coffee mug, novelty"
description = "A random novelty coffee mug. You'll need to supply your own beverage though."
path = /obj/item/reagent_containers/food/drinks/mug/novelty
cost = 2
sort_category = "Mugs"
/datum/gear/mug/flask
display_name = "flask"
display_name = "Flask"
description = "A flask for drink transportation. You'll need to supply your own beverage though."
path = /obj/item/reagent_containers/food/drinks/flask/barflask
/datum/gear/mug/department
subtype_path = /datum/gear/mug/department
main_typepath = /datum/gear/mug/department
sort_category = "Mugs"
subtype_cost_overlap = FALSE
subtype_selection_cost = FALSE
/datum/gear/mug/department/eng
display_name = "engineer coffee mug"
display_name = "Coffee mug, engineering"
description = "An engineer's coffee mug, emblazoned in the colors of the Engineering department."
allowed_roles = list("Chief Engineer", "Station Engineer", "Mechanic", "Life Support Specialist")
allowed_roles = list("Chief Engineer", "Station Engineer", "Life Support Specialist")
path = /obj/item/reagent_containers/food/drinks/mug/eng
/datum/gear/mug/department/med
display_name = "doctor coffee mug"
display_name = "Coffee mug, medical"
description = "A doctor's coffee mug, emblazoned in the colors of the Medical department."
allowed_roles = list("Chief Medical Officer", "Medical Doctor", "Chemist", "Psychiatrist", "Paramedic", "Virologist", "Coroner")
path = /obj/item/reagent_containers/food/drinks/mug/med
/datum/gear/mug/department/sci
display_name = "scientist coffee mug"
display_name = "Coffee mug, science"
description = "A scientist's coffee mug, emblazoned in the colors of the Science department."
allowed_roles = list("Research Director", "Scientist", "Roboticist")
path = /obj/item/reagent_containers/food/drinks/mug/sci
/datum/gear/mug/department/sec
display_name = "officer coffee mug"
display_name = "Coffee mug, security"
description = "An officer's coffee mug, emblazoned in the colors of the Security department."
allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer", "Security Pod Pilot", "Brig Physician", "Internal Affairs Agent")
allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer", "Brig Physician", "Internal Affairs Agent")
path = /obj/item/reagent_containers/food/drinks/mug/sec
/datum/gear/mug/department/serv
display_name = "crewmember coffee mug"
display_name = "Coffee mug, service"
description = "A crewmember's coffee mug, emblazoned in the colors of the Service department."
path = /obj/item/reagent_containers/food/drinks/mug/serv
@@ -1,10 +1,23 @@
/*
######################################################################################
## ##
## IMPORTANT README ##
## ##
## Changing any /datum/gear typepaths --WILL-- break people's loadouts. ##
## The typepaths are stored directly in the `characters.gear` column of the DB. ##
## Please inform the server host if you wish to modify any of these. ##
## ##
######################################################################################
*/
/datum/gear/glasses
subtype_path = /datum/gear/glasses
main_typepath = /datum/gear/glasses
slot = slot_glasses
sort_category = "Glasses"
/datum/gear/glasses/sunglasses
display_name = "cheap sunglasses"
display_name = "Cheap sunglasses"
path = /obj/item/clothing/glasses/sunglasses_fake
/datum/gear/glasses/eyepatch

Some files were not shown because too many files have changed in this diff Show More