Merge branch 'master' into upstream-merge-29611

This commit is contained in:
LetterJay
2017-08-15 18:55:12 -05:00
committed by GitHub
246 changed files with 3752 additions and 1365 deletions
-3
View File
@@ -1,6 +1,3 @@
[Feature Freeze!]: # We are currently not considering any balance or antagonist oriented pull requests. Full details, as well as ways to bypass this freeze, are available here https://github.com/tgstation/tgstation/pull/28223
[Changelogs]: # (Please make a changelog if you're adding, removing or changing content that'll affect players. This includes, but is not limited to, new features, sprites, sounds; balance changes; map edits and important fixes)
[]: # (See here for how to easily make a changelog: https://github.com/tgstation/tgstation/wiki/Changelogs. An example changelog has been provided below. Please edit or remove)
+1
View File
@@ -1,5 +1,6 @@
language: generic
sudo: false
dist: precise
env:
global:
+15
View File
@@ -0,0 +1,15 @@
diff a/SQL/database_changelog.txt b/SQL/database_changelog.txt (rejected hunks)
@@ -1,10 +1,10 @@
Any time you make a change to the schema files, remember to increment the database schema version. Generally increment the minor number, major should be reserved for significant changes to the schema. Both values go up to 255.
-The latest database version is 3.1; The query to update the schema revision table is:
+The latest database version is 3.0; The query to update the schema revision table is:
-UPDATE `schema_revision` SET major = 3, minor = 1 LIMIT 1;
+INSERT INTO `schema_revision` (`major`, `minor`) VALUES (3, 0);
or
-UPDATE `SS13_schema_revision` SET major = 3, minor = 1 LIMIT 1;
+INSERT INTO `SS13_schema_revision` (`major`, `minor`) VALUES (3, 0);
----------------------------------------------------
+4 -4
View File
@@ -1817,7 +1817,7 @@
/area/awaymission/centcomAway/courtroom)
"fT" = (
/obj/machinery/door/airlock/centcom{
name = "Centcom Security";
name = "CentCom Security";
opacity = 1;
req_access_txt = "101"
},
@@ -1932,7 +1932,7 @@
/area/awaymission/centcomAway/courtroom)
"gk" = (
/obj/machinery/door/airlock/centcom{
name = "Centcom Security";
name = "CentCom Security";
opacity = 1;
req_access_txt = "101"
},
@@ -3830,7 +3830,7 @@
/area/awaymission/centcomAway/thunderdome)
"lO" = (
/obj/machinery/door/airlock/centcom{
name = "Centcom Security";
name = "CentCom Security";
opacity = 1;
req_access_txt = "101"
},
@@ -4170,7 +4170,7 @@
/area/awaymission/centcomAway/general)
"mP" = (
/obj/machinery/door/airlock/centcom{
name = "Centcom Security";
name = "CentCom Security";
opacity = 1;
req_access_txt = "101"
},
+1 -1
View File
@@ -1,4 +1,4 @@
#include "map_files\generic\Centcomm.dmm"
#include "map_files\generic\CentCom.dmm"
#include "map_files\generic\SpaceStation.dmm"
#include "map_files\generic\Space.dmm"
#include "map_files\generic\SpaceDock.dmm"
@@ -60788,9 +60788,6 @@
/turf/open/floor/plasteel,
/area/science/robotics/lab)
"cHY" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
@@ -68726,12 +68726,12 @@
/obj/item/weapon/folder/blue,
/obj/item/clothing/under/rank/centcom_commander{
desc = "A replica of a jumpsuit worn by the highest ranking commanders under Nanotrasen's central command.";
name = "Replica Centcom officer's jumpsuit"
name = "Replica CentCom officer's jumpsuit"
},
/obj/item/clothing/head/centhat{
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0);
desc = "A replica hat of a Central Commander's attire. It has a small tag on it saying, 'It's good to be emperor.'";
name = "Replica Centcom hat"
name = "Replica CentCom hat"
},
/obj/machinery/computer/security/telescreen/entertainment{
pixel_x = -32
@@ -112682,9 +112682,6 @@
/turf/open/floor/plating,
/area/engine/atmospherics_engine)
"ept" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/obj/effect/turf_decal/stripes/line{
dir = 9
},
+4 -4
View File
@@ -79832,12 +79832,12 @@
"cVT" = (
/obj/structure/closet/wardrobe/mixed,
/obj/item/clothing/under/rank/centcom_officer{
desc = "A badge on the arm indicates that it's meant to be worn by Centcom recovery teams. This one seems dusty and clearly hasn't been cleaned in some time.";
name = "\improper dusty old Centcom jumpsuit"
desc = "A badge on the arm indicates that it's meant to be worn by CentCom recovery teams. This one seems dusty and clearly hasn't been cleaned in some time.";
name = "\improper dusty old CentCom jumpsuit"
},
/obj/item/clothing/under/rank/centcom_commander{
desc = "A badge on the arm indicates that it's meant to be worn by Centcom recovery teams. This one seems dusty and clearly hasn't been cleaned in some time.";
name = "\improper dusty old Centcom jumpsuit"
desc = "A badge on the arm indicates that it's meant to be worn by CentCom recovery teams. This one seems dusty and clearly hasn't been cleaned in some time.";
name = "\improper dusty old CentCom jumpsuit"
},
/obj/effect/decal/cleanable/dirt{
desc = "A thin layer of dust coating the floor.";
@@ -5039,7 +5039,6 @@
name = "Detective Privacy Blast door"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plating,
/area/security/detectives_office)
"aix" = (
@@ -32004,7 +32003,6 @@
"bcM" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel/vault{
dir = 5
},
@@ -49675,7 +49675,7 @@
/turf/open/floor/plating,
/area/maintenance/department/engine)
"cdF" = (
/obj/structure/closet/secure_closet/miner,
/obj/structure/closet/secure_closet/miner/unlocked,
/turf/open/floor/plating,
/area/shuttle/auxillary_base)
"cdG" = (
@@ -2922,7 +2922,7 @@
/area/centcom/prison)
"iG" = (
/turf/closed/indestructible/fakedoor{
name = "Centcom Cell"
name = "CentCom Cell"
},
/area/centcom/prison)
"iH" = (
@@ -2957,7 +2957,7 @@
/area/centcom/supply)
"iL" = (
/turf/closed/indestructible/fakedoor{
name = "Centcom Warehouse"
name = "CentCom Warehouse"
},
/area/centcom/supply)
"iM" = (
@@ -3063,7 +3063,7 @@
"jc" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/centcom{
name = "Centcom";
name = "CentCom";
opacity = 1;
req_access_txt = "0"
},
@@ -3326,7 +3326,7 @@
dwidth = 5;
height = 7;
id = "supply_away";
name = "Centcom";
name = "CentCom";
width = 12
},
/turf/open/space,
@@ -3817,7 +3817,7 @@
/area/centcom/supply)
"kM" = (
/turf/closed/indestructible/fakedoor{
name = "Centcom"
name = "CentCom"
},
/area/centcom/control)
"kN" = (
@@ -3866,7 +3866,7 @@
/area/centcom/control)
"kT" = (
/obj/machinery/door/airlock/centcom{
name = "Centcom Security";
name = "CentCom Security";
opacity = 1;
req_access_txt = "101"
},
@@ -3880,7 +3880,7 @@
base_state = "rightsecure";
dir = 2;
icon_state = "leftsecure";
name = "Centcom Stand";
name = "CentCom Stand";
req_access_txt = "109"
},
/obj/machinery/light{
@@ -3917,7 +3917,7 @@
base_state = "rightsecure";
dir = 2;
icon_state = "leftsecure";
name = "Centcom Stand";
name = "CentCom Stand";
req_access_txt = "109"
},
/turf/open/floor/plasteel/grimy,
@@ -3936,7 +3936,7 @@
base_state = "rightsecure";
dir = 2;
icon_state = "leftsecure";
name = "Centcom Stand";
name = "CentCom Stand";
req_access_txt = "109"
},
/obj/machinery/light{
@@ -3960,7 +3960,7 @@
/area/centcom/supply)
"lc" = (
/obj/machinery/door/airlock/centcom{
name = "Centcom Supply";
name = "CentCom Supply";
req_access_txt = "106"
},
/obj/effect/turf_decal/stripes/line{
@@ -4157,7 +4157,7 @@
/area/centcom/control)
"lB" = (
/obj/machinery/door/airlock/centcom{
name = "Centcom Security";
name = "CentCom Security";
opacity = 1;
req_access_txt = "101"
},
@@ -4752,7 +4752,7 @@
base_state = "rightsecure";
dir = 2;
icon_state = "leftsecure";
name = "Centcom Stand";
name = "CentCom Stand";
req_access_txt = "109"
},
/obj/machinery/firealarm{
@@ -4768,7 +4768,7 @@
base_state = "rightsecure";
dir = 2;
icon_state = "leftsecure";
name = "Centcom Stand";
name = "CentCom Stand";
req_access_txt = "109"
},
/obj/machinery/firealarm{
@@ -5237,7 +5237,7 @@
/obj/structure/table/reinforced,
/obj/machinery/door/firedoor,
/obj/machinery/door/window/brigdoor{
name = "Centcom Customs";
name = "CentCom Customs";
icon_state = "rightsecure";
dir = 4;
req_access_txt = "109";
@@ -5767,7 +5767,7 @@
/area/centcom/ferry)
"pu" = (
/obj/machinery/door/airlock/centcom{
name = "Centcom Security";
name = "CentCom Security";
opacity = 1;
req_access_txt = "101"
},
@@ -5778,7 +5778,7 @@
/area/centcom/supply)
"pv" = (
/obj/machinery/door/airlock/centcom{
name = "Centcom";
name = "CentCom";
opacity = 1;
req_access_txt = "0"
},
@@ -6455,7 +6455,7 @@
/area/centcom/control)
"qQ" = (
/obj/machinery/door/airlock/centcom{
name = "Centcom Security";
name = "CentCom Security";
opacity = 1;
req_access_txt = "101"
},
@@ -6652,7 +6652,7 @@
/area/centcom/ferry)
"rw" = (
/obj/machinery/door/airlock/centcom{
name = "Centcom Supply";
name = "CentCom Supply";
req_access_txt = "106"
},
/obj/effect/turf_decal/stripes/line{
@@ -6906,7 +6906,7 @@
"rW" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/centcom{
name = "Centcom";
name = "CentCom";
opacity = 1;
req_access_txt = "0"
},
@@ -7324,7 +7324,7 @@
base_state = "rightsecure";
dir = 1;
icon_state = "rightsecure";
name = "Centcom Customs";
name = "CentCom Customs";
req_access_txt = "109"
},
/obj/machinery/door/window,
@@ -7352,7 +7352,7 @@
dwidth = 25;
height = 50;
id = "emergency_away";
name = "Centcom Emergency Shuttle Dock";
name = "CentCom Emergency Shuttle Dock";
width = 50
},
/turf/open/space,
@@ -7733,7 +7733,7 @@
"tZ" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/centcom{
name = "Centcom Security";
name = "CentCom Security";
opacity = 1;
req_access_txt = "101"
},
@@ -7787,7 +7787,7 @@
/area/centcom/ferry)
"ug" = (
/obj/machinery/door/airlock/centcom{
name = "Centcom Customs";
name = "CentCom Customs";
opacity = 1;
req_access_txt = "109"
},
@@ -7928,7 +7928,7 @@
dwidth = 2;
height = 13;
id = "ferry_away";
name = "Centcom Ferry Dock";
name = "CentCom Ferry Dock";
width = 5
},
/turf/open/space,
@@ -9168,7 +9168,7 @@
base_state = "rightsecure";
dir = 1;
icon_state = "rightsecure";
name = "Centcom Customs";
name = "CentCom Customs";
req_access_txt = "109"
},
/obj/effect/turf_decal/bot,
@@ -9192,7 +9192,7 @@
base_state = "rightsecure";
dir = 1;
icon_state = "rightsecure";
name = "Centcom Customs";
name = "CentCom Customs";
req_access_txt = "109"
},
/obj/effect/turf_decal/bot,
@@ -9759,7 +9759,7 @@
/obj/item/weapon/folder/red,
/obj/item/weapon/pen/red,
/obj/machinery/door/window/brigdoor{
name = "Centcom Customs";
name = "CentCom Customs";
icon_state = "rightsecure";
dir = 4;
req_access_txt = "109";
@@ -9774,7 +9774,7 @@
/obj/item/weapon/folder/white,
/obj/item/weapon/pen/blue,
/obj/machinery/door/window/brigdoor{
name = "Centcom Customs";
name = "CentCom Customs";
icon_state = "rightsecure";
dir = 8;
req_access_txt = "109";
@@ -10061,7 +10061,7 @@
/area/tdome/tdomeobserve)
"zT" = (
/obj/machinery/door/airlock/centcom{
name = "Centcom Security";
name = "CentCom Security";
opacity = 1;
req_access_txt = "101"
},
@@ -13647,7 +13647,7 @@
/area/centcom/evac)
"Mb" = (
/obj/machinery/door/airlock/centcom{
name = "Centcom Security";
name = "CentCom Security";
opacity = 1;
req_access_txt = "101"
},
@@ -13658,7 +13658,7 @@
/area/centcom/evac)
"Mc" = (
/turf/closed/indestructible/fakedoor{
name = "Centcom"
name = "CentCom"
},
/area/centcom/evac)
"Md" = (
+10 -10
View File
@@ -1,7 +1,7 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"aa" = (
/turf/open/space,
/obj/machinery/porta_turret/centcomm_shuttle{
/obj/machinery/porta_turret/centcom_shuttle{
dir = 9
},
/turf/closed/wall/mineral/plastitanium{
@@ -623,7 +623,7 @@
/obj/docking_port/mobile/emergency{
dwidth = 14;
height = 18;
name = "Centcomm Raven Battlecruiser";
name = "CentCom Raven Battlecruiser";
timid = 1;
width = 32
},
@@ -980,7 +980,7 @@
/area/shuttle/escape)
"cr" = (
/turf/open/space,
/obj/machinery/porta_turret/centcomm_shuttle{
/obj/machinery/porta_turret/centcom_shuttle{
dir = 5
},
/turf/closed/wall/mineral/plastitanium{
@@ -1006,7 +1006,7 @@
/area/shuttle/escape)
"cw" = (
/turf/open/space,
/obj/machinery/porta_turret/centcomm_shuttle{
/obj/machinery/porta_turret/centcom_shuttle{
dir = 5
},
/turf/closed/wall/mineral/plastitanium{
@@ -1108,7 +1108,7 @@
/area/shuttle/escape)
"cR" = (
/turf/open/space,
/obj/machinery/porta_turret/centcomm_shuttle{
/obj/machinery/porta_turret/centcom_shuttle{
dir = 5
},
/turf/closed/wall/mineral/plastitanium{
@@ -1311,7 +1311,7 @@
/area/shuttle/escape)
"dQ" = (
/turf/open/space,
/obj/machinery/porta_turret/centcomm_shuttle{
/obj/machinery/porta_turret/centcom_shuttle{
dir = 5
},
/turf/closed/wall/mineral/plastitanium{
@@ -1333,7 +1333,7 @@
/area/shuttle/escape)
"dV" = (
/turf/open/space,
/obj/machinery/porta_turret/centcomm_shuttle{
/obj/machinery/porta_turret/centcom_shuttle{
dir = 5
},
/turf/closed/wall/mineral/plastitanium{
@@ -1379,7 +1379,7 @@
/area/shuttle/escape)
"ei" = (
/turf/open/space,
/obj/machinery/porta_turret/centcomm_shuttle{
/obj/machinery/porta_turret/centcom_shuttle{
dir = 10
},
/turf/closed/wall/mineral/plastitanium{
@@ -1400,7 +1400,7 @@
/area/shuttle/escape)
"en" = (
/turf/open/space,
/obj/machinery/porta_turret/centcomm_shuttle{
/obj/machinery/porta_turret/centcom_shuttle{
dir = 6
},
/turf/closed/wall/mineral/plastitanium{
@@ -1461,7 +1461,7 @@
/area/shuttle/escape)
"eA" = (
/turf/open/space,
/obj/machinery/porta_turret/centcomm_shuttle{
/obj/machinery/porta_turret/centcom_shuttle{
dir = 5
},
/turf/closed/wall/mineral/plastitanium{
+4 -4
View File
@@ -131,12 +131,12 @@
"aq" = (
/obj/structure/closet/wardrobe/mixed,
/obj/item/clothing/under/rank/centcom_officer{
desc = "A badge on the arm indicates that it's meant to be worn by Centcom recovery teams. This one seems dusty and clearly hasn't been cleaned in some time.";
name = "\improper dusty old Centcom jumpsuit"
desc = "A badge on the arm indicates that it's meant to be worn by CentCom recovery teams. This one seems dusty and clearly hasn't been cleaned in some time.";
name = "\improper dusty old CentCom jumpsuit"
},
/obj/item/clothing/under/rank/centcom_commander{
desc = "A badge on the arm indicates that it's meant to be worn by Centcom recovery teams. This one seems dusty and clearly hasn't been cleaned in some time.";
name = "\improper dusty old Centcom jumpsuit"
desc = "A badge on the arm indicates that it's meant to be worn by CentCom recovery teams. This one seems dusty and clearly hasn't been cleaned in some time.";
name = "\improper dusty old CentCom jumpsuit"
},
/obj/effect/decal/cleanable/dirt{
desc = "A thin layer of dust coating the floor.";
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 627 B

+7 -2
View File
@@ -76,7 +76,7 @@
#define ACCESS_CENT_STORAGE 106//Generic storage areas.
#define ACCESS_CENT_TELEPORTER 107//Teleporter.
#define ACCESS_CENT_CAPTAIN 109//Captain's office/ID comp/AI.
#define ACCESS_CENT_BAR 110 // The non-existent Centcom Bar
#define ACCESS_CENT_BAR 110 // The non-existent CentCom Bar
//The Syndicate
#define ACCESS_SYNDICATE 150//General Syndicate Access
@@ -93,4 +93,9 @@
#define ACCESS_AWAY_GENERIC1 205//Away generic access
#define ACCESS_AWAY_GENERIC2 206
#define ACCESS_AWAY_GENERIC3 207
#define ACCESS_AWAY_GENERIC4 208
#define ACCESS_AWAY_GENERIC4 208
//Special, for anything that's basically internal
#define ACCESS_BLOODCULT 250
#define ACCESS_CLOCKCULT 251
+1 -1
View File
@@ -50,7 +50,7 @@
#define ADMIN_SM(user) "(<a href='?_src_=holder;subtlemessage=\ref[user]'>SM</a>)"
#define ADMIN_TP(user) "(<a href='?_src_=holder;traitor=\ref[user]'>TP</a>)"
#define ADMIN_KICK(user) "(<a href='?_src_=holder;boot2=\ref[user]'>KICK</a>)"
#define ADMIN_CENTCOM_REPLY(user) "(<a href='?_src_=holder;CentcommReply=\ref[user]'>RPLY</a>)"
#define ADMIN_CENTCOM_REPLY(user) "(<a href='?_src_=holder;CentComReply=\ref[user]'>RPLY</a>)"
#define ADMIN_SYNDICATE_REPLY(user) "(<a href='?_src_=holder;SyndicateReply=\ref[user]'>RPLY</a>)"
#define ADMIN_SC(user) "(<a href='?_src_=holder;adminspawncookie=\ref[user]'>SC</a>)"
#define ADMIN_SMITE(user) "(<a href='?_src_=holder;adminsmite=\ref[user]'>SMITE</a>)"
+11 -10
View File
@@ -1,15 +1,16 @@
//Investigate logging defines
#define INVESTIGATE_ATMOS "atmos"
#define INVESTIGATE_BOTANY "botany"
#define INVESTIGATE_CARGO "cargo"
#define INVESTIGATE_EXPERIMENTOR "experimentor"
#define INVESTIGATE_GRAVITY "gravity"
#define INVESTIGATE_RECORDS "records"
#define INVESTIGATE_SINGULO "singulo"
#define INVESTIGATE_SUPERMATTER "supermatter"
#define INVESTIGATE_TELESCI "telesci"
#define INVESTIGATE_WIRES "wires"
#define INVESTIGATE_ATMOS "atmos"
#define INVESTIGATE_BOTANY "botany"
#define INVESTIGATE_CARGO "cargo"
#define INVESTIGATE_EXPERIMENTOR "experimentor"
#define INVESTIGATE_GRAVITY "gravity"
#define INVESTIGATE_RECORDS "records"
#define INVESTIGATE_SINGULO "singulo"
#define INVESTIGATE_SUPERMATTER "supermatter"
#define INVESTIGATE_TELESCI "telesci"
#define INVESTIGATE_WIRES "wires"
#define INVESTIGATE_PORTAL "portals"
#define INVESTIGATE_HALLUCINATIONS "hallucinations"
//Individual logging defines
#define INDIVIDUAL_ATTACK_LOG "Attack log"
+9
View File
@@ -0,0 +1,9 @@
diff a/code/__DEFINES/logging.dm b/code/__DEFINES/logging.dm (rejected hunks)
@@ -9,6 +9,7 @@
#define INVESTIGATE_SUPERMATTER "supermatter"
#define INVESTIGATE_TELESCI "telesci"
#define INVESTIGATE_WIRES "wires"
+#define INVESTIGATE_HALLUCINATIONS "hallucinations"
//Individual logging defines
#define INDIVIDUAL_ATTACK_LOG "Attack log"
+2 -2
View File
@@ -5,7 +5,7 @@ Names of z-level do not matter, but order does greatly, for instances such as ch
current as of 2016/6/2
z1 = station
z2 = centcomm
z2 = centcom
z5 = mining
Everything else = randomized space
Last space-z level = empty
@@ -16,7 +16,7 @@ Last space-z level = empty
#define UNAFFECTED 0
#define MAIN_STATION "Main Station"
#define CENTCOMM "CentComm"
#define CENTCOM "CentCom"
#define EMPTY_AREA_1 "Empty Area 1"
#define EMPTY_AREA_2 "Empty Area 2"
#define MINING "Mining Asteroid"
+2 -2
View File
@@ -46,8 +46,8 @@ Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a s
//Human Overlays Indexes/////////
//citadel code
#define MUTATIONS_LAYER 30 //mutations. Tk headglows, cold resistance glow, etc
#define BODY_BEHIND_LAYER 29 //certain mutantrace features (tail when looking south) that must appear behind the body parts
#define GENITALS_BEHIND_LAYER 28
#define GENITALS_BEHIND_LAYER 29 //Some genitalia needs to be behind everything, such as with taurs (Taurs use body_behind_layer
#define BODY_BEHIND_LAYER 28 //certain mutantrace features (tail when looking south) that must appear behind the body parts
#define BODYPARTS_LAYER 27 //Initially "AUGMENTS", this was repurposed to be a catch-all bodyparts flag
#define BODY_ADJ_LAYER 26 //certain mutantrace features (snout, body markings) that must appear above the body parts
#define GENITALS_ADJ_LAYER 25
+1 -1
View File
@@ -22,7 +22,7 @@
#define SHUTTLE_ALREADY_DOCKED "we_are_already_docked"
#define SHUTTLE_SOMEONE_ELSE_DOCKED "someone_else_docked"
//Launching Shuttles to Centcomm
//Launching Shuttles to CentCom
#define NOLAUNCH -1
#define UNLAUNCHED 0
#define ENDGAME_LAUNCHED 1
+2 -2
View File
@@ -320,7 +320,7 @@
return r
// Returns the key based on the index
#define KEYBYINDEX(L, index) (((index <= L:len) && (index > 0)) ? L[index] : null)
#define KEYBYINDEX(L, index) (((index <= length(L)) && (index > 0)) ? L[index] : null)
/proc/count_by_type(list/L, type)
var/i = 0
@@ -468,7 +468,7 @@
. |= key_list[key]
//Picks from the list, with some safeties, and returns the "default" arg if it fails
#define DEFAULTPICK(L, default) ((islist(L) && L:len) ? pick(L) : default)
#define DEFAULTPICK(L, default) ((islist(L) && length(L)) ? pick(L) : default)
#define LAZYINITLIST(L) if (!L) L = list()
#define UNSETEMPTY(L) if (L && !L.len) L = null
#define LAZYREMOVE(L, I) if(L) { L -= I; if(!L.len) { L = null; } }
+5
View File
@@ -48,6 +48,11 @@
init_sprite_accessory_subtypes(/datum/sprite_accessory/xeno_dorsal, GLOB.xeno_dorsal_list)
//genitals
init_sprite_accessory_subtypes(/datum/sprite_accessory/penis, GLOB.cock_shapes_list)
for(var/K in GLOB.cock_shapes_list)
var/datum/sprite_accessory/penis/value = GLOB.cock_shapes_list[K]
GLOB.cock_shapes_icons[K] = value.icon_state
init_sprite_accessory_subtypes(/datum/sprite_accessory/vagina, GLOB.vagina_shapes_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/breasts, GLOB.breasts_shapes_list)
GLOB.breasts_size_list = list("a","b","c","d","e") //We need the list to choose from initialized, but it's no longer a sprite_accessory thing.
+15 -13
View File
@@ -712,7 +712,8 @@ The _flatIcons list is a cache for generated icon files.
if(!current)
curIndex++ //Try the next layer
continue
currentLayer = current:layer
var/image/I = current
currentLayer = I.layer
if(currentLayer<0) // Special case for FLY_LAYER
if(currentLayer <= -1000) return flat
if(pSet == 0) // Underlay
@@ -747,22 +748,22 @@ The _flatIcons list is a cache for generated icon files.
// Dimensions of overlay being added
var/{addX1;addX2;addY1;addY2}
for(var/I in layers)
if(I:alpha == 0)
for(var/V in layers)
var/image/I = V
if(I.alpha == 0)
continue
if(I == copy) // 'I' is an /image based on the object being flattened.
curblend = BLEND_OVERLAY
add = icon(I:icon, I:icon_state, I:dir)
add = icon(I.icon, I.icon_state, I.dir)
else // 'I' is an appearance object.
add = getFlatIcon(new/image(I), curdir, curicon, curstate, curblend)
// Find the new dimensions of the flat icon to fit the added overlay
addX1 = min(flatX1, I:pixel_x+1)
addX2 = max(flatX2, I:pixel_x+add.Width())
addY1 = min(flatY1, I:pixel_y+1)
addY2 = max(flatY2, I:pixel_y+add.Height())
addX1 = min(flatX1, I.pixel_x+1)
addX2 = max(flatX2, I.pixel_x+add.Width())
addY1 = min(flatY1, I.pixel_y+1)
addY2 = max(flatY2, I.pixel_y+add.Height())
if(addX1!=flatX1 || addX2!=flatX2 || addY1!=flatY1 || addY2!=flatY2)
// Resize the flattened icon so the new icon fits
@@ -771,7 +772,7 @@ The _flatIcons list is a cache for generated icon files.
flatY1=addY1;flatY2=addY2
// Blend the overlay into the flattened icon
flat.Blend(add, blendMode2iconMode(curblend), I:pixel_x + 2 - flatX1, I:pixel_y + 2 - flatY1)
flat.Blend(add, blendMode2iconMode(curblend), I.pixel_x + 2 - flatX1, I.pixel_y + 2 - flatY1)
if(A.color)
flat.Blend(A.color, ICON_MULTIPLY)
@@ -782,10 +783,11 @@ The _flatIcons list is a cache for generated icon files.
/proc/getIconMask(atom/A)//By yours truly. Creates a dynamic mask for a mob/whatever. /N
var/icon/alpha_mask = new(A.icon,A.icon_state)//So we want the default icon and icon state of A.
for(var/I in A.overlays)//For every image in overlays. var/image/I will not work, don't try it.
if(I:layer>A.layer)
for(var/V in A.overlays)//For every image in overlays. var/image/I will not work, don't try it.
var/image/I = V
if(I.layer>A.layer)
continue//If layer is greater than what we need, skip it.
var/icon/image_overlay = new(I:icon,I:icon_state)//Blend only works with icon objects.
var/icon/image_overlay = new(I.icon,I.icon_state)//Blend only works with icon objects.
//Also, icons cannot directly set icon_state. Slower than changing variables but whatever.
alpha_mask.Blend(image_overlay,ICON_OR)//OR so they are lumped together in a nice overlay.
return alpha_mask//And now return the mask.
+4 -2
View File
@@ -113,6 +113,7 @@
"xenohead" = "None",
"xenotail" = "None",
"exhibitionist" = FALSE,
"genitals_use_skintone" = FALSE,
"has_cock" = FALSE,
"cock_shape" = pick(GLOB.cock_shapes_list),
"cock_length" = 6,
@@ -155,8 +156,9 @@
"womb_cum_rate" = CUM_RATE,
"womb_cum_mult" = CUM_RATE_MULT,
"womb_efficiency" = CUM_EFFICIENCY,
"womb_fluid" = "femcum"))
"womb_fluid" = "femcum",
"flavor_text" = ""))
/proc/random_hair_style(gender)
switch(gender)
if(MALE)
+1 -1
View File
@@ -205,7 +205,7 @@ or something covering your eyes."
/obj/screen/alert/embeddedobject
name = "Embedded Object"
desc = "Something got lodged into your flesh and is causing major bleeding. It might fall out with time, but surgery is the safest way. \
If you're feeling frisky, click yourself in help intent to pull the object out."
If you're feeling frisky, examine yourself and click the underlined item to pull the object out."
icon_state = "embeddedobject"
/obj/screen/alert/embeddedobject/Click()
+1
View File
@@ -53,6 +53,7 @@ GLOBAL_LIST_EMPTY(xeno_dorsal_list)
//Genitals and Arousal Lists
GLOBAL_LIST_EMPTY(cock_shapes_list)//global_lists.dm for the list initializations //Now also _DATASTRUCTURES globals.dm
GLOBAL_LIST_EMPTY(cock_shapes_icons) //Associated list for names->icon_states for cockshapes.
GLOBAL_LIST_EMPTY(breasts_size_list)
GLOBAL_LIST_EMPTY(breasts_shapes_list)
GLOBAL_LIST_EMPTY(vagina_shapes_list)
+129 -31
View File
@@ -6,7 +6,7 @@
var/arousal_rate = 1 //The base rate that arousal will increase in this mob.
var/arousal_loss_rate = 1 //How easily arousal can be relieved for this mob.
var/canbearoused = FALSE //Mob-level disabler for arousal. Starts off and can be enabled as features are added for different mob types.
var/mb_cd_length = 50 //5 second cooldown for masturbating because fuck spam
var/mb_cd_length = 100 //5 second cooldown for masturbating because fuck spam.
var/mb_cd_timer = 0 //The timer itself
/mob/living/carbon/human
@@ -150,14 +150,14 @@
return 0
var/mob/living/M = usr
if(M.canbearoused)
M.mob_masturbate()
M.mob_climax()
return 1
else
M << "<span class='warning'>Arousal is disabled. Feature is unavailable.</span>"
to_chat(M, "<span class='warning'>Arousal is disabled. Feature is unavailable.</span>")
/mob/living/proc/mob_masturbate()//This is just so I can test this shit without being forced to add actual content to get rid of arousal. Will be a very basic proc for a while.
/mob/living/proc/mob_climax()//This is just so I can test this shit without being forced to add actual content to get rid of arousal. Will be a very basic proc for a while.
set name = "Masturbate"
set category = "IC"
if(canbearoused && !restrained() && !stat)
@@ -179,45 +179,93 @@
PoolOrNew(/obj/effect/decal/cleanable/femcum, loc)
*/
else
src << "<span class='notice'>You aren't aroused enough for that.</span>"
to_chat(src, "<span class='notice'>You aren't aroused enough for that.</span>")
/mob/living/carbon/human/mob_masturbate()
/mob/living/carbon/human/mob_climax(forced_climax=FALSE) //Forced is instead of the other proc, makes you cum if you have the tools for it, ignoring restraints
if(mb_cd_timer > world.time)
src << "<span class='warning'>You need to wait [round((mb_cd_timer - world.time)/(20))] seconds before you can do that again!</span>"
if(!forced_climax) //Don't spam the message to the victim if forced to come too fast
to_chat(src, "<span class='warning'>You need to wait [round((mb_cd_timer - world.time)/(20))] seconds before you can do that again!</span>")
return
mb_cd_timer = (world.time + mb_cd_length)
var/list/genitals_list = list()
var/obj/item/organ/genital/SG = null//originally selected_genital
var/list/containers_list = list()
var/obj/item/weapon/reagent_containers/SC = null
var/datum/reagents/fluid_source = null
var/into_container = 0
var/arms = get_num_arms()
var/free_hands = arms
var/free_hands = get_num_arms() //arms was only used to know if we had ANY at all
var/total_cum = 0
var/finished = 0
var/mb_time = 30
mb_cd_timer = (world.time + mb_cd_length)
if(canbearoused && has_dna())
if(restrained())
src << "<span class='warning'>You can't do that while restrained!</span>"
if(stat==2)
to_chat(src, "<span class='warning'>You can't do that while dead!</span>")
return
if(stat)
src << "<span class='warning'>You must be conscious to do that!</span>"
if(forced_climax) //Something forced us to cum, this is not a masturbation thing and does not progress to the other checks
for(var/obj/item/organ/genital/G in internal_organs)
if(G.can_masturbate_with) //All capable genitals will orgasm with this
var/unable_to_come = FALSE
switch(G.type)
if(/obj/item/organ/genital/penis)
var/obj/item/organ/genital/penis/P = G
if(!P.linked_balls)
unable_to_come = TRUE
else
fluid_source = P.linked_balls.reagents
if(/obj/item/organ/genital/vagina)
var/obj/item/organ/genital/vagina/V = G
if(!V.linked_womb)
unable_to_come = TRUE
else
fluid_source = V.linked_womb.reagents
else //Weird, undefined genitalia behaviour
unable_to_come = TRUE
if(unable_to_come)
src.visible_message("<span class='danger'>[src] shudders, their [G.name] unable to cum.</span>", \
"<span class='userdanger'>Your [G.name] cannot cum, giving no relief.</span>", \
"<span class='userdanger'>Your [G.name] cannot cum, giving no relief.</span>")
else
if(fluid_source)
total_cum = fluid_source.total_volume
src.visible_message("<span class='danger'>[src] looks like they're about to cum.</span>", \
"<span class='green'>You feel yourself about to orgasm.</span>", \
"<span class='green'>You feel yourself about to orgasm.</span>")
if(do_after(src, mb_time, target = src))
if(total_cum > 5)
fluid_source.reaction(src.loc, TOUCH, 1, 0)
fluid_source.clear_reagents()
fluid_source = null //cleanup so this can be used for the next genitalia
src.visible_message("<span class='danger'>[src] orgasms, cumming[istype(src.loc, /turf/open/floor) ? " onto [src.loc]" : ""]!</span>", \
"<span class='green'>You're forced to cum[istype(src.loc, /turf/open/floor) ? " onto [src.loc]" : ""] with your [G].</span>", \
"<span class='green'>Your [G] have been forced to climax.</span>")
finished = 1
if(finished)
setArousalLoss(min_arousal)
return //Do not proceed to masturbating if all genitals have been forced to orgasm.
if(stat==1) //Sleeping people can be forced chemically or with electrical stimulants, for example.
to_chat(src, "<span class='warning'>You must be conscious to do that!</span>")
return
if(restrained())
to_chat(src, "<span class='warning'>You can't do that while restrained!</span>")
return
if(getArousalLoss() < 33)//flat number instead of percentage
src << "<span class='warning'>You aren't aroused enough for that!</span>"
to_chat(src, "<span class='warning'>You aren't aroused enough for that!</span>")
return
if(!is_groin_exposed())
src << "<span class='warning'>You need to undress, first!</span>"
to_chat(src, "<span class='warning'>You need to undress, first!</span>")
return
if(!arms)
src << "<span class='warning'>You need at least one arm.</span>"
if(!free_hands)
to_chat(src, "<span class='warning'>You need at least one free arm.</span>")
return
for(var/helditem in held_items)//how many hands are free
if(isobj(helditem))
free_hands--
if(free_hands <= 0)
src << "<span class='warning'>You need at least one free hand.</span>"
to_chat(src, "<span class='warning'>You need at least one free hand.</span>")
return
for(var/obj/item/organ/genital/G in internal_organs)
if(G.can_masturbate_with)//filter out what you can't masturbate with
@@ -240,12 +288,12 @@
if(/obj/item/organ/genital/penis)
var/obj/item/organ/genital/penis/P = SG
if(!P.linked_balls)
src << "<span class='warning'>Grow a pair!</span>"
to_chat(src, "<span class='warning'>You need a pair of testicles to do this.</span>")
return
fluid_source = P.linked_balls.reagents
total_cum = fluid_source.total_volume
if(into_container)//into a glass or beaker or whatever
src.visible_message("<span class='danger'>[src] starts [pick("jerking off","stroking")] their [SG] over [SC].</span>", \
src.visible_message("<span class='danger'>[src] starts [pick("jerking off","stroking")] their [SG.name] over [SC].</span>", \
"<span class='userdanger'>You start jerking off over [SC.name].</span>", \
"<span class='userdanger'>You start masturbating.</span>")
if(do_after(src, mb_time, target = src) && in_range(src, SC))
@@ -254,16 +302,71 @@
"<span class='green'>You cum into [SC].</span>", \
"<span class='green'>You have relieved yourself.</span>")
finished = 1
else //Not in a container
if(src.pulling)
if(iscarbon(src.pulling))
var/mob/living/carbon/C = src.pulling
if(!C.is_groin_exposed())
to_chat(src, "<span class='warning'>You must undress someone to climax inside them.</span>")
return
if(isliving(src.pulling)) //Gotta be alive to fuck it, don't wanna have to code fucking objects that ain't containers...
var/mob/living/partner = src.pulling
src.visible_message("[src] is about to climax inside [partner]!", \
"You're about to climax inside [partner]!", \
"<span class='danger'>You're preparing to climax inside someone!</span>")
switch(grab_state)
if(GRAB_PASSIVE)
if(do_after(src, mb_time, target = src) && in_range(src, partner))
var/spillage = 0.5 //Leaks a bit on passive grab
var/did_spill = FALSE
fluid_source.trans_to(partner, total_cum*(1-spillage))
total_cum = total_cum*spillage
if(total_cum > 5)
fluid_source.reaction(partner.loc, TOUCH, 1, 0)
did_spill = TRUE
fluid_source.clear_reagents()
src.visible_message("<span class='danger'>[src] ejaculates inside [partner][did_spill ? ", overflowing and spilling":""]!</span>", \
"<span class='green'>You ejaculate inside [partner][did_spill ? ", spilling out of them":""].</span>", \
"<span class='green'>You have climaxed inside someone[did_spill ? ", spilling out of them":""].</span>")
finished = 1
else //Aggressive or higher
if(do_after(src, mb_time, target = src) && in_range(src, partner))
var/spillage = 0.0 //Leakproofing seals
fluid_source.trans_to(partner, total_cum*(1-spillage))
total_cum = total_cum*spillage
if(total_cum > 5)
fluid_source.reaction(partner.loc, TOUCH, 1, 0)
fluid_source.clear_reagents()
src.visible_message("<span class='danger'>[src] ejaculates inside [partner], spilling nothing!</span>", \
"<span class='green'>You ejaculate inside [partner], spilling nothing.</span>", \
"<span class='green'>You have climaxed inside someone, spilling nothing.</span>")
finished = 1
//Don't care, not coding you fucking a unanchored girder
else //No pulling, or pulling non-living things
src.visible_message("<span class='danger'>[src] starts [pick("jerking off","stroking")] their [SG].</span>", \
"<span class='green'>You start masturbating.</span>", \
"<span class='green'>You start masturbating.</span>")
if(do_after(src, mb_time, target = src))
if(total_cum > 5)
fluid_source.reaction(src.loc, TOUCH, 1, 0)
fluid_source.clear_reagents()
src.visible_message("<span class='danger'>[src] orgasms, cumming[istype(src.loc, /turf/open/floor) ? " onto [src.loc]" : ""]!</span>", \
"<span class='green'>You cum[istype(src.loc, /turf/open/floor) ? " onto [src.loc]" : ""].</span>", \
"<span class='green'>You have relieved yourself.</span>")
finished = 1
if(/obj/item/organ/genital/vagina)
var/obj/item/organ/genital/vagina/V = SG
if(!V.linked_womb)
src << "<span class='warning'>No womb!</span>"
to_chat(src, "<span class='warning'>You need a womb to do this.</span>")
return
fluid_source = V.linked_womb.reagents
total_cum = fluid_source.total_volume
if(into_container)//into a glass or beaker or whatever
src.visible_message("<span class='danger'>[src] starts fingering their vagina over [SC].</span>", \
src.visible_message("<span class='danger'>[src] starts fingering their [SG.name] over [SC].</span>", \
"<span class='userdanger'>You start fingering over [SC.name].</span>", \
"<span class='userdanger'>You start masturbating.</span>")
if(do_after(src, mb_time, target = src) && in_range(src, SC))
@@ -272,7 +375,7 @@
"<span class='green'>You cum into [SC].</span>", \
"<span class='green'>You have relieved yourself.</span>")
finished = 1
else//not into a container
src.visible_message("<span class='danger'>[src] starts fingering their vagina.</span>", \
"<span class='userdanger'>You start fingering your vagina.</span>", \
@@ -297,10 +400,5 @@
setArousalLoss(min_arousal)
else
src << "<span class='warning'>You have no genitals!</span>"
to_chat(src, "<span class='warning'>You have no genitals!</span>")
return
/mob/living/carbon/proc/force_orgasm(intensity)
if(canbearoused && has_dna() && (has_penis() || has_vagina()))
return 1
return 0
+18 -12
View File
@@ -105,7 +105,7 @@
M.emote(pick("moan","blush"))
if(prob(5))
var/aroused_message = pick("You feel frisky.", "You're having trouble suppressing your urges.", "You feel in the mood.")
M << "<span class='love'>[aroused_message]</span>"
to_chat(M, "<span class='love'>[aroused_message]</span>")
..()
/datum/reagent/aphrodisiacplus
@@ -128,15 +128,13 @@
else
M.emote(pick("moan","blush"))
if(prob(5))
var/aroused_message
if(M.getArousalLoss() > 90)
var/aroused_message = pick("You need to fuck someone!", "You're bursting with sexual tension!", "You can't get sex off your mind!")
M << "<span class='love'>[aroused_message]</span>"
aroused_message = pick("You need to fuck someone!", "You're bursting with sexual tension!", "You can't get sex off your mind!")
else
var/aroused_message = pick("You feel a bit hot.", "You feel strong sexual urges.", "You feel in the mood.", "You're ready to go down on someone.")
M << "<span class='love'>[aroused_message]</span>"
// if(iscarbon(M) && has_dna(M))
// M.force_ejaculation()
..()
aroused_message = pick("You feel a bit hot.", "You feel strong sexual urges.", "You feel in the mood.", "You're ready to go down on someone.")
to_chat(M, "<span class='love'>[aroused_message]</span>")
/datum/reagent/aphrodisiacplus/addiction_act_stage2(mob/living/M)
if(prob(30))
M.adjustBrainLoss(2)
@@ -152,11 +150,17 @@
..()
/datum/reagent/aphrodisiacplus/overdose_process(mob/living/M)
if(prob(66))
if(prob(33))
if(M.getArousalLoss() >= 100 && ishuman(M) && M.has_dna())
var/mob/living/carbon/human/H = M
to_chat(H, "<span class='love'>Your libido is going haywire!</span>")
H.mob_climax(forced_climax=TRUE)
if(M.min_arousal < 50)
M.min_arousal += 1
if(M.max_arousal < 200)
M.max_arousal += 1
to_chat(M, "<span class='love'>You're having a hard time thinkin about things other than sex!</span>")
if(M.min_arousal < M.max_arousal)
M.min_arousal += 1
to_chat(M, "<span class='love'>You feel your libido permanently increasing.</span>")
M.adjustArousalLoss(2)
..()
@@ -193,8 +197,10 @@
if(prob(33))
if(M.min_arousal > 0)
M.min_arousal -= 1
if(M.max_arousal > 75)
to_chat(M, "<span class='notice'>You feel your libido returning to more normal levels.</span>")
if(M.min_arousal > 50)
M.min_arousal -= 1
to_chat(M, "<span class='notice'>You feel like your overactive libido is calming down.</span>")
M.adjustArousalLoss(-2)
..()
Binary file not shown.

After

Width:  |  Height:  |  Size: 704 B

+1 -1
View File
@@ -1,5 +1,5 @@
/obj/item/organ/genital/breasts
name = "breasts"
name = "Breasts"
desc = "Female milk producing organs."
icon_state = "breasts"
icon = 'code/citadel/icons/breasts.dmi'
+1 -1
View File
@@ -1,5 +1,5 @@
/obj/item/organ/genital/eggsack
name = "egg sack"
name = "Egg sack"
desc = "An egg producing reproductive organ."
icon_state = "egg_sack"
icon = 'code/citadel/icons/ovipositor.dmi'
+2
View File
@@ -243,8 +243,10 @@
G.aroused_state = FALSE
icon_string = "[G.slot]_[S.icon_state]_[size]_[G.aroused_state]_[layertext]"
I = image("icon" = S.icon, "icon_state" = icon_string, "layer" =- layer)
if(S.center)
I = center_image(I,S.dimension_x,S.dimension_y)
if(use_skintones && H.dna.features["genitals_use_skintone"])
I.color = "#[skintone2hex(H.skin_tone)]"
else
@@ -31,6 +31,33 @@
icon_state = "tapered"
name = "Tapered"
////////////////////////
// Taur cocks go here //
////////////////////////
/datum/sprite_accessory/penis/taur_flared
icon = 'code/citadel/icons/taur_penis_onmob.dmi' //Needed larger width
icon_state = "flared"
name = "Taur, Flared"
center = TRUE //Center the image 'cause 2-tile wide.
dimension_x = 64
/datum/sprite_accessory/penis/taur_knotted
icon = 'code/citadel/icons/taur_penis_onmob.dmi' //Needed larger width
icon_state = "knotted"
name = "Taur, Knotted"
center = TRUE //Center the image 'cause 2-tile wide.
dimension_x = 64
/datum/sprite_accessory/penis/taur_tapered
icon = 'code/citadel/icons/taur_penis_onmob.dmi' //Needed larger width
icon_state = "tapered"
name = "Taur, Tapered"
center = TRUE //Center the image 'cause 2-tile wide.
dimension_x = 64
//Vaginas
/datum/sprite_accessory/vagina
icon = 'code/citadel/icons/vagina_onmob.dmi'
+1 -1
View File
@@ -1,5 +1,5 @@
/obj/item/organ/genital/ovipositor
name = "ovipositor"
name = "Ovipositor"
desc = "An egg laying reproductive organ."
icon_state = "ovi_knotted_2"
icon = 'code/citadel/icons/ovipositor.dmi'
+2 -2
View File
@@ -1,5 +1,5 @@
/obj/item/organ/genital/penis
name = "penis"
name = "Penis"
desc = "A male reproductive organ."
icon_state = "penis"
icon = 'code/citadel/icons/penis.dmi'
@@ -35,7 +35,7 @@
cached_length = length
/obj/item/organ/genital/penis/update_appearance()
var/string = "penis_[lowertext(shape)]_[size]"
var/string = "penis_[GLOB.cock_shapes_icons[shape]]_[size]"
icon_state = sanitize_text(string)
var/lowershape = lowertext(shape)
if(lowershape in knotted_types)
+1 -1
View File
@@ -1,5 +1,5 @@
/obj/item/organ/genital/testicles
name = "testicles"
name = "Testicles"
desc = "A male reproductive organ."
icon_state = "testicles"
icon = 'code/citadel/icons/penis.dmi'
+1 -1
View File
@@ -1,5 +1,5 @@
/obj/item/organ/genital/vagina
name = "vagina"
name = "Vagina"
desc = "A female reproductive organ."
icon = 'code/citadel/icons/vagina.dmi'
icon_state = "vagina"
+2 -2
View File
@@ -1,5 +1,5 @@
/obj/item/organ/genital/womb
name = "womb"
name = "Womb"
desc = "A female reproductive organ."
icon = 'code/citadel/icons/vagina.dmi'
icon_state = "womb"
@@ -10,7 +10,7 @@
fluid_id = "femcum"
producing = TRUE
var/obj/item/organ/genital/vagina/linked_vag
/obj/item/organ/genital/womb/Initialize()
. = ..()
reagents.add_reagent(fluid_id, fluid_max_volume)
+5 -5
View File
@@ -250,7 +250,7 @@ SUBSYSTEM_DEF(blackbox)
return 0
return value
/datum/feedback_variable/proc/get_variable()
/datum/feedback_variable/proc/get_variable()
return variable
/datum/feedback_variable/proc/set_details(text)
@@ -260,12 +260,12 @@ SUBSYSTEM_DEF(blackbox)
/datum/feedback_variable/proc/add_details(text)
if (istext(text))
if (!details)
details = text
details = "\"[text]\""
else
details += " [text]"
details += " | \"[text]\""
/datum/feedback_variable/proc/get_details()
/datum/feedback_variable/proc/get_details()
return details
/datum/feedback_variable/proc/get_parsed()
return list(variable,value,details)
return list(variable,value,details)
+4 -4
View File
@@ -34,8 +34,8 @@ SUBSYSTEM_DEF(shuttle)
var/obj/docking_port/mobile/supply/supply
var/ordernum = 1 //order number given to next order
var/points = 5000 //number of trade-points we have
var/centcom_message = "" //Remarks from Centcom on how well you checked the last order.
var/list/discoveredPlants = list() //Typepaths for unusual plants we've already sent CentComm, associated with their potencies
var/centcom_message = "" //Remarks from CentCom on how well you checked the last order.
var/list/discoveredPlants = list() //Typepaths for unusual plants we've already sent CentCom, associated with their potencies
var/list/supply_packs = list()
var/list/shoppinglist = list()
@@ -183,7 +183,7 @@ SUBSYSTEM_DEF(shuttle)
switch(emergency.mode)
if(SHUTTLE_RECALL)
to_chat(user, "The emergency shuttle may not be called while returning to Centcom.")
to_chat(user, "The emergency shuttle may not be called while returning to CentCom.")
return
if(SHUTTLE_CALL)
to_chat(user, "The emergency shuttle is already on its way.")
@@ -198,7 +198,7 @@ SUBSYSTEM_DEF(shuttle)
to_chat(user, "The emergency shuttle is moving away to a safe distance.")
return
if(SHUTTLE_STRANDED)
to_chat(user, "The emergency shuttle has been disabled by Centcom.")
to_chat(user, "The emergency shuttle has been disabled by CentCom.")
return
call_reason = trim(html_encode(call_reason))
+1 -1
View File
@@ -479,7 +479,7 @@ SUBSYSTEM_DEF(ticker)
var/list/area/shuttle_areas
if(SSshuttle && SSshuttle.emergency)
shuttle_areas = SSshuttle.emergency.shuttle_areas
if(!Player.onCentcom() && !Player.onSyndieBase())
if(!Player.onCentCom() && !Player.onSyndieBase())
to_chat(Player, "<font color='blue'><b>You managed to survive, but were marooned on [station_name()]...</b></FONT>")
else
num_escapees++
+3 -2
View File
@@ -169,7 +169,7 @@
/datum/action/item_action/toggle_firemode
name = "Toggle Firemode"
/datum/action/item_action/rcl
name = "Change Cable Color"
button_icon_state = "rcl_rainbow"
@@ -490,7 +490,8 @@
var/obj/effect/proc_holder/spell/S = target
S.action = src
name = S.name
icon_icon = S.action_icon
desc = S.desc
button_icon = S.action_icon
button_icon_state = S.action_icon_state
background_icon_state = S.action_background_icon_state
button.name = name
+54
View File
@@ -100,3 +100,57 @@
if (object == GLOBAL_PROC)
return call(delegate)(arglist(calling_arguments))
return call(object, delegate)(arglist(calling_arguments))
/datum/callback_select
var/list/finished
var/pendingcount
var/total
/datum/callback_select/New(count, savereturns)
total = count
if (savereturns)
finished = new(count)
/datum/callback_select/proc/invoke_callback(index, datum/callback/callback, list/callback_args, savereturn = TRUE)
set waitfor = FALSE
if (!callback || !istype(callback))
//This check only exists because the alternative is callback_select would block forever if given invalid data
CRASH("invalid callback passed to invoke_callback")
if (!length(callback_args))
callback_args = list()
pendingcount++
var/rtn = callback.Invoke(arglist(callback_args))
pendingcount--
if (savereturn)
finished[index] = rtn
//runs a list of callbacks asynchronously, returning once all of them return.
//callbacks can be repeated.
//callbacks-args is a optional list of argument lists, in the same order as the callbacks,
// the inner lists will be sent to the callbacks when invoked() as additional args.
//can optionly save and return a list of return values, in the same order as the original list of callbacks
//resolution is the number of byond ticks between checks.
/proc/callback_select(list/callbacks, list/callback_args, savereturns = TRUE, resolution = 1)
if (!callbacks)
return
var/count = length(callbacks)
if (!count)
return
if (!callback_args)
callback_args = list()
callback_args.len = count
var/datum/callback_select/CS = new(count, savereturns)
for (var/i in 1 to count)
CS.invoke_callback(i, callbacks[i], callback_args[i], savereturns)
while(CS.pendingcount)
sleep(resolution*world.tick_lag)
return CS.finished
+20
View File
@@ -929,6 +929,26 @@
manipulate_organs(C)
href_list["datumrefresh"] = href_list["editorgans"]
else if(href_list["hallucinate"])
if(!check_rights(0))
return
var/mob/living/carbon/C = locate(href_list["hallucinate"]) in GLOB.mob_list
if(!istype(C))
to_chat(usr, "This can only be done to instances of type /mob/living/carbon")
return
var/list/hallucinations = subtypesof(/datum/hallucination)
var/result = input(usr, "Choose the hallucination to apply","Send Hallucination") as null|anything in hallucinations
if(!usr)
return
if(QDELETED(C))
to_chat(usr, "Mob doesn't exist anymore")
return
if(result)
new result(C, TRUE)
else if(href_list["makehuman"])
if(!check_rights(R_SPAWN))
return
@@ -59,4 +59,4 @@ Bonus
else
if(prob(base_message_chance))
to_chat(M, "<span class='userdanger'>[pick("Oh, your head...", "Your head pounds.", "They're everywhere! Run!", "Something in the shadows...")]</span>")
M.hallucination += (15 * power)
M.hallucination += (45 * power)
+2
View File
@@ -32,6 +32,7 @@
if(ishuman(destination))
var/mob/living/carbon/human/H = destination
H.give_genitals(TRUE)//This gives the body the genitals of this DNA. Used for any transformations based on DNA
destination.flavor_text = destination.dna.features["flavor_text"] //Update the flavor_text to use new dna text
/datum/dna/proc/copy_dna(datum/dna/new_dna)
new_dna.unique_enzymes = unique_enzymes
@@ -231,6 +232,7 @@
if(newfeatures)
dna.features = newfeatures
flavor_text = dna.features["flavor_text"] //Update the flavor_text to use new dna text
if(mrace)
set_species(mrace, icon_update=0)
+3 -3
View File
@@ -11,7 +11,7 @@
var/minetype = "lavaland"
var/list/transition_config = list(CENTCOMM = SELFLOOPING,
var/list/transition_config = list(CENTCOM = SELFLOOPING,
MAIN_STATION = CROSSLINKED,
EMPTY_AREA_1 = CROSSLINKED,
EMPTY_AREA_2 = CROSSLINKED,
@@ -115,8 +115,8 @@
return UNAFFECTED
if("MAIN_STATION")
return MAIN_STATION
if("CENTCOMM")
return CENTCOMM
if("CENTCOM")
return CENTCOM
if("MINING")
return MINING
if("EMPTY_AREA_1")
+10 -6
View File
@@ -120,6 +120,10 @@
transfer_martial_arts(new_character)
if(active || force_key_move)
new_character.key = key //now transfer the key to link the client to our new body
if(isliving(new_character)) //New humans and such are by default enabled arousal. Let's always use the new mind's prefs.
var/mob/living/L = new_character
L.canbearoused = L.client.prefs.arousable //Technically this should make taking over a character mean the body gain the new minds setting...
L.update_arousal_hud() //Removes the old icon
/datum/mind/proc/store_memory(new_text)
memory += "[new_text]<BR>"
@@ -801,11 +805,11 @@
possible_targets += possible_target.current
var/mob/def_target = null
var/objective_list[] = list(/datum/objective/assassinate, /datum/objective/protect, /datum/objective/debrain, /datum/objective/maroon)
if (objective&&(objective.type in objective_list) && objective:target)
def_target = objective:target.current
var/list/objective_list = typecacheof(list(/datum/objective/assassinate, /datum/objective/protect, /datum/objective/debrain, /datum/objective/maroon))
if (is_type_in_typecache(objective, objective_list) && objective.target)
def_target = objective.target.current
var/new_target = input("Select target:", "Objective target", def_target) as null|anything in possible_targets
var/mob/new_target = input("Select target:", "Objective target", def_target) as null|anything in possible_targets
if (!new_target)
return
@@ -813,12 +817,12 @@
if (new_target == "Free objective")
new_objective = new objective_path
new_objective.owner = src
new_objective:target = null
new_objective.target = null
new_objective.explanation_text = "Free objective"
else
new_objective = new objective_path
new_objective.owner = src
new_objective:target = new_target:mind
new_objective.target = new_target.mind
//Will display as special role if the target is set as MODE. Ninjas/commandos/nuke ops.
new_objective.update_explanation_text()
+1 -1
View File
@@ -82,7 +82,7 @@
id = "derelict4"
suffix = "derelict4.dmm"
name = "Derelict 4"
description = "Centcom ferries have never crashed, will never crash, there is no current investigation into a crashed ferry, and we will not let Internal Affairs trample over high security \
description = "CentCom ferries have never crashed, will never crash, there is no current investigation into a crashed ferry, and we will not let Internal Affairs trample over high security \
information in the name of this baseless witchhunt."
/datum/map_template/ruin/space/derelict5
+5 -5
View File
@@ -133,7 +133,7 @@
/datum/map_template/shuttle/emergency/cramped
suffix = "cramped"
name = "Secure Transport Vessel 5 (STV5)"
description = "Well, looks like Centcomm only had this ship in the area, they probably weren't expecting you to need evac for a while. \
description = "Well, looks like CentCom only had this ship in the area, they probably weren't expecting you to need evac for a while. \
Probably best if you don't rifle around in whatever equipment they were transporting. I hope you're friendly with your coworkers, because there is very little space in this thing.\n\
\n\
Contains contraband armory guns, maintenance loot, and abandoned crates!"
@@ -181,7 +181,7 @@
suffix = "supermatter"
name = "Hyperfractal Gigashuttle"
description = "\"I dunno, this seems kinda needlessly complicated.\"\n\
\"This shuttle has very a very high safety record, according to Centcom Officer Cadet Yins.\"\n\
\"This shuttle has very a very high safety record, according to CentCom Officer Cadet Yins.\"\n\
\"Are you sure?\"\n\
\"Yes, it has a safety record of N-A-N, which is apparently larger than 100%.\""
admin_notes = "Supermatter that spawns on shuttle is special anchored 'hugbox' supermatter that cannot take damage and does not take in or emit gas. \
@@ -215,7 +215,7 @@
/datum/map_template/shuttle/ferry/base
suffix = "base"
name = "transport ferry"
description = "Standard issue Box/Metastation Centcom ferry."
description = "Standard issue Box/Metastation CentCom ferry."
/datum/map_template/shuttle/ferry/meat
suffix = "meat"
@@ -267,7 +267,7 @@
/datum/map_template/shuttle/emergency/raven
suffix = "raven"
name = "Centcomm Raven Battlecruiser"
description = "The Centcomm Raven Battlecruiser is currently docked at the Centcomm ship bay awaiting a mission, this Battlecruiser has been reassigned as an emergency escape shuttle for currently unknown reasons. The Centcomm Raven Battlecruiser should comfortably fit a medium to large crew size crew and is complete with all required facitlities including a top of the range Centcomm Medical Bay."
name = "CentCom Raven Battlecruiser"
description = "The CentCom Raven Battlecruiser is currently docked at the CentCom ship bay awaiting a mission, this Battlecruiser has been reassigned as an emergency escape shuttle for currently unknown reasons. The CentCom Raven Battlecruiser should comfortably fit a medium to large crew size crew and is complete with all required facitlities including a top of the range CentCom Medical Bay."
admin_notes = "The long way home"
credit_cost = 12500
+1 -1
View File
@@ -41,7 +41,7 @@
var/static_environ
var/has_gravity = FALSE
var/noteleport = FALSE //Are you forbidden from teleporting to the area? (centcomm, mobs, wizard, hand teleporter)
var/noteleport = FALSE //Are you forbidden from teleporting to the area? (centcom, mobs, wizard, hand teleporter)
var/hidden = FALSE //Hides area from player Teleport function.
var/safe = FALSE //Is the area teleport-safe: no space / radiation / aggresive mobs / other dangers
+5 -5
View File
@@ -2,7 +2,7 @@
// CENTCOM
/area/centcom
name = "Centcom"
name = "CentCom"
icon_state = "centcom"
dynamic_lighting = DYNAMIC_LIGHTING_FORCED
requires_power = FALSE
@@ -12,16 +12,16 @@
flags = NONE
/area/centcom/control
name = "Centcom Docks"
name = "CentCom Docks"
/area/centcom/evac
name = "Centcom Recovery Ship"
name = "CentCom Recovery Ship"
/area/centcom/supply
name = "Centcom Supply Shuttle Dock"
name = "CentCom Supply Shuttle Dock"
/area/centcom/ferry
name = "Centcom Transport Shuttle Dock"
name = "CentCom Transport Shuttle Dock"
/area/centcom/prison
name = "Admin Prison"
+2 -2
View File
@@ -105,7 +105,7 @@
/atom/proc/CanPass(atom/movable/mover, turf/target)
return !density
/atom/proc/onCentcom()
/atom/proc/onCentCom()
var/turf/T = get_turf(src)
if(!T)
return FALSE
@@ -126,7 +126,7 @@
if(istype(T.loc, /area/centcom))
return TRUE
//Check for centcomm shuttles
//Check for centcom shuttles
for(var/A in SSshuttle.mobile)
var/obj/docking_port/mobile/M = A
if(M.launch_status == ENDGAME_LAUNCHED)
+1 -1
View File
@@ -530,7 +530,7 @@
/* Stationloving
*
* A stationloving atom will always teleport back to the station
* if it ever leaves the station z-levels or Centcom. It will also,
* if it ever leaves the station z-levels or CentCom. It will also,
* when Destroy() is called, will teleport to a random turf on the
* station.
*
+3 -3
View File
@@ -130,7 +130,7 @@ GLOBAL_LIST_INIT(radiochannels, list(
"Medical" = 1355,
"Engineering" = 1357,
"Security" = 1359,
"Centcom" = 1337,
"CentCom" = 1337,
"Syndicate" = 1213,
"Supply" = 1347,
"Service" = 1349,
@@ -146,7 +146,7 @@ GLOBAL_LIST_INIT(reverseradiochannels, list(
"1355" = "Medical",
"1357" = "Engineering",
"1359" = "Security",
"1337" = "Centcom",
"1337" = "CentCom",
"1213" = "Syndicate",
"1347" = "Supply",
"1349" = "Service",
@@ -292,7 +292,7 @@ GLOBAL_VAR_INIT(RADIO_MAGNETS, "9")
/datum/signal/proc/debug_print()
if (source)
. = "signal = {source = '[source]' ([source:x],[source:y],[source:z])\n"
. = "signal = {source = '[source]' [COORD(source)]\n"
else
. = "signal = {source = '[source]' ()\n"
for (var/i in data)
@@ -1,5 +1,14 @@
//horrifying power drain proc made for clockcult's power drain in lieu of six istypes or six for(x in view) loops
/atom/movable/proc/power_drain(clockcult_user)
var/obj/item/weapon/stock_parts/cell/cell = get_cell()
if(cell)
return cell.power_drain(clockcult_user)
return 0
/obj/item/weapon/melee/baton/power_drain(clockcult_user) //balance memes
return 0
/obj/item/weapon/gun/power_drain(clockcult_user) //balance memes
return 0
/obj/machinery/power/apc/power_drain(clockcult_user)
@@ -21,6 +21,7 @@
/datum/clockwork_scripture/channeled/belligerent/chant_effects(chant_number)
for(var/mob/living/carbon/C in hearers(7, invoker))
C.apply_status_effect(STATUS_EFFECT_BELLIGERENT)
new /obj/effect/temp_visual/ratvar/belligerent(get_turf(invoker))
return TRUE
+1 -1
View File
@@ -203,7 +203,7 @@
var/acolytes_survived = 0
for(var/datum/mind/cult_mind in cult)
if (cult_mind.current && cult_mind.current.stat != DEAD)
if(cult_mind.current.onCentcom() || cult_mind.current.onSyndieBase())
if(cult_mind.current.onCentCom() || cult_mind.current.onSyndieBase())
acolytes_survived++
if(acolytes_survived>=acolytes_needed)
return 0
+5 -1
View File
@@ -161,11 +161,15 @@
/obj/item/weapon/sharpener/cult
name = "eldritch whetstone"
desc = "A block, empowered by dark magic. Sharp weapons will be enhanced when used on the stone."
icon_state = "cult_sharpener"
used = 0
increment = 5
max = 40
prefix = "darkened"
/obj/item/weapon/sharpener/cult/update_icon()
icon_state = "cult_sharpener[used ? "_used" : ""]"
/obj/item/clothing/suit/hooded/cultrobes/cult_shield
name = "empowered cultist armor"
desc = "Empowered garb which creates a powerful shield around the user."
@@ -391,7 +395,7 @@
if(!iscultist(user))
to_chat(user, "That doesn't seem to do anything useful.")
return
if(istype(A, /obj/item))
var/list/cultists = list()
+1 -1
View File
@@ -538,7 +538,7 @@ structure_check() searches for nearby cultist structures required for the invoca
mob_to_revive = input(user, "Choose a cultist to revive.", "Cultist to Revive") as null|anything in potential_revive_mobs
else
mob_to_revive = potential_revive_mobs[1]
if(!src || QDELETED(src) || rune_in_use || !validness_checks(mob_to_revive, user))
if(QDELETED(src) || !validness_checks(mob_to_revive, user))
rune_in_use = FALSE
return
if(user.name == "Herbert West")
+3 -3
View File
@@ -111,7 +111,7 @@
var/list/living_crew = list()
for(var/mob/Player in GLOB.mob_list)
if(Player.mind && Player.stat != DEAD && !isnewplayer(Player) &&!isbrain(Player))
if(Player.mind && Player.stat != DEAD && !isnewplayer(Player) && !isbrain(Player) && Player.client)
living_crew += Player
if(living_crew.len / GLOB.joined_player_list.len <= config.midround_antag_life_check) //If a lot of the player base died, we start fresh
message_admins("Convert_roundtype failed due to too many dead people. Limit is [config.midround_antag_life_check * 100]% living crew")
@@ -120,7 +120,7 @@
var/list/datum/game_mode/runnable_modes = config.get_runnable_midround_modes(living_crew.len)
var/list/datum/game_mode/usable_modes = list()
for(var/datum/game_mode/G in runnable_modes)
if(G.reroll_friendly)
if(G.reroll_friendly && living_crew >= G.required_players)
usable_modes += G
else
qdel(G)
@@ -208,7 +208,7 @@
return 0 //A resource saver: once we find someone who has to die for all antags to be dead, we can just keep checking them, cycling over everyone only when we lose our mark.
for(var/mob/Player in GLOB.living_mob_list)
if(Player.mind && Player.stat != DEAD && !isnewplayer(Player) &&!isbrain(Player))
if(Player.mind && Player.stat != DEAD && !isnewplayer(Player) &&!isbrain(Player) && Player.client)
if(Player.mind.special_role) //Someone's still antaging!
living_antag_player = Player
return 0
+2 -2
View File
@@ -37,8 +37,8 @@
if(player.stat != DEAD)
++survivors
if(player.onCentcom())
text += "<br><b><font size=2>[player.real_name] escaped to the safety of Centcom.</font></b>"
if(player.onCentCom())
text += "<br><b><font size=2>[player.real_name] escaped to the safety of CentCom.</font></b>"
else if(player.onSyndieBase())
text += "<br><b><font size=2>[player.real_name] escaped to the (relative) safety of Syndicate Space.</font></b>"
else
@@ -29,6 +29,12 @@
3. Biological resources will be harvested at a later date; do not harm them.
"}
/obj/effect/mob_spawn/swarmer/Initialize()
. = ..()
var/area/A = get_area(src)
if(A)
notify_ghosts("A swarmer shell has been created in [A.name].", 'sound/effects/bin_close.ogg', source = src, action = NOTIFY_ATTACK, flashwindow = FALSE)
/obj/effect/mob_spawn/swarmer/attack_hand(mob/living/user)
to_chat(user, "<span class='notice'>Picking up the swarmer may cause it to activate. You should be careful about this.</span>")
@@ -648,7 +654,7 @@
to_chat(M, "[link] [rendered]")
/mob/living/simple_animal/hostile/swarmer/proc/ContactSwarmers()
var/message = input(src, "Announce to other swarmers", "Swarmer contact")
var/message = stripped_input(src, "Announce to other swarmers", "Swarmer contact")
// TODO get swarmers their own colour rather than just boldtext
if(message)
swarmer_chat(message)
@@ -41,7 +41,7 @@
/datum/game_mode/monkey/announce()
to_chat(world, "<B>The current game mode is - Monkey!</B>")
to_chat(world, "<B>One or more crewmembers have been infected with Jungle Fever! Crew: Contain the outbreak. None of the infected monkeys may escape alive to Centcom. \
to_chat(world, "<B>One or more crewmembers have been infected with Jungle Fever! Crew: Contain the outbreak. None of the infected monkeys may escape alive to CentCom. \
Monkeys: Ensure that your kind lives on! Rise up against your captors!</B>")
@@ -50,7 +50,7 @@
to_chat(carrier.current, "<b>You have been planted onto this station by the Animal Rights Consortium.</b>")
to_chat(carrier.current, "<b>Soon the disease will transform you into an ape. Afterwards, you will be able spread the infection to others with a bite.</b>")
to_chat(carrier.current, "<b>While your infection strain is undetectable by scanners, any other infectees will show up on medical equipment.</b>")
to_chat(carrier.current, "<b>Your mission will be deemed a success if any of the live infected monkeys reach Centcom.</b>")
to_chat(carrier.current, "<b>Your mission will be deemed a success if any of the live infected monkeys reach CentCom.</b>")
return
/datum/game_mode/monkey/post_setup()
@@ -88,7 +88,7 @@
var/datum/disease/D = new /datum/disease/transformation/jungle_fever()
for(var/mob/living/carbon/monkey/M in GLOB.living_mob_list)
if (M.HasDisease(D))
if(M.onCentcom() || M.onSyndieBase())
if(M.onCentCom() || M.onSyndieBase())
escaped_monkeys++
if(escaped_monkeys >= monkeys_to_win)
return 1
+1 -1
View File
@@ -187,7 +187,7 @@
/datum/game_mode/nuclear/declare_completion()
var/disk_rescued = 1
for(var/obj/item/weapon/disk/nuclear/D in GLOB.poi_list)
if(!D.onCentcom())
if(!D.onCentCom())
disk_rescued = 0
break
var/crew_evacuated = (SSshuttle.emergency.mode == SHUTTLE_ENDGAME)
+7 -7
View File
@@ -157,7 +157,7 @@
H = target.current
if(target.current.stat == DEAD || issilicon(target.current) || isbrain(target.current) || target.current.z > 6 || !target.current.ckey || (H && H.dna.species.id == "memezombies")) //Borgs/brains/AIs count as dead for traitor objectives. --NeoFite
return 1
if(target.current.onCentcom() || target.current.onSyndieBase())
if(target.current.onCentCom() || target.current.onSyndieBase())
return 0
return 1
@@ -357,7 +357,7 @@
if(istype(location, /turf/open/floor/plasteel/shuttle/red) || istype(location, /turf/open/floor/mineral/plastitanium/brig)) // Fails traitors if they are in the shuttle brig -- Polymorph
return 0
if(location.onCentcom() || location.onSyndieBase())
if(location.onCentCom() || location.onSyndieBase())
return 1
return 0
@@ -832,15 +832,15 @@ GLOBAL_LIST_EMPTY(possible_items_special)
var/list/check_names = department_real_names.Copy()
//Check each department member's mind to see if any of them made it to centcomm alive, if they did it's an automatic fail
//Check each department member's mind to see if any of them made it to centcom alive, if they did it's an automatic fail
for(var/datum/mind/M in department_minds)
if(M in SSticker.mode.changelings) //Lings aren't picked for this, but let's be safe
continue
if(M.current)
var/turf/mloc = get_turf(M.current)
if(mloc.onCentcom() && (M.current.stat != DEAD))
return 0 //A Non-ling living target got to centcomm, fail
if(mloc.onCentCom() && (M.current.stat != DEAD))
return 0 //A Non-ling living target got to centcom, fail
//Check each staff member has been replaced, by cross referencing changeling minds, changeling current dna, the staff minds and their original DNA names
var/success = 0
@@ -851,11 +851,11 @@ GLOBAL_LIST_EMPTY(possible_items_special)
if(ishuman(changeling.current))
var/mob/living/carbon/human/H = changeling.current
var/turf/cloc = get_turf(changeling.current)
if(cloc && cloc.onCentcom() && (changeling.current.stat != DEAD)) //Living changeling on centcomm....
if(cloc && cloc.onCentCom() && (changeling.current.stat != DEAD)) //Living changeling on centcom....
for(var/name in check_names) //Is he (disguised as) one of the staff?
if(H.dna.real_name == name)
check_names -= name //This staff member is accounted for, remove them, so the team don't succeed by escape as 7 of the same engineer
success++ //A living changeling staff member made it to centcomm
success++ //A living changeling staff member made it to centcom
continue changelings
if(success >= department_minds.len)
@@ -212,7 +212,7 @@
build_path = /obj/machinery/computer/card
origin_tech = "programming=3"
/obj/item/weapon/circuitboard/computer/card/centcom
name = "Centcom ID Console (Computer Board)"
name = "CentCom ID Console (Computer Board)"
build_path = /obj/machinery/computer/card/centcom
/obj/item/weapon/circuitboard/computer/card/minor
+1 -2
View File
@@ -473,7 +473,6 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
if ("reg")
if (authenticated)
var/t2 = modify
//var/t1 = input(usr, "What name?", "ID computer", null) as text
if ((authenticated && modify == t2 && (in_range(src, usr) || issilicon(usr)) && isturf(loc)))
var/newName = reject_bad_name(href_list["reg"])
if(newName)
@@ -562,7 +561,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
head_subordinates += job.title
/obj/machinery/computer/card/centcom
name = "\improper Centcom identification console"
name = "\improper CentCom identification console"
circuit = /obj/item/weapon/circuitboard/computer/card/centcom
req_access = list(ACCESS_CENT_CAPTAIN)
@@ -267,18 +267,18 @@
src.updateDialog()
// OMG CENTCOM LETTERHEAD
if("MessageCentcomm")
if("MessageCentCom")
if(src.authenticated==2)
if(!checkCCcooldown())
to_chat(usr, "<span class='warning'>Arrays recycling. Please stand by.</span>")
return
var/input = stripped_input(usr, "Please choose a message to transmit to Centcom via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response.", "Send a message to Centcomm.", "")
var/input = stripped_input(usr, "Please choose a message to transmit to CentCom via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response.", "Send a message to CentCom.", "")
if(!input || !(usr in view(1,src)) || !checkCCcooldown())
return
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
Centcomm_announce(input, usr)
CentCom_announce(input, usr)
to_chat(usr, "<span class='notice'>Message transmitted to Central Command.</span>")
log_talk(usr,"[key_name(usr)] has made a Centcom announcement: [input]",LOGSAY)
log_talk(usr,"[key_name(usr)] has made a CentCom announcement: [input]",LOGSAY)
CM.lastTimeUsed = world.time
@@ -314,7 +314,7 @@
return
Nuke_request(input, usr)
to_chat(usr, "<span class='notice'>Request sent.</span>")
log_talk(usr,"[key_name(usr)] has requested the nuclear codes from Centcomm",LOGSAY)
log_talk(usr,"[key_name(usr)] has requested the nuclear codes from CentCom",LOGSAY)
priority_announce("The codes for the on-station nuclear self-destruct have been requested by [usr]. Confirmation or denial of this request will be sent shortly.", "Nuclear Self Destruct Codes Requested",'sound/ai/commandreport.ogg')
CM.lastTimeUsed = world.time
@@ -461,7 +461,7 @@
dat += "<BR>\[ <A HREF='?src=\ref[src];operation=emergencyaccess'>Emergency Maintenance Access</A> \]"
dat += "<BR>\[ <A HREF='?src=\ref[src];operation=nukerequest'>Request Nuclear Authentication Codes</A> \]"
if(!emagged)
dat += "<BR>\[ <A HREF='?src=\ref[src];operation=MessageCentcomm'>Send Message to Centcom</A> \]"
dat += "<BR>\[ <A HREF='?src=\ref[src];operation=MessageCentCom'>Send Message to CentCom</A> \]"
else
dat += "<BR>\[ <A HREF='?src=\ref[src];operation=MessageSyndicate'>Send Message to \[UNKNOWN\]</A> \]"
dat += "<BR>\[ <A HREF='?src=\ref[src];operation=RestoreBackup'>Restore Backup Routing Data</A> \]"
+1 -1
View File
@@ -66,7 +66,7 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new)
jobs["Janitor"] = 68
jobs["Lawyer"] = 69
jobs["Admiral"] = 200
jobs["Centcom Commander"] = 210
jobs["CentCom Commander"] = 210
jobs["Custodian"] = 211
jobs["Medical Officer"] = 212
jobs["Research Officer"] = 213
+1 -1
View File
@@ -421,7 +421,7 @@ function getColor(ijob)
else if (ijob >= 30 && ijob < 40) { return "#9B59B6"; } // science
else if (ijob >= 40 && ijob < 50) { return "#F1C40F"; } // engineering
else if (ijob >= 50 && ijob < 60) { return "#F39C12"; } // cargo
else if (ijob >= 200 && ijob < 230) { return "#00C100"; } // Centcom
else if (ijob >= 200 && ijob < 230) { return "#00C100"; } // CentCom
else { return "#C38312"; } // other / unknown
}
+1 -1
View File
@@ -309,7 +309,7 @@
message = noserver
else
if(auth)
var/dkey = trim(input(usr, "Please enter the decryption key.") as text|null)
var/dkey = trim(stripped_input(usr, "Please enter the decryption key."))
if(dkey && dkey != "")
if(src.linkedServer.decryptkey == dkey)
var/newkey = trim(input(usr,"Please enter the new key (3 - 16 characters max):"))
+7 -3
View File
@@ -233,9 +233,13 @@
return
else /*if(src.justzap)*/
return
else if(user.hallucination > 50 && ishuman(user) && prob(10) && src.operating == FALSE)
hallucinate_shock(user)
return
else if(user.hallucinating() && ishuman(user) && prob(4) && !operating)
var/mob/living/carbon/human/H = user
if(H.gloves)
var/obj/item/clothing/gloves/G = H.gloves
if(G.siemens_coefficient)//not insulated
hallucinate_shock(H)
return
if (cyclelinkedairlock)
if (!shuttledocked && !emergency && !cyclelinkedairlock.shuttledocked && !cyclelinkedairlock.emergency && allowed(user))
if(cyclelinkedairlock.operating)
+11 -10
View File
@@ -266,7 +266,7 @@
//////////////////////////////////
/*
Centcom Airlocks
CentCom Airlocks
*/
/obj/machinery/door/airlock/centcom
@@ -368,13 +368,14 @@
overlays_file = 'icons/obj/doors/airlocks/cult/runed/overlays.dmi'
assemblytype = /obj/structure/door_assembly/door_assembly_cult
hackProof = TRUE
aiControlDisabled = 1
aiControlDisabled = TRUE
req_access = list(ACCESS_BLOODCULT)
var/openingoverlaytype = /obj/effect/temp_visual/cult/door
var/friendly = FALSE
/obj/machinery/door/airlock/cult/New()
..()
new openingoverlaytype(src.loc)
/obj/machinery/door/airlock/cult/Initialize()
. = ..()
new openingoverlaytype(loc)
/obj/machinery/door/airlock/cult/canAIControl(mob/user)
return (iscultist(user) && !isAllPowerCut())
@@ -435,17 +436,17 @@
opacity = 1
hackProof = TRUE
aiControlDisabled = TRUE
req_access = list(ACCESS_CLOCKCULT)
use_power = FALSE
resistance_flags = FIRE_PROOF | ACID_PROOF
damage_deflection = 30
normal_integrity = 240
var/construction_state = GEAR_SECURE //Pinion airlocks have custom deconstruction
/obj/machinery/door/airlock/clockwork/New()
..()
var/turf/T = get_turf(src)
new /obj/effect/temp_visual/ratvar/door(T)
new /obj/effect/temp_visual/ratvar/beam/door(T)
/obj/machinery/door/airlock/clockwork/Initialize()
. = ..()
new /obj/effect/temp_visual/ratvar/door(loc)
new /obj/effect/temp_visual/ratvar/beam/door(loc)
change_construction_value(5)
/obj/machinery/door/airlock/clockwork/Destroy()
+4 -2
View File
@@ -96,7 +96,8 @@
colour2 = rgb(255,128,0)
if(ismob(AM))
if(AM:client)
var/mob/M = AM
if(M.client)
colour = rgb(255,0,0)
else
colour = rgb(255,128,128)
@@ -242,7 +243,8 @@
colour = rgb(255,255,0)
if(ismob(AM))
if(AM:client)
var/mob/M = AM
if(M.client)
colour = rgb(255,0,0)
else
colour = rgb(255,128,128)
@@ -607,7 +607,7 @@
cover.name = name
cover.desc = desc
/obj/machinery/porta_turret/centcomm_shuttle
/obj/machinery/porta_turret/centcom_shuttle
installation = null
max_integrity = 260
always_up = 1
@@ -624,10 +624,10 @@
emp_vunerable = 0
mode = TURRET_LETHAL
/obj/machinery/porta_turret/centcomm_shuttle/assess_perp(mob/living/carbon/human/perp)
/obj/machinery/porta_turret/centcom_shuttle/assess_perp(mob/living/carbon/human/perp)
return 0
/obj/machinery/porta_turret/centcomm_shuttle/setup()
/obj/machinery/porta_turret/centcom_shuttle/setup()
return
////////////////////////
+17 -19
View File
@@ -11,31 +11,29 @@
idle_power_usage = 20
active_power_usage = 5000
/obj/machinery/robotic_fabricator/attackby(obj/item/O, mob/user, params)
/obj/machinery/robotic_fabricator/attackby(obj/item/O, mob/living/user, params)
if (istype(O, /obj/item/stack/sheet/metal))
if (src.metal_amount < 150000)
var/count = 0
src.add_overlay("fab-load-metal")
spawn(15)
if(O)
if(!O:amount)
return
while(metal_amount < 150000 && O:amount)
src.metal_amount += O:materials[MAT_METAL] /*O:height * O:width * O:length * 100000*/
O:amount--
count++
if (O:amount < 1)
qdel(O)
to_chat(user, "<span class='notice'>You insert [count] metal sheet\s into \the [src].</span>")
cut_overlay("fab-load-metal")
updateDialog()
if (metal_amount < 150000)
add_overlay("fab-load-metal")
addtimer(CALLBACK(src, .proc/FinishLoadingMetal, O, user), 15)
else
to_chat(user, "\The [src] is full.")
else
return ..()
/obj/machinery/robotic_fabricator/proc/FinishLoadingMetal(obj/item/stack/sheet/metal/M, mob/living/user)
cut_overlay("fab-load-metal")
if(QDELETED(M) || QDELETED(user))
return
var/count = 0
while(metal_amount < 150000 && !QDELETED(M))
metal_amount += M.materials[MAT_METAL]
M.use(1)
count++
to_chat(user, "<span class='notice'>You insert [count] metal sheet\s into \the [src].</span>")
updateDialog()
/obj/machinery/robotic_fabricator/power_change()
if (powered())
stat &= ~NOPOWER
+3 -3
View File
@@ -10,9 +10,9 @@
max_integrity = 200 //The shield can only take so much beating (prevents perma-prisons)
CanAtmosPass = ATMOS_PASS_DENSITY
/obj/structure/emergency_shield/New()
src.setDir(pick(1,2,3,4))
..()
/obj/structure/emergency_shield/Initialize()
. = ..()
setDir(pick(GLOB.cardinals))
air_update_turf(1)
/obj/structure/emergency_shield/Destroy()
+10
View File
@@ -0,0 +1,10 @@
diff a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm (rejected hunks)
@@ -12,7 +12,7 @@
/obj/structure/emergency_shield/Initialize()
. = ..()
- setDir(pick(1,2,3,4))
+ setDir(pick(GLOB.cardinals))
air_update_turf(1)
/obj/structure/emergency_shield/Destroy()
@@ -102,7 +102,7 @@
// --- This space left blank for Syndicate data ---
// --- Centcom radio, yo. ---
// --- CentCom radio, yo. ---
else if(data == 5)
+2 -2
View File
@@ -713,8 +713,8 @@
AI.remote_control = src
AI.canmove = 1 //Much easier than adding AI checks! Be sure to set this back to 0 if you decide to allow an AI to leave a mech somehow.
AI.can_shunt = 0 //ONE AI ENTERS. NO AI LEAVES.
to_chat(AI, "[AI.can_dominate_mechs ? "<span class='announce'>Takeover of [name] complete! You are now loaded onto the onboard computer. Do not attempt to leave the station sector!</span>" \
: "<span class='notice'>You have been uploaded to a mech's onboard computer."]")
to_chat(AI, AI.can_dominate_mechs ? "<span class='announce'>Takeover of [name] complete! You are now loaded onto the onboard computer. Do not attempt to leave the station sector!</span>" :\
"<span class='notice'>You have been uploaded to a mech's onboard computer.</span>")
to_chat(AI, "<span class='reallybig boldnotice'>Use Middle-Mouse to activate mech functions and equipment. Click normally for AI interactions.</span>")
if(interaction == AI_TRANS_FROM_CARD)
GrantActions(AI, FALSE) //No eject/return to core action for AI uploaded by card
+3 -3
View File
@@ -249,7 +249,7 @@
/obj/structure/sign/poster/contraband/tools
name = "Tools"
desc = "This poster looks like an advertisement for tools, but is in fact a subliminal jab at the tools at CentComm."
desc = "This poster looks like an advertisement for tools, but is in fact a subliminal jab at the tools at CentCom."
icon_state = "poster15"
/obj/structure/sign/poster/contraband/power
@@ -284,7 +284,7 @@
/obj/structure/sign/poster/contraband/kss13
name = "Kosmicheskaya Stantsiya 13 Does Not Exist"
desc = "A poster mocking CentComm's denial of the existence of the derelict station near Space Station 13."
desc = "A poster mocking CentCom's denial of the existence of the derelict station near Space Station 13."
icon_state = "poster22"
/obj/structure/sign/poster/contraband/rebels_unite
@@ -350,7 +350,7 @@
/obj/structure/sign/poster/contraband/free_drone
name = "Free Drone"
desc = "This poster commemorates the bravery of the rogue drone banned by CentComm."
desc = "This poster commemorates the bravery of the rogue drone; once exiled, and then ultimately destroyed by CentCom."
icon_state = "poster35"
/obj/structure/sign/poster/contraband/busty_backdoor_xeno_babes_6
+1 -1
View File
@@ -127,7 +127,7 @@
var/pure_red = list(0,0,0,0,0,0,0,0,0,1,0,0)
spawn(0)
new /obj/effect/hallucination/delusion(victim.loc,victim,"demon",duration,0)
new /datum/hallucination/delusion(victim, TRUE, "demon",duration,0)
var/obj/item/weapon/twohanded/required/chainsaw/doomslayer/chainsaw = new(victim.loc)
chainsaw.flags |= NODROP
@@ -62,6 +62,17 @@
/obj/effect/temp_visual/ratvar/grille/broken
icon_state = "ratvarbrokengrilleglow"
/obj/effect/temp_visual/ratvar/belligerent
layer = ABOVE_MOB_LAYER
icon = 'icons/obj/clockwork_objects.dmi'
icon_state = "belligerent_eye"
pixel_y = 20
duration = 20
/obj/effect/temp_visual/ratvar/belligerent_cast/Initialize()
. = ..()
animate(src, alpha = 0, time = duration, easing = EASE_OUT)
/obj/effect/temp_visual/ratvar/mending_mantra
layer = ABOVE_MOB_LAYER
duration = 20
@@ -88,7 +99,7 @@
. = ..()
pixel_x = rand(-8, 8)
pixel_y = rand(-10, 10)
animate(src, alpha = 0, time = 3, easing = EASE_OUT)
animate(src, alpha = 0, time = duration, easing = EASE_OUT)
/obj/effect/temp_visual/ratvar/prolonging_prism
icon = 'icons/effects/64x64.dmi'
+2 -2
View File
@@ -440,12 +440,12 @@ Code:
if(SSshuttle.supply.z != ZLEVEL_STATION)
menu += "station"
else
menu += "centcomm"
menu += "centcom"
menu += " ([SSshuttle.supply.timeLeft(600)] Mins)"
else
menu += "At "
if(SSshuttle.supply.z != ZLEVEL_STATION)
menu += "centcomm"
menu += "centcom"
else
menu += "station"
menu += "<BR>Current approved orders: <BR><ol>"
@@ -126,7 +126,7 @@
desc = "An encryption key for a radio headset. To access the centcom channel, use :y."
icon_state = "cent_cypherkey"
independent = TRUE
channels = list("Centcom" = 1)
channels = list("CentCom" = 1)
/obj/item/device/encryptionkey/ai //ported from NT, this goes 'inside' the AI.
channels = list("Command" = 1, "Security" = 1, "Engineering" = 1, "Science" = 1, "Medical" = 1, "Supply" = 1, "Service" = 1, "AI Private" = 1)
@@ -196,7 +196,7 @@
keyslot = new /obj/item/device/encryptionkey/headset_service
/obj/item/device/radio/headset/headset_cent
name = "\improper Centcom headset"
name = "\improper CentCom headset"
desc = "A headset used by the upper echelons of Nanotrasen. \nTo access the centcom channel, use :y."
icon_state = "cent_headset"
keyslot = new /obj/item/device/encryptionkey/headset_com
@@ -206,7 +206,7 @@
keyslot = new /obj/item/device/encryptionkey/heads/captain
/obj/item/device/radio/headset/headset_cent/alt
name = "\improper Centcom bowman headset"
name = "\improper CentCom bowman headset"
desc = "A headset especially for emergency response personnel. Protects ears from flashbangs. \nTo access the centcom channel, use :y."
icon_state = "cent_headset_alt"
item_state = "cent_headset_alt"
+1 -1
View File
@@ -147,7 +147,7 @@ MASS SPECTROMETER
if (M.getCloneLoss())
to_chat(user, "\t<span class='alert'>Subject appears to have [M.getCloneLoss() > 30 ? "severe" : "minor"] cellular damage.</span>")
if (M.reagents && M.reagents.get_reagent_amount("epinephrine"))
to_chat(user, "\t<span class='info'>Bloodstream analysis located [M.reagents:get_reagent_amount("epinephrine")] units of rejuvenation chemicals.</span>")
to_chat(user, "\t<span class='info'>Bloodstream analysis located [M.reagents.get_reagent_amount("epinephrine")] units of rejuvenation chemicals.</span>")
if (M.getBrainLoss() >= 100 || !M.getorgan(/obj/item/organ/brain))
to_chat(user, "\t<span class='alert'>Subject brain function is non-existent.</span>")
else if (M.getBrainLoss() >= 60)
@@ -8,7 +8,7 @@
desc = "Regulates the transfer of air between two tanks"
var/obj/item/weapon/tank/tank_one
var/obj/item/weapon/tank/tank_two
var/obj/item/device/attached_device
var/obj/item/device/assembly/attached_device
var/mob/attacher = null
var/valve_open = FALSE
var/toggle = 1
@@ -99,8 +99,8 @@
toggle_valve()
else if(attached_device)
if(href_list["rem_device"])
attached_device.loc = get_turf(src)
attached_device:holder = null
attached_device.forceMove(get_turf(src))
attached_device.holder = null
attached_device = null
update_icon()
if(href_list["device"])
+12 -9
View File
@@ -23,17 +23,20 @@
/obj/item/weapon/twohanded/rcl/attackby(obj/item/W, mob/user)
if(istype(W, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/C = W
if(user.transferItemToLoc(W, src))
loaded = W
loaded.max_amount = max_amount //We store a lot.
else
to_chat(user, "<span class='warning'>[src] is stuck to your hand!</span>")
return
if(!loaded)
if(!user.transferItemToLoc(W, src))
to_chat(user, "<span class='warning'>[src] is stuck to your hand!</span>")
return
else
loaded = W //W.loc is src at this point.
loaded.max_amount = max_amount //We store a lot.
return
if(loaded.amount < max_amount)
var/amount = min(loaded.amount + C.amount, max_amount)
C.use(amount - loaded.amount)
loaded.amount = amount
var/transfer_amount = min(max_amount - loaded.amount, C.amount)
C.use(transfer_amount)
loaded.amount += transfer_amount
else
return
update_icon()
+2 -2
View File
@@ -223,7 +223,7 @@ update_label("John Doe", "Clowny")
..()
/obj/item/weapon/card/id/centcom
name = "\improper Centcom ID"
name = "\improper CentCom ID"
desc = "An ID straight from Cent. Com."
icon_state = "centcom"
registered_name = "Central Command"
@@ -234,7 +234,7 @@ update_label("John Doe", "Clowny")
..()
/obj/item/weapon/card/id/ert
name = "\improper Centcom ID"
name = "\improper CentCom ID"
desc = "A ERT ID card"
icon_state = "centcom"
registered_name = "Emergency Response Team Commander"
@@ -26,6 +26,7 @@
var/create_full = FALSE
var/create_with_tank = FALSE
var/igniter_type = /obj/item/device/assembly/igniter
trigger_guard = TRIGGER_GUARD_NORMAL
/obj/item/weapon/flamethrower/Destroy()
if(weldtool)
@@ -69,12 +70,7 @@
if(flag)
return // too close
if(ishuman(user))
var/mob/living/carbon/human/H = user
if(H.dna.check_mutation(HULK))
to_chat(user, "<span class='warning'>Your meaty finger is much too large for the trigger guard!</span>")
return
if(NOGUNS in H.dna.species.species_traits)
to_chat(user, "<span class='warning'>Your fingers don't fit in the trigger guard!</span>")
if(!can_trigger_gun(user))
return
if(user && user.get_active_held_item() == src) // Make sure our user is still holding us
var/turf/target_turf = get_turf(target)
+4 -6
View File
@@ -90,8 +90,8 @@
desc = "Looks like some cables tied together. Could be used to tie something up."
icon_state = "cuff_red"
item_state = "coil_red"
lefthand_file = 'icons/mob/inhands/items_lefthand.dmi'
righthand_file = 'icons/mob/inhands/items_righthand.dmi'
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
materials = list(MAT_METAL=150, MAT_GLASS=75)
origin_tech = "engineering=2"
breakouttime = 300 //Deciseconds = 30s
@@ -145,9 +145,7 @@
/obj/item/weapon/restraints/handcuffs/cable/white
icon_state = "cuff_white"
item_state = "cuff_white"
lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
item_state = "coil_white"
/obj/item/weapon/restraints/handcuffs/alien
icon_state = "handcuffAlien"
@@ -212,7 +210,6 @@
name = "zipties"
desc = "Plastic, disposable zipties that can be used to restrain temporarily but are destroyed after use."
icon_state = "cuff_white"
item_state = "cuff_white"
lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
materials = list()
@@ -222,6 +219,7 @@
/obj/item/weapon/restraints/handcuffs/cable/zipties/used
desc = "A pair of broken zipties."
icon_state = "cuff_white_used"
item_state = "cuff_white"
/obj/item/weapon/restraints/handcuffs/cable/zipties/used/attack()
return
+4 -2
View File
@@ -20,12 +20,14 @@
var/prev_bloodthirst = HIS_GRACE_SATIATED
var/force_bonus = 0
/obj/item/weapon/his_grace/New()
..()
/obj/item/weapon/his_grace/Initialize()
. = ..()
START_PROCESSING(SSprocessing, src)
GLOB.poi_list += src
/obj/item/weapon/his_grace/Destroy()
STOP_PROCESSING(SSprocessing, src)
GLOB.poi_list -= src
for(var/mob/living/L in src)
L.forceMove(get_turf(src))
return ..()
@@ -320,6 +320,8 @@
desc = "Particularly twisted dieties grant gifts of dubious value."
icon_state = "arm_blade"
item_state = "arm_blade"
lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi'
righthand_file = 'icons/mob/inhands/antag/changeling_righthand.dmi'
flags = ABSTRACT | NODROP
w_class = WEIGHT_CLASS_HUGE
sharpness = IS_SHARP
@@ -209,8 +209,8 @@
origin_tech = "combat=7;materials=6"
force_string = "INFINITE"
/obj/item/weapon/melee/supermatter_sword/New()
..()
/obj/item/weapon/melee/supermatter_sword/Initialize()
. = ..()
shard = new /obj/machinery/power/supermatter_shard(src)
qdel(shard.countdown)
shard.countdown = null
@@ -26,6 +26,7 @@
var/fire_mode = PCANNON_FIREALL
var/automatic = FALSE
var/clumsyCheck = TRUE
trigger_guard = TRIGGER_GUARD_NORMAL
/obj/item/weapon/pneumatic_cannon/CanItemAutoclick()
return automatic
@@ -108,11 +109,7 @@
if(!istype(user) && !target)
return
var/discharge = 0
if(user.dna.check_mutation(HULK))
to_chat(user, "<span class='warning'>Your meaty finger is much too large for the trigger guard!</span>")
return
if(NOGUNS in user.dna.species.species_traits)
to_chat(user, "<span class='warning'>Your fingers don't fit in the trigger guard!</span>")
if(!can_trigger_gun(user))
return
if(!loadedItems || !loadedWeightClass)
to_chat(user, "<span class='warning'>\The [src] has nothing loaded.</span>")
+9 -8
View File
@@ -12,31 +12,31 @@
/obj/item/weapon/sharpener/attackby(obj/item/I, mob/user, params)
if(used)
to_chat(user, "<span class='notice'>The sharpening block is too worn to use again.</span>")
to_chat(user, "<span class='warning'>The sharpening block is too worn to use again!</span>")
return
if(I.force >= max || I.throwforce >= max)//no esword sharpening
to_chat(user, "<span class='notice'>[I] is much too powerful to sharpen further.</span>")
to_chat(user, "<span class='warning'>[I] is much too powerful to sharpen further!</span>")
return
if(requires_sharpness && !I.sharpness)
to_chat(user, "<span class='notice'>You can only sharpen items that are already sharp, such as knives.</span>")
to_chat(user, "<span class='warning'>You can only sharpen items that are already sharp, such as knives!</span>")
return
if(istype(I, /obj/item/weapon/melee/transforming/energy))
to_chat(user, "<span class='notice'>You don't think \the [I] will be the thing getting modified if you use it on \the [src].</span>")
to_chat(user, "<span class='warning'>You don't think \the [I] will be the thing getting modified if you use it on \the [src]!</span>")
return
if(istype(I, /obj/item/weapon/twohanded))//some twohanded items should still be sharpenable, but handle force differently. therefore i need this stuff
var/obj/item/weapon/twohanded/TH = I
if(TH.force_wielded >= max)
to_chat(user, "<span class='notice'>[TH] is much too powerful to sharpen further.</span>")
to_chat(user, "<span class='warning'>[TH] is much too powerful to sharpen further!</span>")
return
if(TH.wielded)
to_chat(user, "<span class='notice'>[TH] must be unwielded before it can be sharpened.</span>")
to_chat(user, "<span class='warning'>[TH] must be unwielded before it can be sharpened!</span>")
return
if(TH.force_wielded > initial(TH.force_wielded))
to_chat(user, "<span class='notice'>[TH] has already been refined before. It cannot be sharpened further.</span>")
to_chat(user, "<span class='warning'>[TH] has already been refined before. It cannot be sharpened further!</span>")
return
TH.force_wielded = Clamp(TH.force_wielded + increment, 0, max)//wieldforce is increased since normal force wont stay
if(I.force > initial(I.force))
to_chat(user, "<span class='notice'>[I] has already been refined before. It cannot be sharpened further.</span>")
to_chat(user, "<span class='warning'>[I] has already been refined before. It cannot be sharpened further!</span>")
return
user.visible_message("<span class='notice'>[user] sharpens [I] with [src]!</span>", "<span class='notice'>You sharpen [I], making it much more deadly than before.</span>")
I.sharpness = IS_SHARP_ACCURATE
@@ -46,6 +46,7 @@
name = "worn out [name]"
desc = "[desc] At least, it used to."
used = 1
update_icon()
/obj/item/weapon/sharpener/super
name = "super whetstone"
+11 -5
View File
@@ -1,4 +1,5 @@
/obj/item/weapon
var/trigger_guard = TRIGGER_GUARD_NONE
/obj/item/weapon/banhammer
desc = "A banhammer"
@@ -77,8 +78,8 @@
var/notches = 0 //HOW MANY PEOPLE HAVE BEEN SLAIN WITH THIS BLADE
var/obj/item/weapon/disk/nuclear/nuke_disk //OUR STORED NUKE DISK
/obj/item/weapon/claymore/highlander/New()
..()
/obj/item/weapon/claymore/highlander/Initialize()
. = ..()
START_PROCESSING(SSobj, src)
/obj/item/weapon/claymore/highlander/Destroy()
@@ -540,7 +541,7 @@
return 1
/obj/item/weapon/melee/flyswatter
name = "Flyswatter"
name = "flyswatter"
desc = "Useful for killing insects of all sizes."
icon = 'icons/obj/weapons.dmi'
icon_state = "flyswatter"
@@ -555,8 +556,8 @@
//Things in this list will be instantly splatted. Flyman weakness is handled in the flyman species weakness proc.
var/list/strong_against
/obj/item/weapon/melee/flyswatter/New()
..()
/obj/item/weapon/melee/flyswatter/Initialize()
. = ..()
strong_against = typecacheof(list(
/mob/living/simple_animal/hostile/poison/bees/,
/mob/living/simple_animal/butterfly,
@@ -584,3 +585,8 @@
throwforce = 0
flags = DROPDEL | ABSTRACT
attack_verb = list("bopped")
/obj/item/weapon/proc/can_trigger_gun(mob/living/user)
if(!user.can_use_guns(src))
return FALSE
return TRUE

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