mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-08-29 16:10:02 +01:00
Merge branch 'master' of https://github.com/Baystation12/Baystation12
This commit is contained in:
@@ -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 ;
|
||||
+21
-17
@@ -107,6 +107,7 @@
|
||||
#define FILE_DIR "code/modules"
|
||||
#define FILE_DIR "code/modules/admin"
|
||||
#define FILE_DIR "code/modules/admin/DB ban"
|
||||
#define FILE_DIR "code/modules/admin/permissionverbs"
|
||||
#define FILE_DIR "code/modules/admin/verbs"
|
||||
#define FILE_DIR "code/modules/assembly"
|
||||
#define FILE_DIR "code/modules/awaymissions"
|
||||
@@ -159,6 +160,8 @@
|
||||
#define FILE_DIR "code/modules/mob/living/silicon/pai"
|
||||
#define FILE_DIR "code/modules/mob/living/silicon/robot"
|
||||
#define FILE_DIR "code/modules/mob/living/simple_animal"
|
||||
#define FILE_DIR "code/modules/mob/living/simple_animal/friendly"
|
||||
#define FILE_DIR "code/modules/mob/living/simple_animal/hostile"
|
||||
#define FILE_DIR "code/modules/mob/new_player"
|
||||
#define FILE_DIR "code/modules/mob/simple_animal"
|
||||
#define FILE_DIR "code/modules/paperwork"
|
||||
@@ -418,7 +421,6 @@
|
||||
#include "code\game\gamemodes\intercept_report.dm"
|
||||
#include "code\game\gamemodes\objective.dm"
|
||||
#include "code\game\gamemodes\setupgame.dm"
|
||||
#include "code\game\gamemodes\autotraitor\autotraitor.dm"
|
||||
#include "code\game\gamemodes\blob\blob.dm"
|
||||
#include "code\game\gamemodes\blob\blob_finish.dm"
|
||||
#include "code\game\gamemodes\blob\blob_report.dm"
|
||||
@@ -495,12 +497,11 @@
|
||||
#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"
|
||||
#include "code\game\machinery\floodlight.dm"
|
||||
#include "code\game\machinery\Freezer.dm"
|
||||
#include "code\game\machinery\gateway.dm"
|
||||
#include "code\game\machinery\hologram.dm"
|
||||
#include "code\game\machinery\hydroponics.dm"
|
||||
#include "code\game\machinery\igniter.dm"
|
||||
@@ -526,6 +527,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"
|
||||
@@ -591,6 +593,7 @@
|
||||
#include "code\game\machinery\embedded_controller\access_controller.dm"
|
||||
#include "code\game\machinery\embedded_controller\airlock_controller.dm"
|
||||
#include "code\game\machinery\embedded_controller\embedded_controller_base.dm"
|
||||
#include "code\game\machinery\embedded_controller\simple_vent_controller.dm"
|
||||
#include "code\game\machinery\kitchen\gibber.dm"
|
||||
#include "code\game\machinery\kitchen\juicer.dm"
|
||||
#include "code\game\machinery\kitchen\microwave.dm"
|
||||
@@ -712,7 +715,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"
|
||||
@@ -736,7 +738,6 @@
|
||||
#include "code\game\objects\items\weapons\RSF.dm"
|
||||
#include "code\game\objects\items\weapons\scrolls.dm"
|
||||
#include "code\game\objects\items\weapons\stunbaton.dm"
|
||||
#include "code\game\objects\items\weapons\surgery_limbattachment.dm"
|
||||
#include "code\game\objects\items\weapons\surgery_tools.dm"
|
||||
#include "code\game\objects\items\weapons\swords_axes_etc.dm"
|
||||
#include "code\game\objects\items\weapons\table_rack_parts.dm"
|
||||
@@ -795,7 +796,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\shuttle_engines.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"
|
||||
@@ -873,6 +876,8 @@
|
||||
#include "code\modules\admin\player_panel.dm"
|
||||
#include "code\modules\admin\ToRban.dm"
|
||||
#include "code\modules\admin\DB ban\functions.dm"
|
||||
#include "code\modules\admin\permissionverbs\assignment.dm"
|
||||
#include "code\modules\admin\permissionverbs\permissionedit.dm"
|
||||
#include "code\modules\admin\verbs\adminhelp.dm"
|
||||
#include "code\modules\admin\verbs\adminjump.dm"
|
||||
#include "code\modules\admin\verbs\adminpm.dm"
|
||||
@@ -908,7 +913,6 @@
|
||||
#include "code\modules\assembly\shock_kit.dm"
|
||||
#include "code\modules\assembly\signaler.dm"
|
||||
#include "code\modules\assembly\timer.dm"
|
||||
#include "code\modules\awaymissions\bluespaceartillery.dm"
|
||||
#include "code\modules\awaymissions\corpse.dm"
|
||||
#include "code\modules\awaymissions\gateway.dm"
|
||||
#include "code\modules\awaymissions\loot.dm"
|
||||
@@ -1113,7 +1117,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"
|
||||
@@ -1145,23 +1148,22 @@
|
||||
#include "code\modules\mob\living\silicon\robot\robot_movement.dm"
|
||||
#include "code\modules\mob\living\silicon\robot\say.dm"
|
||||
#include "code\modules\mob\living\silicon\robot\wires.dm"
|
||||
#include "code\modules\mob\living\simple_animal\bear.dm"
|
||||
#include "code\modules\mob\living\simple_animal\carp.dm"
|
||||
#include "code\modules\mob\living\simple_animal\cat.dm"
|
||||
#include "code\modules\mob\living\simple_animal\clown.dm"
|
||||
#include "code\modules\mob\living\simple_animal\constructs.dm"
|
||||
#include "code\modules\mob\living\simple_animal\corgi.dm"
|
||||
#include "code\modules\mob\living\simple_animal\crab.dm"
|
||||
#include "code\modules\mob\living\simple_animal\life.dm"
|
||||
#include "code\modules\mob\living\simple_animal\mouse.dm"
|
||||
#include "code\modules\mob\living\simple_animal\mushroom.dm"
|
||||
#include "code\modules\mob\living\simple_animal\parrot.dm"
|
||||
#include "code\modules\mob\living\simple_animal\shade.dm"
|
||||
#include "code\modules\mob\living\simple_animal\simple_animal.dm"
|
||||
#include "code\modules\mob\living\simple_animal\syndicate.dm"
|
||||
#include "code\modules\mob\living\simple_animal\tomato.dm"
|
||||
#include "code\modules\mob\living\simple_animal\update_icons.dm"
|
||||
#include "code\modules\mob\living\simple_animal\worm.dm"
|
||||
#include "code\modules\mob\living\simple_animal\friendly\cat.dm"
|
||||
#include "code\modules\mob\living\simple_animal\friendly\corgi.dm"
|
||||
#include "code\modules\mob\living\simple_animal\friendly\crab.dm"
|
||||
#include "code\modules\mob\living\simple_animal\friendly\mouse.dm"
|
||||
#include "code\modules\mob\living\simple_animal\friendly\mushroom.dm"
|
||||
#include "code\modules\mob\living\simple_animal\friendly\tomato.dm"
|
||||
#include "code\modules\mob\living\simple_animal\hostile\bear.dm"
|
||||
#include "code\modules\mob\living\simple_animal\hostile\carp.dm"
|
||||
#include "code\modules\mob\living\simple_animal\hostile\hostile.dm"
|
||||
#include "code\modules\mob\new_player\hud.dm"
|
||||
#include "code\modules\mob\new_player\login.dm"
|
||||
#include "code\modules\mob\new_player\logout.dm"
|
||||
@@ -1184,6 +1186,7 @@
|
||||
#include "code\modules\power\apc.dm"
|
||||
#include "code\modules\power\cable.dm"
|
||||
#include "code\modules\power\cable_heavyduty.dm"
|
||||
#include "code\modules\power\cable_logic.dm"
|
||||
#include "code\modules\power\cell.dm"
|
||||
#include "code\modules\power\engine.dm"
|
||||
#include "code\modules\power\generator.dm"
|
||||
@@ -1355,4 +1358,5 @@
|
||||
#include "interface\interface.dm"
|
||||
#include "interface\skin.dmf"
|
||||
#include "maps\tgstation.2.0.9.1.dmm"
|
||||
#include "maps\RandomZLevels\stationCollision.dm"
|
||||
// END_INCLUDE
|
||||
|
||||
+1
-1
@@ -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.
|
||||
|
||||
@@ -145,9 +145,9 @@
|
||||
set_frequency(frequency)
|
||||
|
||||
receive_signal(datum/signal/signal)
|
||||
|
||||
if(!signal.data["tag"] || (signal.data["tag"] != id) || (signal.data["sigtype"]!="command"))
|
||||
return 0
|
||||
|
||||
if("power" in signal.data)
|
||||
on = text2num(signal.data["power"])
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
name = "Air Vent"
|
||||
desc = "Has a valve and pump attached to it"
|
||||
|
||||
var/area/initial_loc
|
||||
level = 1
|
||||
var/area_uid
|
||||
var/id_tag = null
|
||||
@@ -41,10 +42,10 @@
|
||||
icon_state = "in"
|
||||
|
||||
New()
|
||||
var/area/A = get_area(loc)
|
||||
if (A.master)
|
||||
A = A.master
|
||||
area_uid = A.uid
|
||||
initial_loc = get_area(loc)
|
||||
if (initial_loc.master)
|
||||
initial_loc = initial_loc.master
|
||||
area_uid = initial_loc.uid
|
||||
if (!id_tag)
|
||||
assign_uid()
|
||||
id_tag = num2text(uid)
|
||||
@@ -321,3 +322,8 @@
|
||||
"You hear ratchet.")
|
||||
new /obj/item/pipe(loc, make_from=src)
|
||||
del(src)
|
||||
|
||||
/obj/machinery/atmospherics/unary/vent_pump/Del()
|
||||
initial_loc.air_scrub_info -= id_tag
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
|
||||
level = 1
|
||||
|
||||
var/area/initial_loc
|
||||
var/id_tag = null
|
||||
var/frequency = 1439
|
||||
var/datum/radio_frequency/radio_connection
|
||||
@@ -24,10 +25,10 @@
|
||||
var/radio_filter_out
|
||||
var/radio_filter_in
|
||||
New()
|
||||
var/area/A = get_area(loc)
|
||||
if (A.master)
|
||||
A = A.master
|
||||
area_uid = A.uid
|
||||
initial_loc = get_area(loc)
|
||||
if (initial_loc.master)
|
||||
initial_loc = initial_loc.master
|
||||
area_uid = initial_loc.uid
|
||||
if (!id_tag)
|
||||
assign_uid()
|
||||
id_tag = num2text(uid)
|
||||
@@ -257,3 +258,8 @@
|
||||
"You hear ratchet.")
|
||||
new /obj/item/pipe(loc, make_from=src)
|
||||
del(src)
|
||||
|
||||
/obj/machinery/atmospherics/unary/vent_scrubber/Del()
|
||||
initial_loc.air_scrub_info -= id_tag
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -174,11 +174,14 @@ obj/machinery/atmospherics/valve
|
||||
if(target.initialize_directions & get_dir(target,src))
|
||||
node2 = target
|
||||
break
|
||||
|
||||
build_network()
|
||||
|
||||
if(openDuringInit)
|
||||
close()
|
||||
open()
|
||||
openDuringInit = 0
|
||||
|
||||
build_network()
|
||||
/*
|
||||
var/connect_directions
|
||||
switch(dir)
|
||||
|
||||
@@ -90,7 +90,7 @@ datum/air_group
|
||||
if (next_check > 0)
|
||||
next_check--
|
||||
return 1
|
||||
next_check += check_delay + rand(0,check_delay/2)
|
||||
next_check += check_delay + rand(max(check_delay, 1)/2,check_delay)
|
||||
check_delay++
|
||||
|
||||
var/turf/simulated/list/border_individual = list()
|
||||
|
||||
@@ -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!"
|
||||
|
||||
@@ -304,7 +304,7 @@ turf
|
||||
if (next_check > 0)
|
||||
next_check--
|
||||
return 1
|
||||
next_check += check_delay + rand(0,check_delay/2)
|
||||
next_check += check_delay + rand(max(check_delay, 1)/2,check_delay)
|
||||
check_delay++
|
||||
|
||||
var/turf/simulated/list/possible_fire_spreads = list()
|
||||
|
||||
@@ -1,513 +0,0 @@
|
||||
/mob/living/carbon/human/tajaran/examine()
|
||||
set src in oview()
|
||||
|
||||
if(!usr || !src) return
|
||||
if(((usr.disabilities & 128) || usr.blinded || usr.stat) && !(istype(usr,/mob/dead/observer/)))
|
||||
usr << "<span class='notice'>Something is there but you can't see it.</span>"
|
||||
return
|
||||
|
||||
var/skipgloves = 0
|
||||
var/skipsuitstorage = 0
|
||||
var/skipjumpsuit = 0
|
||||
var/skipshoes = 0
|
||||
var/skipmask = 0
|
||||
var/skipears = 0
|
||||
var/skipeyes = 0
|
||||
|
||||
//exosuits and helmets obscure our view and stuff.
|
||||
if (src.wear_suit)
|
||||
skipgloves = src.wear_suit.flags_inv & HIDEGLOVES
|
||||
skipsuitstorage = src.wear_suit.flags_inv & HIDESUITSTORAGE
|
||||
skipjumpsuit = src.wear_suit.flags_inv & HIDEJUMPSUIT
|
||||
skipshoes = src.wear_suit.flags_inv & HIDESHOES
|
||||
|
||||
if (src.head)
|
||||
skipmask = src.head.flags_inv & HIDEMASK
|
||||
skipeyes = src.head.flags_inv & HIDEEYES
|
||||
skipears = src.head.flags_inv & HIDEEARS
|
||||
|
||||
// crappy hacks because you can't do \his[src] etc. I'm sorry this proc is so unreadable, blame the text macros :<
|
||||
var/t_He = "It" //capitalised for use at the start of each line.
|
||||
var/t_his = "its"
|
||||
var/t_him = "it"
|
||||
var/t_has = "has"
|
||||
var/t_is = "is"
|
||||
|
||||
var/msg = "<span class='info'>*---------*\nThis is "
|
||||
|
||||
if( skipjumpsuit && (wear_mask || skipmask) ) //big suits/masks make it hard to tell their gender
|
||||
t_He = "They"
|
||||
t_his = "their"
|
||||
t_him = "them"
|
||||
t_has = "have"
|
||||
t_is = "are"
|
||||
else
|
||||
if(src.icon)
|
||||
msg += "\icon[src.icon] " //fucking BYOND: this should stop dreamseeker crashing if we -somehow- examine somebody before their icon is generated
|
||||
switch(src.gender)
|
||||
if(MALE)
|
||||
t_He = "He"
|
||||
t_his = "his"
|
||||
t_him = "him"
|
||||
if(FEMALE)
|
||||
t_He = "She"
|
||||
t_his = "her"
|
||||
t_him = "her"
|
||||
|
||||
msg += "<EM>\a [src], one of the cat-like Tajarans</EM>!\n"
|
||||
|
||||
//uniform
|
||||
if (src.w_uniform && !skipjumpsuit)
|
||||
if (src.w_uniform.blood_DNA)
|
||||
msg += "<span class='warning'>[t_He] [t_is] wearing \icon[src.w_uniform] [src.w_uniform.gender==PLURAL?"some":"a"] blood-stained [src.w_uniform.name]!</span>\n"
|
||||
else
|
||||
msg += "[t_He] [t_is] wearing \icon[src.w_uniform] \a [src.w_uniform].\n"
|
||||
|
||||
//head
|
||||
if (src.head)
|
||||
if (src.head.blood_DNA)
|
||||
msg += "<span class='warning'>[t_He] [t_is] wearing \icon[src.head] [src.head.gender==PLURAL?"some":"a"] blood-stained [src.head.name] on [t_his] head!</span>\n"
|
||||
else
|
||||
msg += "[t_He] [t_is] wearing \icon[src.head] \a [src.head] on [t_his] head.\n"
|
||||
|
||||
//suit/armour
|
||||
if (src.wear_suit)
|
||||
if (src.wear_suit.blood_DNA)
|
||||
msg += "<span class='warning'>[t_He] [t_is] wearing \icon[src.wear_suit] [src.wear_suit.gender==PLURAL?"some":"a"] blood-stained [src.wear_suit.name]!</span>\n"
|
||||
else
|
||||
msg += "[t_He] [t_is] wearing \icon[src.wear_suit] \a [src.wear_suit].\n"
|
||||
|
||||
//suit/armour storage
|
||||
if(src.s_store && !skipsuitstorage)
|
||||
if(src.s_store.blood_DNA)
|
||||
msg += "<span class='warning'>[t_He] [t_is] carrying \icon[src.s_store] [src.s_store.gender==PLURAL?"some":"a"] blood-stained [src.s_store.name] on [t_his] [src.wear_suit.name]!</span>\n"
|
||||
else
|
||||
msg += "[t_He] [t_is] carrying \icon[src.s_store] \a [src.s_store] on [t_his] [src.wear_suit.name].\n"
|
||||
|
||||
//back
|
||||
if (src.back)
|
||||
if (src.back.blood_DNA)
|
||||
msg += "<span class='warning'>[t_He] [t_has] \icon[src.back] [src.back.gender==PLURAL?"some":"a"] blood-stained [src.back] on [t_his] back.</span>\n"
|
||||
else
|
||||
msg += "[t_He] [t_has] \icon[src.back] \a [src.back] on [t_his] back.\n"
|
||||
|
||||
//left hand
|
||||
if (src.l_hand)
|
||||
if (src.l_hand.blood_DNA)
|
||||
msg += "<span class='warning'>[t_He] [t_is] holding \icon[src.l_hand] [src.l_hand.gender==PLURAL?"some":"a"] blood-stained [src.l_hand.name] in [t_his] left hand!</span>\n"
|
||||
else
|
||||
msg += "[t_He] [t_is] holding \icon[src.l_hand] \a [src.l_hand] in [t_his] left hand.\n"
|
||||
|
||||
//right hand
|
||||
if (src.r_hand)
|
||||
if (src.r_hand.blood_DNA)
|
||||
msg += "<span class='warning'>[t_He] [t_is] holding \icon[src.r_hand] [src.r_hand.gender==PLURAL?"some":"a"] blood-stained [src.r_hand.name] in [t_his] right hand!</span>\n"
|
||||
else
|
||||
msg += "[t_He] [t_is] holding \icon[src.r_hand] \a [src.r_hand] in [t_his] right hand.\n"
|
||||
|
||||
//gloves
|
||||
if (src.gloves && !skipgloves)
|
||||
if (src.gloves.blood_DNA)
|
||||
msg += "<span class='warning'>[t_He] [t_has] \icon[src.gloves] [src.gloves.gender==PLURAL?"some":"a"] blood-stained [src.gloves.name] on [t_his] hands!</span>\n"
|
||||
else
|
||||
msg += "[t_He] [t_has] \icon[src.gloves] \a [src.gloves] on [t_his] hands.\n"
|
||||
else if (src.blood_DNA)
|
||||
msg += "<span class='warning'>[t_He] [t_has] blood-stained hands!</span>\n"
|
||||
|
||||
//handcuffed?
|
||||
if (src.handcuffed)
|
||||
msg += "[t_He] [t_is] \icon[src.handcuffed] handcuffed!\n"
|
||||
|
||||
//belt
|
||||
if (src.belt)
|
||||
if (src.belt.blood_DNA)
|
||||
msg += "<span class='warning'>[t_He] [t_has] \icon[src.belt] [src.belt.gender==PLURAL?"some":"a"] blood-stained [src.belt.name] about [t_his] waist!</span>\n"
|
||||
else
|
||||
msg += "[t_He] [t_has] \icon[src.belt] \a [src.belt] about [t_his] waist.\n"
|
||||
|
||||
//shoes
|
||||
if (src.shoes && !skipshoes)
|
||||
if(src.shoes.blood_DNA)
|
||||
msg += "<span class='warning'>[t_He] [t_is] wearing \icon[src.shoes] [src.shoes.gender==PLURAL?"some":"a"] blood-stained [src.shoes.name] on [t_his] feet!</span>\n"
|
||||
else
|
||||
msg += "[t_He] [t_is] wearing \icon[src.shoes] \a [src.shoes] on [t_his] feet.\n"
|
||||
|
||||
//mask
|
||||
if (src.wear_mask && !skipmask)
|
||||
if (src.wear_mask.blood_DNA)
|
||||
msg += "<span class='warning'>[t_He] [t_has] \icon[src.wear_mask] [src.wear_mask.gender==PLURAL?"some":"a"] blood-stained [src.wear_mask.name] on [t_his] face!</span>\n"
|
||||
else
|
||||
msg += "[t_He] [t_has] \icon[src.wear_mask] \a [src.wear_mask] on [t_his] face.\n"
|
||||
|
||||
//eyes
|
||||
if (src.glasses && !skipeyes)
|
||||
if (src.glasses.blood_DNA)
|
||||
msg += "<span class='warning'>[t_He] [t_has] \icon[src.glasses] [src.glasses.gender==PLURAL?"some":"a"] blood-stained [src.glasses] covering [t_his] eyes!</span>\n"
|
||||
else
|
||||
msg += "[t_He] [t_has] \icon[src.glasses] \a [src.glasses] covering [t_his] eyes.\n"
|
||||
|
||||
if (src.l_ear && !skipears)
|
||||
msg += "[t_He] [t_has] has a \icon[src.l_ear] [src.l_ear.name] on [t_his] left ear.\n"
|
||||
|
||||
if (src.r_ear && !skipears)
|
||||
msg += "[t_He] [t_has] has a \icon[src.r_ear] [src.r_ear.name] on [t_his] right ear.\n"
|
||||
|
||||
//ID
|
||||
if (src.wear_id)
|
||||
var/id
|
||||
if(istype(src.wear_id, /obj/item/device/pda))
|
||||
var/obj/item/device/pda/pda = src.wear_id
|
||||
id = pda.owner
|
||||
else if(istype(src.wear_id, /obj/item/weapon/card/id)) //just in case something other than a PDA/ID card somehow gets in the ID slot :[
|
||||
var/obj/item/weapon/card/id/idcard = src.wear_id
|
||||
id = idcard.registered_name
|
||||
if (id && (id != src.real_name) && (get_dist(src, usr) <= 1) && prob(10))
|
||||
msg += "<span class='warning'>[t_He] [t_is] wearing \icon[src.wear_id] \a [src.wear_id] yet something doesn't seem right...</span>\n"
|
||||
else
|
||||
msg += "[t_He] [t_is] wearing \icon[src.wear_id] \a [src.wear_id].\n"
|
||||
|
||||
//Jitters
|
||||
if (src.is_jittery)
|
||||
if(src.jitteriness >= 300)
|
||||
msg += "<span class='warning'><B>[t_He] [t_is] convulsing violently!</B></span>\n"
|
||||
else if(src.jitteriness >= 200)
|
||||
msg += "<span class='warning'>[t_He] [t_is] extremely jittery.</span>\n"
|
||||
else if(src.jitteriness >= 100)
|
||||
msg += "<span class='warning'>[t_He] [t_is] twitching ever so slightly.</span>\n"
|
||||
|
||||
var/distance = get_dist(usr,src)
|
||||
if(istype(usr, /mob/dead/observer) || usr.stat == 2) // ghosts can see anything
|
||||
distance = 1
|
||||
|
||||
if (src.stat == 1 || stat == 2)
|
||||
msg += "<span class='warning'>[name] doesn't seem to be responding to anything around [t_him], [t_his] eyes closed as though asleep.</span>\n"
|
||||
if((!isbreathing || holdbreath) && distance <= 3)
|
||||
msg += "<span class='warning'>[name] does not appear to be breathing.</span>\n"
|
||||
if(istype(usr, /mob/living/carbon/human) && usr.stat == 0 && src.stat == 1 && distance <= 1)
|
||||
for(var/mob/O in viewers(usr.loc, null))
|
||||
O.show_message("[usr] checks [src]'s pulse.", 1)
|
||||
spawn(15)
|
||||
usr << "\blue [name] has a pulse!"
|
||||
|
||||
if (src.stat == 2 || (changeling && changeling.changeling_fakedeath == 1))
|
||||
if(distance <= 1)
|
||||
if(istype(usr, /mob/living/carbon/human) && usr.stat == 0)
|
||||
for(var/mob/O in viewers(usr.loc, null))
|
||||
O.show_message("[usr] checks [src]'s pulse.", 1)
|
||||
spawn(15)
|
||||
usr << "\red [name] has no pulse!"
|
||||
|
||||
/* if (src.getBruteLoss())
|
||||
if (src.getBruteLoss() < 30)
|
||||
usr << "\red [src.name] looks slightly injured!"
|
||||
else
|
||||
usr << "\red <B>[src.name] looks severely injured!</B>"*/
|
||||
|
||||
if (src.cloneloss)
|
||||
if (src.cloneloss < 30)
|
||||
msg += "<span class='warning'>[src.name] looks slightly... unfinished?</span>\n"
|
||||
else
|
||||
msg += "<span class='warning'>[src.name] looks very... unfinished?</B></span>\n"
|
||||
|
||||
/* if (src.getFireLoss())
|
||||
if (src.getFireLoss() < 30)
|
||||
usr << "\red [src.name] looks slightly burned!"
|
||||
else
|
||||
usr << "\red <B>[src.name] looks severely burned!</B>"*/
|
||||
msg += "<span class='warning'>"
|
||||
if (src.nutrition < 100)
|
||||
msg += "[t_He] [t_is] severely malnourished.\n"
|
||||
else if (src.nutrition >= 500)
|
||||
if (usr.nutrition < 100)
|
||||
msg += "[t_He] [t_is] plump and delicious looking - Like a fat little piggy. A tasty piggy.\n"
|
||||
else
|
||||
msg += "[t_He] [t_is] quite chubby.\n"
|
||||
|
||||
msg += "</span>"
|
||||
|
||||
|
||||
if (src.getBrainLoss() >= 60 && !stat)
|
||||
msg += "[t_He] [t_has] a stupid expression on [t_his] face.\n"
|
||||
|
||||
if (!src.client)
|
||||
msg += "[t_He] [t_has] a vacant, braindead stare...\n"
|
||||
|
||||
var/list/wound_descriptions = list()
|
||||
var/list/wound_flavor_text = list()
|
||||
for(var/named in organs)
|
||||
var/datum/organ/external/temp = organs[named]
|
||||
if(temp)
|
||||
if(temp.destroyed)
|
||||
wound_flavor_text["[temp.display_name]"] = "<span class='warning'><b>[t_He] is missing [t_his] [temp.display_name].</b></span>\n"
|
||||
continue
|
||||
if(temp.robot)
|
||||
if(!(temp.brute_dam + temp.burn_dam))
|
||||
wound_flavor_text["[temp.display_name]"] = "<span class='warning'>[t_He] has a robot arm!</span>\n"
|
||||
else
|
||||
wound_flavor_text["[temp.display_name]"] = "<span class='warning'>[t_He] has a robot arm, it has"
|
||||
switch(temp.brute_dam)
|
||||
if(0)
|
||||
wound_flavor_text["[temp.display_name]"] += ""
|
||||
else if(0 to 20)
|
||||
wound_flavor_text["[temp.display_name]"] += " some dents"
|
||||
else if(20 to INFINITY)
|
||||
wound_flavor_text["[temp.display_name]"] += pick(" a lot of dents"," severe denting")
|
||||
if(temp.brute_dam && temp.brute_dam)
|
||||
wound_flavor_text["[temp.display_name]"] += " and"
|
||||
switch(temp.burn_dam)
|
||||
if(0)
|
||||
wound_flavor_text["[temp.display_name]"] += ""
|
||||
else if(0 to 20)
|
||||
wound_flavor_text["[temp.display_name]"] += " some burns"
|
||||
else if(20 to INFINITY)
|
||||
wound_flavor_text["[temp.display_name]"] += pick(" a lot of burns"," severe melting")
|
||||
wound_flavor_text["[temp.display_name]"] += "!</span>\n"
|
||||
else if(temp.wounds)
|
||||
var/list/wounds = list(list(),list(),list(),list(),list(),list())
|
||||
for(var/datum/organ/wound/w in temp.wounds)
|
||||
switch(w.healing_state)
|
||||
if(0)
|
||||
var/list/cut = wounds[1]
|
||||
cut += w
|
||||
wounds[1] = cut
|
||||
if(1)
|
||||
var/list/cut = wounds[2]
|
||||
cut += w
|
||||
wounds[2] = cut
|
||||
if(2)
|
||||
var/list/cut = wounds[3]
|
||||
cut += w
|
||||
wounds[3] = cut
|
||||
if(3)
|
||||
var/list/cut = wounds[4]
|
||||
cut += w
|
||||
wounds[4] = cut
|
||||
if(4)
|
||||
var/list/cut = wounds[5]
|
||||
cut += w
|
||||
wounds[5] = cut
|
||||
if(5)
|
||||
var/list/cut = wounds[6]
|
||||
cut += w
|
||||
wounds[6] = cut
|
||||
wound_descriptions["[temp.display_name]"] = wounds
|
||||
else
|
||||
wound_flavor_text["[temp.display_name]"] = ""
|
||||
//Now that we have a big list of all the wounds, on all the limbs.
|
||||
var/list/is_bleeding = list()
|
||||
for(var/named in wound_descriptions)
|
||||
var/list/wound_states = wound_descriptions[named]
|
||||
var/list/flavor_text = list()
|
||||
for(var/i = 1, i <= 6, i++)
|
||||
var/list/wound_state = wound_states[i] //All wounds at this level of healing.
|
||||
var/list/tally = list("cut" = 0, "deep cut" = 0, "flesh wound" = 0, "gaping wound" = 0, "big gaping wound" = 0, "massive wound" = 0,\
|
||||
"tiny bruise" = 0, "small bruise" = 0, "moderate bruise" = 0, "large bruise" = 0, "huge bruise" = 0, "monumental bruise" = 0,\
|
||||
"small burn" = 0, "moderate burn" = 0, "large burn" = 0, "severe burn" = 0, "deep burn" = 0, "carbonised area" = 0) //How many wounds of what size.
|
||||
for(var/datum/organ/wound/w in wound_state)
|
||||
if(w.bleeding && !is_bleeding[named]) is_bleeding[named] = 1
|
||||
switch(w.wound_size)
|
||||
if(1)
|
||||
switch(w.wound_type)
|
||||
if(0)
|
||||
tally["cut"] += 1
|
||||
if(1)
|
||||
tally["tiny bruise"] += 1
|
||||
if(2)
|
||||
tally["small burn"] += 1
|
||||
if(2)
|
||||
switch(w.wound_type)
|
||||
if(0)
|
||||
tally["deep cut"] += 1
|
||||
if(1)
|
||||
tally["small bruise"] += 1
|
||||
if(2)
|
||||
tally["moderate burn"] += 1
|
||||
if(3)
|
||||
switch(w.wound_type)
|
||||
if(0)
|
||||
tally["flesh wound"] += 1
|
||||
if(1)
|
||||
tally["moderate bruise"] += 1
|
||||
if(2)
|
||||
tally["large burn"] += 1
|
||||
if(4)
|
||||
switch(w.wound_type)
|
||||
if(0)
|
||||
tally["gaping wound"] += 1
|
||||
if(1)
|
||||
tally["large bruise"] += 1
|
||||
if(2)
|
||||
tally["severe burn"] += 1
|
||||
if(5)
|
||||
switch(w.wound_type)
|
||||
if(0)
|
||||
tally["big gaping wound"] += 1
|
||||
if(1)
|
||||
tally["huge bruise"] += 1
|
||||
if(2)
|
||||
tally["deep burn"] += 1
|
||||
if(6)
|
||||
switch(w.wound_type)
|
||||
if(0)
|
||||
tally["massive wound"] += 1
|
||||
if(1)
|
||||
tally["monumental bruise"] += 1
|
||||
if(2)
|
||||
tally["carbonised area"] += 1
|
||||
for(var/tallied in tally)
|
||||
if(!tally[tallied])
|
||||
continue
|
||||
//if(flavor_text_string && tally[tallied])
|
||||
// for(
|
||||
// flavor_text_string += pick(list(", as well as", ", in addition to")) //add more later.
|
||||
var/tallied_rename = list("cut" = "cut","deep cut" = "deep cut", "flesh wound" = "flesh wound",\
|
||||
"gaping wound" = "gaping wound", "big gaping wound" = "big gaping wound", "massive wound" = "massive wound",\
|
||||
"tiny bruise" = "tiny bruise", "small bruise" = "small bruise", "moderate bruise" = "moderate bruise",\
|
||||
"large bruise" = "large bruise", "huge bruise" = "huge bruise", "monumental bruise" = "monumental bruise",\
|
||||
"small burn" = "small burn", "moderate burn" = "moderate burn", "large burn" = "large burn",\
|
||||
"severe burn" = "severe burn", "deep burn" = "deep burn", "carbonised area" = "carbonised area")
|
||||
switch(i)
|
||||
if(2) //Healing wounds.
|
||||
if(tallied in list("cut","tiny bruise","small burn"))
|
||||
continue
|
||||
tallied_rename = list("deep cut" = "clotted cut", "flesh wound" = "small bandaged wound",\
|
||||
"gaping wound" = "bandaged wound", "big gaping wound" = "gauze wrapped wound",\
|
||||
"massive wound" = "massive blood soaked bandage", "small bruise" = "small bruise",\
|
||||
"moderate bruise" = "moderate bruise", "large bruise" = "large bruise",\
|
||||
"huge bruise" = "huge bruise", "monumental bruise" = "monumental bruise",\
|
||||
"moderate burn" = "moderate salved burn", "large burn" = "large salved burn",\
|
||||
"severe burn" = "severe salved burn", "deep burn" = "deep salved burn",\
|
||||
"carbonised area" = "treated carbonised area")
|
||||
if(3)
|
||||
if(tallied in list("cut","tiny bruise","small burn"))
|
||||
continue
|
||||
tallied_rename = list("deep cut" = "fading cut", "flesh wound" = "small healing wound",\
|
||||
"gaping wound" = "healing wound", "big gaping wound" = "big healing wound",\
|
||||
"massive wound" = "massive healing wound", "small bruise" = "tiny bruise",\
|
||||
"moderate bruise" = "small bruise", "large bruise" = "moderate bruise",\
|
||||
"huge bruise" = "large bruise", "monumental bruise" = "huge bruise",\
|
||||
"moderate burn" = "healing moderate burn", "large burn" = "healing large burn",\
|
||||
"severe burn" = "healing severe burn", "deep burn" = "healing deep burn",\
|
||||
"carbonised area" = "slowly healing carbonised area")
|
||||
if(4)
|
||||
if(tallied in list("cut","deep cut","tiny bruise", "small bruise","small burn", "moderate burn"))
|
||||
continue
|
||||
tallied_rename = list("flesh wound" = "small red scar", "gaping wound" = "angry straight scar",\
|
||||
"big gaping wound" = "jagged angry scar", "massive wound" = "gigantic angry scar",\
|
||||
"moderate bruise" = "tiny bruise", "large bruise" = "small bruise",\
|
||||
"huge bruise" = "moderate bruise", "monumental bruise" = "large bruise",\
|
||||
"large burn" = "large burn scar", "severe burn" = "severe burn scar",\
|
||||
"deep burn" = "deep burn scar", "carbonised area" = "healing carbonised area")
|
||||
if(5)
|
||||
if(tallied in list("cut","deep cut","tiny bruise", "small bruise", "moderate bruise","small burn", "moderate burn"))
|
||||
continue
|
||||
tallied_rename = list("flesh wound" = "small scar", "gaping wound" = "straight scar",\
|
||||
"big gaping wound" = "jagged scar", "massive wound" = "gigantic scar",\
|
||||
"large bruise" = "tiny bruise",\
|
||||
"huge bruise" = "small bruise", "monumental bruise" = "moderate bruise",\
|
||||
"large burn" = "large burn scar", "severe burn" = "severe burn scar",\
|
||||
"deep burn" = "deep burn scar", "carbonised area" = "large scarred area")
|
||||
if(6)
|
||||
if(tallied in list("cut","deep cut","flesh wound","tiny bruise", "small bruise", "moderate bruise", "large bruise", "huge bruise","small burn", "moderate burn"))
|
||||
continue
|
||||
tallied_rename = list("gaping wound" = "straight scar",\
|
||||
"big gaping wound" = "jagged scar", "massive wound" = "gigantic scar",\
|
||||
"monumental bruise" = "tiny bruise",\
|
||||
"large burn" = "large burn scar", "severe burn" = "severe burn scar",\
|
||||
"deep burn" = "deep burn scar", "carbonised area" = "large scarred area")
|
||||
var/list/no_exclude = list("gaping wound", "big gaping wound", "massive wound", "large bruise",\
|
||||
"huge bruise", "massive bruise", "severe burn", "large burn", "deep burn", "carbonised area")
|
||||
switch(tally[tallied])
|
||||
if(1)
|
||||
if(!flavor_text.len)
|
||||
flavor_text += "<span class='warning'>\The [src] has[prob(4) && !(tallied in no_exclude) ? " what might be" : ""] a [tallied_rename[tallied]]"
|
||||
else
|
||||
flavor_text += "[prob(4) && !(tallied in no_exclude) ? " what might be" : ""] a [tallied_rename[tallied]]"
|
||||
if(2)
|
||||
if(!flavor_text.len)
|
||||
flavor_text += "<span class='warning'>\The [src] has[prob(4) && !(tallied in no_exclude) ? " what might be" : ""] a pair of [tallied_rename[tallied]]s"
|
||||
else
|
||||
flavor_text += "[prob(4) && !(tallied in no_exclude) ? " what might be" : ""] a pair of [tallied_rename[tallied]]s"
|
||||
if(3 to 5)
|
||||
if(!flavor_text.len)
|
||||
flavor_text += "<span class='warning'>\The [src] has several [tallied_rename[tallied]]s"
|
||||
else
|
||||
flavor_text += " several [tallied_rename[tallied]]s"
|
||||
if(6 to INFINITY)
|
||||
if(!flavor_text.len)
|
||||
flavor_text += "<span class='warning'>\The [src] has a bunch of [tallied_rename[tallied]]s"
|
||||
else
|
||||
flavor_text += " a ton of [tallied_rename[tallied]]s"
|
||||
if(flavor_text.len)
|
||||
var/flavor_text_string = ""
|
||||
for(var/text = 1, text <= flavor_text.len, text++)
|
||||
if(text == flavor_text.len && flavor_text.len > 1)
|
||||
flavor_text_string += ", and"
|
||||
else if(flavor_text.len > 1)
|
||||
flavor_text_string += ","
|
||||
flavor_text_string += flavor_text[text]
|
||||
flavor_text_string += " on [t_his] [named].</span><br>"
|
||||
wound_flavor_text["[named]"] = flavor_text_string
|
||||
var/display_chest = 0
|
||||
var/display_shoes = 0
|
||||
var/display_gloves = 0
|
||||
if(wound_flavor_text["head"] && (is_destroyed["head"] || (!skipmask && !(wear_mask && istype(wear_mask, /obj/item/clothing/mask/gas)))))
|
||||
msg += wound_flavor_text["head"]
|
||||
else if(is_bleeding["head"])
|
||||
msg += "<span class='warning'>[src] has blood running down [t_his] face!</span>\n"
|
||||
if(wound_flavor_text["chest"] && !w_uniform && !skipjumpsuit) //No need. A missing chest gibs you.
|
||||
msg += wound_flavor_text["chest"]
|
||||
else if(is_bleeding["chest"])
|
||||
display_chest = 1
|
||||
if(wound_flavor_text["left arm"] && (is_destroyed["left arm"] || (!w_uniform && !skipjumpsuit)))
|
||||
msg += wound_flavor_text["left arm"]
|
||||
else if(is_bleeding["left arm"])
|
||||
display_chest = 1
|
||||
if(wound_flavor_text["left hand"] && (is_destroyed["left hand"] || (!gloves && !skipgloves)))
|
||||
msg += wound_flavor_text["left hand"]
|
||||
else if(is_bleeding["left hand"])
|
||||
display_gloves = 1
|
||||
if(wound_flavor_text["right arm"] && (is_destroyed["right arm"] || (!w_uniform && !skipjumpsuit)))
|
||||
msg += wound_flavor_text["right arm"]
|
||||
else if(is_bleeding["right arm"])
|
||||
display_chest = 1
|
||||
if(wound_flavor_text["right hand"] && (is_destroyed["right hand"] || (!gloves && !skipgloves)))
|
||||
msg += wound_flavor_text["right hand"]
|
||||
else if(is_bleeding["right hand"])
|
||||
display_gloves = 1
|
||||
if(wound_flavor_text["groin"] && (is_destroyed["groin"] || (!w_uniform && !skipjumpsuit)))
|
||||
msg += wound_flavor_text["groin"]
|
||||
else if(is_bleeding["groin"])
|
||||
display_chest = 1
|
||||
if(wound_flavor_text["left leg"] && (is_destroyed["left leg"] || (!w_uniform && !skipjumpsuit)))
|
||||
msg += wound_flavor_text["left leg"]
|
||||
else if(is_bleeding["left leg"])
|
||||
display_chest = 1
|
||||
if(wound_flavor_text["left foot"]&& (is_destroyed["left foot"] || (!shoes && !skipshoes)))
|
||||
msg += wound_flavor_text["left foot"]
|
||||
else if(is_bleeding["left foot"])
|
||||
display_shoes = 1
|
||||
if(wound_flavor_text["right leg"] && (is_destroyed["right leg"] || (!w_uniform && !skipjumpsuit)))
|
||||
msg += wound_flavor_text["right leg"]
|
||||
else if(is_bleeding["right leg"])
|
||||
display_chest = 1
|
||||
if(wound_flavor_text["right foot"]&& (is_destroyed["right foot"] || (!shoes && !skipshoes)))
|
||||
msg += wound_flavor_text["right foot"]
|
||||
else if(is_bleeding["right foot"])
|
||||
display_shoes = 1
|
||||
if(display_chest)
|
||||
msg += "<span class='warning'><b>[src] has blood soaking through from under [t_his] clothing!</b></span>\n"
|
||||
if(display_shoes)
|
||||
msg += "<span class='warning'><b>[src] has blood running from [t_his] shoes!</b></span>\n"
|
||||
if(display_gloves)
|
||||
msg += "<span class='warning'><b>[src] has blood running from under [t_his] gloves!</b></span>\n"
|
||||
|
||||
|
||||
// if(w.bleeding)
|
||||
// usr << "\red [src.name] is bleeding from a [sizetext] on [t_his] [temp.display_name]."
|
||||
// continue
|
||||
|
||||
msg += "[print_flavor_text()]\n"
|
||||
|
||||
msg += "\blue *---------*"
|
||||
usr << msg
|
||||
@@ -1,511 +0,0 @@
|
||||
//their language needs to hook into radios as well
|
||||
|
||||
/mob/living/carbon/human/tajaran/say_quote(var/text,var/is_speaking_taj)
|
||||
//work out if the listener can understand or not
|
||||
|
||||
var/ending = copytext(text, length(text))
|
||||
/*if (src.disease_symptoms & DISEASE_HOARSE)
|
||||
return "rasps, \"[text]\"";*/
|
||||
if (src.stuttering)
|
||||
return "stammers, \"[text]\"";
|
||||
if (src.slurring)
|
||||
return "slurrs, \"[text]\"";
|
||||
if (src.brainloss >= 60)
|
||||
return "gibbers, \"[text]\"";
|
||||
|
||||
if(is_speaking_taj)
|
||||
return "mrowls, \"[text]\""//pick("yowls, \"[text]\"", "growls, \"[text]\"","mewls, \"[text]\"", "mrowls, \"[text]\"", "meows, \"[text]\"", "purrs, \"[text]\"");
|
||||
|
||||
if (ending == "?")
|
||||
return "asks, \"[text]\"";
|
||||
else if (ending == "!")
|
||||
return "exclaims, \"[text]\"";
|
||||
|
||||
return "says, \"[text]\"";
|
||||
|
||||
//convert message to an indecipherable series of sounds for anyone who isnt tajaran
|
||||
/mob/living/carbon/human/tajaran/proc/tajspeak(var/message)
|
||||
//return stars(message)
|
||||
var/te = html_decode(message)
|
||||
var/t = ""
|
||||
var/n = length(message)
|
||||
var/p = 1
|
||||
while(p <= n)
|
||||
if (copytext(te, p, p + 1) != " ")
|
||||
t = text("[][]", t, pick(tajspeak_letters))
|
||||
p++
|
||||
return html_encode(t)
|
||||
/*if (pr == null)
|
||||
pr = 25
|
||||
if (pr <= 0)
|
||||
return null
|
||||
else
|
||||
if (pr >= 100)
|
||||
return n
|
||||
var/te = html_decode(n)
|
||||
var/t = ""
|
||||
n = length(n)
|
||||
var/p = null
|
||||
p = 1
|
||||
while(p <= n)
|
||||
if ((copytext(te, p, p + 1) == " " || prob(pr)))
|
||||
t = text("[][]", t, copytext(te, p, p + 1))
|
||||
else
|
||||
t = text("[]*", t)
|
||||
p++
|
||||
return html_encode(t)*/
|
||||
|
||||
/mob/living/carbon/human/tajaran/say(var/message)
|
||||
var/message_old = message
|
||||
message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
|
||||
|
||||
if (!message)
|
||||
return
|
||||
|
||||
log_say("[name]/[key] : [message]")
|
||||
|
||||
if (length(message) >= 1)
|
||||
if (miming && copytext(message, 1, 2) != "*")
|
||||
return
|
||||
|
||||
if (stat == 2)
|
||||
return say_dead(message)
|
||||
|
||||
if (silent)
|
||||
return
|
||||
|
||||
if (src.client && (client.muted || src.client.muted_complete))
|
||||
src << "You are muted."
|
||||
return
|
||||
|
||||
// wtf?
|
||||
if (stat)
|
||||
return
|
||||
|
||||
// Mute disability
|
||||
if (disabilities & 64)
|
||||
return
|
||||
|
||||
if (istype(wear_mask, /obj/item/clothing/mask/muzzle))
|
||||
return
|
||||
|
||||
// emotes
|
||||
if (copytext(message, 1, 2) == "*" && !stat)
|
||||
return emote(copytext(message, 2))
|
||||
|
||||
var/alt_name = ""
|
||||
if (istype(src, /mob/living/carbon/human) && name != real_name)
|
||||
var/mob/living/carbon/human/H = src
|
||||
alt_name = " (as [H.get_visible_name()])"
|
||||
var/italics = 0
|
||||
var/message_range = null
|
||||
var/message_mode = null
|
||||
|
||||
if (brainloss >= 60 && prob(50))
|
||||
if (ishuman(src))
|
||||
message_mode = "headset"
|
||||
// Special message handling
|
||||
else if (copytext(message, 1, 2) == ";")
|
||||
if (ishuman(src))
|
||||
message_mode = "headset"
|
||||
else if(istype(src, /mob/living/silicon/pai) || istype(src, /mob/living/silicon/robot))
|
||||
message_mode = "pAI"
|
||||
message = copytext(message, 2)
|
||||
|
||||
else if (length(message) >= 2)
|
||||
var/channel_prefix = copytext(message, 1, 3)
|
||||
|
||||
message_mode = department_radio_keys[channel_prefix]
|
||||
//world << "channel_prefix=[channel_prefix]; message_mode=[message_mode]"
|
||||
if (message_mode)
|
||||
message = trim(copytext(message, 3))
|
||||
if (!ishuman(src) && (message_mode=="department" || (message_mode in radiochannels)))
|
||||
message_mode = null //only humans can use headsets
|
||||
|
||||
if (!message)
|
||||
return
|
||||
|
||||
//work out if we're speaking tajaran or not
|
||||
var/is_speaking_taj = 0
|
||||
if(copytext(message, 1, 3) == ":j" || copytext(message, 1, 3) == ":J")
|
||||
message = copytext(message, 3)
|
||||
if(taj_talk_understand || universal_speak)
|
||||
is_speaking_taj = 1
|
||||
|
||||
if( !message_mode && (disease_symptoms & DISEASE_WHISPER))
|
||||
message_mode = "whisper"
|
||||
|
||||
if(src.stunned > 0 || (traumatic_shock > 61 && prob(50)))
|
||||
message_mode = "" //Stunned people shouldn't be able to physically turn on their radio/hold down the button to speak into it
|
||||
|
||||
|
||||
message = capitalize(message) //capitalize the first letter of what they actually say
|
||||
|
||||
// :downs:
|
||||
if (brainloss >= 60)
|
||||
message = dd_replacetext(message, " am ", " ")
|
||||
message = dd_replacetext(message, " is ", " ")
|
||||
message = dd_replacetext(message, " are ", " ")
|
||||
message = dd_replacetext(message, "you", "u")
|
||||
message = dd_replacetext(message, "help", "halp")
|
||||
message = dd_replacetext(message, "grief", "grife")
|
||||
message = dd_replacetext(message, "space", "spess")
|
||||
message = dd_replacetext(message, "carp", "crap")
|
||||
message = dd_replacetext(message, "reason", "raisin")
|
||||
if(prob(50))
|
||||
message = uppertext(message)
|
||||
message += "[stutter(pick("!", "!!", "!!!"))]"
|
||||
if(!stuttering && prob(15))
|
||||
message = stutter(message)
|
||||
|
||||
if (stuttering)
|
||||
message = stutter(message)
|
||||
if (slurring)
|
||||
message = slur(message)
|
||||
|
||||
/* //qw do not have beesease atm.
|
||||
if(virus)
|
||||
if(virus.name=="beesease" && virus.stage>=2)
|
||||
if(prob(virus.stage*10))
|
||||
var/bzz = length(message)
|
||||
message = "B"
|
||||
for(var/i=0,i<bzz,i++)
|
||||
message += "Z"
|
||||
*/
|
||||
var/list/obj/item/used_radios = new
|
||||
|
||||
switch (message_mode)
|
||||
if ("headset")
|
||||
if (src:l_ear && istype(src:l_ear,/obj/item/device/radio))
|
||||
src:l_ear.talk_into(src, message, 0, "[is_speaking_taj ? "tajaran" : "english"]")
|
||||
used_radios += src:l_ear
|
||||
else if (src:r_ear)
|
||||
src:r_ear.talk_into(src, message, 0, "[is_speaking_taj ? "tajaran" : "english"]")
|
||||
used_radios += src:r_ear
|
||||
|
||||
message_range = 1
|
||||
italics = 1
|
||||
|
||||
|
||||
if ("secure headset")
|
||||
if (src:l_ear && istype(src:l_ear,/obj/item/device/radio))
|
||||
src:l_ear.talk_into(src, message, 1, "[is_speaking_taj ? "tajaran" : "english"]")
|
||||
used_radios += src:l_ear
|
||||
else if (src:r_ear)
|
||||
src:r_ear.talk_into(src, message, 1, "[is_speaking_taj ? "tajaran" : "english"]")
|
||||
used_radios += src:r_ear
|
||||
|
||||
message_range = 1
|
||||
italics = 1
|
||||
|
||||
if ("right ear")
|
||||
if (src:r_ear)
|
||||
src:r_ear.talk_into(src, message, 0, "[is_speaking_taj ? "tajaran" : "english"]")
|
||||
used_radios += src:r_ear
|
||||
|
||||
message_range = 1
|
||||
italics = 1
|
||||
|
||||
if ("left ear")
|
||||
if (src:l_ear)
|
||||
src:l_ear.talk_into(src, message, 0, "[is_speaking_taj ? "tajaran" : "english"]")
|
||||
used_radios += src:l_ear
|
||||
|
||||
message_range = 1
|
||||
italics = 1
|
||||
|
||||
if ("intercom")
|
||||
for (var/obj/item/device/radio/intercom/I in view(1, null))
|
||||
I.talk_into(src, message, 0, "[is_speaking_taj ? "tajaran" : "english"]")
|
||||
used_radios += I
|
||||
|
||||
message_range = 1
|
||||
italics = 1
|
||||
|
||||
//I see no reason to restrict such way of whispering
|
||||
if ("whisper")
|
||||
whisper(trim(copytext(message_old, 3)))
|
||||
return
|
||||
|
||||
if ("binary")
|
||||
if(robot_talk_understand || binarycheck())
|
||||
//message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)) //seems redundant
|
||||
robot_talk(message)
|
||||
return
|
||||
|
||||
if ("alientalk")
|
||||
if(alien_talk_understand || hivecheck())
|
||||
//message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)) //seems redundant
|
||||
alien_talk(message)
|
||||
return
|
||||
|
||||
if ("department")
|
||||
if (src:l_ear && istype(src:l_ear,/obj/item/device/radio))
|
||||
src:l_ear.talk_into(src, message, message_mode)
|
||||
used_radios += src:l_ear
|
||||
else if (src:r_ear)
|
||||
src:r_ear.talk_into(src, message, message_mode)
|
||||
used_radios += src:r_ear
|
||||
message_range = 1
|
||||
italics = 1
|
||||
if("changeling")
|
||||
if(src.changeling)
|
||||
for(var/mob/living/carbon/aChangeling in world)
|
||||
if(aChangeling.changeling)
|
||||
aChangeling << "<i><font color=#800080><b>[gender=="male"?"Mr.":"Mrs."] [changeling.changelingID]:</b> [message]</font></i>"
|
||||
return
|
||||
////SPECIAL HEADSETS START
|
||||
else
|
||||
//world << "SPECIAL HEADSETS"
|
||||
if (message_mode in radiochannels)
|
||||
if (src:l_ear && istype(src:l_ear,/obj/item/device/radio))
|
||||
src:l_ear.talk_into(src, message, message_mode)
|
||||
used_radios += src:l_ear
|
||||
else if (src:r_ear)
|
||||
src:r_ear.talk_into(src, message, message_mode)
|
||||
used_radios += src:r_ear
|
||||
message_range = 1
|
||||
italics = 1
|
||||
/////SPECIAL HEADSETS END
|
||||
|
||||
var/list/listening
|
||||
/*
|
||||
if(istype(loc, /obj/item/device/aicard)) // -- TLE
|
||||
var/obj/O = loc
|
||||
if(istype(O.loc, /mob))
|
||||
var/mob/M = O.loc
|
||||
listening = hearers(message_range, M)
|
||||
else
|
||||
listening = hearers(message_range, O)
|
||||
else
|
||||
listening = hearers(message_range, src)
|
||||
|
||||
for (var/obj/O in view(message_range, src))
|
||||
for (var/mob/M in O)
|
||||
listening += M // maybe need to check if M can hear src
|
||||
spawn (0)
|
||||
if (O)
|
||||
O.hear_talk(src, message)
|
||||
|
||||
if (!(src in listening))
|
||||
listening += src
|
||||
|
||||
*/
|
||||
var/turf/T = get_turf(src)
|
||||
listening = hearers(message_range, T)
|
||||
var/list/V = view(message_range, T)
|
||||
var/list/W = V
|
||||
//find mobs in lockers, cryo, intellicards, brains, MMIs, and so on.
|
||||
for (var/mob/M in world)
|
||||
if (!M.client)
|
||||
continue //skip monkeys and leavers
|
||||
if (istype(M, /mob/new_player))
|
||||
continue
|
||||
if (M.stat <2) //is alive
|
||||
if (isturf(M.loc))
|
||||
continue //if M can hear us it was already found by hearers()
|
||||
if (get_turf(M) in V) //this is slow, but I don't think we'd have a lot of wardrobewhores every round --rastaf0
|
||||
listening+=M
|
||||
else
|
||||
if (M.client && M.client.ghost_ears)
|
||||
listening|=M
|
||||
|
||||
var/list/eavesdroppers = get_mobs_in_view(7, src)
|
||||
for(var/mob/M in listening)
|
||||
eavesdroppers.Remove(M)
|
||||
for(var/mob/M in eavesdroppers)
|
||||
if(M.stat)
|
||||
eavesdroppers.Remove(M)
|
||||
|
||||
for (var/obj/O in ((W | contents)-used_radios))
|
||||
W |= O
|
||||
|
||||
for (var/mob/M in W)
|
||||
W |= M.contents
|
||||
if(hasorgans(M))
|
||||
var/mob/living/carbon/G = M
|
||||
for(var/name in G:organs)
|
||||
var/datum/organ/external/F = G:organs[name]
|
||||
for(var/obj/item/weapon/implant/I in F.implant)
|
||||
W |= I
|
||||
|
||||
for (var/obj/item/device/pda/M in W)
|
||||
W |= M.contents
|
||||
|
||||
for (var/obj/O in W) //radio in pocket could work, radio in backpack wouldn't --rastaf0
|
||||
spawn (0)
|
||||
if(O && !istype(O.loc, /obj/item/weapon/storage))
|
||||
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.
|
||||
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
|
||||
var/list/heard_b = list() // didn't understand us
|
||||
|
||||
for (var/mob/M in listening)
|
||||
//if speaking in tajaran, only let other tajs understand
|
||||
if ( M.say_understands(src) && (M.taj_talk_understand || !is_speaking_taj || M.universal_speak) )
|
||||
heard_a += M
|
||||
else
|
||||
heard_b += M
|
||||
|
||||
var/speech_bubble_test = say_test(message)
|
||||
var/image/speech_bubble = image('talk.dmi',src,"h[speech_bubble_test]")
|
||||
|
||||
var/rendered = null
|
||||
if (length(heard_a))
|
||||
var/message_a = say_quote(message,is_speaking_taj)
|
||||
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>"
|
||||
|
||||
|
||||
/*
|
||||
// Create speech bubble
|
||||
var/obj/effect/speech_bubble/B = new/obj/effect/speech_bubble
|
||||
B.icon = 'speechbubble.dmi'
|
||||
B.parent = src
|
||||
B.mouse_opacity = 0
|
||||
B.invisibility = invisibility
|
||||
B.layer = 10
|
||||
|
||||
// Determine if the speech bubble's going to have a special look
|
||||
var/presay = ""
|
||||
if(istype(src, /mob/living/silicon))
|
||||
presay = "bot"
|
||||
if(istype(src, /mob/living/carbon/alien))
|
||||
presay = "xeno"
|
||||
if(istype(src, /mob/living/carbon/metroid))
|
||||
presay = "metroid"
|
||||
*/
|
||||
for (var/mob/M in heard_a)
|
||||
|
||||
M.show_message(rendered, 2)
|
||||
M << speech_bubble
|
||||
spawn(30) del(speech_bubble)
|
||||
//spawn(30) del(speech_bubble)
|
||||
/*
|
||||
if(M.client)
|
||||
|
||||
// If this client has bubbles disabled, obscure the bubble
|
||||
if(!M.client.bubbles || M == src)
|
||||
var/image/I = image('speechbubble.dmi', B, "override")
|
||||
I.override = 1
|
||||
M << I
|
||||
*/
|
||||
|
||||
/*
|
||||
// find the suffix, if bot, human or monkey
|
||||
var/punctuation = ""
|
||||
if(presay == "bot" || presay == "")
|
||||
var/ending = copytext(text, length(text))
|
||||
if (ending == "?")
|
||||
punctuation = "question"
|
||||
else if (ending == "!")
|
||||
punctuation = "exclamation"
|
||||
else
|
||||
punctuation = ""
|
||||
|
||||
// flick the bubble
|
||||
flick("[presay]say[punctuation]", B)
|
||||
|
||||
if(istype(loc, /turf))
|
||||
B.loc = loc
|
||||
else
|
||||
B.loc = loc.loc
|
||||
|
||||
spawn()
|
||||
sleep(11)
|
||||
del(B)
|
||||
*/
|
||||
|
||||
if (length(heard_b))
|
||||
var/message_b = tajspeak(message)
|
||||
message_b = say_quote(message_b,1)
|
||||
|
||||
if (italics)
|
||||
message_b = "<i>[message_b]</i>"
|
||||
|
||||
rendered = "<span class='game say'><span class='name'>[voice_name]</span> <span class='message'>[message_b]</span></span>"
|
||||
|
||||
|
||||
/*
|
||||
// Create speech bubble
|
||||
var/obj/effect/speech_bubble/B = new/obj/effect/speech_bubble
|
||||
B.icon = 'speechbubble.dmi'
|
||||
B.parent = src
|
||||
B.mouse_opacity = 0
|
||||
B.invisibility = invisibility
|
||||
B.layer = 10
|
||||
|
||||
// Determine if the speech bubble's going to have a special look
|
||||
var/presay = ""
|
||||
if(istype(src, /mob/living/silicon))
|
||||
presay = "bot"
|
||||
if(istype(src, /mob/living/carbon/alien))
|
||||
presay = "xeno"
|
||||
if(istype(src, /mob/living/carbon/metroid))
|
||||
presay = "metroid"
|
||||
*/
|
||||
|
||||
for (var/mob/M in heard_b)
|
||||
M.show_message(rendered, 2)
|
||||
M << speech_bubble
|
||||
spawn(30) del(speech_bubble)
|
||||
|
||||
/*
|
||||
if(M.client)
|
||||
|
||||
if(!M.client.bubbles || M == src)
|
||||
var/image/I = image('speechbubble.dmi', B, "override")
|
||||
I.override = 1
|
||||
M << I
|
||||
|
||||
|
||||
flick("[presay]say", B)
|
||||
|
||||
if(istype(loc, /turf))
|
||||
B.loc = loc
|
||||
else
|
||||
B.loc = loc.loc
|
||||
|
||||
spawn()
|
||||
sleep(11)
|
||||
del(B)
|
||||
*/
|
||||
|
||||
if (length(eavesdroppers))
|
||||
|
||||
for (var/mob/M in eavesdroppers)
|
||||
M << "\blue [src] speaks into their radio..."
|
||||
M << speech_bubble
|
||||
spawn(30) del(speech_bubble)
|
||||
|
||||
/mob/living/carbon/human/tajaran/say_understands(var/other)
|
||||
if (istype(other, /mob/living/silicon/ai))
|
||||
return 1
|
||||
if (istype(other, /mob/living/silicon/decoy))
|
||||
return 1
|
||||
if (istype(other, /mob/living/silicon/pai))
|
||||
return 1
|
||||
if (istype(other, /mob/living/silicon/robot))
|
||||
return 1
|
||||
if (istype(other, /mob/living/carbon/brain))
|
||||
return 1
|
||||
if (istype(other, /mob/living/carbon/metroid))
|
||||
return 1
|
||||
if (istype(other, /mob/living/carbon/human))
|
||||
return 1
|
||||
return ..()
|
||||
@@ -1,74 +0,0 @@
|
||||
/mob/living/carbon/human/proc/Tajaraize()
|
||||
if (monkeyizing)
|
||||
return
|
||||
monkeyizing = 1
|
||||
canmove = 0
|
||||
icon = null
|
||||
invisibility = 101
|
||||
overlays = list()
|
||||
|
||||
var/atom/movable/overlay/animation = new /atom/movable/overlay( loc )
|
||||
animation.icon_state = "blank"
|
||||
animation.icon = 'mob.dmi'
|
||||
animation.master = src
|
||||
flick("h2monkey", animation)
|
||||
sleep(18)
|
||||
//animation = null
|
||||
var/mob/living/carbon/human/tajaran/O = new /mob/living/carbon/human/tajaran( loc )
|
||||
del(animation)
|
||||
O.organs.Cut()
|
||||
O.organs = organs
|
||||
for(var/name in O.organs) //Ensuring organ trasnfer
|
||||
var/datum/organ/external/organ = O.organs[name]
|
||||
organ.owner = O
|
||||
for(var/obj/item/weapon/implant/implant in organ.implant)
|
||||
implant.imp_in = O
|
||||
for(var/obj/hud/H in contents) //Lets not get a duplicate hud
|
||||
del(H)
|
||||
for(var/named in vars) //Making them keep their crap.
|
||||
if(istype(vars[named], /obj/item))
|
||||
O.vars[named] = vars[named]
|
||||
else if (named == "contents")
|
||||
O.vars[named] = vars[named]
|
||||
|
||||
O.real_name = real_name
|
||||
O.name = name
|
||||
O.dna = dna
|
||||
updateappearance(O,O.dna.uni_identity)
|
||||
O.loc = loc
|
||||
O.viruses = viruses
|
||||
O.s_tone = s_tone
|
||||
viruses = list()
|
||||
for(var/datum/disease/D in O.viruses)
|
||||
D.affected_mob = O
|
||||
O.flavor_text = flavor_text
|
||||
O.universal_speak = 1 //hacky fix until someone can figure out how to make them only understand humans
|
||||
|
||||
if (client)
|
||||
client.mob = O
|
||||
if(mind)
|
||||
mind.transfer_to(O)
|
||||
|
||||
del(O.stand_icon) //Force it to update.
|
||||
del(O.lying_icon)
|
||||
|
||||
O.update_body()
|
||||
O.update_face()
|
||||
spawn(1)
|
||||
O.rebuild_appearance()
|
||||
O << "<B>You are now a Tajara.</B>"
|
||||
spawn(0)//To prevent the proc from returning null.
|
||||
del(src)
|
||||
return
|
||||
|
||||
/client/proc/make_tajaran(mob/living/carbon/human/H as mob)
|
||||
set category = "Fun"
|
||||
set name = "Make Tajaran"
|
||||
set desc = "Make (mob) into a tajaran."
|
||||
|
||||
if (!holder)
|
||||
src << "Only administrators may use this command."
|
||||
return
|
||||
|
||||
if(istype(H))
|
||||
H:Tajaraize()
|
||||
@@ -1,613 +0,0 @@
|
||||
/mob/living/carbon/human/tajaran
|
||||
name = "tajaran"
|
||||
real_name = "tajaran"
|
||||
voice_name = "tajaran"
|
||||
icon = 'tajaran.dmi'
|
||||
icon_state = "m_none"
|
||||
var/list/tajspeak_letters = list("~","*","-")
|
||||
//universal_speak = 1 (I think I fixed it, need testy testy) hacky fix until someone can figure out how to make them only understand humans
|
||||
taj_talk_understand = 1
|
||||
voice_message = "mrowls"
|
||||
examine_text = "one of the cat-like Tajarans"
|
||||
|
||||
/mob/living/carbon/human/tajaran/New()
|
||||
var/g = "m"
|
||||
if (gender == FEMALE)
|
||||
g = "f"
|
||||
|
||||
spawn (1)
|
||||
if(!stand_icon)
|
||||
stand_icon = new /icon('tajaran.dmi', "body_[g]_s")
|
||||
if(!lying_icon)
|
||||
lying_icon = new /icon('tajaran.dmi', "body_[g]_l")
|
||||
icon = stand_icon
|
||||
rebuild_appearance()
|
||||
src << "\blue Your icons have been generated!"
|
||||
|
||||
..()
|
||||
|
||||
spawn(33)
|
||||
update_clothing()
|
||||
update_body()
|
||||
update_face()
|
||||
|
||||
/mob/living/carbon/human/tajaran/rebuild_appearance()
|
||||
update_clothing()
|
||||
|
||||
/mob/living/carbon/human/tajaran/update_body_appearance()
|
||||
update_clothing()
|
||||
|
||||
/mob/living/carbon/human/tajaran/update_clothing()
|
||||
// ..()
|
||||
|
||||
if (monkeyizing)
|
||||
return
|
||||
|
||||
overlays = null
|
||||
|
||||
// lol
|
||||
var/fat = ""
|
||||
/*if (FAT in mutation)
|
||||
fat = "fat"*/
|
||||
/*
|
||||
if (HULK in mutations)
|
||||
overlays += image("icon" = 'genetics.dmi', "icon_state" = "hulk[fat][!lying ? "_s" : "_l"]")
|
||||
*/
|
||||
if (COLD_RESISTANCE in mutations)
|
||||
overlays += image("icon" = 'genetics.dmi', "icon_state" = "fire[fat][!lying ? "_s" : "_l"]")
|
||||
|
||||
if (TK in mutations)
|
||||
overlays += image("icon" = 'genetics.dmi', "icon_state" = "telekinesishead[fat][!lying ? "_s" : "_l"]")
|
||||
|
||||
if (LASER in mutations)
|
||||
overlays += image("icon" = 'genetics.dmi', "icon_state" = "lasereyes[!lying ? "_s" : "_l"]")
|
||||
|
||||
if (mutantrace)
|
||||
switch(mutantrace)
|
||||
if("golem","metroid")
|
||||
overlays += image("icon" = 'genetics.dmi', "icon_state" = "[mutantrace][fat][!lying ? "_s" : "_l"]")
|
||||
if(face_standing)
|
||||
del(face_standing)
|
||||
if(face_lying)
|
||||
del(face_lying)
|
||||
if(stand_icon)
|
||||
del(stand_icon)
|
||||
if(lying_icon)
|
||||
del(lying_icon)
|
||||
if("lizard")
|
||||
overlays += image("icon" = 'genetics.dmi', "icon_state" = "[mutantrace][fat]_[gender][!lying ? "_s" : "_l"]")
|
||||
if(face_standing)
|
||||
del(face_standing)
|
||||
if(face_lying)
|
||||
del(face_lying)
|
||||
if(stand_icon)
|
||||
del(stand_icon)
|
||||
if(lying_icon)
|
||||
del(lying_icon)
|
||||
if("skrell")
|
||||
body_overlays_standing += image("icon" = 'genetics.dmi', "icon_state" = "[mutantrace]_[gender]_s")
|
||||
body_overlays_lying += image("icon" = 'genetics.dmi', "icon_state" = "[mutantrace]_[gender]_l")
|
||||
// This needs to be matched up with humans, but I'm too lazy right now
|
||||
// if(face_standing)
|
||||
// del(face_standing)
|
||||
// if(face_lying)
|
||||
// del(face_lying)
|
||||
if(stand_icon)
|
||||
del(stand_icon)
|
||||
if(lying_icon)
|
||||
del(lying_icon)
|
||||
if("plant")
|
||||
if(stat != 2) //if not dead, that is
|
||||
overlays += image("icon" = 'genetics.dmi', "icon_state" = "[mutantrace][fat]_[gender][!lying ? "_s" : "_l"]")
|
||||
else
|
||||
overlays += image("icon" = 'genetics.dmi', "icon_state" = "[mutantrace]_d")
|
||||
if(face_standing)
|
||||
del(face_standing)
|
||||
if(face_lying)
|
||||
del(face_lying)
|
||||
if(stand_icon)
|
||||
del(stand_icon)
|
||||
if(lying_icon)
|
||||
del(lying_icon)
|
||||
else
|
||||
if(!face_standing || !face_lying)
|
||||
update_face()
|
||||
if(!stand_icon || !lying_icon)
|
||||
update_body()
|
||||
|
||||
if(buckled)
|
||||
if(istype(buckled, /obj/structure/stool/bed))
|
||||
lying = 1
|
||||
else
|
||||
lying = 0
|
||||
|
||||
// Automatically drop anything in store / id / belt if you're not wearing a uniform.
|
||||
if (!w_uniform)
|
||||
for (var/obj/item/thing in list(r_store, l_store, wear_id, belt))
|
||||
if (thing)
|
||||
u_equip(thing)
|
||||
if (client)
|
||||
client.screen -= thing
|
||||
|
||||
if (thing)
|
||||
thing.loc = loc
|
||||
thing.dropped(src)
|
||||
thing.layer = initial(thing.layer)
|
||||
|
||||
|
||||
//if (zone_sel)
|
||||
// zone_sel.overlays = null
|
||||
// zone_sel.overlays += body_standing
|
||||
// zone_sel.overlays += image("icon" = 'zone_sel.dmi', "icon_state" = text("[]", zone_sel.selecting))
|
||||
|
||||
if (lying)
|
||||
icon = lying_icon
|
||||
|
||||
overlays += damageicon_lying
|
||||
|
||||
if (face_lying)
|
||||
overlays += face_lying
|
||||
else
|
||||
icon = stand_icon
|
||||
|
||||
overlays += damageicon_standing
|
||||
|
||||
if (face_standing)
|
||||
overlays += face_standing
|
||||
|
||||
// Uniform
|
||||
if(w_uniform)
|
||||
/*if ((FAT in mutations) && !(w_uniform.flags & ONESIZEFITSALL))
|
||||
src << "\red You burst out of the [w_uniform.name]!"
|
||||
var/obj/item/clothing/c = w_uniform
|
||||
u_equip(c)
|
||||
if(client)
|
||||
client.screen -= c
|
||||
if(c)
|
||||
c:loc = loc
|
||||
c:dropped(src)
|
||||
c:layer = initial(c:layer)*/
|
||||
if(w_uniform)//I should really not need these
|
||||
w_uniform.screen_loc = ui_iclothing
|
||||
if(istype(w_uniform, /obj/item/clothing/under))
|
||||
var/t1 = w_uniform.color
|
||||
if (!t1)
|
||||
t1 = icon_state
|
||||
/*if (FAT in mutations)
|
||||
overlays += image("icon" = 'uniform_fat.dmi', "icon_state" = "[t1][!lying ? "_s" : "_l"]", "layer" = MOB_LAYER)
|
||||
else*/
|
||||
overlays += image("icon" = 'uniform.dmi', "icon_state" = text("[][]",t1, (!(lying) ? "_s" : "_l")), "layer" = MOB_LAYER)
|
||||
if (w_uniform.blood_DNA)
|
||||
var/icon/stain_icon = icon('blood.dmi', "uniformblood[!lying ? "" : "2"]")
|
||||
overlays += image("icon" = stain_icon, "layer" = MOB_LAYER)
|
||||
|
||||
if (wear_id)
|
||||
if(wear_id.over_jumpsuit)
|
||||
overlays += image("icon" = 'mob.dmi', "icon_state" = "id[!lying ? null : "2"]", "layer" = MOB_LAYER)
|
||||
|
||||
if (client)
|
||||
client.screen -= hud_used.intents
|
||||
client.screen -= hud_used.mov_int
|
||||
|
||||
|
||||
//Screenlocs for these slots are handled by the huds other_update()
|
||||
//because theyre located on the 'other' inventory bar.
|
||||
|
||||
// Gloves
|
||||
var/datum/organ/external/lo = organs["l_hand"]
|
||||
var/datum/organ/external/ro = organs["r_hand"]
|
||||
if (!(lo.status & ORGAN_DESTROYED && ro.status & ORGAN_DESTROYED))
|
||||
if (gloves)
|
||||
var/t1 = gloves.item_state
|
||||
if (!t1)
|
||||
t1 = gloves.icon_state
|
||||
var/icon/gloves_icon = new /icon("icon" = 'hands.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2")))
|
||||
if(lo.status & ORGAN_DESTROYED)
|
||||
gloves_icon.Blend(new /icon('limb_mask.dmi', "right_[lying?"l":"s"]"), ICON_MULTIPLY)
|
||||
else if(ro.status & ORGAN_DESTROYED)
|
||||
gloves_icon.Blend(new /icon('limb_mask.dmi', "left_[lying?"l":"s"]"), ICON_MULTIPLY)
|
||||
overlays += image(gloves_icon, "layer" = MOB_LAYER)
|
||||
if (gloves.blood_DNA)
|
||||
var/icon/stain_icon = icon('blood.dmi', "bloodyhands[!lying ? "" : "2"]")
|
||||
if(lo.status & ORGAN_DESTROYED)
|
||||
stain_icon.Blend(new /icon('limb_mask.dmi', "right_[lying?"l":"s"]"), ICON_MULTIPLY)
|
||||
else if(ro.status & ORGAN_DESTROYED)
|
||||
stain_icon.Blend(new /icon('limb_mask.dmi', "left_[lying?"l":"s"]"), ICON_MULTIPLY)
|
||||
overlays += image("icon" = stain_icon, "layer" = MOB_LAYER)
|
||||
else if (blood_DNA)
|
||||
var/icon/stain_icon = icon('blood.dmi', "bloodyhands[!lying ? "" : "2"]")
|
||||
if(lo.status & ORGAN_DESTROYED)
|
||||
stain_icon.Blend(new /icon('limb_mask.dmi', "right_[lying?"l":"s"]"), ICON_MULTIPLY)
|
||||
else if(ro.status & ORGAN_DESTROYED)
|
||||
stain_icon.Blend(new /icon('limb_mask.dmi', "left_[lying?"l":"s"]"), ICON_MULTIPLY)
|
||||
overlays += image("icon" = stain_icon, "layer" = MOB_LAYER)
|
||||
// Glasses
|
||||
if (glasses)
|
||||
var/t1 = glasses.icon_state
|
||||
overlays += image("icon" = 'eyes.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2")), "layer" = MOB_LAYER)
|
||||
// Ears
|
||||
if (l_ear)
|
||||
var/t1 = l_ear.icon_state
|
||||
overlays += image("icon" = 'ears.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2")), "layer" = MOB_LAYER)
|
||||
if (r_ear)
|
||||
var/t1 = r_ear.icon_state
|
||||
overlays += image("icon" = 'ears.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2")), "layer" = MOB_LAYER)
|
||||
// Shoes
|
||||
lo = organs["l_foot"]
|
||||
ro = organs["r_foot"]
|
||||
if (!(lo.status & ORGAN_DESTROYED && ro.status & ORGAN_DESTROYED) && shoes)
|
||||
var/t1 = shoes.icon_state
|
||||
var/icon/shoes_icon = new /icon("icon" = 'feet.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2")))
|
||||
if(lo.status & ORGAN_DESTROYED && !lying)
|
||||
shoes_icon.Blend(new /icon('limb_mask.dmi', "right[lying?"_l":""]"), ICON_MULTIPLY)
|
||||
else if(ro.status & ORGAN_DESTROYED && !lying)
|
||||
shoes_icon.Blend(new /icon('limb_mask.dmi', "left[lying?"_l":""]"), ICON_MULTIPLY)
|
||||
overlays += image(shoes_icon, "layer" = MOB_LAYER)
|
||||
if (shoes.blood_DNA)
|
||||
var/icon/stain_icon = icon('blood.dmi', "shoesblood[!lying ? "" : "2"]")
|
||||
if(lo.status & ORGAN_DESTROYED)
|
||||
stain_icon.Blend(new /icon('limb_mask.dmi', "right_[lying?"l":"s"]"), ICON_MULTIPLY)
|
||||
else if(ro.status & ORGAN_DESTROYED)
|
||||
stain_icon.Blend(new /icon('limb_mask.dmi', "left_[lying?"l":"s"]"), ICON_MULTIPLY)
|
||||
overlays += image("icon" = stain_icon, "layer" = MOB_LAYER) // Radio
|
||||
/* if (w_radio)
|
||||
overlays += image("icon" = 'ears.dmi', "icon_state" = "headset[!lying ? "" : "2"]", "layer" = MOB_LAYER) */
|
||||
|
||||
if (s_store)
|
||||
var/t1 = s_store.item_state
|
||||
if (!t1)
|
||||
t1 = s_store.icon_state
|
||||
if(!istype(wear_suit, /obj/item/clothing/suit/storage/armoredundersuit))
|
||||
overlays += image("icon" = 'belt_mirror.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2")), "layer" = MOB_LAYER)
|
||||
s_store.screen_loc = ui_sstore1
|
||||
|
||||
if(client) hud_used.other_update() //Update the screenloc of the items on the 'other' inventory bar
|
||||
//to hide / show them.
|
||||
if (client)
|
||||
if (i_select)
|
||||
if (intent)
|
||||
client.screen += hud_used.intents
|
||||
|
||||
var/list/L = dd_text2list(intent, ",")
|
||||
L[1] += ":-11"
|
||||
i_select.screen_loc = dd_list2text(L,",") //ICONS4, FUCKING SHIT
|
||||
else
|
||||
i_select.screen_loc = null
|
||||
if (m_select)
|
||||
if (m_int)
|
||||
client.screen += hud_used.mov_int
|
||||
|
||||
var/list/L = dd_text2list(m_int, ",")
|
||||
L[1] += ":-11"
|
||||
m_select.screen_loc = dd_list2text(L,",") //ICONS4, FUCKING SHIT
|
||||
else
|
||||
m_select.screen_loc = null
|
||||
|
||||
var/tail_shown = 1
|
||||
if (wear_suit)
|
||||
/*if ((FAT in mutations) && !(wear_suit.flags & ONESIZEFITSALL))
|
||||
src << "\red You burst out of the [wear_suit.name]!"
|
||||
var/obj/item/clothing/c = wear_suit
|
||||
u_equip(c)
|
||||
if(client)
|
||||
client.screen -= c
|
||||
if(c)
|
||||
c:loc = loc
|
||||
c:dropped(src)
|
||||
c:layer = initial(c:layer)*/
|
||||
if (istype(wear_suit, /obj/item/clothing/suit))
|
||||
var/t1 = wear_suit.icon_state
|
||||
overlays += image("icon" = 'suit.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2")), "layer" = MOB_LAYER)
|
||||
if (wear_suit)
|
||||
if (wear_suit.blood_DNA)
|
||||
var/icon/stain_icon = null
|
||||
if (istype(wear_suit, /obj/item/clothing/suit/armor/vest || /obj/item/clothing/suit/storage/wcoat))
|
||||
stain_icon = icon('blood.dmi', "armorblood[!lying ? "" : "2"]")
|
||||
else if (istype(wear_suit, /obj/item/clothing/suit/storage/det_suit || /obj/item/clothing/suit/storage/labcoat))
|
||||
stain_icon = icon('blood.dmi', "coatblood[!lying ? "" : "2"]")
|
||||
else
|
||||
stain_icon = icon('blood.dmi', "suitblood[!lying ? "" : "2"]")
|
||||
overlays += image("icon" = stain_icon, "layer" = MOB_LAYER)
|
||||
wear_suit.screen_loc = ui_oclothing
|
||||
if (istype(wear_suit, /obj/item/clothing/suit/straight_jacket))
|
||||
if (handcuffed)
|
||||
handcuffed.loc = loc
|
||||
handcuffed.layer = initial(handcuffed.layer)
|
||||
handcuffed = null
|
||||
if ((l_hand || r_hand))
|
||||
var/h = hand
|
||||
hand = 1
|
||||
drop_item()
|
||||
hand = 0
|
||||
drop_item()
|
||||
hand = h
|
||||
//if wearing some suits, hide the tail
|
||||
if ( istype(wear_suit, /obj/item/clothing/suit/bio_suit) || istype(wear_suit, /obj/item/clothing/suit/bomb_suit) || istype(wear_suit, /obj/item/clothing/suit/space) )
|
||||
tail_shown = 0
|
||||
if(tail_shown)
|
||||
overlays += image("icon" = icon('tajaran.dmi', "tail_[gender==FEMALE ? "f" : "m"]_[lying ? "l" : "s"]"), "layer" = MOB_LAYER)
|
||||
|
||||
if (lying)
|
||||
if (face_lying)
|
||||
overlays += face_lying
|
||||
else
|
||||
if (face_standing)
|
||||
overlays += face_standing
|
||||
|
||||
if (wear_mask)
|
||||
if (istype(wear_mask, /obj/item/clothing/mask))
|
||||
var/t1 = wear_mask.icon_state
|
||||
overlays += image("icon" = 'mask.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2")), "layer" = MOB_LAYER)
|
||||
if (!istype(wear_mask, /obj/item/clothing/mask/cigarette))
|
||||
if (wear_mask.blood_DNA)
|
||||
var/icon/stain_icon = icon('blood.dmi', "maskblood[!lying ? "" : "2"]")
|
||||
overlays += image("icon" = stain_icon, "layer" = MOB_LAYER)
|
||||
wear_mask.screen_loc = ui_mask
|
||||
|
||||
// Head
|
||||
if (head)
|
||||
var/t1 = head.icon_state
|
||||
var/icon/head_icon = icon('head.dmi', text("[][]", t1, (!( lying ) ? null : "2")))
|
||||
if(istype(head,/obj/item/clothing/head/kitty))
|
||||
head_icon = (( lying ) ? head:mob2 : head:mob)
|
||||
overlays += image("icon" = head_icon, "layer" = MOB_LAYER)
|
||||
if(gimmick_hat)
|
||||
overlays += image("icon" = icon('gimmick_head.dmi', "[gimmick_hat][!lying ? "" : "2"]"), "layer" = MOB_LAYER)
|
||||
if (head.blood_DNA)
|
||||
var/icon/stain_icon = icon('blood.dmi', "helmetblood[!lying ? "" : "2"]")
|
||||
overlays += image("icon" = stain_icon, "layer" = MOB_LAYER)
|
||||
head.screen_loc = ui_head
|
||||
else
|
||||
var/datum/organ/external/head = organs["head"]
|
||||
if(!(head.status & ORGAN_DESTROYED))
|
||||
//if not wearing anything on the head, show the ears
|
||||
overlays += image("icon" = icon('tajaran.dmi', "ears_[gender==FEMALE ? "f" : "m"]_[lying ? "l" : "s"]"), "layer" = MOB_LAYER)
|
||||
|
||||
// Belt
|
||||
if (belt)
|
||||
var/t1 = belt.item_state
|
||||
if (!t1)
|
||||
t1 = belt.icon_state
|
||||
overlays += image("icon" = 'belt.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2")), "layer" = MOB_LAYER)
|
||||
belt.screen_loc = ui_belt
|
||||
|
||||
|
||||
name = get_visible_name()
|
||||
|
||||
if (wear_id)
|
||||
wear_id.screen_loc = ui_id
|
||||
|
||||
if (l_store)
|
||||
l_store.screen_loc = ui_storage1
|
||||
|
||||
if (r_store)
|
||||
r_store.screen_loc = ui_storage2
|
||||
|
||||
if (back)
|
||||
var/t1 = back.icon_state
|
||||
overlays += image("icon" = 'back.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2")), "layer" = MOB_LAYER)
|
||||
back.screen_loc = ui_back
|
||||
|
||||
if (handcuffed)
|
||||
pulling = null
|
||||
if (!lying)
|
||||
overlays += image("icon" = 'mob.dmi', "icon_state" = "handcuff1", "layer" = MOB_LAYER)
|
||||
else
|
||||
overlays += image("icon" = 'mob.dmi', "icon_state" = "handcuff2", "layer" = MOB_LAYER)
|
||||
|
||||
if (client)
|
||||
client.screen -= contents
|
||||
client.screen += contents
|
||||
|
||||
if (r_hand)
|
||||
overlays += image("icon" = 'items_righthand.dmi', "icon_state" = r_hand.item_state ? r_hand.item_state : r_hand.icon_state, "layer" = MOB_LAYER+1)
|
||||
|
||||
r_hand.screen_loc = ui_rhand
|
||||
|
||||
if (l_hand)
|
||||
overlays += image("icon" = 'items_lefthand.dmi', "icon_state" = l_hand.item_state ? l_hand.item_state : l_hand.icon_state, "layer" = MOB_LAYER+1)
|
||||
|
||||
l_hand.screen_loc = ui_lhand
|
||||
|
||||
var/shielded = 0
|
||||
for (var/obj/item/weapon/cloaking_device/S in src)
|
||||
if (S.active)
|
||||
shielded = 2
|
||||
break
|
||||
|
||||
if(istype(wear_suit, /obj/item/clothing/suit/space/space_ninja)&&wear_suit:s_active)
|
||||
shielded = 3
|
||||
|
||||
switch(shielded)
|
||||
if(1)
|
||||
overlays += image("icon" = 'effects.dmi', "icon_state" = "shield", "layer" = MOB_LAYER+1)
|
||||
if(2)
|
||||
invisibility = 2
|
||||
//New stealth. Hopefully doesn't lag too much. /N
|
||||
if(istype(loc, /turf))//If they are standing on a turf.
|
||||
AddCamoOverlay(loc)//Overlay camo.
|
||||
if(3)
|
||||
if(istype(loc, /turf))
|
||||
//Ninjas may flick into view once in a while if they are stealthed.
|
||||
if(prob(90))
|
||||
NinjaStealthActive(loc)
|
||||
else
|
||||
NinjaStealthMalf()
|
||||
else
|
||||
invisibility = 0
|
||||
|
||||
if(client && client.admin_invis)
|
||||
invisibility = 100
|
||||
else if (shielded == 2)
|
||||
invisibility = 2
|
||||
else
|
||||
invisibility = 0
|
||||
if(targeted_by && target_locked)
|
||||
overlays += target_locked
|
||||
else if(targeted_by)
|
||||
target_locked = new /obj/effect/target_locked(src)
|
||||
overlays += target_locked
|
||||
else if(!targeted_by && target_locked)
|
||||
del(target_locked)
|
||||
|
||||
/*
|
||||
for (var/mob/M in viewers(1, src))//For the love of god DO NOT REFRESH EVERY SECOND - Mport
|
||||
if ((M.client && M.machine == src))
|
||||
spawn (0)
|
||||
show_inv(M)
|
||||
return
|
||||
*/
|
||||
last_b_state = stat
|
||||
|
||||
/mob/living/carbon/human/tajaran/update_body()
|
||||
if(stand_icon)
|
||||
del(stand_icon)
|
||||
if(lying_icon)
|
||||
del(lying_icon)
|
||||
|
||||
if (mutantrace)
|
||||
return
|
||||
|
||||
var/g = "m"
|
||||
if (gender == MALE)
|
||||
g = "m"
|
||||
else if (gender == FEMALE)
|
||||
g = "f"
|
||||
|
||||
stand_icon = new /icon('tajaran.dmi', "torso_[g]_s")
|
||||
lying_icon = new /icon('tajaran.dmi', "torso_[g]_l")
|
||||
|
||||
|
||||
|
||||
var/husk = (HUSK in mutations)
|
||||
//var/obese = (FAT in mutations)
|
||||
|
||||
stand_icon.Blend(new /icon('tajaran.dmi', "chest_[g]_s"), ICON_OVERLAY)
|
||||
lying_icon.Blend(new /icon('tajaran.dmi', "chest_[g]_l"), ICON_OVERLAY)
|
||||
|
||||
var/datum/organ/external/head = organs["head"]
|
||||
if(!(head.status & ORGAN_DESTROYED))
|
||||
stand_icon.Blend(new /icon('tajaran.dmi', "head_[g]_s"), ICON_OVERLAY)
|
||||
lying_icon.Blend(new /icon('tajaran.dmi', "head_[g]_l"), ICON_OVERLAY)
|
||||
|
||||
for(var/name in organs)
|
||||
var/datum/organ/external/part = organs[name]
|
||||
if(!istype(part, /datum/organ/external/groin) \
|
||||
&& !istype(part, /datum/organ/external/chest) \
|
||||
&& !istype(part, /datum/organ/external/head) \
|
||||
&& !(part.status & ORGAN_DESTROYED))
|
||||
var/icon/temp = new /icon('tajaran.dmi', "[part.icon_name]_s")
|
||||
if(part.status & ORGAN_ROBOT) temp.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0))
|
||||
stand_icon.Blend(temp, ICON_OVERLAY)
|
||||
temp = new /icon('tajaran.dmi', "[part.icon_name]_l")
|
||||
if(part.status & ORGAN_ROBOT) temp.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0))
|
||||
lying_icon.Blend(temp , ICON_OVERLAY)
|
||||
|
||||
stand_icon.Blend(new /icon('tajaran.dmi', "groin_[g]_s"), ICON_OVERLAY)
|
||||
lying_icon.Blend(new /icon('tajaran.dmi', "groin_[g]_l"), ICON_OVERLAY)
|
||||
|
||||
if (husk)
|
||||
var/icon/husk_s = new /icon('tajaran.dmi', "husk_s")
|
||||
var/icon/husk_l = new /icon('tajaran.dmi', "husk_l")
|
||||
|
||||
for(var/name in organs)
|
||||
var/datum/organ/external/part = organs[name]
|
||||
if(!istype(part, /datum/organ/external/groin) \
|
||||
&& !istype(part, /datum/organ/external/chest) \
|
||||
&& !istype(part, /datum/organ/external/head) \
|
||||
&& (part.status & ORGAN_DESTROYED))
|
||||
husk_s.Blend(new /icon('dam_mask.dmi', "[part.icon_name]"), ICON_SUBTRACT)
|
||||
husk_l.Blend(new /icon('dam_mask.dmi', "[part.icon_name]2"), ICON_SUBTRACT)
|
||||
|
||||
stand_icon.Blend(husk_s, ICON_OVERLAY)
|
||||
lying_icon.Blend(husk_l, ICON_OVERLAY)
|
||||
/*else if(obese)
|
||||
stand_icon.Blend(new /icon('human.dmi', "fatbody_s"), ICON_OVERLAY)
|
||||
lying_icon.Blend(new /icon('human.dmi', "fatbody_l"), ICON_OVERLAY)*/
|
||||
|
||||
// Skin tone
|
||||
if (s_tone >= 0)
|
||||
stand_icon.Blend(rgb(s_tone, s_tone, s_tone), ICON_ADD)
|
||||
lying_icon.Blend(rgb(s_tone, s_tone, s_tone), ICON_ADD)
|
||||
else
|
||||
stand_icon.Blend(rgb(-s_tone, -s_tone, -s_tone), ICON_SUBTRACT)
|
||||
lying_icon.Blend(rgb(-s_tone, -s_tone, -s_tone), ICON_SUBTRACT)
|
||||
|
||||
if (underwear > 0)
|
||||
//if(!obese)
|
||||
stand_icon.Blend(new /icon('tajaran.dmi', "underwear[underwear]_[g]_s"), ICON_OVERLAY)
|
||||
lying_icon.Blend(new /icon('tajaran.dmi', "underwear[underwear]_[g]_l"), ICON_OVERLAY)
|
||||
|
||||
|
||||
/mob/living/carbon/human/tajaran/update_face()
|
||||
if(organs)
|
||||
var/datum/organ/external/head = organs["head"]
|
||||
if(head)
|
||||
if(head.status & ORGAN_DESTROYED)
|
||||
del(face_standing)
|
||||
del(face_lying)
|
||||
return
|
||||
|
||||
//if(!facial_hair_style || !hair_style) return//Seems people like to lose their icons, this should stop the runtimes for now
|
||||
del(face_standing)
|
||||
del(face_lying)
|
||||
|
||||
if (mutantrace)
|
||||
return
|
||||
|
||||
var/g = "m"
|
||||
if (gender == MALE)
|
||||
g = "m"
|
||||
else if (gender == FEMALE)
|
||||
g = "f"
|
||||
|
||||
var/icon/eyes_s = new/icon("icon" = 'tajaran_face.dmi', "icon_state" = "eyes_s")
|
||||
var/icon/eyes_l = new/icon("icon" = 'tajaran_face.dmi', "icon_state" = "eyes_l")
|
||||
eyes_s.Blend(rgb(r_eyes, g_eyes, b_eyes), ICON_ADD)
|
||||
eyes_l.Blend(rgb(r_eyes, g_eyes, b_eyes), ICON_ADD)
|
||||
|
||||
//var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s")
|
||||
//var/icon/hair_l = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_l")
|
||||
//hair_s.Blend(rgb(r_hair, g_hair, b_hair), ICON_ADD)
|
||||
//hair_l.Blend(rgb(r_hair, g_hair, b_hair), ICON_ADD)
|
||||
|
||||
//var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s")
|
||||
//var/icon/facial_l = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_l")
|
||||
//facial_s.Blend(rgb(r_facial, g_facial, b_facial), ICON_ADD)
|
||||
//facial_l.Blend(rgb(r_facial, g_facial, b_facial), ICON_ADD)
|
||||
|
||||
var/icon/mouth_s = new/icon("icon" = 'tajaran_face.dmi', "icon_state" = "mouth_[g]_s")
|
||||
var/icon/mouth_l = new/icon("icon" = 'tajaran_face.dmi', "icon_state" = "mouth_[g]_l")
|
||||
|
||||
// if the head or mask has the flag BLOCKHAIR (equal to 5), then do not apply hair
|
||||
//if((!(head && (head.flags & BLOCKHAIR))) && !(wear_mask && (wear_mask.flags & BLOCKHAIR)))
|
||||
//eyes_s.Blend(hair_s, ICON_OVERLAY)
|
||||
//eyes_l.Blend(hair_l, ICON_OVERLAY)
|
||||
|
||||
eyes_s.Blend(mouth_s, ICON_OVERLAY)
|
||||
eyes_l.Blend(mouth_l, ICON_OVERLAY)
|
||||
|
||||
// if BLOCKHAIR, do not apply facial hair
|
||||
//if((!(head && (head.flags & BLOCKHAIR))) && !(wear_mask && (wear_mask.flags & BLOCKHAIR)))
|
||||
//eyes_s.Blend(facial_s, ICON_OVERLAY)
|
||||
//eyes_l.Blend(facial_l, ICON_OVERLAY)
|
||||
|
||||
|
||||
face_standing = new /image()
|
||||
face_lying = new /image()
|
||||
face_standing.icon = eyes_s
|
||||
face_standing.layer = MOB_LAYER
|
||||
face_lying.icon = eyes_l
|
||||
face_lying.layer = MOB_LAYER
|
||||
|
||||
del(mouth_l)
|
||||
del(mouth_s)
|
||||
//del(facial_l)
|
||||
//del(facial_s)
|
||||
//del(hair_l)
|
||||
//del(hair_s)
|
||||
del(eyes_l)
|
||||
del(eyes_s)
|
||||
|
||||
/mob/living/carbon/human/tajaran/co2overloadtime = null
|
||||
/mob/living/carbon/human/tajaran/temperature_resistance = T0C+70
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 28 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 21 KiB |
@@ -1,4 +0,0 @@
|
||||
//todo: this
|
||||
/mob/living/carbon/human/tajaran
|
||||
|
||||
/mob/var/taj_talk_understand = 0
|
||||
@@ -1,170 +0,0 @@
|
||||
/mob/living/carbon/human/tajaran/whisper(message as text)
|
||||
//Figured it out. If you use say :w (message) it HTML encodes it, THEN passes it to the whisper code, which does so again. Jeez. --SkyMarshal
|
||||
message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
|
||||
|
||||
if (!message)
|
||||
return
|
||||
|
||||
if (silent)
|
||||
return
|
||||
|
||||
log_whisper("[src.name]/[src.key] : [message]")
|
||||
|
||||
if (src.client && (src.client.muted || src.client.muted_complete))
|
||||
src << "You are muted."
|
||||
return
|
||||
|
||||
if (src.stat == 2)
|
||||
return src.say_dead(message)
|
||||
|
||||
if (src.stat)
|
||||
return
|
||||
|
||||
var/alt_name = ""
|
||||
if (istype(src, /mob/living/carbon/human) && src.name != src.real_name)
|
||||
var/mob/living/carbon/human/H = src
|
||||
alt_name = " (as [H.get_visible_name()])"
|
||||
// Mute disability
|
||||
if (src.disabilities & 64)
|
||||
return
|
||||
|
||||
if (istype(src.wear_mask, /obj/item/clothing/mask/muzzle))
|
||||
return
|
||||
|
||||
var/italics = 1
|
||||
var/message_range = 1
|
||||
|
||||
//work out if we're speaking tajaran or not
|
||||
var/is_speaking_taj = 0
|
||||
if(copytext(message, 1, 4) == ":j ")
|
||||
message = copytext(message, 4)
|
||||
if(taj_talk_understand || universal_speak)
|
||||
is_speaking_taj = 1
|
||||
|
||||
if(istype(src.wear_mask, /obj/item/clothing/mask/gas/voice/space_ninja)&&src.wear_mask:voice=="Unknown")
|
||||
if(copytext(message, 1, 2) != "*")
|
||||
var/list/temp_message = dd_text2list(message, " ")
|
||||
var/list/pick_list = list()
|
||||
for(var/i = 1, i <= temp_message.len, i++)
|
||||
pick_list += i
|
||||
for(var/i=1, i <= abs(temp_message.len/3), i++)
|
||||
var/H = pick(pick_list)
|
||||
if(findtext(temp_message[H], "*") || findtext(temp_message[H], ";") || findtext(temp_message[H], ":")) continue
|
||||
temp_message[H] = ninjaspeak(temp_message[H])
|
||||
pick_list -= H
|
||||
message = dd_list2text(temp_message, " ")
|
||||
message = dd_replaceText(message, "o", "¤")
|
||||
message = dd_replaceText(message, "p", "þ")
|
||||
message = dd_replaceText(message, "l", "£")
|
||||
message = dd_replaceText(message, "s", "§")
|
||||
message = dd_replaceText(message, "u", "µ")
|
||||
message = dd_replaceText(message, "b", "ß")
|
||||
|
||||
message = capitalize(message)
|
||||
|
||||
if (src.stuttering)
|
||||
message = stutter(message)
|
||||
if (src.slurring)
|
||||
message = slur(message)
|
||||
|
||||
for (var/obj/O in view(message_range, src))
|
||||
spawn (0)
|
||||
if (O)
|
||||
O.hear_talk(src, message)
|
||||
|
||||
var/list/listening = hearers(message_range, src)
|
||||
listening -= src
|
||||
listening += src
|
||||
var/list/eavesdropping = hearers(2, src)
|
||||
eavesdropping -= src
|
||||
eavesdropping -= listening
|
||||
var/list/watching = hearers(5, src)
|
||||
watching -= src
|
||||
watching -= listening
|
||||
watching -= eavesdropping
|
||||
|
||||
var/list/heard_a = list() // understood us
|
||||
var/list/heard_b = list() // didn't understand us
|
||||
|
||||
for (var/mob/M in listening)
|
||||
if ( M.say_understands(src) && (M.taj_talk_understand || !is_speaking_taj || M.universal_speak) )
|
||||
heard_a += M
|
||||
else
|
||||
heard_b += M
|
||||
|
||||
var/rendered = null
|
||||
|
||||
for (var/mob/M in watching)
|
||||
if ( (M.say_understands(src) && !is_speaking_taj) || istype(M,/mob/living/carbon/human/tajaran) )
|
||||
rendered = "<span class='game say'><span class='name'>[src.name]</span> [is_speaking_taj ? "quietly mrowls" : "whispers"] something.</span>"
|
||||
else
|
||||
rendered = "<span class='game say'><span class='name'>[src.voice_name]</span> [is_speaking_taj ? "quietly mrowls" : "whispers"] something.</span>"
|
||||
M.show_message(rendered, 2)
|
||||
|
||||
if (length(heard_a))
|
||||
var/message_a = message
|
||||
|
||||
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> [is_speaking_taj ? "mrowls quietly" : "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> [is_speaking_taj ? "mrowls quietly" : "whispers"], <span class='message'>\"[message_a]\"</span></span>"
|
||||
else
|
||||
rendered = "<span class='game say'><span class='name'>[name]</span> [is_speaking_taj ? "mrowls quietly" : "whispers"], <span class='message'>\"[message_a]\"</span></span>"
|
||||
else
|
||||
rendered = "<span class='game say'><span class='name'>[real_name]</span>[alt_name] [is_speaking_taj ? "mrowls quietly" : "whispers"], <span class='message'>\"[message_a]\"</span></span>"
|
||||
|
||||
for (var/mob/M in heard_a)
|
||||
M.show_message(rendered, 2)
|
||||
|
||||
if (length(heard_b))
|
||||
var/message_b
|
||||
|
||||
message_b = tajspeak(message)
|
||||
|
||||
if (italics)
|
||||
message_b = "<i>[message_b]</i>"
|
||||
|
||||
rendered = "<span class='game say'><span class='name'>[src.voice_name]</span> mrows quietly, <span class='message'>\"[message_b]\"</span></span>"
|
||||
|
||||
for (var/mob/M in heard_b)
|
||||
M.show_message(rendered, 2)
|
||||
|
||||
for (var/mob/M in eavesdropping)
|
||||
if (M.say_understands(src))
|
||||
var/message_c = tajspeak(message)
|
||||
if (!istype(src, /mob/living/carbon/human))
|
||||
rendered = "<span class='game say'><span class='name'>[name]</span> mrowls quietly, <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> mrowls quietly, <span class='message'>\"[message_c]\"</span></span>"
|
||||
else
|
||||
rendered = "<span class='game say'><span class='name'>[name]</span> mrowls quietly, <span class='message'>\"[message_c]\"</span></span>"
|
||||
else
|
||||
rendered = "<span class='game say'><span class='name'>[real_name]</span>[alt_name] mrowls quietly, <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> quietly mrowls something.</span>"
|
||||
M.show_message(rendered, 2)
|
||||
|
||||
if (italics)
|
||||
message = "<i>[message]</i>"
|
||||
|
||||
if (!istype(src, /mob/living/carbon/human))
|
||||
rendered = "<span class='game say'><span class='name'>[name]</span> [is_speaking_taj ? "mrowls quietly" : "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> [is_speaking_taj ? "mrowls quietly" : "whispers"], <span class='message'>\"[message]\"</span></span>"
|
||||
else
|
||||
rendered = "<span class='game say'><span class='name'>[name]</span> [is_speaking_taj ? "mrowls quietly" : "whispers"], <span class='message'>\"[message]\"</span></span>"
|
||||
else
|
||||
rendered = "<span class='game say'><span class='name'>[real_name]</span>[alt_name] [is_speaking_taj ? "mrowls quietly" : "whispers"], <span class='message'>\"[message]\"</span></span>"
|
||||
|
||||
for (var/mob/M in world)
|
||||
if (istype(M, /mob/new_player))
|
||||
continue
|
||||
if (M.stat > 1 && !(M in heard_a))
|
||||
M.show_message(rendered, 2)
|
||||
+8
-3
@@ -219,7 +219,7 @@ datum/gas_mixture/proc/zburn(obj/effect/decal/cleanable/liquid_fuel/liquid)
|
||||
temperature = max( 1700*log(0.4*firelevel + 1.23) , temperature )
|
||||
|
||||
//Consume some gas.
|
||||
var/consumed_gas = min(oxygen,0.05*firelevel,total_fuel) / fuel_sources
|
||||
var/consumed_gas = min(oxygen,firelevel,total_fuel) / fuel_sources
|
||||
|
||||
oxygen = max(0,oxygen-consumed_gas)
|
||||
|
||||
@@ -245,14 +245,19 @@ datum/gas_mixture/proc/calculate_firelevel(obj/effect/decal/cleanable/liquid_fue
|
||||
var
|
||||
datum/gas/volatile_fuel/fuel = locate() in trace_gases
|
||||
liquid_concentration = 0
|
||||
fuel_concentration = 0
|
||||
|
||||
oxy_concentration = oxygen / volume
|
||||
tox_concentration = toxins / volume
|
||||
fuel_concentration = 0
|
||||
|
||||
if(fuel) fuel_concentration = (fuel.moles) / volume
|
||||
if(liquid) liquid_concentration = (liquid.amount*15) / volume
|
||||
return (oxy_concentration + tox_concentration + liquid_concentration + fuel_concentration)*100
|
||||
|
||||
var/final = tox_concentration + liquid_concentration + fuel_concentration
|
||||
if(final > oxy_concentration)
|
||||
final = oxy_concentration
|
||||
|
||||
return final * 100
|
||||
|
||||
/mob/living/carbon/human/proc/FireBurn(mx as num)
|
||||
//Burns mobs due to fire. Respects heat transfer coefficients on various body parts.
|
||||
|
||||
@@ -102,6 +102,7 @@
|
||||
var/metroid_delay = 0
|
||||
var/animal_delay = 0
|
||||
|
||||
var/admin_legacy_system = 0 //Defines whether the server uses the legacy admin system with admins.txt or the SQL system.
|
||||
|
||||
/datum/configuration/New()
|
||||
var/list/L = typesof(/datum/game_mode) - /datum/game_mode
|
||||
@@ -158,6 +159,9 @@
|
||||
|
||||
if(type == "config")
|
||||
switch (name)
|
||||
if ("admin_legacy_system")
|
||||
config.admin_legacy_system = 1
|
||||
|
||||
if ("log_ooc")
|
||||
config.log_ooc = 1
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
return
|
||||
|
||||
|
||||
/client/proc/debug_controller(controller in list("Master","Failsafe","Ticker","Lighting","Air","Jobs","Sun","Radio","Supply Shuttle","Emergency Shuttle","Configuration","pAI"))
|
||||
/client/proc/debug_controller(controller in list("Master","Failsafe","Ticker","Lighting","Air","Jobs","Sun","Radio","Supply Shuttle","Emergency Shuttle","Configuration","pAI", "Cameras"))
|
||||
set category = "Debug"
|
||||
set name = "Debug Controller"
|
||||
set desc = "Debug the various periodic loop controllers for the game (be careful!)"
|
||||
@@ -71,5 +71,8 @@
|
||||
if("pAI")
|
||||
debug_variables(paiController)
|
||||
feedback_add_details("admin_verb","DpAI")
|
||||
if("Cameras")
|
||||
debug_variables(cameranet)
|
||||
feedback_add_details("admin_verb","DCameras")
|
||||
message_admins("Admin [key_name_admin(usr)] is debugging the [controller] controller.", 1)
|
||||
return
|
||||
|
||||
@@ -167,8 +167,11 @@ datum/controller/vote
|
||||
proc/interface(var/client/C)
|
||||
if(!C) return
|
||||
var/admin = 0
|
||||
var/trialmin = 0
|
||||
if(C.holder)
|
||||
admin = 1
|
||||
if (C.holder.level >= 3)
|
||||
trialmin = 1
|
||||
voting |= C
|
||||
|
||||
. = "<html><head><title>Voting Panel</title></head><body>"
|
||||
@@ -186,24 +189,24 @@ datum/controller/vote
|
||||
else
|
||||
. += "<h2>Start a vote:</h2><hr><ul><li>"
|
||||
//restart
|
||||
if(admin || config.allow_vote_restart)
|
||||
if(trialmin || config.allow_vote_restart)
|
||||
. += "<a href='?src=\ref[src];vote=restart'>Restart</a>"
|
||||
else
|
||||
. += "<font color='grey'>Restart (Disallowed)</font>"
|
||||
if(admin)
|
||||
if(trialmin)
|
||||
. += "\t(<a href='?src=\ref[src];vote=toggle_restart'>[config.allow_vote_restart?"Allowed":"Disallowed"]</a>)"
|
||||
. += "</li><li>"
|
||||
//gamemode
|
||||
if(admin || config.allow_vote_mode)
|
||||
if(trialmin || config.allow_vote_mode)
|
||||
. += "<a href='?src=\ref[src];vote=gamemode'>GameMode</a>"
|
||||
else
|
||||
. += "<font color='grey'>GameMode (Disallowed)</font>"
|
||||
if(admin)
|
||||
if(trialmin)
|
||||
. += "\t(<a href='?src=\ref[src];vote=toggle_gamemode'>[config.allow_vote_mode?"Allowed":"Disallowed"]</a>)"
|
||||
|
||||
. += "</li>"
|
||||
//custom
|
||||
if(admin)
|
||||
if(trialmin)
|
||||
. += "<li><a href='?src=\ref[src];vote=custom'>Custom</a></li>"
|
||||
. += "</ul><hr>"
|
||||
. += "<a href='?src=\ref[src];vote=close' style='position:absolute;right:50px'>Close</a></body></html>"
|
||||
|
||||
@@ -8,6 +8,11 @@ client
|
||||
//set src in world
|
||||
|
||||
|
||||
if(!usr.client || !usr.client.holder)
|
||||
usr << "\red You need to be an administrator to access this."
|
||||
return
|
||||
|
||||
|
||||
var/title = ""
|
||||
var/body = ""
|
||||
|
||||
@@ -403,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
|
||||
|
||||
@@ -468,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"])
|
||||
@@ -480,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"])
|
||||
@@ -492,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"])
|
||||
@@ -504,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"])
|
||||
@@ -516,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"]
|
||||
|
||||
@@ -531,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"])
|
||||
@@ -545,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"])
|
||||
@@ -559,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()
|
||||
|
||||
@@ -566,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))
|
||||
@@ -612,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"])
|
||||
@@ -622,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"])
|
||||
@@ -632,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"])
|
||||
@@ -655,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
|
||||
@@ -672,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
|
||||
@@ -689,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
|
||||
@@ -706,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
|
||||
@@ -723,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
|
||||
@@ -738,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
|
||||
@@ -756,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
|
||||
@@ -770,6 +796,8 @@ client
|
||||
if(!isliving(M)) return
|
||||
var/mob/living/L = M
|
||||
|
||||
if(!admin_rank_check(src.holder.level, 3)) return
|
||||
|
||||
var/amount = input("Deal how much damage to mob? (Negative values here heal)","Adjust [Text]loss",0) as num
|
||||
if(Text == "brute")
|
||||
L.adjustBruteLoss(amount)
|
||||
|
||||
@@ -43,12 +43,12 @@ 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".
|
||||
var/age = 0 // age of the disease in the current mob
|
||||
var/stage_minimum_age = 0 // how old the disease must be to advance per stage
|
||||
// if hidden[1] is true, then virus is hidden from medical scanners
|
||||
// if hidden[2] is true, then virus is hidden from PANDEMIC machine
|
||||
|
||||
|
||||
/datum/disease/proc/stage_act()
|
||||
age++
|
||||
var/cure_present = has_cure()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -347,6 +347,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
|
||||
|
||||
+8
-47
@@ -192,38 +192,37 @@
|
||||
var/d1 = 0
|
||||
var/d2 = 1
|
||||
layer = 2.44 //Just below unary stuff, which is at 2.45 and above pipes, which are at 2.4
|
||||
var/color="red"
|
||||
var/color = "red"
|
||||
var/obj/structure/powerswitch/power_switch
|
||||
|
||||
/obj/structure/cable/yellow
|
||||
color="yellow"
|
||||
color = "yellow"
|
||||
icon = 'icons/obj/power_cond_yellow.dmi'
|
||||
|
||||
/obj/structure/cable/green
|
||||
color="green"
|
||||
color = "green"
|
||||
icon = 'icons/obj/power_cond_green.dmi'
|
||||
|
||||
/obj/structure/cable/blue
|
||||
color="blue"
|
||||
color = "blue"
|
||||
icon = 'icons/obj/power_cond_blue.dmi'
|
||||
|
||||
/obj/structure/cable/pink
|
||||
color="pink"
|
||||
color = "pink"
|
||||
icon = 'icons/obj/power_cond_pink.dmi'
|
||||
|
||||
/obj/structure/cable/orange
|
||||
color="orange"
|
||||
color = "orange"
|
||||
icon = 'icons/obj/power_cond_orange.dmi'
|
||||
|
||||
/obj/structure/cable/cyan
|
||||
color="cyan"
|
||||
color = "cyan"
|
||||
icon = 'icons/obj/power_cond_cyan.dmi'
|
||||
|
||||
/obj/structure/cable/white
|
||||
color="white"
|
||||
color = "white"
|
||||
icon = 'icons/obj/power_cond_white.dmi'
|
||||
|
||||
|
||||
/obj/effect/projection
|
||||
name = "Projection"
|
||||
desc = "This looks like a projection of something."
|
||||
@@ -244,44 +243,6 @@
|
||||
anchored = 1
|
||||
unacidable = 1//temporary until I decide whether the borg can be removed. -veyveyr
|
||||
|
||||
|
||||
// Basically this Metroid Core catalyzes reactions that normally wouldn't happen anywhere
|
||||
/obj/item/metroid_core
|
||||
name = "roro core"
|
||||
desc = "A very slimy and tender part of a Rorobeast. Legends claim these to have \"magical powers\"."
|
||||
icon = 'icons/obj/surgery.dmi'
|
||||
icon_state = "roro core"
|
||||
flags = TABLEPASS
|
||||
force = 1.0
|
||||
w_class = 1.0
|
||||
throwforce = 1.0
|
||||
throw_speed = 3
|
||||
throw_range = 6
|
||||
origin_tech = "biotech=4"
|
||||
var/POWERFLAG = 0 // sshhhhhhh
|
||||
var/Flush = 30
|
||||
var/Uses = 5 // uses before it goes inert
|
||||
|
||||
New()
|
||||
..()
|
||||
var/datum/reagents/R = new/datum/reagents(100)
|
||||
reagents = R
|
||||
R.my_atom = src
|
||||
POWERFLAG = rand(1,10)
|
||||
Uses = rand(7, 25)
|
||||
//flags |= NOREACT
|
||||
|
||||
spawn()
|
||||
Life()
|
||||
|
||||
proc/Life()
|
||||
while(src)
|
||||
sleep(25)
|
||||
Flush--
|
||||
if(Flush <= 0)
|
||||
reagents.clear_reagents()
|
||||
Flush = 30
|
||||
|
||||
/obj/effect/deskclutter
|
||||
name = "desk clutter"
|
||||
icon = 'icons/obj/items.dmi'
|
||||
|
||||
@@ -41,19 +41,6 @@
|
||||
idle_power_usage = 10
|
||||
active_power_usage = 100
|
||||
|
||||
/obj/machinery/dispenser
|
||||
name = "tank storage unit"
|
||||
desc = "A simple yet bulky one-way storage device for gas tanks. Holds 10 plasma and 10 oxygen tanks."
|
||||
icon = 'icons/obj/objects.dmi'
|
||||
icon_state = "dispenser"
|
||||
density = 1
|
||||
var/o2tanks = 10.0
|
||||
var/pltanks = 10.0
|
||||
anchored = 1.0
|
||||
use_power = 1
|
||||
idle_power_usage = 5
|
||||
active_power_usage = 10
|
||||
|
||||
/obj/machinery/dna_scanner
|
||||
name = "\improper DNA scanner/implanter"
|
||||
desc = "It scans DNA structures."
|
||||
|
||||
@@ -180,11 +180,6 @@
|
||||
icon_state = "satchel-cap"
|
||||
item_state = "captainpack"
|
||||
|
||||
/obj/item/weapon/storage/backpack/bandolier
|
||||
name = "bandolier"
|
||||
desc = "It's a very old bandolier to wear on your back."
|
||||
icon_state = "bandolier"
|
||||
|
||||
/obj/item/weapon/storage/backpack/industrial
|
||||
name = "industrial backpack"
|
||||
desc = "It's a tough backpack for the daily grind of station life."
|
||||
|
||||
@@ -504,83 +504,6 @@
|
||||
desc = "An untrustworthy bar of soap. Smells of fear."
|
||||
icon_state = "soapsyndie"
|
||||
|
||||
/obj/item/weapon/bedsheet
|
||||
name = "bedsheet"
|
||||
desc = "Nice, linen, bedsheet. Perfect to put on."
|
||||
icon = 'icons/obj/items.dmi'
|
||||
icon_state = "sheet"
|
||||
layer = 4.0
|
||||
item_state = "bedsheet"
|
||||
throwforce = 1
|
||||
w_class = 1.0
|
||||
throw_speed = 2
|
||||
throw_range = 10
|
||||
color = "white"
|
||||
|
||||
/obj/item/weapon/bedsheet/blue
|
||||
icon_state = "sheetblue"
|
||||
color = "blue"
|
||||
|
||||
/obj/item/weapon/bedsheet/green
|
||||
icon_state = "sheetgreen"
|
||||
color = "green"
|
||||
|
||||
/obj/item/weapon/bedsheet/orange
|
||||
icon_state = "sheetorange"
|
||||
color = "orange"
|
||||
|
||||
/obj/item/weapon/bedsheet/purple
|
||||
icon_state = "sheetpurple"
|
||||
color = "purple"
|
||||
|
||||
/obj/item/weapon/bedsheet/rainbow
|
||||
icon_state = "sheetrainbow"
|
||||
color = "rainbow"
|
||||
|
||||
/obj/item/weapon/bedsheet/red
|
||||
icon_state = "sheetred"
|
||||
color = "red"
|
||||
|
||||
/obj/item/weapon/bedsheet/yellow
|
||||
icon_state = "sheetyellow"
|
||||
color = "yellow"
|
||||
|
||||
/obj/item/weapon/bedsheet/mime
|
||||
icon_state = "sheetmime"
|
||||
color = "mime"
|
||||
|
||||
/obj/item/weapon/bedsheet/clown
|
||||
icon_state = "sheetclown"
|
||||
color = "clown"
|
||||
|
||||
/obj/item/weapon/bedsheet/captain
|
||||
icon_state = "sheetcaptain"
|
||||
color = "captain"
|
||||
|
||||
/obj/item/weapon/bedsheet/rd
|
||||
icon_state = "sheetrd"
|
||||
color = "director"
|
||||
|
||||
/obj/item/weapon/bedsheet/medical
|
||||
icon_state = "sheetmedical"
|
||||
color = "medical"
|
||||
|
||||
/obj/item/weapon/bedsheet/hos
|
||||
icon_state = "sheethos"
|
||||
color = "hosred"
|
||||
|
||||
/obj/item/weapon/bedsheet/hop
|
||||
icon_state = "sheethop"
|
||||
color = "hop"
|
||||
|
||||
/obj/item/weapon/bedsheet/ce
|
||||
icon_state = "sheetce"
|
||||
color = "chief"
|
||||
|
||||
/obj/item/weapon/bedsheet/brown
|
||||
icon_state = "sheetbrown"
|
||||
color = "brown"
|
||||
|
||||
/obj/item/weapon/bikehorn
|
||||
name = "bike horn"
|
||||
desc = "A horn off of a bicycle."
|
||||
@@ -1153,18 +1076,6 @@
|
||||
throw_range = 15
|
||||
attack_verb = list("banned")
|
||||
|
||||
/obj/item/weapon/pen/sleepypen
|
||||
desc = "It's a normal black ink pen with a sharp point and a carefully engraved \"Waffle Co.\""
|
||||
flags = FPRINT | TABLEPASS | OPENCONTAINER
|
||||
slot_flags = SLOT_BELT
|
||||
origin_tech = "materials=2;biotech=1;syndicate=7"
|
||||
|
||||
/obj/item/weapon/pen/paralysis
|
||||
desc = "It's a normal black ink pen with a sharp point."
|
||||
flags = FPRINT | TABLEPASS | OPENCONTAINER
|
||||
slot_flags = SLOT_BELT
|
||||
origin_tech = "materials=2;biotech=1;syndicate=5"
|
||||
|
||||
/obj/item/weapon/rack_parts
|
||||
name = "rack parts"
|
||||
desc = "Parts of a rack."
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -286,4 +286,22 @@ proc/listclearnulls(list/list)
|
||||
|
||||
if(Li <= L.len)
|
||||
return (result + L.Copy(Li, 0))
|
||||
return (result + R.Copy(Ri, 0))
|
||||
return (result + R.Copy(Ri, 0))
|
||||
|
||||
|
||||
//Converts a bitfield to a list of numbers (or words if a wordlist is provided)
|
||||
/proc/bitfield2list(bitfield = 0, list/wordlist)
|
||||
var/list/r = list()
|
||||
if(istype(wordlist,/list))
|
||||
var/max = min(wordlist.len,16)
|
||||
var/bit = 1
|
||||
for(var/i=1, i<=max, i++)
|
||||
if(bitfield & bit)
|
||||
r += wordlist[i]
|
||||
bit = bit << 1
|
||||
else
|
||||
for(var/bit=1, bit<=65535, bit = bit << 1)
|
||||
if(bitfield & bit)
|
||||
r += bit
|
||||
|
||||
return r
|
||||
@@ -327,8 +327,8 @@ Turf and target are seperate in case you want to teleport some distance from a t
|
||||
if(isAI(src))
|
||||
var/mob/living/silicon/ai/A = src
|
||||
oldname = null//don't bother with the records update crap
|
||||
world << "<b>[newname] is the AI!</b>"
|
||||
world << sound('sound/AI/newAI.ogg')
|
||||
//world << "<b>[newname] is the AI!</b>"
|
||||
//world << sound('sound/AI/newAI.ogg')
|
||||
// Set eyeobj name
|
||||
if(A.eyeobj)
|
||||
A.eyeobj.name = "[newname] (AI Eye)"
|
||||
|
||||
@@ -1,74 +0,0 @@
|
||||
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
|
||||
#define RECOMMENDED_VERSION 494
|
||||
|
||||
/world/New()
|
||||
..()
|
||||
if(byond_version < RECOMMENDED_VERSION)
|
||||
world.log << "Your server's byond version does not meet the recommended requirements for Baystation12. Please update BYOND"
|
||||
|
||||
diary = file("data/logs/[time2text(world.realtime, "YYYY/MM-Month/DD-Day")].log")
|
||||
diary << {"
|
||||
|
||||
Starting up. [time2text(world.timeofday, "hh:mm.ss")]
|
||||
---------------------
|
||||
"}
|
||||
|
||||
diaryofmeanpeople = file("data/logs/[time2text(world.realtime, "YYYY/MM-Month/DD-Day")] Attack.log")
|
||||
diaryofmeanpeople << {"
|
||||
|
||||
Starting up. [time2text(world.timeofday, "hh:mm.ss")]
|
||||
---------------------
|
||||
"}
|
||||
|
||||
href_logfile = file("data/logs/[time2text(world.realtime, "YYYY/MM-Month/DD-Day")] hrefs.html")
|
||||
|
||||
jobban_loadbanfile()
|
||||
jobban_updatelegacybans()
|
||||
LoadBans()
|
||||
make_datum_references_lists() //initialises global lists for referencing frequently used datums (so that we only ever do it once)
|
||||
process_teleport_locs() //Sets up the wizard teleport locations
|
||||
process_ghost_teleport_locs() //Sets up ghost teleport locations.
|
||||
sleep_offline = 1
|
||||
|
||||
spawn(180) //so we aren't adding to the round-start lag
|
||||
/*if(config.ToRban)
|
||||
ToRban_autoupdate()*/
|
||||
if(config.kick_inactive)
|
||||
KickInactiveClients()
|
||||
|
||||
#undef RECOMMENDED_VERSION
|
||||
#define INACTIVITY_KICK 6000 //10 minutes in ticks (approx.)
|
||||
/world/proc/KickInactiveClients()
|
||||
for(var/client/C)
|
||||
if( !C.holder && (C.inactivity >= INACTIVITY_KICK) )
|
||||
if(C.mob)
|
||||
if(!istype(C.mob, /mob/dead/))
|
||||
log_access("AFK: [key_name(C)]")
|
||||
C << "\red You have been inactive for more than 10 minutes and have been disconnected."
|
||||
del(C)
|
||||
spawn(3000) KickInactiveClients()//more or less five minutes
|
||||
#undef INACTIVITY_KICK
|
||||
|
||||
/// EXPERIMENTAL STUFF
|
||||
|
||||
// This function counts a passed job.
|
||||
proc/countJob(rank)
|
||||
var/jobCount = 0
|
||||
for(var/mob/H in player_list)
|
||||
if(H.mind && H.mind.assigned_role == rank)
|
||||
jobCount++
|
||||
return jobCount
|
||||
|
||||
/proc/AutoUpdateAI(obj/subject)
|
||||
if (subject!=null)
|
||||
for(var/mob/living/silicon/ai/M in player_list)
|
||||
if ((M.client && M.machine == subject))
|
||||
subject.attack_ai(M)
|
||||
|
||||
/proc/AutoUpdateTK(obj/subject)
|
||||
if (subject!=null)
|
||||
for(var/obj/item/tk_grab/T in world)
|
||||
if (T.host)
|
||||
var/mob/M = T.host
|
||||
if(M.client && M.machine == subject)
|
||||
subject.attack_hand(M)
|
||||
@@ -1466,6 +1466,88 @@ proc/process_ghost_teleport_locs()
|
||||
name = "\improper Nanotrasen Cruiser"
|
||||
icon_state = "away"
|
||||
requires_power = 0
|
||||
|
||||
/area/awaymission/spacebattle/syndicate1
|
||||
name = "\improper Syndicate Assault Ship 1"
|
||||
|
||||
/area/awaymission/spacebattle/syndicate2
|
||||
name = "\improper Syndicate Assault Ship 2"
|
||||
|
||||
/area/awaymission/spacebattle/syndicate3
|
||||
name = "\improper Syndicate Assault Ship 3"
|
||||
|
||||
/area/awaymission/spacebattle/syndicate4
|
||||
name = "\improper Syndicate War Sphere 1"
|
||||
|
||||
/area/awaymission/spacebattle/syndicate5
|
||||
name = "\improper Syndicate War Sphere 2"
|
||||
|
||||
/area/awaymission/spacebattle/syndicate6
|
||||
name = "\improper Syndicate War Sphere 3"
|
||||
|
||||
/area/awaymission/spacebattle/syndicate7
|
||||
name = "\improper Syndicate Fighter"
|
||||
|
||||
/area/awaymission/spacebattle/secret
|
||||
name = "\improper Hidden Chamber"
|
||||
|
||||
|
||||
/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.
|
||||
@@ -1586,4 +1668,5 @@ var/list/the_station_areas = list (
|
||||
spawn(sound_delay)
|
||||
H << S
|
||||
|
||||
spawn(60) .()
|
||||
spawn(60) .()
|
||||
|
||||
|
||||
+11
-3
@@ -284,14 +284,22 @@
|
||||
if ("Mine")
|
||||
sound = pick('sound/ambience/ambimine.ogg')
|
||||
musVolume = 25
|
||||
|
||||
if("Telecoms Teleporter") sound = pick('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg')
|
||||
if("Telecoms Central Compartment") sound = pick('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg')
|
||||
if("Telecoms Satellite") sound = pick('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg')
|
||||
if("Telecoms Foyer") sound = pick('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg')
|
||||
if("Telecommunications Satellite West Wing") sound = pick('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg')
|
||||
if("Telecommunications Satellite East Wing") sound = pick('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg')
|
||||
if("Telecoms Control Room") sound = pick('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg')
|
||||
if("Telecommunications Satellite Lounge") sound = pick('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg')
|
||||
|
||||
else
|
||||
sound = pick('sound/ambience/ambigen1.ogg','sound/ambience/ambigen3.ogg','sound/ambience/ambigen4.ogg','sound/ambience/ambigen5.ogg','sound/ambience/ambigen6.ogg','sound/ambience/ambigen7.ogg','sound/ambience/ambigen8.ogg','sound/ambience/ambigen9.ogg','sound/ambience/ambigen10.ogg','sound/ambience/ambigen11.ogg','sound/ambience/ambigen12.ogg','sound/ambience/ambigen14.ogg')
|
||||
|
||||
if(findtext(src.name, "Telecommunications"))
|
||||
sound = pick('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg')
|
||||
|
||||
if (prob(35))
|
||||
if(A && A:client && !A:client:played)
|
||||
if(A && A:client && !A:client:played && !A:client:no_ambi)
|
||||
A << sound(sound, repeat = 0, wait = 0, volume = musVolume, channel = 1)
|
||||
A:client:played = 1
|
||||
spawn(600)
|
||||
|
||||
@@ -3,7 +3,7 @@ var/global/list/space_surprises = list( /obj/item/clothing/mask/facehugger =
|
||||
/obj/item/weapon/pickaxe/silver =4,
|
||||
/obj/item/weapon/pickaxe/drill =4,
|
||||
/obj/item/weapon/pickaxe/jackhammer =4,
|
||||
/mob/living/simple_animal/carp =3,
|
||||
//mob/living/simple_animal/hostile/carp =3,
|
||||
/obj/item/weapon/pickaxe/diamond =3,
|
||||
/obj/item/weapon/pickaxe/diamonddrill =3,
|
||||
/obj/item/weapon/pickaxe/gold =3,
|
||||
|
||||
@@ -1,202 +0,0 @@
|
||||
/world/proc/load_mode()
|
||||
var/text = file2text("data/mode.txt")
|
||||
if (text)
|
||||
var/list/lines = dd_text2list(text, "\n")
|
||||
if (lines[1])
|
||||
master_mode = lines[1]
|
||||
diary << "Saved mode is '[master_mode]'"
|
||||
|
||||
/world/proc/save_mode(var/the_mode)
|
||||
var/F = file("data/mode.txt")
|
||||
fdel(F)
|
||||
F << the_mode
|
||||
|
||||
/world/proc/load_motd()
|
||||
join_motd = file2text("config/motd.txt")
|
||||
|
||||
|
||||
/world/proc/load_admins()
|
||||
var/text = file2text("config/admins.txt")
|
||||
if (!text)
|
||||
diary << "Failed to load config/admins.txt\n"
|
||||
else
|
||||
var/list/lines = dd_text2list(text, "\n")
|
||||
for(var/line in lines)
|
||||
if (!line)
|
||||
continue
|
||||
|
||||
if (copytext(line, 1, 2) == ";")
|
||||
continue
|
||||
|
||||
var/pos = findtext(line, " - ", 1, null)
|
||||
if (pos)
|
||||
var/m_key = copytext(line, 1, pos)
|
||||
var/a_lev = copytext(line, pos + 3, length(line) + 1)
|
||||
admins[m_key] = a_lev
|
||||
diary << ("ADMIN: [m_key] = [a_lev]")
|
||||
|
||||
// look for moderators in a separate file
|
||||
text = file2text("config/moderators.txt")
|
||||
if (!text)
|
||||
diary << "Failed to load config/moderators.txt\n"
|
||||
else
|
||||
var/list/lines = dd_text2list(text, "\n")
|
||||
for(var/line in lines)
|
||||
if (!line)
|
||||
continue
|
||||
|
||||
if (copytext(line, 1, 2) == ";")
|
||||
continue
|
||||
|
||||
var/m_key = copytext(line, 1, length(line)+1)
|
||||
var/a_lev = "Moderator"
|
||||
admins[m_key] = a_lev
|
||||
|
||||
/world/proc/load_testers()
|
||||
var/text = file2text("config/testers.txt")
|
||||
if (!text)
|
||||
diary << "Failed to load config/testers.txt\n"
|
||||
else
|
||||
var/list/lines = dd_text2list(text, "\n")
|
||||
for(var/line in lines)
|
||||
if (!line)
|
||||
continue
|
||||
|
||||
if (copytext(line, 1, 2) == ";")
|
||||
continue
|
||||
|
||||
var/pos = findtext(line, " - ", 1, null)
|
||||
if (pos)
|
||||
var/m_key = copytext(line, 1, pos)
|
||||
var/a_lev = copytext(line, pos + 3, length(line) + 1)
|
||||
admins[m_key] = a_lev
|
||||
|
||||
|
||||
/world/proc/load_configuration()
|
||||
config = new /datum/configuration()
|
||||
config.load("config/config.txt")
|
||||
config.load("config/game_options.txt","game_options")
|
||||
//config.loadsql("config/dbconfig.txt")
|
||||
//config.loadforumsql("config/forumdbconfig.txt")
|
||||
// apply some settings from config..
|
||||
abandon_allowed = config.respawn
|
||||
|
||||
/world/New()
|
||||
src.load_configuration()
|
||||
|
||||
if (config && config.server_name != null && config.server_suffix && world.port > 0)
|
||||
// dumb and hardcoded but I don't care~
|
||||
config.server_name += " #[(world.port % 1000) / 100]"
|
||||
|
||||
src.load_mode()
|
||||
src.load_motd()
|
||||
src.load_admins()
|
||||
investigate_reset()
|
||||
|
||||
if (config.usealienwhitelist)
|
||||
load_alienwhitelist()
|
||||
if (config.usewhitelist)
|
||||
load_whitelist()
|
||||
|
||||
LoadBansjob()
|
||||
//Get_Holiday() //~Carn, needs to be here when the station is named so :P
|
||||
src.update_status()
|
||||
makepowernets()
|
||||
|
||||
sun = new /datum/sun()
|
||||
vote = new /datum/vote()
|
||||
radio_controller = new /datum/controller/radio()
|
||||
data_core = new /obj/effect/datacore()
|
||||
paiController = new /datum/paiController()
|
||||
|
||||
..()
|
||||
|
||||
sleep(50)
|
||||
|
||||
plmaster = new /obj/effect/overlay( )
|
||||
plmaster.icon = 'icons/effects/tile_effects.dmi'
|
||||
plmaster.icon_state = "plasma"
|
||||
plmaster.layer = FLY_LAYER
|
||||
plmaster.mouse_opacity = 0
|
||||
|
||||
slmaster = new /obj/effect/overlay( )
|
||||
slmaster.icon = 'icons/effects/tile_effects.dmi'
|
||||
slmaster.icon_state = "sleeping_agent"
|
||||
slmaster.layer = FLY_LAYER
|
||||
slmaster.mouse_opacity = 0
|
||||
|
||||
src.update_status()
|
||||
|
||||
socket_talk = new /datum/socket_talk()
|
||||
master_controller = new /datum/controller/game_controller()
|
||||
spawn(-1)
|
||||
master_controller.setup()
|
||||
lighting_controller.Initialize()
|
||||
return
|
||||
|
||||
//Crispy fullban
|
||||
/world/Reboot(var/reason)
|
||||
spawn(0)
|
||||
send2irc(world.url,"Server Rebooting!")
|
||||
socket_talk.send_raw("type=reboot")
|
||||
//world << sound(pick('sound/AI/newroundsexy.ogg','sound/misc/apcdestroyed.ogg','sound/misc/bangindonk.ogg')) // random end sounds!! - LastyBatsy
|
||||
|
||||
for(var/client/C)
|
||||
if (config.server) //if you set a server location in config.txt, it sends you there instead of trying to reconnect to the same world address. -- NeoFite
|
||||
C << link("byond://[config.server]")
|
||||
else
|
||||
C << link("byond://[world.address]:[world.port]")
|
||||
|
||||
// sleep(10) // wait for sound to play
|
||||
..(reason)
|
||||
|
||||
/atom/proc/check_eye(user as mob)
|
||||
if (istype(user, /mob/living/silicon/ai))
|
||||
return 1
|
||||
return
|
||||
|
||||
/atom/proc/on_reagent_change()
|
||||
return
|
||||
|
||||
/atom/proc/Bumped(AM as mob|obj)
|
||||
return
|
||||
|
||||
/atom/movable/Bump(var/atom/A as mob|obj|turf|area, yes)
|
||||
spawn( 0 )
|
||||
if ((A && yes))
|
||||
A.last_bumped = world.time
|
||||
A.Bumped(src)
|
||||
return
|
||||
..()
|
||||
return
|
||||
|
||||
// **** Note in 40.93.4, split into obj/mob/turf point verbs, no area
|
||||
|
||||
/atom/verb/point()
|
||||
set name = "Point To"
|
||||
set category = "Object"
|
||||
set src in oview()
|
||||
var/atom/this = src//detach proc from src
|
||||
src = null
|
||||
|
||||
if(!usr || !isturf(usr.loc))
|
||||
return
|
||||
if(usr.stat || usr.restrained())
|
||||
return
|
||||
if(usr.status_flags & FAKEDEATH)
|
||||
return
|
||||
|
||||
var/tile = get_turf(this)
|
||||
if (!tile)
|
||||
return
|
||||
|
||||
var/P = new /obj/effect/decal/point(tile)
|
||||
spawn (20)
|
||||
if(P) del(P)
|
||||
|
||||
usr.visible_message("<b>[usr]</b> points to [this]")
|
||||
|
||||
/obj/effect/decal/point/point()
|
||||
set src in oview()
|
||||
set hidden = 1
|
||||
return
|
||||
@@ -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)
|
||||
..()
|
||||
@@ -230,4 +231,13 @@ 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)
|
||||
geneticdamage = max(0, geneticdamage-1)
|
||||
|
||||
|
||||
/datum/changeling/proc/GetDNA(var/dna_owner)
|
||||
var/datum/dna/chosen_dna
|
||||
for(var/datum/dna/DNA in absorbed_dna)
|
||||
if(dna_owner == DNA.real_name)
|
||||
chosen_dna = DNA
|
||||
break
|
||||
return chosen_dna
|
||||
@@ -174,12 +174,7 @@
|
||||
var/S = input("Select the target DNA: ", "Target DNA", null) as null|anything in names
|
||||
if(!S) return
|
||||
|
||||
var/datum/dna/chosen_dna
|
||||
for(var/datum/dna/DNA in changeling.absorbed_dna)
|
||||
if(S == "[DNA.real_name]")
|
||||
chosen_dna = DNA
|
||||
break
|
||||
|
||||
var/datum/dna/chosen_dna = changeling.GetDNA(S)
|
||||
if(!chosen_dna)
|
||||
return
|
||||
|
||||
@@ -277,12 +272,7 @@
|
||||
var/S = input("Select the target DNA: ", "Target DNA", null) as null|anything in names
|
||||
if(!S) return
|
||||
|
||||
var/datum/dna/chosen_dna
|
||||
for(var/datum/dna/DNA in changeling.absorbed_dna)
|
||||
if(S == "[DNA.real_name]")
|
||||
chosen_dna = DNA
|
||||
break
|
||||
|
||||
var/datum/dna/chosen_dna = changeling.GetDNA(S)
|
||||
if(!chosen_dna)
|
||||
return
|
||||
|
||||
@@ -500,6 +490,102 @@
|
||||
feedback_add_details("changeling_powers","RR")
|
||||
return 1
|
||||
|
||||
// HIVE MIND UPLOAD/DOWNLOAD DNA
|
||||
|
||||
var/list/datum/dna/hivemind_bank = list()
|
||||
|
||||
/mob/proc/changeling_hiveupload()
|
||||
set category = "Changeling"
|
||||
set name = "Hive Channel (10)"
|
||||
set desc = "Allows you to channel DNA in the airwaves to allow other changelings to absorb it."
|
||||
|
||||
var/datum/changeling/changeling = changeling_power(10,1)
|
||||
if(!changeling) return
|
||||
|
||||
var/list/names = list()
|
||||
for(var/datum/dna/DNA in changeling.absorbed_dna)
|
||||
if(!(DNA in hivemind_bank))
|
||||
names += DNA.real_name
|
||||
|
||||
if(names.len <= 0)
|
||||
usr << "<span class='notice'>The airwaves already have all of our DNA.</span>"
|
||||
return
|
||||
|
||||
var/S = input("Select a DNA to channel: ", "Channel DNA", null) as null|anything in names
|
||||
if(!S) return
|
||||
|
||||
var/datum/dna/chosen_dna = changeling.GetDNA(S)
|
||||
if(!chosen_dna)
|
||||
return
|
||||
|
||||
changeling.chem_charges -= 10
|
||||
hivemind_bank += chosen_dna
|
||||
usr << "<span class='notice'>We channel the DNA of [S] to the air.</span>"
|
||||
feedback_add_details("changeling_powers","HU")
|
||||
return 1
|
||||
|
||||
/mob/proc/changeling_hivedownload()
|
||||
set category = "Changeling"
|
||||
set name = "Hive Absorb (40)"
|
||||
set desc = "Allows you to absorb DNA that is being channeled in the airwaves."
|
||||
|
||||
var/datum/changeling/changeling = changeling_power(40,1)
|
||||
if(!changeling) return
|
||||
|
||||
var/list/names = list()
|
||||
for(var/datum/dna/DNA in hivemind_bank)
|
||||
if(!(DNA in changeling.absorbed_dna))
|
||||
names[DNA.real_name] = DNA
|
||||
|
||||
if(names.len <= 0)
|
||||
usr << "<span class='notice'>There's no new DNA to absorb from the air.</span>"
|
||||
return
|
||||
|
||||
var/S = input("Select a DNA absorb from the air: ", "Absorb DNA", null) as null|anything in names
|
||||
if(!S) return
|
||||
var/datum/dna/chosen_dna = names[S]
|
||||
if(!chosen_dna)
|
||||
return
|
||||
|
||||
changeling.chem_charges -= 40
|
||||
changeling.absorbed_dna += chosen_dna
|
||||
usr << "<span class='notice'>We absorb the DNA of [S] from the air.</span>"
|
||||
feedback_add_details("changeling_powers","HD")
|
||||
return 1
|
||||
|
||||
// Fake Voice
|
||||
|
||||
/mob/proc/changeling_mimicvoice()
|
||||
set category = "Changeling"
|
||||
set name = "Mimic Voice (10)"
|
||||
set desc = "Shape our vocal glands to form a voice of someone we choose."
|
||||
|
||||
var/datum/changeling/changeling = changeling_power(10,1)
|
||||
if(!changeling) return
|
||||
|
||||
if(changeling.mimicing)
|
||||
changeling.mimicing = ""
|
||||
usr << "<span class='notice'>We return our vocal glands to their original location.</span>"
|
||||
return
|
||||
|
||||
var/mimic_voice = input("Enter a name to mimic.", "Mimic Voice", null) as text
|
||||
if(!mimic_voice)
|
||||
return
|
||||
|
||||
changeling.chem_charges -= 10
|
||||
changeling.mimicing = mimic_voice
|
||||
|
||||
usr << "<span class='notice'>We shape our glands to take the voice of <b>[mimic_voice]</b>, this will stop us from regenerating chemicals while active.</span>"
|
||||
usr << "<span class='notice'>Use this power again to return to our original voice and reproduce chemicals again.</span>"
|
||||
|
||||
feedback_add_details("changeling_powers","MV")
|
||||
|
||||
spawn(0)
|
||||
while(src && src.mind && src.mind.changeling && src.mind.changeling.mimicing)
|
||||
src.mind.changeling.chem_charges -= 1
|
||||
sleep(40)
|
||||
if(src && src.mind && src.mind.changeling)
|
||||
src.mind.changeling.mimicing = ""
|
||||
//////////
|
||||
//STINGS// //They get a pretty header because there's just so fucking many of them ;_;
|
||||
//////////
|
||||
@@ -617,12 +703,7 @@
|
||||
var/S = input("Select the target DNA: ", "Target DNA", null) as null|anything in names
|
||||
if(!S) return
|
||||
|
||||
var/datum/dna/chosen_dna
|
||||
for(var/datum/dna/DNA in changeling.absorbed_dna)
|
||||
if(S == "[DNA.real_name]")
|
||||
chosen_dna = DNA
|
||||
break
|
||||
|
||||
var/datum/dna/chosen_dna = changeling.GetDNA(S)
|
||||
if(!chosen_dna)
|
||||
return
|
||||
|
||||
@@ -666,3 +747,23 @@
|
||||
if(T.reagents) T.reagents.add_reagent("lexorin", 40)
|
||||
feedback_add_details("changeling_powers","DTHS")
|
||||
return 1
|
||||
|
||||
/mob/proc/changeling_extract_dna_sting()
|
||||
set category = "Changeling"
|
||||
set name = "Extract DNA Sting (40)"
|
||||
set desc="Stealthily sting a target to extract their DNA."
|
||||
|
||||
var/datum/changeling/changeling = null
|
||||
if(usr.mind && usr.mind.changeling)
|
||||
changeling = usr.mind.changeling
|
||||
if(!changeling)
|
||||
return 0
|
||||
|
||||
var/mob/living/carbon/T = changeling_sting(40, /mob/proc/changeling_extract_dna_sting)
|
||||
if(!T) return 0
|
||||
|
||||
T.dna.real_name = T.real_name
|
||||
changeling.absorbed_dna |= T.dna
|
||||
|
||||
feedback_add_details("changeling_powers","ED")
|
||||
return 1
|
||||
@@ -1,3 +1,4 @@
|
||||
// READ: Don't use the apostrophe in name or desc. Causes script errors.
|
||||
|
||||
var/list/powers = typesof(/datum/power/changeling) - /datum/power/changeling //needed for the badmin verb for now
|
||||
var/list/datum/power/changeling/powerinstances = list()
|
||||
@@ -33,6 +34,22 @@ var/list/datum/power/changeling/powerinstances = list()
|
||||
allowduringlesserform = 1
|
||||
verbpath = /mob/proc/changeling_fakedeath
|
||||
|
||||
// Hivemind
|
||||
|
||||
/datum/power/changeling/hive_upload
|
||||
name = "Hive Channel"
|
||||
desc = "We can channel a DNA into the airwaves, allowing our fellow changelings to absorb it and transform into it as if they acquired the DNA themselves."
|
||||
helptext = "Allows other changelings to absorb the DNA you channel from the airwaves. Will not help them towards their absorb objectives."
|
||||
genomecost = 0
|
||||
verbpath = /mob/proc/changeling_hiveupload
|
||||
|
||||
/datum/power/changeling/hive_download
|
||||
name = "Hive Absorb"
|
||||
desc = "We can absorb a single DNA from the airwaves, allowing us to use more disguises with help from our fellow changelings."
|
||||
helptext = "Allows you to absorb a single DNA and use it. Does not count towards your absorb objective."
|
||||
genomecost = 0
|
||||
verbpath = /mob/proc/changeling_hivedownload
|
||||
|
||||
/datum/power/changeling/lesser_form
|
||||
name = "Lesser Form"
|
||||
desc = "We debase ourselves and become lesser. We become a monkey."
|
||||
@@ -61,6 +78,21 @@ var/list/datum/power/changeling/powerinstances = list()
|
||||
allowduringlesserform = 1
|
||||
verbpath = /mob/proc/changeling_silence_sting
|
||||
|
||||
/datum/power/changeling/mimicvoice
|
||||
name = "Mimic Voice"
|
||||
desc = "We shape our vocal glands to sound like a desired voice."
|
||||
helptext = "Will turn your voice into the name that you enter."
|
||||
genomecost = 3
|
||||
verbpath = /mob/proc/changeling_mimicvoice
|
||||
|
||||
/datum/power/changeling/extractdna
|
||||
name = "Extract DNA"
|
||||
desc = "We stealthily sting a target and extract the DNA from them."
|
||||
helptext = "Will give you the DNA of your target, allowing you to transform into them. Does not count towards absorb objectives."
|
||||
genomecost = 4
|
||||
allowduringlesserform = 1
|
||||
verbpath = /mob/proc/changeling_extract_dna_sting
|
||||
|
||||
/datum/power/changeling/transformation_sting
|
||||
name = "Transformation Sting"
|
||||
desc = "We silently sting a human, injecting a retrovirus that forces them to transform into another."
|
||||
@@ -135,7 +167,7 @@ var/list/datum/power/changeling/powerinstances = list()
|
||||
name = "Digital Camoflauge"
|
||||
desc = "We evolve the ability to distort our form and proprtions, defeating common altgorthms used to detect lifeforms on cameras."
|
||||
helptext = "We cannot be tracked by camera while using this skill. However, humans looking at us will find us.. uncanny. We must constantly expend chemicals to maintain our form like this."
|
||||
genomecost = 4
|
||||
genomecost = 3
|
||||
allowduringlesserform = 1
|
||||
verbpath = /mob/proc/changeling_digitalcamo
|
||||
|
||||
@@ -147,6 +179,7 @@ var/list/datum/power/changeling/powerinstances = list()
|
||||
verbpath = /mob/proc/changeling_rapidregen
|
||||
|
||||
|
||||
|
||||
// Modularchangling, totally stolen from the new player panel. YAYY
|
||||
/datum/changeling/proc/EvolutionMenu()//The new one
|
||||
set category = "Changeling"
|
||||
|
||||
@@ -504,15 +504,8 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology",
|
||||
|
||||
|
||||
if (C>=26+runedec+ticker.mode.cult.len) //including the useless rune at the secret room, shouldn't count against the limit of 25 runes - Urist
|
||||
switch(alert("The cloth of reality can't take that much of a strain. By creating another rune, you risk locally tearing reality apart, which would prove fatal to you. Do you still wish to scribe the rune?",,"Yes","No"))
|
||||
if("Yes")
|
||||
if(prob(C*5-105-(runedec-ticker.mode.cult.len)*5)) //including the useless rune at the secret room, shouldn't count against the limit - Urist
|
||||
usr.emote("scream")
|
||||
user << "\red A tear momentarily appears in reality. Before it closes, you catch a glimpse of that which lies beyond. That proves to be too much for your mind."
|
||||
usr.gib()
|
||||
return
|
||||
if("No")
|
||||
return
|
||||
alert("The cloth of reality can't take that much of a strain. Remove some runes first!")
|
||||
return
|
||||
else
|
||||
switch(alert("You open the tome",,"Read it","Scribe a rune", "Notes")) //Fuck the "Cancel" option. Rewrite the whole tome interface yourself if you want it to work better. And input() is just ugly. - K0000
|
||||
if("Cancel")
|
||||
|
||||
@@ -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>"
|
||||
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
|
||||
/proc/start_events()
|
||||
//changed to a while(1) loop since they are more efficient.
|
||||
//Moved the spawn in here to allow it to be called with advance proc call if it crashes.
|
||||
@@ -16,7 +17,7 @@
|
||||
Holiday_Random_Event()
|
||||
else
|
||||
event = 0
|
||||
sleep(1200)
|
||||
sleep(2400)
|
||||
|
||||
/proc/event()
|
||||
event = 1
|
||||
@@ -36,15 +37,13 @@
|
||||
meteor_wave()
|
||||
spawn_meteors()
|
||||
|
||||
/** NOPE!
|
||||
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")
|
||||
@@ -68,12 +67,9 @@
|
||||
spawn(rand(300,600))
|
||||
del(P)
|
||||
*/
|
||||
|
||||
/** NOPE!
|
||||
if(3)
|
||||
if((world.time/10)>=3600 && toggle_space_ninja && !sent_ninja_to_station)//If an hour has passed, relatively speaking. Also, if ninjas are allowed to spawn and if there is not already a ninja for the round.
|
||||
space_ninja_arrival()//Handled in space_ninja.dm. Doesn't announce arrival, all sneaky-like.
|
||||
**/
|
||||
if(4)
|
||||
mini_blob_event()
|
||||
|
||||
@@ -81,18 +77,14 @@
|
||||
high_radiation_event()
|
||||
if(6)
|
||||
viral_outbreak()
|
||||
/** NOPE!
|
||||
if(7)
|
||||
alien_infestation()
|
||||
**/
|
||||
if(8)
|
||||
prison_break()
|
||||
if(9)
|
||||
carp_migration()
|
||||
/** NOPE!
|
||||
if(10)
|
||||
immovablerod()
|
||||
**/
|
||||
/*if(10)
|
||||
immovablerod()*/
|
||||
if(11)
|
||||
lightsout(1,2)
|
||||
if(12)
|
||||
@@ -215,7 +207,7 @@
|
||||
// world << sound('sound/AI/outbreak7.ogg')
|
||||
var/virus_type
|
||||
if(!virus)
|
||||
virus_type = pick(/datum/disease/dnaspread,/datum/disease/flu,/datum/disease/cold,/datum/disease/brainrot,/datum/disease/magnitis)
|
||||
virus_type = pick(/datum/disease/dnaspread,/datum/disease/flu,/datum/disease/cold,/datum/disease/brainrot,/datum/disease/magnitis,/datum/disease/pierrot_throat)
|
||||
else
|
||||
switch(virus)
|
||||
if("fake gbs")
|
||||
@@ -279,11 +271,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)
|
||||
@@ -352,20 +347,16 @@
|
||||
for (var/obj/machinery/power/apc/temp_apc in A)
|
||||
temp_apc.overload_lighting()
|
||||
|
||||
for(var/area/A in areas)
|
||||
for (var/obj/structure/closet/secure_closet/brig/temp_closet in A)
|
||||
temp_closet.locked = 0
|
||||
temp_closet.icon_state = temp_closet.icon_closed
|
||||
|
||||
for(var/area/A in areas)
|
||||
for (var/obj/machinery/door/airlock/security/temp_airlock in A)
|
||||
temp_airlock.prison_open()
|
||||
spawn(0) temp_airlock.prison_open()
|
||||
|
||||
for(var/area/A in areas)
|
||||
for (var/obj/machinery/door/airlock/glass_security/temp_glassairlock in A)
|
||||
temp_glassairlock.prison_open()
|
||||
spawn(0) temp_glassairlock.prison_open()
|
||||
|
||||
for(var/area/A in areas)
|
||||
for (var/obj/machinery/door_timer/temp_timer in A)
|
||||
temp_timer.releasetime = 1
|
||||
|
||||
@@ -377,7 +368,7 @@
|
||||
/proc/carp_migration() // -- Darem
|
||||
for(var/obj/effect/landmark/C in landmarks_list)
|
||||
if(C.name == "carpspawn")
|
||||
new /mob/living/simple_animal/carp(C.loc)
|
||||
new /mob/living/simple_animal/hostile/carp(C.loc)
|
||||
//sleep(100)
|
||||
spawn(rand(300, 600)) //Delayed announcements to keep the crew on their toes.
|
||||
command_alert("Unknown biological entities have been detected near [station_name()], please stand-by.", "Lifesign Alert")
|
||||
@@ -484,10 +475,10 @@ Would like to add a law like "Law x is _______" where x = a number, and _____ is
|
||||
M << "\red YOU REQUIRE [require] IN ORDER TO PROTECT HUMANS... LAWS UPDATED"
|
||||
M.add_ion_law("YOU REQUIRE [require] IN ORDER TO PROTECT HUMANS")
|
||||
if(13)
|
||||
M << "\red [crew] is [allergysev] to [allergy]. LAWS UPDATED"
|
||||
M.add_ion_law("[crew] is [allergysev] to [allergy]. LAWS UPDATED")
|
||||
M << "\red [crew] is [allergysev] to [allergy]...LAWS UPDATED"
|
||||
M.add_ion_law("[crew] is [allergysev] to [allergy]")
|
||||
if(14)
|
||||
M << "\ref THE STATION IS [who2pref] [who2]"
|
||||
M << "\red THE STATION IS [who2pref] [who2]...LAWS UPDATED"
|
||||
M.add_ion_law("THE STATION IS [who2pref] [who2]")
|
||||
|
||||
if(botEmagChance)
|
||||
@@ -537,5 +528,4 @@ Would like to add a law like "Law x is _______" where x = a number, and _____ is
|
||||
world << "Finished processing FIREDOORS. Processed: [firedoornum]"
|
||||
|
||||
world << "Ion Storm Main Done"
|
||||
|
||||
*/
|
||||
@@ -124,7 +124,7 @@ var/global/datum/controller/gameticker/ticker
|
||||
if (S.name != "AI")
|
||||
del(S)
|
||||
world << "<FONT color='blue'><B>Enjoy the game!</B></FONT>"
|
||||
// world << sound('sound/AI/welcome.ogg') // Skie
|
||||
world << sound('sound/AI/welcome.ogg') // Skie
|
||||
//Holiday Round-start stuff ~Carn
|
||||
Holiday_Game_Start()
|
||||
|
||||
|
||||
@@ -31,6 +31,16 @@
|
||||
src.attack_hand(M)
|
||||
return
|
||||
|
||||
/obj/machinery/nuclearbomb/attackby(obj/item/weapon/I as obj, mob/user as mob)
|
||||
if (src.extended)
|
||||
if (istype(I, /obj/item/weapon/disk/nuclear))
|
||||
usr.drop_item()
|
||||
I.loc = src
|
||||
src.auth = I
|
||||
src.add_fingerprint(user)
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/machinery/nuclearbomb/attack_paw(mob/user as mob)
|
||||
return src.attack_hand(user)
|
||||
|
||||
|
||||
@@ -33,9 +33,7 @@
|
||||
if(charged == 1)
|
||||
new /obj/effect/rend(get_turf(usr))
|
||||
charged = 0
|
||||
for(var/mob/M in viewers(usr, null))
|
||||
if ((M.client && !( M.blinded )))
|
||||
M.show_message("\red <B>[src] hums with power as [usr] deals a blow to reality itself!</B>")
|
||||
visible_message("\red <B>[src] hums with power as [usr] deals a blow to reality itself!</B>")
|
||||
else
|
||||
user << "\red The unearthly energies that powered the blade are now dormant"
|
||||
|
||||
|
||||
@@ -196,9 +196,9 @@
|
||||
if("Captain")
|
||||
return get_all_accesses()
|
||||
if("Security Officer")
|
||||
return list(access_security, access_brig, access_court)
|
||||
return list(access_security, access_brig, access_court,access_maint_tunnels) // Massively requested that sec get there maintenance access back //
|
||||
if("Warden")
|
||||
return list(access_security, access_brig, access_armory, access_court)
|
||||
return list(access_security, access_brig, access_armory, access_court,access_maint_tunnels)
|
||||
if("Scientist")
|
||||
return list(access_tox, access_tox_storage, access_research, access_xenobiology)
|
||||
if("Head of Security")
|
||||
@@ -229,7 +229,7 @@
|
||||
if("Chef")
|
||||
return list(access_kitchen, access_morgue)
|
||||
if("Roboticist")
|
||||
return list(access_robotics, access_tech_storage, access_morgue) //As a job that handles so many corpses, it makes sense for them to have morgue access.
|
||||
return list(access_robotics, access_tech_storage, access_morgue) //As a job that handles so many corpses, it makes sense for them to have morgue access.
|
||||
if("Cargo Technician")
|
||||
return list(access_maint_tunnels, access_cargo, access_cargo_bot, access_mailsorting)
|
||||
if("Shaft Miner")
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
U.hastie = new /obj/item/clothing/tie/medal/gold/captain(U)
|
||||
H.equip_to_slot_or_del(U, slot_w_uniform)
|
||||
H.equip_to_slot_or_del(new /obj/item/device/pda/captain(H), slot_belt)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/captain(H), slot_wear_suit)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/head/caphat(H), slot_head)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(H), slot_glasses)
|
||||
|
||||
@@ -52,26 +52,20 @@
|
||||
/obj/machinery/optable/attack_paw(mob/user as mob)
|
||||
if ((HULK in usr.mutations))
|
||||
usr << text("\blue You destroy the operating table.")
|
||||
for(var/mob/O in oviewers())
|
||||
if ((O.client && !( O.blinded )))
|
||||
O << text("\red [usr] destroys the operating table.")
|
||||
visible_message("\red [usr] destroys the operating table!")
|
||||
src.density = 0
|
||||
del(src)
|
||||
if (!( locate(/obj/machinery/optable, user.loc) ))
|
||||
step(user, get_dir(user, src))
|
||||
if (user.loc == src.loc)
|
||||
user.layer = TURF_LAYER
|
||||
for(var/mob/M in viewers(user, null))
|
||||
M.show_message("The monkey hides under the table!", 1)
|
||||
//Foreach goto(69)
|
||||
visible_message("The monkey hides under the table!")
|
||||
return
|
||||
|
||||
/obj/machinery/optable/attack_hand(mob/user as mob)
|
||||
if ((HULK in usr.mutations) || (SUPRSTR in usr.augmentations))
|
||||
usr << text("\blue You destroy the table.")
|
||||
for(var/mob/O in oviewers())
|
||||
if ((O.client && !( O.blinded )))
|
||||
O << text("\red [usr] destroys the table.")
|
||||
visible_message("\red [usr] destroys the operating table!")
|
||||
src.density = 0
|
||||
del(src)
|
||||
return
|
||||
@@ -118,8 +112,7 @@
|
||||
M.client.eye = src
|
||||
M.resting = 1
|
||||
M.loc = src.loc
|
||||
for (var/mob/C in viewers(src))
|
||||
C.show_message("\red [M] has been laid on the operating table by [user].", 3)
|
||||
visible_message("\red [M] has been laid on the operating table by [user].", 3)
|
||||
for(var/obj/O in src)
|
||||
O.loc = src.loc
|
||||
src.add_fingerprint(user)
|
||||
|
||||
@@ -180,8 +180,7 @@
|
||||
usr << "[G.affecting.name] will not fit into the sleeper because they have a Metroid latched onto their head."
|
||||
return
|
||||
|
||||
for (var/mob/V in viewers(user))
|
||||
V.show_message("[user] starts putting [G.affecting.name] into the sleeper.", 3)
|
||||
visible_message("[user] starts putting [G.affecting.name] into the sleeper.", 3)
|
||||
|
||||
if(do_after(user, 20))
|
||||
if(src.occupant)
|
||||
@@ -372,8 +371,7 @@
|
||||
if(M.Victim == usr)
|
||||
usr << "You're too busy getting your life sucked out of you."
|
||||
return
|
||||
for(var/mob/V in viewers(usr))
|
||||
V.show_message("[usr] starts climbing into the sleeper.", 3)
|
||||
visible_message("[usr] starts climbing into the sleeper.", 3)
|
||||
if(do_after(usr, 20))
|
||||
if(src.occupant)
|
||||
usr << "\blue <B>The sleeper is already occupied!</B>"
|
||||
|
||||
@@ -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()
|
||||
set_frequency(frequency)
|
||||
radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK)
|
||||
flick("access_button_cycle", src)
|
||||
|
||||
New()
|
||||
..()
|
||||
|
||||
if(radio_controller)
|
||||
set_frequency(frequency)
|
||||
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)
|
||||
@@ -166,8 +166,7 @@
|
||||
|
||||
/obj/machinery/portable_atmospherics/canister/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
|
||||
if(!istype(W, /obj/item/weapon/wrench) && !istype(W, /obj/item/weapon/tank) && !istype(W, /obj/item/device/analyzer) && !istype(W, /obj/item/device/pda))
|
||||
for(var/mob/V in viewers(src, null))
|
||||
V.show_message(text("\red [user] hits the [src] with a [W]!"))
|
||||
visible_message("\red [user] hits the [src] with a [W]!")
|
||||
src.health -= W.force
|
||||
src.add_fingerprint(user)
|
||||
healthcheck()
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
/obj/machinery/meter/New()
|
||||
..()
|
||||
|
||||
src.target = locate(/obj/machinery/atmospherics/pipe) in loc
|
||||
|
||||
return 1
|
||||
|
||||
/obj/machinery/meter/initialize()
|
||||
@@ -105,4 +103,19 @@
|
||||
"\blue You have unfastened \the [src].", \
|
||||
"You hear ratchet.")
|
||||
new /obj/item/pipe_meter(src.loc)
|
||||
del(src)
|
||||
del(src)
|
||||
|
||||
// TURF METER - REPORTS A TILE'S AIR CONTENTS
|
||||
|
||||
/obj/machinery/meter/turf/New()
|
||||
..()
|
||||
src.target = loc
|
||||
return 1
|
||||
|
||||
|
||||
/obj/machinery/meter/turf/initialize()
|
||||
if (!target)
|
||||
src.target = loc
|
||||
|
||||
/obj/machinery/meter/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
|
||||
return
|
||||
@@ -106,8 +106,7 @@
|
||||
return
|
||||
|
||||
else if ((istype(W, /obj/item/device/analyzer) || (istype(W, /obj/item/device/pda))) && get_dist(user, src) <= 1)
|
||||
for (var/mob/O in viewers(user, null))
|
||||
O << "\red [user] has used [W] on \icon[icon]"
|
||||
visible_message("\red [user] has used [W] on \icon[icon]")
|
||||
if(air_contents)
|
||||
var/pressure = air_contents.return_pressure()
|
||||
var/total_moles = air_contents.total_moles()
|
||||
|
||||
@@ -167,12 +167,10 @@ text("<A href='?src=\ref[src];operation=oddbutton'>[src.oddbutton ? "Yes" : "No"
|
||||
var/list/cleanbottargets = list()
|
||||
|
||||
if(!src.screwloose && !src.oddbutton && prob(5))
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message(text("[src] makes an excited beeping booping sound!"), 1)
|
||||
visible_message("[src] makes an excited beeping booping sound!")
|
||||
|
||||
if(src.screwloose && prob(5))
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message(text("[src] leaks a drop of water. How strange."), 1)
|
||||
visible_message("[src] leaks a drop of water. How strange.")
|
||||
if(istype(loc,/turf/simulated))
|
||||
var/turf/simulated/T = src.loc
|
||||
if(T.wet < 1)
|
||||
@@ -189,8 +187,7 @@ text("<A href='?src=\ref[src];operation=oddbutton'>[src.oddbutton ? "Yes" : "No"
|
||||
T.overlays -= T.wet_overlay
|
||||
T.wet_overlay = null
|
||||
if(src.oddbutton && prob(5))
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message(text("Something flies out of [src]. He seems to be acting oddly."), 1)
|
||||
visible_message("Something flies out of [src]. He seems to be acting oddly.")
|
||||
var/obj/effect/decal/cleanable/blood/gibs/gib = new /obj/effect/decal/cleanable/blood/gibs(src.loc)
|
||||
//gib.streak(list(NORTH, SOUTH, EAST, WEST, NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST))
|
||||
src.oldtarget = gib
|
||||
@@ -313,8 +310,7 @@ text("<A href='?src=\ref[src];operation=oddbutton'>[src.oddbutton ? "Yes" : "No"
|
||||
/obj/machinery/bot/cleanbot/proc/clean(var/obj/effect/decal/cleanable/target)
|
||||
src.anchored = 1
|
||||
src.icon_state = "cleanbot-c"
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message(text("\red [src] begins to clean up the [target]"), 1)
|
||||
visible_message("\red [src] begins to clean up the [target]")
|
||||
src.cleaning = 1
|
||||
spawn(50)
|
||||
src.cleaning = 0
|
||||
|
||||
@@ -288,8 +288,7 @@ Auto Patrol: []"},
|
||||
maxstuns--
|
||||
if (maxstuns <= 0)
|
||||
target = null
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message("\red <B>[src.target] has been stunned by [src]!</B>", 1, "\red You hear someone fall", 2)
|
||||
visible_message("\red <B>[src.target] has been stunned by [src]!</B>")
|
||||
|
||||
mode = SECBOT_PREP_ARREST
|
||||
src.anchored = 1
|
||||
@@ -321,8 +320,7 @@ Auto Patrol: []"},
|
||||
if (!src.target.handcuffed && !src.arrest_type)
|
||||
playsound(src.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -2)
|
||||
mode = SECBOT_ARREST
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message("\red <B>[src] is trying to put handcuffs on [src.target]!</B>", 1)
|
||||
visible_message("\red <B>[src] is trying to put handcuffs on [src.target]!</B>")
|
||||
|
||||
spawn(60)
|
||||
if (get_dist(src, src.target) <= 1)
|
||||
|
||||
@@ -190,8 +190,7 @@
|
||||
else
|
||||
return
|
||||
if(prob(5))
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message(text("[src] makes an excited booping beeping sound!"), 1)
|
||||
visible_message("[src] makes an excited booping beeping sound!")
|
||||
|
||||
if((!src.target || src.target == null) && emagged < 2)
|
||||
if(targetdirection != null)
|
||||
@@ -272,8 +271,7 @@
|
||||
F.break_tile_to_plating()
|
||||
else
|
||||
F.ReplaceWithLattice()
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message(text("\red [src] makes an excited booping sound."), 1)
|
||||
visible_message("\red [src] makes an excited booping sound.")
|
||||
spawn(50)
|
||||
src.amount ++
|
||||
src.anchored = 0
|
||||
@@ -296,8 +294,7 @@
|
||||
src.anchored = 1
|
||||
src.icon_state = "floorbot-c"
|
||||
if(istype(target, /turf/space/))
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message(text("\red [src] begins to repair the hole"), 1)
|
||||
visible_message("\red [src] begins to repair the hole")
|
||||
var/obj/item/stack/tile/plasteel/T = new /obj/item/stack/tile/plasteel
|
||||
src.repairing = 1
|
||||
spawn(50)
|
||||
@@ -308,8 +305,7 @@
|
||||
src.anchored = 0
|
||||
src.target = null
|
||||
else
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message(text("\red [src] begins to improve the floor."), 1)
|
||||
visible_message("\red [src] begins to improve the floor.")
|
||||
src.repairing = 1
|
||||
spawn(50)
|
||||
src.loc.icon_state = "floor"
|
||||
@@ -322,8 +318,7 @@
|
||||
/obj/machinery/bot/floorbot/proc/eattile(var/obj/item/stack/tile/plasteel/T)
|
||||
if(!istype(T, /obj/item/stack/tile/plasteel))
|
||||
return
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message(text("\red [src] begins to collect tiles."), 1)
|
||||
visible_message("\red [src] begins to collect tiles.")
|
||||
src.repairing = 1
|
||||
spawn(20)
|
||||
if(isnull(T))
|
||||
@@ -346,8 +341,7 @@
|
||||
return
|
||||
if(M.amount > 1)
|
||||
return
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message(text("\red [src] begins to create tiles."), 1)
|
||||
visible_message("\red [src] begins to create tiles.")
|
||||
src.repairing = 1
|
||||
spawn(20)
|
||||
if(isnull(M))
|
||||
|
||||
@@ -409,8 +409,7 @@
|
||||
return
|
||||
else
|
||||
src.icon_state = "medibots"
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message("\red <B>[src] is trying to inject [src.patient]!</B>", 1)
|
||||
visible_message("\red <B>[src] is trying to inject [src.patient]!</B>")
|
||||
spawn(30)
|
||||
if ((get_dist(src, src.patient) <= 1) && (src.on))
|
||||
if((reagent_id == "internal_beaker") && (src.reagent_glass) && (src.reagent_glass.reagents.total_volume))
|
||||
@@ -418,8 +417,7 @@
|
||||
src.reagent_glass.reagents.reaction(src.patient, 2)
|
||||
else
|
||||
src.patient.reagents.add_reagent(reagent_id,src.injection_amount)
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message("\red <B>[src] injects [src.patient] with the syringe!</B>", 1)
|
||||
visible_message("\red <B>[src] injects [src.patient] with the syringe!</B>")
|
||||
|
||||
src.icon_state = "medibot[src.on]"
|
||||
src.currently_healing = 0
|
||||
@@ -432,8 +430,7 @@
|
||||
/obj/machinery/bot/medbot/proc/speak(var/message)
|
||||
if((!src.on) || (!message))
|
||||
return
|
||||
for(var/mob/O in hearers(src, null))
|
||||
O.show_message("<span class='game say'><span class='name'>[src]</span> beeps, \"[message]\"",2)
|
||||
visible_message("[src] beeps, \"[message]\"")
|
||||
return
|
||||
|
||||
/obj/machinery/bot/medbot/bullet_act(var/obj/item/projectile/Proj)
|
||||
@@ -448,8 +445,7 @@
|
||||
|
||||
/obj/machinery/bot/medbot/explode()
|
||||
src.on = 0
|
||||
for(var/mob/O in hearers(src, null))
|
||||
O.show_message("\red <B>[src] blows apart!</B>", 1)
|
||||
visible_message("\red <B>[src] blows apart!</B>", 1)
|
||||
var/turf/Tsec = get_turf(src)
|
||||
|
||||
new /obj/item/weapon/storage/firstaid(Tsec)
|
||||
|
||||
@@ -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
|
||||
@@ -295,24 +284,4 @@
|
||||
return 0
|
||||
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]"
|
||||
return 0
|
||||
@@ -1,23 +1,54 @@
|
||||
// PRESETS
|
||||
|
||||
// EMP
|
||||
|
||||
/obj/machinery/camera/emp_proof/New()
|
||||
..()
|
||||
upgradeEmpProof()
|
||||
|
||||
// X-RAY
|
||||
|
||||
/obj/machinery/camera/xray
|
||||
icon_state = "xraycam" // Thanks to Krutchen for the icons.
|
||||
|
||||
/obj/machinery/camera/xray/New()
|
||||
..()
|
||||
upgradeXRay()
|
||||
|
||||
// MOTION
|
||||
|
||||
/obj/machinery/camera/motion/New()
|
||||
..()
|
||||
upgradeMotion()
|
||||
|
||||
// ALL UPGRADES
|
||||
|
||||
/obj/machinery/camera/all/New()
|
||||
..()
|
||||
upgradeEmpProof()
|
||||
upgradeXRay()
|
||||
upgradeMotion()
|
||||
|
||||
// AUTONAME
|
||||
|
||||
/obj/machinery/camera/autoname
|
||||
var/number = 0 //camera number in area
|
||||
|
||||
//This camera type automatically sets it's name to whatever the area that it's in is called.
|
||||
/obj/machinery/camera/autoname/New()
|
||||
..()
|
||||
spawn(10)
|
||||
number = 1
|
||||
var/area/A = get_area(src)
|
||||
if(A)
|
||||
for(var/obj/machinery/camera/autoname/C in world)
|
||||
if(C == src) continue
|
||||
var/area/CA = get_area(C)
|
||||
if(CA.type == A.type)
|
||||
if(C.number)
|
||||
number = max(number, C.number+1)
|
||||
c_tag = "[A.name] #[number]"
|
||||
|
||||
|
||||
// CHECKS
|
||||
|
||||
|
||||
@@ -1,25 +1,56 @@
|
||||
/mob/living/silicon/ai/proc/ai_camera_list()
|
||||
/mob/living/silicon/ai/proc/get_camera_list()
|
||||
|
||||
if(src.stat == 2)
|
||||
return
|
||||
|
||||
var/list/L = list()
|
||||
for (var/obj/machinery/camera/C in cameranet.cameras)
|
||||
L.Add(C)
|
||||
|
||||
camera_sort(L)
|
||||
|
||||
var/list/T = list()
|
||||
T["Cancel"] = "Cancel"
|
||||
for (var/obj/machinery/camera/C in L)
|
||||
if (C.network == src.network)
|
||||
T[text("[][]", C.c_tag, (C.can_use() ? null : " (Deactivated)"))] = C
|
||||
|
||||
track = new()
|
||||
track.cameras = T
|
||||
return T
|
||||
|
||||
|
||||
/mob/living/silicon/ai/proc/ai_camera_list(var/camera in get_camera_list())
|
||||
set category = "AI Commands"
|
||||
set name = "Show Camera List"
|
||||
|
||||
if(usr.stat == 2)
|
||||
usr << "You can't track with camera because you are dead!"
|
||||
if(src.stat == 2)
|
||||
src << "You can't list the cameras because you are dead!"
|
||||
return
|
||||
|
||||
attack_ai(src)
|
||||
if (!camera || camera == "Cancel")
|
||||
return 0
|
||||
|
||||
/mob/living/silicon/ai/proc/ai_camera_track()
|
||||
set category = "AI Commands"
|
||||
set name = "Track With Camera"
|
||||
if(usr.stat == 2)
|
||||
usr << "You can't track with camera because you are dead!"
|
||||
return
|
||||
var/obj/machinery/camera/C = track.cameras[camera]
|
||||
track = null
|
||||
src.eyeobj.setLoc(C)
|
||||
|
||||
return
|
||||
|
||||
// Used to allow the AI is write in mob names/camera name from the CMD line.
|
||||
/datum/trackable
|
||||
var/list/names = list()
|
||||
var/list/namecounts = list()
|
||||
var/list/humans = list()
|
||||
var/list/others = list()
|
||||
var/list/cameras = list()
|
||||
|
||||
/mob/living/silicon/ai/proc/trackable_mobs()
|
||||
|
||||
if(usr.stat == 2)
|
||||
return list()
|
||||
|
||||
var/datum/trackable/TB = new()
|
||||
for(var/mob/living/M in mob_list)
|
||||
// Easy checks first.
|
||||
// Don't detect mobs on Centcom. Since the wizard den is on Centcomm, we only need this.
|
||||
@@ -55,25 +86,34 @@
|
||||
continue
|
||||
|
||||
var/name = M.name
|
||||
if (name in names)
|
||||
namecounts[name]++
|
||||
name = text("[] ([])", name, namecounts[name])
|
||||
if (name in TB.names)
|
||||
TB.namecounts[name]++
|
||||
name = text("[] ([])", name, TB.namecounts[name])
|
||||
else
|
||||
names.Add(name)
|
||||
namecounts[name] = 1
|
||||
TB.names.Add(name)
|
||||
TB.namecounts[name] = 1
|
||||
if(human)
|
||||
humans[name] = M
|
||||
TB.humans[name] = M
|
||||
else
|
||||
others[name] = M
|
||||
TB.others[name] = M
|
||||
|
||||
var/list/targets = sortList(humans) + sortList(others)
|
||||
var/target_name = input(usr, "Which creature should you track?") as null|anything in targets
|
||||
var/list/targets = sortList(TB.humans) + sortList(TB.others)
|
||||
src.track = TB
|
||||
return targets
|
||||
|
||||
if (!target_name)
|
||||
usr:cameraFollow = null
|
||||
/mob/living/silicon/ai/proc/ai_camera_track(var/target_name in trackable_mobs())
|
||||
set category = "AI Commands"
|
||||
set name = "Track With Camera"
|
||||
set desc = "Select who you would like to track."
|
||||
|
||||
if(src.stat == 2)
|
||||
src << "You can't track with camera because you are dead!"
|
||||
return
|
||||
if(!target_name)
|
||||
src.cameraFollow = null
|
||||
|
||||
var/mob/target = (isnull(humans[target_name]) ? others[target_name] : humans[target_name])
|
||||
var/mob/target = (isnull(track.humans[target_name]) ? track.others[target_name] : track.humans[target_name])
|
||||
src.track = null
|
||||
ai_actual_track(target)
|
||||
|
||||
/mob/living/silicon/ai/proc/ai_actual_track(mob/living/target as mob)
|
||||
@@ -121,7 +161,7 @@
|
||||
return
|
||||
sleep(10)
|
||||
|
||||
/proc/near_camera(var/mob/M)
|
||||
/proc/near_camera(var/mob/living/M)
|
||||
if (!isturf(M.loc))
|
||||
return 0
|
||||
if(isrobot(M))
|
||||
@@ -141,33 +181,7 @@
|
||||
|
||||
|
||||
/mob/living/silicon/ai/attack_ai(var/mob/user as mob)
|
||||
if (user != src)
|
||||
return
|
||||
|
||||
if (stat == 2)
|
||||
return
|
||||
|
||||
var/list/L = list()
|
||||
for (var/obj/machinery/camera/C in cameranet.cameras)
|
||||
L.Add(C)
|
||||
|
||||
camera_sort(L)
|
||||
|
||||
var/list/D = list()
|
||||
D["Cancel"] = "Cancel"
|
||||
for (var/obj/machinery/camera/C in L)
|
||||
if (C.network == src.network)
|
||||
D[text("[][]", C.c_tag, (C.can_use() ? null : " (Deactivated)"))] = C
|
||||
|
||||
var/t = input(user, "Which camera should you change to?") as null|anything in D
|
||||
|
||||
if (!t || t == "Cancel")
|
||||
return 0
|
||||
|
||||
var/obj/machinery/camera/C = D[t]
|
||||
src.eyeobj.setLoc(C)
|
||||
|
||||
return
|
||||
ai_camera_list()
|
||||
|
||||
/proc/camera_sort(list/L)
|
||||
var/obj/machinery/camera/a
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
|
||||
if(CAMERA_WIRE_POWER)
|
||||
deactivate(usr, 1)
|
||||
shock(usr)
|
||||
//shock(usr)
|
||||
|
||||
if(CAMERA_WIRE_LIGHT)
|
||||
light_disabled = 1
|
||||
|
||||
@@ -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")
|
||||
@@ -293,7 +293,7 @@
|
||||
for(var/obj/effect/decal/cleanable/blood/B in linkedholodeck)
|
||||
del(B)
|
||||
|
||||
for(var/mob/living/simple_animal/carp/C in linkedholodeck)
|
||||
for(var/mob/living/simple_animal/hostile/carp/C in linkedholodeck)
|
||||
del(C)
|
||||
|
||||
holographic_items = A.copy_contents_to(linkedholodeck , 1)
|
||||
@@ -314,7 +314,7 @@
|
||||
T.temperature = 5000
|
||||
T.hotspot_expose(50000,50000,1)
|
||||
if(L.name=="Holocarp Spawn")
|
||||
new /mob/living/simple_animal/carp(L.loc)
|
||||
new /mob/living/simple_animal/hostile/carp(L.loc)
|
||||
|
||||
|
||||
/obj/machinery/computer/HolodeckControl/proc/emergencyShutdown()
|
||||
@@ -445,9 +445,9 @@
|
||||
desc = "May the force be within you. Sorta"
|
||||
icon_state = "sword0"
|
||||
force = 3.0
|
||||
throwforce = 5.0
|
||||
throw_speed = 1
|
||||
throw_range = 5
|
||||
throwforce = 0
|
||||
w_class = 2.0
|
||||
flags = FPRINT | TABLEPASS | NOSHIELD
|
||||
var/active = 0
|
||||
|
||||
@@ -196,6 +196,8 @@
|
||||
occupant.client.eye = occupant.client.mob
|
||||
occupant.client.perspective = MOB_PERSPECTIVE
|
||||
occupant.loc = get_step(loc, SOUTH) //this doesn't account for walls or anything, but i don't forsee that being a problem.
|
||||
if (occupant.bodytemperature < 261 && occupant.bodytemperature > 140) //Patch by Aranclanos to stop people from taking burn damage after being ejected
|
||||
occupant.bodytemperature = 261
|
||||
// occupant.metabslow = 0
|
||||
occupant = null
|
||||
update_icon()
|
||||
|
||||
@@ -68,13 +68,11 @@ for reference:
|
||||
attackby(obj/item/W as obj, mob/user as mob)
|
||||
if (istype(W, /obj/item/stack/sheet/wood))
|
||||
if (src.health < src.maxhealth)
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O << "\red [user] begins to repair the [src]!"
|
||||
visible_message("\red [user] begins to repair the [src]!")
|
||||
if(do_after(user,20))
|
||||
src.health = src.maxhealth
|
||||
W:use(1)
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O << "\red [user] repairs the [src]!"
|
||||
visible_message("\red [user] repairs the [src]!")
|
||||
return
|
||||
else
|
||||
return
|
||||
@@ -87,8 +85,7 @@ for reference:
|
||||
src.health -= W.force * 0.75
|
||||
else
|
||||
if (src.health <= 0)
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O << "\red <B>The barricade is smashed apart!</B>"
|
||||
visible_message("\red <B>The barricade is smashed apart!</B>")
|
||||
new /obj/item/stack/sheet/wood(get_turf(src))
|
||||
new /obj/item/stack/sheet/wood(get_turf(src))
|
||||
new /obj/item/stack/sheet/wood(get_turf(src))
|
||||
@@ -98,15 +95,13 @@ for reference:
|
||||
ex_act(severity)
|
||||
switch(severity)
|
||||
if(1.0)
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O << "\red <B>The barricade is blown apart!</B>"
|
||||
visible_message("\red <B>The barricade is blown apart!</B>")
|
||||
del(src)
|
||||
return
|
||||
if(2.0)
|
||||
src.health -= 25
|
||||
if (src.health <= 0)
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O << "\red <B>The barricade is blown apart!</B>"
|
||||
visible_message("\red <B>The barricade is blown apart!</B>")
|
||||
new /obj/item/stack/sheet/wood(get_turf(src))
|
||||
new /obj/item/stack/sheet/wood(get_turf(src))
|
||||
new /obj/item/stack/sheet/wood(get_turf(src))
|
||||
@@ -114,8 +109,7 @@ for reference:
|
||||
return
|
||||
|
||||
meteorhit()
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O << "\red <B>The barricade is smashed apart!</B>"
|
||||
visible_message("\red <B>The barricade is smashed apart!</B>")
|
||||
new /obj/item/stack/sheet/wood(get_turf(src))
|
||||
new /obj/item/stack/sheet/wood(get_turf(src))
|
||||
new /obj/item/stack/sheet/wood(get_turf(src))
|
||||
@@ -125,8 +119,7 @@ for reference:
|
||||
blob_act()
|
||||
src.health -= 25
|
||||
if (src.health <= 0)
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O << "\red <B>The blob eats through the barricade!</B>"
|
||||
visible_message("\red <B>The blob eats through the barricade!</B>")
|
||||
del(src)
|
||||
return
|
||||
|
||||
@@ -181,8 +174,7 @@ for reference:
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(2, 1, src)
|
||||
s.start()
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O << "\red BZZzZZzZZzZT"
|
||||
visible_message("\red BZZzZZzZZzZT")
|
||||
return
|
||||
return
|
||||
else if (istype(W, /obj/item/weapon/card/emag))
|
||||
@@ -193,8 +185,7 @@ for reference:
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(2, 1, src)
|
||||
s.start()
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O << "\red BZZZZT"
|
||||
visible_message("\red BZZzZZzZZzZT")
|
||||
return
|
||||
else if (src.emagged == 1)
|
||||
src.emagged = 2
|
||||
@@ -202,22 +193,19 @@ for reference:
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(2, 1, src)
|
||||
s.start()
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O << "\red BZZZZT"
|
||||
visible_message("\red BZZzZZzZZzZT")
|
||||
return
|
||||
else if (istype(W, /obj/item/weapon/wrench))
|
||||
if (src.health < src.maxhealth)
|
||||
src.health = src.maxhealth
|
||||
src.emagged = 0
|
||||
src.req_access = list(access_security)
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O << "\red [user] repairs the [src]!"
|
||||
visible_message("\red [user] repairs the [src]!")
|
||||
return
|
||||
else if (src.emagged > 0)
|
||||
src.emagged = 0
|
||||
src.req_access = list(access_security)
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O << "\red [user] repairs the [src]!"
|
||||
visible_message("\red [user] repairs the [src]!")
|
||||
return
|
||||
return
|
||||
else
|
||||
@@ -262,8 +250,7 @@ for reference:
|
||||
|
||||
proc/explode()
|
||||
|
||||
for(var/mob/O in hearers(src, null))
|
||||
O.show_message("\red <B>[src] blows apart!</B>", 1)
|
||||
visible_message("\red <B>[src] blows apart!</B>")
|
||||
var/turf/Tsec = get_turf(src)
|
||||
|
||||
/* var/obj/item/stack/rods/ =*/
|
||||
|
||||
@@ -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"
|
||||
@@ -30,6 +30,9 @@
|
||||
if(density)
|
||||
layer = 3.1 //Above most items if closed
|
||||
explosion_resistance = initial(explosion_resistance)
|
||||
if(opacity)
|
||||
var/turf/T = get_turf(src)
|
||||
T.thermal_conductivity = DOOR_HEAT_TRANSFER_COEFFICIENT
|
||||
else
|
||||
layer = 2.7 //Under all objects if opened. 2.7 due to tables being at 2.6
|
||||
explosion_resistance = 0
|
||||
@@ -38,6 +41,7 @@
|
||||
|
||||
|
||||
Del()
|
||||
density = 0
|
||||
update_nearby_tiles()
|
||||
..()
|
||||
return
|
||||
@@ -247,17 +251,51 @@
|
||||
update_nearby_tiles(need_rebuild)
|
||||
if(!air_master) return 0
|
||||
|
||||
var/turf/simulated/source = get_turf(src)
|
||||
var/turf/simulated/source = loc
|
||||
var/turf/simulated/north = get_step(source,NORTH)
|
||||
var/turf/simulated/south = get_step(source,SOUTH)
|
||||
var/turf/simulated/east = get_step(source,EAST)
|
||||
var/turf/simulated/west = get_step(source,WEST)
|
||||
|
||||
if(src.density && src.opacity)
|
||||
source.thermal_conductivity = DOOR_HEAT_TRANSFER_COEFFICIENT
|
||||
else
|
||||
source.thermal_conductivity = initial(source.thermal_conductivity)
|
||||
|
||||
//not sure what the equivalent in zas is
|
||||
/*if(need_rebuild)
|
||||
if(istype(source)) //Rebuild/update nearby group geometry
|
||||
if(source.parent)
|
||||
air_master.groups_to_rebuild += source.parent
|
||||
else
|
||||
air_master.tiles_to_update += source
|
||||
if(istype(north))
|
||||
if(north.parent)
|
||||
air_master.groups_to_rebuild += north.parent
|
||||
else
|
||||
air_master.tiles_to_update += north
|
||||
if(istype(south))
|
||||
if(south.parent)
|
||||
air_master.groups_to_rebuild += south.parent
|
||||
else
|
||||
air_master.tiles_to_update += south
|
||||
if(istype(east))
|
||||
if(east.parent)
|
||||
air_master.groups_to_rebuild += east.parent
|
||||
else
|
||||
air_master.tiles_to_update += east
|
||||
if(istype(west))
|
||||
if(west.parent)
|
||||
air_master.groups_to_rebuild += west.parent
|
||||
else
|
||||
air_master.tiles_to_update += west
|
||||
else*/
|
||||
if(istype(source)) air_master.tiles_to_update |= source
|
||||
if(istype(north)) air_master.tiles_to_update |= north
|
||||
if(istype(south)) air_master.tiles_to_update |= south
|
||||
if(istype(east)) air_master.tiles_to_update |= east
|
||||
if(istype(west)) air_master.tiles_to_update |= west
|
||||
|
||||
return 1
|
||||
|
||||
|
||||
@@ -297,4 +335,4 @@
|
||||
else
|
||||
close()
|
||||
return
|
||||
*/
|
||||
*/
|
||||
@@ -0,0 +1,78 @@
|
||||
/datum/computer/file/embedded_program/simple_vent_controller
|
||||
|
||||
var/airpump_tag
|
||||
|
||||
receive_user_command(command)
|
||||
switch(command)
|
||||
if("vent_inactive")
|
||||
var/datum/signal/signal = new
|
||||
signal.data = list(
|
||||
"tag" = airpump_tag,
|
||||
"sigtype"="command"
|
||||
)
|
||||
signal.data["power"] = 0
|
||||
post_signal(signal)
|
||||
|
||||
if("vent_pump")
|
||||
var/datum/signal/signal = new
|
||||
signal.data = list(
|
||||
"tag" = airpump_tag,
|
||||
"sigtype"="command"
|
||||
)
|
||||
signal.data["stabalize"] = 1
|
||||
signal.data["power"] = 1
|
||||
post_signal(signal)
|
||||
|
||||
if("vent_clear")
|
||||
var/datum/signal/signal = new
|
||||
signal.transmission_method = 1 //radio signal
|
||||
signal.data = list(
|
||||
"tag" = airpump_tag,
|
||||
"sigtype"="command"
|
||||
)
|
||||
signal.data["purge"] = 1
|
||||
signal.data["power"] = 1
|
||||
post_signal(signal)
|
||||
|
||||
process()
|
||||
return 0
|
||||
|
||||
|
||||
/obj/machinery/embedded_controller/radio/simple_vent_controller
|
||||
icon = 'icons/obj/airlock_machines.dmi'
|
||||
icon_state = "airlock_control_standby"
|
||||
|
||||
name = "Vent Controller"
|
||||
density = 0
|
||||
|
||||
frequency = 1229
|
||||
power_channel = ENVIRON
|
||||
|
||||
// Setup parameters only
|
||||
var/airpump_tag
|
||||
|
||||
initialize()
|
||||
..()
|
||||
|
||||
var/datum/computer/file/embedded_program/simple_vent_controller/new_prog = new
|
||||
|
||||
new_prog.airpump_tag = airpump_tag
|
||||
new_prog.master = src
|
||||
program = new_prog
|
||||
|
||||
update_icon()
|
||||
if(on && program)
|
||||
icon_state = "airlock_control_standby"
|
||||
else
|
||||
icon_state = "airlock_control_off"
|
||||
|
||||
|
||||
return_text()
|
||||
var/state_options = null
|
||||
state_options = {"<A href='?src=\ref[src];command=vent_inactive'>Deactivate Vent</A><BR>
|
||||
<A href='?src=\ref[src];command=vent_pump'>Activate Vent / Pump</A><BR>
|
||||
<A href='?src=\ref[src];command=vent_clear'>Activate Vent / Clear</A><BR>"}
|
||||
var/output = {"<B>Vent Control Console</B><HR>
|
||||
[state_options]<HR>"}
|
||||
|
||||
return output
|
||||
@@ -1,49 +0,0 @@
|
||||
/obj/structure/gatewayplaceholder
|
||||
density = 1
|
||||
anchored = 1
|
||||
icon = 'icons/obj/machines/gateway.dmi'
|
||||
|
||||
/obj/structure/gatewayplaceholder/one
|
||||
name = "Gateway"
|
||||
desc = "A gateway"
|
||||
icon_state = "off1"
|
||||
|
||||
/obj/structure/gatewayplaceholder/two
|
||||
name = "Gateway"
|
||||
desc = "A gateway"
|
||||
icon_state = "off2"
|
||||
|
||||
/obj/structure/gatewayplaceholder/three
|
||||
name = "Gateway"
|
||||
desc = "A gateway"
|
||||
icon_state = "off3"
|
||||
|
||||
/obj/structure/gatewayplaceholder/four
|
||||
name = "Gateway"
|
||||
desc = "A gateway"
|
||||
icon_state = "off4"
|
||||
|
||||
/obj/structure/gatewayplaceholder/five
|
||||
name = "Gateway"
|
||||
desc = "A gateway"
|
||||
icon_state = "off5"
|
||||
|
||||
/obj/structure/gatewayplaceholder/six
|
||||
name = "Gateway"
|
||||
desc = "A gateway"
|
||||
icon_state = "off6"
|
||||
|
||||
/obj/structure/gatewayplaceholder/seven
|
||||
name = "Gateway"
|
||||
desc = "A gateway"
|
||||
icon_state = "off7"
|
||||
|
||||
/obj/structure/gatewayplaceholder/eight
|
||||
name = "Gateway"
|
||||
desc = "A gateway"
|
||||
icon_state = "off8"
|
||||
|
||||
/obj/structure/gatewayplaceholder/nine
|
||||
name = "Gateway"
|
||||
desc = "A gateway"
|
||||
icon_state = "off9"
|
||||
@@ -59,13 +59,11 @@ var/const/HOLOPAD_MODE = 0
|
||||
|
||||
/*This is the proc for special two-way communication between AI and holopad/people talking near holopad.
|
||||
For the other part of the code, check silicon say.dm. Particularly robot talk.*/
|
||||
/obj/machinery/hologram/holopad/hear_talk(mob/M, text)
|
||||
/obj/machinery/hologram/holopad/hear_talk(mob/living/M, text)
|
||||
if(M&&hologram&&master)//Master is mostly a safety in case lag hits or something.
|
||||
if(!master.say_understands(M))//The AI will be able to understand most mobs talking through the holopad.
|
||||
text = stars(text)
|
||||
var/name_used = M.name
|
||||
if(istype(M.wear_mask, /obj/item/clothing/mask/gas/voice)&&M.wear_mask:vchange)//Can't forget the ninjas.
|
||||
name_used = M.wear_mask:voice
|
||||
var/name_used = M.GetVoice()
|
||||
//This communication is imperfect because the holopad "filters" voices and is only designed to connect to the master only.
|
||||
var/rendered = "<i><span class='game say'>Holopad received, <span class='name'>[name_used]</span> <span class='message'>[M.say_quote(text)]</span></span></i>"
|
||||
master.show_message(rendered, 2)
|
||||
|
||||
@@ -194,11 +194,11 @@ obj/machinery/hydroponics/proc/updateicon()
|
||||
if(src.harvest)
|
||||
overlays += image('icons/obj/hydroponics.dmi', icon_state="over_harvest3")
|
||||
|
||||
if(!luminosity)
|
||||
if(istype(myseed,/obj/item/seeds/glowshroom))
|
||||
SetLuminosity(round(myseed.potency/10))
|
||||
if(istype(myseed,/obj/item/seeds/glowshroom))
|
||||
SetLuminosity(round(myseed.potency/10))
|
||||
else
|
||||
SetLuminosity(0)
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
||||
@@ -202,8 +202,7 @@ Class Procs:
|
||||
if (ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(H.getBrainLoss() >= 60)
|
||||
for(var/mob/M in viewers(src, null))
|
||||
M << "\red [H] stares cluelessly at [src] and drools."
|
||||
visible_message("\red [H] stares cluelessly at [src] and drools.")
|
||||
return 1
|
||||
else if(prob(H.getBrainLoss()))
|
||||
user << "\red You momentarily forget how to use [src]."
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
<A href='?src=\ref[src];make=2;dir=1'>Pipe</A><BR>
|
||||
<A href='?src=\ref[src];make=3;dir=5'>Bent Pipe</A><BR>
|
||||
<A href='?src=\ref[src];make=6;dir=1'>Junction</A><BR>
|
||||
<A href='?src=\ref[src];make=9;dir=17'>Heat Exchanger</A><BR>
|
||||
<A href='?src=\ref[src];make=17;dir=1'>Heat Exchanger</A><BR>
|
||||
<b>Insulated pipes:</b><BR>
|
||||
<A href='?src=\ref[src];make=11;dir=1'>Pipe</A><BR>
|
||||
<A href='?src=\ref[src];make=12;dir=5'>Bent Pipe</A><BR>
|
||||
|
||||
@@ -1,22 +1,21 @@
|
||||
/obj/machinery/seed_extractor
|
||||
name = "Seed Extractor"
|
||||
desc = "Extracts seeds from produce"
|
||||
name = "seed extractor"
|
||||
desc = "Extracts and bags seeds from produce."
|
||||
icon = 'icons/obj/hydroponics.dmi'
|
||||
icon_state = "sextractor"
|
||||
density = 1
|
||||
anchored = 1
|
||||
|
||||
obj/machinery/seed_extractor/attackby(var/obj/item/O as obj, var/mob/user as mob)
|
||||
|
||||
//Called when mob user "attacks" it with object O
|
||||
if (istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown/))
|
||||
if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown/))
|
||||
var/obj/item/weapon/reagent_containers/food/snacks/grown/F = O
|
||||
user << "\blue You extract some seeds from the [F.name]"
|
||||
user.drop_item()
|
||||
user << "<span class='notice'>You extract some seeds from the [F.name].</span>"
|
||||
var/seed = text2path(F.seed)
|
||||
var/t_amount = 0
|
||||
var/t_max = rand(1,4)
|
||||
while ( t_amount < t_max)
|
||||
var/obj/item/seeds/t_prod = new seed(src.loc)
|
||||
while(t_amount < t_max)
|
||||
var/obj/item/seeds/t_prod = new seed(loc)
|
||||
t_prod.species = F.species
|
||||
t_prod.lifespan = F.lifespan
|
||||
t_prod.endurance = F.endurance
|
||||
@@ -27,14 +26,15 @@ obj/machinery/seed_extractor/attackby(var/obj/item/O as obj, var/mob/user as mob
|
||||
t_amount++
|
||||
del(O)
|
||||
|
||||
else if (istype(O, /obj/item/weapon/grown/))
|
||||
else if(istype(O, /obj/item/weapon/grown/))
|
||||
var/obj/item/weapon/grown/F = O
|
||||
user << "\blue You extract some seeds from the [F.name]"
|
||||
user.drop_item()
|
||||
user << "<span class='notice'>You extract some seeds from the [F.name].</span>"
|
||||
var/seed = text2path(F.seed)
|
||||
var/t_amount = 0
|
||||
var/t_max = rand(1,4)
|
||||
while ( t_amount < t_max)
|
||||
var/obj/item/seeds/t_prod = new seed(src.loc)
|
||||
while(t_amount < t_max)
|
||||
var/obj/item/seeds/t_prod = new seed(loc)
|
||||
t_prod.species = F.species
|
||||
t_prod.lifespan = F.lifespan
|
||||
t_prod.endurance = F.endurance
|
||||
|
||||
@@ -57,8 +57,7 @@
|
||||
|
||||
|
||||
if (src.health <= 0)
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message("\blue The [src] dissapates")
|
||||
visible_message("\blue The [src] dissapates")
|
||||
del(src)
|
||||
return
|
||||
|
||||
@@ -71,8 +70,7 @@
|
||||
src.health -= max_health*0.75 //3/4 health as damage
|
||||
|
||||
if(src.health <= 0)
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message("\blue The [src] dissapates")
|
||||
visible_message("\blue The [src] dissapates")
|
||||
del(src)
|
||||
return
|
||||
|
||||
@@ -84,8 +82,7 @@
|
||||
health -= Proj.damage
|
||||
..()
|
||||
if(health <=0)
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message("\blue The [src] dissapates")
|
||||
visible_message("\blue The [src] dissapates")
|
||||
del(src)
|
||||
return
|
||||
opacity = 1
|
||||
@@ -118,8 +115,7 @@
|
||||
|
||||
/obj/machinery/shield/hitby(AM as mob|obj)
|
||||
//Let everyone know we've been hit!
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message("\red <B>[src] was hit by [AM].</B>", 1)
|
||||
visible_message("\red <B>[src] was hit by [AM].</B>")
|
||||
|
||||
//Super realistic, resource-intensive, real-time damage calculations.
|
||||
var/tforce = 0
|
||||
@@ -135,8 +131,7 @@
|
||||
|
||||
//Handle the destruction of the shield
|
||||
if (src.health <= 0)
|
||||
for(var/mob/O in viewers(src, null))
|
||||
O.show_message("\blue The [src] dissapates")
|
||||
visible_message("\blue The [src] dissapates")
|
||||
del(src)
|
||||
return
|
||||
|
||||
@@ -521,10 +516,7 @@
|
||||
|
||||
else
|
||||
src.add_fingerprint(user)
|
||||
user << "\red You hit the [src.name] with your [W.name]!"
|
||||
for(var/mob/M in viewers(src))
|
||||
if(M == user) continue
|
||||
M.show_message("\red The [src.name] has been hit with the [W.name] by [user.name]!")
|
||||
visible_message("\red The [src.name] has been hit with the [W.name] by [user.name]!")
|
||||
|
||||
/obj/machinery/shieldwallgen/proc/cleanup(var/NSEW)
|
||||
var/obj/machinery/shieldwall/F
|
||||
|
||||
@@ -1,186 +0,0 @@
|
||||
//Copied from the constructable frame code to make this a hell of a lot easier.
|
||||
|
||||
/obj/machinery/small_constructable_frame //Made into a seperate type to make future revisions easier.
|
||||
name = "small machine frame"
|
||||
icon = 'stock_parts.dmi'
|
||||
icon_state = "sbox_0"
|
||||
density = 1
|
||||
anchored = 1
|
||||
use_power = 0
|
||||
var/obj/item/weapon/circuitboard/circuit = null
|
||||
var/list/components = null
|
||||
var/list/req_components = null
|
||||
var/list/req_component_names = null
|
||||
var/state = 1
|
||||
|
||||
proc/update_desc()
|
||||
var/D
|
||||
if(req_components)
|
||||
D = "Requires "
|
||||
var/first = 1
|
||||
for(var/I in req_components)
|
||||
if(req_components[I] > 0)
|
||||
D += "[first?"":", "][num2text(req_components[I])] [req_component_names[I]]"
|
||||
first = 0
|
||||
if(first) // nothing needs to be added, then
|
||||
D += "nothing, use a screwdriver to finish it up."
|
||||
D += "."
|
||||
desc = D
|
||||
|
||||
/obj/machinery/small_constructable_frame
|
||||
attackby(obj/item/P as obj, mob/user as mob)
|
||||
if(P.crit_fail)
|
||||
user << "\red This part is faulty, you cannot add this to the machine!"
|
||||
return
|
||||
switch(state)
|
||||
if(1)
|
||||
if(istype(P, /obj/item/weapon/cable_coil))
|
||||
if(P:amount >= 5)
|
||||
playsound(src.loc, 'Deconstruct.ogg', 50, 1)
|
||||
user << "\blue You start to add cables to the frame."
|
||||
if(do_after(user, 20))
|
||||
P:amount -= 5
|
||||
if(!P:amount) del(P)
|
||||
user << "\blue You add cables to the frame."
|
||||
state = 2
|
||||
icon_state = "sbox_1"
|
||||
if(istype(P, /obj/item/weapon/wrench))
|
||||
playsound(src.loc, 'Ratchet.ogg', 75, 1)
|
||||
user << "\blue You dismantle the frame"
|
||||
new /obj/item/stack/sheet/metal(src.loc, 5)
|
||||
del(src)
|
||||
if(2)
|
||||
if(istype(P, /obj/item/weapon/circuitboard))
|
||||
var/obj/item/weapon/circuitboard/B = P
|
||||
if(B.board_type == "smachine")
|
||||
playsound(src.loc, 'Deconstruct.ogg', 50, 1)
|
||||
user << "\blue You add the circuit board to the frame."
|
||||
circuit = P
|
||||
user.drop_item()
|
||||
P.loc = src
|
||||
icon_state = "sbox_2"
|
||||
state = 3
|
||||
components = list()
|
||||
req_components = circuit.req_components.Copy()
|
||||
for(var/A in circuit.req_components)
|
||||
req_components[A] = circuit.req_components[A]
|
||||
req_component_names = circuit.req_components.Copy()
|
||||
for(var/A in req_components)
|
||||
var/cp = text2path(A)
|
||||
var/obj/ct = new cp() // have to quickly instantiate it get name
|
||||
req_component_names[A] = ct.name
|
||||
if(circuit.frame_desc)
|
||||
desc = circuit.frame_desc
|
||||
else
|
||||
update_desc()
|
||||
user << desc
|
||||
else
|
||||
user << "\red This frame does not accept circuit boards of this type!"
|
||||
if(istype(P, /obj/item/weapon/wirecutters))
|
||||
playsound(src.loc, 'wirecutter.ogg', 50, 1)
|
||||
user << "\blue You remove the cables."
|
||||
state = 1
|
||||
icon_state = "sbox_0"
|
||||
var/obj/item/weapon/cable_coil/A = new /obj/item/weapon/cable_coil( src.loc )
|
||||
A.amount = 5
|
||||
|
||||
if(3)
|
||||
if(istype(P, /obj/item/weapon/crowbar))
|
||||
playsound(src.loc, 'Crowbar.ogg', 50, 1)
|
||||
state = 2
|
||||
circuit.loc = src.loc
|
||||
circuit = null
|
||||
if(components.len == 0)
|
||||
user << "\blue You remove the circuit board."
|
||||
else
|
||||
user << "\blue You remove the circuit board and other components."
|
||||
for(var/obj/item/weapon/W in components)
|
||||
W.loc = src.loc
|
||||
desc = initial(desc)
|
||||
req_components = null
|
||||
components = null
|
||||
icon_state = "sbox_1"
|
||||
|
||||
if(istype(P, /obj/item/weapon/screwdriver))
|
||||
var/component_check = 1
|
||||
for(var/R in req_components)
|
||||
if(req_components[R] > 0)
|
||||
component_check = 0
|
||||
break
|
||||
if(component_check)
|
||||
playsound(src.loc, 'Screwdriver.ogg', 50, 1)
|
||||
var/obj/machinery/new_machine = new src.circuit.build_path(src.loc)
|
||||
for(var/obj/O in new_machine.component_parts)
|
||||
del(O)
|
||||
new_machine.component_parts = list()
|
||||
for(var/obj/O in src)
|
||||
if(circuit.contain_parts) // things like disposal don't want their parts in them
|
||||
O.loc = new_machine
|
||||
else
|
||||
O.loc = null
|
||||
new_machine.component_parts += O
|
||||
if(circuit.contain_parts)
|
||||
circuit.loc = new_machine
|
||||
else
|
||||
circuit.loc = null
|
||||
new_machine.RefreshParts()
|
||||
del(src)
|
||||
|
||||
if(istype(P, /obj/item/weapon))
|
||||
for(var/I in req_components)
|
||||
if(istype(P, text2path(I)) && (req_components[I] > 0))
|
||||
playsound(src.loc, 'Deconstruct.ogg', 50, 1)
|
||||
if(istype(P, /obj/item/weapon/cable_coil))
|
||||
var/obj/item/weapon/cable_coil/CP = P
|
||||
if(CP.amount > 1)
|
||||
var/camt = min(CP.amount, req_components[I]) // amount of cable to take, idealy amount required, but limited by amount provided
|
||||
var/obj/item/weapon/cable_coil/CC = new /obj/item/weapon/cable_coil(src)
|
||||
CC.amount = camt
|
||||
CC.update_icon()
|
||||
CP.use(camt)
|
||||
components += CC
|
||||
req_components[I] -= camt
|
||||
update_desc()
|
||||
break
|
||||
user.drop_item()
|
||||
P.loc = src
|
||||
components += P
|
||||
req_components[I]--
|
||||
update_desc()
|
||||
break
|
||||
user << desc
|
||||
if(P.loc != src && !istype(P, /obj/item/weapon/cable_coil))
|
||||
user << "\red You cannot add that component to the machine!"
|
||||
|
||||
|
||||
//Machine Frame Circuit Boards
|
||||
/*Common Parts: Parts List: Ignitor, Timer, Infra-red laser, Infra-red sensor, t_scanner, Capacitor, Valve, sensor unit,
|
||||
micro-manipulator, console screen, beaker, Microlaser, matter bin, power cells.
|
||||
Note: Once everything is added to the public areas, will add m_amt and g_amt to circuit boards since autolathe won't be able
|
||||
to destroy them and players will be able to make replacements.
|
||||
*/
|
||||
|
||||
/obj/item/weapon/circuitboard/recharger
|
||||
name = "Circuit board (recharger)"
|
||||
build_path = "/obj/machinery/recharger"
|
||||
board_type = "smachine"
|
||||
origin_tech = "engineering=2;powerstorage=3"
|
||||
frame_desc = "Requires 1 Manipulator, 2 capacitors, and 1 cable coil"
|
||||
req_components = list(
|
||||
"/obj/item/weapon/stock_parts/manipulator" = 1,
|
||||
"/obj/item/weapon/cable_coil" = 1,
|
||||
"/obj/item/weapon/stock_parts/capacitor" = 2)
|
||||
|
||||
/obj/item/weapon/circuitboard/cellrecharger
|
||||
name = "Circuit board (cell recharger)"
|
||||
build_path = "/obj/machinery/cell_charger"
|
||||
board_type = "smachine"
|
||||
origin_tech = "engineering=2;powerstorage=2"
|
||||
frame_desc = "Requires 1 Manipulator, 2 capacitors, and 1 cable coil"
|
||||
req_components = list(
|
||||
"/obj/item/weapon/stock_parts/manipulator" = 1,
|
||||
"/obj/item/weapon/cable_coil" = 1,
|
||||
"/obj/item/weapon/stock_parts/capacitor" = 2)
|
||||
|
||||
|
||||
|
||||
@@ -353,8 +353,7 @@
|
||||
src.SUIT = null
|
||||
if(src.MASK)
|
||||
src.MASK = null
|
||||
for (var/mob/V in viewers(user))
|
||||
V.show_message("<font color='red'>With a loud whining noise, the Suit Storage Unit's door grinds open. Puffs of ashen smoke come out of its chamber.</font>", 3)
|
||||
visible_message("<font color='red'>With a loud whining noise, the Suit Storage Unit's door grinds open. Puffs of ashen smoke come out of its chamber.</font>", 3)
|
||||
src.isbroken = 1
|
||||
src.isopen = 1
|
||||
src.islocked = 0
|
||||
@@ -449,8 +448,7 @@
|
||||
if ( (src.OCCUPANT) || (src.HELMET) || (src.SUIT) )
|
||||
usr << "<font color='red'>It's too cluttered inside for you to fit in!</font>"
|
||||
return
|
||||
for (var/mob/V in viewers(usr))
|
||||
V.show_message("[usr] starts squeezing into the suit storage unit!", 3)
|
||||
visible_message("[usr] starts squeezing into the suit storage unit!", 3)
|
||||
if(do_after(usr, 10))
|
||||
usr.stop_pulling()
|
||||
usr.client.perspective = EYE_PERSPECTIVE
|
||||
@@ -494,8 +492,7 @@
|
||||
if ( (src.OCCUPANT) || (src.HELMET) || (src.SUIT) ) //Unit needs to be absolutely empty
|
||||
user << "<font color='red'>The unit's storage area is too cluttered.</font>"
|
||||
return
|
||||
for (var/mob/V in viewers(user))
|
||||
V.show_message("[user] starts putting [G.affecting.name] into the Suit Storage Unit.", 3)
|
||||
visible_message("[user] starts putting [G.affecting.name] into the Suit Storage Unit.", 3)
|
||||
if(do_after(user, 20))
|
||||
if(!G || !G.affecting) return //derpcheck
|
||||
var/mob/M = G.affecting
|
||||
|
||||
@@ -400,13 +400,17 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
|
||||
|
||||
|
||||
else // the signal has been decompressed by a processor unit
|
||||
// send to all linked server units
|
||||
var/sendserver = relay_information(signal, "/obj/machinery/telecomms/server")
|
||||
|
||||
// Can't send to a single server, send to a hub instead!
|
||||
if(!sendserver)
|
||||
signal.data["slow"] += rand(0, 1) // slow the signal down only slightly
|
||||
relay_information(signal, "/obj/machinery/telecomms/hub")
|
||||
// Try sending it!
|
||||
var/list/try_send = list("/obj/machinery/telecomms/server", "/obj/machinery/telecomms/hub", "/obj/machinery/telecomms/broadcaster")
|
||||
var/i = 0
|
||||
for(var/send in try_send)
|
||||
if(i)
|
||||
signal.data["slow"] += rand(0, 1) // slow the signal down only slightly
|
||||
i++
|
||||
var/can_send = relay_information(signal, send)
|
||||
if(can_send)
|
||||
break
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -33,16 +33,27 @@
|
||||
|
||||
|
||||
if(istype(L, /obj/effect/landmark/) && istype(L.loc, /turf))
|
||||
src.locked = L
|
||||
one_time_use = 1
|
||||
|
||||
usr << "You insert the coordinates into the machine."
|
||||
usr << "A message flashes across the screen reminding the traveller that the nuclear authentication disk is to remain on the station at all times."
|
||||
user.drop_item()
|
||||
del(I)
|
||||
|
||||
for(var/mob/O in hearers(src, null))
|
||||
O.show_message("\blue Locked In", 2)
|
||||
if(C.data == "Clown Land")
|
||||
//whoops
|
||||
for(var/mob/O in hearers(src, null))
|
||||
O.show_message("\red Incoming bluespace portal detected, unable to lock in.", 2)
|
||||
|
||||
for(var/obj/machinery/teleport/hub/H in range(1))
|
||||
var/amount = rand(2,5)
|
||||
for(var/i=0;i<amount;i++)
|
||||
new /mob/living/simple_animal/hostile/carp(get_turf(H))
|
||||
//
|
||||
else
|
||||
for(var/mob/O in hearers(src, null))
|
||||
O.show_message("\blue Locked In", 2)
|
||||
src.locked = L
|
||||
one_time_use = 1
|
||||
|
||||
src.add_fingerprint(usr)
|
||||
else
|
||||
..()
|
||||
|
||||
@@ -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
|
||||
@@ -401,9 +401,7 @@
|
||||
/obj/machinery/turret/attack_animal(mob/living/simple_animal/M as mob)
|
||||
if(M.melee_damage_upper == 0) return
|
||||
if(!(stat & BROKEN))
|
||||
for(var/mob/O in viewers(src, null))
|
||||
if ((O.client && !( O.blinded )))
|
||||
O.show_message(text("\red <B>[M] [M.attacktext] [src]!</B>"), 1)
|
||||
visible_message("\red <B>[M] [M.attacktext] [src]!</B>")
|
||||
M.attack_log += text("\[[time_stamp()]\] <font color='red'>attacked [src.name]</font>")
|
||||
//src.attack_log += text("\[[time_stamp()]\] <font color='orange'>was attacked by [M.name] ([M.ckey])</font>")
|
||||
src.health -= M.melee_damage_upper
|
||||
@@ -419,9 +417,7 @@
|
||||
/obj/machinery/turret/attack_alien(mob/living/carbon/alien/humanoid/M as mob)
|
||||
if(!(stat & BROKEN))
|
||||
playsound(src.loc, 'sound/weapons/slash.ogg', 25, 1, -1)
|
||||
for(var/mob/O in viewers(src, null))
|
||||
if ((O.client && !( O.blinded )))
|
||||
O.show_message(text("\red <B>[] has slashed at []!</B>", M, src), 1)
|
||||
visible_message("\red <B>[] has slashed at []!</B>", M, src)
|
||||
src.health -= 15
|
||||
if (src.health <= 0)
|
||||
src.die()
|
||||
|
||||
@@ -1,240 +0,0 @@
|
||||
var/global/datum/controller/game_controller/master_controller //Set in world.New()
|
||||
var/global/datum/failsafe/Failsafe
|
||||
var/global/controllernum = "no"
|
||||
var/global/controller_iteration = 0
|
||||
|
||||
|
||||
var/global/last_tick_timeofday = world.timeofday
|
||||
var/global/last_tick_duration = 0
|
||||
|
||||
datum/controller/game_controller
|
||||
var/processing = 1
|
||||
|
||||
var/global/air_master_ready = 0
|
||||
var/global/sun_ready = 0
|
||||
var/global/mobs_ready = 0
|
||||
var/global/diseases_ready = 0
|
||||
var/global/machines_ready = 0
|
||||
var/global/objects_ready = 0
|
||||
var/global/networks_ready = 0
|
||||
var/global/powernets_ready = 0
|
||||
var/global/ticker_ready = 0
|
||||
var/global/next_crew_shuttle_vote = 2 // the next automatic vote to call the crew shuttle
|
||||
|
||||
//Used for MC 'proc break' debugging
|
||||
var/global/obj/last_obj_processed
|
||||
var/global/datum/disease/last_disease_processed
|
||||
var/global/obj/machinery/last_machine_processed
|
||||
var/global/mob/last_mob_processed
|
||||
|
||||
|
||||
proc/setup()
|
||||
if(master_controller && (master_controller != src))
|
||||
del(src)
|
||||
return
|
||||
//There can be only one master.
|
||||
|
||||
if(!air_master)
|
||||
air_master = new /datum/controller/air_system()
|
||||
air_master.setup()
|
||||
|
||||
if(!job_master)
|
||||
job_master = new /datum/controller/occupations()
|
||||
if(job_master.SetupOccupations())
|
||||
world << "\red \b Job setup complete"
|
||||
job_master.LoadJobs("config/jobs.txt")
|
||||
|
||||
world.tick_lag = config.Ticklag
|
||||
|
||||
createRandomZlevel()
|
||||
|
||||
setup_objects()
|
||||
|
||||
setupgenetics()
|
||||
|
||||
|
||||
/*for(var/i = 0, i < max_secret_rooms, i++)
|
||||
make_mining_asteroid_secret()*/
|
||||
|
||||
syndicate_code_phrase = generate_code_phrase()//Sets up code phrase for traitors, for the round.
|
||||
syndicate_code_response = generate_code_phrase()
|
||||
|
||||
emergency_shuttle = new /datum/shuttle_controller/emergency_shuttle()
|
||||
|
||||
if(!ticker)
|
||||
ticker = new /datum/controller/gameticker()
|
||||
|
||||
setupfactions()
|
||||
|
||||
spawn
|
||||
ticker.pregame()
|
||||
|
||||
proc/setup_objects()
|
||||
world << "\red \b Initializing objects"
|
||||
sleep(-1)
|
||||
|
||||
for(var/obj/object in world)
|
||||
object.initialize()
|
||||
|
||||
world << "\red \b Initializing pipe networks"
|
||||
sleep(-1)
|
||||
|
||||
for(var/obj/machinery/atmospherics/machine in world)
|
||||
machine.build_network()
|
||||
|
||||
world << "\red \b Initializing atmos machinery."
|
||||
sleep(-1)
|
||||
for(var/obj/machinery/atmospherics/unary/vent_pump/T in world)
|
||||
T.broadcast_status()
|
||||
for(var/obj/machinery/atmospherics/unary/vent_scrubber/T in world)
|
||||
T.broadcast_status()
|
||||
|
||||
world << "\red \b Initializations complete."
|
||||
|
||||
proc/set_debug_state(txt)
|
||||
// This should describe what is currently being done by the master controller
|
||||
// Useful for crashlogs and similar, because that way it's easy to tell what
|
||||
// was going on when the server crashed.
|
||||
socket_talk.send_raw("type=ticker_state&message=[txt]")
|
||||
return
|
||||
|
||||
|
||||
proc/process()
|
||||
|
||||
var/currenttime = world.timeofday
|
||||
var/diff = (currenttime - last_tick_timeofday) / 10
|
||||
last_tick_timeofday = currenttime
|
||||
last_tick_duration = diff
|
||||
|
||||
if(!processing)
|
||||
return 0
|
||||
controllernum = "yes"
|
||||
spawn (100)
|
||||
controllernum = "no"
|
||||
|
||||
controller_iteration++
|
||||
|
||||
var/start_time = world.timeofday
|
||||
|
||||
// Start an automatic crew shuttle vote every hour starting with the second hour
|
||||
if(world.time > 10 * 60 * 60 * next_crew_shuttle_vote)
|
||||
next_crew_shuttle_vote++
|
||||
automatic_crew_shuttle_vote()
|
||||
|
||||
air_master_ready = 0
|
||||
sun_ready = 0
|
||||
mobs_ready = 0
|
||||
diseases_ready = 0
|
||||
machines_ready = 0
|
||||
objects_ready = 0
|
||||
networks_ready = 0
|
||||
powernets_ready = 0
|
||||
ticker_ready = 0
|
||||
|
||||
spawn(0)
|
||||
src.set_debug_state("Air Master")
|
||||
air_master.tick()
|
||||
air_master_ready = 1
|
||||
|
||||
sleep(1)
|
||||
|
||||
spawn(0)
|
||||
src.set_debug_state("Sun Position Calculations")
|
||||
sun.calc_position()
|
||||
sun_ready = 1
|
||||
|
||||
sleep(-1)
|
||||
|
||||
spawn(0)
|
||||
src.set_debug_state("Mob Processing")
|
||||
for(var/mob/M in world)
|
||||
last_mob_processed = M
|
||||
M.Life()
|
||||
mobs_ready = 1
|
||||
|
||||
|
||||
|
||||
sleep(-1)
|
||||
|
||||
|
||||
spawn(0)
|
||||
src.set_debug_state("Disease Processing")
|
||||
for(var/datum/disease/D in active_diseases)
|
||||
last_disease_processed = D
|
||||
D.process()
|
||||
diseases_ready = 1
|
||||
|
||||
spawn(0)
|
||||
src.set_debug_state("Machinery Processing")
|
||||
for(var/obj/machinery/machine in machines)
|
||||
if(machine)
|
||||
last_machine_processed = machine
|
||||
machine.process()
|
||||
if(machine && machine.use_power)
|
||||
machine.auto_use_power()
|
||||
|
||||
machines_ready = 1
|
||||
|
||||
sleep(-1)
|
||||
sleep(1)
|
||||
|
||||
spawn(0)
|
||||
src.set_debug_state("Object Processing")
|
||||
for(var/obj/object in processing_objects)
|
||||
last_obj_processed = object
|
||||
object.process()
|
||||
objects_ready = 1
|
||||
|
||||
spawn(0)
|
||||
src.set_debug_state("Pipe Network Processing")
|
||||
for(var/datum/pipe_network/network in pipe_networks)
|
||||
network.process()
|
||||
networks_ready = 1
|
||||
|
||||
spawn(0)
|
||||
src.set_debug_state("Powernet Processing")
|
||||
for(var/datum/powernet/P in powernets)
|
||||
P.reset()
|
||||
powernets_ready = 1
|
||||
|
||||
sleep(-1)
|
||||
|
||||
spawn(0)
|
||||
ticker.process()
|
||||
ticker_ready = 1
|
||||
|
||||
sleep(world.timeofday+12-start_time)
|
||||
|
||||
var/IL_check = 0 //Infinite loop check (To report when the master controller breaks.)
|
||||
while(!air_master_ready || !sun_ready || !mobs_ready || !diseases_ready || !machines_ready || !objects_ready || !networks_ready || !powernets_ready || !ticker_ready)
|
||||
IL_check++
|
||||
if(IL_check > 600)
|
||||
var/MC_report = "air_master_ready = [air_master_ready]; sun_ready = [sun_ready]; mobs_ready = [mobs_ready]; diseases_ready = [diseases_ready]; machines_ready = [machines_ready]; objects_ready = [objects_ready]; networks_ready = [networks_ready]; powernets_ready = [powernets_ready]; ticker_ready = [ticker_ready];"
|
||||
message_admins("<b><font color='red'>PROC BREAKAGE WARNING:</font> The game's master contorller appears to be stuck in one of it's cycles. It has looped through it's delaying loop [IL_check] times.</b>")
|
||||
message_admins("<b>The master controller reports: [MC_report]</b>")
|
||||
if(!diseases_ready)
|
||||
if(last_disease_processed)
|
||||
message_admins("<b>DISEASE PROCESSING stuck on </b><A HREF='?src=%holder_ref%;adminplayervars=\ref[last_disease_processed]'>[last_disease_processed]</A>", 0, 1)
|
||||
else
|
||||
message_admins("<b>DISEASE PROCESSING stuck on </b>unknown")
|
||||
if(!machines_ready)
|
||||
if(last_machine_processed)
|
||||
message_admins("<b>MACHINE PROCESSING stuck on </b><A HREF='?src=%holder_ref%;adminplayervars=\ref[last_machine_processed]'>[last_machine_processed]</A>", 0, 1)
|
||||
else
|
||||
message_admins("<b>MACHINE PROCESSING stuck on </b>unknown")
|
||||
if(!objects_ready)
|
||||
if(last_obj_processed)
|
||||
message_admins("<b>OBJ PROCESSING stuck on </b><A HREF='?src=ADMINHOLDERREF;adminplayervars=\ref[last_obj_processed]'>[last_obj_processed]</A>", 0, 1)
|
||||
else
|
||||
message_admins("<b>OBJ PROCESSING stuck on </b>unknown")
|
||||
log_admin("PROC BREAKAGE WARNING: infinite_loop_check = [IL_check]; [MC_report];")
|
||||
message_admins("<font color='red'><b>Master controller breaking out of delaying loop. Restarting the round is advised if problem persists. DO NOT manually restart the master controller.</b></font>")
|
||||
break;
|
||||
sleep(1)
|
||||
|
||||
|
||||
spawn
|
||||
process()
|
||||
|
||||
|
||||
return 1
|
||||
@@ -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"
|
||||
|
||||
@@ -105,9 +105,6 @@ proc/explosion_rec(turf/epicenter, power)
|
||||
/turf/simulated/wall
|
||||
explosion_resistance = 5
|
||||
|
||||
/turf/simulated/r_wall
|
||||
explosion_resistance = 25
|
||||
|
||||
/turf/simulated/wall/r_wall
|
||||
explosion_resistance = 25
|
||||
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
/obj/item/device/flashlight
|
||||
name = "flashlight"
|
||||
desc = "A hand-held emergency light."
|
||||
icon_state = "flight0"
|
||||
icon = 'icons/obj/lighting.dmi'
|
||||
icon_state = "flashlight"
|
||||
item_state = "flashlight"
|
||||
w_class = 2
|
||||
item_state = "flight"
|
||||
flags = FPRINT | TABLEPASS | CONDUCT
|
||||
slot_flags = SLOT_BELT
|
||||
m_amt = 50
|
||||
@@ -11,35 +12,33 @@
|
||||
icon_action_button = "action_flashlight"
|
||||
var/on = 0
|
||||
var/brightness_on = 4 //luminosity when on
|
||||
var/icon_on = "flight1"
|
||||
var/icon_off = "flight0"
|
||||
|
||||
/obj/item/device/flashlight/initialize()
|
||||
..()
|
||||
if (on)
|
||||
icon_state = icon_on
|
||||
src.SetLuminosity(brightness_on)
|
||||
if(on)
|
||||
icon_state = "[initial(icon_state)]-on"
|
||||
SetLuminosity(brightness_on)
|
||||
else
|
||||
icon_state = icon_off
|
||||
src.SetLuminosity(0)
|
||||
icon_state = initial(icon_state)
|
||||
SetLuminosity(0)
|
||||
|
||||
/obj/item/device/flashlight/proc/update_brightness(var/mob/user = null)
|
||||
if(on)
|
||||
icon_state = icon_on
|
||||
if(src.loc == user)
|
||||
icon_state = "[initial(icon_state)]-on"
|
||||
if(loc == user)
|
||||
user.SetLuminosity(user.luminosity + brightness_on)
|
||||
else if(isturf(loc))
|
||||
SetLuminosity(brightness_on)
|
||||
else
|
||||
icon_state = icon_off
|
||||
if(src.loc == user)
|
||||
icon_state = initial(icon_state)
|
||||
if(loc == user)
|
||||
user.SetLuminosity(user.luminosity - brightness_on)
|
||||
else if(isturf(loc))
|
||||
SetLuminosity(0)
|
||||
|
||||
/obj/item/device/flashlight/attack_self(mob/user)
|
||||
if(!isturf(user.loc))
|
||||
user << "You cannot turn the light on while in this [user.loc]" //To prevent some lighting anomalities.
|
||||
user << "You cannot turn the light on while in this [user.loc]." //To prevent some lighting anomalities.
|
||||
return
|
||||
on = !on
|
||||
update_brightness(user)
|
||||
@@ -47,37 +46,43 @@
|
||||
|
||||
|
||||
/obj/item/device/flashlight/attack(mob/living/M as mob, mob/living/user as mob)
|
||||
src.add_fingerprint(user)
|
||||
if(src.on && user.zone_sel.selecting == "eyes")
|
||||
add_fingerprint(user)
|
||||
if(on && user.zone_sel.selecting == "eyes")
|
||||
|
||||
if (((CLUMSY in user.mutations) || user.getBrainLoss() >= 60) && prob(50))//too dumb to use flashlight properly
|
||||
return ..()//just hit them in the head
|
||||
if(((CLUMSY in user.mutations) || user.getBrainLoss() >= 60) && prob(50)) //too dumb to use flashlight properly
|
||||
return ..() //just hit them in the head
|
||||
|
||||
if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")//don't have dexterity
|
||||
usr.show_message("\red You don't have the dexterity to do this!",1)
|
||||
if(!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") //don't have dexterity
|
||||
user << "<span class='notice'>You don't have the dexterity to do this!</span>"
|
||||
return
|
||||
|
||||
var/mob/living/carbon/human/H = M//mob has protective eyewear
|
||||
var/mob/living/carbon/human/H = M //mob has protective eyewear
|
||||
if(istype(M, /mob/living/carbon/human) && ((H.head && H.head.flags & HEADCOVERSEYES) || (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || (H.glasses && H.glasses.flags & GLASSESCOVERSEYES)))
|
||||
user << text("\blue You're going to need to remove that [] first.", ((H.head && H.head.flags & HEADCOVERSEYES) ? "helmet" : ((H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) ? "mask": "glasses")))
|
||||
user << "<span class='notice'>You're going to need to remove that [(H.head && H.head.flags & HEADCOVERSEYES) ? "helmet" : (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) ? "mask": "glasses"] first.</span>"
|
||||
return
|
||||
|
||||
for(var/mob/O in viewers(M, null))//echo message
|
||||
if ((O.client && !(O.blinded )))
|
||||
O.show_message("\blue [(O==user?"You direct":"[user] directs")] [src] to [(M==user? "your":"[M]")] eyes", 1)
|
||||
if(M == user) //they're using it on themselves
|
||||
if(!M.blinded)
|
||||
flick("flash", M.flash)
|
||||
M.visible_message("<span class='notice'>[M] directs [src] to \his eyes.</span>", \
|
||||
"<span class='notice'>You wave the light in front of your eyes! Trippy!</span>")
|
||||
else
|
||||
M.visible_message("<span class='notice'>[M] directs [src] to \his eyes.</span>", \
|
||||
"<span class='notice'>You wave the light in front of your eyes.</span>")
|
||||
return
|
||||
|
||||
if(istype(M, /mob/living/carbon/human) || istype(M, /mob/living/carbon/monkey))//robots and aliens are unaffected
|
||||
if(M.stat == DEAD || M.sdisabilities & BLIND)//mob is dead or fully blind
|
||||
if(M!=user)
|
||||
user.show_message("\red [M] pupils does not react to the light!",1)
|
||||
else if(XRAY in M.mutations)//mob has X-RAY vision
|
||||
if(M!=user)
|
||||
user.show_message("\red [M] pupils give an eerie glow!",1)
|
||||
else //nothing wrong
|
||||
user.visible_message("<span class='notice'>[user] directs [src] to [M]'s eyes.</span>", \
|
||||
"<span class='notice'>You direct [src] to [M]'s eyes.</span>")
|
||||
|
||||
if(istype(M, /mob/living/carbon/human) || istype(M, /mob/living/carbon/monkey)) //robots and aliens are unaffected
|
||||
if(M.stat == DEAD || M.sdisabilities & BLIND) //mob is dead or fully blind
|
||||
user << "<span class='notice'>[M] pupils does not react to the light!</span>"
|
||||
else if(XRAY in M.mutations) //mob has X-RAY vision
|
||||
user << "<span class='notice'>[M] pupils give an eerie glow!</span>"
|
||||
else //they're okay!
|
||||
if(!M.blinded)
|
||||
flick("flash", M.flash)//flash the affected mob
|
||||
if(M!=user)
|
||||
user.show_message("\blue [M] pupils narrow",1)
|
||||
flick("flash", M.flash) //flash the affected mob
|
||||
user << "<span class='notice'>[M]'s pupils narrow.</span>"
|
||||
else
|
||||
return ..()
|
||||
|
||||
@@ -96,69 +101,34 @@
|
||||
|
||||
/obj/item/device/flashlight/pen
|
||||
name = "penlight"
|
||||
desc = "A pen-sized light. It shines as well as a flashlight."
|
||||
icon_state = "plight0"
|
||||
flags = FPRINT | TABLEPASS | CONDUCT
|
||||
desc = "A pen-sized light, used by medical staff."
|
||||
icon_state = "penlight"
|
||||
item_state = ""
|
||||
icon_on = "plight1"
|
||||
icon_off = "plight0"
|
||||
brightness_on = 3
|
||||
flags = FPRINT | TABLEPASS | CONDUCT
|
||||
brightness_on = 2
|
||||
|
||||
|
||||
|
||||
/obj/item/device/flashlight/pen/paralysis/attack(mob/M as mob, mob/user as mob)
|
||||
if(!ismob(M))
|
||||
return
|
||||
user << "\red You stab [M] with the pen."
|
||||
M << "\red You feel a tiny prick!"
|
||||
M.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been stabbed with [src.name] by [user.name] ([user.ckey])</font>")
|
||||
user.attack_log += text("\[[time_stamp()]\] <font color='red'>Used the [src.name] to stab [M.name] ([M.ckey])</font>")
|
||||
|
||||
log_attack("<font color='red'>[user.name] ([user.ckey]) Used the [src.name] to stab [M.name] ([M.ckey])</font>")
|
||||
|
||||
log_admin("ATTACK: [user.name] ([user.ckey]) Used the [src.name] to stab [M.name] ([M.ckey])")
|
||||
msg_admin_attack("ATTACK: [user.name] ([user.ckey]) Used the [src.name] to stab [M.name] ([M.ckey])") //BS12 EDIT ALG
|
||||
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/item/device/flashlight/pen/paralysis/New()
|
||||
var/datum/reagents/R = new/datum/reagents(15)
|
||||
reagents = R
|
||||
R.my_atom = src
|
||||
R.add_reagent("zombiepowder", 15)
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/item/device/flashlight/pen/paralysis/attack(mob/M as mob, mob/user as mob)
|
||||
if (!( istype(M, /mob) ))
|
||||
return
|
||||
..()
|
||||
if (reagents.total_volume)
|
||||
if(M.reagents) reagents.trans_to(M, 15)
|
||||
return
|
||||
|
||||
// the desk lamps are a bit special
|
||||
/obj/item/device/flashlight/lamp
|
||||
name = "desk lamp"
|
||||
desc = "A desk lamp"
|
||||
icon = 'icons/obj/lighting.dmi'
|
||||
icon_state = "lamp0"
|
||||
desc = "A desk lamp with an adjustable mount."
|
||||
icon_state = "lamp"
|
||||
item_state = "lamp"
|
||||
brightness_on = 5
|
||||
icon_on = "lamp1"
|
||||
icon_off = "lamp0"
|
||||
w_class = 4
|
||||
flags = FPRINT | TABLEPASS | CONDUCT
|
||||
m_amt = 0
|
||||
g_amt = 0
|
||||
on = 1
|
||||
|
||||
|
||||
// green-shaded desk lamp
|
||||
/obj/item/device/flashlight/lamp/green
|
||||
icon_state = "green0"
|
||||
icon_on = "green1"
|
||||
icon_off = "green0"
|
||||
desc = "A green-shaded desk lamp"
|
||||
desc = "A classic green-shaded desk lamp."
|
||||
icon_state = "lampgreen"
|
||||
item_state = "lampgreen"
|
||||
brightness_on = 5
|
||||
|
||||
|
||||
/obj/item/device/flashlight/lamp/verb/toggle_light()
|
||||
set name = "Toggle light"
|
||||
@@ -166,4 +136,59 @@
|
||||
set src in oview(1)
|
||||
|
||||
if(!usr.stat)
|
||||
attack_self(usr)
|
||||
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
|
||||
@@ -216,8 +216,7 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
|
||||
4, 0, 1)
|
||||
return
|
||||
|
||||
/obj/item/device/radio/talk_into(mob/M as mob, message, channel)
|
||||
|
||||
/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 +298,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 +470,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 +554,8 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
|
||||
if (length(heard_masked))
|
||||
var/N = M.name
|
||||
var/J = eqjobname
|
||||
if (istype(M.wear_mask, /obj/item/clothing/mask/gas/voice)&&M.wear_mask:vchange)
|
||||
//To properly have the ninja show up on radio. Could also be useful for similar items.
|
||||
//Would not be necessary but the mob could be wearing a mask that is not a voice changer.
|
||||
N = M.wear_mask:voice
|
||||
if(ishuman(M) && M.GetVoice() != M.real_name)
|
||||
N = M.GetVoice()
|
||||
J = "Unknown"
|
||||
var/rendered = "[part_a][N][part_b][quotedmsg][part_c]"
|
||||
for (var/mob/R in heard_masked)
|
||||
|
||||
@@ -19,175 +19,175 @@
|
||||
/*BYOND loads resource files at compile time if they are ''. This means you can't really manipulate them dynamically.
|
||||
Tried doing it dynamically at first but its more trouble than its worth. Would have saved many lines tho.*/
|
||||
switch(note)
|
||||
if("Cn1") soundfile = 'sound/violin/Cn1.ogg'
|
||||
if("C#1") soundfile = 'sound/violin/C#1.ogg'
|
||||
if("Db1") soundfile = 'sound/violin/Db1.ogg'
|
||||
if("Dn1") soundfile = 'sound/violin/Dn1.ogg'
|
||||
if("D#1") soundfile = 'sound/violin/D#1.ogg'
|
||||
if("Eb1") soundfile = 'sound/violin/Eb1.ogg'
|
||||
if("En1") soundfile = 'sound/violin/En1.ogg'
|
||||
if("E#1") soundfile = 'sound/violin/E#1.ogg'
|
||||
if("Fb1") soundfile = 'sound/violin/Fb1.ogg'
|
||||
if("Fn1") soundfile = 'sound/violin/Fn1.ogg'
|
||||
if("F#1") soundfile = 'sound/violin/F#1.ogg'
|
||||
if("Gb1") soundfile = 'sound/violin/Gb1.ogg'
|
||||
if("Gn1") soundfile = 'sound/violin/Gn1.ogg'
|
||||
if("G#1") soundfile = 'sound/violin/G#1.ogg'
|
||||
if("Ab1") soundfile = 'sound/violin/Ab1.ogg'
|
||||
if("An1") soundfile = 'sound/violin/An1.ogg'
|
||||
if("A#1") soundfile = 'sound/violin/A#1.ogg'
|
||||
if("Bb1") soundfile = 'sound/violin/Bb1.ogg'
|
||||
if("Bn1") soundfile = 'sound/violin/Bn1.ogg'
|
||||
if("B#1") soundfile = 'sound/violin/B#1.ogg'
|
||||
if("Cb2") soundfile = 'sound/violin/Cb2.ogg'
|
||||
if("Cn2") soundfile = 'sound/violin/Cn2.ogg'
|
||||
if("C#2") soundfile = 'sound/violin/C#2.ogg'
|
||||
if("Db2") soundfile = 'sound/violin/Db2.ogg'
|
||||
if("Dn2") soundfile = 'sound/violin/Dn2.ogg'
|
||||
if("D#2") soundfile = 'sound/violin/D#2.ogg'
|
||||
if("Eb2") soundfile = 'sound/violin/Eb2.ogg'
|
||||
if("En2") soundfile = 'sound/violin/En2.ogg'
|
||||
if("E#2") soundfile = 'sound/violin/E#2.ogg'
|
||||
if("Fb2") soundfile = 'sound/violin/Fb2.ogg'
|
||||
if("Fn2") soundfile = 'sound/violin/Fn2.ogg'
|
||||
if("F#2") soundfile = 'sound/violin/F#2.ogg'
|
||||
if("Gb2") soundfile = 'sound/violin/Gb2.ogg'
|
||||
if("Gn2") soundfile = 'sound/violin/Gn2.ogg'
|
||||
if("G#2") soundfile = 'sound/violin/G#2.ogg'
|
||||
if("Ab2") soundfile = 'sound/violin/Ab2.ogg'
|
||||
if("An2") soundfile = 'sound/violin/An2.ogg'
|
||||
if("A#2") soundfile = 'sound/violin/A#2.ogg'
|
||||
if("Bb2") soundfile = 'sound/violin/Bb2.ogg'
|
||||
if("Bn2") soundfile = 'sound/violin/Bn2.ogg'
|
||||
if("B#2") soundfile = 'sound/violin/B#2.ogg'
|
||||
if("Cb3") soundfile = 'sound/violin/Cb3.ogg'
|
||||
if("Cn3") soundfile = 'sound/violin/Cn3.ogg'
|
||||
if("C#3") soundfile = 'sound/violin/C#3.ogg'
|
||||
if("Db3") soundfile = 'sound/violin/Db3.ogg'
|
||||
if("Dn3") soundfile = 'sound/violin/Dn3.ogg'
|
||||
if("D#3") soundfile = 'sound/violin/D#3.ogg'
|
||||
if("Eb3") soundfile = 'sound/violin/Eb3.ogg'
|
||||
if("En3") soundfile = 'sound/violin/En3.ogg'
|
||||
if("E#3") soundfile = 'sound/violin/E#3.ogg'
|
||||
if("Fb3") soundfile = 'sound/violin/Fb3.ogg'
|
||||
if("Fn3") soundfile = 'sound/violin/Fn3.ogg'
|
||||
if("F#3") soundfile = 'sound/violin/F#3.ogg'
|
||||
if("Gb3") soundfile = 'sound/violin/Gb3.ogg'
|
||||
if("Gn3") soundfile = 'sound/violin/Gn3.ogg'
|
||||
if("G#3") soundfile = 'sound/violin/G#3.ogg'
|
||||
if("Ab3") soundfile = 'sound/violin/Ab3.ogg'
|
||||
if("An3") soundfile = 'sound/violin/An3.ogg'
|
||||
if("A#3") soundfile = 'sound/violin/A#3.ogg'
|
||||
if("Bb3") soundfile = 'sound/violin/Bb3.ogg'
|
||||
if("Bn3") soundfile = 'sound/violin/Bn3.ogg'
|
||||
if("B#3") soundfile = 'sound/violin/B#3.ogg'
|
||||
if("Cb4") soundfile = 'sound/violin/Cb4.ogg'
|
||||
if("Cn4") soundfile = 'sound/violin/Cn4.ogg'
|
||||
if("C#4") soundfile = 'sound/violin/C#4.ogg'
|
||||
if("Db4") soundfile = 'sound/violin/Db4.ogg'
|
||||
if("Dn4") soundfile = 'sound/violin/Dn4.ogg'
|
||||
if("D#4") soundfile = 'sound/violin/D#4.ogg'
|
||||
if("Eb4") soundfile = 'sound/violin/Eb4.ogg'
|
||||
if("En4") soundfile = 'sound/violin/En4.ogg'
|
||||
if("E#4") soundfile = 'sound/violin/E#4.ogg'
|
||||
if("Fb4") soundfile = 'sound/violin/Fb4.ogg'
|
||||
if("Fn4") soundfile = 'sound/violin/Fn4.ogg'
|
||||
if("F#4") soundfile = 'sound/violin/F#4.ogg'
|
||||
if("Gb4") soundfile = 'sound/violin/Gb4.ogg'
|
||||
if("Gn4") soundfile = 'sound/violin/Gn4.ogg'
|
||||
if("G#4") soundfile = 'sound/violin/G#4.ogg'
|
||||
if("Ab4") soundfile = 'sound/violin/Ab4.ogg'
|
||||
if("An4") soundfile = 'sound/violin/An4.ogg'
|
||||
if("A#4") soundfile = 'sound/violin/A#4.ogg'
|
||||
if("Bb4") soundfile = 'sound/violin/Bb4.ogg'
|
||||
if("Bn4") soundfile = 'sound/violin/Bn4.ogg'
|
||||
if("B#4") soundfile = 'sound/violin/B#4.ogg'
|
||||
if("Cb5") soundfile = 'sound/violin/Cb5.ogg'
|
||||
if("Cn5") soundfile = 'sound/violin/Cn5.ogg'
|
||||
if("C#5") soundfile = 'sound/violin/C#5.ogg'
|
||||
if("Db5") soundfile = 'sound/violin/Db5.ogg'
|
||||
if("Dn5") soundfile = 'sound/violin/Dn5.ogg'
|
||||
if("D#5") soundfile = 'sound/violin/D#5.ogg'
|
||||
if("Eb5") soundfile = 'sound/violin/Eb5.ogg'
|
||||
if("En5") soundfile = 'sound/violin/En5.ogg'
|
||||
if("E#5") soundfile = 'sound/violin/E#5.ogg'
|
||||
if("Fb5") soundfile = 'sound/violin/Fb5.ogg'
|
||||
if("Fn5") soundfile = 'sound/violin/Fn5.ogg'
|
||||
if("F#5") soundfile = 'sound/violin/F#5.ogg'
|
||||
if("Gb5") soundfile = 'sound/violin/Gb5.ogg'
|
||||
if("Gn5") soundfile = 'sound/violin/Gn5.ogg'
|
||||
if("G#5") soundfile = 'sound/violin/G#5.ogg'
|
||||
if("Ab5") soundfile = 'sound/violin/Ab5.ogg'
|
||||
if("An5") soundfile = 'sound/violin/An5.ogg'
|
||||
if("A#5") soundfile = 'sound/violin/A#5.ogg'
|
||||
if("Bb5") soundfile = 'sound/violin/Bb5.ogg'
|
||||
if("Bn5") soundfile = 'sound/violin/Bn5.ogg'
|
||||
if("B#5") soundfile = 'sound/violin/B#5.ogg'
|
||||
if("Cb6") soundfile = 'sound/violin/Cb6.ogg'
|
||||
if("Cn6") soundfile = 'sound/violin/Cn6.ogg'
|
||||
if("C#6") soundfile = 'sound/violin/C#6.ogg'
|
||||
if("Db6") soundfile = 'sound/violin/Db6.ogg'
|
||||
if("Dn6") soundfile = 'sound/violin/Dn6.ogg'
|
||||
if("D#6") soundfile = 'sound/violin/D#6.ogg'
|
||||
if("Eb6") soundfile = 'sound/violin/Eb6.ogg'
|
||||
if("En6") soundfile = 'sound/violin/En6.ogg'
|
||||
if("E#6") soundfile = 'sound/violin/E#6.ogg'
|
||||
if("Fb6") soundfile = 'sound/violin/Fb6.ogg'
|
||||
if("Fn6") soundfile = 'sound/violin/Fn6.ogg'
|
||||
if("F#6") soundfile = 'sound/violin/F#6.ogg'
|
||||
if("Gb6") soundfile = 'sound/violin/Gb6.ogg'
|
||||
if("Gn6") soundfile = 'sound/violin/Gn6.ogg'
|
||||
if("G#6") soundfile = 'sound/violin/G#6.ogg'
|
||||
if("Ab6") soundfile = 'sound/violin/Ab6.ogg'
|
||||
if("An6") soundfile = 'sound/violin/An6.ogg'
|
||||
if("A#6") soundfile = 'sound/violin/A#6.ogg'
|
||||
if("Bb6") soundfile = 'sound/violin/Bb6.ogg'
|
||||
if("Bn6") soundfile = 'sound/violin/Bn6.ogg'
|
||||
if("B#6") soundfile = 'sound/violin/B#6.ogg'
|
||||
if("Cb7") soundfile = 'sound/violin/Cb7.ogg'
|
||||
if("Cn7") soundfile = 'sound/violin/Cn7.ogg'
|
||||
if("C#7") soundfile = 'sound/violin/C#7.ogg'
|
||||
if("Db7") soundfile = 'sound/violin/Db7.ogg'
|
||||
if("Dn7") soundfile = 'sound/violin/Dn7.ogg'
|
||||
if("D#7") soundfile = 'sound/violin/D#7.ogg'
|
||||
if("Eb7") soundfile = 'sound/violin/Eb7.ogg'
|
||||
if("En7") soundfile = 'sound/violin/En7.ogg'
|
||||
if("E#7") soundfile = 'sound/violin/E#7.ogg'
|
||||
if("Fb7") soundfile = 'sound/violin/Fb7.ogg'
|
||||
if("Fn7") soundfile = 'sound/violin/Fn7.ogg'
|
||||
if("F#7") soundfile = 'sound/violin/F#7.ogg'
|
||||
if("Gb7") soundfile = 'sound/violin/Gb7.ogg'
|
||||
if("Gn7") soundfile = 'sound/violin/Gn7.ogg'
|
||||
if("G#7") soundfile = 'sound/violin/G#7.ogg'
|
||||
if("Ab7") soundfile = 'sound/violin/Ab7.ogg'
|
||||
if("An7") soundfile = 'sound/violin/An7.ogg'
|
||||
if("A#7") soundfile = 'sound/violin/A#7.ogg'
|
||||
if("Bb7") soundfile = 'sound/violin/Bb7.ogg'
|
||||
if("Bn7") soundfile = 'sound/violin/Bn7.ogg'
|
||||
if("B#7") soundfile = 'sound/violin/B#7.ogg'
|
||||
if("Cb8") soundfile = 'sound/violin/Cb8.ogg'
|
||||
if("Cn8") soundfile = 'sound/violin/Cn8.ogg'
|
||||
if("C#8") soundfile = 'sound/violin/C#8.ogg'
|
||||
if("Db8") soundfile = 'sound/violin/Db8.ogg'
|
||||
if("Dn8") soundfile = 'sound/violin/Dn8.ogg'
|
||||
if("D#8") soundfile = 'sound/violin/D#8.ogg'
|
||||
if("Eb8") soundfile = 'sound/violin/Eb8.ogg'
|
||||
if("En8") soundfile = 'sound/violin/En8.ogg'
|
||||
if("E#8") soundfile = 'sound/violin/E#8.ogg'
|
||||
if("Fb8") soundfile = 'sound/violin/Fb8.ogg'
|
||||
if("Fn8") soundfile = 'sound/violin/Fn8.ogg'
|
||||
if("F#8") soundfile = 'sound/violin/F#8.ogg'
|
||||
if("Gb8") soundfile = 'sound/violin/Gb8.ogg'
|
||||
if("Gn8") soundfile = 'sound/violin/Gn8.ogg'
|
||||
if("G#8") soundfile = 'sound/violin/G#8.ogg'
|
||||
if("Ab8") soundfile = 'sound/violin/Ab8.ogg'
|
||||
if("An8") soundfile = 'sound/violin/An8.ogg'
|
||||
if("A#8") soundfile = 'sound/violin/A#8.ogg'
|
||||
if("Bb8") soundfile = 'sound/violin/Bb8.ogg'
|
||||
if("Bn8") soundfile = 'sound/violin/Bn8.ogg'
|
||||
if("B#8") soundfile = 'sound/violin/B#8.ogg'
|
||||
if("Cb9") soundfile = 'sound/violin/Cb9.ogg'
|
||||
if("Cn9") soundfile = 'sound/violin/Cn9.ogg'
|
||||
if("Cn1") soundfile = 'sound/violin/Cn1.mid'
|
||||
if("C#1") soundfile = 'sound/violin/C#1.mid'
|
||||
if("Db1") soundfile = 'sound/violin/Db1.mid'
|
||||
if("Dn1") soundfile = 'sound/violin/Dn1.mid'
|
||||
if("D#1") soundfile = 'sound/violin/D#1.mid'
|
||||
if("Eb1") soundfile = 'sound/violin/Eb1.mid'
|
||||
if("En1") soundfile = 'sound/violin/En1.mid'
|
||||
if("E#1") soundfile = 'sound/violin/E#1.mid'
|
||||
if("Fb1") soundfile = 'sound/violin/Fb1.mid'
|
||||
if("Fn1") soundfile = 'sound/violin/Fn1.mid'
|
||||
if("F#1") soundfile = 'sound/violin/F#1.mid'
|
||||
if("Gb1") soundfile = 'sound/violin/Gb1.mid'
|
||||
if("Gn1") soundfile = 'sound/violin/Gn1.mid'
|
||||
if("G#1") soundfile = 'sound/violin/G#1.mid'
|
||||
if("Ab1") soundfile = 'sound/violin/Ab1.mid'
|
||||
if("An1") soundfile = 'sound/violin/An1.mid'
|
||||
if("A#1") soundfile = 'sound/violin/A#1.mid'
|
||||
if("Bb1") soundfile = 'sound/violin/Bb1.mid'
|
||||
if("Bn1") soundfile = 'sound/violin/Bn1.mid'
|
||||
if("B#1") soundfile = 'sound/violin/B#1.mid'
|
||||
if("Cb2") soundfile = 'sound/violin/Cb2.mid'
|
||||
if("Cn2") soundfile = 'sound/violin/Cn2.mid'
|
||||
if("C#2") soundfile = 'sound/violin/C#2.mid'
|
||||
if("Db2") soundfile = 'sound/violin/Db2.mid'
|
||||
if("Dn2") soundfile = 'sound/violin/Dn2.mid'
|
||||
if("D#2") soundfile = 'sound/violin/D#2.mid'
|
||||
if("Eb2") soundfile = 'sound/violin/Eb2.mid'
|
||||
if("En2") soundfile = 'sound/violin/En2.mid'
|
||||
if("E#2") soundfile = 'sound/violin/E#2.mid'
|
||||
if("Fb2") soundfile = 'sound/violin/Fb2.mid'
|
||||
if("Fn2") soundfile = 'sound/violin/Fn2.mid'
|
||||
if("F#2") soundfile = 'sound/violin/F#2.mid'
|
||||
if("Gb2") soundfile = 'sound/violin/Gb2.mid'
|
||||
if("Gn2") soundfile = 'sound/violin/Gn2.mid'
|
||||
if("G#2") soundfile = 'sound/violin/G#2.mid'
|
||||
if("Ab2") soundfile = 'sound/violin/Ab2.mid'
|
||||
if("An2") soundfile = 'sound/violin/An2.mid'
|
||||
if("A#2") soundfile = 'sound/violin/A#2.mid'
|
||||
if("Bb2") soundfile = 'sound/violin/Bb2.mid'
|
||||
if("Bn2") soundfile = 'sound/violin/Bn2.mid'
|
||||
if("B#2") soundfile = 'sound/violin/B#2.mid'
|
||||
if("Cb3") soundfile = 'sound/violin/Cb3.mid'
|
||||
if("Cn3") soundfile = 'sound/violin/Cn3.mid'
|
||||
if("C#3") soundfile = 'sound/violin/C#3.mid'
|
||||
if("Db3") soundfile = 'sound/violin/Db3.mid'
|
||||
if("Dn3") soundfile = 'sound/violin/Dn3.mid'
|
||||
if("D#3") soundfile = 'sound/violin/D#3.mid'
|
||||
if("Eb3") soundfile = 'sound/violin/Eb3.mid'
|
||||
if("En3") soundfile = 'sound/violin/En3.mid'
|
||||
if("E#3") soundfile = 'sound/violin/E#3.mid'
|
||||
if("Fb3") soundfile = 'sound/violin/Fb3.mid'
|
||||
if("Fn3") soundfile = 'sound/violin/Fn3.mid'
|
||||
if("F#3") soundfile = 'sound/violin/F#3.mid'
|
||||
if("Gb3") soundfile = 'sound/violin/Gb3.mid'
|
||||
if("Gn3") soundfile = 'sound/violin/Gn3.mid'
|
||||
if("G#3") soundfile = 'sound/violin/G#3.mid'
|
||||
if("Ab3") soundfile = 'sound/violin/Ab3.mid'
|
||||
if("An3") soundfile = 'sound/violin/An3.mid'
|
||||
if("A#3") soundfile = 'sound/violin/A#3.mid'
|
||||
if("Bb3") soundfile = 'sound/violin/Bb3.mid'
|
||||
if("Bn3") soundfile = 'sound/violin/Bn3.mid'
|
||||
if("B#3") soundfile = 'sound/violin/B#3.mid'
|
||||
if("Cb4") soundfile = 'sound/violin/Cb4.mid'
|
||||
if("Cn4") soundfile = 'sound/violin/Cn4.mid'
|
||||
if("C#4") soundfile = 'sound/violin/C#4.mid'
|
||||
if("Db4") soundfile = 'sound/violin/Db4.mid'
|
||||
if("Dn4") soundfile = 'sound/violin/Dn4.mid'
|
||||
if("D#4") soundfile = 'sound/violin/D#4.mid'
|
||||
if("Eb4") soundfile = 'sound/violin/Eb4.mid'
|
||||
if("En4") soundfile = 'sound/violin/En4.mid'
|
||||
if("E#4") soundfile = 'sound/violin/E#4.mid'
|
||||
if("Fb4") soundfile = 'sound/violin/Fb4.mid'
|
||||
if("Fn4") soundfile = 'sound/violin/Fn4.mid'
|
||||
if("F#4") soundfile = 'sound/violin/F#4.mid'
|
||||
if("Gb4") soundfile = 'sound/violin/Gb4.mid'
|
||||
if("Gn4") soundfile = 'sound/violin/Gn4.mid'
|
||||
if("G#4") soundfile = 'sound/violin/G#4.mid'
|
||||
if("Ab4") soundfile = 'sound/violin/Ab4.mid'
|
||||
if("An4") soundfile = 'sound/violin/An4.mid'
|
||||
if("A#4") soundfile = 'sound/violin/A#4.mid'
|
||||
if("Bb4") soundfile = 'sound/violin/Bb4.mid'
|
||||
if("Bn4") soundfile = 'sound/violin/Bn4.mid'
|
||||
if("B#4") soundfile = 'sound/violin/B#4.mid'
|
||||
if("Cb5") soundfile = 'sound/violin/Cb5.mid'
|
||||
if("Cn5") soundfile = 'sound/violin/Cn5.mid'
|
||||
if("C#5") soundfile = 'sound/violin/C#5.mid'
|
||||
if("Db5") soundfile = 'sound/violin/Db5.mid'
|
||||
if("Dn5") soundfile = 'sound/violin/Dn5.mid'
|
||||
if("D#5") soundfile = 'sound/violin/D#5.mid'
|
||||
if("Eb5") soundfile = 'sound/violin/Eb5.mid'
|
||||
if("En5") soundfile = 'sound/violin/En5.mid'
|
||||
if("E#5") soundfile = 'sound/violin/E#5.mid'
|
||||
if("Fb5") soundfile = 'sound/violin/Fb5.mid'
|
||||
if("Fn5") soundfile = 'sound/violin/Fn5.mid'
|
||||
if("F#5") soundfile = 'sound/violin/F#5.mid'
|
||||
if("Gb5") soundfile = 'sound/violin/Gb5.mid'
|
||||
if("Gn5") soundfile = 'sound/violin/Gn5.mid'
|
||||
if("G#5") soundfile = 'sound/violin/G#5.mid'
|
||||
if("Ab5") soundfile = 'sound/violin/Ab5.mid'
|
||||
if("An5") soundfile = 'sound/violin/An5.mid'
|
||||
if("A#5") soundfile = 'sound/violin/A#5.mid'
|
||||
if("Bb5") soundfile = 'sound/violin/Bb5.mid'
|
||||
if("Bn5") soundfile = 'sound/violin/Bn5.mid'
|
||||
if("B#5") soundfile = 'sound/violin/B#5.mid'
|
||||
if("Cb6") soundfile = 'sound/violin/Cb6.mid'
|
||||
if("Cn6") soundfile = 'sound/violin/Cn6.mid'
|
||||
if("C#6") soundfile = 'sound/violin/C#6.mid'
|
||||
if("Db6") soundfile = 'sound/violin/Db6.mid'
|
||||
if("Dn6") soundfile = 'sound/violin/Dn6.mid'
|
||||
if("D#6") soundfile = 'sound/violin/D#6.mid'
|
||||
if("Eb6") soundfile = 'sound/violin/Eb6.mid'
|
||||
if("En6") soundfile = 'sound/violin/En6.mid'
|
||||
if("E#6") soundfile = 'sound/violin/E#6.mid'
|
||||
if("Fb6") soundfile = 'sound/violin/Fb6.mid'
|
||||
if("Fn6") soundfile = 'sound/violin/Fn6.mid'
|
||||
if("F#6") soundfile = 'sound/violin/F#6.mid'
|
||||
if("Gb6") soundfile = 'sound/violin/Gb6.mid'
|
||||
if("Gn6") soundfile = 'sound/violin/Gn6.mid'
|
||||
if("G#6") soundfile = 'sound/violin/G#6.mid'
|
||||
if("Ab6") soundfile = 'sound/violin/Ab6.mid'
|
||||
if("An6") soundfile = 'sound/violin/An6.mid'
|
||||
if("A#6") soundfile = 'sound/violin/A#6.mid'
|
||||
if("Bb6") soundfile = 'sound/violin/Bb6.mid'
|
||||
if("Bn6") soundfile = 'sound/violin/Bn6.mid'
|
||||
if("B#6") soundfile = 'sound/violin/B#6.mid'
|
||||
if("Cb7") soundfile = 'sound/violin/Cb7.mid'
|
||||
if("Cn7") soundfile = 'sound/violin/Cn7.mid'
|
||||
if("C#7") soundfile = 'sound/violin/C#7.mid'
|
||||
if("Db7") soundfile = 'sound/violin/Db7.mid'
|
||||
if("Dn7") soundfile = 'sound/violin/Dn7.mid'
|
||||
if("D#7") soundfile = 'sound/violin/D#7.mid'
|
||||
if("Eb7") soundfile = 'sound/violin/Eb7.mid'
|
||||
if("En7") soundfile = 'sound/violin/En7.mid'
|
||||
if("E#7") soundfile = 'sound/violin/E#7.mid'
|
||||
if("Fb7") soundfile = 'sound/violin/Fb7.mid'
|
||||
if("Fn7") soundfile = 'sound/violin/Fn7.mid'
|
||||
if("F#7") soundfile = 'sound/violin/F#7.mid'
|
||||
if("Gb7") soundfile = 'sound/violin/Gb7.mid'
|
||||
if("Gn7") soundfile = 'sound/violin/Gn7.mid'
|
||||
if("G#7") soundfile = 'sound/violin/G#7.mid'
|
||||
if("Ab7") soundfile = 'sound/violin/Ab7.mid'
|
||||
if("An7") soundfile = 'sound/violin/An7.mid'
|
||||
if("A#7") soundfile = 'sound/violin/A#7.mid'
|
||||
if("Bb7") soundfile = 'sound/violin/Bb7.mid'
|
||||
if("Bn7") soundfile = 'sound/violin/Bn7.mid'
|
||||
if("B#7") soundfile = 'sound/violin/B#7.mid'
|
||||
if("Cb8") soundfile = 'sound/violin/Cb8.mid'
|
||||
if("Cn8") soundfile = 'sound/violin/Cn8.mid'
|
||||
if("C#8") soundfile = 'sound/violin/C#8.mid'
|
||||
if("Db8") soundfile = 'sound/violin/Db8.mid'
|
||||
if("Dn8") soundfile = 'sound/violin/Dn8.mid'
|
||||
if("D#8") soundfile = 'sound/violin/D#8.mid'
|
||||
if("Eb8") soundfile = 'sound/violin/Eb8.mid'
|
||||
if("En8") soundfile = 'sound/violin/En8.mid'
|
||||
if("E#8") soundfile = 'sound/violin/E#8.mid'
|
||||
if("Fb8") soundfile = 'sound/violin/Fb8.mid'
|
||||
if("Fn8") soundfile = 'sound/violin/Fn8.mid'
|
||||
if("F#8") soundfile = 'sound/violin/F#8.mid'
|
||||
if("Gb8") soundfile = 'sound/violin/Gb8.mid'
|
||||
if("Gn8") soundfile = 'sound/violin/Gn8.mid'
|
||||
if("G#8") soundfile = 'sound/violin/G#8.mid'
|
||||
if("Ab8") soundfile = 'sound/violin/Ab8.mid'
|
||||
if("An8") soundfile = 'sound/violin/An8.mid'
|
||||
if("A#8") soundfile = 'sound/violin/A#8.mid'
|
||||
if("Bb8") soundfile = 'sound/violin/Bb8.mid'
|
||||
if("Bn8") soundfile = 'sound/violin/Bn8.mid'
|
||||
if("B#8") soundfile = 'sound/violin/B#8.mid'
|
||||
if("Cb9") soundfile = 'sound/violin/Cb9.mid'
|
||||
if("Cn9") soundfile = 'sound/violin/Cn9.mid'
|
||||
else return
|
||||
|
||||
hearers(15, get_turf(src)) << sound(soundfile)
|
||||
|
||||
@@ -1,142 +1,143 @@
|
||||
/* Diffrent misc types of sheets
|
||||
* Contains:
|
||||
* Metal
|
||||
* Plasteel
|
||||
* Wood
|
||||
* Cloth
|
||||
* Cardboard
|
||||
*/
|
||||
|
||||
/*
|
||||
* Metal
|
||||
*/
|
||||
var/global/list/datum/stack_recipe/metal_recipes = list ( \
|
||||
new/datum/stack_recipe("stool", /obj/structure/stool, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("chair", /obj/structure/stool/bed/chair, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("bed", /obj/structure/stool/bed, 2, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("table parts", /obj/item/weapon/table_parts, 2), \
|
||||
new/datum/stack_recipe("rack parts", /obj/item/weapon/rack_parts), \
|
||||
new/datum/stack_recipe("closet", /obj/structure/closet, 2, time = 15, one_per_turf = 1, on_floor = 1), \
|
||||
null, \
|
||||
new/datum/stack_recipe("canister", /obj/machinery/portable_atmospherics/canister, 10, time = 15, one_per_turf = 1, on_floor = 1), \
|
||||
null, \
|
||||
new/datum/stack_recipe("floor tile", /obj/item/stack/tile/plasteel, 1, 4, 20), \
|
||||
new/datum/stack_recipe("metal rod", /obj/item/stack/rods, 1, 2, 60), \
|
||||
null, \
|
||||
new/datum/stack_recipe("computer frame", /obj/structure/computerframe, 5, time = 25, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("wall girders", /obj/structure/girder, 2, time = 50, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("airlock assembly", /obj/structure/door_assembly, 4, time = 50, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("machine frame", /obj/machinery/constructable_frame/machine_frame, 5, time = 25, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("turret frame", /obj/machinery/porta_turret_construct, 5, time = 25, one_per_turf = 1, on_floor = 1), \
|
||||
null, \
|
||||
new/datum/stack_recipe("apc frame", /obj/item/apc_frame, 2), \
|
||||
new/datum/stack_recipe("grenade casing", /obj/item/weapon/grenade/chem_grenade), \
|
||||
new/datum/stack_recipe("light fixture frame", /obj/item/light_fixture_frame, 2), \
|
||||
new/datum/stack_recipe("small light fixture frame", /obj/item/light_fixture_frame/small, 1), \
|
||||
null, \
|
||||
new/datum/stack_recipe("iron door", /obj/structure/mineral_door/iron, 20, one_per_turf = 1, on_floor = 1), \
|
||||
)
|
||||
|
||||
/obj/item/stack/sheet/metal
|
||||
name = "metal"
|
||||
desc = "Sheets made out off metal. It has been dubbed Metal Sheets."
|
||||
singular_name = "metal sheet"
|
||||
icon_state = "sheet-metal"
|
||||
m_amt = 3750
|
||||
throwforce = 14.0
|
||||
flags = FPRINT | TABLEPASS | CONDUCT
|
||||
origin_tech = "materials=1"
|
||||
|
||||
/obj/item/stack/sheet/metal/cyborg
|
||||
name = "metal"
|
||||
desc = "Sheets made out off metal. It has been dubbed Metal Sheets."
|
||||
singular_name = "metal sheet"
|
||||
icon_state = "sheet-metal"
|
||||
m_amt = 0
|
||||
throwforce = 14.0
|
||||
flags = FPRINT | TABLEPASS | CONDUCT
|
||||
|
||||
/obj/item/stack/sheet/metal/New(var/loc, var/amount=null)
|
||||
recipes = metal_recipes
|
||||
return ..()
|
||||
|
||||
|
||||
/*
|
||||
* Plasteel
|
||||
*/
|
||||
var/global/list/datum/stack_recipe/plasteel_recipes = list ( \
|
||||
new/datum/stack_recipe("AI core", /obj/structure/AIcore, 4, time = 50, one_per_turf = 1), \
|
||||
)
|
||||
|
||||
/obj/item/stack/sheet/plasteel
|
||||
name = "plasteel"
|
||||
singular_name = "plasteel sheet"
|
||||
desc = "This sheet is an alloy of iron and plasma."
|
||||
icon_state = "sheet-plasteel"
|
||||
item_state = "sheet-metal"
|
||||
m_amt = 7500
|
||||
throwforce = 15.0
|
||||
flags = FPRINT | TABLEPASS | CONDUCT
|
||||
origin_tech = "materials=2"
|
||||
|
||||
/obj/item/stack/sheet/plasteel/New(var/loc, var/amount=null)
|
||||
recipes = plasteel_recipes
|
||||
return ..()
|
||||
|
||||
/*
|
||||
* Wood
|
||||
*/
|
||||
var/global/list/datum/stack_recipe/wood_recipes = list ( \
|
||||
new/datum/stack_recipe("wooden sandals", /obj/item/clothing/shoes/sandal, 1), \
|
||||
new/datum/stack_recipe("table parts", /obj/item/weapon/table_parts/wood, 2), \
|
||||
new/datum/stack_recipe("wood floor tile", /obj/item/stack/tile/wood, 1, 4, 20), \
|
||||
new/datum/stack_recipe("wooden barricade", /obj/structure/barricade/wooden, 5, time = 50, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("wooden door", /obj/structure/mineral_door/wood, 10, time = 20, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("coffin", /obj/structure/closet/coffin, 5, time = 15, one_per_turf = 1, on_floor = 1), \
|
||||
)
|
||||
|
||||
/obj/item/stack/sheet/wood
|
||||
name = "wooden planks"
|
||||
desc = "One can only guess that this is a bunch of wood."
|
||||
singular_name = "wood plank"
|
||||
icon_state = "sheet-wood"
|
||||
origin_tech = "materials=1;biotech=1"
|
||||
|
||||
/obj/item/stack/sheet/wood/New(var/loc, var/amount=null)
|
||||
recipes = wood_recipes
|
||||
return ..()
|
||||
|
||||
/*
|
||||
* Cloth
|
||||
*/
|
||||
/obj/item/stack/sheet/cloth
|
||||
name = "cloth"
|
||||
desc = "This roll of cloth is made from only the finest chemicals and bunny rabbits."
|
||||
singular_name = "cloth roll"
|
||||
icon_state = "sheet-cloth"
|
||||
origin_tech = "materials=2"
|
||||
|
||||
/*
|
||||
* Cardboard
|
||||
*/
|
||||
var/global/list/datum/stack_recipe/cardboard_recipes = list ( \
|
||||
new/datum/stack_recipe("box", /obj/item/weapon/storage/box), \
|
||||
new/datum/stack_recipe("light tubes", /obj/item/weapon/storage/lightbox/tubes), \
|
||||
new/datum/stack_recipe("light bulbs", /obj/item/weapon/storage/lightbox/bulbs), \
|
||||
new/datum/stack_recipe("mouse traps", /obj/item/weapon/storage/mousetraps), \
|
||||
new/datum/stack_recipe("cardborg suit", /obj/item/clothing/suit/cardborg, 3), \
|
||||
new/datum/stack_recipe("cardborg helmet", /obj/item/clothing/head/cardborg), \
|
||||
new/datum/stack_recipe("pizza box", /obj/item/pizzabox), \
|
||||
)
|
||||
|
||||
/obj/item/stack/sheet/cardboard //BubbleWrap
|
||||
name = "cardboard"
|
||||
desc = "Large sheets of card, like boxes folded flat."
|
||||
singular_name = "cardboard sheet"
|
||||
icon_state = "sheet-card"
|
||||
flags = FPRINT | TABLEPASS
|
||||
origin_tech = "materials=1"
|
||||
|
||||
/obj/item/stack/sheet/cardboard/New(var/loc, var/amount=null)
|
||||
recipes = cardboard_recipes
|
||||
/* Diffrent misc types of sheets
|
||||
* Contains:
|
||||
* Metal
|
||||
* Plasteel
|
||||
* Wood
|
||||
* Cloth
|
||||
* Cardboard
|
||||
*/
|
||||
|
||||
/*
|
||||
* Metal
|
||||
*/
|
||||
var/global/list/datum/stack_recipe/metal_recipes = list ( \
|
||||
new/datum/stack_recipe("stool", /obj/structure/stool, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("chair", /obj/structure/stool/bed/chair, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("bed", /obj/structure/stool/bed, 2, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("table parts", /obj/item/weapon/table_parts, 2), \
|
||||
new/datum/stack_recipe("rack parts", /obj/item/weapon/rack_parts), \
|
||||
new/datum/stack_recipe("closet", /obj/structure/closet, 2, time = 15, one_per_turf = 1, on_floor = 1), \
|
||||
null, \
|
||||
new/datum/stack_recipe("canister", /obj/machinery/portable_atmospherics/canister, 10, time = 15, one_per_turf = 1, on_floor = 1), \
|
||||
null, \
|
||||
new/datum/stack_recipe("floor tile", /obj/item/stack/tile/plasteel, 1, 4, 20), \
|
||||
new/datum/stack_recipe("metal rod", /obj/item/stack/rods, 1, 2, 60), \
|
||||
null, \
|
||||
new/datum/stack_recipe("computer frame", /obj/structure/computerframe, 5, time = 25, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("wall girders", /obj/structure/girder, 2, time = 50, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("airlock assembly", /obj/structure/door_assembly, 4, time = 50, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("machine frame", /obj/machinery/constructable_frame/machine_frame, 5, time = 25, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("turret frame", /obj/machinery/porta_turret_construct, 5, time = 25, one_per_turf = 1, on_floor = 1), \
|
||||
null, \
|
||||
new/datum/stack_recipe("apc frame", /obj/item/apc_frame, 2), \
|
||||
new/datum/stack_recipe("grenade casing", /obj/item/weapon/grenade/chem_grenade), \
|
||||
new/datum/stack_recipe("light fixture frame", /obj/item/light_fixture_frame, 2), \
|
||||
new/datum/stack_recipe("small light fixture frame", /obj/item/light_fixture_frame/small, 1), \
|
||||
null, \
|
||||
new/datum/stack_recipe("iron door", /obj/structure/mineral_door/iron, 20, one_per_turf = 1, on_floor = 1), \
|
||||
)
|
||||
|
||||
/obj/item/stack/sheet/metal
|
||||
name = "metal"
|
||||
desc = "Sheets made out off metal. It has been dubbed Metal Sheets."
|
||||
singular_name = "metal sheet"
|
||||
icon_state = "sheet-metal"
|
||||
m_amt = 3750
|
||||
throwforce = 14.0
|
||||
flags = FPRINT | TABLEPASS | CONDUCT
|
||||
origin_tech = "materials=1"
|
||||
|
||||
/obj/item/stack/sheet/metal/cyborg
|
||||
name = "metal"
|
||||
desc = "Sheets made out off metal. It has been dubbed Metal Sheets."
|
||||
singular_name = "metal sheet"
|
||||
icon_state = "sheet-metal"
|
||||
m_amt = 0
|
||||
throwforce = 14.0
|
||||
flags = FPRINT | TABLEPASS | CONDUCT
|
||||
|
||||
/obj/item/stack/sheet/metal/New(var/loc, var/amount=null)
|
||||
recipes = metal_recipes
|
||||
return ..()
|
||||
|
||||
|
||||
/*
|
||||
* Plasteel
|
||||
*/
|
||||
var/global/list/datum/stack_recipe/plasteel_recipes = list ( \
|
||||
new/datum/stack_recipe("AI core", /obj/structure/AIcore, 4, time = 50, one_per_turf = 1), \
|
||||
)
|
||||
|
||||
/obj/item/stack/sheet/plasteel
|
||||
name = "plasteel"
|
||||
singular_name = "plasteel sheet"
|
||||
desc = "This sheet is an alloy of iron and plasma."
|
||||
icon_state = "sheet-plasteel"
|
||||
item_state = "sheet-metal"
|
||||
m_amt = 7500
|
||||
throwforce = 15.0
|
||||
flags = FPRINT | TABLEPASS | CONDUCT
|
||||
origin_tech = "materials=2"
|
||||
|
||||
/obj/item/stack/sheet/plasteel/New(var/loc, var/amount=null)
|
||||
recipes = plasteel_recipes
|
||||
return ..()
|
||||
|
||||
/*
|
||||
* Wood
|
||||
*/
|
||||
var/global/list/datum/stack_recipe/wood_recipes = list ( \
|
||||
new/datum/stack_recipe("wooden sandals", /obj/item/clothing/shoes/sandal, 1), \
|
||||
new/datum/stack_recipe("wood floor tile", /obj/item/stack/tile/wood, 1, 4, 20), \
|
||||
new/datum/stack_recipe("table parts", /obj/item/weapon/table_parts/wood, 2), \
|
||||
new/datum/stack_recipe("wooden chair", /obj/structure/stool/bed/chair/wood/normal, 3, time = 10, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("wooden barricade", /obj/structure/barricade/wooden, 5, time = 50, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("wooden door", /obj/structure/mineral_door/wood, 10, time = 20, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("coffin", /obj/structure/closet/coffin, 5, time = 15, one_per_turf = 1, on_floor = 1), \
|
||||
)
|
||||
|
||||
/obj/item/stack/sheet/wood
|
||||
name = "wooden planks"
|
||||
desc = "One can only guess that this is a bunch of wood."
|
||||
singular_name = "wood plank"
|
||||
icon_state = "sheet-wood"
|
||||
origin_tech = "materials=1;biotech=1"
|
||||
|
||||
/obj/item/stack/sheet/wood/New(var/loc, var/amount=null)
|
||||
recipes = wood_recipes
|
||||
return ..()
|
||||
|
||||
/*
|
||||
* Cloth
|
||||
*/
|
||||
/obj/item/stack/sheet/cloth
|
||||
name = "cloth"
|
||||
desc = "This roll of cloth is made from only the finest chemicals and bunny rabbits."
|
||||
singular_name = "cloth roll"
|
||||
icon_state = "sheet-cloth"
|
||||
origin_tech = "materials=2"
|
||||
|
||||
/*
|
||||
* Cardboard
|
||||
*/
|
||||
var/global/list/datum/stack_recipe/cardboard_recipes = list ( \
|
||||
new/datum/stack_recipe("box", /obj/item/weapon/storage/box), \
|
||||
new/datum/stack_recipe("light tubes", /obj/item/weapon/storage/lightbox/tubes), \
|
||||
new/datum/stack_recipe("light bulbs", /obj/item/weapon/storage/lightbox/bulbs), \
|
||||
new/datum/stack_recipe("mouse traps", /obj/item/weapon/storage/mousetraps), \
|
||||
new/datum/stack_recipe("cardborg suit", /obj/item/clothing/suit/cardborg, 3), \
|
||||
new/datum/stack_recipe("cardborg helmet", /obj/item/clothing/head/cardborg), \
|
||||
new/datum/stack_recipe("pizza box", /obj/item/pizzabox), \
|
||||
)
|
||||
|
||||
/obj/item/stack/sheet/cardboard //BubbleWrap
|
||||
name = "cardboard"
|
||||
desc = "Large sheets of card, like boxes folded flat."
|
||||
singular_name = "cardboard sheet"
|
||||
icon_state = "sheet-card"
|
||||
flags = FPRINT | TABLEPASS
|
||||
origin_tech = "materials=1"
|
||||
|
||||
/obj/item/stack/sheet/cardboard/New(var/loc, var/amount=null)
|
||||
recipes = cardboard_recipes
|
||||
return ..()
|
||||
@@ -22,7 +22,7 @@
|
||||
name = "Popcorn"
|
||||
icon_state = "popcorn"
|
||||
sosjerky
|
||||
name = "Sosjerky"
|
||||
name = "Scaredy's Private Reserve Beef Jerky"
|
||||
icon_state = "sosjerky"
|
||||
syndi_cakes
|
||||
name = "Syndi cakes"
|
||||
|
||||
@@ -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
|
||||
@@ -47,6 +47,6 @@
|
||||
|
||||
/obj/item/weapon/grenade/spawnergrenade/spesscarp
|
||||
name = "carp delivery grenade"
|
||||
spawner_type = /mob/living/simple_animal/carp
|
||||
spawner_type = /mob/living/simple_animal/hostile/carp
|
||||
deliveryamt = 5
|
||||
origin_tech = "materials=3;magnets=4;syndicate=4"
|
||||
@@ -4,6 +4,8 @@
|
||||
new /obj/item/weapon/extinguisher/mini(src)
|
||||
if(prob(50))
|
||||
new /obj/item/device/flashlight(src)
|
||||
else
|
||||
new /obj/item/device/flashlight/flare(src)
|
||||
new /obj/item/device/radio(src)
|
||||
|
||||
/obj/item/weapon/storage/toolbox/mechanical/New()
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
/obj/item/weapon/trashbag
|
||||
name = "trash bag"
|
||||
desc = "A heavy-duty, no fun allowed trash bag."
|
||||
icon = 'icons/obj/trash.dmi'
|
||||
icon_state = "trashbag0"
|
||||
item_state = "trashbag"
|
||||
name = "Trash bag"
|
||||
desc = "A heavy-duty, no fun allowed trash bag."
|
||||
var/mode = 1; //0 = pick one at a time, 1 = pick all on tile
|
||||
var/capacity = 25; //the number of trash it can carry.
|
||||
flags = FPRINT | TABLEPASS
|
||||
slot_flags = SLOT_BELT
|
||||
w_class = 2.0
|
||||
var/mode = 1; //0 = pick one at a time, 1 = pick all on tile
|
||||
var/capacity = 25; //the number of trash it can carry.
|
||||
|
||||
/obj/item/weapon/trashbag/update_icon()
|
||||
if(contents.len == 0)
|
||||
@@ -21,21 +21,20 @@
|
||||
|
||||
/obj/item/weapon/trashbag/attackby(obj/item/W as obj, mob/living/user as mob)
|
||||
..()
|
||||
if (contents.len < capacity)
|
||||
if (istype(W, /obj/item))
|
||||
if (W.w_class <= 2)
|
||||
if(contents.len < capacity)
|
||||
if(istype(W, /obj/item))
|
||||
if(W.w_class <= 2)
|
||||
var/obj/item/O = W
|
||||
src.contents += O
|
||||
contents += O
|
||||
else
|
||||
user << "\blue The bag is full!"
|
||||
user << "<span class='notice'>[src] is full!</span>"
|
||||
|
||||
/obj/item/weapon/trashbag/attack_self(mob/living/user as mob)
|
||||
|
||||
if(contents.len > 0)
|
||||
for(var/obj/item/I in src.contents)
|
||||
for(var/obj/item/I in contents)
|
||||
I.loc = user.loc
|
||||
update_icon()
|
||||
user << "\blue You drop all the trash onto the floor."
|
||||
user << "<span class='notice'>You empty [src] onto [user.loc].</span>"
|
||||
|
||||
/obj/item/weapon/trashbag/afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, flag)
|
||||
if(istype(target, /obj/item))
|
||||
@@ -43,23 +42,23 @@
|
||||
if(W.w_class <= 2)
|
||||
if(mode == 1)
|
||||
if(contents.len < capacity) //slightly redundant, but it makes it prettier in the chatbox. -Pete
|
||||
user << "\blue You pick up all the trash."
|
||||
user << "<span class='notice'>You pick up all the trash.</span>"
|
||||
for(var/obj/item/O in get_turf(W))
|
||||
if(istype(O, /obj/item/weapon/disk/nuclear)) continue //No nuke disks - Nodrak
|
||||
if(contents.len < capacity)
|
||||
if(O.w_class <= 2)
|
||||
contents += O;
|
||||
else
|
||||
user << "\blue The bag is full!"
|
||||
user << "<span class='notice'>[src] is full!</span>"
|
||||
break
|
||||
else
|
||||
user << "\blue The bag is full!"
|
||||
user << "<span class='notice'>[src] is full!</span>"
|
||||
else
|
||||
if(istype(W, /obj/item/weapon/disk/nuclear)) return //No nuke disks - Nodrak
|
||||
if(contents.len < capacity)
|
||||
contents += W;
|
||||
else
|
||||
user << "\blue The bag is full!"
|
||||
user << "<span class='notice'>[src] is full!</span>"
|
||||
update_icon()
|
||||
return
|
||||
|
||||
@@ -68,8 +67,7 @@
|
||||
set category = "Object"
|
||||
|
||||
mode = !mode
|
||||
switch (mode)
|
||||
if(1)
|
||||
usr << "The bag now picks up all trash in a tile at once."
|
||||
else
|
||||
usr << "The bag now picks up one piece of trash at a time."
|
||||
if(mode == 1)
|
||||
usr << "<span class='notice'>[src] now picks up all trash in a tile at once.</span>"
|
||||
else
|
||||
usr << "<span class='notice'>[src] now picks up one piece of trash at a time.</span>"
|
||||
@@ -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)
|
||||
@@ -15,6 +15,14 @@
|
||||
var/storage_capacity = 20 //This is so that someone can't pack hundreds of items in a locker/crate
|
||||
//then open it in a populated area to crash clients.
|
||||
|
||||
/obj/structure/closet/New()
|
||||
..()
|
||||
spawn(1)
|
||||
if(!opened) // if closed, any item at the crate's loc is put in the contents
|
||||
for(var/obj/item/I in src.loc)
|
||||
if(I.density || I.anchored || I == src) continue
|
||||
I.loc = src
|
||||
|
||||
/obj/structure/closet/alter_health()
|
||||
return get_turf(src)
|
||||
|
||||
@@ -147,6 +155,13 @@
|
||||
|
||||
return
|
||||
|
||||
/obj/structure/closet/attack_animal(mob/living/simple_animal/user as mob)
|
||||
if(user.wall_smash)
|
||||
visible_message("\red [user] destroys the [src]. ")
|
||||
for(var/atom/movable/A as mob|obj in src)
|
||||
A.loc = src.loc
|
||||
del(src)
|
||||
|
||||
// this should probably use dump_contents()
|
||||
/obj/structure/closet/blob_act()
|
||||
if(prob(75))
|
||||
|
||||
@@ -141,7 +141,6 @@
|
||||
/*
|
||||
* Radiation Closet
|
||||
*/
|
||||
|
||||
/obj/structure/closet/radiation
|
||||
name = "radiation suit closet"
|
||||
desc = "It's a storage unit for rad-protective suits."
|
||||
@@ -157,7 +156,7 @@
|
||||
/*
|
||||
* Bombsuit closet
|
||||
*/
|
||||
/obj/structure/closet/bombcloset
|
||||
/obj/structure/closet/bombcloset
|
||||
name = "\improper EOD closet"
|
||||
desc = "It's a storage unit for explosion-protective suits."
|
||||
icon_state = "bombsuit"
|
||||
|
||||
@@ -197,13 +197,6 @@
|
||||
// new /obj/item/weapon/pestspray(src)
|
||||
// new /obj/item/weapon/pestspray(src)
|
||||
|
||||
/obj/structure/closet/crate/New()
|
||||
..()
|
||||
spawn(1)
|
||||
if(!opened) // if closed, any item at the crate's loc is put in the contents
|
||||
for(var/obj/item/I in src.loc)
|
||||
if(I.density || I.anchored || I == src) continue
|
||||
I.loc = src
|
||||
|
||||
/obj/structure/closet/crate/secure/New()
|
||||
..()
|
||||
|
||||
@@ -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)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user