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>
This commit is contained in:
Cael_Aislinn
2012-10-21 00:25:05 +10:00
455 changed files with 6802 additions and 4986 deletions

120
SQL/feedback_schema.sql Normal file
View 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 ;

View File

@@ -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

View File

@@ -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.

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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!"

View File

@@ -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>"

View File

@@ -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)

View File

@@ -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

View File

@@ -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)

View File

@@ -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

View File

@@ -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'

View File

@@ -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."

View File

@@ -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."

View File

@@ -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."

View File

@@ -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)

View File

@@ -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) .()

View File

@@ -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

View File

@@ -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

View File

@@ -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"

View File

@@ -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>"

View File

@@ -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"
*/

View File

@@ -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()

View File

@@ -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)

View File

@@ -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)

View File

@@ -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]"

View File

@@ -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

View File

@@ -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

View File

@@ -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")

View File

@@ -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"

View File

@@ -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)

View File

@@ -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

View File

@@ -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>

View File

@@ -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

View 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

View File

@@ -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"

View File

@@ -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

View File

@@ -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)

View File

@@ -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)

View File

@@ -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

View File

@@ -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()

View File

@@ -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)

View File

@@ -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)

View 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

View 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

View File

@@ -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)
..()

View File

@@ -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>"

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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"))

View File

@@ -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) )

View File

@@ -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>"

View File

@@ -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

View File

@@ -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")

View File

@@ -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 != "")

View File

@@ -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."

View File

@@ -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
/*

View File

@@ -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))
..()

View File

@@ -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)

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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))

View File

@@ -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

View File

@@ -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()

View File

@@ -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>"

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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()

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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)

View File

@@ -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

View File

@@ -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

View File

@@ -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()

View File

@@ -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++

View File

@@ -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

View File

@@ -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

View File

@@ -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))

View File

@@ -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)

View File

@@ -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

View File

@@ -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'

View File

@@ -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)

View File

@@ -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, \

View File

@@ -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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 122 KiB

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 123 KiB

After

Width:  |  Height:  |  Size: 123 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 182 KiB

After

Width:  |  Height:  |  Size: 182 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.6 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 57 KiB

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

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