Merge remote-tracking branch 'remotes/git-svn' r4920 into bs12_with_tgport
Conflicts: baystation12.dme code/game/gamemodes/changeling/modularchangling.dm code/game/gamemodes/cult/runes.dm code/game/gamemodes/events.dm code/game/machinery/computer/HolodeckControl.dm code/game/objects/items/devices/radio/radio.dm code/modules/admin/admin_verbs.dm code/modules/awaymissions/zlevel.dm code/modules/client/client procs.dm code/modules/mob/living/say.dm code/modules/mob/living/simple_animal/life.dm code/modules/mob/mob_cleanup.dm code/modules/paperwork/paperbin.dm html/changelog.html icons/turf/areas.dmi maps/RandomZLevels/assistantChamber.dmm maps/RandomZLevels/fileList.txt Signed-off-by: Cael_Aislinn <cael_aislinn@yahoo.com.au>
120
SQL/feedback_schema.sql
Normal file
@@ -0,0 +1,120 @@
|
||||
CREATE TABLE `erro_admin` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`ckey` varchar(32) NOT NULL,
|
||||
`rank` varchar(32) NOT NULL DEFAULT 'Administrator',
|
||||
`level` int(2) NOT NULL DEFAULT '0',
|
||||
`flags` int(16) NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
|
||||
|
||||
CREATE TABLE `erro_admin_log` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`datetime` datetime NOT NULL,
|
||||
`adminckey` varchar(32) NOT NULL,
|
||||
`adminip` varchar(18) NOT NULL,
|
||||
`log` text NOT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
|
||||
|
||||
CREATE TABLE `erro_ban` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`bantime` datetime NOT NULL,
|
||||
`serverip` varchar(32) NOT NULL,
|
||||
`bantype` varchar(32) NOT NULL,
|
||||
`reason` text NOT NULL,
|
||||
`job` varchar(32) DEFAULT NULL,
|
||||
`duration` int(11) NOT NULL,
|
||||
`rounds` int(11) DEFAULT NULL,
|
||||
`expiration_time` datetime NOT NULL,
|
||||
`ckey` varchar(32) NOT NULL,
|
||||
`computerid` varchar(32) NOT NULL,
|
||||
`ip` varchar(32) NOT NULL,
|
||||
`a_ckey` varchar(32) NOT NULL,
|
||||
`a_computerid` varchar(32) NOT NULL,
|
||||
`a_ip` varchar(32) NOT NULL,
|
||||
`who` text NOT NULL,
|
||||
`adminwho` text NOT NULL,
|
||||
`edits` text,
|
||||
`unbanned` tinyint(1) DEFAULT NULL,
|
||||
`unbanned_datetime` datetime DEFAULT NULL,
|
||||
`unbanned_ckey` varchar(32) DEFAULT NULL,
|
||||
`unbanned_computerid` varchar(32) DEFAULT NULL,
|
||||
`unbanned_ip` varchar(32) DEFAULT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
|
||||
|
||||
CREATE TABLE `erro_feedback` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`time` datetime NOT NULL,
|
||||
`round_id` int(8) NOT NULL,
|
||||
`var_name` varchar(32) NOT NULL,
|
||||
`var_value` int(16) DEFAULT NULL,
|
||||
`details` text,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ;
|
||||
|
||||
CREATE TABLE `erro_player` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`ckey` varchar(32) NOT NULL,
|
||||
`firstseen` datetime NOT NULL,
|
||||
`lastseen` datetime NOT NULL,
|
||||
`ip` varchar(18) NOT NULL,
|
||||
`computerid` varchar(32) NOT NULL,
|
||||
`lastadminrank` varchar(32) NOT NULL DEFAULT 'Player',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `ckey` (`ckey`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
|
||||
|
||||
CREATE TABLE `erro_poll_option` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`pollid` int(11) NOT NULL,
|
||||
`text` varchar(255) NOT NULL,
|
||||
`percentagecalc` tinyint(1) NOT NULL DEFAULT '1',
|
||||
`minval` int(3) DEFAULT NULL,
|
||||
`maxval` int(3) DEFAULT NULL,
|
||||
`descmin` varchar(32) DEFAULT NULL,
|
||||
`descmid` varchar(32) DEFAULT NULL,
|
||||
`descmax` varchar(32) DEFAULT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
|
||||
|
||||
CREATE TABLE `erro_poll_question` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`polltype` varchar(16) NOT NULL DEFAULT 'OPTION',
|
||||
`starttime` datetime NOT NULL,
|
||||
`endtime` datetime NOT NULL,
|
||||
`question` varchar(255) NOT NULL,
|
||||
`adminonly` tinyint(1) DEFAULT '0',
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
|
||||
|
||||
CREATE TABLE `erro_poll_textreply` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`datetime` datetime NOT NULL,
|
||||
`pollid` int(11) NOT NULL,
|
||||
`ckey` varchar(32) NOT NULL,
|
||||
`ip` varchar(18) NOT NULL,
|
||||
`replytext` text NOT NULL,
|
||||
`adminrank` varchar(32) NOT NULL DEFAULT 'Player',
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
|
||||
|
||||
CREATE TABLE `erro_poll_vote` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`datetime` datetime NOT NULL,
|
||||
`pollid` int(11) NOT NULL,
|
||||
`optionid` int(11) NOT NULL,
|
||||
`ckey` varchar(255) NOT NULL,
|
||||
`ip` varchar(16) NOT NULL,
|
||||
`adminrank` varchar(32) NOT NULL,
|
||||
`rating` int(2) DEFAULT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
|
||||
|
||||
CREATE TABLE `erro_privacy` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`datetime` datetime NOT NULL,
|
||||
`ckey` varchar(32) NOT NULL,
|
||||
`option` varchar(128) NOT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
|
||||
282
baystation12.dme
@@ -6,6 +6,266 @@
|
||||
|
||||
// BEGIN_FILE_DIR
|
||||
#define FILE_DIR .
|
||||
#define FILE_DIR ".svn"
|
||||
#define FILE_DIR ".svn/pristine"
|
||||
#define FILE_DIR ".svn/pristine/00"
|
||||
#define FILE_DIR ".svn/pristine/01"
|
||||
#define FILE_DIR ".svn/pristine/02"
|
||||
#define FILE_DIR ".svn/pristine/03"
|
||||
#define FILE_DIR ".svn/pristine/04"
|
||||
#define FILE_DIR ".svn/pristine/05"
|
||||
#define FILE_DIR ".svn/pristine/06"
|
||||
#define FILE_DIR ".svn/pristine/07"
|
||||
#define FILE_DIR ".svn/pristine/08"
|
||||
#define FILE_DIR ".svn/pristine/09"
|
||||
#define FILE_DIR ".svn/pristine/0a"
|
||||
#define FILE_DIR ".svn/pristine/0b"
|
||||
#define FILE_DIR ".svn/pristine/0c"
|
||||
#define FILE_DIR ".svn/pristine/0d"
|
||||
#define FILE_DIR ".svn/pristine/0e"
|
||||
#define FILE_DIR ".svn/pristine/0f"
|
||||
#define FILE_DIR ".svn/pristine/10"
|
||||
#define FILE_DIR ".svn/pristine/11"
|
||||
#define FILE_DIR ".svn/pristine/12"
|
||||
#define FILE_DIR ".svn/pristine/13"
|
||||
#define FILE_DIR ".svn/pristine/14"
|
||||
#define FILE_DIR ".svn/pristine/15"
|
||||
#define FILE_DIR ".svn/pristine/16"
|
||||
#define FILE_DIR ".svn/pristine/17"
|
||||
#define FILE_DIR ".svn/pristine/18"
|
||||
#define FILE_DIR ".svn/pristine/19"
|
||||
#define FILE_DIR ".svn/pristine/1a"
|
||||
#define FILE_DIR ".svn/pristine/1b"
|
||||
#define FILE_DIR ".svn/pristine/1c"
|
||||
#define FILE_DIR ".svn/pristine/1d"
|
||||
#define FILE_DIR ".svn/pristine/1e"
|
||||
#define FILE_DIR ".svn/pristine/1f"
|
||||
#define FILE_DIR ".svn/pristine/20"
|
||||
#define FILE_DIR ".svn/pristine/21"
|
||||
#define FILE_DIR ".svn/pristine/22"
|
||||
#define FILE_DIR ".svn/pristine/23"
|
||||
#define FILE_DIR ".svn/pristine/24"
|
||||
#define FILE_DIR ".svn/pristine/25"
|
||||
#define FILE_DIR ".svn/pristine/26"
|
||||
#define FILE_DIR ".svn/pristine/27"
|
||||
#define FILE_DIR ".svn/pristine/28"
|
||||
#define FILE_DIR ".svn/pristine/29"
|
||||
#define FILE_DIR ".svn/pristine/2a"
|
||||
#define FILE_DIR ".svn/pristine/2b"
|
||||
#define FILE_DIR ".svn/pristine/2c"
|
||||
#define FILE_DIR ".svn/pristine/2d"
|
||||
#define FILE_DIR ".svn/pristine/2e"
|
||||
#define FILE_DIR ".svn/pristine/2f"
|
||||
#define FILE_DIR ".svn/pristine/30"
|
||||
#define FILE_DIR ".svn/pristine/31"
|
||||
#define FILE_DIR ".svn/pristine/32"
|
||||
#define FILE_DIR ".svn/pristine/33"
|
||||
#define FILE_DIR ".svn/pristine/34"
|
||||
#define FILE_DIR ".svn/pristine/35"
|
||||
#define FILE_DIR ".svn/pristine/36"
|
||||
#define FILE_DIR ".svn/pristine/37"
|
||||
#define FILE_DIR ".svn/pristine/38"
|
||||
#define FILE_DIR ".svn/pristine/39"
|
||||
#define FILE_DIR ".svn/pristine/3a"
|
||||
#define FILE_DIR ".svn/pristine/3b"
|
||||
#define FILE_DIR ".svn/pristine/3c"
|
||||
#define FILE_DIR ".svn/pristine/3d"
|
||||
#define FILE_DIR ".svn/pristine/3e"
|
||||
#define FILE_DIR ".svn/pristine/3f"
|
||||
#define FILE_DIR ".svn/pristine/40"
|
||||
#define FILE_DIR ".svn/pristine/41"
|
||||
#define FILE_DIR ".svn/pristine/42"
|
||||
#define FILE_DIR ".svn/pristine/43"
|
||||
#define FILE_DIR ".svn/pristine/44"
|
||||
#define FILE_DIR ".svn/pristine/45"
|
||||
#define FILE_DIR ".svn/pristine/46"
|
||||
#define FILE_DIR ".svn/pristine/47"
|
||||
#define FILE_DIR ".svn/pristine/48"
|
||||
#define FILE_DIR ".svn/pristine/49"
|
||||
#define FILE_DIR ".svn/pristine/4a"
|
||||
#define FILE_DIR ".svn/pristine/4b"
|
||||
#define FILE_DIR ".svn/pristine/4c"
|
||||
#define FILE_DIR ".svn/pristine/4d"
|
||||
#define FILE_DIR ".svn/pristine/4e"
|
||||
#define FILE_DIR ".svn/pristine/4f"
|
||||
#define FILE_DIR ".svn/pristine/50"
|
||||
#define FILE_DIR ".svn/pristine/51"
|
||||
#define FILE_DIR ".svn/pristine/52"
|
||||
#define FILE_DIR ".svn/pristine/53"
|
||||
#define FILE_DIR ".svn/pristine/54"
|
||||
#define FILE_DIR ".svn/pristine/55"
|
||||
#define FILE_DIR ".svn/pristine/56"
|
||||
#define FILE_DIR ".svn/pristine/57"
|
||||
#define FILE_DIR ".svn/pristine/58"
|
||||
#define FILE_DIR ".svn/pristine/59"
|
||||
#define FILE_DIR ".svn/pristine/5a"
|
||||
#define FILE_DIR ".svn/pristine/5b"
|
||||
#define FILE_DIR ".svn/pristine/5c"
|
||||
#define FILE_DIR ".svn/pristine/5d"
|
||||
#define FILE_DIR ".svn/pristine/5e"
|
||||
#define FILE_DIR ".svn/pristine/5f"
|
||||
#define FILE_DIR ".svn/pristine/60"
|
||||
#define FILE_DIR ".svn/pristine/61"
|
||||
#define FILE_DIR ".svn/pristine/62"
|
||||
#define FILE_DIR ".svn/pristine/63"
|
||||
#define FILE_DIR ".svn/pristine/64"
|
||||
#define FILE_DIR ".svn/pristine/65"
|
||||
#define FILE_DIR ".svn/pristine/66"
|
||||
#define FILE_DIR ".svn/pristine/67"
|
||||
#define FILE_DIR ".svn/pristine/68"
|
||||
#define FILE_DIR ".svn/pristine/69"
|
||||
#define FILE_DIR ".svn/pristine/6a"
|
||||
#define FILE_DIR ".svn/pristine/6b"
|
||||
#define FILE_DIR ".svn/pristine/6c"
|
||||
#define FILE_DIR ".svn/pristine/6d"
|
||||
#define FILE_DIR ".svn/pristine/6e"
|
||||
#define FILE_DIR ".svn/pristine/6f"
|
||||
#define FILE_DIR ".svn/pristine/70"
|
||||
#define FILE_DIR ".svn/pristine/71"
|
||||
#define FILE_DIR ".svn/pristine/72"
|
||||
#define FILE_DIR ".svn/pristine/73"
|
||||
#define FILE_DIR ".svn/pristine/74"
|
||||
#define FILE_DIR ".svn/pristine/75"
|
||||
#define FILE_DIR ".svn/pristine/76"
|
||||
#define FILE_DIR ".svn/pristine/77"
|
||||
#define FILE_DIR ".svn/pristine/78"
|
||||
#define FILE_DIR ".svn/pristine/79"
|
||||
#define FILE_DIR ".svn/pristine/7a"
|
||||
#define FILE_DIR ".svn/pristine/7b"
|
||||
#define FILE_DIR ".svn/pristine/7c"
|
||||
#define FILE_DIR ".svn/pristine/7d"
|
||||
#define FILE_DIR ".svn/pristine/7e"
|
||||
#define FILE_DIR ".svn/pristine/7f"
|
||||
#define FILE_DIR ".svn/pristine/80"
|
||||
#define FILE_DIR ".svn/pristine/81"
|
||||
#define FILE_DIR ".svn/pristine/82"
|
||||
#define FILE_DIR ".svn/pristine/83"
|
||||
#define FILE_DIR ".svn/pristine/84"
|
||||
#define FILE_DIR ".svn/pristine/85"
|
||||
#define FILE_DIR ".svn/pristine/86"
|
||||
#define FILE_DIR ".svn/pristine/87"
|
||||
#define FILE_DIR ".svn/pristine/88"
|
||||
#define FILE_DIR ".svn/pristine/89"
|
||||
#define FILE_DIR ".svn/pristine/8a"
|
||||
#define FILE_DIR ".svn/pristine/8b"
|
||||
#define FILE_DIR ".svn/pristine/8c"
|
||||
#define FILE_DIR ".svn/pristine/8d"
|
||||
#define FILE_DIR ".svn/pristine/8e"
|
||||
#define FILE_DIR ".svn/pristine/8f"
|
||||
#define FILE_DIR ".svn/pristine/90"
|
||||
#define FILE_DIR ".svn/pristine/91"
|
||||
#define FILE_DIR ".svn/pristine/92"
|
||||
#define FILE_DIR ".svn/pristine/93"
|
||||
#define FILE_DIR ".svn/pristine/94"
|
||||
#define FILE_DIR ".svn/pristine/95"
|
||||
#define FILE_DIR ".svn/pristine/96"
|
||||
#define FILE_DIR ".svn/pristine/97"
|
||||
#define FILE_DIR ".svn/pristine/98"
|
||||
#define FILE_DIR ".svn/pristine/99"
|
||||
#define FILE_DIR ".svn/pristine/9a"
|
||||
#define FILE_DIR ".svn/pristine/9b"
|
||||
#define FILE_DIR ".svn/pristine/9c"
|
||||
#define FILE_DIR ".svn/pristine/9d"
|
||||
#define FILE_DIR ".svn/pristine/9e"
|
||||
#define FILE_DIR ".svn/pristine/9f"
|
||||
#define FILE_DIR ".svn/pristine/a0"
|
||||
#define FILE_DIR ".svn/pristine/a1"
|
||||
#define FILE_DIR ".svn/pristine/a2"
|
||||
#define FILE_DIR ".svn/pristine/a3"
|
||||
#define FILE_DIR ".svn/pristine/a4"
|
||||
#define FILE_DIR ".svn/pristine/a5"
|
||||
#define FILE_DIR ".svn/pristine/a6"
|
||||
#define FILE_DIR ".svn/pristine/a7"
|
||||
#define FILE_DIR ".svn/pristine/a8"
|
||||
#define FILE_DIR ".svn/pristine/a9"
|
||||
#define FILE_DIR ".svn/pristine/aa"
|
||||
#define FILE_DIR ".svn/pristine/ab"
|
||||
#define FILE_DIR ".svn/pristine/ac"
|
||||
#define FILE_DIR ".svn/pristine/ad"
|
||||
#define FILE_DIR ".svn/pristine/ae"
|
||||
#define FILE_DIR ".svn/pristine/af"
|
||||
#define FILE_DIR ".svn/pristine/b0"
|
||||
#define FILE_DIR ".svn/pristine/b1"
|
||||
#define FILE_DIR ".svn/pristine/b2"
|
||||
#define FILE_DIR ".svn/pristine/b3"
|
||||
#define FILE_DIR ".svn/pristine/b4"
|
||||
#define FILE_DIR ".svn/pristine/b5"
|
||||
#define FILE_DIR ".svn/pristine/b6"
|
||||
#define FILE_DIR ".svn/pristine/b7"
|
||||
#define FILE_DIR ".svn/pristine/b8"
|
||||
#define FILE_DIR ".svn/pristine/b9"
|
||||
#define FILE_DIR ".svn/pristine/ba"
|
||||
#define FILE_DIR ".svn/pristine/bb"
|
||||
#define FILE_DIR ".svn/pristine/bc"
|
||||
#define FILE_DIR ".svn/pristine/bd"
|
||||
#define FILE_DIR ".svn/pristine/be"
|
||||
#define FILE_DIR ".svn/pristine/bf"
|
||||
#define FILE_DIR ".svn/pristine/c0"
|
||||
#define FILE_DIR ".svn/pristine/c1"
|
||||
#define FILE_DIR ".svn/pristine/c2"
|
||||
#define FILE_DIR ".svn/pristine/c3"
|
||||
#define FILE_DIR ".svn/pristine/c4"
|
||||
#define FILE_DIR ".svn/pristine/c5"
|
||||
#define FILE_DIR ".svn/pristine/c6"
|
||||
#define FILE_DIR ".svn/pristine/c7"
|
||||
#define FILE_DIR ".svn/pristine/c8"
|
||||
#define FILE_DIR ".svn/pristine/c9"
|
||||
#define FILE_DIR ".svn/pristine/ca"
|
||||
#define FILE_DIR ".svn/pristine/cb"
|
||||
#define FILE_DIR ".svn/pristine/cc"
|
||||
#define FILE_DIR ".svn/pristine/cd"
|
||||
#define FILE_DIR ".svn/pristine/ce"
|
||||
#define FILE_DIR ".svn/pristine/cf"
|
||||
#define FILE_DIR ".svn/pristine/d0"
|
||||
#define FILE_DIR ".svn/pristine/d1"
|
||||
#define FILE_DIR ".svn/pristine/d2"
|
||||
#define FILE_DIR ".svn/pristine/d3"
|
||||
#define FILE_DIR ".svn/pristine/d4"
|
||||
#define FILE_DIR ".svn/pristine/d5"
|
||||
#define FILE_DIR ".svn/pristine/d6"
|
||||
#define FILE_DIR ".svn/pristine/d7"
|
||||
#define FILE_DIR ".svn/pristine/d8"
|
||||
#define FILE_DIR ".svn/pristine/d9"
|
||||
#define FILE_DIR ".svn/pristine/da"
|
||||
#define FILE_DIR ".svn/pristine/db"
|
||||
#define FILE_DIR ".svn/pristine/dc"
|
||||
#define FILE_DIR ".svn/pristine/dd"
|
||||
#define FILE_DIR ".svn/pristine/de"
|
||||
#define FILE_DIR ".svn/pristine/df"
|
||||
#define FILE_DIR ".svn/pristine/e0"
|
||||
#define FILE_DIR ".svn/pristine/e1"
|
||||
#define FILE_DIR ".svn/pristine/e2"
|
||||
#define FILE_DIR ".svn/pristine/e3"
|
||||
#define FILE_DIR ".svn/pristine/e4"
|
||||
#define FILE_DIR ".svn/pristine/e5"
|
||||
#define FILE_DIR ".svn/pristine/e6"
|
||||
#define FILE_DIR ".svn/pristine/e7"
|
||||
#define FILE_DIR ".svn/pristine/e8"
|
||||
#define FILE_DIR ".svn/pristine/e9"
|
||||
#define FILE_DIR ".svn/pristine/ea"
|
||||
#define FILE_DIR ".svn/pristine/eb"
|
||||
#define FILE_DIR ".svn/pristine/ec"
|
||||
#define FILE_DIR ".svn/pristine/ed"
|
||||
#define FILE_DIR ".svn/pristine/ee"
|
||||
#define FILE_DIR ".svn/pristine/ef"
|
||||
#define FILE_DIR ".svn/pristine/f0"
|
||||
#define FILE_DIR ".svn/pristine/f1"
|
||||
#define FILE_DIR ".svn/pristine/f2"
|
||||
#define FILE_DIR ".svn/pristine/f3"
|
||||
#define FILE_DIR ".svn/pristine/f4"
|
||||
#define FILE_DIR ".svn/pristine/f5"
|
||||
#define FILE_DIR ".svn/pristine/f6"
|
||||
#define FILE_DIR ".svn/pristine/f7"
|
||||
#define FILE_DIR ".svn/pristine/f8"
|
||||
#define FILE_DIR ".svn/pristine/f9"
|
||||
#define FILE_DIR ".svn/pristine/fa"
|
||||
#define FILE_DIR ".svn/pristine/fb"
|
||||
#define FILE_DIR ".svn/pristine/fc"
|
||||
#define FILE_DIR ".svn/pristine/fd"
|
||||
#define FILE_DIR ".svn/pristine/fe"
|
||||
#define FILE_DIR ".svn/pristine/ff"
|
||||
#define FILE_DIR "bot"
|
||||
#define FILE_DIR "bot/Marakov"
|
||||
#define FILE_DIR "code"
|
||||
#define FILE_DIR "code/ATMOSPHERICS"
|
||||
#define FILE_DIR "code/ATMOSPHERICS/components"
|
||||
@@ -228,8 +488,7 @@
|
||||
#define FILE_DIR "code/WorkInProgress/virus2"
|
||||
#define FILE_DIR "code/WorkInProgress/virus2/Disease2"
|
||||
#define FILE_DIR "code/WorkInProgress/Wrongnumber"
|
||||
#define FILE_DIR "code/ZAS"
|
||||
#define FILE_DIR "html"
|
||||
#define FILE_DIR "config"#define FILE_DIR "config/names"#define FILE_DIR "data"#define FILE_DIR "data/logs"#define FILE_DIR "data/logs/2012"#define FILE_DIR "data/logs/2012/10-October"#define FILE_DIR "data/player_saves"#define FILE_DIR "data/player_saves/g"#define FILE_DIR "data/player_saves/g/giacomand"#define FILE_DIR "code/ZAS"#define FILE_DIR "html"
|
||||
#define FILE_DIR "icons"
|
||||
#define FILE_DIR "icons/48x48"
|
||||
#define FILE_DIR "icons/effects"
|
||||
@@ -244,6 +503,7 @@
|
||||
#define FILE_DIR "icons/obj/machines"
|
||||
#define FILE_DIR "icons/obj/pipes"
|
||||
#define FILE_DIR "icons/pda_icons"
|
||||
#define FILE_DIR "icons/PSD files"
|
||||
#define FILE_DIR "icons/spideros_icons"
|
||||
#define FILE_DIR "icons/Testing"
|
||||
#define FILE_DIR "icons/turf"
|
||||
@@ -252,6 +512,7 @@
|
||||
#define FILE_DIR "interface"
|
||||
#define FILE_DIR "maps"
|
||||
#define FILE_DIR "maps/RandomZLevels"
|
||||
#define FILE_DIR "music"
|
||||
#define FILE_DIR "sound"
|
||||
#define FILE_DIR "sound/AI"
|
||||
#define FILE_DIR "sound/ambience"
|
||||
@@ -266,8 +527,18 @@
|
||||
#define FILE_DIR "sound/violin"
|
||||
#define FILE_DIR "sound/voice"
|
||||
#define FILE_DIR "sound/weapons"
|
||||
#define FILE_DIR "SQL"
|
||||
#define FILE_DIR "tools"
|
||||
#define FILE_DIR "tools/Redirector"
|
||||
#define FILE_DIR "tools/Runtime Condenser"
|
||||
#define FILE_DIR "tools/UnstandardnessTestForDM"
|
||||
#define FILE_DIR "tools/UnstandardnessTestForDM/UnstandardnessTestForDM"
|
||||
#define FILE_DIR "tools/UnstandardnessTestForDM/UnstandardnessTestForDM/bin"
|
||||
#define FILE_DIR "tools/UnstandardnessTestForDM/UnstandardnessTestForDM/bin/Debug"
|
||||
#define FILE_DIR "tools/UnstandardnessTestForDM/UnstandardnessTestForDM/obj"
|
||||
#define FILE_DIR "tools/UnstandardnessTestForDM/UnstandardnessTestForDM/obj/x86"
|
||||
#define FILE_DIR "tools/UnstandardnessTestForDM/UnstandardnessTestForDM/obj/x86/Debug"
|
||||
#define FILE_DIR "tools/UnstandardnessTestForDM/UnstandardnessTestForDM/Properties"
|
||||
// END_FILE_DIR
|
||||
|
||||
// BEGIN_PREFERENCES
|
||||
@@ -491,7 +762,6 @@
|
||||
#include "code\game\machinery\constructable_frame.dm"
|
||||
#include "code\game\machinery\cryo.dm"
|
||||
#include "code\game\machinery\deployable.dm"
|
||||
#include "code\game\machinery\dispenser.dm"
|
||||
#include "code\game\machinery\door_control.dm"
|
||||
#include "code\game\machinery\doppler_array.dm"
|
||||
#include "code\game\machinery\flasher.dm"
|
||||
@@ -520,6 +790,7 @@
|
||||
#include "code\game\machinery\suit_storage_unit.dm"
|
||||
#include "code\game\machinery\syndicatebeacon.dm"
|
||||
#include "code\game\machinery\teleporter.dm"
|
||||
#include "code\game\machinery\transformer.dm"
|
||||
#include "code\game\machinery\turrets.dm"
|
||||
#include "code\game\machinery\vending.dm"
|
||||
#include "code\game\machinery\washing_machine.dm"
|
||||
@@ -704,7 +975,6 @@
|
||||
#include "code\game\objects\items\stacks\tiles\plasteel.dm"
|
||||
#include "code\game\objects\items\stacks\tiles\tile_types.dm"
|
||||
#include "code\game\objects\items\weapons\AI_modules.dm"
|
||||
#include "code\game\objects\items\weapons\Bedsheets.dm"
|
||||
#include "code\game\objects\items\weapons\cards_ids.dm"
|
||||
#include "code\game\objects\items\weapons\cigs_lighters.dm"
|
||||
#include "code\game\objects\items\weapons\clown_items.dm"
|
||||
@@ -786,7 +1056,9 @@
|
||||
#include "code\game\objects\structures\morgue.dm"
|
||||
#include "code\game\objects\structures\musician.dm"
|
||||
#include "code\game\objects\structures\noticeboard.dm"
|
||||
#include "code\game\objects\structures\safe.dm"
|
||||
#include "code\game\objects\structures\tables_racks.dm"
|
||||
#include "code\game\objects\structures\tank_dispenser.dm"
|
||||
#include "code\game\objects\structures\target_stake.dm"
|
||||
#include "code\game\objects\structures\watercloset.dm"
|
||||
#include "code\game\objects\structures\windoor_assembly.dm"
|
||||
@@ -1104,7 +1376,6 @@
|
||||
#include "code\modules\mob\living\silicon\ai\life.dm"
|
||||
#include "code\modules\mob\living\silicon\ai\login.dm"
|
||||
#include "code\modules\mob\living\silicon\ai\logout.dm"
|
||||
#include "code\modules\mob\living\silicon\ai\move.dm"
|
||||
#include "code\modules\mob\living\silicon\ai\say.dm"
|
||||
#include "code\modules\mob\living\silicon\ai\freelook\cameranet.dm"
|
||||
#include "code\modules\mob\living\silicon\ai\freelook\chunk.dm"
|
||||
@@ -1345,5 +1616,6 @@
|
||||
#include "interface\interface.dm"
|
||||
#include "interface\skin.dmf"
|
||||
#include "maps\tgstation.2.0.9.1.dmm"
|
||||
#include "maps\RandomZLevels\Academy.dm"
|
||||
#include "maps\RandomZLevels\stationCollision.dm"
|
||||
// END_INCLUDE
|
||||
|
||||
@@ -29,7 +29,7 @@ def YTCV4(youtube_url,cache=1,debug=0):
|
||||
try:
|
||||
prev_dict = pickle.load(tiedosto)
|
||||
except EOFError: # Cache is corrupt
|
||||
os.remove(directory+"/nano/"+tiedosto.name)
|
||||
os.remove(directory+tiedosto.name)
|
||||
print "REMOVED CORRUPT CACHE: "+tiedosto.name
|
||||
prev_dict = {}
|
||||
tiedosto.close() # I think this should belong here.
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
name = "Air Vent"
|
||||
desc = "Has a valve and pump attached to it"
|
||||
|
||||
var/area/initial_loc
|
||||
level = 1
|
||||
var/area_uid
|
||||
var/id_tag = null
|
||||
@@ -41,10 +42,10 @@
|
||||
icon_state = "in"
|
||||
|
||||
New()
|
||||
var/area/A = get_area(loc)
|
||||
if (A.master)
|
||||
A = A.master
|
||||
area_uid = A.uid
|
||||
initial_loc = get_area(loc)
|
||||
if (initial_loc.master)
|
||||
initial_loc = initial_loc.master
|
||||
area_uid = initial_loc.uid
|
||||
if (!id_tag)
|
||||
assign_uid()
|
||||
id_tag = num2text(uid)
|
||||
@@ -321,3 +322,8 @@
|
||||
"You hear ratchet.")
|
||||
new /obj/item/pipe(loc, make_from=src)
|
||||
del(src)
|
||||
|
||||
/obj/machinery/atmospherics/unary/vent_pump/Del()
|
||||
initial_loc.air_scrub_info -= id_tag
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
|
||||
level = 1
|
||||
|
||||
var/area/initial_loc
|
||||
var/id_tag = null
|
||||
var/frequency = 1439
|
||||
var/datum/radio_frequency/radio_connection
|
||||
@@ -24,10 +25,10 @@
|
||||
var/radio_filter_out
|
||||
var/radio_filter_in
|
||||
New()
|
||||
var/area/A = get_area(loc)
|
||||
if (A.master)
|
||||
A = A.master
|
||||
area_uid = A.uid
|
||||
initial_loc = get_area(loc)
|
||||
if (initial_loc.master)
|
||||
initial_loc = initial_loc.master
|
||||
area_uid = initial_loc.uid
|
||||
if (!id_tag)
|
||||
assign_uid()
|
||||
id_tag = num2text(uid)
|
||||
@@ -257,3 +258,8 @@
|
||||
"You hear ratchet.")
|
||||
new /obj/item/pipe(loc, make_from=src)
|
||||
del(src)
|
||||
|
||||
/obj/machinery/atmospherics/unary/vent_scrubber/Del()
|
||||
initial_loc.air_scrub_info -= id_tag
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -174,11 +174,14 @@ obj/machinery/atmospherics/valve
|
||||
if(target.initialize_directions & get_dir(target,src))
|
||||
node2 = target
|
||||
break
|
||||
|
||||
build_network()
|
||||
|
||||
if(openDuringInit)
|
||||
close()
|
||||
open()
|
||||
openDuringInit = 0
|
||||
|
||||
build_network()
|
||||
/*
|
||||
var/connect_directions
|
||||
switch(dir)
|
||||
|
||||
@@ -152,10 +152,8 @@ datum
|
||||
var/start_time = world.timeofday
|
||||
|
||||
for(var/turf/simulated/S in world)
|
||||
if(!S.blocks_air && !S.parent && S.z < 5) // Added last check to force skipping asteroid z-levels -- TLE
|
||||
if(!S.blocks_air && !S.parent)
|
||||
assemble_group_turf(S)
|
||||
if(S.z > 4) // Skipping asteroids -- TLE
|
||||
continue
|
||||
S.update_air_properties()
|
||||
|
||||
world << "\red \b Geometry processed in [(world.timeofday-start_time)/10] seconds!"
|
||||
|
||||
@@ -167,8 +167,11 @@ datum/controller/vote
|
||||
proc/interface(var/client/C)
|
||||
if(!C) return
|
||||
var/admin = 0
|
||||
var/trialmin = 0
|
||||
if(C.holder)
|
||||
admin = 1
|
||||
if (C.holder.level >= 3)
|
||||
trialmin = 1
|
||||
voting |= C
|
||||
|
||||
. = "<html><head><title>Voting Panel</title></head><body>"
|
||||
@@ -186,24 +189,24 @@ datum/controller/vote
|
||||
else
|
||||
. += "<h2>Start a vote:</h2><hr><ul><li>"
|
||||
//restart
|
||||
if(admin || config.allow_vote_restart)
|
||||
if(trialmin || config.allow_vote_restart)
|
||||
. += "<a href='?src=\ref[src];vote=restart'>Restart</a>"
|
||||
else
|
||||
. += "<font color='grey'>Restart (Disallowed)</font>"
|
||||
if(admin)
|
||||
if(trialmin)
|
||||
. += "\t(<a href='?src=\ref[src];vote=toggle_restart'>[config.allow_vote_restart?"Allowed":"Disallowed"]</a>)"
|
||||
. += "</li><li>"
|
||||
//gamemode
|
||||
if(admin || config.allow_vote_mode)
|
||||
if(trialmin || config.allow_vote_mode)
|
||||
. += "<a href='?src=\ref[src];vote=gamemode'>GameMode</a>"
|
||||
else
|
||||
. += "<font color='grey'>GameMode (Disallowed)</font>"
|
||||
if(admin)
|
||||
if(trialmin)
|
||||
. += "\t(<a href='?src=\ref[src];vote=toggle_gamemode'>[config.allow_vote_mode?"Allowed":"Disallowed"]</a>)"
|
||||
|
||||
. += "</li>"
|
||||
//custom
|
||||
if(admin)
|
||||
if(trialmin)
|
||||
. += "<li><a href='?src=\ref[src];vote=custom'>Custom</a></li>"
|
||||
. += "</ul><hr>"
|
||||
. += "<a href='?src=\ref[src];vote=close' style='position:absolute;right:50px'>Close</a></body></html>"
|
||||
|
||||
@@ -8,8 +8,8 @@ client
|
||||
//set src in world
|
||||
|
||||
|
||||
if(!usr.client || !usr.client.holder || !(usr.client.holder.level >= 2) ) //admin candidate and up.
|
||||
usr << "\red You need to be a higher level administrator to access this."
|
||||
if(!usr.client || !usr.client.holder)
|
||||
usr << "\red You need to be an administrator to access this."
|
||||
return
|
||||
|
||||
|
||||
@@ -408,6 +408,7 @@ client
|
||||
else if (href_list["rename"])
|
||||
var/mob/M = locate(href_list["rename"])
|
||||
if(!istype(M)) return
|
||||
if(!admin_rank_check(src.holder.level, 3)) return
|
||||
var/new_name = copytext(sanitize(input(usr,"What would you like to name this mob?","Input a name",M.real_name) as text|null),1,MAX_NAME_LEN)
|
||||
if( !new_name || !M ) return
|
||||
|
||||
@@ -473,6 +474,7 @@ client
|
||||
return
|
||||
if(!src.holder)
|
||||
return
|
||||
if(!admin_rank_check(src.holder.level, 3)) return
|
||||
src.give_spell(MOB)
|
||||
href_list["datumrefresh"] = href_list["give_spell"]
|
||||
else if (href_list["ninja"])
|
||||
@@ -485,6 +487,7 @@ client
|
||||
return
|
||||
if(!src.holder)
|
||||
return
|
||||
if(!admin_rank_check(src.holder.level, 3)) return
|
||||
src.cmd_admin_ninjafy(MOB)
|
||||
href_list["datumrefresh"] = href_list["ninja"]
|
||||
else if (href_list["godmode"])
|
||||
@@ -497,6 +500,7 @@ client
|
||||
return
|
||||
if(!src.holder)
|
||||
return
|
||||
if(!admin_rank_check(src.holder.level, 3)) return
|
||||
src.cmd_admin_godmode(MOB)
|
||||
href_list["datumrefresh"] = href_list["godmode"]
|
||||
else if (href_list["gib"])
|
||||
@@ -509,6 +513,7 @@ client
|
||||
return
|
||||
if(!src.holder)
|
||||
return
|
||||
if(!admin_rank_check(src.holder.level, 3)) return
|
||||
src.cmd_admin_gib(MOB)
|
||||
|
||||
else if (href_list["build_mode"])
|
||||
@@ -521,6 +526,7 @@ client
|
||||
return
|
||||
if(!src.holder)
|
||||
return
|
||||
if(!admin_rank_check(src.holder.level, 3)) return
|
||||
togglebuildmode(MOB)
|
||||
href_list["datumrefresh"] = href_list["build_mode"]
|
||||
|
||||
@@ -536,6 +542,7 @@ client
|
||||
return
|
||||
|
||||
if(usr.client)
|
||||
if(!admin_rank_check(src.holder.level, 3)) return
|
||||
usr.client.cmd_admin_drop_everything(MOB)
|
||||
|
||||
else if (href_list["direct_control"])
|
||||
@@ -550,6 +557,7 @@ client
|
||||
return
|
||||
|
||||
if(usr.client)
|
||||
if(!admin_rank_check(src.holder.level, 3)) return
|
||||
usr.client.cmd_assume_direct_control(MOB)
|
||||
|
||||
else if (href_list["make_skeleton"])
|
||||
@@ -564,6 +572,7 @@ client
|
||||
return
|
||||
|
||||
if(ishuman(MOB))
|
||||
if(!admin_rank_check(src.holder.level, 3)) return
|
||||
var/mob/living/carbon/human/HUMANMOB = MOB
|
||||
HUMANMOB.makeSkeleton()
|
||||
|
||||
@@ -571,6 +580,7 @@ client
|
||||
if(!href_list["delall"])
|
||||
return
|
||||
var/atom/A = locate(href_list["delall"])
|
||||
if(!admin_rank_check(src.holder.level, 3)) return
|
||||
if(!A)
|
||||
return
|
||||
if(!isobj(A))
|
||||
@@ -617,6 +627,7 @@ client
|
||||
return
|
||||
if(!isobj(A) && !ismob(A) && !isturf(A))
|
||||
return
|
||||
if(!admin_rank_check(src.holder.level, 3)) return
|
||||
src.cmd_admin_explosion(A)
|
||||
href_list["datumrefresh"] = href_list["explode"]
|
||||
else if (href_list["emp"])
|
||||
@@ -627,6 +638,7 @@ client
|
||||
return
|
||||
if(!isobj(A) && !ismob(A) && !isturf(A))
|
||||
return
|
||||
if(!admin_rank_check(src.holder.level, 3)) return
|
||||
src.cmd_admin_emp(A)
|
||||
href_list["datumrefresh"] = href_list["emp"]
|
||||
else if (href_list["mark_object"])
|
||||
@@ -637,9 +649,11 @@ client
|
||||
return
|
||||
if(!src.holder)
|
||||
return
|
||||
if(!admin_rank_check(src.holder.level, 3)) return
|
||||
src.holder.marked_datum = D
|
||||
href_list["datumrefresh"] = href_list["mark_object"]
|
||||
else if (href_list["rotatedatum"])
|
||||
if(!admin_rank_check(src.holder.level, 3)) return
|
||||
if(!href_list["rotatedir"])
|
||||
return
|
||||
var/atom/A = locate(href_list["rotatedatum"])
|
||||
@@ -660,6 +674,7 @@ client
|
||||
var/mob/M = locate(href_list["makemonkey"])
|
||||
if(!M)
|
||||
return
|
||||
if(!admin_rank_check(src.holder.level, 3)) return
|
||||
if(!ishuman(M))
|
||||
usr << "This can only be done to objects of type /mob/living/carbon/human"
|
||||
return
|
||||
@@ -677,6 +692,7 @@ client
|
||||
var/mob/M = locate(href_list["makerobot"])
|
||||
if(!M)
|
||||
return
|
||||
if(!admin_rank_check(src.holder.level, 3)) return
|
||||
if(!ishuman(M))
|
||||
usr << "This can only be done to objects of type /mob/living/carbon/human"
|
||||
return
|
||||
@@ -694,6 +710,7 @@ client
|
||||
var/mob/M = locate(href_list["makealien"])
|
||||
if(!M)
|
||||
return
|
||||
if(!admin_rank_check(src.holder.level, 3)) return
|
||||
if(!ishuman(M))
|
||||
usr << "This can only be done to objects of type /mob/living/carbon/human"
|
||||
return
|
||||
@@ -711,6 +728,7 @@ client
|
||||
var/mob/M = locate(href_list["makemetroid"])
|
||||
if(!M)
|
||||
return
|
||||
if(!admin_rank_check(src.holder.level, 3)) return
|
||||
if(!ishuman(M))
|
||||
usr << "This can only be done to objects of type /mob/living/carbon/human"
|
||||
return
|
||||
@@ -728,6 +746,7 @@ client
|
||||
var/mob/M = locate(href_list["makeai"])
|
||||
if(!M)
|
||||
return
|
||||
if(!admin_rank_check(src.holder.level, 3)) return
|
||||
if(!ishuman(M))
|
||||
usr << "This can only be done to objects of type /mob/living/carbon/human"
|
||||
return
|
||||
@@ -743,6 +762,7 @@ client
|
||||
holder.Topic(href, list("makeai"=href_list["makeai"]))
|
||||
else if (href_list["setmutantrace"])
|
||||
var/mob/living/carbon/human/H = locate(href_list["setmutantrace"])
|
||||
if(!admin_rank_check(src.holder.level, 3)) return
|
||||
if(!istype(H))
|
||||
usr << "This can only be done to objects of type /mob/living/carbon/human"
|
||||
return
|
||||
@@ -761,6 +781,7 @@ client
|
||||
H.update_mutantrace()
|
||||
else if (href_list["regenerateicons"])
|
||||
var/mob/M = locate(href_list["regenerateicons"])
|
||||
if(!admin_rank_check(src.holder.level, 3)) return
|
||||
if(!istype(M))
|
||||
usr << "This can only be done to objects of type /mob"
|
||||
return
|
||||
@@ -775,6 +796,8 @@ client
|
||||
if(!isliving(M)) return
|
||||
var/mob/living/L = M
|
||||
|
||||
if(!admin_rank_check(src.holder.level, 3)) return
|
||||
|
||||
var/amount = input("Deal how much damage to mob? (Negative values here heal)","Adjust [Text]loss",0) as num
|
||||
if(Text == "brute")
|
||||
L.adjustBruteLoss(amount)
|
||||
|
||||
@@ -43,6 +43,7 @@ to null does not delete the object itself. Thank you.
|
||||
var/severity = null//severity descr
|
||||
var/longevity = 250//time in "ticks" the virus stays in inanimate object (blood stains, corpses, etc). In syringes, bottles and beakers it stays infinitely.
|
||||
var/list/hidden = list(0, 0)
|
||||
var/can_carry = 1 // If the disease allows "carriers".
|
||||
// if hidden[1] is true, then virus is hidden from medical scanners
|
||||
// if hidden[2] is true, then virus is hidden from PANDEMIC machine
|
||||
|
||||
|
||||
@@ -37,7 +37,8 @@
|
||||
cure_id = list("lexorin","toxin","gargleblaster")
|
||||
cure_chance = 20
|
||||
affected_species = list("Human", "Monkey")
|
||||
permeability_mod = 3//likely to infect
|
||||
permeability_mod = 15//likely to infect
|
||||
can_carry = 0
|
||||
var/gibbed = 0
|
||||
|
||||
/datum/disease/alien_embryo/stage_act()
|
||||
@@ -79,14 +80,17 @@
|
||||
affected_mob << "\red You feel something tearing its way out of your stomach..."
|
||||
affected_mob.adjustToxLoss(10)
|
||||
affected_mob.updatehealth()
|
||||
if(prob(40))
|
||||
if(prob(50))
|
||||
if(gibbed != 0) return 0
|
||||
var/list/candidates = list() //List of candidate KEYS to assume control of the new larva ~Carn
|
||||
for(var/mob/dead/observer/G in player_list)
|
||||
if(G.client.be_alien)
|
||||
if(((G.client.inactivity/10)/60) <= 5)
|
||||
if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD))
|
||||
candidates += G.key
|
||||
var/i = 0
|
||||
while(candidates.len <= 0 && i < 5)
|
||||
for(var/mob/dead/observer/G in player_list)
|
||||
if(G.client.be_alien)
|
||||
if(((G.client.inactivity/10)/60) <= ALIEN_SELECT_AFK_BUFFER + i) // the most active players are more likely to become an alien
|
||||
if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD))
|
||||
candidates += G.key
|
||||
i++
|
||||
|
||||
var/mob/living/carbon/alien/larva/new_xeno = new(affected_mob.loc)
|
||||
if(candidates.len)
|
||||
|
||||
@@ -342,6 +342,10 @@ datum/mind
|
||||
log_admin("[key_name(usr)] tried to access [current]'s mind without authorization.")
|
||||
return
|
||||
|
||||
if (!(usr.client.holder.rank in list("Trial Admin", "Badmin", "Game Admin", "Game Master")))
|
||||
alert("You cannot perform this action. You must be of a higher administrative rank!")
|
||||
return
|
||||
|
||||
if (href_list["role_edit"])
|
||||
var/new_role = input("Select new role", "Assigned role", assigned_role) as null|anything in get_all_jobs()
|
||||
if (!new_role) return
|
||||
|
||||
@@ -243,44 +243,6 @@
|
||||
anchored = 1
|
||||
unacidable = 1//temporary until I decide whether the borg can be removed. -veyveyr
|
||||
|
||||
|
||||
// Basically this Metroid Core catalyzes reactions that normally wouldn't happen anywhere
|
||||
/obj/item/metroid_core
|
||||
name = "roro core"
|
||||
desc = "A very slimy and tender part of a Rorobeast. Legends claim these to have \"magical powers\"."
|
||||
icon = 'icons/obj/surgery.dmi'
|
||||
icon_state = "roro core"
|
||||
flags = TABLEPASS
|
||||
force = 1.0
|
||||
w_class = 1.0
|
||||
throwforce = 1.0
|
||||
throw_speed = 3
|
||||
throw_range = 6
|
||||
origin_tech = "biotech=4"
|
||||
var/POWERFLAG = 0 // sshhhhhhh
|
||||
var/Flush = 30
|
||||
var/Uses = 5 // uses before it goes inert
|
||||
|
||||
New()
|
||||
..()
|
||||
var/datum/reagents/R = new/datum/reagents(100)
|
||||
reagents = R
|
||||
R.my_atom = src
|
||||
POWERFLAG = rand(1,10)
|
||||
Uses = rand(7, 25)
|
||||
//flags |= NOREACT
|
||||
|
||||
spawn()
|
||||
Life()
|
||||
|
||||
proc/Life()
|
||||
while(src)
|
||||
sleep(25)
|
||||
Flush--
|
||||
if(Flush <= 0)
|
||||
reagents.clear_reagents()
|
||||
Flush = 30
|
||||
|
||||
/obj/effect/deskclutter
|
||||
name = "desk clutter"
|
||||
icon = 'icons/obj/items.dmi'
|
||||
|
||||
@@ -41,19 +41,6 @@
|
||||
idle_power_usage = 10
|
||||
active_power_usage = 100
|
||||
|
||||
/obj/machinery/dispenser
|
||||
name = "tank storage unit"
|
||||
desc = "A simple yet bulky one-way storage device for gas tanks. Holds 10 plasma and 10 oxygen tanks."
|
||||
icon = 'icons/obj/objects.dmi'
|
||||
icon_state = "dispenser"
|
||||
density = 1
|
||||
var/o2tanks = 10.0
|
||||
var/pltanks = 10.0
|
||||
anchored = 1.0
|
||||
use_power = 1
|
||||
idle_power_usage = 5
|
||||
active_power_usage = 10
|
||||
|
||||
/obj/machinery/dna_scanner
|
||||
name = "\improper DNA scanner/implanter"
|
||||
desc = "It scans DNA structures."
|
||||
|
||||
@@ -180,11 +180,6 @@
|
||||
icon_state = "satchel-cap"
|
||||
item_state = "captainpack"
|
||||
|
||||
/obj/item/weapon/storage/backpack/bandolier
|
||||
name = "bandolier"
|
||||
desc = "It's a very old bandolier to wear on your back."
|
||||
icon_state = "bandolier"
|
||||
|
||||
/obj/item/weapon/storage/backpack/industrial
|
||||
name = "industrial backpack"
|
||||
desc = "It's a tough backpack for the daily grind of station life."
|
||||
|
||||
@@ -504,83 +504,6 @@
|
||||
desc = "An untrustworthy bar of soap. Smells of fear."
|
||||
icon_state = "soapsyndie"
|
||||
|
||||
/obj/item/weapon/bedsheet
|
||||
name = "bedsheet"
|
||||
desc = "Nice, linen, bedsheet. Perfect to put on."
|
||||
icon = 'icons/obj/items.dmi'
|
||||
icon_state = "sheet"
|
||||
layer = 4.0
|
||||
item_state = "bedsheet"
|
||||
throwforce = 1
|
||||
w_class = 1.0
|
||||
throw_speed = 2
|
||||
throw_range = 10
|
||||
color = "white"
|
||||
|
||||
/obj/item/weapon/bedsheet/blue
|
||||
icon_state = "sheetblue"
|
||||
color = "blue"
|
||||
|
||||
/obj/item/weapon/bedsheet/green
|
||||
icon_state = "sheetgreen"
|
||||
color = "green"
|
||||
|
||||
/obj/item/weapon/bedsheet/orange
|
||||
icon_state = "sheetorange"
|
||||
color = "orange"
|
||||
|
||||
/obj/item/weapon/bedsheet/purple
|
||||
icon_state = "sheetpurple"
|
||||
color = "purple"
|
||||
|
||||
/obj/item/weapon/bedsheet/rainbow
|
||||
icon_state = "sheetrainbow"
|
||||
color = "rainbow"
|
||||
|
||||
/obj/item/weapon/bedsheet/red
|
||||
icon_state = "sheetred"
|
||||
color = "red"
|
||||
|
||||
/obj/item/weapon/bedsheet/yellow
|
||||
icon_state = "sheetyellow"
|
||||
color = "yellow"
|
||||
|
||||
/obj/item/weapon/bedsheet/mime
|
||||
icon_state = "sheetmime"
|
||||
color = "mime"
|
||||
|
||||
/obj/item/weapon/bedsheet/clown
|
||||
icon_state = "sheetclown"
|
||||
color = "clown"
|
||||
|
||||
/obj/item/weapon/bedsheet/captain
|
||||
icon_state = "sheetcaptain"
|
||||
color = "captain"
|
||||
|
||||
/obj/item/weapon/bedsheet/rd
|
||||
icon_state = "sheetrd"
|
||||
color = "director"
|
||||
|
||||
/obj/item/weapon/bedsheet/medical
|
||||
icon_state = "sheetmedical"
|
||||
color = "medical"
|
||||
|
||||
/obj/item/weapon/bedsheet/hos
|
||||
icon_state = "sheethos"
|
||||
color = "hosred"
|
||||
|
||||
/obj/item/weapon/bedsheet/hop
|
||||
icon_state = "sheethop"
|
||||
color = "hop"
|
||||
|
||||
/obj/item/weapon/bedsheet/ce
|
||||
icon_state = "sheetce"
|
||||
color = "chief"
|
||||
|
||||
/obj/item/weapon/bedsheet/brown
|
||||
icon_state = "sheetbrown"
|
||||
color = "brown"
|
||||
|
||||
/obj/item/weapon/bikehorn
|
||||
name = "bike horn"
|
||||
desc = "A horn off of a bicycle."
|
||||
|
||||
@@ -196,7 +196,7 @@
|
||||
// This is usually for headsets, which only the wearer can hear.
|
||||
if(R.canhear_range == 0)
|
||||
if(ismob(R.loc))
|
||||
. += R.loc
|
||||
. |= R.loc
|
||||
continue
|
||||
|
||||
var/turf/speaker = get_turf(R)
|
||||
|
||||
@@ -1466,6 +1466,63 @@ proc/process_ghost_teleport_locs()
|
||||
name = "\improper Nanotrasen Cruiser"
|
||||
icon_state = "away"
|
||||
requires_power = 0
|
||||
|
||||
/area/awaymission/beach
|
||||
name = "Beach"
|
||||
icon_state = "null"
|
||||
luminosity = 1
|
||||
lighting_use_dynamic = 0
|
||||
requires_power = 0
|
||||
var/sound/mysound = null
|
||||
|
||||
New()
|
||||
..()
|
||||
var/sound/S = new/sound()
|
||||
mysound = S
|
||||
S.file = 'sound/ambience/shore.ogg'
|
||||
S.repeat = 1
|
||||
S.wait = 0
|
||||
S.channel = 123
|
||||
S.volume = 100
|
||||
S.priority = 255
|
||||
S.status = SOUND_UPDATE
|
||||
process()
|
||||
|
||||
Entered(atom/movable/Obj,atom/OldLoc)
|
||||
if(ismob(Obj))
|
||||
if(Obj:client)
|
||||
mysound.status = SOUND_UPDATE
|
||||
Obj << mysound
|
||||
return
|
||||
|
||||
Exited(atom/movable/Obj)
|
||||
if(ismob(Obj))
|
||||
if(Obj:client)
|
||||
mysound.status = SOUND_PAUSED | SOUND_UPDATE
|
||||
Obj << mysound
|
||||
|
||||
proc/process()
|
||||
set background = 1
|
||||
|
||||
var/sound/S = null
|
||||
var/sound_delay = 0
|
||||
if(prob(25))
|
||||
S = sound(file=pick('sound/ambience/seag1.ogg','sound/ambience/seag2.ogg','sound/ambience/seag3.ogg'), volume=100)
|
||||
sound_delay = rand(0, 50)
|
||||
|
||||
for(var/mob/living/carbon/human/H in src)
|
||||
if(H.s_tone > -55)
|
||||
H.s_tone--
|
||||
H.update_body()
|
||||
if(H.client)
|
||||
mysound.status = SOUND_UPDATE
|
||||
H << mysound
|
||||
if(S)
|
||||
spawn(sound_delay)
|
||||
H << S
|
||||
|
||||
spawn(60) .()
|
||||
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
/*
|
||||
Lists of areas to be used with is_type_in_list.
|
||||
@@ -1587,3 +1644,4 @@ var/list/the_station_areas = list (
|
||||
H << S
|
||||
|
||||
spawn(60) .()
|
||||
|
||||
|
||||
@@ -215,6 +215,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
|
||||
var/isabsorbing = 0
|
||||
var/geneticpoints = 5
|
||||
var/purchasedpowers = list()
|
||||
var/mimicing = ""
|
||||
|
||||
/datum/changeling/New(var/gender=FEMALE)
|
||||
..()
|
||||
@@ -231,3 +232,12 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
|
||||
/datum/changeling/proc/regenerate()
|
||||
chem_charges = min(max(0, chem_charges+chem_recharge_rate), chem_storage)
|
||||
geneticdamage = max(0, geneticdamage-1)
|
||||
|
||||
|
||||
/datum/changeling/proc/GetDNA(var/dna_owner)
|
||||
var/datum/dna/chosen_dna
|
||||
for(var/datum/dna/DNA in absorbed_dna)
|
||||
if(dna_owner == DNA.real_name)
|
||||
chosen_dna = DNA
|
||||
break
|
||||
return chosen_dna
|
||||
@@ -174,12 +174,7 @@
|
||||
var/S = input("Select the target DNA: ", "Target DNA", null) as null|anything in names
|
||||
if(!S) return
|
||||
|
||||
var/datum/dna/chosen_dna
|
||||
for(var/datum/dna/DNA in changeling.absorbed_dna)
|
||||
if(S == "[DNA.real_name]")
|
||||
chosen_dna = DNA
|
||||
break
|
||||
|
||||
var/datum/dna/chosen_dna = changeling.GetDNA(S)
|
||||
if(!chosen_dna)
|
||||
return
|
||||
|
||||
@@ -277,12 +272,7 @@
|
||||
var/S = input("Select the target DNA: ", "Target DNA", null) as null|anything in names
|
||||
if(!S) return
|
||||
|
||||
var/datum/dna/chosen_dna
|
||||
for(var/datum/dna/DNA in changeling.absorbed_dna)
|
||||
if(S == "[DNA.real_name]")
|
||||
chosen_dna = DNA
|
||||
break
|
||||
|
||||
var/datum/dna/chosen_dna = changeling.GetDNA(S)
|
||||
if(!chosen_dna)
|
||||
return
|
||||
|
||||
@@ -500,6 +490,102 @@
|
||||
feedback_add_details("changeling_powers","RR")
|
||||
return 1
|
||||
|
||||
// HIVE MIND UPLOAD/DOWNLOAD DNA
|
||||
|
||||
var/list/datum/dna/hivemind_bank = list()
|
||||
|
||||
/mob/proc/changeling_hiveupload()
|
||||
set category = "Changeling"
|
||||
set name = "Hive Channel (10)"
|
||||
set desc = "Allows you to channel DNA in the airwaves to allow other changelings to absorb it."
|
||||
|
||||
var/datum/changeling/changeling = changeling_power(10,1)
|
||||
if(!changeling) return
|
||||
|
||||
var/list/names = list()
|
||||
for(var/datum/dna/DNA in changeling.absorbed_dna)
|
||||
if(!(DNA in hivemind_bank))
|
||||
names += DNA.real_name
|
||||
|
||||
if(names.len <= 0)
|
||||
usr << "<span class='notice'>The airwaves already have all of our DNA.</span>"
|
||||
return
|
||||
|
||||
var/S = input("Select a DNA to channel: ", "Channel DNA", null) as null|anything in names
|
||||
if(!S) return
|
||||
|
||||
var/datum/dna/chosen_dna = changeling.GetDNA(S)
|
||||
if(!chosen_dna)
|
||||
return
|
||||
|
||||
changeling.chem_charges -= 10
|
||||
hivemind_bank += chosen_dna
|
||||
usr << "<span class='notice'>We channel the DNA of [S] to the air.</span>"
|
||||
feedback_add_details("changeling_powers","HU")
|
||||
return 1
|
||||
|
||||
/mob/proc/changeling_hivedownload()
|
||||
set category = "Changeling"
|
||||
set name = "Hive Absorb (40)"
|
||||
set desc = "Allows you to absorb DNA that is being channeled in the airwaves."
|
||||
|
||||
var/datum/changeling/changeling = changeling_power(40,1)
|
||||
if(!changeling) return
|
||||
|
||||
var/list/names = list()
|
||||
for(var/datum/dna/DNA in hivemind_bank)
|
||||
if(!(DNA in changeling.absorbed_dna))
|
||||
names[DNA.real_name] = DNA
|
||||
|
||||
if(names.len <= 0)
|
||||
usr << "<span class='notice'>There's no new DNA to absorb from the air.</span>"
|
||||
return
|
||||
|
||||
var/S = input("Select a DNA absorb from the air: ", "Absorb DNA", null) as null|anything in names
|
||||
if(!S) return
|
||||
var/datum/dna/chosen_dna = names[S]
|
||||
if(!chosen_dna)
|
||||
return
|
||||
|
||||
changeling.chem_charges -= 40
|
||||
changeling.absorbed_dna += chosen_dna
|
||||
usr << "<span class='notice'>We absorb the DNA of [S] from the air.</span>"
|
||||
feedback_add_details("changeling_powers","HD")
|
||||
return 1
|
||||
|
||||
// Fake Voice
|
||||
|
||||
/mob/proc/changeling_mimicvoice()
|
||||
set category = "Changeling"
|
||||
set name = "Mimic Voice (10)"
|
||||
set desc = "Shape our vocal glands to form a voice of someone we choose."
|
||||
|
||||
var/datum/changeling/changeling = changeling_power(10,1)
|
||||
if(!changeling) return
|
||||
|
||||
if(changeling.mimicing)
|
||||
changeling.mimicing = ""
|
||||
usr << "<span class='notice'>We return our vocal glands to their original location.</span>"
|
||||
return
|
||||
|
||||
var/mimic_voice = input("Enter a name to mimic.", "Mimic Voice", null) as text
|
||||
if(!mimic_voice)
|
||||
return
|
||||
|
||||
changeling.chem_charges -= 10
|
||||
changeling.mimicing = mimic_voice
|
||||
|
||||
usr << "<span class='notice'>We shape our glands to take the voice of <b>[mimic_voice]</b>, this will stop us from regenerating chemicals while active.</span>"
|
||||
usr << "<span class='notice'>Use this power again to return to our original voice and reproduce chemicals again.</span>"
|
||||
|
||||
feedback_add_details("changeling_powers","MV")
|
||||
|
||||
spawn(0)
|
||||
while(src && src.mind && src.mind.changeling && src.mind.changeling.mimicing)
|
||||
src.mind.changeling.chem_charges -= 1
|
||||
sleep(40)
|
||||
if(src && src.mind && src.mind.changeling)
|
||||
src.mind.changeling.mimicing = ""
|
||||
//////////
|
||||
//STINGS// //They get a pretty header because there's just so fucking many of them ;_;
|
||||
//////////
|
||||
@@ -617,12 +703,7 @@
|
||||
var/S = input("Select the target DNA: ", "Target DNA", null) as null|anything in names
|
||||
if(!S) return
|
||||
|
||||
var/datum/dna/chosen_dna
|
||||
for(var/datum/dna/DNA in changeling.absorbed_dna)
|
||||
if(S == "[DNA.real_name]")
|
||||
chosen_dna = DNA
|
||||
break
|
||||
|
||||
var/datum/dna/chosen_dna = changeling.GetDNA(S)
|
||||
if(!chosen_dna)
|
||||
return
|
||||
|
||||
@@ -666,3 +747,23 @@
|
||||
if(T.reagents) T.reagents.add_reagent("lexorin", 40)
|
||||
feedback_add_details("changeling_powers","DTHS")
|
||||
return 1
|
||||
|
||||
/mob/proc/changeling_extract_dna_sting()
|
||||
set category = "Changeling"
|
||||
set name = "Extract DNA Sting (40)"
|
||||
set desc="Stealthily sting a target to extract their DNA."
|
||||
|
||||
var/datum/changeling/changeling = null
|
||||
if(usr.mind && usr.mind.changeling)
|
||||
changeling = usr.mind.changeling
|
||||
if(!changeling)
|
||||
return 0
|
||||
|
||||
var/mob/living/carbon/T = changeling_sting(40, /mob/proc/changeling_extract_dna_sting)
|
||||
if(!T) return 0
|
||||
|
||||
T.dna.real_name = T.real_name
|
||||
changeling.absorbed_dna |= T.dna
|
||||
|
||||
feedback_add_details("changeling_powers","ED")
|
||||
return 1
|
||||
@@ -1,3 +1,4 @@
|
||||
// READ: Don't use the apostrophe in name or desc. Causes script errors.
|
||||
|
||||
var/list/powers = typesof(/datum/power/changeling) - /datum/power/changeling //needed for the badmin verb for now
|
||||
var/list/datum/power/changeling/powerinstances = list()
|
||||
@@ -33,6 +34,22 @@ var/list/datum/power/changeling/powerinstances = list()
|
||||
allowduringlesserform = 1
|
||||
verbpath = /mob/proc/changeling_fakedeath
|
||||
|
||||
// Hivemind
|
||||
|
||||
/datum/power/changeling/hive_upload
|
||||
name = "Hive Channel"
|
||||
desc = "We can channel a DNA into the airwaves, allowing our fellow changelings to absorb it and transform into it as if they acquired the DNA themselves."
|
||||
helptext = "Allows other changelings to absorb the DNA you channel from the airwaves. Will not help them towards their absorb objectives."
|
||||
genomecost = 0
|
||||
verbpath = /mob/proc/changeling_hiveupload
|
||||
|
||||
/datum/power/changeling/hive_download
|
||||
name = "Hive Absorb"
|
||||
desc = "We can absorb a single DNA from the airwaves, allowing us to use more disguises with help from our fellow changelings."
|
||||
helptext = "Allows you to absorb a single DNA and use it. Does not count towards your absorb objective."
|
||||
genomecost = 0
|
||||
verbpath = /mob/proc/changeling_hivedownload
|
||||
|
||||
/datum/power/changeling/lesser_form
|
||||
name = "Lesser Form"
|
||||
desc = "We debase ourselves and become lesser. We become a monkey."
|
||||
@@ -61,6 +78,21 @@ var/list/datum/power/changeling/powerinstances = list()
|
||||
allowduringlesserform = 1
|
||||
verbpath = /mob/proc/changeling_silence_sting
|
||||
|
||||
/datum/power/changeling/mimicvoice
|
||||
name = "Mimic Voice"
|
||||
desc = "We shape our vocal glands to sound like a desired voice."
|
||||
helptext = "Will turn your voice into the name that you enter."
|
||||
genomecost = 3
|
||||
verbpath = /mob/proc/changeling_mimicvoice
|
||||
|
||||
/datum/power/changeling/extractdna
|
||||
name = "Extract DNA"
|
||||
desc = "We stealthily sting a target and extract the DNA from them."
|
||||
helptext = "Will give you the DNA of your target, allowing you to transform into them. Does not count towards absorb objectives."
|
||||
genomecost = 4
|
||||
allowduringlesserform = 1
|
||||
verbpath = /mob/proc/changeling_extract_dna_sting
|
||||
|
||||
/datum/power/changeling/transformation_sting
|
||||
name = "Transformation Sting"
|
||||
desc = "We silently sting a human, injecting a retrovirus that forces them to transform into another."
|
||||
@@ -135,7 +167,7 @@ var/list/datum/power/changeling/powerinstances = list()
|
||||
name = "Digital Camoflauge"
|
||||
desc = "We evolve the ability to distort our form and proprtions, defeating common altgorthms used to detect lifeforms on cameras."
|
||||
helptext = "We cannot be tracked by camera while using this skill. However, humans looking at us will find us.. uncanny. We must constantly expend chemicals to maintain our form like this."
|
||||
genomecost = 4
|
||||
genomecost = 3
|
||||
allowduringlesserform = 1
|
||||
verbpath = /mob/proc/changeling_digitalcamo
|
||||
|
||||
@@ -147,6 +179,7 @@ var/list/datum/power/changeling/powerinstances = list()
|
||||
verbpath = /mob/proc/changeling_rapidregen
|
||||
|
||||
|
||||
|
||||
// Modularchangling, totally stolen from the new player panel. YAYY
|
||||
/datum/changeling/proc/EvolutionMenu()//The new one
|
||||
set category = "Changeling"
|
||||
|
||||
@@ -109,6 +109,7 @@ var/list/sacrificed = list()
|
||||
"\red You hear an anguished scream.")
|
||||
if(is_convertable_to_cult(M.mind))
|
||||
ticker.mode.add_cultist(M.mind)
|
||||
M.mind.special_role = "Cultist"
|
||||
M << "<font color=\"purple\"><b><i>Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root.</b></i></font>"
|
||||
M << "<font color=\"purple\"><b><i>Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back.</b></i></font>"
|
||||
return 1
|
||||
@@ -130,7 +131,7 @@ var/list/sacrificed = list()
|
||||
M.say("Tok-lyr rqa'nap g[pick("'","`")]lt-ulotf!")
|
||||
cultist_count += 1
|
||||
if(cultist_count >= 9)
|
||||
new /obj/machinery/singularity/narsie(src.loc)
|
||||
new /obj/machinery/singularity/narsie/large(src.loc)
|
||||
if(ticker.mode.name == "cult")
|
||||
ticker.mode:eldergod = 0
|
||||
return
|
||||
@@ -390,6 +391,7 @@ var/list/sacrificed = list()
|
||||
else
|
||||
ticker.mode.cult+=D.mind
|
||||
|
||||
D.mind.special_role = "Cultist"
|
||||
D << "<font color=\"purple\"><b><i>Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root.</b></i></font>"
|
||||
D << "<font color=\"purple\"><b><i>Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back.</b></i></font>"
|
||||
|
||||
|
||||
@@ -36,13 +36,13 @@
|
||||
meteor_wave()
|
||||
spawn_meteors()
|
||||
|
||||
/*if(2)
|
||||
if(2)
|
||||
command_alert("Gravitational anomalies detected on the station. There is no additional data.", "Anomaly Alert")
|
||||
world << sound('sound/AI/granomalies.ogg')
|
||||
var/turf/T = pick(blobstart)
|
||||
var/obj/effect/bhole/bh = new /obj/effect/bhole( T.loc, 30 )
|
||||
spawn(rand(50, 300))
|
||||
del(bh)*/
|
||||
del(bh)
|
||||
/*
|
||||
if(3) //Leaving the code in so someone can try and delag it, but this event can no longer occur randomly, per SoS's request. --NEO
|
||||
command_alert("Space-time anomalies detected on the station. There is no additional data.", "Anomaly Alert")
|
||||
@@ -270,11 +270,14 @@
|
||||
vents += temp_vent
|
||||
|
||||
var/list/candidates = list() //List of candidate KEYs to control the new larvae. ~Carn
|
||||
for(var/mob/dead/observer/G in player_list)
|
||||
if(G.client.be_alien)
|
||||
if(((G.client.inactivity/10)/60) <= 5)
|
||||
if(!(G.mind && G.mind.current && G.mind.current != DEAD))
|
||||
candidates += G.key
|
||||
var/i = 0
|
||||
while(candidates.len <= 0 && i < 5)
|
||||
for(var/mob/dead/observer/G in player_list)
|
||||
if(G.client.be_alien)
|
||||
if(((G.client.inactivity/10)/60) <= ALIEN_SELECT_AFK_BUFFER + i) // the most active players are more likely to become an alien
|
||||
if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD))
|
||||
candidates += G.key
|
||||
i++
|
||||
|
||||
if(prob(33)) spawncount++ //sometimes, have two larvae spawn instead of one
|
||||
while((spawncount >= 1) && vents.len && candidates.len)
|
||||
@@ -357,9 +360,7 @@
|
||||
temp_timer.releasetime = 1
|
||||
|
||||
sleep(150)
|
||||
//command_alert("Gr3y.T1d3 virus detected in [station_name()] imprisonment subroutines. Recommend station AI involvement.", "Security Alert")
|
||||
var/virusname = pick("Kietz","NT-OS EliteUltimatePro Edition","Selbstreproduktion","VAX11/750","Ghostball","Crazy Tuesday") + pick(" malware"," trojan", " virus", " rootkit", " backdoor", " worm")
|
||||
command_alert("[virusname] detected in [station_name()] access subroutines. Recommend station AI involvement.", "Security Alert")
|
||||
command_alert("Gr3y.T1d3 virus detected in [station_name()] imprisonment subroutines. Recommend station AI involvement.", "Security Alert")
|
||||
else
|
||||
world.log << "ERROR: Could not initate grey-tide. Unable find prison or brig area."
|
||||
|
||||
@@ -526,4 +527,5 @@ Would like to add a law like "Law x is _______" where x = a number, and _____ is
|
||||
world << "Finished processing FIREDOORS. Processed: [firedoornum]"
|
||||
|
||||
world << "Ion Storm Main Done"
|
||||
|
||||
*/
|
||||
@@ -124,7 +124,7 @@ var/global/datum/controller/gameticker/ticker
|
||||
if (S.name != "AI")
|
||||
del(S)
|
||||
world << "<FONT color='blue'><B>Enjoy the game!</B></FONT>"
|
||||
// world << sound('sound/AI/welcome.ogg') // Skie
|
||||
world << sound('sound/AI/welcome.ogg') // Skie
|
||||
//Holiday Round-start stuff ~Carn
|
||||
Holiday_Game_Start()
|
||||
|
||||
|
||||
@@ -31,6 +31,16 @@
|
||||
src.attack_hand(M)
|
||||
return
|
||||
|
||||
/obj/machinery/nuclearbomb/attackby(obj/item/weapon/I as obj, mob/user as mob)
|
||||
if (src.extended)
|
||||
if (istype(I, /obj/item/weapon/disk/nuclear))
|
||||
usr.drop_item()
|
||||
I.loc = src
|
||||
src.auth = I
|
||||
src.add_fingerprint(user)
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/machinery/nuclearbomb/attack_paw(mob/user as mob)
|
||||
return src.attack_hand(user)
|
||||
|
||||
|
||||
@@ -8,90 +8,98 @@ obj/machinery/door/airlock
|
||||
var/datum/radio_frequency/radio_connection
|
||||
explosion_resistance = 15
|
||||
|
||||
receive_signal(datum/signal/signal)
|
||||
if(!signal || signal.encryption) return
|
||||
|
||||
if(id_tag != signal.data["tag"] || !signal.data["command"]) return
|
||||
obj/machinery/door/airlock/receive_signal(datum/signal/signal)
|
||||
if(!signal || signal.encryption) return
|
||||
|
||||
switch(signal.data["command"])
|
||||
if("open")
|
||||
spawn open(1)
|
||||
if(id_tag != signal.data["tag"] || !signal.data["command"]) return
|
||||
|
||||
if("close")
|
||||
spawn close(1)
|
||||
switch(signal.data["command"])
|
||||
if("open")
|
||||
open(1)
|
||||
|
||||
if("unlock")
|
||||
locked = 0
|
||||
update_icon()
|
||||
if("close")
|
||||
close(1)
|
||||
|
||||
if("lock")
|
||||
locked = 1
|
||||
update_icon()
|
||||
if("unlock")
|
||||
locked = 0
|
||||
update_icon()
|
||||
|
||||
if("secure_open")
|
||||
spawn
|
||||
locked = 0
|
||||
update_icon()
|
||||
if("lock")
|
||||
locked = 1
|
||||
update_icon()
|
||||
|
||||
sleep(2)
|
||||
open(1)
|
||||
if("secure_open")
|
||||
locked = 0
|
||||
update_icon()
|
||||
|
||||
locked = 1
|
||||
update_icon()
|
||||
sleep(2)
|
||||
open(1)
|
||||
|
||||
if("secure_close")
|
||||
spawn
|
||||
locked = 0
|
||||
close(1)
|
||||
locked = 1
|
||||
update_icon()
|
||||
|
||||
locked = 1
|
||||
sleep(2)
|
||||
update_icon()
|
||||
if("secure_close")
|
||||
locked = 0
|
||||
close(1)
|
||||
|
||||
send_status()
|
||||
locked = 1
|
||||
sleep(2)
|
||||
update_icon()
|
||||
|
||||
proc/send_status()
|
||||
if(radio_connection)
|
||||
var/datum/signal/signal = new
|
||||
signal.transmission_method = 1 //radio signal
|
||||
signal.data["tag"] = id_tag
|
||||
signal.data["timestamp"] = world.time
|
||||
send_status()
|
||||
|
||||
signal.data["door_status"] = density?("closed"):("open")
|
||||
signal.data["lock_status"] = locked?("locked"):("unlocked")
|
||||
|
||||
radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK)
|
||||
obj/machinery/door/airlock/proc/send_status()
|
||||
if(radio_connection)
|
||||
var/datum/signal/signal = new
|
||||
signal.transmission_method = 1 //radio signal
|
||||
signal.data["tag"] = id_tag
|
||||
signal.data["timestamp"] = world.time
|
||||
|
||||
open(surpress_send)
|
||||
. = ..()
|
||||
if(!surpress_send) send_status()
|
||||
signal.data["door_status"] = density?("closed"):("open")
|
||||
signal.data["lock_status"] = locked?("locked"):("unlocked")
|
||||
|
||||
close(surpress_send)
|
||||
. = ..()
|
||||
if(!surpress_send) send_status()
|
||||
radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK)
|
||||
|
||||
proc/set_frequency(new_frequency)
|
||||
radio_controller.remove_object(src, frequency)
|
||||
if(new_frequency)
|
||||
frequency = new_frequency
|
||||
radio_connection = radio_controller.add_object(src, frequency, RADIO_AIRLOCK)
|
||||
|
||||
initialize()
|
||||
if(frequency)
|
||||
set_frequency(frequency)
|
||||
obj/machinery/door/airlock/open(surpress_send)
|
||||
. = ..()
|
||||
if(!surpress_send) send_status()
|
||||
|
||||
|
||||
obj/machinery/door/airlock/close(surpress_send)
|
||||
. = ..()
|
||||
if(!surpress_send) send_status()
|
||||
|
||||
|
||||
obj/machinery/door/airlock/proc/set_frequency(new_frequency)
|
||||
radio_controller.remove_object(src, frequency)
|
||||
if(new_frequency)
|
||||
frequency = new_frequency
|
||||
radio_connection = radio_controller.add_object(src, frequency, RADIO_AIRLOCK)
|
||||
|
||||
|
||||
obj/machinery/door/airlock/initialize()
|
||||
if(frequency)
|
||||
set_frequency(frequency)
|
||||
|
||||
update_icon()
|
||||
|
||||
|
||||
obj/machinery/door/airlock/New()
|
||||
..()
|
||||
|
||||
if(radio_controller)
|
||||
set_frequency(frequency)
|
||||
|
||||
update_icon()
|
||||
|
||||
New()
|
||||
..()
|
||||
|
||||
if(radio_controller)
|
||||
set_frequency(frequency)
|
||||
|
||||
obj/machinery/airlock_sensor
|
||||
icon = 'icons/obj/airlock_machines.dmi'
|
||||
icon_state = "airlock_sensor_off"
|
||||
name = "Airlock Sensor"
|
||||
name = "airlock sensor"
|
||||
|
||||
anchored = 1
|
||||
power_channel = ENVIRON
|
||||
@@ -105,60 +113,64 @@ obj/machinery/airlock_sensor
|
||||
var/on = 1
|
||||
var/alert = 0
|
||||
|
||||
update_icon()
|
||||
if(on)
|
||||
if(alert)
|
||||
icon_state = "airlock_sensor_alert"
|
||||
else
|
||||
icon_state = "airlock_sensor_standby"
|
||||
else
|
||||
icon_state = "airlock_sensor_off"
|
||||
|
||||
attack_hand(mob/user)
|
||||
obj/machinery/airlock_sensor/update_icon()
|
||||
if(on)
|
||||
if(alert)
|
||||
icon_state = "airlock_sensor_alert"
|
||||
else
|
||||
icon_state = "airlock_sensor_standby"
|
||||
else
|
||||
icon_state = "airlock_sensor_off"
|
||||
|
||||
obj/machinery/airlock_sensor/attack_hand(mob/user)
|
||||
var/datum/signal/signal = new
|
||||
signal.transmission_method = 1 //radio signal
|
||||
signal.data["tag"] = master_tag
|
||||
signal.data["command"] = "cycle"
|
||||
|
||||
radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK)
|
||||
flick("airlock_sensor_cycle", src)
|
||||
|
||||
obj/machinery/airlock_sensor/process()
|
||||
if(on)
|
||||
var/datum/signal/signal = new
|
||||
signal.transmission_method = 1 //radio signal
|
||||
signal.data["tag"] = master_tag
|
||||
signal.data["command"] = "cycle"
|
||||
signal.data["tag"] = id_tag
|
||||
signal.data["timestamp"] = world.time
|
||||
|
||||
var/datum/gas_mixture/air_sample = return_air()
|
||||
|
||||
var/pressure = round(air_sample.return_pressure(),0.1)
|
||||
alert = (pressure < ONE_ATMOSPHERE*0.8)
|
||||
|
||||
signal.data["pressure"] = num2text(pressure)
|
||||
|
||||
radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK)
|
||||
flick("airlock_sensor_cycle", src)
|
||||
|
||||
process()
|
||||
if(on)
|
||||
var/datum/signal/signal = new
|
||||
signal.transmission_method = 1 //radio signal
|
||||
signal.data["tag"] = id_tag
|
||||
signal.data["timestamp"] = world.time
|
||||
update_icon()
|
||||
|
||||
var/datum/gas_mixture/air_sample = return_air()
|
||||
obj/machinery/airlock_sensor/proc/set_frequency(new_frequency)
|
||||
radio_controller.remove_object(src, frequency)
|
||||
frequency = new_frequency
|
||||
radio_connection = radio_controller.add_object(src, frequency, RADIO_AIRLOCK)
|
||||
|
||||
var/pressure = round(air_sample.return_pressure(),0.1)
|
||||
alert = (pressure < ONE_ATMOSPHERE*0.8)
|
||||
obj/machinery/airlock_sensor/initialize()
|
||||
set_frequency(frequency)
|
||||
|
||||
signal.data["pressure"] = num2text(pressure)
|
||||
obj/machinery/airlock_sensor/New()
|
||||
..()
|
||||
|
||||
radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK)
|
||||
|
||||
update_icon()
|
||||
|
||||
proc/set_frequency(new_frequency)
|
||||
radio_controller.remove_object(src, frequency)
|
||||
frequency = new_frequency
|
||||
radio_connection = radio_controller.add_object(src, frequency, RADIO_AIRLOCK)
|
||||
|
||||
initialize()
|
||||
if(radio_controller)
|
||||
set_frequency(frequency)
|
||||
|
||||
New()
|
||||
..()
|
||||
|
||||
if(radio_controller)
|
||||
set_frequency(frequency)
|
||||
|
||||
|
||||
obj/machinery/access_button
|
||||
icon = 'icons/obj/airlock_machines.dmi'
|
||||
icon_state = "access_button_standby"
|
||||
name = "Access Button"
|
||||
name = "access button"
|
||||
|
||||
anchored = 1
|
||||
power_channel = ENVIRON
|
||||
@@ -171,37 +183,41 @@ obj/machinery/access_button
|
||||
|
||||
var/on = 1
|
||||
|
||||
update_icon()
|
||||
if(on)
|
||||
icon_state = "access_button_standby"
|
||||
else
|
||||
icon_state = "access_button_off"
|
||||
|
||||
attack_hand(mob/user)
|
||||
src.add_fingerprint(usr)
|
||||
if(!allowed(user))
|
||||
user << "\red Access Denied"
|
||||
obj/machinery/access_button/update_icon()
|
||||
if(on)
|
||||
icon_state = "access_button_standby"
|
||||
else
|
||||
icon_state = "access_button_off"
|
||||
|
||||
else if(radio_connection)
|
||||
var/datum/signal/signal = new
|
||||
signal.transmission_method = 1 //radio signal
|
||||
signal.data["tag"] = master_tag
|
||||
signal.data["command"] = command
|
||||
|
||||
radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK)
|
||||
flick("access_button_cycle", src)
|
||||
obj/machinery/access_button/attack_hand(mob/user)
|
||||
add_fingerprint(usr)
|
||||
if(!allowed(user))
|
||||
user << "\red Access Denied"
|
||||
|
||||
proc
|
||||
set_frequency(new_frequency)
|
||||
radio_controller.remove_object(src, frequency)
|
||||
frequency = new_frequency
|
||||
radio_connection = radio_controller.add_object(src, frequency, RADIO_AIRLOCK)
|
||||
else if(radio_connection)
|
||||
var/datum/signal/signal = new
|
||||
signal.transmission_method = 1 //radio signal
|
||||
signal.data["tag"] = master_tag
|
||||
signal.data["command"] = command
|
||||
|
||||
initialize()
|
||||
radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK)
|
||||
flick("access_button_cycle", src)
|
||||
|
||||
|
||||
obj/machinery/access_button/proc/set_frequency(new_frequency)
|
||||
radio_controller.remove_object(src, frequency)
|
||||
frequency = new_frequency
|
||||
radio_connection = radio_controller.add_object(src, frequency, RADIO_AIRLOCK)
|
||||
|
||||
|
||||
obj/machinery/access_button/initialize()
|
||||
set_frequency(frequency)
|
||||
|
||||
|
||||
obj/machinery/access_button/New()
|
||||
..()
|
||||
|
||||
if(radio_controller)
|
||||
set_frequency(frequency)
|
||||
|
||||
New()
|
||||
..()
|
||||
|
||||
if(radio_controller)
|
||||
set_frequency(frequency)
|
||||
|
||||
@@ -49,7 +49,7 @@
|
||||
/obj/machinery/camera/emp_act(severity)
|
||||
if(!isEmpProof())
|
||||
if(prob(100/severity))
|
||||
icon_state = "cameraemp"
|
||||
icon_state = "[initial(icon_state)]emp"
|
||||
network = null //Not the best way but it will do. I think.
|
||||
cameranet.removeCamera(src)
|
||||
stat |= EMPED
|
||||
@@ -98,7 +98,7 @@
|
||||
for(var/mob/O in viewers(user, null))
|
||||
O.show_message("<span class='warning'>\The [user] slashes at [src]!</span>", 1)
|
||||
playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1)
|
||||
icon_state = "camera1"
|
||||
icon_state = "[initial(icon_state)]1"
|
||||
add_hiddenprint(user)
|
||||
deactivate(user,0)
|
||||
|
||||
@@ -111,6 +111,7 @@
|
||||
panel_open = !panel_open
|
||||
user.visible_message("<span class='warning'>[user] screws the camera's panel [panel_open ? "open" : "closed"]!</span>",
|
||||
"<span class='notice'>You screw the camera's panel [panel_open ? "open" : "closed"].</span>")
|
||||
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
|
||||
|
||||
else if((iswirecutter(W) || ismultitool(W)) && panel_open)
|
||||
interact(user)
|
||||
@@ -183,13 +184,13 @@
|
||||
for(var/mob/O in viewers(user, null))
|
||||
O.show_message(text("\red [] has deactivated []!", user, src), 1)
|
||||
playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1)
|
||||
icon_state = "camera1"
|
||||
icon_state = "[initial(icon_state)]1"
|
||||
add_hiddenprint(user)
|
||||
else
|
||||
for(var/mob/O in viewers(user, null))
|
||||
O.show_message(text("\red [] has reactivated []!", user, src), 1)
|
||||
playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1)
|
||||
icon_state = "camera"
|
||||
icon_state = initial(icon_state)
|
||||
add_hiddenprint(user)
|
||||
// now disconnect anyone using the camera
|
||||
//Apparently, this will disconnect anyone even if the camera was re-activated.
|
||||
@@ -213,18 +214,6 @@
|
||||
for(var/mob/living/silicon/S in mob_list)
|
||||
S.cancelAlarm("Camera", get_area(src), list(src), src)
|
||||
|
||||
/obj/machinery/camera/proc/toggle_panel(var/mob/user)
|
||||
if(busy)
|
||||
return 0
|
||||
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
|
||||
busy = 1
|
||||
if(do_after(user, 30))
|
||||
panel_open = !panel_open
|
||||
busy = 0
|
||||
return 1
|
||||
busy = 0
|
||||
return 0
|
||||
|
||||
/obj/machinery/camera/proc/can_use()
|
||||
if(!status)
|
||||
return 0
|
||||
@@ -296,23 +285,3 @@
|
||||
return 1
|
||||
busy = 0
|
||||
return 0
|
||||
|
||||
|
||||
|
||||
/obj/machinery/camera/autoname
|
||||
var/number = 0 //camera number in area
|
||||
|
||||
//This camera type automatically sets it's name to whatever the area that it's in is called.
|
||||
/obj/machinery/camera/autoname/New()
|
||||
..()
|
||||
spawn(10)
|
||||
number = 1
|
||||
var/area/A = get_area(src)
|
||||
if(A)
|
||||
for(var/obj/machinery/camera/autoname/C in world)
|
||||
if(C == src) continue
|
||||
var/area/CA = get_area(C)
|
||||
if(CA.type == A.type)
|
||||
if(C.number)
|
||||
number = max(number, C.number+1)
|
||||
c_tag = "[A.name] #[number]"
|
||||
@@ -1,23 +1,54 @@
|
||||
// PRESETS
|
||||
|
||||
// EMP
|
||||
|
||||
/obj/machinery/camera/emp_proof/New()
|
||||
..()
|
||||
upgradeEmpProof()
|
||||
|
||||
// X-RAY
|
||||
|
||||
/obj/machinery/camera/xray
|
||||
icon_state = "xraycam" // Thanks to Krutchen for the icons.
|
||||
|
||||
/obj/machinery/camera/xray/New()
|
||||
..()
|
||||
upgradeXRay()
|
||||
|
||||
// MOTION
|
||||
|
||||
/obj/machinery/camera/motion/New()
|
||||
..()
|
||||
upgradeMotion()
|
||||
|
||||
// ALL UPGRADES
|
||||
|
||||
/obj/machinery/camera/all/New()
|
||||
..()
|
||||
upgradeEmpProof()
|
||||
upgradeXRay()
|
||||
upgradeMotion()
|
||||
|
||||
// AUTONAME
|
||||
|
||||
/obj/machinery/camera/autoname
|
||||
var/number = 0 //camera number in area
|
||||
|
||||
//This camera type automatically sets it's name to whatever the area that it's in is called.
|
||||
/obj/machinery/camera/autoname/New()
|
||||
..()
|
||||
spawn(10)
|
||||
number = 1
|
||||
var/area/A = get_area(src)
|
||||
if(A)
|
||||
for(var/obj/machinery/camera/autoname/C in world)
|
||||
if(C == src) continue
|
||||
var/area/CA = get_area(C)
|
||||
if(CA.type == A.type)
|
||||
if(C.number)
|
||||
number = max(number, C.number+1)
|
||||
c_tag = "[A.name] #[number]"
|
||||
|
||||
|
||||
// CHECKS
|
||||
|
||||
|
||||
@@ -1,25 +1,56 @@
|
||||
/mob/living/silicon/ai/proc/ai_camera_list()
|
||||
/mob/living/silicon/ai/proc/get_camera_list()
|
||||
|
||||
if(src.stat == 2)
|
||||
return
|
||||
|
||||
var/list/L = list()
|
||||
for (var/obj/machinery/camera/C in cameranet.cameras)
|
||||
L.Add(C)
|
||||
|
||||
camera_sort(L)
|
||||
|
||||
var/list/T = list()
|
||||
T["Cancel"] = "Cancel"
|
||||
for (var/obj/machinery/camera/C in L)
|
||||
if (C.network == src.network)
|
||||
T[text("[][]", C.c_tag, (C.can_use() ? null : " (Deactivated)"))] = C
|
||||
|
||||
track = new()
|
||||
track.cameras = T
|
||||
return T
|
||||
|
||||
|
||||
/mob/living/silicon/ai/proc/ai_camera_list(var/camera in get_camera_list())
|
||||
set category = "AI Commands"
|
||||
set name = "Show Camera List"
|
||||
|
||||
if(usr.stat == 2)
|
||||
usr << "You can't track with camera because you are dead!"
|
||||
if(src.stat == 2)
|
||||
src << "You can't list the cameras because you are dead!"
|
||||
return
|
||||
|
||||
attack_ai(src)
|
||||
if (!camera || camera == "Cancel")
|
||||
return 0
|
||||
|
||||
/mob/living/silicon/ai/proc/ai_camera_track()
|
||||
set category = "AI Commands"
|
||||
set name = "Track With Camera"
|
||||
if(usr.stat == 2)
|
||||
usr << "You can't track with camera because you are dead!"
|
||||
return
|
||||
var/obj/machinery/camera/C = track.cameras[camera]
|
||||
track = null
|
||||
src.eyeobj.setLoc(C)
|
||||
|
||||
return
|
||||
|
||||
// Used to allow the AI is write in mob names/camera name from the CMD line.
|
||||
/datum/trackable
|
||||
var/list/names = list()
|
||||
var/list/namecounts = list()
|
||||
var/list/humans = list()
|
||||
var/list/others = list()
|
||||
var/list/cameras = list()
|
||||
|
||||
/mob/living/silicon/ai/proc/trackable_mobs()
|
||||
|
||||
if(usr.stat == 2)
|
||||
return list()
|
||||
|
||||
var/datum/trackable/TB = new()
|
||||
for(var/mob/living/M in mob_list)
|
||||
// Easy checks first.
|
||||
// Don't detect mobs on Centcom. Since the wizard den is on Centcomm, we only need this.
|
||||
@@ -55,25 +86,34 @@
|
||||
continue
|
||||
|
||||
var/name = M.name
|
||||
if (name in names)
|
||||
namecounts[name]++
|
||||
name = text("[] ([])", name, namecounts[name])
|
||||
if (name in TB.names)
|
||||
TB.namecounts[name]++
|
||||
name = text("[] ([])", name, TB.namecounts[name])
|
||||
else
|
||||
names.Add(name)
|
||||
namecounts[name] = 1
|
||||
TB.names.Add(name)
|
||||
TB.namecounts[name] = 1
|
||||
if(human)
|
||||
humans[name] = M
|
||||
TB.humans[name] = M
|
||||
else
|
||||
others[name] = M
|
||||
TB.others[name] = M
|
||||
|
||||
var/list/targets = sortList(humans) + sortList(others)
|
||||
var/target_name = input(usr, "Which creature should you track?") as null|anything in targets
|
||||
var/list/targets = sortList(TB.humans) + sortList(TB.others)
|
||||
src.track = TB
|
||||
return targets
|
||||
|
||||
if (!target_name)
|
||||
usr:cameraFollow = null
|
||||
/mob/living/silicon/ai/proc/ai_camera_track(var/target_name in trackable_mobs())
|
||||
set category = "AI Commands"
|
||||
set name = "Track With Camera"
|
||||
set desc = "Select who you would like to track."
|
||||
|
||||
if(src.stat == 2)
|
||||
src << "You can't track with camera because you are dead!"
|
||||
return
|
||||
if(!target_name)
|
||||
src.cameraFollow = null
|
||||
|
||||
var/mob/target = (isnull(humans[target_name]) ? others[target_name] : humans[target_name])
|
||||
var/mob/target = (isnull(track.humans[target_name]) ? track.others[target_name] : track.humans[target_name])
|
||||
src.track = null
|
||||
ai_actual_track(target)
|
||||
|
||||
/mob/living/silicon/ai/proc/ai_actual_track(mob/living/target as mob)
|
||||
@@ -121,7 +161,7 @@
|
||||
return
|
||||
sleep(10)
|
||||
|
||||
/proc/near_camera(var/mob/M)
|
||||
/proc/near_camera(var/mob/living/M)
|
||||
if (!isturf(M.loc))
|
||||
return 0
|
||||
if(isrobot(M))
|
||||
@@ -141,33 +181,7 @@
|
||||
|
||||
|
||||
/mob/living/silicon/ai/attack_ai(var/mob/user as mob)
|
||||
if (user != src)
|
||||
return
|
||||
|
||||
if (stat == 2)
|
||||
return
|
||||
|
||||
var/list/L = list()
|
||||
for (var/obj/machinery/camera/C in cameranet.cameras)
|
||||
L.Add(C)
|
||||
|
||||
camera_sort(L)
|
||||
|
||||
var/list/D = list()
|
||||
D["Cancel"] = "Cancel"
|
||||
for (var/obj/machinery/camera/C in L)
|
||||
if (C.network == src.network)
|
||||
D[text("[][]", C.c_tag, (C.can_use() ? null : " (Deactivated)"))] = C
|
||||
|
||||
var/t = input(user, "Which camera should you change to?") as null|anything in D
|
||||
|
||||
if (!t || t == "Cancel")
|
||||
return 0
|
||||
|
||||
var/obj/machinery/camera/C = D[t]
|
||||
src.eyeobj.setLoc(C)
|
||||
|
||||
return
|
||||
ai_camera_list()
|
||||
|
||||
/proc/camera_sort(list/L)
|
||||
var/obj/machinery/camera/a
|
||||
|
||||
@@ -111,7 +111,7 @@
|
||||
if(!issilicon(usr)) return
|
||||
emagged = !emagged
|
||||
if(emagged)
|
||||
message_admins("[key_name_admin(usr)] overrided the holodeck's safeties")
|
||||
message_admins("[key_name_admin(usr)] overrode the holodeck's safeties")
|
||||
log_game("[key_name(usr)] overrided the holodeck's safeties")
|
||||
else
|
||||
message_admins("[key_name_admin(usr)] restored the holodeck's safeties")
|
||||
|
||||
@@ -1,117 +0,0 @@
|
||||
/obj/machinery/dispenser/New()
|
||||
..()
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/dispenser/ex_act(severity)
|
||||
switch(severity)
|
||||
if(1.0)
|
||||
//SN src = null
|
||||
del(src)
|
||||
return
|
||||
if(2.0)
|
||||
if (prob(50))
|
||||
//SN src = null
|
||||
del(src)
|
||||
return
|
||||
if(3.0)
|
||||
if (prob(25))
|
||||
while(src.o2tanks > 0)
|
||||
new /obj/item/weapon/tank/oxygen( src.loc )
|
||||
src.o2tanks--
|
||||
update_icon()
|
||||
while(src.pltanks > 0)
|
||||
new /obj/item/weapon/tank/plasma( src.loc )
|
||||
src.pltanks--
|
||||
update_icon()
|
||||
else
|
||||
return
|
||||
|
||||
/obj/machinery/dispenser/blob_act()
|
||||
if (prob(50))
|
||||
while(src.o2tanks > 0)
|
||||
new /obj/item/weapon/tank/oxygen( src.loc )
|
||||
src.o2tanks--
|
||||
update_icon()
|
||||
while(src.pltanks > 0)
|
||||
new /obj/item/weapon/tank/plasma( src.loc )
|
||||
src.pltanks--
|
||||
update_icon()
|
||||
del(src)
|
||||
|
||||
/obj/machinery/dispenser/meteorhit()
|
||||
while(src.o2tanks > 0)
|
||||
new /obj/item/weapon/tank/oxygen( src.loc )
|
||||
src.o2tanks--
|
||||
update_icon()
|
||||
while(src.pltanks > 0)
|
||||
new /obj/item/weapon/tank/plasma( src.loc )
|
||||
src.pltanks--
|
||||
update_icon()
|
||||
del(src)
|
||||
return
|
||||
|
||||
/obj/machinery/dispenser/attack_ai(mob/user as mob)
|
||||
return src.attack_hand(user)
|
||||
|
||||
/obj/machinery/dispenser/attack_paw(mob/user as mob)
|
||||
return src.attack_hand(user)
|
||||
|
||||
/obj/machinery/dispenser/attack_hand(mob/user as mob)
|
||||
if(stat & BROKEN)
|
||||
return
|
||||
user.machine = src
|
||||
var/dat = text("<TT><B>Loaded Tank Dispensing Unit</B><BR>\n<FONT color = 'blue'><B>Oxygen</B>: []</FONT> []<BR>\n<FONT color = 'orange'><B>Plasma</B>: []</FONT> []<BR>\n</TT>", src.o2tanks, (src.o2tanks ? text("<A href='?src=\ref[];oxygen=1'>Dispense</A>", src) : "empty"), src.pltanks, (src.pltanks ? text("<A href='?src=\ref[];plasma=1'>Dispense</A>", src) : "empty"))
|
||||
user << browse(dat, "window=dispenser")
|
||||
onclose(user, "dispenser")
|
||||
return
|
||||
|
||||
/obj/machinery/dispenser/Topic(href, href_list)
|
||||
if(stat & BROKEN)
|
||||
return
|
||||
if(usr.stat || usr.restrained())
|
||||
return
|
||||
if (!(istype(usr, /mob/living/carbon/human) || ticker))
|
||||
if (!istype(usr, /mob/living/silicon/ai))
|
||||
usr << "\red You don't have the dexterity to do this!"
|
||||
else
|
||||
usr << "\red You are unable to dispense anything, since the controls are physical levers which don't go through any other kind of input."
|
||||
return
|
||||
|
||||
if ((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(src.loc, /turf))))
|
||||
usr.machine = src
|
||||
if (href_list["oxygen"])
|
||||
if (text2num(href_list["oxygen"]))
|
||||
if (src.o2tanks > 0)
|
||||
use_power(5)
|
||||
new /obj/item/weapon/tank/oxygen( src.loc )
|
||||
src.o2tanks--
|
||||
update_icon()
|
||||
if (istype(src.loc, /mob))
|
||||
attack_hand(src.loc)
|
||||
else
|
||||
if (href_list["plasma"])
|
||||
if (text2num(href_list["plasma"]))
|
||||
if (src.pltanks > 0)
|
||||
use_power(5)
|
||||
new /obj/item/weapon/tank/plasma( src.loc )
|
||||
src.pltanks--
|
||||
update_icon()
|
||||
if (istype(src.loc, /mob))
|
||||
attack_hand(src.loc)
|
||||
src.add_fingerprint(usr)
|
||||
for(var/mob/M in viewers(1, src))
|
||||
if ((M.client && M.machine == src))
|
||||
src.attack_hand(M)
|
||||
else
|
||||
usr << browse(null, "window=dispenser")
|
||||
return
|
||||
return
|
||||
|
||||
/obj/machinery/dispenser/update_icon()
|
||||
overlays = null
|
||||
switch(o2tanks)
|
||||
if(1 to 3) overlays += "oxygen-[o2tanks]"
|
||||
if(4 to INFINITY) overlays += "oxygen-4"
|
||||
switch(pltanks)
|
||||
if(1 to 4) overlays += "plasma-[pltanks]"
|
||||
if(5 to INFINITY) overlays += "plasma-5"
|
||||
@@ -59,13 +59,11 @@ var/const/HOLOPAD_MODE = 0
|
||||
|
||||
/*This is the proc for special two-way communication between AI and holopad/people talking near holopad.
|
||||
For the other part of the code, check silicon say.dm. Particularly robot talk.*/
|
||||
/obj/machinery/hologram/holopad/hear_talk(mob/M, text)
|
||||
/obj/machinery/hologram/holopad/hear_talk(mob/living/M, text)
|
||||
if(M&&hologram&&master)//Master is mostly a safety in case lag hits or something.
|
||||
if(!master.say_understands(M))//The AI will be able to understand most mobs talking through the holopad.
|
||||
text = stars(text)
|
||||
var/name_used = M.name
|
||||
if(istype(M.wear_mask, /obj/item/clothing/mask/gas/voice)&&M.wear_mask:vchange)//Can't forget the ninjas.
|
||||
name_used = M.wear_mask:voice
|
||||
var/name_used = M.GetVoice()
|
||||
//This communication is imperfect because the holopad "filters" voices and is only designed to connect to the master only.
|
||||
var/rendered = "<i><span class='game say'>Holopad received, <span class='name'>[name_used]</span> <span class='message'>[M.say_quote(text)]</span></span></i>"
|
||||
master.show_message(rendered, 2)
|
||||
|
||||
@@ -194,11 +194,11 @@ obj/machinery/hydroponics/proc/updateicon()
|
||||
if(src.harvest)
|
||||
overlays += image('icons/obj/hydroponics.dmi', icon_state="over_harvest3")
|
||||
|
||||
if(!luminosity)
|
||||
if(istype(myseed,/obj/item/seeds/glowshroom))
|
||||
SetLuminosity(round(myseed.potency/10))
|
||||
if(istype(myseed,/obj/item/seeds/glowshroom))
|
||||
SetLuminosity(round(myseed.potency/10))
|
||||
else
|
||||
SetLuminosity(0)
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
<A href='?src=\ref[src];make=2;dir=1'>Pipe</A><BR>
|
||||
<A href='?src=\ref[src];make=3;dir=5'>Bent Pipe</A><BR>
|
||||
<A href='?src=\ref[src];make=6;dir=1'>Junction</A><BR>
|
||||
<A href='?src=\ref[src];make=9;dir=17'>Heat Exchanger</A><BR>
|
||||
<A href='?src=\ref[src];make=17;dir=1'>Heat Exchanger</A><BR>
|
||||
<b>Insulated pipes:</b><BR>
|
||||
<A href='?src=\ref[src];make=11;dir=1'>Pipe</A><BR>
|
||||
<A href='?src=\ref[src];make=12;dir=5'>Bent Pipe</A><BR>
|
||||
|
||||
@@ -1,22 +1,21 @@
|
||||
/obj/machinery/seed_extractor
|
||||
name = "Seed Extractor"
|
||||
desc = "Extracts seeds from produce"
|
||||
name = "seed extractor"
|
||||
desc = "Extracts and bags seeds from produce."
|
||||
icon = 'icons/obj/hydroponics.dmi'
|
||||
icon_state = "sextractor"
|
||||
density = 1
|
||||
anchored = 1
|
||||
|
||||
obj/machinery/seed_extractor/attackby(var/obj/item/O as obj, var/mob/user as mob)
|
||||
|
||||
//Called when mob user "attacks" it with object O
|
||||
if (istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown/))
|
||||
if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown/))
|
||||
var/obj/item/weapon/reagent_containers/food/snacks/grown/F = O
|
||||
user << "\blue You extract some seeds from the [F.name]"
|
||||
user.drop_item()
|
||||
user << "<span class='notice'>You extract some seeds from the [F.name].</span>"
|
||||
var/seed = text2path(F.seed)
|
||||
var/t_amount = 0
|
||||
var/t_max = rand(1,4)
|
||||
while ( t_amount < t_max)
|
||||
var/obj/item/seeds/t_prod = new seed(src.loc)
|
||||
while(t_amount < t_max)
|
||||
var/obj/item/seeds/t_prod = new seed(loc)
|
||||
t_prod.species = F.species
|
||||
t_prod.lifespan = F.lifespan
|
||||
t_prod.endurance = F.endurance
|
||||
@@ -27,14 +26,15 @@ obj/machinery/seed_extractor/attackby(var/obj/item/O as obj, var/mob/user as mob
|
||||
t_amount++
|
||||
del(O)
|
||||
|
||||
else if (istype(O, /obj/item/weapon/grown/))
|
||||
else if(istype(O, /obj/item/weapon/grown/))
|
||||
var/obj/item/weapon/grown/F = O
|
||||
user << "\blue You extract some seeds from the [F.name]"
|
||||
user.drop_item()
|
||||
user << "<span class='notice'>You extract some seeds from the [F.name].</span>"
|
||||
var/seed = text2path(F.seed)
|
||||
var/t_amount = 0
|
||||
var/t_max = rand(1,4)
|
||||
while ( t_amount < t_max)
|
||||
var/obj/item/seeds/t_prod = new seed(src.loc)
|
||||
while(t_amount < t_max)
|
||||
var/obj/item/seeds/t_prod = new seed(loc)
|
||||
t_prod.species = F.species
|
||||
t_prod.lifespan = F.lifespan
|
||||
t_prod.endurance = F.endurance
|
||||
|
||||
53
code/game/machinery/transformer.dm
Normal file
@@ -0,0 +1,53 @@
|
||||
/obj/machinery/transformer
|
||||
name = "Automatic Robotic Factory 5000"
|
||||
desc = "A large metalic machine with an entrance and an exit. A sign on the side reads, 'human go in, robot come out', human must be lying down and alive."
|
||||
icon = 'icons/obj/recycling.dmi'
|
||||
icon_state = "separator-AO1"
|
||||
layer = MOB_LAYER+1 // Overhead
|
||||
anchored = 1
|
||||
density = 1
|
||||
var/transform_dead = 0
|
||||
|
||||
/obj/machinery/transformer/New()
|
||||
..()
|
||||
var/turf/T = loc
|
||||
if(T)
|
||||
// Spawn Conveyour Belts
|
||||
|
||||
//East
|
||||
var/turf/east = locate(T.x + 1, T.y, T.z)
|
||||
if(istype(east, /turf/simulated/floor))
|
||||
new /obj/machinery/conveyor(east, WEST, 1)
|
||||
|
||||
// West
|
||||
var/turf/west = locate(T.x - 1, T.y, T.z)
|
||||
if(istype(west, /turf/simulated/floor))
|
||||
new /obj/machinery/conveyor(west, WEST, 1)
|
||||
|
||||
// On us
|
||||
new /obj/machinery/conveyor(T, WEST, 1)
|
||||
|
||||
/obj/machinery/transformer/Bumped(var/atom/movable/AM)
|
||||
// HasEntered didn't like people lying down.
|
||||
if(ishuman(AM))
|
||||
// Only humans can enter from the west side, while lying down.
|
||||
var/move_dir = get_dir(loc, AM.loc)
|
||||
var/mob/living/carbon/human/H = AM
|
||||
if(H.lying && move_dir == EAST)// || move_dir == WEST)
|
||||
AM.loc = src.loc
|
||||
transform(AM)
|
||||
|
||||
/obj/machinery/transformer/proc/transform(var/mob/living/carbon/human/H)
|
||||
if(stat & (BROKEN|NOPOWER))
|
||||
return
|
||||
if(!transform_dead && H.stat == DEAD)
|
||||
playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 0)
|
||||
return
|
||||
playsound(src.loc, 'sound/items/Welder.ogg', 50, 1)
|
||||
use_power(5000) // Use a lot of power.
|
||||
var/mob/living/silicon/robot = H.Robotize()
|
||||
robot.lying = 1
|
||||
spawn(50) // So he can't jump out the gate right away.
|
||||
playsound(src.loc, 'sound/machines/ping.ogg', 50, 0)
|
||||
if(robot)
|
||||
robot.lying = 0
|
||||
@@ -17,12 +17,16 @@
|
||||
icon = 'icons/misc/beach2.dmi'
|
||||
icon_state = "palm1"
|
||||
density = 1
|
||||
layer = 5
|
||||
anchored = 1
|
||||
|
||||
/obj/effect/overlay/palmtree_l
|
||||
name = "Palm tree"
|
||||
icon = 'icons/misc/beach2.dmi'
|
||||
icon_state = "palm2"
|
||||
density = 1
|
||||
layer = 5
|
||||
anchored = 1
|
||||
|
||||
/obj/effect/overlay/coconut
|
||||
name = "Coconuts"
|
||||
|
||||
@@ -137,3 +137,58 @@
|
||||
|
||||
if(!usr.stat)
|
||||
attack_self(usr)
|
||||
|
||||
// FLARES
|
||||
|
||||
/obj/item/device/flashlight/flare
|
||||
name = "flare"
|
||||
desc = "A red Nanotrasen issued flare. There are instructions on the side, it reads 'pull cord, make light'."
|
||||
w_class = 2.0
|
||||
brightness_on = 7 // Pretty bright.
|
||||
icon_state = "flare"
|
||||
item_state = "flare"
|
||||
var/fuel = 0
|
||||
var/on_damage = 7
|
||||
var/produce_heat = 1500
|
||||
|
||||
/obj/item/device/flashlight/flare/New()
|
||||
fuel = rand(3000, 4500) // Last 10 to 15 minutes.
|
||||
..()
|
||||
|
||||
/obj/item/device/flashlight/flare/process()
|
||||
var/turf/pos = get_turf(src)
|
||||
pos.hotspot_expose(produce_heat, 5)
|
||||
fuel = max(fuel - 1, 0)
|
||||
if(!fuel || !on)
|
||||
turn_off()
|
||||
if(!fuel)
|
||||
src.icon_state = "[initial(icon_state)]-empty"
|
||||
processing_objects -= src
|
||||
|
||||
/obj/item/device/flashlight/flare/proc/turn_off()
|
||||
on = 0
|
||||
src.force = initial(src.force)
|
||||
src.damtype = initial(src.damtype)
|
||||
if(ismob(loc))
|
||||
var/mob/U = loc
|
||||
update_brightness(U)
|
||||
else
|
||||
update_brightness(null)
|
||||
|
||||
/obj/item/device/flashlight/flare/attack_self(mob/user)
|
||||
// Usual checks
|
||||
if(loc != usr)
|
||||
return
|
||||
if(!fuel)
|
||||
user << "<span class='notice'>It's out of fuel.</span>"
|
||||
return
|
||||
if(!on)
|
||||
user.visible_message("<span class='notice'>[user] activates the flare.</span>", "<span class='notice'>You pull the cord on the flare, activating it!</span>")
|
||||
else
|
||||
return
|
||||
// All good, turn it on.
|
||||
on = 1
|
||||
update_brightness(user)
|
||||
src.force = on_damage
|
||||
src.damtype = "fire"
|
||||
processing_objects += src
|
||||
@@ -195,29 +195,7 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
|
||||
updateDialog()
|
||||
add_fingerprint(usr)
|
||||
|
||||
/obj/item/device/radio/proc/autosay(var/message, var/from, var/channel) //BS12 EDIT
|
||||
var/datum/radio_frequency/connection = null
|
||||
if(channel && channels && channels.len > 0)
|
||||
if (channel == "department")
|
||||
//world << "DEBUG: channel=\"[channel]\" switching to \"[channels[1]]\""
|
||||
channel = channels[1]
|
||||
connection = secure_radio_connections[channel]
|
||||
else
|
||||
connection = radio_connection
|
||||
channel = null
|
||||
if (!istype(connection))
|
||||
return
|
||||
if (!connection)
|
||||
return
|
||||
|
||||
Broadcast_Message(connection, new /mob/living/silicon/ai(src),
|
||||
0, "*garbled automated announcement*", src,
|
||||
message, from, "Automated Announcement", from, "synthesized voice",
|
||||
4, 0, 1)
|
||||
return
|
||||
|
||||
/obj/item/device/radio/talk_into(mob/M as mob, message, channel)
|
||||
|
||||
/obj/item/device/radio/proc/autosay(var/message, var/from, var/channel) //BS12 EDIT var/datum/radio_frequency/connection = null if(channel && channels && channels.len > 0) if (channel == "department") //world << "DEBUG: channel=\"[channel]\" switching to \"[channels[1]]\"" channel = channels[1] connection = secure_radio_connections[channel] else connection = radio_connection channel = null if (!istype(connection)) return if (!connection) return Broadcast_Message(connection, new /mob/living/silicon/ai(src), 0, "*garbled automated announcement*", src, message, from, "Automated Announcement", from, "synthesized voice", 4, 0, 1) return/obj/item/device/radio/talk_into(mob/living/M as mob, message, channel)
|
||||
if(!on) return // the device has to be on
|
||||
// Fix for permacell radios, but kinda eh about actually fixing them.
|
||||
if(!M || !message) return
|
||||
@@ -299,10 +277,9 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
|
||||
// --- Modifications to the mob's identity ---
|
||||
|
||||
// The mob is disguising their identity:
|
||||
if (istype(M.wear_mask, /obj/item/clothing/mask/gas/voice))
|
||||
if(M.wear_mask:vchange)
|
||||
displayname = M.wear_mask:voice
|
||||
jobname = "Unknown"
|
||||
if (ishuman(M) && M.GetVoice() != real_name)
|
||||
displayname = M.GetVoice()
|
||||
jobname = "Unknown"
|
||||
voicemask = 1
|
||||
|
||||
|
||||
@@ -472,7 +449,7 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
|
||||
if (R.client && R.client.STFU_radio) //Adminning with 80 people on can be fun when you're trying to talk and all you can hear is radios.
|
||||
continue
|
||||
if (R.say_understands(M))
|
||||
if (!ishuman(M) || istype(M.wear_mask, /obj/item/clothing/mask/gas/voice))
|
||||
if (ishuman(M) && M.GetVoice() != M.real_name)
|
||||
heard_masked += R
|
||||
else
|
||||
heard_normal += R
|
||||
@@ -556,10 +533,8 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
|
||||
if (length(heard_masked))
|
||||
var/N = M.name
|
||||
var/J = eqjobname
|
||||
if (istype(M.wear_mask, /obj/item/clothing/mask/gas/voice)&&M.wear_mask:vchange)
|
||||
//To properly have the ninja show up on radio. Could also be useful for similar items.
|
||||
//Would not be necessary but the mob could be wearing a mask that is not a voice changer.
|
||||
N = M.wear_mask:voice
|
||||
if(ishuman(M) && M.GetVoice() != M.real_name)
|
||||
N = M.GetVoice()
|
||||
J = "Unknown"
|
||||
var/rendered = "[part_a][N][part_b][quotedmsg][part_c]"
|
||||
for (var/mob/R in heard_masked)
|
||||
|
||||
@@ -19,175 +19,175 @@
|
||||
/*BYOND loads resource files at compile time if they are ''. This means you can't really manipulate them dynamically.
|
||||
Tried doing it dynamically at first but its more trouble than its worth. Would have saved many lines tho.*/
|
||||
switch(note)
|
||||
if("Cn1") soundfile = 'sound/violin/Cn1.ogg'
|
||||
if("C#1") soundfile = 'sound/violin/C#1.ogg'
|
||||
if("Db1") soundfile = 'sound/violin/Db1.ogg'
|
||||
if("Dn1") soundfile = 'sound/violin/Dn1.ogg'
|
||||
if("D#1") soundfile = 'sound/violin/D#1.ogg'
|
||||
if("Eb1") soundfile = 'sound/violin/Eb1.ogg'
|
||||
if("En1") soundfile = 'sound/violin/En1.ogg'
|
||||
if("E#1") soundfile = 'sound/violin/E#1.ogg'
|
||||
if("Fb1") soundfile = 'sound/violin/Fb1.ogg'
|
||||
if("Fn1") soundfile = 'sound/violin/Fn1.ogg'
|
||||
if("F#1") soundfile = 'sound/violin/F#1.ogg'
|
||||
if("Gb1") soundfile = 'sound/violin/Gb1.ogg'
|
||||
if("Gn1") soundfile = 'sound/violin/Gn1.ogg'
|
||||
if("G#1") soundfile = 'sound/violin/G#1.ogg'
|
||||
if("Ab1") soundfile = 'sound/violin/Ab1.ogg'
|
||||
if("An1") soundfile = 'sound/violin/An1.ogg'
|
||||
if("A#1") soundfile = 'sound/violin/A#1.ogg'
|
||||
if("Bb1") soundfile = 'sound/violin/Bb1.ogg'
|
||||
if("Bn1") soundfile = 'sound/violin/Bn1.ogg'
|
||||
if("B#1") soundfile = 'sound/violin/B#1.ogg'
|
||||
if("Cb2") soundfile = 'sound/violin/Cb2.ogg'
|
||||
if("Cn2") soundfile = 'sound/violin/Cn2.ogg'
|
||||
if("C#2") soundfile = 'sound/violin/C#2.ogg'
|
||||
if("Db2") soundfile = 'sound/violin/Db2.ogg'
|
||||
if("Dn2") soundfile = 'sound/violin/Dn2.ogg'
|
||||
if("D#2") soundfile = 'sound/violin/D#2.ogg'
|
||||
if("Eb2") soundfile = 'sound/violin/Eb2.ogg'
|
||||
if("En2") soundfile = 'sound/violin/En2.ogg'
|
||||
if("E#2") soundfile = 'sound/violin/E#2.ogg'
|
||||
if("Fb2") soundfile = 'sound/violin/Fb2.ogg'
|
||||
if("Fn2") soundfile = 'sound/violin/Fn2.ogg'
|
||||
if("F#2") soundfile = 'sound/violin/F#2.ogg'
|
||||
if("Gb2") soundfile = 'sound/violin/Gb2.ogg'
|
||||
if("Gn2") soundfile = 'sound/violin/Gn2.ogg'
|
||||
if("G#2") soundfile = 'sound/violin/G#2.ogg'
|
||||
if("Ab2") soundfile = 'sound/violin/Ab2.ogg'
|
||||
if("An2") soundfile = 'sound/violin/An2.ogg'
|
||||
if("A#2") soundfile = 'sound/violin/A#2.ogg'
|
||||
if("Bb2") soundfile = 'sound/violin/Bb2.ogg'
|
||||
if("Bn2") soundfile = 'sound/violin/Bn2.ogg'
|
||||
if("B#2") soundfile = 'sound/violin/B#2.ogg'
|
||||
if("Cb3") soundfile = 'sound/violin/Cb3.ogg'
|
||||
if("Cn3") soundfile = 'sound/violin/Cn3.ogg'
|
||||
if("C#3") soundfile = 'sound/violin/C#3.ogg'
|
||||
if("Db3") soundfile = 'sound/violin/Db3.ogg'
|
||||
if("Dn3") soundfile = 'sound/violin/Dn3.ogg'
|
||||
if("D#3") soundfile = 'sound/violin/D#3.ogg'
|
||||
if("Eb3") soundfile = 'sound/violin/Eb3.ogg'
|
||||
if("En3") soundfile = 'sound/violin/En3.ogg'
|
||||
if("E#3") soundfile = 'sound/violin/E#3.ogg'
|
||||
if("Fb3") soundfile = 'sound/violin/Fb3.ogg'
|
||||
if("Fn3") soundfile = 'sound/violin/Fn3.ogg'
|
||||
if("F#3") soundfile = 'sound/violin/F#3.ogg'
|
||||
if("Gb3") soundfile = 'sound/violin/Gb3.ogg'
|
||||
if("Gn3") soundfile = 'sound/violin/Gn3.ogg'
|
||||
if("G#3") soundfile = 'sound/violin/G#3.ogg'
|
||||
if("Ab3") soundfile = 'sound/violin/Ab3.ogg'
|
||||
if("An3") soundfile = 'sound/violin/An3.ogg'
|
||||
if("A#3") soundfile = 'sound/violin/A#3.ogg'
|
||||
if("Bb3") soundfile = 'sound/violin/Bb3.ogg'
|
||||
if("Bn3") soundfile = 'sound/violin/Bn3.ogg'
|
||||
if("B#3") soundfile = 'sound/violin/B#3.ogg'
|
||||
if("Cb4") soundfile = 'sound/violin/Cb4.ogg'
|
||||
if("Cn4") soundfile = 'sound/violin/Cn4.ogg'
|
||||
if("C#4") soundfile = 'sound/violin/C#4.ogg'
|
||||
if("Db4") soundfile = 'sound/violin/Db4.ogg'
|
||||
if("Dn4") soundfile = 'sound/violin/Dn4.ogg'
|
||||
if("D#4") soundfile = 'sound/violin/D#4.ogg'
|
||||
if("Eb4") soundfile = 'sound/violin/Eb4.ogg'
|
||||
if("En4") soundfile = 'sound/violin/En4.ogg'
|
||||
if("E#4") soundfile = 'sound/violin/E#4.ogg'
|
||||
if("Fb4") soundfile = 'sound/violin/Fb4.ogg'
|
||||
if("Fn4") soundfile = 'sound/violin/Fn4.ogg'
|
||||
if("F#4") soundfile = 'sound/violin/F#4.ogg'
|
||||
if("Gb4") soundfile = 'sound/violin/Gb4.ogg'
|
||||
if("Gn4") soundfile = 'sound/violin/Gn4.ogg'
|
||||
if("G#4") soundfile = 'sound/violin/G#4.ogg'
|
||||
if("Ab4") soundfile = 'sound/violin/Ab4.ogg'
|
||||
if("An4") soundfile = 'sound/violin/An4.ogg'
|
||||
if("A#4") soundfile = 'sound/violin/A#4.ogg'
|
||||
if("Bb4") soundfile = 'sound/violin/Bb4.ogg'
|
||||
if("Bn4") soundfile = 'sound/violin/Bn4.ogg'
|
||||
if("B#4") soundfile = 'sound/violin/B#4.ogg'
|
||||
if("Cb5") soundfile = 'sound/violin/Cb5.ogg'
|
||||
if("Cn5") soundfile = 'sound/violin/Cn5.ogg'
|
||||
if("C#5") soundfile = 'sound/violin/C#5.ogg'
|
||||
if("Db5") soundfile = 'sound/violin/Db5.ogg'
|
||||
if("Dn5") soundfile = 'sound/violin/Dn5.ogg'
|
||||
if("D#5") soundfile = 'sound/violin/D#5.ogg'
|
||||
if("Eb5") soundfile = 'sound/violin/Eb5.ogg'
|
||||
if("En5") soundfile = 'sound/violin/En5.ogg'
|
||||
if("E#5") soundfile = 'sound/violin/E#5.ogg'
|
||||
if("Fb5") soundfile = 'sound/violin/Fb5.ogg'
|
||||
if("Fn5") soundfile = 'sound/violin/Fn5.ogg'
|
||||
if("F#5") soundfile = 'sound/violin/F#5.ogg'
|
||||
if("Gb5") soundfile = 'sound/violin/Gb5.ogg'
|
||||
if("Gn5") soundfile = 'sound/violin/Gn5.ogg'
|
||||
if("G#5") soundfile = 'sound/violin/G#5.ogg'
|
||||
if("Ab5") soundfile = 'sound/violin/Ab5.ogg'
|
||||
if("An5") soundfile = 'sound/violin/An5.ogg'
|
||||
if("A#5") soundfile = 'sound/violin/A#5.ogg'
|
||||
if("Bb5") soundfile = 'sound/violin/Bb5.ogg'
|
||||
if("Bn5") soundfile = 'sound/violin/Bn5.ogg'
|
||||
if("B#5") soundfile = 'sound/violin/B#5.ogg'
|
||||
if("Cb6") soundfile = 'sound/violin/Cb6.ogg'
|
||||
if("Cn6") soundfile = 'sound/violin/Cn6.ogg'
|
||||
if("C#6") soundfile = 'sound/violin/C#6.ogg'
|
||||
if("Db6") soundfile = 'sound/violin/Db6.ogg'
|
||||
if("Dn6") soundfile = 'sound/violin/Dn6.ogg'
|
||||
if("D#6") soundfile = 'sound/violin/D#6.ogg'
|
||||
if("Eb6") soundfile = 'sound/violin/Eb6.ogg'
|
||||
if("En6") soundfile = 'sound/violin/En6.ogg'
|
||||
if("E#6") soundfile = 'sound/violin/E#6.ogg'
|
||||
if("Fb6") soundfile = 'sound/violin/Fb6.ogg'
|
||||
if("Fn6") soundfile = 'sound/violin/Fn6.ogg'
|
||||
if("F#6") soundfile = 'sound/violin/F#6.ogg'
|
||||
if("Gb6") soundfile = 'sound/violin/Gb6.ogg'
|
||||
if("Gn6") soundfile = 'sound/violin/Gn6.ogg'
|
||||
if("G#6") soundfile = 'sound/violin/G#6.ogg'
|
||||
if("Ab6") soundfile = 'sound/violin/Ab6.ogg'
|
||||
if("An6") soundfile = 'sound/violin/An6.ogg'
|
||||
if("A#6") soundfile = 'sound/violin/A#6.ogg'
|
||||
if("Bb6") soundfile = 'sound/violin/Bb6.ogg'
|
||||
if("Bn6") soundfile = 'sound/violin/Bn6.ogg'
|
||||
if("B#6") soundfile = 'sound/violin/B#6.ogg'
|
||||
if("Cb7") soundfile = 'sound/violin/Cb7.ogg'
|
||||
if("Cn7") soundfile = 'sound/violin/Cn7.ogg'
|
||||
if("C#7") soundfile = 'sound/violin/C#7.ogg'
|
||||
if("Db7") soundfile = 'sound/violin/Db7.ogg'
|
||||
if("Dn7") soundfile = 'sound/violin/Dn7.ogg'
|
||||
if("D#7") soundfile = 'sound/violin/D#7.ogg'
|
||||
if("Eb7") soundfile = 'sound/violin/Eb7.ogg'
|
||||
if("En7") soundfile = 'sound/violin/En7.ogg'
|
||||
if("E#7") soundfile = 'sound/violin/E#7.ogg'
|
||||
if("Fb7") soundfile = 'sound/violin/Fb7.ogg'
|
||||
if("Fn7") soundfile = 'sound/violin/Fn7.ogg'
|
||||
if("F#7") soundfile = 'sound/violin/F#7.ogg'
|
||||
if("Gb7") soundfile = 'sound/violin/Gb7.ogg'
|
||||
if("Gn7") soundfile = 'sound/violin/Gn7.ogg'
|
||||
if("G#7") soundfile = 'sound/violin/G#7.ogg'
|
||||
if("Ab7") soundfile = 'sound/violin/Ab7.ogg'
|
||||
if("An7") soundfile = 'sound/violin/An7.ogg'
|
||||
if("A#7") soundfile = 'sound/violin/A#7.ogg'
|
||||
if("Bb7") soundfile = 'sound/violin/Bb7.ogg'
|
||||
if("Bn7") soundfile = 'sound/violin/Bn7.ogg'
|
||||
if("B#7") soundfile = 'sound/violin/B#7.ogg'
|
||||
if("Cb8") soundfile = 'sound/violin/Cb8.ogg'
|
||||
if("Cn8") soundfile = 'sound/violin/Cn8.ogg'
|
||||
if("C#8") soundfile = 'sound/violin/C#8.ogg'
|
||||
if("Db8") soundfile = 'sound/violin/Db8.ogg'
|
||||
if("Dn8") soundfile = 'sound/violin/Dn8.ogg'
|
||||
if("D#8") soundfile = 'sound/violin/D#8.ogg'
|
||||
if("Eb8") soundfile = 'sound/violin/Eb8.ogg'
|
||||
if("En8") soundfile = 'sound/violin/En8.ogg'
|
||||
if("E#8") soundfile = 'sound/violin/E#8.ogg'
|
||||
if("Fb8") soundfile = 'sound/violin/Fb8.ogg'
|
||||
if("Fn8") soundfile = 'sound/violin/Fn8.ogg'
|
||||
if("F#8") soundfile = 'sound/violin/F#8.ogg'
|
||||
if("Gb8") soundfile = 'sound/violin/Gb8.ogg'
|
||||
if("Gn8") soundfile = 'sound/violin/Gn8.ogg'
|
||||
if("G#8") soundfile = 'sound/violin/G#8.ogg'
|
||||
if("Ab8") soundfile = 'sound/violin/Ab8.ogg'
|
||||
if("An8") soundfile = 'sound/violin/An8.ogg'
|
||||
if("A#8") soundfile = 'sound/violin/A#8.ogg'
|
||||
if("Bb8") soundfile = 'sound/violin/Bb8.ogg'
|
||||
if("Bn8") soundfile = 'sound/violin/Bn8.ogg'
|
||||
if("B#8") soundfile = 'sound/violin/B#8.ogg'
|
||||
if("Cb9") soundfile = 'sound/violin/Cb9.ogg'
|
||||
if("Cn9") soundfile = 'sound/violin/Cn9.ogg'
|
||||
if("Cn1") soundfile = 'sound/violin/Cn1.mid'
|
||||
if("C#1") soundfile = 'sound/violin/C#1.mid'
|
||||
if("Db1") soundfile = 'sound/violin/Db1.mid'
|
||||
if("Dn1") soundfile = 'sound/violin/Dn1.mid'
|
||||
if("D#1") soundfile = 'sound/violin/D#1.mid'
|
||||
if("Eb1") soundfile = 'sound/violin/Eb1.mid'
|
||||
if("En1") soundfile = 'sound/violin/En1.mid'
|
||||
if("E#1") soundfile = 'sound/violin/E#1.mid'
|
||||
if("Fb1") soundfile = 'sound/violin/Fb1.mid'
|
||||
if("Fn1") soundfile = 'sound/violin/Fn1.mid'
|
||||
if("F#1") soundfile = 'sound/violin/F#1.mid'
|
||||
if("Gb1") soundfile = 'sound/violin/Gb1.mid'
|
||||
if("Gn1") soundfile = 'sound/violin/Gn1.mid'
|
||||
if("G#1") soundfile = 'sound/violin/G#1.mid'
|
||||
if("Ab1") soundfile = 'sound/violin/Ab1.mid'
|
||||
if("An1") soundfile = 'sound/violin/An1.mid'
|
||||
if("A#1") soundfile = 'sound/violin/A#1.mid'
|
||||
if("Bb1") soundfile = 'sound/violin/Bb1.mid'
|
||||
if("Bn1") soundfile = 'sound/violin/Bn1.mid'
|
||||
if("B#1") soundfile = 'sound/violin/B#1.mid'
|
||||
if("Cb2") soundfile = 'sound/violin/Cb2.mid'
|
||||
if("Cn2") soundfile = 'sound/violin/Cn2.mid'
|
||||
if("C#2") soundfile = 'sound/violin/C#2.mid'
|
||||
if("Db2") soundfile = 'sound/violin/Db2.mid'
|
||||
if("Dn2") soundfile = 'sound/violin/Dn2.mid'
|
||||
if("D#2") soundfile = 'sound/violin/D#2.mid'
|
||||
if("Eb2") soundfile = 'sound/violin/Eb2.mid'
|
||||
if("En2") soundfile = 'sound/violin/En2.mid'
|
||||
if("E#2") soundfile = 'sound/violin/E#2.mid'
|
||||
if("Fb2") soundfile = 'sound/violin/Fb2.mid'
|
||||
if("Fn2") soundfile = 'sound/violin/Fn2.mid'
|
||||
if("F#2") soundfile = 'sound/violin/F#2.mid'
|
||||
if("Gb2") soundfile = 'sound/violin/Gb2.mid'
|
||||
if("Gn2") soundfile = 'sound/violin/Gn2.mid'
|
||||
if("G#2") soundfile = 'sound/violin/G#2.mid'
|
||||
if("Ab2") soundfile = 'sound/violin/Ab2.mid'
|
||||
if("An2") soundfile = 'sound/violin/An2.mid'
|
||||
if("A#2") soundfile = 'sound/violin/A#2.mid'
|
||||
if("Bb2") soundfile = 'sound/violin/Bb2.mid'
|
||||
if("Bn2") soundfile = 'sound/violin/Bn2.mid'
|
||||
if("B#2") soundfile = 'sound/violin/B#2.mid'
|
||||
if("Cb3") soundfile = 'sound/violin/Cb3.mid'
|
||||
if("Cn3") soundfile = 'sound/violin/Cn3.mid'
|
||||
if("C#3") soundfile = 'sound/violin/C#3.mid'
|
||||
if("Db3") soundfile = 'sound/violin/Db3.mid'
|
||||
if("Dn3") soundfile = 'sound/violin/Dn3.mid'
|
||||
if("D#3") soundfile = 'sound/violin/D#3.mid'
|
||||
if("Eb3") soundfile = 'sound/violin/Eb3.mid'
|
||||
if("En3") soundfile = 'sound/violin/En3.mid'
|
||||
if("E#3") soundfile = 'sound/violin/E#3.mid'
|
||||
if("Fb3") soundfile = 'sound/violin/Fb3.mid'
|
||||
if("Fn3") soundfile = 'sound/violin/Fn3.mid'
|
||||
if("F#3") soundfile = 'sound/violin/F#3.mid'
|
||||
if("Gb3") soundfile = 'sound/violin/Gb3.mid'
|
||||
if("Gn3") soundfile = 'sound/violin/Gn3.mid'
|
||||
if("G#3") soundfile = 'sound/violin/G#3.mid'
|
||||
if("Ab3") soundfile = 'sound/violin/Ab3.mid'
|
||||
if("An3") soundfile = 'sound/violin/An3.mid'
|
||||
if("A#3") soundfile = 'sound/violin/A#3.mid'
|
||||
if("Bb3") soundfile = 'sound/violin/Bb3.mid'
|
||||
if("Bn3") soundfile = 'sound/violin/Bn3.mid'
|
||||
if("B#3") soundfile = 'sound/violin/B#3.mid'
|
||||
if("Cb4") soundfile = 'sound/violin/Cb4.mid'
|
||||
if("Cn4") soundfile = 'sound/violin/Cn4.mid'
|
||||
if("C#4") soundfile = 'sound/violin/C#4.mid'
|
||||
if("Db4") soundfile = 'sound/violin/Db4.mid'
|
||||
if("Dn4") soundfile = 'sound/violin/Dn4.mid'
|
||||
if("D#4") soundfile = 'sound/violin/D#4.mid'
|
||||
if("Eb4") soundfile = 'sound/violin/Eb4.mid'
|
||||
if("En4") soundfile = 'sound/violin/En4.mid'
|
||||
if("E#4") soundfile = 'sound/violin/E#4.mid'
|
||||
if("Fb4") soundfile = 'sound/violin/Fb4.mid'
|
||||
if("Fn4") soundfile = 'sound/violin/Fn4.mid'
|
||||
if("F#4") soundfile = 'sound/violin/F#4.mid'
|
||||
if("Gb4") soundfile = 'sound/violin/Gb4.mid'
|
||||
if("Gn4") soundfile = 'sound/violin/Gn4.mid'
|
||||
if("G#4") soundfile = 'sound/violin/G#4.mid'
|
||||
if("Ab4") soundfile = 'sound/violin/Ab4.mid'
|
||||
if("An4") soundfile = 'sound/violin/An4.mid'
|
||||
if("A#4") soundfile = 'sound/violin/A#4.mid'
|
||||
if("Bb4") soundfile = 'sound/violin/Bb4.mid'
|
||||
if("Bn4") soundfile = 'sound/violin/Bn4.mid'
|
||||
if("B#4") soundfile = 'sound/violin/B#4.mid'
|
||||
if("Cb5") soundfile = 'sound/violin/Cb5.mid'
|
||||
if("Cn5") soundfile = 'sound/violin/Cn5.mid'
|
||||
if("C#5") soundfile = 'sound/violin/C#5.mid'
|
||||
if("Db5") soundfile = 'sound/violin/Db5.mid'
|
||||
if("Dn5") soundfile = 'sound/violin/Dn5.mid'
|
||||
if("D#5") soundfile = 'sound/violin/D#5.mid'
|
||||
if("Eb5") soundfile = 'sound/violin/Eb5.mid'
|
||||
if("En5") soundfile = 'sound/violin/En5.mid'
|
||||
if("E#5") soundfile = 'sound/violin/E#5.mid'
|
||||
if("Fb5") soundfile = 'sound/violin/Fb5.mid'
|
||||
if("Fn5") soundfile = 'sound/violin/Fn5.mid'
|
||||
if("F#5") soundfile = 'sound/violin/F#5.mid'
|
||||
if("Gb5") soundfile = 'sound/violin/Gb5.mid'
|
||||
if("Gn5") soundfile = 'sound/violin/Gn5.mid'
|
||||
if("G#5") soundfile = 'sound/violin/G#5.mid'
|
||||
if("Ab5") soundfile = 'sound/violin/Ab5.mid'
|
||||
if("An5") soundfile = 'sound/violin/An5.mid'
|
||||
if("A#5") soundfile = 'sound/violin/A#5.mid'
|
||||
if("Bb5") soundfile = 'sound/violin/Bb5.mid'
|
||||
if("Bn5") soundfile = 'sound/violin/Bn5.mid'
|
||||
if("B#5") soundfile = 'sound/violin/B#5.mid'
|
||||
if("Cb6") soundfile = 'sound/violin/Cb6.mid'
|
||||
if("Cn6") soundfile = 'sound/violin/Cn6.mid'
|
||||
if("C#6") soundfile = 'sound/violin/C#6.mid'
|
||||
if("Db6") soundfile = 'sound/violin/Db6.mid'
|
||||
if("Dn6") soundfile = 'sound/violin/Dn6.mid'
|
||||
if("D#6") soundfile = 'sound/violin/D#6.mid'
|
||||
if("Eb6") soundfile = 'sound/violin/Eb6.mid'
|
||||
if("En6") soundfile = 'sound/violin/En6.mid'
|
||||
if("E#6") soundfile = 'sound/violin/E#6.mid'
|
||||
if("Fb6") soundfile = 'sound/violin/Fb6.mid'
|
||||
if("Fn6") soundfile = 'sound/violin/Fn6.mid'
|
||||
if("F#6") soundfile = 'sound/violin/F#6.mid'
|
||||
if("Gb6") soundfile = 'sound/violin/Gb6.mid'
|
||||
if("Gn6") soundfile = 'sound/violin/Gn6.mid'
|
||||
if("G#6") soundfile = 'sound/violin/G#6.mid'
|
||||
if("Ab6") soundfile = 'sound/violin/Ab6.mid'
|
||||
if("An6") soundfile = 'sound/violin/An6.mid'
|
||||
if("A#6") soundfile = 'sound/violin/A#6.mid'
|
||||
if("Bb6") soundfile = 'sound/violin/Bb6.mid'
|
||||
if("Bn6") soundfile = 'sound/violin/Bn6.mid'
|
||||
if("B#6") soundfile = 'sound/violin/B#6.mid'
|
||||
if("Cb7") soundfile = 'sound/violin/Cb7.mid'
|
||||
if("Cn7") soundfile = 'sound/violin/Cn7.mid'
|
||||
if("C#7") soundfile = 'sound/violin/C#7.mid'
|
||||
if("Db7") soundfile = 'sound/violin/Db7.mid'
|
||||
if("Dn7") soundfile = 'sound/violin/Dn7.mid'
|
||||
if("D#7") soundfile = 'sound/violin/D#7.mid'
|
||||
if("Eb7") soundfile = 'sound/violin/Eb7.mid'
|
||||
if("En7") soundfile = 'sound/violin/En7.mid'
|
||||
if("E#7") soundfile = 'sound/violin/E#7.mid'
|
||||
if("Fb7") soundfile = 'sound/violin/Fb7.mid'
|
||||
if("Fn7") soundfile = 'sound/violin/Fn7.mid'
|
||||
if("F#7") soundfile = 'sound/violin/F#7.mid'
|
||||
if("Gb7") soundfile = 'sound/violin/Gb7.mid'
|
||||
if("Gn7") soundfile = 'sound/violin/Gn7.mid'
|
||||
if("G#7") soundfile = 'sound/violin/G#7.mid'
|
||||
if("Ab7") soundfile = 'sound/violin/Ab7.mid'
|
||||
if("An7") soundfile = 'sound/violin/An7.mid'
|
||||
if("A#7") soundfile = 'sound/violin/A#7.mid'
|
||||
if("Bb7") soundfile = 'sound/violin/Bb7.mid'
|
||||
if("Bn7") soundfile = 'sound/violin/Bn7.mid'
|
||||
if("B#7") soundfile = 'sound/violin/B#7.mid'
|
||||
if("Cb8") soundfile = 'sound/violin/Cb8.mid'
|
||||
if("Cn8") soundfile = 'sound/violin/Cn8.mid'
|
||||
if("C#8") soundfile = 'sound/violin/C#8.mid'
|
||||
if("Db8") soundfile = 'sound/violin/Db8.mid'
|
||||
if("Dn8") soundfile = 'sound/violin/Dn8.mid'
|
||||
if("D#8") soundfile = 'sound/violin/D#8.mid'
|
||||
if("Eb8") soundfile = 'sound/violin/Eb8.mid'
|
||||
if("En8") soundfile = 'sound/violin/En8.mid'
|
||||
if("E#8") soundfile = 'sound/violin/E#8.mid'
|
||||
if("Fb8") soundfile = 'sound/violin/Fb8.mid'
|
||||
if("Fn8") soundfile = 'sound/violin/Fn8.mid'
|
||||
if("F#8") soundfile = 'sound/violin/F#8.mid'
|
||||
if("Gb8") soundfile = 'sound/violin/Gb8.mid'
|
||||
if("Gn8") soundfile = 'sound/violin/Gn8.mid'
|
||||
if("G#8") soundfile = 'sound/violin/G#8.mid'
|
||||
if("Ab8") soundfile = 'sound/violin/Ab8.mid'
|
||||
if("An8") soundfile = 'sound/violin/An8.mid'
|
||||
if("A#8") soundfile = 'sound/violin/A#8.mid'
|
||||
if("Bb8") soundfile = 'sound/violin/Bb8.mid'
|
||||
if("Bn8") soundfile = 'sound/violin/Bn8.mid'
|
||||
if("B#8") soundfile = 'sound/violin/B#8.mid'
|
||||
if("Cb9") soundfile = 'sound/violin/Cb9.mid'
|
||||
if("Cn9") soundfile = 'sound/violin/Cn9.mid'
|
||||
else return
|
||||
|
||||
hearers(15, get_turf(src)) << sound(soundfile)
|
||||
|
||||
@@ -1,14 +0,0 @@
|
||||
/obj/item/weapon/bedsheet/ex_act(severity)
|
||||
if (severity <= 2)
|
||||
del(src)
|
||||
return
|
||||
return
|
||||
|
||||
/obj/item/weapon/bedsheet/attack_self(mob/user as mob)
|
||||
user.drop_item()
|
||||
if(layer == initial(layer))
|
||||
layer = 5
|
||||
else
|
||||
layer = initial(layer)
|
||||
add_fingerprint(user)
|
||||
return
|
||||
@@ -4,6 +4,8 @@
|
||||
new /obj/item/weapon/extinguisher/mini(src)
|
||||
if(prob(50))
|
||||
new /obj/item/device/flashlight(src)
|
||||
else
|
||||
new /obj/item/device/flashlight/flare(src)
|
||||
new /obj/item/device/radio(src)
|
||||
|
||||
/obj/item/weapon/storage/toolbox/mechanical/New()
|
||||
|
||||
@@ -1,38 +1,168 @@
|
||||
// BEDSHEET BIN
|
||||
/*
|
||||
CONTAINS:
|
||||
BEDSHEETS
|
||||
LINEN BINS
|
||||
*/
|
||||
|
||||
/obj/item/weapon/bedsheet
|
||||
name = "bedsheet"
|
||||
desc = "A surprisingly soft linen bedsheet."
|
||||
icon = 'icons/obj/items.dmi'
|
||||
icon_state = "sheet"
|
||||
item_state = "bedsheet"
|
||||
layer = 4.0
|
||||
throwforce = 1
|
||||
throw_speed = 1
|
||||
throw_range = 2
|
||||
w_class = 1.0
|
||||
color = "white"
|
||||
|
||||
|
||||
/obj/item/weapon/bedsheet/attack_self(mob/user as mob)
|
||||
user.drop_item()
|
||||
if(layer == initial(layer))
|
||||
layer = 5
|
||||
else
|
||||
layer = initial(layer)
|
||||
add_fingerprint(user)
|
||||
return
|
||||
|
||||
|
||||
/obj/item/weapon/bedsheet/blue
|
||||
icon_state = "sheetblue"
|
||||
color = "blue"
|
||||
|
||||
/obj/item/weapon/bedsheet/green
|
||||
icon_state = "sheetgreen"
|
||||
color = "green"
|
||||
|
||||
/obj/item/weapon/bedsheet/orange
|
||||
icon_state = "sheetorange"
|
||||
color = "orange"
|
||||
|
||||
/obj/item/weapon/bedsheet/purple
|
||||
icon_state = "sheetpurple"
|
||||
color = "purple"
|
||||
|
||||
/obj/item/weapon/bedsheet/rainbow
|
||||
icon_state = "sheetrainbow"
|
||||
color = "rainbow"
|
||||
|
||||
/obj/item/weapon/bedsheet/red
|
||||
icon_state = "sheetred"
|
||||
color = "red"
|
||||
|
||||
/obj/item/weapon/bedsheet/yellow
|
||||
icon_state = "sheetyellow"
|
||||
color = "yellow"
|
||||
|
||||
/obj/item/weapon/bedsheet/mime
|
||||
icon_state = "sheetmime"
|
||||
color = "mime"
|
||||
|
||||
/obj/item/weapon/bedsheet/clown
|
||||
icon_state = "sheetclown"
|
||||
color = "clown"
|
||||
|
||||
/obj/item/weapon/bedsheet/captain
|
||||
icon_state = "sheetcaptain"
|
||||
color = "captain"
|
||||
|
||||
/obj/item/weapon/bedsheet/rd
|
||||
icon_state = "sheetrd"
|
||||
color = "director"
|
||||
|
||||
/obj/item/weapon/bedsheet/medical
|
||||
icon_state = "sheetmedical"
|
||||
color = "medical"
|
||||
|
||||
/obj/item/weapon/bedsheet/hos
|
||||
icon_state = "sheethos"
|
||||
color = "hosred"
|
||||
|
||||
/obj/item/weapon/bedsheet/hop
|
||||
icon_state = "sheethop"
|
||||
color = "hop"
|
||||
|
||||
/obj/item/weapon/bedsheet/ce
|
||||
icon_state = "sheetce"
|
||||
color = "chief"
|
||||
|
||||
/obj/item/weapon/bedsheet/brown
|
||||
icon_state = "sheetbrown"
|
||||
color = "brown"
|
||||
|
||||
|
||||
|
||||
|
||||
/obj/structure/bedsheetbin
|
||||
name = "linen bin"
|
||||
desc = "A bin for containing bedsheets. It looks rather cosy."
|
||||
icon = 'icons/obj/items.dmi'
|
||||
icon_state = "bedbin"
|
||||
var/amount = 23.0
|
||||
anchored = 1.0
|
||||
desc = "A linen bin. It looks rather cosy."
|
||||
icon = 'icons/obj/structures.dmi'
|
||||
icon_state = "linenbin-full"
|
||||
anchored = 1
|
||||
var/amount = 20
|
||||
var/list/sheets = list()
|
||||
var/obj/item/hidden = null
|
||||
|
||||
/obj/structure/bedsheetbin/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if (istype(W, /obj/item/weapon/bedsheet))
|
||||
del(W)
|
||||
src.amount++
|
||||
return
|
||||
|
||||
/obj/structure/bedsheetbin/attack_paw(mob/user as mob)
|
||||
return src.attack_hand(user)
|
||||
|
||||
/obj/structure/bedsheetbin/attack_hand(mob/user as mob)
|
||||
if (src.amount >= 1)
|
||||
src.amount--
|
||||
new /obj/item/weapon/bedsheet( src.loc )
|
||||
add_fingerprint(user)
|
||||
|
||||
/obj/structure/bedsheetbin/examine()
|
||||
set src in oview(1)
|
||||
|
||||
src.amount = round(src.amount)
|
||||
if (src.amount <= 0)
|
||||
src.amount = 0
|
||||
usr << desc
|
||||
if(amount < 1)
|
||||
usr << "There are no bed sheets in the bin."
|
||||
else
|
||||
if (src.amount == 1)
|
||||
usr << "There is one bed sheet in the bin."
|
||||
return
|
||||
if(amount == 1)
|
||||
usr << "There is one bed sheet in the bin."
|
||||
return
|
||||
usr << "There are [amount] bed sheets in the bin."
|
||||
|
||||
|
||||
/obj/structure/bedsheetbin/update_icon()
|
||||
switch(amount)
|
||||
if(0) icon_state = "linenbin-empty"
|
||||
if(1 to amount / 2) icon_state = "linenbin-half"
|
||||
else icon_state = "linenbin-full"
|
||||
|
||||
|
||||
/obj/structure/bedsheetbin/attackby(obj/item/I as obj, mob/user as mob)
|
||||
if(istype(I, /obj/item/weapon/bedsheet))
|
||||
user.drop_item()
|
||||
I.loc = src
|
||||
sheets.Add(I)
|
||||
amount++
|
||||
user << "<span class='notice'>You put [I] in [src].</span>"
|
||||
else if(amount && !hidden && I.w_class < 4) //make sure there's sheets to hide it among, make sure nothing else is hidden in there.
|
||||
user.drop_item()
|
||||
I.loc = src
|
||||
hidden = I
|
||||
user << "<span class='notice'>You hide [I] among the sheets.</span>"
|
||||
|
||||
|
||||
|
||||
/obj/structure/bedsheetbin/attack_paw(mob/user as mob)
|
||||
return attack_hand(user)
|
||||
|
||||
|
||||
/obj/structure/bedsheetbin/attack_hand(mob/user as mob)
|
||||
if(amount >= 1)
|
||||
amount--
|
||||
|
||||
var/obj/item/weapon/bedsheet/B
|
||||
if(sheets.len > 0)
|
||||
B = sheets[sheets.len]
|
||||
sheets.Remove(B)
|
||||
|
||||
else
|
||||
usr << text("There are [] bed sheets in the bin.", src.amount)
|
||||
return
|
||||
B = new /obj/item/weapon/bedsheet(loc)
|
||||
|
||||
B.loc = user.loc
|
||||
user.put_in_hands(B)
|
||||
user << "<span class='notice'>You take [B] out of [src].</span>"
|
||||
|
||||
if(hidden)
|
||||
hidden.loc = user.loc
|
||||
user << "<span class='notice'>[hidden] falls out of [B]!</span>"
|
||||
hidden = null
|
||||
|
||||
|
||||
add_fingerprint(user)
|
||||
@@ -143,7 +143,7 @@
|
||||
if(istype(W, /obj/item/weapon/screwdriver))
|
||||
var/turf/T = get_turf(src)
|
||||
user.visible_message("[user] tightens some bolts on the wall.", "You tighten the bolts on the wall.")
|
||||
if(!mineral)
|
||||
if(!mineral || mineral == "metal")
|
||||
T.ReplaceWithWall()
|
||||
else
|
||||
T.ReplaceWithMineralWall(mineral)
|
||||
|
||||
190
code/game/objects/structures/safe.dm
Normal file
@@ -0,0 +1,190 @@
|
||||
/*
|
||||
CONTAINS:
|
||||
SAFES
|
||||
FLOOR SAFES
|
||||
*/
|
||||
|
||||
//SAFES
|
||||
/obj/structure/safe
|
||||
name = "safe"
|
||||
desc = "A huge chunk of metal with a dial embedded in it. Fine print on the dial reads \"Scarborough Arms - 2 tumbler safe, guaranteed thermite resistant, explosion resistant, and assistant resistant.\""
|
||||
icon = 'icons/obj/structures.dmi'
|
||||
icon_state = "safe"
|
||||
anchored = 1
|
||||
density = 1
|
||||
var/open = 0 //is the safe open?
|
||||
var/tumbler_1_pos //the tumbler position- from 0 to 72
|
||||
var/tumbler_1_open //the tumbler position to open at- 0 to 72
|
||||
var/tumbler_2_pos
|
||||
var/tumbler_2_open
|
||||
var/dial = 0 //where is the dial pointing?
|
||||
var/space = 0 //the combined w_class of everything in the safe
|
||||
var/maxspace = 24 //the maximum combined w_class of stuff in the safe
|
||||
|
||||
|
||||
/obj/structure/safe/New()
|
||||
tumbler_1_pos = rand(0, 72)
|
||||
tumbler_1_open = rand(0, 72)
|
||||
|
||||
tumbler_2_pos = rand(0, 72)
|
||||
tumbler_2_open = rand(0, 72)
|
||||
|
||||
|
||||
/obj/structure/safe/initialize()
|
||||
for(var/obj/item/I in loc)
|
||||
if(space >= maxspace)
|
||||
return
|
||||
if(I.w_class + space <= maxspace)
|
||||
space += I.w_class
|
||||
I.loc = src
|
||||
|
||||
|
||||
/obj/structure/safe/proc/check_unlocked(mob/user as mob, canhear)
|
||||
if(user && canhear)
|
||||
if(tumbler_1_pos == tumbler_1_open)
|
||||
user << "<span class='notice'>You hear a [pick("tonk", "krunk", "plunk")] from [src].</span>"
|
||||
if(tumbler_2_pos == tumbler_2_open)
|
||||
user << "<span class='notice'>You hear a [pick("tink", "krink", "plink")] from [src].</span>"
|
||||
if(tumbler_1_pos == tumbler_1_open && tumbler_2_pos == tumbler_2_open)
|
||||
if(user) visible_message("<b>[pick("Spring", "Sprang", "Sproing", "Clunk", "Krunk")]!</b>")
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
/obj/structure/safe/proc/decrement(num)
|
||||
num -= 1
|
||||
if(num < 0)
|
||||
num = 71
|
||||
return num
|
||||
|
||||
|
||||
/obj/structure/safe/proc/increment(num)
|
||||
num += 1
|
||||
if(num > 71)
|
||||
num = 0
|
||||
return num
|
||||
|
||||
|
||||
/obj/structure/safe/update_icon()
|
||||
if(open)
|
||||
icon_state = "[initial(icon_state)]-open"
|
||||
else
|
||||
icon_state = initial(icon_state)
|
||||
|
||||
|
||||
/obj/structure/safe/attack_hand(mob/user as mob)
|
||||
user.machine = src
|
||||
var/dat = "<center>"
|
||||
dat += "<a href='?src=\ref[src];open=1'>[open ? "Close" : "Open"] [src]</a> | <a href='?src=\ref[src];decrement=1'>-</a> [dial * 5] <a href='?src=\ref[src];increment=1'>+</a>"
|
||||
if(open)
|
||||
dat += "<table>"
|
||||
for(var/i = contents.len, i>=1, i--)
|
||||
var/obj/item/P = contents[i]
|
||||
dat += "<tr><td><a href='?src=\ref[src];retrieve=\ref[P]'>[P.name]</a></td></tr>"
|
||||
dat += "</table></center>"
|
||||
user << browse("<html><head><title>[name]</title></head><body>[dat]</body></html>", "window=safe;size=350x300")
|
||||
|
||||
|
||||
/obj/structure/safe/Topic(href, href_list)
|
||||
if(!ishuman(usr)) return
|
||||
var/mob/living/carbon/human/user = usr
|
||||
|
||||
var/canhear = 0
|
||||
if(istype(user.l_hand, /obj/item/clothing/tie/stethoscope) || istype(user.r_hand, /obj/item/clothing/tie/stethoscope))
|
||||
canhear = 1
|
||||
|
||||
if(href_list["open"])
|
||||
if(check_unlocked())
|
||||
user << "<span class='notice'>You [open ? "close" : "open"] [src].</span>"
|
||||
open = !open
|
||||
update_icon()
|
||||
updateUsrDialog()
|
||||
return
|
||||
else
|
||||
user << "<span class='notice'>You can't [open ? "close" : "open"] [src], the lock is engaged!</span>"
|
||||
return
|
||||
|
||||
if(href_list["decrement"])
|
||||
dial = decrement(dial)
|
||||
if(dial == tumbler_1_pos + 1 || dial == tumbler_1_pos - 71)
|
||||
tumbler_1_pos = decrement(tumbler_1_pos)
|
||||
if(canhear)
|
||||
user << "<span class='notice'>You hear a [pick("clack", "scrape", "clank")] from [src].</span>"
|
||||
if(tumbler_1_pos == tumbler_2_pos + 37 || tumbler_1_pos == tumbler_2_pos - 35)
|
||||
tumbler_2_pos = decrement(tumbler_2_pos)
|
||||
if(canhear)
|
||||
user << "<span class='notice'>You hear a [pick("click", "chink", "clink")] from [src].</span>"
|
||||
check_unlocked(user, canhear)
|
||||
updateUsrDialog()
|
||||
return
|
||||
|
||||
if(href_list["increment"])
|
||||
dial = increment(dial)
|
||||
if(dial == tumbler_1_pos - 1 || dial == tumbler_1_pos + 71)
|
||||
tumbler_1_pos = increment(tumbler_1_pos)
|
||||
if(canhear)
|
||||
user << "<span class='notice'>You hear a [pick("clack", "scrape", "clank")] from [src].</span>"
|
||||
if(tumbler_1_pos == tumbler_2_pos - 37 || tumbler_1_pos == tumbler_2_pos + 35)
|
||||
tumbler_2_pos = increment(tumbler_2_pos)
|
||||
if(canhear)
|
||||
user << "<span class='notice'>You hear a [pick("click", "chink", "clink")] from [src].</span>"
|
||||
check_unlocked(user, canhear)
|
||||
updateUsrDialog()
|
||||
return
|
||||
|
||||
if(href_list["retrieve"])
|
||||
user << browse("", "window=safe") // Close the menu
|
||||
|
||||
var/obj/item/P = locate(href_list["retrieve"])
|
||||
if(P && in_range(src, user))
|
||||
user.put_in_hands(P)
|
||||
updateUsrDialog()
|
||||
|
||||
|
||||
/obj/structure/safe/attackby(obj/item/I as obj, mob/user as mob)
|
||||
if(open)
|
||||
if(I.w_class + space <= maxspace)
|
||||
space += I.w_class
|
||||
user.drop_item()
|
||||
I.loc = src
|
||||
user << "<span class='notice'>You put [I] in [src].</span>"
|
||||
updateUsrDialog()
|
||||
return
|
||||
else
|
||||
user << "<span class='notice'>[I] won't fit in [src].</span>"
|
||||
return
|
||||
else
|
||||
if(istype(I, /obj/item/clothing/tie/stethoscope))
|
||||
user << "Hold [I] in one of your hands while you manipulate the dial."
|
||||
return
|
||||
|
||||
|
||||
obj/structure/safe/blob_act()
|
||||
return
|
||||
|
||||
|
||||
obj/structure/safe/ex_act(severity)
|
||||
return
|
||||
|
||||
|
||||
obj/structure/safe/meteorhit(obj/O as obj)
|
||||
return
|
||||
|
||||
|
||||
//FLOOR SAFES
|
||||
/obj/structure/safe/floor
|
||||
name = "floor safe"
|
||||
icon_state = "floorsafe"
|
||||
density = 0
|
||||
level = 1 //underfloor
|
||||
layer = 2.5
|
||||
|
||||
|
||||
/obj/structure/safe/floor/initialize()
|
||||
..()
|
||||
var/turf/T = loc
|
||||
hide(T.intact)
|
||||
|
||||
|
||||
/obj/structure/safe/floor/hide(var/intact)
|
||||
invisibility = intact ? 101 : 0
|
||||
101
code/game/objects/structures/tank_dispenser.dm
Normal file
@@ -0,0 +1,101 @@
|
||||
/obj/structure/dispenser
|
||||
name = "tank storage unit"
|
||||
desc = "A simple yet bulky storage device for gas tanks. Has room for up to ten oxygen tanks, and ten plasma tanks."
|
||||
icon = 'icons/obj/objects.dmi'
|
||||
icon_state = "dispenser"
|
||||
density = 1
|
||||
anchored = 1.0
|
||||
var/oxygentanks = 10
|
||||
var/plasmatanks = 10
|
||||
var/list/oxytanks = list() //sorry for the similar var names
|
||||
var/list/platanks = list()
|
||||
|
||||
|
||||
/obj/structure/dispenser/oxygen
|
||||
plasmatanks = 0
|
||||
|
||||
/obj/structure/dispenser/plasma
|
||||
oxygentanks = 0
|
||||
|
||||
|
||||
/obj/structure/dispenser/New()
|
||||
update_icon()
|
||||
|
||||
|
||||
/obj/structure/dispenser/update_icon()
|
||||
overlays = null
|
||||
switch(oxygentanks)
|
||||
if(1 to 3) overlays += "oxygen-[oxygentanks]"
|
||||
if(4 to INFINITY) overlays += "oxygen-4"
|
||||
switch(plasmatanks)
|
||||
if(1 to 4) overlays += "plasma-[plasmatanks]"
|
||||
if(5 to INFINITY) overlays += "plasma-5"
|
||||
|
||||
|
||||
/obj/structure/dispenser/attack_hand(mob/user as mob)
|
||||
user.machine = src
|
||||
var/dat = "[src]<br><br>"
|
||||
dat += "Oxygen tanks: [oxygentanks] - [oxygentanks ? "<A href='?src=\ref[src];oxygen=1'>Dispense</A>" : "empty"]<br>"
|
||||
dat += "Plasma tanks: [plasmatanks] - [plasmatanks ? "<A href='?src=\ref[src];plasma=1'>Dispense</A>" : "empty"]"
|
||||
user << browse(dat, "window=dispenser")
|
||||
onclose(user, "dispenser")
|
||||
return
|
||||
|
||||
|
||||
/obj/structure/dispenser/attackby(obj/item/I as obj, mob/user as mob)
|
||||
if(istype(I, /obj/item/weapon/tank/oxygen) || istype(I, /obj/item/weapon/tank/air) || istype(I, /obj/item/weapon/tank/anesthetic))
|
||||
if(oxygentanks < 10)
|
||||
user.drop_item()
|
||||
I.loc = src
|
||||
oxytanks.Add(I)
|
||||
oxygentanks++
|
||||
user << "<span class='notice'>You put [I] in [src].</span>"
|
||||
else
|
||||
user << "<span class='notice'>[src] is full.</span>"
|
||||
if(istype(I, /obj/item/weapon/tank/plasma))
|
||||
if(plasmatanks < 10)
|
||||
user.drop_item()
|
||||
I.loc = src
|
||||
platanks.Add(I)
|
||||
plasmatanks++
|
||||
user << "<span class='notice'>You put [I] in [src].</span>"
|
||||
else
|
||||
user << "<span class='notice'>[src] is full.</span>"
|
||||
updateUsrDialog()
|
||||
|
||||
|
||||
/obj/structure/dispenser/Topic(href, href_list)
|
||||
if(usr.stat || usr.restrained())
|
||||
return
|
||||
if(get_dist(src, usr) <= 1)
|
||||
usr.machine = src
|
||||
if(href_list["oxygen"])
|
||||
if(oxygentanks > 0)
|
||||
var/obj/item/weapon/tank/oxygen/O
|
||||
if(oxytanks.len == oxygentanks)
|
||||
O = oxytanks[1]
|
||||
oxytanks.Remove(O)
|
||||
else
|
||||
O = new /obj/item/weapon/tank/oxygen(loc)
|
||||
O.loc = loc
|
||||
usr << "<span class='notice'>You take [O] out of [src].</span>"
|
||||
oxygentanks--
|
||||
update_icon()
|
||||
if(href_list["plasma"])
|
||||
if(plasmatanks > 0)
|
||||
var/obj/item/weapon/tank/plasma/P
|
||||
if(platanks.len == plasmatanks)
|
||||
P = platanks[1]
|
||||
platanks.Remove(P)
|
||||
else
|
||||
P = new /obj/item/weapon/tank/plasma(loc)
|
||||
P.loc = loc
|
||||
usr << "<span class='notice'>You take [P] out of [src].</span>"
|
||||
plasmatanks--
|
||||
update_icon()
|
||||
add_fingerprint(usr)
|
||||
updateUsrDialog()
|
||||
else
|
||||
usr << browse(null, "window=dispenser")
|
||||
return
|
||||
return
|
||||
@@ -415,7 +415,7 @@
|
||||
return
|
||||
|
||||
/obj/structure/window/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
|
||||
if(exposed_temperature > T0C + 600)
|
||||
if(exposed_temperature > T0C + 800)
|
||||
hit(round(exposed_volume / 100), 0)
|
||||
..()
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@ proc/get_all_admin_clients()
|
||||
|
||||
for (var/client/C in client_list)
|
||||
var/entry = "\t"
|
||||
if(usr.client.holder)
|
||||
if(usr.client.holder && usr.client.holder.level >= 0) //Everything above admin-observers get this.
|
||||
entry += "[C.key]"
|
||||
if(C.holder && C.holder.fakekey)
|
||||
entry += " <i>(as [C.holder.fakekey])</i>"
|
||||
|
||||
@@ -16,6 +16,12 @@
|
||||
// verbs += /client/proc/air_status //Air things
|
||||
// verbs += /client/proc/Cell //More air things
|
||||
|
||||
/client/proc/admin_rank_check(var/rank, var/requested)
|
||||
if(rank < requested)
|
||||
alert("You cannot perform this action. You must be of a higher administrative rank!", null, null, null, null, null)
|
||||
return(0)
|
||||
return(1)
|
||||
|
||||
/client/proc/update_admins(var/rank)
|
||||
if(!holder)
|
||||
holder = new /datum/admins(rank)
|
||||
@@ -110,8 +116,12 @@
|
||||
|
||||
//Admin Observer
|
||||
if (holder.level == -1)
|
||||
seeprayers = 1
|
||||
|
||||
verbs += /client/proc/cmd_admin_say
|
||||
return
|
||||
verbs += /client/proc/deadmin_self
|
||||
verbs += /client/proc/toggleadminhelpsound
|
||||
else return
|
||||
|
||||
//Moderator
|
||||
if (holder.level >= 0)
|
||||
@@ -164,7 +174,7 @@
|
||||
verbs += /client/proc/unban_panel
|
||||
verbs += /client/proc/jobbans
|
||||
verbs += /client/proc/unjobban_panel
|
||||
verbs += /client/proc/check_ai_laws
|
||||
verbs += /client/proc/hide_verbs verbs += /client/proc/general_report verbs += /client/proc/air_report verbs += /client/proc/check_ai_laws
|
||||
verbs += /client/proc/investigate_show
|
||||
verbs += /client/proc/cmd_admin_gib_self
|
||||
verbs += /client/proc/player_panel_new
|
||||
@@ -178,20 +188,19 @@
|
||||
else
|
||||
return
|
||||
|
||||
//Admin Candidate
|
||||
|
||||
else return //Temporary Admin if (holder.level >= 1) verbs += /datum/admins/proc/delay //game start delay verbs += /datum/admins/proc/immreboot //immediate reboot verbs += /datum/admins/proc/restart //restart verbs += /client/proc/cmd_admin_check_contents verbs += /client/proc/cmd_admin_create_centcom_report verbs += /client/proc/toggle_hear_deadcast verbs += /client/proc/toggle_hear_radio else return //Admin Candidate
|
||||
if (holder.level >= 2)
|
||||
verbs += /client/proc/cmd_admin_add_random_ai_law
|
||||
verbs += /client/proc/secrets
|
||||
verbs += /client/proc/check_antagonists
|
||||
verbs += /client/proc/play_sound
|
||||
verbs += /client/proc/stealth
|
||||
verbs += /client/proc/deadmin_self
|
||||
else return
|
||||
|
||||
//Trial Admin
|
||||
if (holder.level >= 3)
|
||||
deadchat = 1
|
||||
seeprayers = 1
|
||||
|
||||
verbs += /client/proc/invisimin
|
||||
verbs += /datum/admins/proc/view_txt_log
|
||||
@@ -205,8 +214,6 @@
|
||||
verbs += /client/proc/respawn_character
|
||||
verbs += /client/proc/spawn_xeno
|
||||
verbs += /client/proc/toggleprayers
|
||||
verbs += /client/proc/deadmin_self
|
||||
verbs += /client/proc/toggleadminhelpsound
|
||||
verbs += /proc/possess
|
||||
verbs += /proc/release
|
||||
verbs += /client/proc/one_click_antag
|
||||
@@ -290,7 +297,6 @@
|
||||
verbs += /client/proc/enable_debug_verbs
|
||||
verbs += /client/proc/everyone_random
|
||||
verbs += /client/proc/only_one
|
||||
verbs += /client/proc/deadmin_self
|
||||
verbs += /client/proc/cinematic //show a cinematic sequence
|
||||
verbs += /client/proc/startSinglo //Used to prevent the station from losing power while testing stuff out.
|
||||
verbs += /client/proc/toggle_log_hrefs
|
||||
|
||||
@@ -43,6 +43,10 @@ var/list/admin_datums = list()
|
||||
log_admin("[key_name(usr)] tried to use the admin panel without authorization.")
|
||||
return
|
||||
|
||||
if (!(usr.client.holder.rank in list("Moderator", "Temporary Admin", "Admin Candidate", "Trial Admin", "Badmin", "Game Admin", "Game Master")))
|
||||
usr << "\red You cannot perform this action. You must be of a higher administrative rank!"
|
||||
return
|
||||
|
||||
if(href_list["makeAntag"])
|
||||
switch(href_list["makeAntag"])
|
||||
if("1")
|
||||
@@ -181,6 +185,10 @@ var/list/admin_datums = list()
|
||||
|
||||
if(href_list["simplemake"])
|
||||
|
||||
if (!(src.rank in list("Trial Admin", "Badmin", "Game Admin", "Game Master")))
|
||||
alert("You cannot perform this action. You must be of a higher administrative rank!")
|
||||
return
|
||||
|
||||
if(!href_list["mob"])
|
||||
usr << "Invalid mob"
|
||||
return
|
||||
|
||||
@@ -859,7 +859,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
|
||||
M.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/captain(M), slot_ears)
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/eyepatch(M), slot_glasses)
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/suit/hgpirate(M), slot_wear_suit)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/bandolier(M), slot_back)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/mateba(M), slot_belt)
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/under/soviet(M), slot_w_uniform)
|
||||
var/obj/item/weapon/card/id/W = new(M)
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
|
||||
var/method = 0 //0 means strict type detection while 1 means this type and all subtypes (IE: /obj/item with this set to 1 will set it to ALL itms)
|
||||
|
||||
if(!admin_rank_check(src.holder.level, 3)) return
|
||||
|
||||
if(A && A.type)
|
||||
if(typesof(A.type))
|
||||
switch(input("Strict object type detection?") as null|anything in list("Strictly this type","This type and subtypes", "Cancel"))
|
||||
|
||||
@@ -269,6 +269,7 @@ var/list/forbidden_varedit_object_types = list(
|
||||
if(!src.holder)
|
||||
src << "Only administrators may use this command."
|
||||
return
|
||||
if(!admin_rank_check(src.holder.level, 3)) return
|
||||
|
||||
for(var/p in forbidden_varedit_object_types)
|
||||
if( istype(O,p) )
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
|
||||
/obj/machinery/artillerycontrol
|
||||
var/reload = 180
|
||||
name = "Bluespace Artillery Control"
|
||||
name = "bluespace artillery control"
|
||||
icon_state = "control_boxp1"
|
||||
icon = 'particle_accelerator.dmi'
|
||||
icon = 'icons/obj/machines/particle_accelerator.dmi'
|
||||
density = 1
|
||||
anchored = 1
|
||||
|
||||
@@ -13,10 +13,13 @@
|
||||
|
||||
/obj/structure/artilleryplaceholder
|
||||
name = "artillery"
|
||||
icon = 'particle_accelerator.dmi'
|
||||
icon = 'icons/obj/machines/artillery.dmi'
|
||||
anchored = 1
|
||||
density = 1
|
||||
|
||||
/obj/structure/artilleryplaceholder/decorative
|
||||
density = 0
|
||||
|
||||
/obj/machinery/artillerycontrol/attack_hand(mob/user as mob)
|
||||
user.machine = src
|
||||
var/dat = "<B>Bluespace Artillery Control:</B><BR>"
|
||||
|
||||
@@ -109,7 +109,7 @@
|
||||
|
||||
/obj/effect/landmark/corpse/chef
|
||||
name = "Chef"
|
||||
corpseuniform = /obj/item/clothing/suit/chef
|
||||
corpseuniform = /obj/item/clothing/under/rank/chef
|
||||
corpsesuit = /obj/item/clothing/suit/chef/classic
|
||||
corpseshoes = /obj/item/clothing/shoes/black
|
||||
corpsehelmet = /obj/item/clothing/head/chefhat
|
||||
|
||||
@@ -43,10 +43,10 @@ proc/createRandomZlevel()
|
||||
world << "\red \b Loading away mission..."
|
||||
|
||||
var/map = pick(potentialRandomZlevels)
|
||||
world.log << "away mission loaded: [map]"
|
||||
var/file = file(map)
|
||||
if(isfile(file))
|
||||
maploader.load_map(file)
|
||||
world.log << "away mission loaded: [map]"
|
||||
|
||||
for(var/obj/effect/landmark/L in landmarks_list)
|
||||
if (L.name != "awaystart")
|
||||
|
||||
@@ -87,11 +87,14 @@
|
||||
///////////
|
||||
//CONNECT//
|
||||
///////////
|
||||
/client/New()
|
||||
//Connection-Type and client byond_version checking
|
||||
if( connection != "seeker" || (byond_version < MIN_CLIENT_VERSION)) //Out of date or wrong connection type. Update your client!!
|
||||
del(src)
|
||||
return
|
||||
/client/New(TopicData)
|
||||
TopicData = null //Prevent calls to client.Topic from connect
|
||||
|
||||
if(connection != "seeker") //Invalid connection type.
|
||||
return null
|
||||
if(byond_version < MIN_CLIENT_VERSION) //Out of date client.
|
||||
return null
|
||||
|
||||
|
||||
if(IsGuestKey(key))
|
||||
alert(src,"Baystation12 doesn't allow guest accounts to play. Please go to http://www.byond.com/ and register for a key.","Guest","OK")
|
||||
@@ -111,6 +114,8 @@
|
||||
holder.owner = src
|
||||
holder.state = null
|
||||
|
||||
. = ..() //calls mob.Login()
|
||||
|
||||
//makejson()
|
||||
|
||||
if(custom_event_msg && custom_event_msg != "")
|
||||
|
||||
@@ -81,6 +81,39 @@
|
||||
item_state = "sunglasses"
|
||||
darkness_view = -1
|
||||
|
||||
/obj/item/clothing/glasses/welding
|
||||
name = "welding goggles"
|
||||
desc = "Protects the eyes from welders, approved by the mad scientist association."
|
||||
icon_state = "welding-g"
|
||||
item_state = "welding-g"
|
||||
icon_action_button = "action_welding_g"
|
||||
var/up = 0
|
||||
|
||||
/obj/item/clothing/glasses/welding/attack_self()
|
||||
toggle()
|
||||
|
||||
|
||||
/obj/item/clothing/glasses/welding/verb/toggle()
|
||||
set category = "Object"
|
||||
set name = "Adjust welding goggles"
|
||||
set src in usr
|
||||
|
||||
if(usr.canmove && !usr.stat && !usr.restrained())
|
||||
if(src.up)
|
||||
src.up = !src.up
|
||||
src.flags |= GLASSESCOVERSEYES
|
||||
flags_inv |= HIDEEYES
|
||||
icon_state = initial(icon_state)
|
||||
usr << "You flip the [src] down to protect your eyes."
|
||||
else
|
||||
src.up = !src.up
|
||||
src.flags &= ~HEADCOVERSEYES
|
||||
flags_inv &= ~HIDEEYES
|
||||
icon_state = "[initial(icon_state)]up"
|
||||
usr << "You push the [src] up out of your face."
|
||||
|
||||
usr.update_inv_glasses()
|
||||
|
||||
/obj/item/clothing/glasses/sunglasses/blindfold
|
||||
name = "blindfold"
|
||||
desc = "Covers the eyes, preventing sight."
|
||||
|
||||
@@ -24,29 +24,29 @@
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
|
||||
icon_action_button = "action_welding"
|
||||
|
||||
attack_self()
|
||||
toggle()
|
||||
/obj/item/clothing/head/welding/attack_self()
|
||||
toggle()
|
||||
|
||||
|
||||
verb/toggle()
|
||||
set category = "Object"
|
||||
set name = "Adjust welding mask"
|
||||
set src in usr
|
||||
/obj/item/clothing/head/welding/verb/toggle()
|
||||
set category = "Object"
|
||||
set name = "Adjust welding mask"
|
||||
set src in usr
|
||||
|
||||
if(usr.canmove && !usr.stat && !usr.restrained())
|
||||
if(src.up)
|
||||
src.up = !src.up
|
||||
src.flags |= HEADCOVERSEYES | HEADCOVERSMOUTH
|
||||
flags_inv |= HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
|
||||
icon_state = "welding"
|
||||
usr << "You flip the mask down to protect your eyes."
|
||||
else
|
||||
src.up = !src.up
|
||||
src.flags &= ~HEADCOVERSEYES | HEADCOVERSMOUTH
|
||||
flags_inv &= ~(HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE)
|
||||
icon_state = "weldingup"
|
||||
usr << "You push the mask up out of your face."
|
||||
usr.update_inv_head() //so our mob-overlays update
|
||||
if(usr.canmove && !usr.stat && !usr.restrained())
|
||||
if(src.up)
|
||||
src.up = !src.up
|
||||
src.flags |= HEADCOVERSEYES | HEADCOVERSMOUTH
|
||||
flags_inv |= HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
|
||||
icon_state = initial(icon_state)
|
||||
usr << "You flip the [src] down to protect your eyes."
|
||||
else
|
||||
src.up = !src.up
|
||||
src.flags &= ~HEADCOVERSEYES | HEADCOVERSMOUTH
|
||||
flags_inv &= ~(HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE)
|
||||
icon_state = "[initial(icon_state)]up"
|
||||
usr << "You push the [src] up out of your face."
|
||||
usr.update_inv_head() //so our mob-overlays update
|
||||
|
||||
|
||||
/*
|
||||
|
||||
@@ -10,6 +10,8 @@
|
||||
return
|
||||
else
|
||||
message = Gibberish(message, (emp_damage*6))//scrambles the message, gets worse when emp_damage is higher
|
||||
..()
|
||||
else
|
||||
..()
|
||||
if(istype(container, /obj/item/device/mmi/radio_enabled))
|
||||
var/obj/item/device/mmi/radio_enabled/R = container
|
||||
if(R.radio)
|
||||
spawn(0) R.radio.hear_talk(src, sanitize(message))
|
||||
..()
|
||||
@@ -169,7 +169,7 @@
|
||||
|
||||
//ID
|
||||
if(wear_id)
|
||||
var/id
|
||||
/*var/id
|
||||
if(istype(wear_id, /obj/item/device/pda))
|
||||
var/obj/item/device/pda/pda = wear_id
|
||||
id = pda.owner
|
||||
@@ -178,8 +178,8 @@
|
||||
id = idcard.registered_name
|
||||
if(id && (id != real_name) && (get_dist(src, usr) <= 1) && prob(10))
|
||||
msg += "<span class='warning'>[t_He] [t_is] wearing \icon[wear_id] \a [wear_id] yet something doesn't seem right...</span>\n"
|
||||
else
|
||||
msg += "[t_He] [t_is] wearing \icon[wear_id] \a [wear_id].\n"
|
||||
else*/
|
||||
msg += "[t_He] [t_is] wearing \icon[wear_id] \a [wear_id].\n"
|
||||
|
||||
//Jitters
|
||||
if(is_jittery)
|
||||
|
||||
@@ -723,10 +723,14 @@
|
||||
number += 2
|
||||
if(istype(src.head, /obj/item/clothing/head/helmet/space))
|
||||
number += 2
|
||||
if(istype(src.glasses, /obj/item/clothing/glasses/sunglasses))
|
||||
number += 1
|
||||
if(istype(src.glasses, /obj/item/clothing/glasses/thermal))
|
||||
number -= 1
|
||||
if(istype(src.glasses, /obj/item/clothing/glasses/sunglasses))
|
||||
number += 1
|
||||
if(istype(src.glasses, /obj/item/clothing/glasses/welding))
|
||||
var/obj/item/clothing/glasses/welding/W = src.glasses
|
||||
if(!W.up)
|
||||
number += 2
|
||||
return number
|
||||
|
||||
|
||||
|
||||
@@ -38,13 +38,14 @@
|
||||
|
||||
..()
|
||||
|
||||
/*
|
||||
//This code is here to try to determine what causes the gender switch to plural error. Once the error is tracked down and fixed, this code should be deleted
|
||||
//Also delete var/prev_gender once this is removed.
|
||||
if(prev_gender != gender)
|
||||
prev_gender = gender
|
||||
if(gender in list(PLURAL, NEUTER))
|
||||
message_admins("[src] ([ckey]) gender has been changed to plural or neuter. Please record what has happened recently to the person and then notify coders. (<A HREF='?src=%holder_ref%;adminmoreinfo=\ref[src]'>?</A>) (<A HREF='?src=%holder_ref%;adminplayervars=\ref[src]'>VV</A>) (<A HREF='?src=%admin_ref%;priv_msg=\ref[src]'>PM</A>) (<A HREF='?src=%holder_ref%;adminplayerobservejump=\ref[src]'>JMP</A>)",1,1) //The 1,1 at the end is there to make '%holder_ref%' get replaced with the actual ref object
|
||||
|
||||
*/
|
||||
//Apparently, the person who wrote this code designed it so that
|
||||
//blinded get reset each cycle and then get activated later in the
|
||||
//code. Very ugly. I dont care. Moving this stuff here so its easy
|
||||
@@ -1304,10 +1305,18 @@
|
||||
if(eye_blurry) client.screen += global_hud.blurry
|
||||
if(druggy) client.screen += global_hud.druggy
|
||||
|
||||
var/masked = 0
|
||||
|
||||
if( istype(head, /obj/item/clothing/head/welding) )
|
||||
var/obj/item/clothing/head/welding/O = head
|
||||
if(!O.up && tinted_weldhelh)
|
||||
client.screen += global_hud.darkMask
|
||||
masked = 1
|
||||
|
||||
if(!masked && istype(glasses, /obj/item/clothing/glasses/welding) )
|
||||
var/obj/item/clothing/glasses/welding/O = glasses
|
||||
if(!O.up && tinted_weldhelh)
|
||||
client.screen += global_hud.darkMask
|
||||
|
||||
if(eye_stat > 20)
|
||||
if(eye_stat > 30) client.screen += global_hud.darkMask
|
||||
|
||||
@@ -133,3 +133,15 @@
|
||||
if (istype(other, /mob/living/carbon/metroid))
|
||||
return 1
|
||||
return ..()
|
||||
|
||||
/mob/living/carbon/human/GetVoice()
|
||||
if(istype(src.wear_mask, /obj/item/clothing/mask/gas/voice))
|
||||
var/obj/item/clothing/mask/gas/voice/V = src.wear_mask
|
||||
if(V.vchange)
|
||||
return V.voice
|
||||
else
|
||||
return name
|
||||
if(mind && mind.changeling && mind.changeling.mimicing)
|
||||
return mind.changeling.mimicing
|
||||
return real_name
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
return
|
||||
|
||||
var/alt_name = ""
|
||||
if (istype(src, /mob/living/carbon/human) && src.name != src.real_name)
|
||||
if (istype(src, /mob/living/carbon/human) && src.name != GetVoice())
|
||||
var/mob/living/carbon/human/H = src
|
||||
alt_name = " (as [H.get_id_name("Unknown")])"
|
||||
// Mute disability
|
||||
@@ -98,15 +98,7 @@
|
||||
if (italics)
|
||||
message_a = "<i>[message_a]</i>"
|
||||
//This appears copied from carbon/living say.dm so the istype check for mob is probably not needed. Appending for src is also not needed as the game will check that automatically.
|
||||
if (!istype(src, /mob/living/carbon/human))
|
||||
rendered = "<span class='game say'><span class='name'>[name]</span> whispers, <span class='message'>\"[message_a]\"</span></span>"
|
||||
else if (istype(wear_mask, /obj/item/clothing/mask/gas/voice))
|
||||
if (wear_mask:vchange)
|
||||
rendered = "<span class='game say'><span class='name'>[wear_mask:voice]</span> whispers, <span class='message'>\"[message_a]\"</span></span>"
|
||||
else
|
||||
rendered = "<span class='game say'><span class='name'>[name]</span> whispers, <span class='message'>\"[message_a]\"</span></span>"
|
||||
else
|
||||
rendered = "<span class='game say'><span class='name'>[real_name]</span>[alt_name] whispers, <span class='message'>\"[message_a]\"</span></span>"
|
||||
rendered = "<span class='game say'><span class='name'>[GetVoice()]</span>[alt_name] whispers, <span class='message'>\"[message_a]\"</span></span>"
|
||||
|
||||
for (var/mob/M in heard_a)
|
||||
M.show_message(rendered, 2)
|
||||
@@ -131,15 +123,7 @@
|
||||
if (M.say_understands(src))
|
||||
var/message_c
|
||||
message_c = stars(message)
|
||||
if (!istype(src, /mob/living/carbon/human))
|
||||
rendered = "<span class='game say'><span class='name'>[name]</span> whispers, <span class='message'>\"[message_c]\"</span></span>"
|
||||
else if(istype(wear_mask, /obj/item/clothing/mask/gas/voice))
|
||||
if(wear_mask:vchange)
|
||||
rendered = "<span class='game say'><span class='name'>[wear_mask:voice]</span> whispers, <span class='message'>\"[message_c]\"</span></span>"
|
||||
else
|
||||
rendered = "<span class='game say'><span class='name'>[name]</span> whispers, <span class='message'>\"[message_c]\"</span></span>"
|
||||
else
|
||||
rendered = "<span class='game say'><span class='name'>[real_name]</span>[alt_name] whispers, <span class='message'>\"[message_c]\"</span></span>"
|
||||
rendered = "<span class='game say'><span class='name'>[GetVoice()]</span>[alt_name] whispers, <span class='message'>\"[message_c]\"</span></span>"
|
||||
M.show_message(rendered, 2)
|
||||
else
|
||||
rendered = "<span class='game say'><span class='name'>[src.voice_name]</span> whispers something.</span>"
|
||||
@@ -147,16 +131,7 @@
|
||||
|
||||
if (italics)
|
||||
message = "<i>[message]</i>"
|
||||
|
||||
if (!istype(src, /mob/living/carbon/human))
|
||||
rendered = "<span class='game say'><span class='name'>[name]</span> whispers, <span class='message'>\"[message]\"</span></span>"
|
||||
else if (istype(src.wear_mask, /obj/item/clothing/mask/gas/voice))
|
||||
if(wear_mask:vchange)
|
||||
rendered = "<span class='game say'><span class='name'>[wear_mask:voice]</span> whispers, <span class='message'>\"[message]\"</span></span>"
|
||||
else
|
||||
rendered = "<span class='game say'><span class='name'>[name]</span> whispers, <span class='message'>\"[message]\"</span></span>"
|
||||
else
|
||||
rendered = "<span class='game say'><span class='name'>[real_name]</span>[alt_name] whispers, <span class='message'>\"[message]\"</span></span>"
|
||||
rendered = "<span class='game say'><span class='name'>[GetVoice()]</span>[alt_name] whispers, <span class='message'>\"[message]\"</span></span>"
|
||||
|
||||
for (var/mob/M in dead_mob_list)
|
||||
if (!(M.client))
|
||||
|
||||
@@ -329,27 +329,22 @@
|
||||
if(nutrition >= 800)
|
||||
if(prob(40)) amount_grown++
|
||||
|
||||
//lay eggs or grow
|
||||
if(amount_grown >= 10 && !Victim && !Target)
|
||||
if(istype(src, /mob/living/carbon/metroid/adult))
|
||||
if(!client)
|
||||
var/number = pick(2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,4)
|
||||
for(var/i=1,i<=number,i++) // reproduce (has a small chance of producing 3 or 4 offspring)
|
||||
var/mob/living/carbon/metroid/M = new/mob/living/carbon/metroid(loc)
|
||||
// M.nutrition = round(nutrition * 0.9)
|
||||
M.powerlevel = round(powerlevel/number)
|
||||
M.Friends = Friends
|
||||
M.tame = tame
|
||||
M.rabid = rabid
|
||||
M.Discipline = Discipline
|
||||
if(i != 1) step_away(M,src)
|
||||
|
||||
del(src)
|
||||
if(!client && nutrition >= 1000)
|
||||
var/number = pick(1,1,1,1,1,1,2,2,2,3) //number of eggs laid
|
||||
var/obj/item/weapon/reagent_containers/food/snacks/roro_egg/E
|
||||
for(var/i=1,i<=number,i++)
|
||||
E = new/obj/item/weapon/reagent_containers/food/snacks/roro_egg(loc)
|
||||
src.nutrition -= 200
|
||||
step_away(E,src)
|
||||
|
||||
else
|
||||
if(!client)
|
||||
var/mob/living/carbon/metroid/adult/A = new/mob/living/carbon/metroid/adult(src.loc)
|
||||
A.nutrition = nutrition
|
||||
// A.nutrition += 100
|
||||
A.nutrition += 100
|
||||
A.powerlevel = max(0, powerlevel-1)
|
||||
A.Friends = Friends
|
||||
A.tame = tame
|
||||
|
||||
@@ -771,3 +771,80 @@ mob/living/carbon/metroid/var/temperature_resistance = T0C+75
|
||||
return 0
|
||||
|
||||
return 1
|
||||
|
||||
|
||||
// Basically this Metroid Core catalyzes reactions that normally wouldn't happen anywhere
|
||||
/obj/item/metroid_core
|
||||
name = "roro core"
|
||||
desc = "A very slimy and tender part of a Rorobeast. Legends claim these to have \"magical powers\"."
|
||||
icon = 'icons/obj/surgery.dmi'
|
||||
icon_state = "roro core"
|
||||
flags = TABLEPASS
|
||||
force = 1.0
|
||||
w_class = 1.0
|
||||
throwforce = 1.0
|
||||
throw_speed = 3
|
||||
throw_range = 6
|
||||
origin_tech = "biotech=4"
|
||||
var/POWERFLAG = 0 // sshhhhhhh
|
||||
var/Flush = 30
|
||||
var/Uses = 5 // uses before it goes inert
|
||||
|
||||
New()
|
||||
..()
|
||||
var/datum/reagents/R = new/datum/reagents(100)
|
||||
reagents = R
|
||||
R.my_atom = src
|
||||
POWERFLAG = rand(1,10)
|
||||
Uses = rand(7, 25)
|
||||
//flags |= NOREACT
|
||||
|
||||
spawn()
|
||||
Life()
|
||||
|
||||
proc/Life()
|
||||
while(src)
|
||||
sleep(25)
|
||||
Flush--
|
||||
if(Flush <= 0)
|
||||
reagents.clear_reagents()
|
||||
Flush = 30
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/roro_egg
|
||||
name = "roro egg"
|
||||
desc = "A small, gelatinous egg."
|
||||
icon = 'icons/mob/mob.dmi'
|
||||
icon_state = "roro egg-growing"
|
||||
bitesize = 12
|
||||
origin_tech = "biotech=4"
|
||||
var/grown = 0
|
||||
|
||||
New()
|
||||
..()
|
||||
reagents.add_reagent("nutriment", 5)
|
||||
spawn(rand(1200,1500))//the egg takes a while to "ripen"
|
||||
Grow()
|
||||
|
||||
proc/Grow()
|
||||
grown = 1
|
||||
icon_state = "roro egg-grown"
|
||||
processing_objects.Add(src)
|
||||
return
|
||||
|
||||
proc/Hatch()
|
||||
processing_objects.Remove(src)
|
||||
var/turf/T = get_turf(src)
|
||||
for(var/mob/O in hearers(T))
|
||||
O.show_message("\blue The [name] pulsates and quivers!")
|
||||
spawn(rand(50,100))
|
||||
for(var/mob/O in hearers(T))
|
||||
O.show_message("\blue The [name] bursts open!")
|
||||
new/mob/living/carbon/metroid(T)
|
||||
del(src)
|
||||
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/roro_egg/process()
|
||||
var/turf/location = get_turf(src)
|
||||
var/datum/gas_mixture/environment = location.return_air()
|
||||
if (environment.toxins > MOLES_PLASMA_VISIBLE)//plasma exposure causes the egg to hatch
|
||||
src.Hatch()
|
||||
@@ -187,7 +187,7 @@
|
||||
|
||||
/mob/living/carbon/metroid/verb/Reproduce()
|
||||
set category = "Roro"
|
||||
set desc = "This will make you split into a random number of Metroids (usually 2). NOTE: this will KILL you, but you will be transferred into one of the babies."
|
||||
set desc = "This will make you lay an egg. NOTE: This decreases your nutrition."
|
||||
|
||||
if(stat)
|
||||
src << "<i>I must be conscious to do this...</i>"
|
||||
@@ -195,32 +195,15 @@
|
||||
|
||||
if(istype(src, /mob/living/carbon/metroid/adult))
|
||||
if(amount_grown >= 10)
|
||||
if(input("Are you absolutely sure you want to reproduce? Your current body will cease to be, but your consciousness will be transferred into a produced rorobeast.") in list("Yes","No")=="Yes")
|
||||
if(stat)
|
||||
src << "<i>I must be conscious to do this...</i>"
|
||||
return
|
||||
|
||||
var/list/babies = list()
|
||||
var/number = pick(14;2,3,4)
|
||||
var/new_nutrition = round(nutrition * 0.9)
|
||||
var/new_powerlevel = round(powerlevel / number)
|
||||
for(var/i=1,i<=number,i++) // reproduce (has a small chance of producing 3 or 4 offspring)
|
||||
var/mob/living/carbon/metroid/M = new/mob/living/carbon/metroid(loc)
|
||||
M.nutrition = new_nutrition
|
||||
M.powerlevel = new_powerlevel
|
||||
if(i != 1) step_away(M,src)
|
||||
babies += M
|
||||
|
||||
var/mob/living/carbon/metroid/new_metroid = pick(babies)
|
||||
new_metroid.a_intent = "hurt"
|
||||
new_metroid.key = key
|
||||
|
||||
new_metroid << "<B>You are now a Rorobeast. Skree!</B>"
|
||||
del(src)
|
||||
if(src.nutrition >= 300)
|
||||
new/obj/item/weapon/reagent_containers/food/snacks/roro_egg(loc)
|
||||
src.nutrition -= 200
|
||||
else
|
||||
src << "<i>I have not fed enough...</i>"
|
||||
else
|
||||
src << "<i>I am not ready to reproduce yet...</i>"
|
||||
else
|
||||
src << "<i>I am not old enough to reproduce yet...</i>"
|
||||
src << "<i>I am not old enough to lay eggs yet...</i>"
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -108,7 +108,7 @@ var/list/department_radio_keys = list(
|
||||
return emote(copytext(message, 2))
|
||||
|
||||
var/alt_name = ""
|
||||
if (istype(src, /mob/living/carbon/human) && name != real_name)
|
||||
if (istype(src, /mob/living/carbon/human) && name != GetVoice())
|
||||
var/mob/living/carbon/human/H = src
|
||||
alt_name = " (as [H.get_id_name("Unknown")])"
|
||||
var/italics = 0
|
||||
@@ -306,7 +306,7 @@ var/list/department_radio_keys = list(
|
||||
listening|=M
|
||||
|
||||
var/turf/T = get_turf(src)
|
||||
var/list/W = view(message_range, T)
|
||||
var/list/W = hear(message_range, T)
|
||||
|
||||
for (var/obj/O in ((W | contents)-used_radios))
|
||||
W |= O
|
||||
@@ -337,12 +337,13 @@ var/list/department_radio_keys = list(
|
||||
if (O)
|
||||
O.hear_talk(src, message)
|
||||
*/
|
||||
if(isbrain(src))//For brains to properly talk if they are in an MMI..or in a brain. Could be extended to other mobs I guess.
|
||||
|
||||
/* if(isbrain(src))//For brains to properly talk if they are in an MMI..or in a brain. Could be extended to other mobs I guess.
|
||||
for(var/obj/O in loc)//Kinda ugly but whatever.
|
||||
if(O)
|
||||
spawn(0)
|
||||
O.hear_talk(src, message)
|
||||
|
||||
*/
|
||||
|
||||
|
||||
var/list/heard_a = list() // understood us
|
||||
@@ -374,15 +375,8 @@ var/list/department_radio_keys = list(
|
||||
|
||||
if (italics)
|
||||
message_a = "<i>[message_a]</i>"
|
||||
if (!istype(src, /mob/living/carbon/human))
|
||||
rendered = "<span class='game say'><span class='name'>[name]</span> <span class='message'>[message_a]</span></span>"
|
||||
else if(istype(wear_mask, /obj/item/clothing/mask/gas/voice))
|
||||
if(wear_mask:vchange)
|
||||
rendered = "<span class='game say'><span class='name'>[wear_mask:voice]</span> <span class='message'>[message_a]</span></span>"
|
||||
else
|
||||
rendered = "<span class='game say'><span class='name'>[name]</span> <span class='message'>[message_a]</span></span>"
|
||||
else
|
||||
rendered = "<span class='game say'><span class='name'>[real_name]</span>[alt_name] <span class='message'>[message_a]</span></span>"
|
||||
|
||||
rendered = "<span class='game say'><span class='name'>[GetVoice()]</span>[alt_name] <span class='message'>[message_a]</span></span>"
|
||||
|
||||
for (var/M in heard_a)
|
||||
if(hascall(M,"show_message"))
|
||||
@@ -436,6 +430,8 @@ var/list/department_radio_keys = list(
|
||||
|
||||
log_say("[name]/[key] : [message]")
|
||||
|
||||
/obj/effect/speech_bubble
|
||||
var/mob/parent
|
||||
/obj/effect/speech_bubble var/mob/parent
|
||||
/mob/living/proc/GetVoice()
|
||||
return name
|
||||
|
||||
|
||||
|
||||
@@ -41,6 +41,7 @@
|
||||
var/mob/living/silicon/ai/parent = null
|
||||
|
||||
var/camera_light_on = 0 //Defines if the AI toggled the light on the camera it's looking through.
|
||||
var/datum/trackable/track = null
|
||||
|
||||
/mob/living/silicon/ai/New(loc, var/datum/ai_laws/L, var/obj/item/device/mmi/B, var/safety = 0)
|
||||
var/list/possibleNames = ai_names
|
||||
|
||||
@@ -75,6 +75,9 @@
|
||||
for(var/camera in cameras)
|
||||
var/obj/machinery/camera/c = camera
|
||||
|
||||
if(!c)
|
||||
continue
|
||||
|
||||
if(!c.can_use())
|
||||
continue
|
||||
|
||||
@@ -124,8 +127,6 @@
|
||||
|
||||
/datum/camerachunk/New(loc, x, y, z)
|
||||
|
||||
set background = 1
|
||||
|
||||
// 0xf = 15
|
||||
x &= ~0xf
|
||||
y &= ~0xf
|
||||
@@ -144,6 +145,9 @@
|
||||
|
||||
for(var/camera in cameras)
|
||||
var/obj/machinery/camera/c = camera
|
||||
if(!c)
|
||||
continue
|
||||
|
||||
if(!c.can_use())
|
||||
continue
|
||||
|
||||
|
||||
@@ -94,7 +94,7 @@
|
||||
// This will move the AIEye. It will also cause lights near the eye to light up, if toggled.
|
||||
// This is handled in the proc below this one.
|
||||
|
||||
/client/AIMove(n, direct, var/mob/living/silicon/ai/user)
|
||||
/client/proc/AIMove(n, direct, var/mob/living/silicon/ai/user)
|
||||
|
||||
var/initial = initial(user.sprint)
|
||||
var/max_sprint = 50
|
||||
|
||||
@@ -1,71 +0,0 @@
|
||||
/var/const/SHARED_TYPES_WEIGHT = 5
|
||||
/var/const/CAMERA_PROXIMITY_PREFERENCE = 0.2
|
||||
// the smaller this is, the more a straight line will be preferred over a closer camera when changing cameras
|
||||
// if you set this to 0 the game will crash. don't do that.
|
||||
// if you set it to be negative the algorithm will do completely nonsensical things (like choosing the camera that's
|
||||
// the farthest away). don't do that.
|
||||
|
||||
/client/proc/AIMove(n,direct,var/mob/living/silicon/ai/user)
|
||||
if(!user) return
|
||||
if(user.control_disabled) return
|
||||
|
||||
var/min_dist = 1e8
|
||||
var/obj/machinery/camera/closest = null
|
||||
var/atom/old = (user.current?user.current : user.loc)
|
||||
|
||||
if(!old) return
|
||||
|
||||
var/dx = 0
|
||||
var/dy = 0
|
||||
if(direct & NORTH)
|
||||
dy = 1
|
||||
else if(direct & SOUTH)
|
||||
dy = -1
|
||||
if(direct & EAST)
|
||||
dx = 1
|
||||
else if(direct & WEST)
|
||||
dx = -1
|
||||
|
||||
var/area/A = get_area(old)
|
||||
var/list/old_types = dd_text2list("[A.type]", "/")
|
||||
|
||||
for(var/obj/machinery/camera/current in cameranet.cameras)
|
||||
if(user.network != current.network) continue
|
||||
if(!current.status) continue // ignore disabled cameras
|
||||
|
||||
//make sure it's the right direction
|
||||
if(dx && (current.x * dx <= old.x * dx))
|
||||
continue
|
||||
if(dy && (current.y * dy <= old.y * dy))
|
||||
continue
|
||||
|
||||
var/shared_types = 0 //how many levels deep the old camera and the closest camera's areas share
|
||||
//for instance, /area/A and /area/B would have shared_types = 2 (because of how dd_text2list works)
|
||||
//whereas area/A/B and /area/A/C would have it as 3
|
||||
|
||||
var/area/cur_area = get_area(current)
|
||||
if(!cur_area) continue
|
||||
var/list/new_types = dd_text2list("[cur_area.type]", "/")
|
||||
for(var/i = 1; i <= old_types.len && i <= new_types.len; i++)
|
||||
if(old_types[i] == new_types[i])
|
||||
shared_types++
|
||||
else
|
||||
break
|
||||
|
||||
//don't let it be too far from the current one in the axis perpindicular to the direction of travel,
|
||||
//but let it be farther from that if it's in the same area
|
||||
//something in the same hallway but farther away beats something in the same hallway
|
||||
|
||||
var/distance = abs((current.y - old.y)/(CAMERA_PROXIMITY_PREFERENCE + abs(dy))) + abs((current.x - old.x)/(CAMERA_PROXIMITY_PREFERENCE + abs(dx)))
|
||||
distance -= SHARED_TYPES_WEIGHT * shared_types
|
||||
//weight things in the same area as this so they count as being closer - makes you stay in the same area
|
||||
//when possible
|
||||
|
||||
if(distance < min_dist)
|
||||
//closer, or this is in the same area and the current closest isn't
|
||||
min_dist = distance
|
||||
closest = current
|
||||
|
||||
if(!closest)
|
||||
return
|
||||
user.switchCamera(closest)
|
||||
@@ -65,8 +65,6 @@
|
||||
updatename("Default")
|
||||
updateicon()
|
||||
|
||||
playsound(src, 'sound/voice/liveagain.ogg', 75, 1)
|
||||
|
||||
if(!cell)
|
||||
cell = new /obj/item/weapon/cell(src)
|
||||
cell.maxcharge = 7500
|
||||
@@ -101,6 +99,9 @@
|
||||
camera.status = 0
|
||||
..()
|
||||
|
||||
playsound(loc, 'sound/voice/liveagain.ogg', 75, 1)
|
||||
|
||||
|
||||
//If there's an MMI in the robot, have it ejected when the mob goes away. --NEO
|
||||
//Improved /N
|
||||
/mob/living/silicon/robot/Del()
|
||||
|
||||
@@ -68,33 +68,40 @@
|
||||
|
||||
switch(stance)
|
||||
if(BEAR_STANCE_IDLE)
|
||||
var/obj/mecha/M = null
|
||||
var/mob/living/L = null
|
||||
stop_automated_movement = 0
|
||||
stance_step++
|
||||
if(stance_step > 5)
|
||||
stance_step = 0
|
||||
for( var/mob/living/L in viewers(7,src) )
|
||||
for(L in viewers(7,src))
|
||||
if(isbear(L)) continue
|
||||
if(!L.stat)
|
||||
emote("stares alertly at [L]")
|
||||
stance = BEAR_STANCE_ALERT
|
||||
target_mob = L
|
||||
break
|
||||
for(M in view(7,src))
|
||||
if (M.occupant)
|
||||
stance = BEAR_STANCE_ALERT
|
||||
target_mob = M
|
||||
break
|
||||
if (target_mob)
|
||||
emote("stares alertly at [target_mob]")
|
||||
|
||||
if(BEAR_STANCE_ALERT)
|
||||
stop_automated_movement = 1
|
||||
var/found_mob = 0
|
||||
for( var/mob/living/L in viewers(7,src) )
|
||||
if(isbear(L)) continue
|
||||
if(!L.stat)
|
||||
if(target_mob in SA_search(target_mob))
|
||||
if(target_mob && !(SA_attackable(target_mob)))
|
||||
stance_step = max(0, stance_step) //If we have not seen a mob in a while, the stance_step will be negative, we need to reset it to 0 as soon as we see a mob again.
|
||||
stance_step++
|
||||
found_mob = 1
|
||||
target_mob = L
|
||||
src.dir = get_dir(src,target_mob) //Keep staring at the mob
|
||||
|
||||
if(stance_step in list(1,4,7)) //every 3 ticks
|
||||
var/action = pick( list( "growls at [L]", "stares angrily at [L]", "prepares to attack [L]", "closely watches [L]" ) )
|
||||
var/action = pick( list( "growls at [target_mob]", "stares angrily at [target_mob]", "prepares to attack [target_mob]", "closely watches [target_mob]" ) )
|
||||
if(action)
|
||||
emote(action)
|
||||
break
|
||||
if(!found_mob)
|
||||
stance_step--
|
||||
|
||||
@@ -104,10 +111,10 @@
|
||||
stance = BEAR_STANCE_ATTACK
|
||||
if(BEAR_STANCE_ATTACK) //This one should only be active for one tick,
|
||||
stop_automated_movement = 1
|
||||
if(!target_mob || target_mob.stat)
|
||||
if(!target_mob || SA_attackable(target_mob))
|
||||
stance = BEAR_STANCE_ALERT
|
||||
stance_step = 5 //Make it very alert, so it quickly attacks again if a mob returns
|
||||
if(target_mob in viewers(7,src))
|
||||
if(target_mob in SA_search(target_mob))
|
||||
walk_to(src, target_mob, 1, 3)
|
||||
stance = BEAR_STANCE_ATTACKING
|
||||
stance_step = 0
|
||||
@@ -115,11 +122,11 @@
|
||||
|
||||
stop_automated_movement = 1
|
||||
stance_step++
|
||||
if(!target_mob || target_mob.stat)
|
||||
if(!target_mob || SA_attackable(target_mob))
|
||||
stance = BEAR_STANCE_ALERT
|
||||
stance_step = 5 //Make it very alert, so it quickly attacks again if a mob returns
|
||||
return
|
||||
if(!(target_mob in viewers(7,src)))
|
||||
if(!(target_mob in SA_search(target_mob)))
|
||||
stance = BEAR_STANCE_ALERT
|
||||
stance_step = 5 //Make it very alert, so it quickly attacks again if a mob returns
|
||||
target_mob = null
|
||||
@@ -137,6 +144,9 @@
|
||||
else if(isliving(target_mob))
|
||||
var/mob/living/L = target_mob
|
||||
L.adjustBruteLoss(damage)
|
||||
else if(istype(target_mob,/obj/mecha))
|
||||
var/obj/mecha/M = target_mob
|
||||
M.attack_animal(src)
|
||||
|
||||
if(stance_step >= 20) //attacks for 20 ticks, then it gets tired and needs to rest
|
||||
emote( "is worn out and needs to rest" )
|
||||
@@ -148,7 +158,7 @@
|
||||
stop_automated_movement = 1
|
||||
stance_step++
|
||||
if(stance_step >= 10) //rests for 10 ticks
|
||||
if(target_mob && target_mob in viewers(7,src))
|
||||
if(target_mob && target_mob in SA_search(target_mob))
|
||||
stance = BEAR_STANCE_ATTACK //If the mob he was chasing is still nearby, resume the attack, otherwise go idle.
|
||||
else
|
||||
stance = BEAR_STANCE_IDLE
|
||||
|
||||
@@ -70,24 +70,32 @@
|
||||
if(!stat)
|
||||
switch(stance)
|
||||
if(CARP_STANCE_IDLE)
|
||||
var/obj/mecha/M = null
|
||||
var/mob/living/L = null
|
||||
stop_automated_movement = 0
|
||||
stance_step++
|
||||
if(stance_step > 5)
|
||||
stance_step = 0
|
||||
for( var/mob/living/L in viewers(7,src) )
|
||||
for(L in viewers(7,src))
|
||||
if(iscarp(L)) continue
|
||||
if(!L.stat)
|
||||
emote("gnashes at [L]")
|
||||
stance = CARP_STANCE_ATTACK
|
||||
target_mob = L
|
||||
break
|
||||
for(M in view(7,src))
|
||||
if (M.occupant)
|
||||
stance = CARP_STANCE_ATTACK
|
||||
target_mob = M
|
||||
break
|
||||
if (target_mob)
|
||||
emote("nashes at [target_mob]")
|
||||
|
||||
if(CARP_STANCE_ATTACK) //This one should only be active for one tick
|
||||
stop_automated_movement = 1
|
||||
if(!target_mob || target_mob.stat)
|
||||
if(!target_mob || SA_attackable(target_mob))
|
||||
stance = CARP_STANCE_IDLE
|
||||
stance_step = 5 //Make it very alert, so it quickly attacks again if a mob returns
|
||||
if(target_mob in viewers(7,src))
|
||||
if(target_mob in SA_search(target_mob))
|
||||
walk_to(src, target_mob, 1, 3)
|
||||
stance = CARP_STANCE_ATTACKING
|
||||
stance_step = 0
|
||||
@@ -95,12 +103,12 @@
|
||||
if(CARP_STANCE_ATTACKING)
|
||||
stop_automated_movement = 1
|
||||
stance_step++
|
||||
if(!target_mob || target_mob.stat)
|
||||
if(!target_mob || SA_attackable(target_mob))
|
||||
stance = CARP_STANCE_IDLE
|
||||
stance_step = 3 //Make it very alert, so it quickly attacks again if a mob returns
|
||||
target_mob = null
|
||||
return
|
||||
if(!(target_mob in viewers(7,src)))
|
||||
if(!(target_mob in SA_search(target_mob)))
|
||||
stance = CARP_STANCE_IDLE
|
||||
stance_step = 1
|
||||
target_mob = null
|
||||
@@ -112,6 +120,9 @@
|
||||
if(prob(10))
|
||||
L.Weaken(5)
|
||||
L.visible_message("<span class='danger'>\the [src] knocks down \the [L]!</span>")
|
||||
if(istype(target_mob,/obj/mecha))
|
||||
var/obj/mecha/M = target_mob
|
||||
M.attack_animal(src)
|
||||
|
||||
/mob/living/simple_animal/carp/Process_Spacemove(var/check_drift = 0)
|
||||
return //No drifting in space for space carp! //original comments do not steal
|
||||
@@ -69,29 +69,37 @@
|
||||
switch(stance)
|
||||
if(CLOWN_STANCE_IDLE)
|
||||
if (src.hostile == 0) return
|
||||
for( var/mob/living/L in viewers(7,src) )
|
||||
var/obj/mecha/M = null
|
||||
var/mob/living/L = null
|
||||
for(L in viewers(7,src))
|
||||
if(isclown(L)) continue
|
||||
if(!L.stat)
|
||||
emote("honks menacingly at [L]")
|
||||
stance = CLOWN_STANCE_ATTACK
|
||||
target_mob = L
|
||||
break
|
||||
for(M in view(7,src))
|
||||
if (M.occupant)
|
||||
stance = CLOWN_STANCE_ATTACK
|
||||
target_mob = M
|
||||
break
|
||||
if (target_mob)
|
||||
emote("honks menacingly at [target_mob]")
|
||||
|
||||
if(CLOWN_STANCE_ATTACK) //This one should only be active for one tick
|
||||
stop_automated_movement = 1
|
||||
if(!target_mob || target_mob.stat)
|
||||
if(!target_mob || SA_attackable(target_mob))
|
||||
stance = CLOWN_STANCE_IDLE
|
||||
if(target_mob in viewers(7,src))
|
||||
if(target_mob in SA_search(target_mob))
|
||||
walk_to(src, target_mob, 1, 3)
|
||||
stance = CLOWN_STANCE_ATTACKING
|
||||
|
||||
if(CLOWN_STANCE_ATTACKING)
|
||||
stop_automated_movement = 1
|
||||
if(!target_mob || target_mob.stat)
|
||||
if(!target_mob || SA_attackable(target_mob))
|
||||
stance = CLOWN_STANCE_IDLE
|
||||
target_mob = null
|
||||
return
|
||||
if(!(target_mob in viewers(7,src)))
|
||||
if(!(target_mob in SA_search(target_mob)))
|
||||
stance = CLOWN_STANCE_IDLE
|
||||
target_mob = null
|
||||
return
|
||||
@@ -102,9 +110,16 @@
|
||||
if(prob(10))
|
||||
L.Weaken(5)
|
||||
L.visible_message("<span class='danger'>\the [src] slips \the [L]!</span>")
|
||||
for(var/mob/M in viewers(src, null))
|
||||
if(istype(M, /mob/living/simple_animal/clown))
|
||||
var/mob/living/simple_animal/clown/C = M
|
||||
for(var/mob/H in viewers(src, null))
|
||||
if(istype(H, /mob/living/simple_animal/clown))
|
||||
var/mob/living/simple_animal/clown/C = H
|
||||
C.hostile = 1
|
||||
if(istype(target_mob,/obj/mecha))
|
||||
var/obj/mecha/M = target_mob
|
||||
M.attack_animal(src)
|
||||
for(var/mob/H in viewers(src, null))
|
||||
if(istype(H, /mob/living/simple_animal/clown))
|
||||
var/mob/living/simple_animal/clown/C = H
|
||||
C.hostile = 1
|
||||
|
||||
/mob/living/simple_animal/clown/bullet_act(var/obj/item/projectile/Proj)
|
||||
|
||||
@@ -415,3 +415,21 @@
|
||||
|
||||
/mob/living/simple_animal/adjustBruteLoss(damage)
|
||||
health -= damage
|
||||
|
||||
|
||||
/mob/living/simple_animal/proc/SA_search(target_mob)
|
||||
if(isliving(target_mob))
|
||||
return (viewers(7,src))
|
||||
if(istype(target_mob,/obj))
|
||||
return (view(7,src))
|
||||
|
||||
/mob/living/simple_animal/proc/SA_attackable(target_mob)
|
||||
if (isliving(target_mob))
|
||||
var/mob/living/L = target_mob
|
||||
if(!L.stat)
|
||||
return (0)
|
||||
if (istype(target_mob,/obj/mecha))
|
||||
var/obj/mecha/M = target_mob
|
||||
if (M.occupant)
|
||||
return (0)
|
||||
return (1)
|
||||
@@ -71,19 +71,26 @@
|
||||
if(!stat)
|
||||
switch(stance)
|
||||
if(SYNDICATE_STANCE_IDLE)
|
||||
var/obj/mecha/M = null
|
||||
var/mob/living/L = null
|
||||
stop_automated_movement = 0
|
||||
for( var/mob/living/L in viewers(7,src) )
|
||||
for(L in viewers(7,src))
|
||||
if(isSyndicate(L)) continue
|
||||
if(!L.stat)
|
||||
stance = SYNDICATE_STANCE_ATTACK
|
||||
target_mob = L
|
||||
break
|
||||
for(M in view(7,src))
|
||||
if (M.occupant)
|
||||
stance = SYNDICATE_STANCE_ATTACK
|
||||
target_mob = M
|
||||
break
|
||||
|
||||
if(SYNDICATE_STANCE_ATTACK) //This one should only be active for one tick
|
||||
stop_automated_movement = 1
|
||||
if(!target_mob || target_mob.stat)
|
||||
if(!target_mob || SA_attackable(target_mob))
|
||||
stance = SYNDICATE_STANCE_IDLE
|
||||
if(target_mob in viewers(10,src))
|
||||
if(target_mob in SA_search(target_mob))
|
||||
if(ranged)
|
||||
if(get_dist(src, target_mob) <= 6)
|
||||
OpenFire(target_mob)
|
||||
@@ -95,11 +102,11 @@
|
||||
|
||||
if(SYNDICATE_STANCE_ATTACKING)
|
||||
stop_automated_movement = 1
|
||||
if(!target_mob || target_mob.stat)
|
||||
if(!target_mob || SA_attackable(target_mob))
|
||||
stance = SYNDICATE_STANCE_IDLE
|
||||
target_mob = null
|
||||
return
|
||||
if(!(target_mob in viewers(7,src)))
|
||||
if(!(target_mob in SA_search(target_mob)))
|
||||
stance = SYNDICATE_STANCE_IDLE
|
||||
target_mob = null
|
||||
return
|
||||
@@ -107,8 +114,9 @@
|
||||
if(isliving(target_mob))
|
||||
var/mob/living/L = target_mob
|
||||
L.attack_animal(src)
|
||||
|
||||
|
||||
if(istype(target_mob,/obj/mecha))
|
||||
var/obj/mecha/M = target_mob
|
||||
M.attack_animal(src)
|
||||
|
||||
/mob/living/simple_animal/syndicate/proc/OpenFire(target_mob)
|
||||
src.target = target_mob
|
||||
|
||||
@@ -42,7 +42,7 @@ Put (mob/proc)s here that are in dire need of a code cleanup.
|
||||
v.affected_mob = src
|
||||
v.strain_data = v.strain_data.Copy()
|
||||
v.holder = src
|
||||
if(prob(5))
|
||||
if(v.can_carry && prob(5))
|
||||
v.carrier = 1
|
||||
return
|
||||
|
||||
@@ -194,7 +194,7 @@ Put (mob/proc)s here that are in dire need of a code cleanup.
|
||||
v.affected_mob = src
|
||||
v.strain_data = v.strain_data.Copy()
|
||||
v.holder = src
|
||||
if(prob(5))
|
||||
if(v.can_carry && prob(5))
|
||||
v.carrier = 1
|
||||
return
|
||||
return
|
||||
|
||||
@@ -36,6 +36,8 @@
|
||||
switch(owner.icon_action_button)
|
||||
if("action_hardhat", "action_welding")
|
||||
usr.update_inv_head()
|
||||
if("action_welding_g")
|
||||
usr.update_inv_glasses()
|
||||
if("action_jetpack")
|
||||
usr.update_inv_back()
|
||||
|
||||
|
||||
@@ -44,14 +44,10 @@
|
||||
P.updateinfolinks()
|
||||
|
||||
P.loc = user.loc
|
||||
if(ishuman(user))
|
||||
user.put_in_hands(P)
|
||||
user << "<span class='notice'>You take a paper out of the bin.</span>"
|
||||
else
|
||||
P.loc = get_turf_loc(src)
|
||||
user << "<span class='notice'>You take a paper out of the bin.</span>"
|
||||
user.put_in_hands(P)
|
||||
user << "<span class='notice'>You take [P] out of the [src].</span>"
|
||||
else
|
||||
user << "<span class='notice'>The paper bin is empty!</span>"
|
||||
user << "<span class='notice'>[src] is empty!</span>"
|
||||
|
||||
add_fingerprint(user)
|
||||
return
|
||||
@@ -63,7 +59,7 @@
|
||||
|
||||
user.drop_item()
|
||||
i.loc = src
|
||||
usr << "<span class='notice'>You put the paper on the top of the paper bin.</span>"
|
||||
user << "<span class='notice'>You put [i] in [src].</span>"
|
||||
papers.Add(i)
|
||||
amount++
|
||||
|
||||
|
||||
@@ -38,6 +38,8 @@
|
||||
return
|
||||
|
||||
/obj/machinery/emitter/Del()
|
||||
message_admins("Emitter deleted at ([x],[y],[z] - <A HREF='?src=%holder_ref%;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)",0,1)
|
||||
log_game("Emitter deleted at ([x],[y],[z])")
|
||||
investigate_log("<font color='red'>deleted</font> at ([x],[y],[z])","singulo")
|
||||
..()
|
||||
|
||||
@@ -56,6 +58,8 @@
|
||||
src.active = 0
|
||||
user << "You turn off the [src]."
|
||||
src.use_power = 1
|
||||
message_admins("Emitter turned off by [key_name(user, user.client)](<A HREF='?src=%holder_ref%;adminmoreinfo=\ref[user]'>?</A>) in ([x],[y],[z] - <A HREF='?src=%holder_ref%;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)",0,1)
|
||||
log_game("Emitter turned off by [user.ckey]([user]) in ([x],[y],[z])")
|
||||
investigate_log("turned <font color='red'>off</font> by [user.key]","singulo")
|
||||
else
|
||||
src.active = 1
|
||||
|
||||
@@ -81,6 +81,9 @@
|
||||
if(href_list["togglep"])
|
||||
src.toggle_power()
|
||||
investigate_log("turned [active?"<font color='red'>ON</font>":"<font color='green'>OFF</font>"] by [usr.key]","singulo")
|
||||
if (active)
|
||||
message_admins("PA Control Computer turned ON by [key_name(usr, usr.client)](<A HREF='?src=%holder_ref%;adminmoreinfo=\ref[usr]'>?</A>) in ([x],[y],[z] - <A HREF='?src=%holder_ref%;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)",0,1)
|
||||
log_game("PA Control Computer turned ON by [usr.ckey]([usr]) in ([x],[y],[z])")
|
||||
else if(href_list["scan"])
|
||||
src.part_scan()
|
||||
else if(href_list["strengthup"])
|
||||
@@ -88,6 +91,8 @@
|
||||
if(strength > 2)
|
||||
strength = 2
|
||||
else
|
||||
message_admins("PA Control Computer increased to [strength] by [key_name(usr, usr.client)](<A HREF='?src=%holder_ref%;adminmoreinfo=\ref[usr]'>?</A>) in ([x],[y],[z] - <A HREF='?src=%holder_ref%;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)",0,1)
|
||||
log_game("PA Control Computer increased to [strength] by [usr.ckey]([usr]) in ([x],[y],[z])")
|
||||
investigate_log("increased to <font color='red'>[strength]</font> by [usr.key]","singulo")
|
||||
for(var/obj/structure/particle_accelerator/part in connected_parts)
|
||||
part.strength = strength
|
||||
|
||||
@@ -465,6 +465,22 @@ var/global/list/uneatable = list(
|
||||
grav_pull = 10 //How many tiles out do we pull?
|
||||
consume_range = 3 //How many tiles out do we eat
|
||||
|
||||
/obj/machinery/singularity/narsie/large
|
||||
name = "Nar-Sie"
|
||||
icon = 'icons/obj/narsie.dmi'
|
||||
// Pixel stuff centers Narsie.
|
||||
pixel_x = -236
|
||||
pixel_y = -256
|
||||
current_size = 12
|
||||
move_self = 1 //Do we move on our own?
|
||||
consume_range = 12 //How many tiles out do we eat
|
||||
|
||||
/obj/machinery/singularity/narsie/large/New()
|
||||
..()
|
||||
world << "<font size='28' color='red'><b>NAR-SIE HAS RISEN</b></font>"
|
||||
if(emergency_shuttle)
|
||||
emergency_shuttle.incall(0.5) // Cannot recall
|
||||
|
||||
/obj/machinery/singularity/narsie/process()
|
||||
eat()
|
||||
if(!target || prob(5))
|
||||
|
||||
@@ -78,6 +78,9 @@
|
||||
else
|
||||
return
|
||||
|
||||
for (var/obj/effect/proc_holder/spell/S in M.spell_list)
|
||||
new_mob.spell_list += new S.type
|
||||
|
||||
new_mob.a_intent = "hurt"
|
||||
if(M.mind)
|
||||
M.mind.transfer_to(new_mob)
|
||||
|
||||
@@ -1119,8 +1119,12 @@ datum
|
||||
..()
|
||||
return
|
||||
reaction_obj(var/obj/O, var/volume)
|
||||
if((!O) || (!volume)) return 0
|
||||
src = null
|
||||
if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/roro_egg))
|
||||
var/obj/item/weapon/reagent_containers/food/snacks/roro_egg/egg = O
|
||||
if (egg.grown)
|
||||
egg.Hatch()
|
||||
if((!O) || (!volume)) return 0
|
||||
var/turf/the_turf = get_turf(O)
|
||||
var/datum/gas_mixture/napalm = new
|
||||
var/datum/gas/volatile_fuel/fuel = new
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
|
||||
var/obj/effect/decal/D = new/obj/effect/decal(get_turf(src))
|
||||
D.create_reagents(amount_per_transfer_from_this)
|
||||
reagents.trans_to(D, amount_per_transfer_from_this)
|
||||
reagents.trans_to(D, amount_per_transfer_from_this, 1/3)
|
||||
|
||||
D.name = "chemicals"
|
||||
D.icon = 'icons/obj/chempuff.dmi'
|
||||
|
||||
@@ -20,8 +20,10 @@
|
||||
id = "round_end_belt"
|
||||
|
||||
// create a conveyor
|
||||
/obj/machinery/conveyor/New()
|
||||
..()
|
||||
/obj/machinery/conveyor/New(loc, newdir, on = 0)
|
||||
..(loc)
|
||||
if(newdir)
|
||||
dir = newdir
|
||||
switch(dir)
|
||||
if(NORTH)
|
||||
forwards = NORTH
|
||||
@@ -47,6 +49,9 @@
|
||||
if(SOUTHWEST)
|
||||
forwards = WEST
|
||||
backwards = NORTH
|
||||
if(on)
|
||||
operating = 1
|
||||
setmove()
|
||||
|
||||
/obj/machinery/conveyor/proc/setmove()
|
||||
if(operating == 1)
|
||||
|
||||
@@ -137,6 +137,8 @@ var/MAX_EXPLOSION_RANGE = 14
|
||||
|
||||
#define HUMAN_STRIP_DELAY 40 //takes 40ds = 4s to strip someone.
|
||||
|
||||
#define ALIEN_SELECT_AFK_BUFFER 2 // How many minutes that a person can be AFK before not being allowed to be an alien.
|
||||
|
||||
#define NORMPIPERATE 30 //pipe-insulation rate divisor
|
||||
#define HEATPIPERATE 8 //heat-exch pipe insulation
|
||||
|
||||
@@ -449,7 +451,7 @@ var/list/liftable_structures = list(\
|
||||
/obj/machinery/hydroponics, \
|
||||
/obj/machinery/computer, \
|
||||
/obj/machinery/optable, \
|
||||
/obj/machinery/dispenser, \
|
||||
/obj/structure/dispenser, \
|
||||
/obj/machinery/gibber, \
|
||||
/obj/machinery/microwave, \
|
||||
/obj/machinery/vending, \
|
||||
|
||||
@@ -9,7 +9,7 @@ ALERT_RED_DOWNTO The self-destruct mechanism has been deactivated, there is stil
|
||||
ALERT_DELTA The station's self-destruct mechanism has been engaged. All crew are instructed to obey all instructions given by heads of staff. Any violations of these orders can be punished by death. This is not a drill.
|
||||
|
||||
## Add a # infront of this if you want to use the SQL based admin system, the legacy system uses admins.txt
|
||||
#ADMIN_LEGACY_SYSTEM
|
||||
ADMIN_LEGACY_SYSTEM
|
||||
|
||||
## log OOC channel
|
||||
LOG_OOC
|
||||
|
||||
|
Before Width: | Height: | Size: 6.4 KiB After Width: | Height: | Size: 6.9 KiB |
|
Before Width: | Height: | Size: 122 KiB After Width: | Height: | Size: 122 KiB |
|
Before Width: | Height: | Size: 123 KiB After Width: | Height: | Size: 123 KiB |
|
Before Width: | Height: | Size: 182 KiB After Width: | Height: | Size: 182 KiB |
|
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 5.6 KiB After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 57 KiB After Width: | Height: | Size: 57 KiB |
|
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 30 KiB |
BIN
icons/obj/machines/artillery.dmi
Normal file
|
After Width: | Height: | Size: 14 KiB |