diff --git a/baystation12.dme b/baystation12.dme
index 737deebe269..12b3af529ec 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -555,6 +555,7 @@
#include "code\game\machinery\computer\law.dm"
#include "code\game\machinery\computer\lockdown.dm"
#include "code\game\machinery\computer\medical.dm"
+#include "code\game\machinery\computer\message.dm"
#include "code\game\machinery\computer\Operating.dm"
#include "code\game\machinery\computer\pod.dm"
#include "code\game\machinery\computer\power.dm"
@@ -699,6 +700,7 @@
#include "code\game\objects\devices\shields.dm"
#include "code\game\objects\devices\taperecorder.dm"
#include "code\game\objects\devices\PDA\cart.dm"
+#include "code\game\objects\devices\PDA\chatroom.dm"
#include "code\game\objects\devices\PDA\PDA.dm"
#include "code\game\objects\devices\PDA\radio.dm"
#include "code\game\objects\items\apc_frame.dm"
@@ -1075,6 +1077,7 @@
#include "code\modules\mob\simple_animal\worm.dm"
#include "code\modules\power\apc.dm"
#include "code\modules\power\cable.dm"
+#include "code\modules\power\cable_heavyduty.dm"
#include "code\modules\power\cell.dm"
#include "code\modules\power\engine.dm"
#include "code\modules\power\generator.dm"
diff --git a/code/ATMOSPHERICS/components/binary_devices/circulator.dm b/code/ATMOSPHERICS/components/binary_devices/circulator.dm
index 378aa319032..87b1fe30d7e 100644
--- a/code/ATMOSPHERICS/components/binary_devices/circulator.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/circulator.dm
@@ -25,13 +25,15 @@
return null
//Calculate necessary moles to transfer using PV = nRT
- if((air1.total_moles > 0) && (air1.temperature>0))
+ if(air1.temperature>0)
var/pressure_delta = (input_starting_pressure - output_starting_pressure)/2
var/transfer_moles = pressure_delta*air2.volume/(air1.temperature * R_IDEAL_GAS_EQUATION)
last_pressure_delta = pressure_delta
+ //world << "pressure_delta = [pressure_delta]; transfer_moles = [transfer_moles];"
+
//Actually transfer the gas
var/datum/gas_mixture/removed = air1.remove(transfer_moles)
diff --git a/code/WorkInProgress/Cael_Aislinn/Tajara/say.dm b/code/WorkInProgress/Cael_Aislinn/Tajara/say.dm
index 4ab6c96894b..9c327ba5116 100644
--- a/code/WorkInProgress/Cael_Aislinn/Tajara/say.dm
+++ b/code/WorkInProgress/Cael_Aislinn/Tajara/say.dm
@@ -115,62 +115,7 @@
else if (length(message) >= 2)
var/channel_prefix = copytext(message, 1, 3)
- var/list/keys = list(
- ":r" = "right ear",
- ":l" = "left ear",
- ":i" = "intercom",
- ":h" = "department",
- ":c" = "Command",
- ":n" = "Science",
- ":m" = "Medical",
- ":e" = "Engineering",
- ":s" = "Security",
- ":w" = "whisper",
- ":b" = "binary",
- ":a" = "alientalk",
- ":t" = "Syndicate",
- ":d" = "Mining",
- ":q" = "Cargo",
- ":g" = "changeling",
-
- ":R" = "right hand",
- ":L" = "left hand",
- ":I" = "intercom",
- ":H" = "department",
- ":C" = "Command",
- ":N" = "Science",
- ":M" = "Medical",
- ":E" = "Engineering",
- ":S" = "Security",
- ":W" = "whisper",
- ":B" = "binary",
- ":A" = "alientalk",
- ":T" = "Syndicate",
- ":D" = "Mining",
- ":Q" = "Cargo",
- ":G" = "changeling",
-
- //kinda localization -- rastaf0
- //same keys as above, but on russian keyboard layout. This file uses cp1251 as encoding.
- ":ê" = "right hand",
- ":ä" = "left hand",
- ":ø" = "intercom",
- ":ð" = "department",
- ":ñ" = "Command",
- ":ò" = "Science",
- ":ü" = "Medical",
- ":ó" = "Engineering",
- ":û" = "Security",
- ":ö" = "whisper",
- ":è" = "binary",
- ":ô" = "alientalk",
- ":å" = "Syndicate",
- ":â" = "Mining",
- ":é" = "Cargo",
- ":ï" = "changeling",
- )
-
- message_mode = keys[channel_prefix]
+ message_mode = department_radio_keys[channel_prefix]
//world << "channel_prefix=[channel_prefix]; message_mode=[message_mode]"
if (message_mode)
message = trim(copytext(message, 3))
diff --git a/code/WorkInProgress/Cael_Aislinn/Tajara/whisper.dm b/code/WorkInProgress/Cael_Aislinn/Tajara/whisper.dm
index a4315a0ba9f..78354ba903f 100644
--- a/code/WorkInProgress/Cael_Aislinn/Tajara/whisper.dm
+++ b/code/WorkInProgress/Cael_Aislinn/Tajara/whisper.dm
@@ -5,6 +5,9 @@
if (!message)
return
+ if (silent)
+ return
+
log_whisper("[src.name]/[src.key] : [message]")
if (src.client && (src.client.muted || src.client.muted_complete))
diff --git a/code/defines/area/Space Station 13 areas.dm b/code/defines/area/Space Station 13 areas.dm
index aa979fb998f..6abf9e276b3 100755
--- a/code/defines/area/Space Station 13 areas.dm
+++ b/code/defines/area/Space Station 13 areas.dm
@@ -13,6 +13,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
*/
+
/area
var/fire = null
var/atmos = 1
@@ -593,31 +594,35 @@ proc/process_ghost_teleport_locs()
icon_state = "fpmaint"
/area/maintenance/fpmaint
- name = "Fore Port Maintenance"
+ name = "EVA Maintenance"
icon_state = "fpmaint"
/area/maintenance/fpmaint2
- name = "Secondary Fore Port Maintenance"
+ name = "Arrivals North Maintenance"
icon_state = "fpmaint"
/area/maintenance/fsmaint
- name = "Fore Starboard Maintenance"
+ name = "Security Maintenance"
+ icon_state = "fsmaint"
+
+/area/maintenance/fsmaint2
+ name = "Bar Maintenance"
icon_state = "fsmaint"
/area/maintenance/asmaint
- name = "Aft Starboard Maintenance"
+ name = "Library Maintenance"
icon_state = "asmaint"
/area/maintenance/asmaint2
- name = "Secondary Aft Starboard Maintenance"
+ name = "Med-Sci Maintenance"
icon_state = "asmaint"
/area/maintenance/apmaint
- name = "Aft Port Maintenance"
+ name = "Cargo Maintenance"
icon_state = "apmaint"
/area/maintenance/maintcentral
- name = "Central Maintenance"
+ name = "Bridge Maintenance"
icon_state = "maintcentral"
/area/maintenance/fore
@@ -629,11 +634,11 @@ proc/process_ghost_teleport_locs()
icon_state = "smaint"
/area/maintenance/port
- name = "Port Maintenance"
+ name = "Locker Room Maintenance"
icon_state = "pmaint"
/area/maintenance/aft
- name = "Aft Maintenance"
+ name = "Robotics Maintenance"
icon_state = "amaint"
/area/maintenance/storage
@@ -972,11 +977,11 @@ proc/process_ghost_teleport_locs()
LightLevels = list("Red" = 2, "Green" = 2, "Blue" = 3)
auxport
- name = "\improper Port Auxiliary Solar Array"
+ name = "\improper Fore Port Solar Array"
icon_state = "panelsA"
auxstarboard
- name = "\improper Starboard Auxiliary Solar Array"
+ name = "\improper Fore Starboard Solar Array"
icon_state = "panelsA"
fore
@@ -988,27 +993,27 @@ proc/process_ghost_teleport_locs()
icon_state = "aft"
starboard
- name = "\improper Starboard Solar Array"
+ name = "\improper Aft Starboard Solar Array"
icon_state = "panelsS"
port
- name = "\improper Port Solar Array"
+ name = "\improper Aft Port Solar Array"
icon_state = "panelsP"
/area/maintenance/auxsolarport
- name = "Port Auxiliary Solar Maintenance"
+ name = "Fore Port Solar Maintenance"
icon_state = "SolarcontrolA"
/area/maintenance/starboardsolar
- name = "Starboard Solar Maintenance"
+ name = "Aft Starboard Solar Maintenance"
icon_state = "SolarcontrolS"
/area/maintenance/portsolar
- name = "Port Solar Maintenance"
+ name = "Aft Port Solar Maintenance"
icon_state = "SolarcontrolP"
/area/maintenance/auxsolarstarboard
- name = "Starboard Auxiliary Solar Maintenance"
+ name = "Fore Starboard Solar Maintenance"
icon_state = "SolarcontrolA"
@@ -1552,6 +1557,10 @@ proc/process_ghost_teleport_locs()
name = "\improper Telecommunications Satellite Foyer"
icon_state = "tcomsatlob"
+/area/turret_protected/tcomfoyer
+ name = "\improper Telecoms Foyer"
+ icon_state = "tcomsatentrance"
+
/area/turret_protected/tcomwest
name = "\improper Telecommunications Satellite West Wing"
icon_state = "tcomsatwest"
diff --git a/code/defines/obj.dm b/code/defines/obj.dm
index 43a2cc90e4f..2441c741073 100644
--- a/code/defines/obj.dm
+++ b/code/defines/obj.dm
@@ -720,6 +720,18 @@
color="pink"
icon = 'power_cond_pink.dmi'
+/obj/structure/cable/orange
+ color="orange"
+ icon = 'power_cond_orange.dmi'
+
+/obj/structure/cable/cyan
+ color="cyan"
+ icon = 'power_cond_cyan.dmi'
+
+/obj/structure/cable/white
+ color="white"
+ icon = 'power_cond_white.dmi'
+
/obj/effect/manifest
name = "manifest"
icon = 'screen1.dmi'
diff --git a/code/defines/obj/vending.dm b/code/defines/obj/vending.dm
index ef6483512ff..1da471db469 100755
--- a/code/defines/obj/vending.dm
+++ b/code/defines/obj/vending.dm
@@ -334,8 +334,8 @@
icon_deny = "engivend-deny"
req_access_txt = "10" //Engineering access
product_paths = "/obj/item/weapon/cable_coil/random;/obj/item/weapon/crowbar;/obj/item/weapon/weldingtool/largetank;/obj/item/weapon/wirecutters;/obj/item/weapon/wrench;/obj/item/device/t_scanner;/obj/item/device/multitool;/obj/item/weapon/airlock_electronics;/obj/item/weapon/module/power_control"
-// product_amounts = "10;5;3;5;5;5;3;5;5"
- product_prices = "1;2;3;2;2;2;3;2;2"
+// product_amounts = "5;3;5;3;5;5;5;2;3;3"
+ product_prices = "2;2;3;2;2;2;4;2;2"
product_hidden = "/obj/item/weapon/weldingtool/hugetank;/obj/item/clothing/gloves/fyellow"
// product_hideamt = "2;2"
hidden_prices = "4;4"
diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm
index f8ac673341e..a13ae184f41 100644
--- a/code/defines/obj/weapon.dm
+++ b/code/defines/obj/weapon.dm
@@ -794,6 +794,18 @@
color = "pink"
icon_state = "coil_pink"
+/obj/item/weapon/cable_coil/orange
+ color = "orange"
+ icon_state = "coil_orange"
+
+/obj/item/weapon/cable_coil/cyan
+ color = "cyan"
+ icon_state = "coil_cyan"
+
+/obj/item/weapon/cable_coil/white
+ color = "white"
+ icon_state = "coil_white"
+
/obj/item/weapon/cable_coil/random/New()
color = pick("red","yellow","green","blue","pink")
icon_state = "coil_[color]"
@@ -972,14 +984,41 @@
m_amt = 500
origin_tech = "materials=1"
var/dispenser = 0
-
-/obj/item/weapon/handcuffs/cyborg
- dispenser = 1
+ var/breakouttime = 1200 //Deciseconds = 120s = 2 minutes
/obj/item/weapon/handcuffs/cable
name = "cable restraints"
desc = "Looks like some cables tied together. Could be used to tie something up."
icon_state = "cuff_red"
+ breakouttime = 300 //Deciseconds = 30s
+
+/obj/item/weapon/handcuffs/cable/red
+ icon_state = "cuff_red"
+
+/obj/item/weapon/handcuffs/cable/yellow
+ icon_state = "cuff_yellow"
+
+/obj/item/weapon/handcuffs/cable/blue
+ icon_state = "cuff_blue"
+
+/obj/item/weapon/handcuffs/cable/green
+ icon_state = "cuff_green"
+
+/obj/item/weapon/handcuffs/cable/pink
+ icon_state = "cuff_pink"
+
+/obj/item/weapon/handcuffs/cable/orange
+ icon_state = "cuff_orange"
+
+/obj/item/weapon/handcuffs/cable/cyan
+ icon_state = "cuff_cyan"
+
+/obj/item/weapon/handcuffs/cable/white
+ icon_state = "cuff_white"
+
+/obj/item/weapon/handcuffs/cyborg
+ dispenser = 1
+
/obj/item/weapon/locator
name = "locator"
@@ -1356,12 +1395,20 @@ eternal248: Found broken and buggy Z-levels 7-12, ended up leading to my discove
maxcharge = 500
g_amt = 40
+/obj/item/weapon/cell/crap/empty/New()
+ ..()
+ charge = 0
+
/obj/item/weapon/cell/secborg
name = "\improper Security borg rechargable D battery"
origin_tech = "powerstorage=0"
maxcharge = 600 //600 max charge / 100 charge per shot = six shots
g_amt = 40
+/obj/item/weapon/cell/secborg/empty/New()
+ ..()
+ charge = 0
+
/obj/item/weapon/cell/high
name = "high-capacity power cell"
origin_tech = "powerstorage=2"
@@ -1369,6 +1416,10 @@ eternal248: Found broken and buggy Z-levels 7-12, ended up leading to my discove
maxcharge = 10000
g_amt = 60
+/obj/item/weapon/cell/high/empty/New()
+ ..()
+ charge = 0
+
/obj/item/weapon/cell/super
name = "super-capacity power cell"
origin_tech = "powerstorage=5"
@@ -1377,6 +1428,10 @@ eternal248: Found broken and buggy Z-levels 7-12, ended up leading to my discove
g_amt = 70
construction_cost = list("metal"=750,"glass"=100)
+/obj/item/weapon/cell/super/empty/New()
+ ..()
+ charge = 0
+
/obj/item/weapon/cell/hyper
name = "hyper-capacity power cell"
origin_tech = "powerstorage=6"
@@ -1385,6 +1440,10 @@ eternal248: Found broken and buggy Z-levels 7-12, ended up leading to my discove
g_amt = 80
construction_cost = list("metal"=500,"glass"=150,"gold"=200,"silver"=200)
+/obj/item/weapon/cell/hyper/empty/New()
+ ..()
+ charge = 0
+
/obj/item/weapon/cell/infinite
name = "infinite-capacity power cell!"
icon_state = "icell"
diff --git a/code/game/dna.dm b/code/game/dna.dm
index 534950cb024..00552d48979 100644
--- a/code/game/dna.dm
+++ b/code/game/dna.dm
@@ -181,17 +181,23 @@
else
return null
-/proc/getblockstring(input,block,subblock,blocksize)
+/proc/getblockstring(input,block,subblock,blocksize,src,ui) // src is probably used here just for urls; ui is 1 when requesting for the unique identifier screen, 0 for structural enzymes screen
var/string
var/subpos = 1 // keeps track of the current sub block
var/blockpos = 1 // keeps track of the current block
+
for(var/i = 1, i <= length(input), i++) // loop through each letter
- var/pushstring = copytext(input, i, i+1)
+ var/pushstring
if(subpos == subblock && blockpos == block) // if the current block/subblock is selected, mark it
pushstring = "[copytext(input, i, i+1)]"
+ else
+ if(ui) //This is for allowing block clicks to be differentiated
+ pushstring = "[copytext(input, i, i+1)]"
+ else
+ pushstring = "[copytext(input, i, i+1)]"
string += pushstring // push the string to the return string
@@ -266,6 +272,8 @@
return 1
else
return 0
+
+
if (temp2 >= 2050 + BLOCKADD)
return 1
else
@@ -330,7 +338,7 @@
/////////////////////////// DNA HELPER-PROCS
/////////////////////////// DNA MISC-PROCS
-/proc/updateappearance(mob/M as mob,structure)
+/proc/updateappearance(mob/M as mob , structure)
if(istype(M, /mob/living/carbon/human))
M.dna.check_integrity()
var/mob/living/carbon/human/H = M
@@ -1032,7 +1040,7 @@
//src.temphtml = text("Unique Identifier: [getleftblocks(src.connected.occupant.dna.uni_identity,uniblock,3)][src.subblock == 1 ? ""+getblock(getblock(src.connected.occupant.dna.uni_identity,src.uniblock,3),1,1)+"" : getblock(getblock(src.connected.occupant.dna.uni_identity,src.uniblock,3),1,1)][src.subblock == 2 ? ""+getblock(getblock(src.connected.occupant.dna.uni_identity,src.uniblock,3),2,1)+"" : getblock(getblock(src.connected.occupant.dna.uni_identity,src.uniblock,3),2,1)][src.subblock == 3 ? ""+getblock(getblock(src.connected.occupant.dna.uni_identity,src.uniblock,3),3,1)+"" : getblock(getblock(src.connected.occupant.dna.uni_identity,src.uniblock,3),3,1)][getrightblocks(src.connected.occupant.dna.uni_identity,uniblock,3)]
")
// New way of displaying DNA blocks
- src.temphtml = text("Unique Identifier: [getblockstring(src.connected.occupant.dna.uni_identity,uniblock,subblock,3)]
")
+ src.temphtml = text("Unique Identifier: [getblockstring(src.connected.occupant.dna.uni_identity,uniblock,subblock,3, src,1)]
")
src.temphtml += text("Selected Block: []
", src.uniblock)
src.temphtml += text("<- Block ->
", src, src)
@@ -1057,6 +1065,14 @@
if (src.subblock > 1)
src.subblock--
dopage(src,"unimenu")
+ if (href_list["uimenuset"] && href_list["uimenusubset"]) // This chunk of code updates selected block / sub-block based on click
+ var/menuset = text2num(href_list["uimenuset"])
+ var/menusubset = text2num(href_list["uimenusubset"])
+ if ((menuset <= 27) && (menuset >= 1))
+ src.uniblock = menuset
+ if ((menusubset <= 3) && (menusubset >= 1))
+ src.subblock = menusubset
+ dopage(src, "unimenu")
if (href_list["unipulse"])
if(src.connected.occupant)
var/block
@@ -1119,7 +1135,7 @@
//src.temphtml = text("Structural Enzymes: []
", src.connected.occupant.dna.struc_enzymes)
// New shit, it doesn't suck (as much)
- src.temphtml = text("Structural Enzymes: [getblockstring(src.connected.occupant.dna.struc_enzymes,strucblock,subblock,3)]
")
+ src.temphtml = text("Structural Enzymes: [getblockstring(src.connected.occupant.dna.struc_enzymes,strucblock,subblock,3,src,0)]
")
// SE of occupant, selected block, selected subblock, block size (3 subblocks)
src.temphtml += text("Selected Block: []
", src.strucblock)
@@ -1153,6 +1169,14 @@
if (src.subblock > 1)
src.subblock--
dopage(src,"strucmenu")
+ if (href_list["semenuset"] && href_list["semenusubset"]) // This chunk of code updates selected block / sub-block based on click (se stands for strutural enzymes)
+ var/menuset = text2num(href_list["semenuset"])
+ var/menusubset = text2num(href_list["semenusubset"])
+ if ((menuset <= 14) && (menuset >= 1))
+ src.strucblock = menuset
+ if ((menusubset <= 3) && (menusubset >= 1))
+ src.subblock = menusubset
+ dopage(src, "strucmenu")
if (href_list["strucpulse"])
var/block
var/newblock
diff --git a/code/game/gamemodes/changeling/modularchangling.dm b/code/game/gamemodes/changeling/modularchangling.dm
index 6b50ce914ab..8ba655a22c2 100644
--- a/code/game/gamemodes/changeling/modularchangling.dm
+++ b/code/game/gamemodes/changeling/modularchangling.dm
@@ -407,7 +407,8 @@ var/list/obj/effect/proc_holder/power/powerinstances = list()
Changling Evolution Menu
Hover over a power to see more information
- Current genomes left to evolve with: [usr.changeling.geneticpoints]
+ Current evolution points left to evolve with: [usr.changeling.geneticpoints]
+ Absorb genomes to acquire more evolution points
|
diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm
index ccd9fd3077f..80be29fb139 100644
--- a/code/game/jobs/job/science.dm
+++ b/code/game/jobs/job/science.dm
@@ -44,6 +44,6 @@
H.equip_if_possible(new /obj/item/clothing/shoes/white(H), H.slot_shoes)
H.equip_if_possible(new /obj/item/device/pda/toxins(H), H.slot_belt)
H.equip_if_possible(new /obj/item/clothing/suit/storage/labcoat/science(H), H.slot_wear_suit)
- H.equip_if_possible(new /obj/item/clothing/mask/gas(H), H.slot_wear_mask)
- H.equip_if_possible(new /obj/item/weapon/tank/oxygen(H), H.slot_l_hand)
+// H.equip_if_possible(new /obj/item/clothing/mask/gas(H), H.slot_wear_mask)
+// H.equip_if_possible(new /obj/item/weapon/tank/oxygen(H), H.slot_l_hand)
return 1
\ No newline at end of file
diff --git a/code/game/machinery/airlock_control.dm b/code/game/machinery/airlock_control.dm
index d93ff2a4985..2d71e96176d 100644
--- a/code/game/machinery/airlock_control.dm
+++ b/code/game/machinery/airlock_control.dm
@@ -175,6 +175,7 @@ obj/machinery/access_button
icon_state = "access_button_off"
attack_hand(mob/user)
+ src.add_fingerprint(usr)
if(!allowed(user))
user << "\red Access Denied"
diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm
index d990db18830..fd5ca96bb40 100644
--- a/code/game/machinery/computer/buildandrepair.dm
+++ b/code/game/machinery/computer/buildandrepair.dm
@@ -29,6 +29,10 @@
var/frame_desc = null
var/contain_parts = 1
+/obj/item/weapon/circuitboard/message_monitor
+ name = "Circuit board (Message Monitor)"
+ build_path = "/obj/machinery/computer/message_monitor"
+ origin_tech = "programming=3"
/obj/item/weapon/circuitboard/aicore
name = "Circuit board (AI core)"
origin_tech = "programming=4;biotech=2"
diff --git a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm
new file mode 100644
index 00000000000..7d826a7c2e1
--- /dev/null
+++ b/code/game/machinery/computer/message.dm
@@ -0,0 +1,209 @@
+
+// Allows you to monitor messages that passes the server.
+
+/obj/machinery/computer/message_monitor
+ name = "Message Monitor Console"
+ desc = "Used to Monitor the crew's messages, that are sent via PDA."
+ icon_state = "comm_monitor"
+ circuit = "/obj/item/weapon/circuitboard/message_monitor"
+ var/obj/machinery/message_server/linkedServer = null
+ var/screen = 0 // 0 = Main menu, 1 = Message Logs
+ var/hacking = 0 // Is it being hacked into by the AI/Cyborg
+
+
+/obj/machinery/computer/message_monitor/attackby(obj/item/weapon/O as obj, mob/user as mob)
+ if(istype(O,/obj/item/weapon/card/emag/))
+ //Just brings up the Message Log without having to know the passcode.
+ if(!hacking)
+ usr << "BZZT.. The console beeps and brings up the Message Logs."
+ screen = 1
+ else
+ usr << "It looks like the console is already being hacked into."
+ ..()
+ return
+
+/obj/machinery/computer/message_monitor/process()
+ //Is the server isn't linked to a server, and there's a server available, default it to the first one in the list.
+ if(!linkedServer)
+ if(message_servers && message_servers.len > 0)
+ linkedServer = message_servers[1]
+ return
+
+/obj/machinery/computer/message_monitor/attack_hand(var/mob/user as mob)
+ if(stat & (NOPOWER|BROKEN))
+ return
+ if(!istype(user, /mob/living))
+ return
+ var/dat = "Message Monitor Console"
+ dat += "Message Monitor Console
"
+ switch(screen)
+ //Main menu
+ if(0)
+ if(hacking)
+ screen = 2
+ return src.attack_hand(user)
+ if(!linkedServer || (linkedServer.stat & (NOPOWER|BROKEN)))
+ dat += "1. ERROR: Server not found
"
+ else
+ dat += "1. Toggle Power: [src.linkedServer.active ? "\[On\]":"\[Off\]"]
"
+ dat += "2. Link To A Server
"
+ dat += "3. Clear Message Logs
"
+ dat += " KEY REQUIRED
"
+ dat += "4. View Message Logs
"
+ dat += "5. Set Custom Key
"
+ //Malf/Traitor AIs can bruteforce into the system to gain the Key.
+ if((istype(user, /mob/living/silicon/ai) || istype(user, /mob/living/silicon/robot)) && (user.mind.special_role && user.mind.original == user))
+ dat += "*&@. Bruteforce Key
"
+ //Message Logs
+ if(1)
+ if(hacking)
+ screen = 2
+ return src.attack_hand(user)
+ if(!linkedServer || (linkedServer.stat & (NOPOWER|BROKEN)))
+ usr << "No server detected."
+ screen = 0
+ return src.attack_hand(user)
+
+ var/index = 0
+ //var/recipient = "Unspecified" //name of the person
+ //var/sender = "Unspecified" //name of the sender
+ //var/message = "Blank" //transferred message
+ dat += "Return - Refresh
"
+ dat += "| Sender | Recipient | Message |
"
+ for(var/list/datum/data_pda_msg/pda in src.linkedServer.pda_msgs)
+ index++
+ if(index > 3000)
+ break
+ dat += "| [pda.sender] | [pda.recipient] | [pda.message] |
"
+ dat += "
"
+ //Hacking screen.
+ if(2)
+ if(!hacking)
+ screen = 0
+ return src.attack_hand(user)
+ if(istype(user, /mob/living/silicon/ai) || istype(user, /mob/living/silicon/robot))
+ dat += "Brute-forcing for server key.
This will take anywhere from two to five minutes."
+ dat += "In the meantime, this console can reveal your true intentions if you let someone access it. Make sure no humans enter the room during that time."
+ else
+ //It's the same message as the one above but in binary. Because robots understand binary and humans don't... well I thought it was clever.
+ dat += {"010101000110100001101001011100110010000001110111011010010110110
+ 0011011000010000001110100011000010110101101100101001000000110000101101110
+ 01111001011101110110100001100101011100100110010100100000011001100111001001
+ 10111101101101001000000111010001110111011011110010000001110100011011110010
+ 00000110011001101001011101100110010100100000011011010110100101101110011101
+ 01011101000110010101110011001011100010000001001001011011100010000001110100
+ 01101000011001010010000001101101011001010110000101101110001011010111010001
+ 10100101101101011001010010110000100000011101000110100001101001011100110010
+ 00000110001101101111011011100111001101101111011011000110010100100000011000
+ 11011000010110111000100000011100100110010101110110011001010110000101101100
+ 00100000011110010110111101110101011100100010000001110100011100100111010101
+ 10010100100000011010010110111001110100011001010110111001110100011010010110
+ 11110110111001110011001000000110100101100110001000000111100101101111011101
+ 01001000000110110001100101011101000010000001110011011011110110110101100101
+ 01101111011011100110010100100000011000010110001101100011011001010111001101
+ 11001100100000011010010111010000101110001000000100110101100001011010110110
+ 01010010000001110011011101010111001001100101001000000110111001101111001000
+ 00011010000111010101101101011000010110111001110011001000000110010101101110
+ 01110100011001010111001000100000011101000110100001100101001000000111001001
+ 10111101101111011011010010000001100100011101010111001001101001011011100110
+ 01110010000001110100011010000110000101110100001000000111010001101001011011
+ 010110010100101110"}
+
+
+ dat += ""
+ user << browse(dat, "window=message;size=500x700")
+ onclose(user, "message")
+ return
+
+/obj/machinery/computer/message_monitor/attack_ai(mob/user as mob)
+ return src.attack_hand(user)
+
+/obj/machinery/computer/message_monitor/proc/BruteForce(mob/user as mob)
+ var/currentKey = src.linkedServer.decryptkey
+ user << "Brute-force completed! The key is '[currentKey]'."
+ src.hacking = 0
+ src.screen = 0 // Return the screen back to normal
+
+/obj/machinery/computer/message_monitor/Topic(href, href_list)
+ if(..())
+ return
+ if(stat & (NOPOWER|BROKEN))
+ return
+ if(!istype(usr, /mob/living))
+ return
+ if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon)))
+
+ if (href_list["active"])
+ linkedServer.active = !linkedServer.active
+
+ if (href_list["find"])
+ if(message_servers && message_servers.len > 1)
+ src.linkedServer = input(usr,"Please select a server.", "Select a server.", null) as null|anything in message_servers
+ usr << "Server selected."
+ else if(message_servers && message_servers.len > 0)
+ linkedServer = message_servers[1]
+ usr << "Single Server Detected - Server selected."
+ else
+ usr << "No server detected."
+
+ if (href_list["view"])
+ if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN)))
+ usr << "No server detected."
+ else
+ var/dkey = trim(input(usr, "Please enter the decryption key.") as text|null)
+ if(dkey && dkey != "")
+ if(src.linkedServer.decryptkey == dkey)
+ src.screen = 1
+ else
+ usr << "ALERT: Incorrect password!"
+
+
+ if (href_list["clear"])
+ if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN)))
+ usr << "No server detected."
+ else
+ src.linkedServer.pda_msgs = list()
+ usr << "Logs cleared."
+
+ if (href_list["pass"])
+ if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN)))
+ usr << "No server detected."
+ else
+ var/dkey = trim(input(usr,"Please enter the decryption key.") as text|null)
+ if(dkey && dkey != "")
+ if(dkey == src.linkedServer.decryptkey)
+ var/newkey = trim(input(usr,"Please enter the new key."))
+ if(newkey && newkey != "")
+ src.linkedServer.decryptkey = newkey
+ usr << "Password set."
+ else
+ usr << "ALERT: Incorrect password!"
+
+ if (href_list["hack"])
+ if((istype(usr, /mob/living/silicon/ai) || istype(usr, /mob/living/silicon/robot)) && (usr.mind.special_role && usr.mind.original == usr))
+ src.hacking = 1
+ src.screen = 2
+ //usr << "[src.linkedServer.decryptkey]"
+ spawn((100*6)*rand(2, 4))
+ if(src && src.linkedServer && usr)
+ BruteForce(usr)
+
+
+ if (href_list["back"])
+ src.screen = 0
+
+ return src.attack_hand(usr)
+
+
+/obj/item/weapon/paper/monitorkey
+ //..()
+ name = "Monitor Decryption Key"
+ var/obj/machinery/message_server/server = null
+
+/obj/item/weapon/paper/monitorkey/New()
+ ..()
+ if(message_servers && message_servers.len > 0)
+ server = message_servers[1]
+ info = "Daily Key Reset
The new message monitor key is '[server.decryptkey]'.
Please keep this a secret.
If necessary, change the password to a more secure one."
+// info_links = info
+ overlays += "paper_words"
\ No newline at end of file
diff --git a/code/game/machinery/door_control.dm b/code/game/machinery/door_control.dm
index 3b7e784473c..8ece942dfc0 100644
--- a/code/game/machinery/door_control.dm
+++ b/code/game/machinery/door_control.dm
@@ -59,6 +59,7 @@
return src.attack_hand(user)
/obj/machinery/door_control/attack_hand(mob/user as mob)
+ src.add_fingerprint(usr)
if(stat & (NOPOWER|BROKEN))
return
@@ -69,6 +70,7 @@
use_power(5)
icon_state = "doorctrl1"
+ add_fingerprint(user)
if(normaldoorcontrol)
for(var/obj/machinery/door/airlock/D in range(range))
@@ -119,7 +121,6 @@
spawn(15)
if(!(stat & NOPOWER))
icon_state = "doorctrl0"
- src.add_fingerprint(usr)
/obj/machinery/door_control/power_change()
..()
@@ -142,10 +143,12 @@
/obj/machinery/driver_button/attack_hand(mob/user as mob)
+ src.add_fingerprint(usr)
if(stat & (NOPOWER|BROKEN))
return
if(active)
return
+ add_fingerprint(user)
use_power(5)
diff --git a/code/game/machinery/telecomms/telemonitor.dm b/code/game/machinery/telecomms/telemonitor.dm
index 4e9c114b535..8c336ba3cb7 100644
--- a/code/game/machinery/telecomms/telemonitor.dm
+++ b/code/game/machinery/telecomms/telemonitor.dm
@@ -12,7 +12,7 @@
icon_state = "comm_monitor"
var/screen = 0 // the screen number:
- var/list/t_machines = list() // the machines located by the computer
+ var/list/machinelist = list() // the machines located by the computer
var/obj/machinery/telecomms/SelectedMachine
var/network = "NULL" // the network to probe
@@ -83,7 +83,7 @@
switch(href_list["operation"])
if("release")
- t_machines = list()
+ machinelist = list()
screen = 0
if("mainmenu")
@@ -116,7 +116,7 @@
else
network = newnet
screen = 0
- t_machines = list()
+ machinelist = list()
temp = "- NEW NETWORK TAG SET IN ADDRESS \[[network]\] -"
updateUsrDialog()
diff --git a/code/game/machinery/telecomms/traffic_control.dm b/code/game/machinery/telecomms/traffic_control.dm
index 6c44e0881eb..12292ce27fa 100644
--- a/code/game/machinery/telecomms/traffic_control.dm
+++ b/code/game/machinery/telecomms/traffic_control.dm
@@ -1,4 +1,4 @@
-//This file was auto-corrected by findeclaration.exe on 29/05/2012 15:03:04
+//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32
diff --git a/code/game/objects/closets/firecloset.dm b/code/game/objects/closets/firecloset.dm
index c3a6ad2fbc5..245991be54d 100644
--- a/code/game/objects/closets/firecloset.dm
+++ b/code/game/objects/closets/firecloset.dm
@@ -60,11 +60,11 @@
if(prob(20))
new /obj/item/weapon/storage/belt/utility(src)
if(prob(30))
- new /obj/item/weapon/cable_coil(src)
+ new /obj/item/weapon/cable_coil/random(src)
if(prob(30))
- new /obj/item/weapon/cable_coil(src)
+ new /obj/item/weapon/cable_coil/random(src)
if(prob(30))
- new /obj/item/weapon/cable_coil(src)
+ new /obj/item/weapon/cable_coil/random(src)
if(prob(20))
new /obj/item/device/multitool(src)
if(prob(5))
diff --git a/code/game/objects/devices/PDA/PDA.dm b/code/game/objects/devices/PDA/PDA.dm
index 83658eb318e..6e6bce5da89 100755
--- a/code/game/objects/devices/PDA/PDA.dm
+++ b/code/game/objects/devices/PDA/PDA.dm
@@ -243,6 +243,7 @@
dat += "
Notekeeper"
dat += "
Messenger"
dat += "
View Crew Manifest"
+ //dat += "
Nanotrasen Relay Chat"
if (cartridge)
if (cartridge.access_clown)
@@ -382,6 +383,17 @@
dat += "OTHER: [round(unknown_level)]%
"
dat += "Temperature: [round(environment.temperature-T0C)]°C
"
dat += "
"
+
+ if (5)
+ dat += "
Nanotrasen Relay Chat
"
+
+ dat += "
Detected Channels
: "
+ for(var/datum/chatroom/C in chatrooms)
+ dat += "#[html_encode(lowertext(C.name))]"
+ if(C.password != "")
+ dat += "
"
+ dat += ""
+
if (41) //crew manifest
dat += "
Crew Manifest
"
@@ -454,12 +466,14 @@
mode = 2
if("21")//Read messeges
mode = 21
- if("41")//Read messeges
+ if("41")//Check Manifest
mode = 41
if("3")//Atmos scan
mode = 3
if("4")//Redirects to hub
mode = 0
+ if("chatroom") // chatroom hub
+ mode = 5
//MAIN FUNCTIONS===================================
@@ -555,70 +569,84 @@
return
last_text = world.time
+ // check if telecomms I/O route 1459 is stable
+ //var/telecomms_intact = telecomms_process(P.owner, owner, t)
+ var/obj/machinery/message_server/useMS = null
+ if(message_servers)
+ for (var/obj/machinery/message_server/MS in message_servers)
+ //PDAs are now dependant on the Message Server.
+ if(MS.active)
+ useMS = MS
+ break
+ if(useMS) // only send the message if it's stable
+ useMS.send_pda_message("[P.owner]","[owner]","[t]")
+ tnote += "→ To [P.owner]:
[t]
"
+ P.tnote += "← From [owner] ([ownjob]):
[t]
"
- var/AnsweringMS = 0
- for (var/obj/machinery/message_server/MS in world)
- MS.send_pda_message("[P.owner]","[owner]","[t]")
- if(MS.active)
- AnsweringMS++
+ // Give every ghost the ability to see all messages
+ for (var/mob/dead/observer/G in world)
+ G.show_message("PDA message from [src.owner] to [P:owner]: [t]")
+
+ if (prob(15)) //Give the AI a chance of intercepting the message
+ var/who = src.owner
+ if(prob(50))
+ who = P:owner
+ for(var/mob/living/silicon/ai/ai in world)
+ ai.show_message("Intercepted message from [who]: [t]")
- if(!AnsweringMS)
- return
-
- tnote += "→ To [P.owner]:
[t]
"
- P.tnote += "← From [owner] ([ownjob]):
[t]
"
-
- // Give every ghost the ability to see all messages
- for (var/mob/dead/observer/G in world)
- G.show_message("PDA message from [src.owner] to [P:owner]: [t]")
-
- if (prob(15)) //Give the AI a chance of intercepting the message
- var/who = src.owner
- if(prob(50))
- who = P:owner
- for(var/mob/living/silicon/ai/ai in world)
- ai.show_message("Intercepted message from [who]: [t]")
-
- if (!P.silent)
- playsound(P.loc, 'twobeep.ogg', 50, 1)
- for (var/mob/O in hearers(3, P.loc))
- O.show_message(text("\icon[P] *[P.ttone]*"))
- if( P.loc && ishuman(P.loc) )
- var/mob/living/carbon/human/H = P.loc
- H << "\icon[P] Message from [src.owner] ([ownjob]), \"[t]\" (Reply)"
-
- P.overlays = null
- P.overlays += image('pda.dmi', "pda-r")
+ if (!P.silent)
+ playsound(P.loc, 'twobeep.ogg', 50, 1)
+ for (var/mob/O in hearers(3, P.loc))
+ O.show_message(text("\icon[P] *[P.ttone]*"))
+ if( P.loc && ishuman(P.loc) )
+ var/mob/living/carbon/human/H = P.loc
+ H << "\icon[P] Message from [src.owner] ([ownjob]), \"[t]\" (Reply)"
+ log_pda("[usr] (PDA: [src.name]) sent \"[t]\" to [P.name]")
+ P.overlays = null
+ P.overlays += image('pda.dmi', "pda-r")
+ else
+ U << "ERROR: Server isn't responding."
// pAI Message
else
- var/AnsweringMS = 0
- for (var/obj/machinery/message_server/MS in world)
- MS.send_pda_message("[P]","[src]","[t]")
- if(MS.active)
- AnsweringMS++
+ //var/telecomms_intact = telecomms_process(P.owner, owner, t)
+ var/obj/machinery/message_server/useMS = null
+ if(message_servers)
+ for (var/obj/machinery/message_server/MS in message_servers)
+ //PDAs are now dependant on the Message Server.
+ if(MS.active)
+ useMS = MS
+ break
+ if(useMS) // only send the message if it's stable
+ useMS.send_pda_message("[P.owner]","[owner]","[t]")
+ tnote += "→ To [P]:
[t]
"
+ P.tnote += "← From [src]:
[t]
"
- if(!AnsweringMS)
- return
+ // Give every ghost the ability to see all messages
+ for (var/mob/dead/observer/G in world)
+ G.show_message("PDA message from [src.owner] to [P:owner]: [t]")
+ if (prob(15)) //Give the AI a chance of intercepting the message
+ var/who = src
+ if(prob(50))
+ who = P
+ for (var/mob/living/silicon/ai/ai in world)
+ ai.show_message("Intercepted message from [who]: [t]")
- tnote += "→ To [P]:
[t]
"
- P.tnote += "← From [src]:
[t]
"
+ if (!P.silent)
+ playsound(P.loc, 'twobeep.ogg', 50, 1)
+ for (var/mob/O in hearers(3, P.loc))
+ O.show_message(text("\icon[P] *[P.ttone]*"))
+ if( P.loc && ishuman(P.loc) )
+ var/mob/living/carbon/human/H = P.loc
+ H << "\icon[P] Message from [src.owner] ([ownjob]), \"[t]\" (Reply)"
+ log_pda("[usr] (PDA: [src.name]) sent \"[t]\" to [P.name]")
+ else
+ U << "ERROR: Server isn't responding."
- if (prob(15)) //Give the AI a chance of intercepting the message
- var/who = src
- if(prob(50))
- who = P
- for (var/mob/living/silicon/ai/ai in world)
- ai.show_message("Intercepted message from [who]: [t]")
-
- playsound(P.loc, 'twobeep.ogg', 50, 1)
-
- log_pda("[usr] (PDA: [src.name]) sent \"[t]\" to [P.name]")
-
if("Send Honk")//Honk virus
if(istype(cartridge, /obj/item/weapon/cartridge/clown))//Cartridge checks are kind of unnecessary since everything is done through switch.
@@ -756,6 +784,37 @@
id.loc = get_turf(src)
id = null
+/obj/item/device/pda/proc/telecomms_process(var/receipent, var/originator, var/data)
+ var/telecomms_intact = 0
+ /* Make sure telecomms is intact */
+ for (var/obj/machinery/telecomms/receiver/R in world)
+
+ if((1459 in R.freq_listening) && R.on)
+
+ for (var/obj/machinery/telecomms/bus/B in R.links)
+
+ if((1459 in B.freq_listening) && B.on)
+
+ for(var/obj/machinery/telecomms/server/S in B.links)
+
+ if((1459 in S.freq_listening) && S.on)
+ // Add a log
+ S.add_entry("[originator] sent to [receipent]: \"[data]\"", "PDA log")
+
+ for(var/obj/machinery/telecomms/broadcaster/C in S.links)
+
+ if(((1459 in C.freq_listening || C.freq_listening.len == 0)) && C.on)
+
+ telecomms_intact = 1
+ break
+
+ break
+ break
+ break
+
+ return telecomms_intact
+
+
/obj/item/device/pda/verb/verb_remove_id()
set category = "Object"
set name = "Remove id"
@@ -1017,17 +1076,28 @@
if (selected:toff)
return
+ var/obj/machinery/message_server/useMS = null
+ if(!isnull(message_servers))
+ for (var/obj/machinery/message_server/MS in message_servers)
+ //PDAs are now dependant on the Message Server.
+ if(MS.active)
+ useMS = MS
+ break
+ if(!isnull(useMS)) // only send the message if it's stable
+ useMS.send_pda_message("[selected:owner]","[usr.name]","[t]")
- usr.show_message("PDA message to [selected:owner]: [t]")
- selected:tnote += "← From (AI) [usr.name]:
[t]
"
+ usr.show_message("PDA message to [selected:owner]: [t]")
+ selected:tnote += "← From (AI) [usr.name]:
[t]
"
- if (!selected:silent)
- playsound(selected.loc, 'twobeep.ogg', 50, 1)
- for (var/mob/O in hearers(3, selected.loc))
- O.show_message(text("\icon[selected] *[selected:ttone]*"))
+ if (!selected:silent)
+ playsound(selected.loc, 'twobeep.ogg', 50, 1)
+ for (var/mob/O in hearers(3, selected.loc))
+ O.show_message(text("\icon[selected] *[selected:ttone]*"))
- selected.overlays = null
- selected.overlays += image('pda.dmi', "pda-r")
+ selected.overlays = null
+ selected.overlays += image('pda.dmi', "pda-r")
+ else
+ usr << "ERROR: Server isn't responding."
//Some spare PDAs in a box
diff --git a/code/game/objects/devices/PDA/chatroom.dm b/code/game/objects/devices/PDA/chatroom.dm
new file mode 100644
index 00000000000..008dab64149
--- /dev/null
+++ b/code/game/objects/devices/PDA/chatroom.dm
@@ -0,0 +1,16 @@
+var/list/chatrooms = list()
+
+/datum/chatroom
+ var/name = "Generic Chatroom"
+ var/list/logged_in = list()
+ var/list/logs = list() // chat logs
+ var/list/banned = list() // banned users
+ var/list/whitelist = list() // whitelisted users
+ var/list/muted = list()
+ var/topic = "" // topic message for the chatroom
+ var/password = "" // blank for no password.
+ var/operator = "" // name of the operator
+
+/datum/chatroom/proc/attempt_connect(var/obj/item/device/pda/device, var/obj/password)
+ if(!device)
+ return
diff --git a/code/game/objects/door_assembly.dm b/code/game/objects/door_assembly.dm
index 6435b15523a..fb0adfec859 100644
--- a/code/game/objects/door_assembly.dm
+++ b/code/game/objects/door_assembly.dm
@@ -221,7 +221,7 @@ obj/structure/door_assembly
door_assembly_clown
name = "Bananium Airlock Assembly"
desc = "Honk"
- icon_state = "door_as_bananium1"
+ icon_state = "door_as_clown1"
airlock_type = /obj/machinery/door/airlock/clown
anchored = 1
density = 1
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 38918eb1725..b4287def0a7 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -23,8 +23,10 @@
for(var/mob/O in viewers(user, null))
O.show_message("\red [user] is trying to put handcuffs on [M]!", 1)
spawn(30)
+ if(!M) return
if(p_loc == user.loc && p_loc_m == M.loc)
M.handcuffed = new /obj/item/weapon/handcuffs(M)
+ M.update_clothing()
else
if ((CLUMSY in usr.mutations) && prob(50))
@@ -64,8 +66,10 @@
M.requests += O
spawn( 0 )
if(istype(src, /obj/item/weapon/handcuffs/cable))
+// feedback_add_details("handcuffs","C")
playsound(src.loc, 'cablecuff.ogg', 30, 1, -2)
else
+// feedback_add_details("handcuffs","H")
playsound(src.loc, 'handcuffs.ogg', 30, 1, -2)
O.process()
return
diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm
index 0d2cebe65c7..7e9bfc3b940 100644
--- a/code/game/objects/items/weapons/cigs_lighters.dm
+++ b/code/game/objects/items/weapons/cigs_lighters.dm
@@ -122,9 +122,17 @@ ZIPPO
var/icon_butt = "cigbutt"
var/lastHolder = null
var/smoketime = 300
+ var/chem_volume = 15
var/butt_count = 5 //count of butt sprite variations
+/obj/item/clothing/mask/cigarette/New()
+ ..()
+ flags |= NOREACT // so it doesn't react until you light it
+ create_reagents(chem_volume) // making the cigarrete a chemical holder with a maximum volume of 15
+/obj/item/clothing/mask/cigarette/Del()
+ ..()
+ del(reagents)
/obj/item/clothing/mask/cigarette/attackby(obj/item/weapon/W as obj, mob/user as mob)
..()
@@ -155,10 +163,37 @@ ZIPPO
return
+/obj/item/clothing/mask/cigarette/afterattack(obj/item/weapon/reagent_containers/glass/glass, mob/user as mob)
+ ..()
+ if(istype(glass)) // you can dip cigarettes into beakers
+ var/transfered = glass.reagents.trans_to(src, chem_volume)
+ if(transfered) // if reagents were transfered, show the message
+ user << "\blue You dip \the [src] into \the [glass]."
+ else // if not, either the beaker was empty, or the cigarette was full
+ if(!glass.reagents.total_volume)
+ user << "\red [glass] is empty."
+ else
+ user << "\red [src] is full."
+
+
/obj/item/clothing/mask/cigarette/proc/light(var/flavor_text = "[usr] lights the [name].")
if(!src.lit)
src.lit = 1
src.damtype = "fire"
+ if(reagents.get_reagent_amount("plasma")) // the plasma explodes when exposed to fire
+ var/datum/effect/effect/system/reagents_explosion/e = new()
+ e.set_up(round (src.reagents.get_reagent_amount("plasma")/2.5, 1), get_turf(src), 0, 0)
+ e.start()
+ del(src)
+ return
+ if(reagents.get_reagent_amount("fuel")) // the fuel explodes, too, but much less violently
+ var/datum/effect/effect/system/reagents_explosion/e = new()
+ e.set_up(round (src.reagents.get_reagent_amount("fuel")/5, 1), get_turf(src), 0, 0)
+ e.start()
+ del(src)
+ return
+ src.flags &= ~NOREACT // allowing reagents to react after being lit
+ src.reagents.handle_reactions()
src.icon_state = icon_on
src.item_state = icon_on
for(var/mob/O in viewers(usr, null))
@@ -181,6 +216,14 @@ ZIPPO
return
if(location)
location.hotspot_expose(700, 5)
+ if(reagents && reagents.total_volume) // check if it has any reagents at all
+ if( iscarbon(src.loc) && (src == loc:wear_mask) ) // if it's in the human/monkey mouth, transfer reagents to the mob
+ var/mob/living/carbon/C = loc
+ if(prob(15)) // so it's not an instarape in case of acid
+ reagents.reaction(C, INGEST)
+ reagents.trans_to(C, REAGENTS_METABOLISM)
+ else // else just remove some of the reagents
+ reagents.remove_any(REAGENTS_METABOLISM)
return
@@ -214,6 +257,7 @@ ZIPPO
throw_speed = 0.5
item_state = "cigaroff"
smoketime = 1500
+ chem_volume = 20
butt_count = 0
/obj/item/clothing/mask/cigarette/cigar/cohiba
@@ -230,6 +274,7 @@ ZIPPO
icon_on = "cigar2on"
icon_off = "cigar2off"
smoketime = 7200
+ chem_volume = 30
/obj/item/weapon/cigbutt
name = "cigarette butt"
@@ -360,6 +405,14 @@ ZIPPO
slot_flags = SLOT_BELT
var/cigcount = 6
+ New()
+ ..()
+ flags |= NOREACT
+ create_reagents(15)//so people can inject cigarettes without opening a packet
+
+ Del()
+ ..()
+ del(reagents)
update_icon()
icon_state = "[initial(icon_state)][cigcount]"
@@ -375,6 +428,7 @@ ZIPPO
else
cigcount--
var/obj/item/clothing/mask/cigarette/W = new /obj/item/clothing/mask/cigarette(user)
+ reagents.trans_to(W, reagents.total_volume)
user.put_in_hand(W)
else
return ..()
diff --git a/code/game/objects/items/weapons/grenades.dm b/code/game/objects/items/weapons/grenades.dm
index b9ed0be9c89..93c3fea594a 100644
--- a/code/game/objects/items/weapons/grenades.dm
+++ b/code/game/objects/items/weapons/grenades.dm
@@ -2,6 +2,7 @@
CONTAINS:
EMP GRENADE
FLASHBANG
+CRITTER GRENADE
*/
@@ -289,7 +290,7 @@ FLASHBANG
/obj/item/weapon/flashbang/clusterbang
desc = "Use of this weapon may constiute a war crime in your area, consult your local captain."
- name = "Clusterbang"
+ name = "clusterbang"
icon = 'grenade.dmi'
icon_state = "clusterbang"
var/child = 0
@@ -367,6 +368,159 @@ FLASHBANG
+/****************************Critter Grenades***********************************************/
+
+
+/obj/item/weapon/spawnergrenade
+ desc = "It is set to detonate in 3 seconds. It will unleash unleash an unspecified anomaly into the vicinity."
+ name = "delivery grenade"
+ icon = 'grenade.dmi'
+ icon_state = "delivery"
+ w_class = 2.0
+ item_state = "flashbang"
+ throw_speed = 4
+ throw_range = 20
+ flags = FPRINT | TABLEPASS | CONDUCT
+ slot_flags = SLOT_BELT
+ origin_tech = "materials=3;magnets=4"
+ var/active = 0
+ var/det_time = 30
+ var/banglet = 0
+ var/spawner_type = null // must be an object path
+ var/deliveryamt = 1 // amount of type to deliver
+
+
+ proc/prime()
+ return
+
+ proc/clown_check(var/mob/living/user)
+ return
+
+ attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if (isscrewdriver(W))
+ switch(src.det_time)
+ if ("1")
+ src.det_time = 30
+ user.show_message("\blue You set the delivery grenade for 3 second detonation time.")
+ src.desc = "It is set to detonate in 3 seconds."
+ if ("30")
+ src.det_time = 100
+ user.show_message("\blue You set the delivery grenade for 10 second detonation time.")
+ src.desc = "It is set to detonate in 10 seconds."
+ if ("100")
+ src.det_time = 1
+ user.show_message("\blue You set the delivery grenade for instant detonation.")
+ src.desc = "It is set to detonate instantly."
+ src.add_fingerprint(user)
+ ..()
+ return
+
+
+ afterattack(atom/target as mob|obj|turf|area, mob/user as mob)
+ if (istype(target, /obj/item/weapon/storage)) return ..() // Trying to put it in a full container
+ if (istype(target, /obj/item/weapon/gun/grenadelauncher)) return ..()
+ if((user.equipped() == src)&&(!active)&&(clown_check(user)))
+ user << "\red You prime the delivery grenade! [det_time/10] seconds!"
+ src.active = 1
+ src.icon_state = "delivery1"
+ playsound(src.loc, 'armbomb.ogg', 75, 1, -3)
+ spawn(src.det_time)
+ prime()
+ return
+ user.dir = get_dir(user, target)
+ user.drop_item()
+ var/t = (isturf(target) ? target : target.loc)
+ walk_towards(src, t, 3)
+ return
+
+
+ attack_paw(mob/user as mob)
+ return src.attack_hand(user)
+
+
+ attack_hand()
+ walk(src, null, null)
+ ..()
+ return
+
+ prime() // Prime now just handles the two loops that query for people in lockers and people who can see it.
+
+ if(spawner_type && deliveryamt)
+ // Make a quick flash
+ var/turf/T = get_turf(src)
+ playsound(T, 'phasein.ogg', 100, 1)
+ for(var/mob/living/carbon/human/M in viewers(T, null))
+ if(M:eyecheck() <= 0)
+ flick("e_flash", M.flash) // flash dose faggots
+
+ for(var/i=1, i<=deliveryamt, i++)
+ var/atom/movable/x = new spawner_type
+ x.loc = T
+ if(prob(50))
+ for(var/j = 1, j <= rand(1, 3), j++)
+ step(x, pick(NORTH,SOUTH,EAST,WEST))
+
+ // Spawn some hostile syndicate critters
+ if(istype(x, /obj/effect/critter))
+ var/obj/effect/critter/C = x
+
+ C.atkcarbon = 1
+ C.atksilicon = 1
+ C.atkmech = 0
+ C.atksynd = 0
+ C.aggressive = 1
+
+ del(src)
+ return
+
+
+ attack_self(mob/user as mob)
+ if(!active)
+ if(clown_check(user))
+ user << "\red You prime the delivery grenade! [det_time/10] seconds!"
+ src.active = 1
+ src.icon_state = "delivery1"
+ add_fingerprint(user)
+ spawn( src.det_time )
+ prime()
+ return
+ return
+
+
+ attack_hand()
+ walk(src, null, null)
+ ..()
+ return
+
+
+ clown_check(var/mob/living/user)
+ if ((CLUMSY in user.mutations) && prob(50))
+ user << "\red Huh? How does this thing work?!"
+ src.active = 1
+ src.icon_state = "delivery1"
+ playsound(src.loc, 'armbomb.ogg', 75, 1, -3)
+ spawn( 5 )
+ prime()
+ return 0
+ return 1
+
+/obj/item/weapon/spawnergrenade/manhacks
+ name = "manhack delivery grenade"
+ spawner_type = /obj/effect/critter/manhack
+ deliveryamt = 5
+ origin_tech = "materials=3;magnets=4;syndicate=4"
+
+/obj/item/weapon/spawnergrenade/spesscarp
+ name = "carp delivery grenade"
+ spawner_type = /obj/effect/critter/spesscarp
+ deliveryamt = 5
+ origin_tech = "materials=3;magnets=4;syndicate=4"
+
+/obj/item/weapon/spawnergrenade/elitespesscarp
+ name = "elite carp delivery grenade"
+ spawner_type = /obj/effect/critter/spesscarp/elite
+ deliveryamt = 2
+ origin_tech = "materials=3;magnets=4;syndicate=4"
diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm
index 9278947952a..75640a756b1 100644
--- a/code/game/objects/items/weapons/implants/implant.dm
+++ b/code/game/objects/items/weapons/implants/implant.dm
@@ -1,5 +1,3 @@
-//This file was auto-corrected by findeclaration.exe on 29/05/2012 15:03:05
-
/obj/item/weapon/implant
name = "implant"
desc = "An implant. Not usually seen outside a body."
@@ -240,6 +238,44 @@ the implant may become unstable and either pre-maturely inject the subject or si
H << "\blue You feel a surge of loyalty towards NanoTrasen."
return
+
+/obj/item/weapon/implant/adrenalin
+ name = "adrenalin"
+ desc = "Removes all stuns and knockdowns."
+ var/uses
+
+ get_data()
+ var/dat = {"
+Implant Specifications:
+Name: Cybersun Industries Adrenalin Implant
+Life: Five days.
+Important Notes: Illegal
+
+Implant Details: Subjects injected with implant can activate a massive injection of adrenalin.
+Function: Contains nanobots to stimulate body to mass-produce Adrenalin.
+Special Features: Will prevent and cure most forms of brainwashing.
+Integrity: Implant can only be used three times before the nanobots are depleted."}
+ return dat
+
+
+ trigger(emote, mob/source as mob)
+ if (src.uses < 1) return 0
+ if (emote == "pale")
+ src.uses--
+ source << "\blue You feel a sudden surge of energy!"
+ source.SetStunned(0)
+ source.SetWeakened(0)
+ source.SetParalysis(0)
+
+ return
+
+
+ implanted(mob/source as mob)
+ source.mind.store_memory("A implant can be activated by using the pale emote, say *pale to attempt to activate.", 0, 0)
+ source << "The implanted freedom implant can be activated by using the pale emote, say *pale to attempt to activate."
+ return
+
+
//BS12 Explosive
/obj/item/weapon/implant/explosive
name = "explosive implant"
diff --git a/code/game/objects/items/weapons/implants/implanter.dm b/code/game/objects/items/weapons/implants/implanter.dm
index d07152f7e8a..167e3e4d989 100644
--- a/code/game/objects/items/weapons/implants/implanter.dm
+++ b/code/game/objects/items/weapons/implants/implanter.dm
@@ -74,6 +74,15 @@
update()
return
+/obj/item/weapon/implanter/adrenalin
+ name = "implanter-adrenalin"
+
+/obj/item/weapon/implanter/adrenalin/New()
+ src.imp = new /obj/item/weapon/implant/adrenalin(src)
+ ..()
+ update()
+ return
+
/obj/item/weapon/implanter/compressed
name = "implanter (C)"
icon_state = "cimplanter0"
diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm
index 4bc4a25de19..7783ce411d2 100644
--- a/code/game/objects/items/weapons/tools.dm
+++ b/code/game/objects/items/weapons/tools.dm
@@ -397,11 +397,11 @@ WELDINGTOOOL
/obj/item/weapon/wirecutters/attack(mob/M as mob, mob/user as mob)
if((M.handcuffed) && (istype(M:handcuffed, /obj/item/weapon/handcuffs/cable)))
- M.visible_message("You cut \the [M]'s restraints with \the [src]!",\
- "\The [usr] cuts \the [M]'s restraints with \the [src]!",\
+ usr.visible_message("\The [usr] cuts \the [M]'s restraints with \the [src]!",\
+ "You cut \the [M]'s restraints with \the [src]!",\
"You hear cable being cut.")
M.handcuffed = null
M.update_clothing()
return
else
- ..()
+ ..()
\ No newline at end of file
diff --git a/code/game/objects/storage/belt.dm b/code/game/objects/storage/belt.dm
index fc5c1aa2f7e..b707c10fc41 100644
--- a/code/game/objects/storage/belt.dm
+++ b/code/game/objects/storage/belt.dm
@@ -9,33 +9,33 @@
max_w_class = 3
max_combined_w_class = 21
- proc/can_use()
- if(!ismob(loc)) return 0
- var/mob/M = loc
- if(src in M.get_equipped_items())
- return 1
+/obj/item/weapon/storage/belt/proc/can_use()
+ if(!ismob(loc)) return 0
+ var/mob/M = loc
+ if(src in M.get_equipped_items())
+ return 1
+ else
+ return 0
+
+
+/obj/item/weapon/storage/belt/MouseDrop(obj/over_object as obj, src_location, over_location)
+ var/mob/M = usr
+ if(!istype(over_object, /obj/screen))
+ return ..()
+ playsound(src.loc, "rustle", 50, 1, -5)
+ if (!M.restrained() && !M.stat && can_use())
+ if (over_object.name == "r_hand")
+ if (!( M.r_hand ))
+ M.u_equip(src)
+ M.r_hand = src
else
- return 0
-
-
- MouseDrop(obj/over_object as obj, src_location, over_location)
- var/mob/M = usr
- if(!istype(over_object, /obj/screen))
- return ..()
- playsound(src.loc, "rustle", 50, 1, -5)
- if (!M.restrained() && !M.stat && can_use())
- if (over_object.name == "r_hand")
- if (!( M.r_hand ))
+ if (over_object.name == "l_hand")
+ if (!( M.l_hand ))
M.u_equip(src)
- M.r_hand = src
- else
- if (over_object.name == "l_hand")
- if (!( M.l_hand ))
- M.u_equip(src)
- M.l_hand = src
- M.update_clothing()
- src.add_fingerprint(usr)
- return
+ M.l_hand = src
+ M.update_clothing()
+ src.add_fingerprint(usr)
+ return
@@ -65,7 +65,7 @@
new /obj/item/weapon/weldingtool(src)
new /obj/item/weapon/crowbar(src)
new /obj/item/weapon/wirecutters(src)
- new /obj/item/weapon/cable_coil(src,30,pick("red","yellow"))
+ new /obj/item/weapon/cable_coil(src,30,pick("red","yellow","orange"))
/obj/item/weapon/storage/belt/utility/atmostech/New()
diff --git a/code/game/objects/storage/toolbox.dm b/code/game/objects/storage/toolbox.dm
index 846aafcec41..512d8ef88de 100644
--- a/code/game/objects/storage/toolbox.dm
+++ b/code/game/objects/storage/toolbox.dm
@@ -17,7 +17,7 @@
/obj/item/weapon/storage/toolbox/electrical/New()
..()
- var/color = pick("red","yellow","green","blue")
+ var/color = pick("red","yellow","green","blue","pink","orange","cyan","white")
new /obj/item/weapon/screwdriver(src)
new /obj/item/weapon/wirecutters(src)
new /obj/item/device/t_scanner(src)
@@ -31,7 +31,7 @@
/obj/item/weapon/storage/toolbox/syndicate/New()
..()
- var/color = pick("red","yellow","green","blue")
+ var/color = pick("red","yellow","green","blue","pink","orange","cyan","white")
new /obj/item/weapon/screwdriver(src)
new /obj/item/weapon/wrench(src)
new /obj/item/weapon/weldingtool(src)
diff --git a/code/game/vote.dm b/code/game/vote.dm
index 616cae49c55..e4d037fb87b 100644
--- a/code/game/vote.dm
+++ b/code/game/vote.dm
@@ -188,7 +188,7 @@
var/text = "Voting"
- var/footer = "
Close"
+ var/footer = "
Close