This commit is contained in:
Chinsky
2012-10-25 03:42:20 +04:00
587 changed files with 28582 additions and 28661 deletions
+120
View File
@@ -0,0 +1,120 @@
CREATE TABLE `erro_admin` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`ckey` varchar(32) NOT NULL,
`rank` varchar(32) NOT NULL DEFAULT 'Administrator',
`level` int(2) NOT NULL DEFAULT '0',
`flags` int(16) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
CREATE TABLE `erro_admin_log` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`datetime` datetime NOT NULL,
`adminckey` varchar(32) NOT NULL,
`adminip` varchar(18) NOT NULL,
`log` text NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
CREATE TABLE `erro_ban` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`bantime` datetime NOT NULL,
`serverip` varchar(32) NOT NULL,
`bantype` varchar(32) NOT NULL,
`reason` text NOT NULL,
`job` varchar(32) DEFAULT NULL,
`duration` int(11) NOT NULL,
`rounds` int(11) DEFAULT NULL,
`expiration_time` datetime NOT NULL,
`ckey` varchar(32) NOT NULL,
`computerid` varchar(32) NOT NULL,
`ip` varchar(32) NOT NULL,
`a_ckey` varchar(32) NOT NULL,
`a_computerid` varchar(32) NOT NULL,
`a_ip` varchar(32) NOT NULL,
`who` text NOT NULL,
`adminwho` text NOT NULL,
`edits` text,
`unbanned` tinyint(1) DEFAULT NULL,
`unbanned_datetime` datetime DEFAULT NULL,
`unbanned_ckey` varchar(32) DEFAULT NULL,
`unbanned_computerid` varchar(32) DEFAULT NULL,
`unbanned_ip` varchar(32) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
CREATE TABLE `erro_feedback` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`time` datetime NOT NULL,
`round_id` int(8) NOT NULL,
`var_name` varchar(32) NOT NULL,
`var_value` int(16) DEFAULT NULL,
`details` text,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ;
CREATE TABLE `erro_player` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`ckey` varchar(32) NOT NULL,
`firstseen` datetime NOT NULL,
`lastseen` datetime NOT NULL,
`ip` varchar(18) NOT NULL,
`computerid` varchar(32) NOT NULL,
`lastadminrank` varchar(32) NOT NULL DEFAULT 'Player',
PRIMARY KEY (`id`),
UNIQUE KEY `ckey` (`ckey`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
CREATE TABLE `erro_poll_option` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`pollid` int(11) NOT NULL,
`text` varchar(255) NOT NULL,
`percentagecalc` tinyint(1) NOT NULL DEFAULT '1',
`minval` int(3) DEFAULT NULL,
`maxval` int(3) DEFAULT NULL,
`descmin` varchar(32) DEFAULT NULL,
`descmid` varchar(32) DEFAULT NULL,
`descmax` varchar(32) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
CREATE TABLE `erro_poll_question` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`polltype` varchar(16) NOT NULL DEFAULT 'OPTION',
`starttime` datetime NOT NULL,
`endtime` datetime NOT NULL,
`question` varchar(255) NOT NULL,
`adminonly` tinyint(1) DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
CREATE TABLE `erro_poll_textreply` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`datetime` datetime NOT NULL,
`pollid` int(11) NOT NULL,
`ckey` varchar(32) NOT NULL,
`ip` varchar(18) NOT NULL,
`replytext` text NOT NULL,
`adminrank` varchar(32) NOT NULL DEFAULT 'Player',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
CREATE TABLE `erro_poll_vote` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`datetime` datetime NOT NULL,
`pollid` int(11) NOT NULL,
`optionid` int(11) NOT NULL,
`ckey` varchar(255) NOT NULL,
`ip` varchar(16) NOT NULL,
`adminrank` varchar(32) NOT NULL,
`rating` int(2) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
CREATE TABLE `erro_privacy` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`datetime` datetime NOT NULL,
`ckey` varchar(32) NOT NULL,
`option` varchar(128) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
+21 -17
View File
@@ -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
View File
@@ -29,7 +29,7 @@ def YTCV4(youtube_url,cache=1,debug=0):
try:
prev_dict = pickle.load(tiedosto)
except EOFError: # Cache is corrupt
os.remove(directory+"/nano/"+tiedosto.name)
os.remove(directory+tiedosto.name)
print "REMOVED CORRUPT CACHE: "+tiedosto.name
prev_dict = {}
tiedosto.close() # I think this should belong here.
@@ -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
+4 -1
View File
@@ -174,11 +174,14 @@ obj/machinery/atmospherics/valve
if(target.initialize_directions & get_dir(target,src))
node2 = target
break
build_network()
if(openDuringInit)
close()
open()
openDuringInit = 0
build_network()
/*
var/connect_directions
switch(dir)
+1 -1
View File
@@ -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()
+1 -3
View File
@@ -152,10 +152,8 @@ datum
var/start_time = world.timeofday
for(var/turf/simulated/S in world)
if(!S.blocks_air && !S.parent && S.z < 5) // Added last check to force skipping asteroid z-levels -- TLE
if(!S.blocks_air && !S.parent)
assemble_group_turf(S)
if(S.z > 4) // Skipping asteroids -- TLE
continue
S.update_air_properties()
world << "\red \b Geometry processed in [(world.timeofday-start_time)/10] seconds!"
+1 -1
View File
@@ -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
View File
@@ -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.
+4
View File
@@ -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
+4 -1
View File
@@ -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
+8 -5
View File
@@ -167,8 +167,11 @@ datum/controller/vote
proc/interface(var/client/C)
if(!C) return
var/admin = 0
var/trialmin = 0
if(C.holder)
admin = 1
if (C.holder.level >= 3)
trialmin = 1
voting |= C
. = "<html><head><title>Voting Panel</title></head><body>"
@@ -186,24 +189,24 @@ datum/controller/vote
else
. += "<h2>Start a vote:</h2><hr><ul><li>"
//restart
if(admin || config.allow_vote_restart)
if(trialmin || config.allow_vote_restart)
. += "<a href='?src=\ref[src];vote=restart'>Restart</a>"
else
. += "<font color='grey'>Restart (Disallowed)</font>"
if(admin)
if(trialmin)
. += "\t(<a href='?src=\ref[src];vote=toggle_restart'>[config.allow_vote_restart?"Allowed":"Disallowed"]</a>)"
. += "</li><li>"
//gamemode
if(admin || config.allow_vote_mode)
if(trialmin || config.allow_vote_mode)
. += "<a href='?src=\ref[src];vote=gamemode'>GameMode</a>"
else
. += "<font color='grey'>GameMode (Disallowed)</font>"
if(admin)
if(trialmin)
. += "\t(<a href='?src=\ref[src];vote=toggle_gamemode'>[config.allow_vote_mode?"Allowed":"Disallowed"]</a>)"
. += "</li>"
//custom
if(admin)
if(trialmin)
. += "<li><a href='?src=\ref[src];vote=custom'>Custom</a></li>"
. += "</ul><hr>"
. += "<a href='?src=\ref[src];vote=close' style='position:absolute;right:50px'>Close</a></body></html>"
+28
View File
@@ -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)
+1 -1
View File
@@ -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()
+11 -7
View File
@@ -37,7 +37,8 @@
cure_id = list("lexorin","toxin","gargleblaster")
cure_chance = 20
affected_species = list("Human", "Monkey")
permeability_mod = 3//likely to infect
permeability_mod = 15//likely to infect
can_carry = 0
var/gibbed = 0
/datum/disease/alien_embryo/stage_act()
@@ -79,14 +80,17 @@
affected_mob << "\red You feel something tearing its way out of your stomach..."
affected_mob.adjustToxLoss(10)
affected_mob.updatehealth()
if(prob(40))
if(prob(50))
if(gibbed != 0) return 0
var/list/candidates = list() //List of candidate KEYS to assume control of the new larva ~Carn
for(var/mob/dead/observer/G in player_list)
if(G.client.be_alien)
if(((G.client.inactivity/10)/60) <= 5)
if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD))
candidates += G.key
var/i = 0
while(candidates.len <= 0 && i < 5)
for(var/mob/dead/observer/G in player_list)
if(G.client.be_alien)
if(((G.client.inactivity/10)/60) <= ALIEN_SELECT_AFK_BUFFER + i) // the most active players are more likely to become an alien
if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD))
candidates += G.key
i++
var/mob/living/carbon/alien/larva/new_xeno = new(affected_mob.loc)
if(candidates.len)
+4
View File
@@ -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
View File
@@ -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'
-13
View File
@@ -41,19 +41,6 @@
idle_power_usage = 10
active_power_usage = 100
/obj/machinery/dispenser
name = "tank storage unit"
desc = "A simple yet bulky one-way storage device for gas tanks. Holds 10 plasma and 10 oxygen tanks."
icon = 'icons/obj/objects.dmi'
icon_state = "dispenser"
density = 1
var/o2tanks = 10.0
var/pltanks = 10.0
anchored = 1.0
use_power = 1
idle_power_usage = 5
active_power_usage = 10
/obj/machinery/dna_scanner
name = "\improper DNA scanner/implanter"
desc = "It scans DNA structures."
-5
View File
@@ -180,11 +180,6 @@
icon_state = "satchel-cap"
item_state = "captainpack"
/obj/item/weapon/storage/backpack/bandolier
name = "bandolier"
desc = "It's a very old bandolier to wear on your back."
icon_state = "bandolier"
/obj/item/weapon/storage/backpack/industrial
name = "industrial backpack"
desc = "It's a tough backpack for the daily grind of station life."
-89
View File
@@ -504,83 +504,6 @@
desc = "An untrustworthy bar of soap. Smells of fear."
icon_state = "soapsyndie"
/obj/item/weapon/bedsheet
name = "bedsheet"
desc = "Nice, linen, bedsheet. Perfect to put on."
icon = 'icons/obj/items.dmi'
icon_state = "sheet"
layer = 4.0
item_state = "bedsheet"
throwforce = 1
w_class = 1.0
throw_speed = 2
throw_range = 10
color = "white"
/obj/item/weapon/bedsheet/blue
icon_state = "sheetblue"
color = "blue"
/obj/item/weapon/bedsheet/green
icon_state = "sheetgreen"
color = "green"
/obj/item/weapon/bedsheet/orange
icon_state = "sheetorange"
color = "orange"
/obj/item/weapon/bedsheet/purple
icon_state = "sheetpurple"
color = "purple"
/obj/item/weapon/bedsheet/rainbow
icon_state = "sheetrainbow"
color = "rainbow"
/obj/item/weapon/bedsheet/red
icon_state = "sheetred"
color = "red"
/obj/item/weapon/bedsheet/yellow
icon_state = "sheetyellow"
color = "yellow"
/obj/item/weapon/bedsheet/mime
icon_state = "sheetmime"
color = "mime"
/obj/item/weapon/bedsheet/clown
icon_state = "sheetclown"
color = "clown"
/obj/item/weapon/bedsheet/captain
icon_state = "sheetcaptain"
color = "captain"
/obj/item/weapon/bedsheet/rd
icon_state = "sheetrd"
color = "director"
/obj/item/weapon/bedsheet/medical
icon_state = "sheetmedical"
color = "medical"
/obj/item/weapon/bedsheet/hos
icon_state = "sheethos"
color = "hosred"
/obj/item/weapon/bedsheet/hop
icon_state = "sheethop"
color = "hop"
/obj/item/weapon/bedsheet/ce
icon_state = "sheetce"
color = "chief"
/obj/item/weapon/bedsheet/brown
icon_state = "sheetbrown"
color = "brown"
/obj/item/weapon/bikehorn
name = "bike horn"
desc = "A horn off of a bicycle."
@@ -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."
+1 -1
View File
@@ -196,7 +196,7 @@
// This is usually for headsets, which only the wearer can hear.
if(R.canhear_range == 0)
if(ismob(R.loc))
. += R.loc
. |= R.loc
continue
var/turf/speaker = get_turf(R)
+19 -1
View File
@@ -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
+2 -2
View File
@@ -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)"
-74
View File
@@ -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)
+84 -1
View File
@@ -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
View File
@@ -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)
+1 -1
View File
@@ -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,
-202
View File
@@ -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
+11 -1
View File
@@ -215,6 +215,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
var/isabsorbing = 0
var/geneticpoints = 5
var/purchasedpowers = list()
var/mimicing = ""
/datum/changeling/New(var/gender=FEMALE)
..()
@@ -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"
+2 -9
View File
@@ -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")
+3 -1
View File
@@ -109,6 +109,7 @@ var/list/sacrificed = list()
"\red You hear an anguished scream.")
if(is_convertable_to_cult(M.mind))
ticker.mode.add_cultist(M.mind)
M.mind.special_role = "Cultist"
M << "<font color=\"purple\"><b><i>Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root.</b></i></font>"
M << "<font color=\"purple\"><b><i>Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back.</b></i></font>"
return 1
@@ -130,7 +131,7 @@ var/list/sacrificed = list()
M.say("Tok-lyr rqa'nap g[pick("'","`")]lt-ulotf!")
cultist_count += 1
if(cultist_count >= 9)
new /obj/machinery/singularity/narsie(src.loc)
new /obj/machinery/singularity/narsie/large(src.loc)
if(ticker.mode.name == "cult")
ticker.mode:eldergod = 0
return
@@ -390,6 +391,7 @@ var/list/sacrificed = list()
else
ticker.mode.cult+=D.mind
D.mind.special_role = "Cultist"
D << "<font color=\"purple\"><b><i>Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root.</b></i></font>"
D << "<font color=\"purple\"><b><i>Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back.</b></i></font>"
+21 -31
View File
@@ -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"
*/
+1 -1
View File
@@ -124,7 +124,7 @@ var/global/datum/controller/gameticker/ticker
if (S.name != "AI")
del(S)
world << "<FONT color='blue'><B>Enjoy the game!</B></FONT>"
// world << sound('sound/AI/welcome.ogg') // Skie
world << sound('sound/AI/welcome.ogg') // Skie
//Holiday Round-start stuff ~Carn
Holiday_Game_Start()
@@ -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)
+1 -3
View File
@@ -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"
+3 -3
View File
@@ -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")
+1
View File
@@ -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)
+4 -11
View File
@@ -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)
+2 -4
View File
@@ -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>"
+139 -123
View File
@@ -8,90 +8,98 @@ obj/machinery/door/airlock
var/datum/radio_frequency/radio_connection
explosion_resistance = 15
receive_signal(datum/signal/signal)
if(!signal || signal.encryption) return
if(id_tag != signal.data["tag"] || !signal.data["command"]) return
obj/machinery/door/airlock/receive_signal(datum/signal/signal)
if(!signal || signal.encryption) return
switch(signal.data["command"])
if("open")
spawn open(1)
if(id_tag != signal.data["tag"] || !signal.data["command"]) return
if("close")
spawn close(1)
switch(signal.data["command"])
if("open")
open(1)
if("unlock")
locked = 0
update_icon()
if("close")
close(1)
if("lock")
locked = 1
update_icon()
if("unlock")
locked = 0
update_icon()
if("secure_open")
spawn
locked = 0
update_icon()
if("lock")
locked = 1
update_icon()
sleep(2)
open(1)
if("secure_open")
locked = 0
update_icon()
locked = 1
update_icon()
sleep(2)
open(1)
if("secure_close")
spawn
locked = 0
close(1)
locked = 1
update_icon()
locked = 1
sleep(2)
update_icon()
if("secure_close")
locked = 0
close(1)
send_status()
locked = 1
sleep(2)
update_icon()
proc/send_status()
if(radio_connection)
var/datum/signal/signal = new
signal.transmission_method = 1 //radio signal
signal.data["tag"] = id_tag
signal.data["timestamp"] = world.time
send_status()
signal.data["door_status"] = density?("closed"):("open")
signal.data["lock_status"] = locked?("locked"):("unlocked")
radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK)
obj/machinery/door/airlock/proc/send_status()
if(radio_connection)
var/datum/signal/signal = new
signal.transmission_method = 1 //radio signal
signal.data["tag"] = id_tag
signal.data["timestamp"] = world.time
open(surpress_send)
. = ..()
if(!surpress_send) send_status()
signal.data["door_status"] = density?("closed"):("open")
signal.data["lock_status"] = locked?("locked"):("unlocked")
close(surpress_send)
. = ..()
if(!surpress_send) send_status()
radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK)
proc/set_frequency(new_frequency)
radio_controller.remove_object(src, frequency)
if(new_frequency)
frequency = new_frequency
radio_connection = radio_controller.add_object(src, frequency, RADIO_AIRLOCK)
initialize()
if(frequency)
set_frequency(frequency)
obj/machinery/door/airlock/open(surpress_send)
. = ..()
if(!surpress_send) send_status()
obj/machinery/door/airlock/close(surpress_send)
. = ..()
if(!surpress_send) send_status()
obj/machinery/door/airlock/proc/set_frequency(new_frequency)
radio_controller.remove_object(src, frequency)
if(new_frequency)
frequency = new_frequency
radio_connection = radio_controller.add_object(src, frequency, RADIO_AIRLOCK)
obj/machinery/door/airlock/initialize()
if(frequency)
set_frequency(frequency)
update_icon()
obj/machinery/door/airlock/New()
..()
if(radio_controller)
set_frequency(frequency)
update_icon()
New()
..()
if(radio_controller)
set_frequency(frequency)
obj/machinery/airlock_sensor
icon = 'icons/obj/airlock_machines.dmi'
icon_state = "airlock_sensor_off"
name = "Airlock Sensor"
name = "airlock sensor"
anchored = 1
power_channel = ENVIRON
@@ -105,60 +113,64 @@ obj/machinery/airlock_sensor
var/on = 1
var/alert = 0
update_icon()
if(on)
if(alert)
icon_state = "airlock_sensor_alert"
else
icon_state = "airlock_sensor_standby"
else
icon_state = "airlock_sensor_off"
attack_hand(mob/user)
obj/machinery/airlock_sensor/update_icon()
if(on)
if(alert)
icon_state = "airlock_sensor_alert"
else
icon_state = "airlock_sensor_standby"
else
icon_state = "airlock_sensor_off"
obj/machinery/airlock_sensor/attack_hand(mob/user)
var/datum/signal/signal = new
signal.transmission_method = 1 //radio signal
signal.data["tag"] = master_tag
signal.data["command"] = "cycle"
radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK)
flick("airlock_sensor_cycle", src)
obj/machinery/airlock_sensor/process()
if(on)
var/datum/signal/signal = new
signal.transmission_method = 1 //radio signal
signal.data["tag"] = master_tag
signal.data["command"] = "cycle"
signal.data["tag"] = id_tag
signal.data["timestamp"] = world.time
var/datum/gas_mixture/air_sample = return_air()
var/pressure = round(air_sample.return_pressure(),0.1)
alert = (pressure < ONE_ATMOSPHERE*0.8)
signal.data["pressure"] = num2text(pressure)
radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK)
flick("airlock_sensor_cycle", src)
process()
if(on)
var/datum/signal/signal = new
signal.transmission_method = 1 //radio signal
signal.data["tag"] = id_tag
signal.data["timestamp"] = world.time
update_icon()
var/datum/gas_mixture/air_sample = return_air()
obj/machinery/airlock_sensor/proc/set_frequency(new_frequency)
radio_controller.remove_object(src, frequency)
frequency = new_frequency
radio_connection = radio_controller.add_object(src, frequency, RADIO_AIRLOCK)
var/pressure = round(air_sample.return_pressure(),0.1)
alert = (pressure < ONE_ATMOSPHERE*0.8)
obj/machinery/airlock_sensor/initialize()
set_frequency(frequency)
signal.data["pressure"] = num2text(pressure)
obj/machinery/airlock_sensor/New()
..()
radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK)
update_icon()
proc/set_frequency(new_frequency)
radio_controller.remove_object(src, frequency)
frequency = new_frequency
radio_connection = radio_controller.add_object(src, frequency, RADIO_AIRLOCK)
initialize()
if(radio_controller)
set_frequency(frequency)
New()
..()
if(radio_controller)
set_frequency(frequency)
obj/machinery/access_button
icon = 'icons/obj/airlock_machines.dmi'
icon_state = "access_button_standby"
name = "Access Button"
name = "access button"
anchored = 1
power_channel = ENVIRON
@@ -171,37 +183,41 @@ obj/machinery/access_button
var/on = 1
update_icon()
if(on)
icon_state = "access_button_standby"
else
icon_state = "access_button_off"
attack_hand(mob/user)
src.add_fingerprint(usr)
if(!allowed(user))
user << "\red Access Denied"
obj/machinery/access_button/update_icon()
if(on)
icon_state = "access_button_standby"
else
icon_state = "access_button_off"
else if(radio_connection)
var/datum/signal/signal = new
signal.transmission_method = 1 //radio signal
signal.data["tag"] = master_tag
signal.data["command"] = command
radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK)
flick("access_button_cycle", src)
obj/machinery/access_button/attack_hand(mob/user)
add_fingerprint(usr)
if(!allowed(user))
user << "\red Access Denied"
proc
set_frequency(new_frequency)
radio_controller.remove_object(src, frequency)
frequency = new_frequency
radio_connection = radio_controller.add_object(src, frequency, RADIO_AIRLOCK)
else if(radio_connection)
var/datum/signal/signal = new
signal.transmission_method = 1 //radio signal
signal.data["tag"] = master_tag
signal.data["command"] = command
initialize()
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)
+1 -2
View File
@@ -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()
+16 -3
View File
@@ -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()
+4 -8
View File
@@ -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
+2 -4
View File
@@ -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)
+6 -12
View File
@@ -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))
+4 -8
View File
@@ -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)
+6 -37
View File
@@ -49,7 +49,7 @@
/obj/machinery/camera/emp_act(severity)
if(!isEmpProof())
if(prob(100/severity))
icon_state = "cameraemp"
icon_state = "[initial(icon_state)]emp"
network = null //Not the best way but it will do. I think.
cameranet.removeCamera(src)
stat |= EMPED
@@ -98,7 +98,7 @@
for(var/mob/O in viewers(user, null))
O.show_message("<span class='warning'>\The [user] slashes at [src]!</span>", 1)
playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1)
icon_state = "camera1"
icon_state = "[initial(icon_state)]1"
add_hiddenprint(user)
deactivate(user,0)
@@ -111,6 +111,7 @@
panel_open = !panel_open
user.visible_message("<span class='warning'>[user] screws the camera's panel [panel_open ? "open" : "closed"]!</span>",
"<span class='notice'>You screw the camera's panel [panel_open ? "open" : "closed"].</span>")
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
else if((iswirecutter(W) || ismultitool(W)) && panel_open)
interact(user)
@@ -183,13 +184,13 @@
for(var/mob/O in viewers(user, null))
O.show_message(text("\red [] has deactivated []!", user, src), 1)
playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1)
icon_state = "camera1"
icon_state = "[initial(icon_state)]1"
add_hiddenprint(user)
else
for(var/mob/O in viewers(user, null))
O.show_message(text("\red [] has reactivated []!", user, src), 1)
playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1)
icon_state = "camera"
icon_state = initial(icon_state)
add_hiddenprint(user)
// now disconnect anyone using the camera
//Apparently, this will disconnect anyone even if the camera was re-activated.
@@ -213,18 +214,6 @@
for(var/mob/living/silicon/S in mob_list)
S.cancelAlarm("Camera", get_area(src), list(src), src)
/obj/machinery/camera/proc/toggle_panel(var/mob/user)
if(busy)
return 0
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
busy = 1
if(do_after(user, 30))
panel_open = !panel_open
busy = 0
return 1
busy = 0
return 0
/obj/machinery/camera/proc/can_use()
if(!status)
return 0
@@ -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
+31
View File
@@ -1,23 +1,54 @@
// PRESETS
// EMP
/obj/machinery/camera/emp_proof/New()
..()
upgradeEmpProof()
// X-RAY
/obj/machinery/camera/xray
icon_state = "xraycam" // Thanks to Krutchen for the icons.
/obj/machinery/camera/xray/New()
..()
upgradeXRay()
// MOTION
/obj/machinery/camera/motion/New()
..()
upgradeMotion()
// ALL UPGRADES
/obj/machinery/camera/all/New()
..()
upgradeEmpProof()
upgradeXRay()
upgradeMotion()
// AUTONAME
/obj/machinery/camera/autoname
var/number = 0 //camera number in area
//This camera type automatically sets it's name to whatever the area that it's in is called.
/obj/machinery/camera/autoname/New()
..()
spawn(10)
number = 1
var/area/A = get_area(src)
if(A)
for(var/obj/machinery/camera/autoname/C in world)
if(C == src) continue
var/area/CA = get_area(C)
if(CA.type == A.type)
if(C.number)
number = max(number, C.number+1)
c_tag = "[A.name] #[number]"
// CHECKS
+64 -50
View File
@@ -1,25 +1,56 @@
/mob/living/silicon/ai/proc/ai_camera_list()
/mob/living/silicon/ai/proc/get_camera_list()
if(src.stat == 2)
return
var/list/L = list()
for (var/obj/machinery/camera/C in cameranet.cameras)
L.Add(C)
camera_sort(L)
var/list/T = list()
T["Cancel"] = "Cancel"
for (var/obj/machinery/camera/C in L)
if (C.network == src.network)
T[text("[][]", C.c_tag, (C.can_use() ? null : " (Deactivated)"))] = C
track = new()
track.cameras = T
return T
/mob/living/silicon/ai/proc/ai_camera_list(var/camera in get_camera_list())
set category = "AI Commands"
set name = "Show Camera List"
if(usr.stat == 2)
usr << "You can't track with camera because you are dead!"
if(src.stat == 2)
src << "You can't list the cameras because you are dead!"
return
attack_ai(src)
if (!camera || camera == "Cancel")
return 0
/mob/living/silicon/ai/proc/ai_camera_track()
set category = "AI Commands"
set name = "Track With Camera"
if(usr.stat == 2)
usr << "You can't track with camera because you are dead!"
return
var/obj/machinery/camera/C = track.cameras[camera]
track = null
src.eyeobj.setLoc(C)
return
// Used to allow the AI is write in mob names/camera name from the CMD line.
/datum/trackable
var/list/names = list()
var/list/namecounts = list()
var/list/humans = list()
var/list/others = list()
var/list/cameras = list()
/mob/living/silicon/ai/proc/trackable_mobs()
if(usr.stat == 2)
return list()
var/datum/trackable/TB = new()
for(var/mob/living/M in mob_list)
// Easy checks first.
// Don't detect mobs on Centcom. Since the wizard den is on Centcomm, we only need this.
@@ -55,25 +86,34 @@
continue
var/name = M.name
if (name in names)
namecounts[name]++
name = text("[] ([])", name, namecounts[name])
if (name in TB.names)
TB.namecounts[name]++
name = text("[] ([])", name, TB.namecounts[name])
else
names.Add(name)
namecounts[name] = 1
TB.names.Add(name)
TB.namecounts[name] = 1
if(human)
humans[name] = M
TB.humans[name] = M
else
others[name] = M
TB.others[name] = M
var/list/targets = sortList(humans) + sortList(others)
var/target_name = input(usr, "Which creature should you track?") as null|anything in targets
var/list/targets = sortList(TB.humans) + sortList(TB.others)
src.track = TB
return targets
if (!target_name)
usr:cameraFollow = null
/mob/living/silicon/ai/proc/ai_camera_track(var/target_name in trackable_mobs())
set category = "AI Commands"
set name = "Track With Camera"
set desc = "Select who you would like to track."
if(src.stat == 2)
src << "You can't track with camera because you are dead!"
return
if(!target_name)
src.cameraFollow = null
var/mob/target = (isnull(humans[target_name]) ? others[target_name] : humans[target_name])
var/mob/target = (isnull(track.humans[target_name]) ? track.others[target_name] : track.humans[target_name])
src.track = null
ai_actual_track(target)
/mob/living/silicon/ai/proc/ai_actual_track(mob/living/target as mob)
@@ -121,7 +161,7 @@
return
sleep(10)
/proc/near_camera(var/mob/M)
/proc/near_camera(var/mob/living/M)
if (!isturf(M.loc))
return 0
if(isrobot(M))
@@ -141,33 +181,7 @@
/mob/living/silicon/ai/attack_ai(var/mob/user as mob)
if (user != src)
return
if (stat == 2)
return
var/list/L = list()
for (var/obj/machinery/camera/C in cameranet.cameras)
L.Add(C)
camera_sort(L)
var/list/D = list()
D["Cancel"] = "Cancel"
for (var/obj/machinery/camera/C in L)
if (C.network == src.network)
D[text("[][]", C.c_tag, (C.can_use() ? null : " (Deactivated)"))] = C
var/t = input(user, "Which camera should you change to?") as null|anything in D
if (!t || t == "Cancel")
return 0
var/obj/machinery/camera/C = D[t]
src.eyeobj.setLoc(C)
return
ai_camera_list()
/proc/camera_sort(list/L)
var/obj/machinery/camera/a
+1 -1
View File
@@ -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
+2
View File
@@ -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()
+13 -26
View File
@@ -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/ =*/
-117
View File
@@ -1,117 +0,0 @@
/obj/machinery/dispenser/New()
..()
update_icon()
/obj/machinery/dispenser/ex_act(severity)
switch(severity)
if(1.0)
//SN src = null
del(src)
return
if(2.0)
if (prob(50))
//SN src = null
del(src)
return
if(3.0)
if (prob(25))
while(src.o2tanks > 0)
new /obj/item/weapon/tank/oxygen( src.loc )
src.o2tanks--
update_icon()
while(src.pltanks > 0)
new /obj/item/weapon/tank/plasma( src.loc )
src.pltanks--
update_icon()
else
return
/obj/machinery/dispenser/blob_act()
if (prob(50))
while(src.o2tanks > 0)
new /obj/item/weapon/tank/oxygen( src.loc )
src.o2tanks--
update_icon()
while(src.pltanks > 0)
new /obj/item/weapon/tank/plasma( src.loc )
src.pltanks--
update_icon()
del(src)
/obj/machinery/dispenser/meteorhit()
while(src.o2tanks > 0)
new /obj/item/weapon/tank/oxygen( src.loc )
src.o2tanks--
update_icon()
while(src.pltanks > 0)
new /obj/item/weapon/tank/plasma( src.loc )
src.pltanks--
update_icon()
del(src)
return
/obj/machinery/dispenser/attack_ai(mob/user as mob)
return src.attack_hand(user)
/obj/machinery/dispenser/attack_paw(mob/user as mob)
return src.attack_hand(user)
/obj/machinery/dispenser/attack_hand(mob/user as mob)
if(stat & BROKEN)
return
user.machine = src
var/dat = text("<TT><B>Loaded Tank Dispensing Unit</B><BR>\n<FONT color = 'blue'><B>Oxygen</B>: []</FONT> []<BR>\n<FONT color = 'orange'><B>Plasma</B>: []</FONT> []<BR>\n</TT>", src.o2tanks, (src.o2tanks ? text("<A href='?src=\ref[];oxygen=1'>Dispense</A>", src) : "empty"), src.pltanks, (src.pltanks ? text("<A href='?src=\ref[];plasma=1'>Dispense</A>", src) : "empty"))
user << browse(dat, "window=dispenser")
onclose(user, "dispenser")
return
/obj/machinery/dispenser/Topic(href, href_list)
if(stat & BROKEN)
return
if(usr.stat || usr.restrained())
return
if (!(istype(usr, /mob/living/carbon/human) || ticker))
if (!istype(usr, /mob/living/silicon/ai))
usr << "\red You don't have the dexterity to do this!"
else
usr << "\red You are unable to dispense anything, since the controls are physical levers which don't go through any other kind of input."
return
if ((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(src.loc, /turf))))
usr.machine = src
if (href_list["oxygen"])
if (text2num(href_list["oxygen"]))
if (src.o2tanks > 0)
use_power(5)
new /obj/item/weapon/tank/oxygen( src.loc )
src.o2tanks--
update_icon()
if (istype(src.loc, /mob))
attack_hand(src.loc)
else
if (href_list["plasma"])
if (text2num(href_list["plasma"]))
if (src.pltanks > 0)
use_power(5)
new /obj/item/weapon/tank/plasma( src.loc )
src.pltanks--
update_icon()
if (istype(src.loc, /mob))
attack_hand(src.loc)
src.add_fingerprint(usr)
for(var/mob/M in viewers(1, src))
if ((M.client && M.machine == src))
src.attack_hand(M)
else
usr << browse(null, "window=dispenser")
return
return
/obj/machinery/dispenser/update_icon()
overlays = null
switch(o2tanks)
if(1 to 3) overlays += "oxygen-[o2tanks]"
if(4 to INFINITY) overlays += "oxygen-4"
switch(pltanks)
if(1 to 4) overlays += "plasma-[pltanks]"
if(5 to INFINITY) overlays += "plasma-5"
+40 -2
View File
@@ -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
-49
View File
@@ -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"
+2 -4
View File
@@ -59,13 +59,11 @@ var/const/HOLOPAD_MODE = 0
/*This is the proc for special two-way communication between AI and holopad/people talking near holopad.
For the other part of the code, check silicon say.dm. Particularly robot talk.*/
/obj/machinery/hologram/holopad/hear_talk(mob/M, text)
/obj/machinery/hologram/holopad/hear_talk(mob/living/M, text)
if(M&&hologram&&master)//Master is mostly a safety in case lag hits or something.
if(!master.say_understands(M))//The AI will be able to understand most mobs talking through the holopad.
text = stars(text)
var/name_used = M.name
if(istype(M.wear_mask, /obj/item/clothing/mask/gas/voice)&&M.wear_mask:vchange)//Can't forget the ninjas.
name_used = M.wear_mask:voice
var/name_used = M.GetVoice()
//This communication is imperfect because the holopad "filters" voices and is only designed to connect to the master only.
var/rendered = "<i><span class='game say'>Holopad received, <span class='name'>[name_used]</span> <span class='message'>[M.say_quote(text)]</span></span></i>"
master.show_message(rendered, 2)
+3 -3
View File
@@ -194,11 +194,11 @@ obj/machinery/hydroponics/proc/updateicon()
if(src.harvest)
overlays += image('icons/obj/hydroponics.dmi', icon_state="over_harvest3")
if(!luminosity)
if(istype(myseed,/obj/item/seeds/glowshroom))
SetLuminosity(round(myseed.potency/10))
if(istype(myseed,/obj/item/seeds/glowshroom))
SetLuminosity(round(myseed.potency/10))
else
SetLuminosity(0)
return
+1 -2
View File
@@ -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]."
+1 -1
View File
@@ -33,7 +33,7 @@
<A href='?src=\ref[src];make=2;dir=1'>Pipe</A><BR>
<A href='?src=\ref[src];make=3;dir=5'>Bent Pipe</A><BR>
<A href='?src=\ref[src];make=6;dir=1'>Junction</A><BR>
<A href='?src=\ref[src];make=9;dir=17'>Heat Exchanger</A><BR>
<A href='?src=\ref[src];make=17;dir=1'>Heat Exchanger</A><BR>
<b>Insulated pipes:</b><BR>
<A href='?src=\ref[src];make=11;dir=1'>Pipe</A><BR>
<A href='?src=\ref[src];make=12;dir=5'>Bent Pipe</A><BR>
+12 -12
View File
@@ -1,22 +1,21 @@
/obj/machinery/seed_extractor
name = "Seed Extractor"
desc = "Extracts seeds from produce"
name = "seed extractor"
desc = "Extracts and bags seeds from produce."
icon = 'icons/obj/hydroponics.dmi'
icon_state = "sextractor"
density = 1
anchored = 1
obj/machinery/seed_extractor/attackby(var/obj/item/O as obj, var/mob/user as mob)
//Called when mob user "attacks" it with object O
if (istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown/))
if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown/))
var/obj/item/weapon/reagent_containers/food/snacks/grown/F = O
user << "\blue You extract some seeds from the [F.name]"
user.drop_item()
user << "<span class='notice'>You extract some seeds from the [F.name].</span>"
var/seed = text2path(F.seed)
var/t_amount = 0
var/t_max = rand(1,4)
while ( t_amount < t_max)
var/obj/item/seeds/t_prod = new seed(src.loc)
while(t_amount < t_max)
var/obj/item/seeds/t_prod = new seed(loc)
t_prod.species = F.species
t_prod.lifespan = F.lifespan
t_prod.endurance = F.endurance
@@ -27,14 +26,15 @@ obj/machinery/seed_extractor/attackby(var/obj/item/O as obj, var/mob/user as mob
t_amount++
del(O)
else if (istype(O, /obj/item/weapon/grown/))
else if(istype(O, /obj/item/weapon/grown/))
var/obj/item/weapon/grown/F = O
user << "\blue You extract some seeds from the [F.name]"
user.drop_item()
user << "<span class='notice'>You extract some seeds from the [F.name].</span>"
var/seed = text2path(F.seed)
var/t_amount = 0
var/t_max = rand(1,4)
while ( t_amount < t_max)
var/obj/item/seeds/t_prod = new seed(src.loc)
while(t_amount < t_max)
var/obj/item/seeds/t_prod = new seed(loc)
t_prod.species = F.species
t_prod.lifespan = F.lifespan
t_prod.endurance = F.endurance
+6 -14
View File
@@ -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)
+3 -6
View File
@@ -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
+16 -5
View File
@@ -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
..()
+53
View File
@@ -0,0 +1,53 @@
/obj/machinery/transformer
name = "Automatic Robotic Factory 5000"
desc = "A large metalic machine with an entrance and an exit. A sign on the side reads, 'human go in, robot come out', human must be lying down and alive."
icon = 'icons/obj/recycling.dmi'
icon_state = "separator-AO1"
layer = MOB_LAYER+1 // Overhead
anchored = 1
density = 1
var/transform_dead = 0
/obj/machinery/transformer/New()
..()
var/turf/T = loc
if(T)
// Spawn Conveyour Belts
//East
var/turf/east = locate(T.x + 1, T.y, T.z)
if(istype(east, /turf/simulated/floor))
new /obj/machinery/conveyor(east, WEST, 1)
// West
var/turf/west = locate(T.x - 1, T.y, T.z)
if(istype(west, /turf/simulated/floor))
new /obj/machinery/conveyor(west, WEST, 1)
// On us
new /obj/machinery/conveyor(T, WEST, 1)
/obj/machinery/transformer/Bumped(var/atom/movable/AM)
// HasEntered didn't like people lying down.
if(ishuman(AM))
// Only humans can enter from the west side, while lying down.
var/move_dir = get_dir(loc, AM.loc)
var/mob/living/carbon/human/H = AM
if(H.lying && move_dir == EAST)// || move_dir == WEST)
AM.loc = src.loc
transform(AM)
/obj/machinery/transformer/proc/transform(var/mob/living/carbon/human/H)
if(stat & (BROKEN|NOPOWER))
return
if(!transform_dead && H.stat == DEAD)
playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 0)
return
playsound(src.loc, 'sound/items/Welder.ogg', 50, 1)
use_power(5000) // Use a lot of power.
var/mob/living/silicon/robot = H.Robotize()
robot.lying = 1
spawn(50) // So he can't jump out the gate right away.
playsound(src.loc, 'sound/machines/ping.ogg', 50, 0)
if(robot)
robot.lying = 0
+2 -6
View File
@@ -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()
-240
View File
@@ -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
+4
View File
@@ -17,12 +17,16 @@
icon = 'icons/misc/beach2.dmi'
icon_state = "palm1"
density = 1
layer = 5
anchored = 1
/obj/effect/overlay/palmtree_l
name = "Palm tree"
icon = 'icons/misc/beach2.dmi'
icon_state = "palm2"
density = 1
layer = 5
anchored = 1
/obj/effect/overlay/coconut
name = "Coconuts"
-3
View File
@@ -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
+110 -85
View File
@@ -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
+7 -11
View File
@@ -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)
+169 -169
View File
@@ -19,175 +19,175 @@
/*BYOND loads resource files at compile time if they are ''. This means you can't really manipulate them dynamically.
Tried doing it dynamically at first but its more trouble than its worth. Would have saved many lines tho.*/
switch(note)
if("Cn1") soundfile = 'sound/violin/Cn1.ogg'
if("C#1") soundfile = 'sound/violin/C#1.ogg'
if("Db1") soundfile = 'sound/violin/Db1.ogg'
if("Dn1") soundfile = 'sound/violin/Dn1.ogg'
if("D#1") soundfile = 'sound/violin/D#1.ogg'
if("Eb1") soundfile = 'sound/violin/Eb1.ogg'
if("En1") soundfile = 'sound/violin/En1.ogg'
if("E#1") soundfile = 'sound/violin/E#1.ogg'
if("Fb1") soundfile = 'sound/violin/Fb1.ogg'
if("Fn1") soundfile = 'sound/violin/Fn1.ogg'
if("F#1") soundfile = 'sound/violin/F#1.ogg'
if("Gb1") soundfile = 'sound/violin/Gb1.ogg'
if("Gn1") soundfile = 'sound/violin/Gn1.ogg'
if("G#1") soundfile = 'sound/violin/G#1.ogg'
if("Ab1") soundfile = 'sound/violin/Ab1.ogg'
if("An1") soundfile = 'sound/violin/An1.ogg'
if("A#1") soundfile = 'sound/violin/A#1.ogg'
if("Bb1") soundfile = 'sound/violin/Bb1.ogg'
if("Bn1") soundfile = 'sound/violin/Bn1.ogg'
if("B#1") soundfile = 'sound/violin/B#1.ogg'
if("Cb2") soundfile = 'sound/violin/Cb2.ogg'
if("Cn2") soundfile = 'sound/violin/Cn2.ogg'
if("C#2") soundfile = 'sound/violin/C#2.ogg'
if("Db2") soundfile = 'sound/violin/Db2.ogg'
if("Dn2") soundfile = 'sound/violin/Dn2.ogg'
if("D#2") soundfile = 'sound/violin/D#2.ogg'
if("Eb2") soundfile = 'sound/violin/Eb2.ogg'
if("En2") soundfile = 'sound/violin/En2.ogg'
if("E#2") soundfile = 'sound/violin/E#2.ogg'
if("Fb2") soundfile = 'sound/violin/Fb2.ogg'
if("Fn2") soundfile = 'sound/violin/Fn2.ogg'
if("F#2") soundfile = 'sound/violin/F#2.ogg'
if("Gb2") soundfile = 'sound/violin/Gb2.ogg'
if("Gn2") soundfile = 'sound/violin/Gn2.ogg'
if("G#2") soundfile = 'sound/violin/G#2.ogg'
if("Ab2") soundfile = 'sound/violin/Ab2.ogg'
if("An2") soundfile = 'sound/violin/An2.ogg'
if("A#2") soundfile = 'sound/violin/A#2.ogg'
if("Bb2") soundfile = 'sound/violin/Bb2.ogg'
if("Bn2") soundfile = 'sound/violin/Bn2.ogg'
if("B#2") soundfile = 'sound/violin/B#2.ogg'
if("Cb3") soundfile = 'sound/violin/Cb3.ogg'
if("Cn3") soundfile = 'sound/violin/Cn3.ogg'
if("C#3") soundfile = 'sound/violin/C#3.ogg'
if("Db3") soundfile = 'sound/violin/Db3.ogg'
if("Dn3") soundfile = 'sound/violin/Dn3.ogg'
if("D#3") soundfile = 'sound/violin/D#3.ogg'
if("Eb3") soundfile = 'sound/violin/Eb3.ogg'
if("En3") soundfile = 'sound/violin/En3.ogg'
if("E#3") soundfile = 'sound/violin/E#3.ogg'
if("Fb3") soundfile = 'sound/violin/Fb3.ogg'
if("Fn3") soundfile = 'sound/violin/Fn3.ogg'
if("F#3") soundfile = 'sound/violin/F#3.ogg'
if("Gb3") soundfile = 'sound/violin/Gb3.ogg'
if("Gn3") soundfile = 'sound/violin/Gn3.ogg'
if("G#3") soundfile = 'sound/violin/G#3.ogg'
if("Ab3") soundfile = 'sound/violin/Ab3.ogg'
if("An3") soundfile = 'sound/violin/An3.ogg'
if("A#3") soundfile = 'sound/violin/A#3.ogg'
if("Bb3") soundfile = 'sound/violin/Bb3.ogg'
if("Bn3") soundfile = 'sound/violin/Bn3.ogg'
if("B#3") soundfile = 'sound/violin/B#3.ogg'
if("Cb4") soundfile = 'sound/violin/Cb4.ogg'
if("Cn4") soundfile = 'sound/violin/Cn4.ogg'
if("C#4") soundfile = 'sound/violin/C#4.ogg'
if("Db4") soundfile = 'sound/violin/Db4.ogg'
if("Dn4") soundfile = 'sound/violin/Dn4.ogg'
if("D#4") soundfile = 'sound/violin/D#4.ogg'
if("Eb4") soundfile = 'sound/violin/Eb4.ogg'
if("En4") soundfile = 'sound/violin/En4.ogg'
if("E#4") soundfile = 'sound/violin/E#4.ogg'
if("Fb4") soundfile = 'sound/violin/Fb4.ogg'
if("Fn4") soundfile = 'sound/violin/Fn4.ogg'
if("F#4") soundfile = 'sound/violin/F#4.ogg'
if("Gb4") soundfile = 'sound/violin/Gb4.ogg'
if("Gn4") soundfile = 'sound/violin/Gn4.ogg'
if("G#4") soundfile = 'sound/violin/G#4.ogg'
if("Ab4") soundfile = 'sound/violin/Ab4.ogg'
if("An4") soundfile = 'sound/violin/An4.ogg'
if("A#4") soundfile = 'sound/violin/A#4.ogg'
if("Bb4") soundfile = 'sound/violin/Bb4.ogg'
if("Bn4") soundfile = 'sound/violin/Bn4.ogg'
if("B#4") soundfile = 'sound/violin/B#4.ogg'
if("Cb5") soundfile = 'sound/violin/Cb5.ogg'
if("Cn5") soundfile = 'sound/violin/Cn5.ogg'
if("C#5") soundfile = 'sound/violin/C#5.ogg'
if("Db5") soundfile = 'sound/violin/Db5.ogg'
if("Dn5") soundfile = 'sound/violin/Dn5.ogg'
if("D#5") soundfile = 'sound/violin/D#5.ogg'
if("Eb5") soundfile = 'sound/violin/Eb5.ogg'
if("En5") soundfile = 'sound/violin/En5.ogg'
if("E#5") soundfile = 'sound/violin/E#5.ogg'
if("Fb5") soundfile = 'sound/violin/Fb5.ogg'
if("Fn5") soundfile = 'sound/violin/Fn5.ogg'
if("F#5") soundfile = 'sound/violin/F#5.ogg'
if("Gb5") soundfile = 'sound/violin/Gb5.ogg'
if("Gn5") soundfile = 'sound/violin/Gn5.ogg'
if("G#5") soundfile = 'sound/violin/G#5.ogg'
if("Ab5") soundfile = 'sound/violin/Ab5.ogg'
if("An5") soundfile = 'sound/violin/An5.ogg'
if("A#5") soundfile = 'sound/violin/A#5.ogg'
if("Bb5") soundfile = 'sound/violin/Bb5.ogg'
if("Bn5") soundfile = 'sound/violin/Bn5.ogg'
if("B#5") soundfile = 'sound/violin/B#5.ogg'
if("Cb6") soundfile = 'sound/violin/Cb6.ogg'
if("Cn6") soundfile = 'sound/violin/Cn6.ogg'
if("C#6") soundfile = 'sound/violin/C#6.ogg'
if("Db6") soundfile = 'sound/violin/Db6.ogg'
if("Dn6") soundfile = 'sound/violin/Dn6.ogg'
if("D#6") soundfile = 'sound/violin/D#6.ogg'
if("Eb6") soundfile = 'sound/violin/Eb6.ogg'
if("En6") soundfile = 'sound/violin/En6.ogg'
if("E#6") soundfile = 'sound/violin/E#6.ogg'
if("Fb6") soundfile = 'sound/violin/Fb6.ogg'
if("Fn6") soundfile = 'sound/violin/Fn6.ogg'
if("F#6") soundfile = 'sound/violin/F#6.ogg'
if("Gb6") soundfile = 'sound/violin/Gb6.ogg'
if("Gn6") soundfile = 'sound/violin/Gn6.ogg'
if("G#6") soundfile = 'sound/violin/G#6.ogg'
if("Ab6") soundfile = 'sound/violin/Ab6.ogg'
if("An6") soundfile = 'sound/violin/An6.ogg'
if("A#6") soundfile = 'sound/violin/A#6.ogg'
if("Bb6") soundfile = 'sound/violin/Bb6.ogg'
if("Bn6") soundfile = 'sound/violin/Bn6.ogg'
if("B#6") soundfile = 'sound/violin/B#6.ogg'
if("Cb7") soundfile = 'sound/violin/Cb7.ogg'
if("Cn7") soundfile = 'sound/violin/Cn7.ogg'
if("C#7") soundfile = 'sound/violin/C#7.ogg'
if("Db7") soundfile = 'sound/violin/Db7.ogg'
if("Dn7") soundfile = 'sound/violin/Dn7.ogg'
if("D#7") soundfile = 'sound/violin/D#7.ogg'
if("Eb7") soundfile = 'sound/violin/Eb7.ogg'
if("En7") soundfile = 'sound/violin/En7.ogg'
if("E#7") soundfile = 'sound/violin/E#7.ogg'
if("Fb7") soundfile = 'sound/violin/Fb7.ogg'
if("Fn7") soundfile = 'sound/violin/Fn7.ogg'
if("F#7") soundfile = 'sound/violin/F#7.ogg'
if("Gb7") soundfile = 'sound/violin/Gb7.ogg'
if("Gn7") soundfile = 'sound/violin/Gn7.ogg'
if("G#7") soundfile = 'sound/violin/G#7.ogg'
if("Ab7") soundfile = 'sound/violin/Ab7.ogg'
if("An7") soundfile = 'sound/violin/An7.ogg'
if("A#7") soundfile = 'sound/violin/A#7.ogg'
if("Bb7") soundfile = 'sound/violin/Bb7.ogg'
if("Bn7") soundfile = 'sound/violin/Bn7.ogg'
if("B#7") soundfile = 'sound/violin/B#7.ogg'
if("Cb8") soundfile = 'sound/violin/Cb8.ogg'
if("Cn8") soundfile = 'sound/violin/Cn8.ogg'
if("C#8") soundfile = 'sound/violin/C#8.ogg'
if("Db8") soundfile = 'sound/violin/Db8.ogg'
if("Dn8") soundfile = 'sound/violin/Dn8.ogg'
if("D#8") soundfile = 'sound/violin/D#8.ogg'
if("Eb8") soundfile = 'sound/violin/Eb8.ogg'
if("En8") soundfile = 'sound/violin/En8.ogg'
if("E#8") soundfile = 'sound/violin/E#8.ogg'
if("Fb8") soundfile = 'sound/violin/Fb8.ogg'
if("Fn8") soundfile = 'sound/violin/Fn8.ogg'
if("F#8") soundfile = 'sound/violin/F#8.ogg'
if("Gb8") soundfile = 'sound/violin/Gb8.ogg'
if("Gn8") soundfile = 'sound/violin/Gn8.ogg'
if("G#8") soundfile = 'sound/violin/G#8.ogg'
if("Ab8") soundfile = 'sound/violin/Ab8.ogg'
if("An8") soundfile = 'sound/violin/An8.ogg'
if("A#8") soundfile = 'sound/violin/A#8.ogg'
if("Bb8") soundfile = 'sound/violin/Bb8.ogg'
if("Bn8") soundfile = 'sound/violin/Bn8.ogg'
if("B#8") soundfile = 'sound/violin/B#8.ogg'
if("Cb9") soundfile = 'sound/violin/Cb9.ogg'
if("Cn9") soundfile = 'sound/violin/Cn9.ogg'
if("Cn1") soundfile = 'sound/violin/Cn1.mid'
if("C#1") soundfile = 'sound/violin/C#1.mid'
if("Db1") soundfile = 'sound/violin/Db1.mid'
if("Dn1") soundfile = 'sound/violin/Dn1.mid'
if("D#1") soundfile = 'sound/violin/D#1.mid'
if("Eb1") soundfile = 'sound/violin/Eb1.mid'
if("En1") soundfile = 'sound/violin/En1.mid'
if("E#1") soundfile = 'sound/violin/E#1.mid'
if("Fb1") soundfile = 'sound/violin/Fb1.mid'
if("Fn1") soundfile = 'sound/violin/Fn1.mid'
if("F#1") soundfile = 'sound/violin/F#1.mid'
if("Gb1") soundfile = 'sound/violin/Gb1.mid'
if("Gn1") soundfile = 'sound/violin/Gn1.mid'
if("G#1") soundfile = 'sound/violin/G#1.mid'
if("Ab1") soundfile = 'sound/violin/Ab1.mid'
if("An1") soundfile = 'sound/violin/An1.mid'
if("A#1") soundfile = 'sound/violin/A#1.mid'
if("Bb1") soundfile = 'sound/violin/Bb1.mid'
if("Bn1") soundfile = 'sound/violin/Bn1.mid'
if("B#1") soundfile = 'sound/violin/B#1.mid'
if("Cb2") soundfile = 'sound/violin/Cb2.mid'
if("Cn2") soundfile = 'sound/violin/Cn2.mid'
if("C#2") soundfile = 'sound/violin/C#2.mid'
if("Db2") soundfile = 'sound/violin/Db2.mid'
if("Dn2") soundfile = 'sound/violin/Dn2.mid'
if("D#2") soundfile = 'sound/violin/D#2.mid'
if("Eb2") soundfile = 'sound/violin/Eb2.mid'
if("En2") soundfile = 'sound/violin/En2.mid'
if("E#2") soundfile = 'sound/violin/E#2.mid'
if("Fb2") soundfile = 'sound/violin/Fb2.mid'
if("Fn2") soundfile = 'sound/violin/Fn2.mid'
if("F#2") soundfile = 'sound/violin/F#2.mid'
if("Gb2") soundfile = 'sound/violin/Gb2.mid'
if("Gn2") soundfile = 'sound/violin/Gn2.mid'
if("G#2") soundfile = 'sound/violin/G#2.mid'
if("Ab2") soundfile = 'sound/violin/Ab2.mid'
if("An2") soundfile = 'sound/violin/An2.mid'
if("A#2") soundfile = 'sound/violin/A#2.mid'
if("Bb2") soundfile = 'sound/violin/Bb2.mid'
if("Bn2") soundfile = 'sound/violin/Bn2.mid'
if("B#2") soundfile = 'sound/violin/B#2.mid'
if("Cb3") soundfile = 'sound/violin/Cb3.mid'
if("Cn3") soundfile = 'sound/violin/Cn3.mid'
if("C#3") soundfile = 'sound/violin/C#3.mid'
if("Db3") soundfile = 'sound/violin/Db3.mid'
if("Dn3") soundfile = 'sound/violin/Dn3.mid'
if("D#3") soundfile = 'sound/violin/D#3.mid'
if("Eb3") soundfile = 'sound/violin/Eb3.mid'
if("En3") soundfile = 'sound/violin/En3.mid'
if("E#3") soundfile = 'sound/violin/E#3.mid'
if("Fb3") soundfile = 'sound/violin/Fb3.mid'
if("Fn3") soundfile = 'sound/violin/Fn3.mid'
if("F#3") soundfile = 'sound/violin/F#3.mid'
if("Gb3") soundfile = 'sound/violin/Gb3.mid'
if("Gn3") soundfile = 'sound/violin/Gn3.mid'
if("G#3") soundfile = 'sound/violin/G#3.mid'
if("Ab3") soundfile = 'sound/violin/Ab3.mid'
if("An3") soundfile = 'sound/violin/An3.mid'
if("A#3") soundfile = 'sound/violin/A#3.mid'
if("Bb3") soundfile = 'sound/violin/Bb3.mid'
if("Bn3") soundfile = 'sound/violin/Bn3.mid'
if("B#3") soundfile = 'sound/violin/B#3.mid'
if("Cb4") soundfile = 'sound/violin/Cb4.mid'
if("Cn4") soundfile = 'sound/violin/Cn4.mid'
if("C#4") soundfile = 'sound/violin/C#4.mid'
if("Db4") soundfile = 'sound/violin/Db4.mid'
if("Dn4") soundfile = 'sound/violin/Dn4.mid'
if("D#4") soundfile = 'sound/violin/D#4.mid'
if("Eb4") soundfile = 'sound/violin/Eb4.mid'
if("En4") soundfile = 'sound/violin/En4.mid'
if("E#4") soundfile = 'sound/violin/E#4.mid'
if("Fb4") soundfile = 'sound/violin/Fb4.mid'
if("Fn4") soundfile = 'sound/violin/Fn4.mid'
if("F#4") soundfile = 'sound/violin/F#4.mid'
if("Gb4") soundfile = 'sound/violin/Gb4.mid'
if("Gn4") soundfile = 'sound/violin/Gn4.mid'
if("G#4") soundfile = 'sound/violin/G#4.mid'
if("Ab4") soundfile = 'sound/violin/Ab4.mid'
if("An4") soundfile = 'sound/violin/An4.mid'
if("A#4") soundfile = 'sound/violin/A#4.mid'
if("Bb4") soundfile = 'sound/violin/Bb4.mid'
if("Bn4") soundfile = 'sound/violin/Bn4.mid'
if("B#4") soundfile = 'sound/violin/B#4.mid'
if("Cb5") soundfile = 'sound/violin/Cb5.mid'
if("Cn5") soundfile = 'sound/violin/Cn5.mid'
if("C#5") soundfile = 'sound/violin/C#5.mid'
if("Db5") soundfile = 'sound/violin/Db5.mid'
if("Dn5") soundfile = 'sound/violin/Dn5.mid'
if("D#5") soundfile = 'sound/violin/D#5.mid'
if("Eb5") soundfile = 'sound/violin/Eb5.mid'
if("En5") soundfile = 'sound/violin/En5.mid'
if("E#5") soundfile = 'sound/violin/E#5.mid'
if("Fb5") soundfile = 'sound/violin/Fb5.mid'
if("Fn5") soundfile = 'sound/violin/Fn5.mid'
if("F#5") soundfile = 'sound/violin/F#5.mid'
if("Gb5") soundfile = 'sound/violin/Gb5.mid'
if("Gn5") soundfile = 'sound/violin/Gn5.mid'
if("G#5") soundfile = 'sound/violin/G#5.mid'
if("Ab5") soundfile = 'sound/violin/Ab5.mid'
if("An5") soundfile = 'sound/violin/An5.mid'
if("A#5") soundfile = 'sound/violin/A#5.mid'
if("Bb5") soundfile = 'sound/violin/Bb5.mid'
if("Bn5") soundfile = 'sound/violin/Bn5.mid'
if("B#5") soundfile = 'sound/violin/B#5.mid'
if("Cb6") soundfile = 'sound/violin/Cb6.mid'
if("Cn6") soundfile = 'sound/violin/Cn6.mid'
if("C#6") soundfile = 'sound/violin/C#6.mid'
if("Db6") soundfile = 'sound/violin/Db6.mid'
if("Dn6") soundfile = 'sound/violin/Dn6.mid'
if("D#6") soundfile = 'sound/violin/D#6.mid'
if("Eb6") soundfile = 'sound/violin/Eb6.mid'
if("En6") soundfile = 'sound/violin/En6.mid'
if("E#6") soundfile = 'sound/violin/E#6.mid'
if("Fb6") soundfile = 'sound/violin/Fb6.mid'
if("Fn6") soundfile = 'sound/violin/Fn6.mid'
if("F#6") soundfile = 'sound/violin/F#6.mid'
if("Gb6") soundfile = 'sound/violin/Gb6.mid'
if("Gn6") soundfile = 'sound/violin/Gn6.mid'
if("G#6") soundfile = 'sound/violin/G#6.mid'
if("Ab6") soundfile = 'sound/violin/Ab6.mid'
if("An6") soundfile = 'sound/violin/An6.mid'
if("A#6") soundfile = 'sound/violin/A#6.mid'
if("Bb6") soundfile = 'sound/violin/Bb6.mid'
if("Bn6") soundfile = 'sound/violin/Bn6.mid'
if("B#6") soundfile = 'sound/violin/B#6.mid'
if("Cb7") soundfile = 'sound/violin/Cb7.mid'
if("Cn7") soundfile = 'sound/violin/Cn7.mid'
if("C#7") soundfile = 'sound/violin/C#7.mid'
if("Db7") soundfile = 'sound/violin/Db7.mid'
if("Dn7") soundfile = 'sound/violin/Dn7.mid'
if("D#7") soundfile = 'sound/violin/D#7.mid'
if("Eb7") soundfile = 'sound/violin/Eb7.mid'
if("En7") soundfile = 'sound/violin/En7.mid'
if("E#7") soundfile = 'sound/violin/E#7.mid'
if("Fb7") soundfile = 'sound/violin/Fb7.mid'
if("Fn7") soundfile = 'sound/violin/Fn7.mid'
if("F#7") soundfile = 'sound/violin/F#7.mid'
if("Gb7") soundfile = 'sound/violin/Gb7.mid'
if("Gn7") soundfile = 'sound/violin/Gn7.mid'
if("G#7") soundfile = 'sound/violin/G#7.mid'
if("Ab7") soundfile = 'sound/violin/Ab7.mid'
if("An7") soundfile = 'sound/violin/An7.mid'
if("A#7") soundfile = 'sound/violin/A#7.mid'
if("Bb7") soundfile = 'sound/violin/Bb7.mid'
if("Bn7") soundfile = 'sound/violin/Bn7.mid'
if("B#7") soundfile = 'sound/violin/B#7.mid'
if("Cb8") soundfile = 'sound/violin/Cb8.mid'
if("Cn8") soundfile = 'sound/violin/Cn8.mid'
if("C#8") soundfile = 'sound/violin/C#8.mid'
if("Db8") soundfile = 'sound/violin/Db8.mid'
if("Dn8") soundfile = 'sound/violin/Dn8.mid'
if("D#8") soundfile = 'sound/violin/D#8.mid'
if("Eb8") soundfile = 'sound/violin/Eb8.mid'
if("En8") soundfile = 'sound/violin/En8.mid'
if("E#8") soundfile = 'sound/violin/E#8.mid'
if("Fb8") soundfile = 'sound/violin/Fb8.mid'
if("Fn8") soundfile = 'sound/violin/Fn8.mid'
if("F#8") soundfile = 'sound/violin/F#8.mid'
if("Gb8") soundfile = 'sound/violin/Gb8.mid'
if("Gn8") soundfile = 'sound/violin/Gn8.mid'
if("G#8") soundfile = 'sound/violin/G#8.mid'
if("Ab8") soundfile = 'sound/violin/Ab8.mid'
if("An8") soundfile = 'sound/violin/An8.mid'
if("A#8") soundfile = 'sound/violin/A#8.mid'
if("Bb8") soundfile = 'sound/violin/Bb8.mid'
if("Bn8") soundfile = 'sound/violin/Bn8.mid'
if("B#8") soundfile = 'sound/violin/B#8.mid'
if("Cb9") soundfile = 'sound/violin/Cb9.mid'
if("Cn9") soundfile = 'sound/violin/Cn9.mid'
else return
hearers(15, get_turf(src)) << sound(soundfile)
@@ -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 ..()
+1 -1
View File
@@ -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()
+19 -21
View File
@@ -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>"
+160 -30
View File
@@ -1,38 +1,168 @@
// BEDSHEET BIN
/*
CONTAINS:
BEDSHEETS
LINEN BINS
*/
/obj/item/weapon/bedsheet
name = "bedsheet"
desc = "A surprisingly soft linen bedsheet."
icon = 'icons/obj/items.dmi'
icon_state = "sheet"
item_state = "bedsheet"
layer = 4.0
throwforce = 1
throw_speed = 1
throw_range = 2
w_class = 1.0
color = "white"
/obj/item/weapon/bedsheet/attack_self(mob/user as mob)
user.drop_item()
if(layer == initial(layer))
layer = 5
else
layer = initial(layer)
add_fingerprint(user)
return
/obj/item/weapon/bedsheet/blue
icon_state = "sheetblue"
color = "blue"
/obj/item/weapon/bedsheet/green
icon_state = "sheetgreen"
color = "green"
/obj/item/weapon/bedsheet/orange
icon_state = "sheetorange"
color = "orange"
/obj/item/weapon/bedsheet/purple
icon_state = "sheetpurple"
color = "purple"
/obj/item/weapon/bedsheet/rainbow
icon_state = "sheetrainbow"
color = "rainbow"
/obj/item/weapon/bedsheet/red
icon_state = "sheetred"
color = "red"
/obj/item/weapon/bedsheet/yellow
icon_state = "sheetyellow"
color = "yellow"
/obj/item/weapon/bedsheet/mime
icon_state = "sheetmime"
color = "mime"
/obj/item/weapon/bedsheet/clown
icon_state = "sheetclown"
color = "clown"
/obj/item/weapon/bedsheet/captain
icon_state = "sheetcaptain"
color = "captain"
/obj/item/weapon/bedsheet/rd
icon_state = "sheetrd"
color = "director"
/obj/item/weapon/bedsheet/medical
icon_state = "sheetmedical"
color = "medical"
/obj/item/weapon/bedsheet/hos
icon_state = "sheethos"
color = "hosred"
/obj/item/weapon/bedsheet/hop
icon_state = "sheethop"
color = "hop"
/obj/item/weapon/bedsheet/ce
icon_state = "sheetce"
color = "chief"
/obj/item/weapon/bedsheet/brown
icon_state = "sheetbrown"
color = "brown"
/obj/structure/bedsheetbin
name = "linen bin"
desc = "A bin for containing bedsheets. It looks rather cosy."
icon = 'icons/obj/items.dmi'
icon_state = "bedbin"
var/amount = 23.0
anchored = 1.0
desc = "A linen bin. It looks rather cosy."
icon = 'icons/obj/structures.dmi'
icon_state = "linenbin-full"
anchored = 1
var/amount = 20
var/list/sheets = list()
var/obj/item/hidden = null
/obj/structure/bedsheetbin/attackby(obj/item/weapon/W as obj, mob/user as mob)
if (istype(W, /obj/item/weapon/bedsheet))
del(W)
src.amount++
return
/obj/structure/bedsheetbin/attack_paw(mob/user as mob)
return src.attack_hand(user)
/obj/structure/bedsheetbin/attack_hand(mob/user as mob)
if (src.amount >= 1)
src.amount--
new /obj/item/weapon/bedsheet( src.loc )
add_fingerprint(user)
/obj/structure/bedsheetbin/examine()
set src in oview(1)
src.amount = round(src.amount)
if (src.amount <= 0)
src.amount = 0
usr << desc
if(amount < 1)
usr << "There are no bed sheets in the bin."
else
if (src.amount == 1)
usr << "There is one bed sheet in the bin."
return
if(amount == 1)
usr << "There is one bed sheet in the bin."
return
usr << "There are [amount] bed sheets in the bin."
/obj/structure/bedsheetbin/update_icon()
switch(amount)
if(0) icon_state = "linenbin-empty"
if(1 to amount / 2) icon_state = "linenbin-half"
else icon_state = "linenbin-full"
/obj/structure/bedsheetbin/attackby(obj/item/I as obj, mob/user as mob)
if(istype(I, /obj/item/weapon/bedsheet))
user.drop_item()
I.loc = src
sheets.Add(I)
amount++
user << "<span class='notice'>You put [I] in [src].</span>"
else if(amount && !hidden && I.w_class < 4) //make sure there's sheets to hide it among, make sure nothing else is hidden in there.
user.drop_item()
I.loc = src
hidden = I
user << "<span class='notice'>You hide [I] among the sheets.</span>"
/obj/structure/bedsheetbin/attack_paw(mob/user as mob)
return attack_hand(user)
/obj/structure/bedsheetbin/attack_hand(mob/user as mob)
if(amount >= 1)
amount--
var/obj/item/weapon/bedsheet/B
if(sheets.len > 0)
B = sheets[sheets.len]
sheets.Remove(B)
else
usr << text("There are [] bed sheets in the bin.", src.amount)
return
B = new /obj/item/weapon/bedsheet(loc)
B.loc = user.loc
user.put_in_hands(B)
user << "<span class='notice'>You take [B] out of [src].</span>"
if(hidden)
hidden.loc = user.loc
user << "<span class='notice'>[hidden] falls out of [B]!</span>"
hidden = null
add_fingerprint(user)
@@ -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()
..()
+1 -1
View File
@@ -143,7 +143,7 @@
if(istype(W, /obj/item/weapon/screwdriver))
var/turf/T = get_turf(src)
user.visible_message("[user] tightens some bolts on the wall.", "You tighten the bolts on the wall.")
if(!mineral)
if(!mineral || mineral == "metal")
T.ReplaceWithWall()
else
T.ReplaceWithMineralWall(mineral)

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