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 += "" + for(var/list/datum/data_pda_msg/pda in src.linkedServer.pda_msgs) + index++ + if(index > 3000) + break + dat += "" + dat += "
SenderRecipientMessage
[pda.sender][pda.recipient][pda.message]
" + //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" if(config.vote_no_dead && usr.stat == 2) @@ -247,7 +247,7 @@ if(src.client.vote == md) text += "
  • [disp]" else - text += "
  • [disp]" + text += "
  • [disp]" text += "[votes[md]>0?" - [votes[md]] vote\s":null]
    " @@ -276,7 +276,7 @@ if(src.client.vote == md) text += "
  • [disp]" else - text += "
  • [disp]" + text += "
  • [disp]" text += "[votes[md]>0?" - [votes[md]] vote\s":null]
    " @@ -315,10 +315,10 @@ else // voting can begin if(config.allow_vote_restart) - text += "Begin restart vote.
    " + text += "Begin restart vote.
    " if(config.allow_vote_mode) if(!ticker || ticker.current_state == 1) - text += "Begin change mode vote.
    " + text += "Begin change mode vote.
    " else text += "Change mode votes are disabled while a round is in progress, vote to restart first.
    " if(src.client.holder) //Strumpetplaya Add - Custom Votes for Admins @@ -337,14 +337,17 @@ /datum/vote/Topic(href, href_list) ..() + //world << "[usr] has activated the vote Topic" - var/mob/M = locate(href_list["voter"]) // mob of player that clicked link + if(href_list["voter"]) + world << "[usr.ckey] has attempted to bypass the voting system." //ckey is easy key + return if(href_list["vclose"]) - if(M) - M << browse(null, "window=vote") - M.client.showvote = 0 + if(usr) + usr << browse(null, "window=vote") + usr.client.showvote = 0 return if(href_list["vmode"]) @@ -384,7 +387,7 @@ spawn(config.vote_period * 10) vote.endvote() - world << "\red*** A custom vote has been initiated by [M.key]." + world << "\red*** A custom vote has been initiated by [usr.key]." world << "\red You have [vote.timetext(config.vote_period)] to vote." //log_vote("Voting to [vote.mode ? "change mode" : "restart round"] started by [M.name]/[M.key]") @@ -395,16 +398,16 @@ else C.vote = "default" - if(M) M.vote() + if(usr) usr.vote() return if(vote.mode == 0) - var/answer = alert(M,"Do you want to force an immediate restart? Only do this when there are round-breaking glitches, or risk being banned.","Immediate Reboot?","Yes","No") + var/answer = alert(usr,"Do you want to force an immediate restart? Only do this when there are round-breaking glitches, or risk being banned.","Immediate Reboot?","Yes","No") if(answer == "Yes") vote.instant_restart = 1 - log_admin("[M.key] has initiated an instant reboot vote! This may be banworthy!") - message_admins("[M.key] has initiated an instant reboot vote! This may be banworthy!") + log_admin("[usr.key] has initiated an instant reboot vote! This may be banworthy!") + message_admins("[usr.key] has initiated an instant reboot vote! This may be banworthy!") else vote.instant_restart = 0 @@ -415,14 +418,13 @@ vote.voting = 1 // now voting vote.votetime = world.timeofday + config.vote_period*10 // when the vote will end - spawn(config.vote_period*10) vote.endvote() - world << "\red*** A vote to [vote.mode?"change game mode":"restart"] has been initiated by [M.key]." + world << "\red*** A vote to [vote.mode?"change game mode":"restart"] has been initiated by [usr.key]." world << "\red You have [vote.timetext(config.vote_period)] to vote." - log_vote("Voting to [vote.mode ? "change mode" : "restart round"] started by [M.name]/[M.key]") + log_vote("Voting to [vote.mode ? "change mode" : "restart round"] started by [usr.name]/[usr.key]") for(var/mob/CM in world) if(CM.client) @@ -431,17 +433,17 @@ else CM.client.vote = "default" - if(M) M.vote() + if(usr) usr.vote() return return if(href_list["vote"] && vote.voting) - if(M) - M.client.vote = href_list["vote"] + if(usr) + usr.client.vote = href_list["vote"] - //world << "Setting client [M.key]'s vote to: [href_list["vote"]]." + //world << "Setting client [usr.key]'s vote to: [href_list["vote"]]." - M.vote() + usr.vote() return diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 659bbf362e4..38fd790d922 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -1422,6 +1422,60 @@ var/global/BSACooldown = 0 else alert("You cannot perform this action. You must be of a higher administrative rank!") + if (href_list["adminmoreinfo"]) + var/mob/M = locate(href_list["adminmoreinfo"]) + if(!M) + usr << "\blue The mob no longer exists." + return + + if(src && src.owner) + var/location_description = "" + var/special_role_description = "" + var/health_description = "" + var/turf/T = get_turf(M) + + //Location + if(T && isturf(T)) + if(T.loc && isarea(T.loc)) + location_description = "([T.x], [T.y], [T.z] in area [T.loc])" + else + location_description = "([T.x], [T.y], [T.z])" + + //Job + antagonist + if(M.mind) + special_role_description = "Role: [M.mind.assigned_role]; Antagonist: [M.mind.special_role]; Has been rev: [(M.mind.has_been_rev)?"Yes":"No"]" + else + special_role_description = "Role: Mind datum missing Antagonist: Mind datum missing; Has been rev: Mind datum missing;" + + //Health + health_description = "Oxy: [M.oxyloss] - Tox: [M.toxloss] - Fire: [M.fireloss] - Brute: [M.bruteloss] - Clone: [M.cloneloss] - Brain: [M.brainloss]" + + src.owner << "Info about [M.name]: " + src.owner << "Mob type = [M.type]; Damage = [health_description]" + src.owner << "Name = [M.name]; Real_name = [M.real_name]; Original_name = [M.original_name]; Key = [M.key];" + src.owner << "Location = [location_description];" + src.owner << "[special_role_description]" + src.owner << "(PM) (PP) (VV) (SM) (JMP) (CA)" + + if (href_list["adminspawncookie"]) + var/mob/M = locate(href_list["adminspawncookie"]) + if(M && ishuman(M)) + var/mob/living/carbon/human/H = M + H.equip_if_possible( new /obj/item/weapon/reagent_containers/food/snacks/cookie(H), H.slot_l_hand ) + if(!(istype(H.l_hand,/obj/item/weapon/reagent_containers/food/snacks/cookie))) + H.equip_if_possible( new /obj/item/weapon/reagent_containers/food/snacks/cookie(H), H.slot_r_hand ) + if(!(istype(H.r_hand,/obj/item/weapon/reagent_containers/food/snacks/cookie))) + log_admin("[key_name(H)] has their hands full, so they did not receive their cookie, spawned by [key_name(src.owner)].") + message_admins("[key_name(H)] has their hands full, so they did not receive their cookie, spawned by [key_name(src.owner)].") + return + log_admin("[key_name(H)] got their cookie, spawned by [key_name(src.owner)]") + message_admins("[key_name(H)] got their cookie, spawned by [key_name(src.owner)]") + feedback_inc("admin_cookies_spawned",1) + H << "\blue Your prayers have been answered!! You received the best cookie!" + else + src << "\blue The person who prayed is not a human. Cookies cannot be spawned." + + if (href_list["traitor_panel_pp"]) if(rank in list("Admin Observer", "Temporary Admin", "Admin Candidate", "Trial Admin", "Badmin", "Game Admin", "Game Master")) var/mob/M = locate(href_list["traitor_panel_pp"]) diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 896c9e81eaf..f5de70b8df3 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -1,3 +1,8 @@ + + +//This is a list of words which are ignored by the parser when comparing message contents for names. MUST BE IN LOWER CASE! +var/list/adminhelp_ignored_words = list("unknown","the","a","an", "monkey", "alien", "as") + /client/verb/adminhelp(msg as text) set category = "Admin" set name = "Adminhelp" @@ -10,23 +15,88 @@ msg = sanitize(copytext(msg,1,MAX_MESSAGE_LEN)) if (!msg) return + var/original_msg = msg + + //The symbol × (fancy multiplication sign) will be used to mark where to put replacements, so the original message must not contain it. + msg = dd_replaceText(msg, "×", "") + msg = dd_replaceText(msg, "HOLDERREF", "HOLDER-REF") //HOLDERREF is a key word which gets replaced with the admin's holder ref later on, so it mustn't be in the original message + msg = dd_replaceText(msg, "ADMINREF", "ADMIN-REF") //ADMINREF is a key word which gets replaced with the admin's client's ref. So it mustn't be in the original message. + + var/list/msglist = dd_text2list(msg, " ") + + var/list/mob/mobs = list() + + for(var/mob/M in world) + mobs += M + + var/list/replacement_value = list() //When a word match is found, the word matched will get replaced with an × (fancy multiplication symbol). + //This list will contain a list of values which the × will be replaced with in the same order as indexes in this list. + //So if this list has the value list("John","Jane") and msg is, at the end, "This is × and he griffed ×" the text to + //display will be "This is John and he griffe Jane". The strings in this list are a bit more complex than 'John' and 'Jane' tho. + + //we will try to locate each word of the message in our lists of names and clients + //for each mob that we have found + //split the mob's info into a list. "John Arnolds" becomes list("John","Arnolds") so we can iterate through this + //for each of the name parts IE. "John", "Arnolds", etc. in the current name. + for(var/i = 1; i <= msglist.len; i++) + var/word = msglist[i] + var/original_word = word + word = dd_replaceText(word, ".", "") + word = dd_replaceText(word, ",", "") + word = dd_replaceText(word, "!", "") + word = dd_replaceText(word, "?", "") //Strips some common punctuation characters so the actual word can be better compared. + word = dd_replaceText(word, ";", "") + word = dd_replaceText(word, ":", "") + word = dd_replaceText(word, "(", "") + word = dd_replaceText(word, ")", "") + if(lowertext(word) in adminhelp_ignored_words) + continue + for(var/mob/M in mobs) + var/list/namelist = dd_text2list("[M.name] [M.real_name] [M.original_name] [M.ckey] [M.key]", " ") + var/word_is_match = 0 //Used to break from this mob for loop if a match is found + for(var/namepart in namelist) + if( lowertext(word) == lowertext(namepart) ) + msglist[i] = "×" + var/description_string = "[original_word] (?)" + replacement_value += description_string + mobs -= M //If a mob is found then remove it from the list of mobs, so we don't get the same mob reported a million times. + word_is_match = 1 + break + if(word_is_match) + break //Breaks execution of the mob loop, since a match was already found. + + var/j = 1 //index to the next element in the replacement_value list + for(var/i = 1; i <= msglist.len; i++) + var/word = msglist[i] + if(word == "×") + msglist[i] = replacement_value[j] + j++ + + msg = dd_list2text(msglist, " ") + if(mob) var/ref_mob = "\ref[src.mob]" for (var/client/X) if (X.holder) if(X.sound_adminhelp) X << 'adminhelp.ogg' - X << "\blue HELP: [key_name(src, X)] (PP) (VV) (SM) (JMP) (CA): [msg]" + var/msg_to_send = "\blue HELP: [key_name(src, X)] (?) (PP) (VV) (SM) (JMP) (CA): [msg]" + msg_to_send = dd_replaceText(msg_to_send, "HOLDERREF", "\ref[X.holder]") + msg_to_send = dd_replaceText(msg_to_send, "ADMINREF", "\ref[X]") + X << msg_to_send else var/ref_client = "\ref[src]" for (var/client/X) if (X.holder) if(X.sound_adminhelp) X << 'adminhelp.ogg' - X << "\blue HELP: [key_name(src, X)] (VV) (CA): [msg]" + var/msg_to_send = "\blue HELP: [key_name(src, X)] (VV) (CA): [msg]" + msg_to_send = dd_replaceText(msg_to_send, "HOLDERREF", "\ref[X.holder]") + msg_to_send = dd_replaceText(msg_to_send, "ADMINREF", "\ref[X]") + X << msg_to_send - src << "PM to-Admins: [msg]" - log_admin("HELP: [key_name(src)]: [msg]") + src << "PM to-Admins: [original_msg]" + log_admin("HELP: [key_name(src)]: [original_msg]") var/list/replacechars = list("'" = "","\"" = "",">" = "","<" = "","(" = "",")" = "") msg = sanitize_simple(msg, replacechars) if(tension_master) diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index a4eb0ed0582..37b487d0783 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -14,7 +14,7 @@ for (var/mob/M in world) if (M.client && M.client.holder && M.client.seeprayers) - M << "\blue \icon[cross] PRAY: [key_name(src, M)] (PP) (VV) (SM) (JMP) (CA): [msg]" + M << "\blue \icon[cross] PRAY: [key_name(src, M)] (PP) (VV) (SM) (JMP) (CA) (SC): [msg]" usr << "Your prayers have been received by the gods." //feedback_add_details("admin_verb","PR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/chemical/Chemistry-Reagents.dm b/code/modules/chemical/Chemistry-Reagents.dm index 57ded7df769..d86f77622fe 100644 --- a/code/modules/chemical/Chemistry-Reagents.dm +++ b/code/modules/chemical/Chemistry-Reagents.dm @@ -2717,6 +2717,20 @@ datum ..() return +/* reaction_obj(var/obj/O, var/volume) + if(istype(O,/obj/item/weapon/paper)) + var/obj/item/weapon/paper/paperaffected = O + paperaffected.clearpaper() + usr << "The solution melts away the ink on the paper." + if(istype(O,/obj/item/weapon/book)) + if(volume >= 5) + var/obj/item/weapon/book/affectedbook = O + affectedbook.dat = null + usr << "The solution melts away the ink on the book." + else + usr << "It wasn't enough..." + return +*/ beer //It's really much more stronger than other drinks. name = "Beer" id = "beer" diff --git a/code/modules/chemical/Chemistry-Tools.dm b/code/modules/chemical/Chemistry-Tools.dm index 75d2b206e50..e923720413f 100644 --- a/code/modules/chemical/Chemistry-Tools.dm +++ b/code/modules/chemical/Chemistry-Tools.dm @@ -883,7 +883,7 @@ user << "\red [target] is full." return - if(!target.is_open_container() && !ismob(target) && !istype(target,/obj/item/weapon/reagent_containers/food)) //You can inject humans and food but you cant remove the shit. + if(!target.is_open_container() && !ismob(target) && !istype(target,/obj/item/weapon/reagent_containers/food) && !istype(target, /obj/item/clothing/mask/cigarette)) //You can inject humans and food but you cant remove the shit. user << "\red You cannot directly fill this object." return @@ -1079,7 +1079,7 @@ if(istype(target, /obj/item/weapon/implantcase/chem)) return - if(!target.is_open_container() && !ismob(target) && !istype(target, /obj/item/weapon/reagent_containers/food) && !istype(target, /obj/item/metroid_core)) + if(!target.is_open_container() && !ismob(target) && !istype(target, /obj/item/weapon/reagent_containers/food) && !istype(target, /obj/item/metroid_core) && !istype(target, /obj/item/clothing/mask/cigarette) && !istype(target, /obj/item/weapon/cigpacket)) user << "\red You cannot directly fill this object." return if(target.reagents.total_volume >= target.reagents.maximum_volume) diff --git a/code/modules/critters/critters.dm b/code/modules/critters/critters.dm index d89dc0951e5..3c3846654b1 100644 --- a/code/modules/critters/critters.dm +++ b/code/modules/critters/critters.dm @@ -253,3 +253,36 @@ atkcarbon = 1 atksilicon = 1 attacktext = "bites" + + + +// We can maybe make these controllable via some console or something +/obj/effect/critter/manhack + name = "viscerator" + desc = "A small, twin-bladed machine capable of inflicting very deadly lacerations." + icon_state = "viscerator" + pass_flags = PASSTABLE + health = 15 + max_health = 15 + aggressive = 1 + opensdoors = 1 + defensive = 1 + wanderer = 1 + atkcarbon = 1 + atksilicon = 1 + atkmech = 1 + firevuln = 0 // immune to fire + brutevuln = 1 + ventcrawl = 1 + melee_damage_lower = 10 + melee_damage_upper = 15 + attacktext = "cuts" + attack_sound = 'bladeslice.ogg' + chasestate = "viscerator_attack" + deathtext = "is smashed into pieces!" + + Die() + ..() + for(var/mob/O in viewers(src, null)) + O.show_message("\red [src] is smashed into pieces!", 1) + del(src) diff --git a/code/modules/food/food.dm b/code/modules/food/food.dm index 774c5c457d2..2dd5500e760 100644 --- a/code/modules/food/food.dm +++ b/code/modules/food/food.dm @@ -74,6 +74,15 @@ reagents.add_reagent("nutriment", 3) bitesize = 1 +/obj/item/weapon/reagent_containers/food/snacks/cookie + name = "cookie" + desc = "COOKIE!!!" + icon_state = "COOKIE!!!" + New() + ..() + reagents.add_reagent("nutriment", 5) + bitesize = 1 + /obj/item/weapon/reagent_containers/food/snacks/chocolatebar name = "Chocolate Bar" desc = "Such, sweet, fattening food." diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 69558e18fb5..31f7e391cfa 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -547,7 +547,7 @@ if (emptyHand) wear_mask.DblClick() return - if (!( istype(W, /obj/item/clothing/mask) )) + if (!( W.slot_flags & SLOT_MASK )) return u_equip(W) wear_mask = W diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index d72b6fca9ff..36c44ae4db1 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -10,12 +10,6 @@ emp_act /mob/living/carbon/human/bullet_act(var/obj/item/projectile/P, var/def_zone) - if(REFLEXES in augmentations) - if(prob(50)) - var/message = pick("[src] skillfully dodges the [P.name]!", "[src] ducks, dodging the [P.name]!", "[src] effortlessly jumps out of the way of the [P.name]!", "[src] dodges the [P.name] in one graceful movement!", "[src] leans back, dodging the [P.name] narrowly!") - visible_message("\red [message]") - return -1 - if(wear_suit && istype(wear_suit, /obj/item/clothing/suit/armor/laserproof)) if(istype(P, /obj/item/projectile/energy) || istype(P, /obj/item/projectile/beam)) var/reflectchance = 40 - round(P.damage/3) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index c4c2a3a0dac..daf21b74276 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -1158,6 +1158,7 @@ seer = 0 see_invisible = 0 + else if (istype(wear_mask, /obj/item/clothing/mask/gas/voice/space_ninja)) switch(wear_mask:mode) if(0) @@ -1220,13 +1221,12 @@ see_in_dark = 2 var/seer = 0 - for(var/obj/effect/rune/R in loc) - if(R.word1==wordsee && R.word2==wordhell && R.word3==wordjoin) - seer = 1 + var/obj/effect/rune/R = locate() in loc + if (istype(R) && R.word1 == wordsee && R.word2 == wordhell && R.word3 == wordjoin) + seer = 1 if(!seer) see_invisible = 0 - else if(istype(head, /obj/item/clothing/head/helmet/welding)) // wat. This is never fucking called. if(!head:up && tinted_weldhelh) see_in_dark = 1 diff --git a/code/modules/mob/living/carbon/metroid/life.dm b/code/modules/mob/living/carbon/metroid/life.dm index 7b8c7aef513..79c9a1f1214 100644 --- a/code/modules/mob/living/carbon/metroid/life.dm +++ b/code/modules/mob/living/carbon/metroid/life.dm @@ -516,6 +516,7 @@ M.Friends = Friends M.tame = tame M.rabid = rabid + M.Discipline = Discipline if(i != 1) step_away(M,src) del(src) diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 7ac37d7b484..edadab9e147 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -1,3 +1,59 @@ + +var/list/department_radio_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 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", + + //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" +) + /mob/living/proc/binarycheck() if (istype(src, /mob/living/silicon/pai)) return @@ -53,7 +109,7 @@ src << "You are muted." return - // wtf? + // stat == 2 is handled above, so this stops transmission of uncontious messages if (stat) return @@ -84,75 +140,20 @@ 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)) + else if(ispAI(src) || isrobot(src)) message_mode = "pAI" message = copytext(message, 2) 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 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", - - //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)) if (!(ishuman(src) || istype(src, /mob/living/simple_animal/parrot)) && (message_mode=="department" || (message_mode in radiochannels) || message_mode == "right ear" || message_mode == "left ear")) message_mode = null //only humans can use headsets - // Parrots can also use headsets! + // Check removed so parrots can use headsets! if (!message) return @@ -315,51 +316,7 @@ /////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 - -*/ -/* Handing this section over to get_mobs_in_view which was written with radiocode update - var/turf/T = get_turf(src) - listening = hearers(message_range, T) - for (var/O in listening) - world << O - 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 - -*/ listening = get_mobs_in_view(message_range, src) for(var/mob/M in world) if (!M.client) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index aabe19c9e90..17e4acdde25 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -90,15 +90,20 @@ if("mask") if (wear_mask) return - if (!( istype(W, /obj/item/clothing/mask) )) + if (!( W.slot_flags & SLOT_MASK )) return u_equip(W) wear_mask = W W.equipped(src, text) if("back") - if ((back || !( istype(W, /obj/item/weapon) ))) + if (back) return - if (!( W.flags & 1 )) + if (!istype(W, /obj/item)) + return + if (!( W.slot_flags & SLOT_BACK )) + return + if(istype(W,/obj/item/weapon/twohanded) && W:wielded) + usr << "Unwield the [initial(W.name)] first!" return u_equip(W) back = W diff --git a/code/modules/mob/screen.dm b/code/modules/mob/screen.dm index 726f141841a..7adecfeef1e 100644 --- a/code/modules/mob/screen.dm +++ b/code/modules/mob/screen.dm @@ -694,9 +694,13 @@ if(resisting) for(var/mob/O in viewers(usr, null)) O.show_message(text("\red [] resists!", usr), 1) + + + + //breaking out of handcuffs if(usr:handcuffed && usr:canmove && (usr.last_special <= world.time)) - var/breakouttime = 1200 - var/displaytime = 2 + var/breakouttime = 1200 //A default in case you are somehow handcuffed with something that isn't an obj/item/weapon/handcuffs type + var/displaytime = 2 //Minutes to display in the "this will take X minutes." if(!usr:canmove) breakouttime = 2400 displaytime = 4 @@ -716,10 +720,11 @@ del(usr:handcuffed) usr:handcuffed = null else - if(istype(usr:handcuffed, /obj/item/weapon/handcuffs/cable)) - breakouttime = 300 - displaytime = 0.5 - usr << "\red You attempt to remove \the [usr:handcuffed]. (This will take around [displaytime] minutes and you need to stand still)" + var/obj/item/weapon/handcuffs/HC = usr:handcuffed + if(istype(HC)) //If you are handcuffed with actual handcuffs... Well what do I know, maybe someone will want to handcuff you with toilet paper in the future... + breakouttime = HC.breakouttime + displaytime = breakouttime / 600 //Minutes + usr << "\red You attempt to remove \the [HC]. (This will take around [displaytime] minutes and you need to stand still)" for(var/mob/O in viewers(usr)) O.show_message(text("\red [] attempts to remove \the [usr:handcuffed]!", usr), 1) spawn(0) diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 6592f15da72..d87c90c2319 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -136,6 +136,13 @@ addtofield(i, "write", 1) info_links = info_links + "write" +/obj/item/weapon/paper/proc/clearpaper() + info = null + stamps = null + stamped = list() + overlays = null + updateinfolinks() + /obj/item/weapon/paper/proc/parsepencode(var/t, var/obj/item/weapon/pen/P, mob/user as mob, var/iscrayon = 0) t = copytext(sanitize(t),1,MAX_MESSAGE_LEN) @@ -183,6 +190,7 @@ return t + /obj/item/weapon/paper/proc/openhelp(mob/user as mob) user << browse({"Pen Help @@ -204,7 +212,6 @@ \[hr\] : Adds a horizontal rule. "}, "window=paper_help") - /obj/item/weapon/paper/Topic(href, href_list) ..() if ((usr.stat || usr.restrained())) diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index c5c50889465..056c0f21b9f 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -21,4 +21,14 @@ /obj/item/weapon/pen/red desc = "It's a normal red ink pen." icon_state = "pen_red" - colour = "red" \ No newline at end of file + colour = "red" + +/obj/item/weapon/pen/invisble + desc = "It's an invisble pen marker." + icon_state = "pen" + colour = "white" + +/obj/item/weapon/pen/invisble + desc = "It's an invisble pen marker." + icon_state = "pen" + colour = "white" \ No newline at end of file diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index ce87f5a4caf..a94ae012ae4 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -246,19 +246,18 @@ set name = "Make Cable Restraints" set category = "Object" var/mob/M = usr - if (istype(M, /mob/dead/)) return - if (usr.stat) return - if(!istype(usr.loc,/turf)) return - if(src.amount <= 14) - usr << "\red You need at least 15 lengths to make restraints!" - return - var/obj/item/weapon/handcuffs/cable/B = new /obj/item/weapon/handcuffs/cable(usr.loc) - usr << "\blue You wind some cable together to make some restraints." - if(src.amount == 15) - del(src) + + if(ishuman(M) && !M.restrained() && !M.stat && !M.paralysis && ! M.stunned) + if(!istype(usr.loc,/turf)) return + if(src.amount <= 14) + usr << "\red You need at least 15 lengths to make restraints!" + return + var/obj/item/weapon/handcuffs/cable/B = new /obj/item/weapon/handcuffs/cable(usr.loc) + B.icon_state = "cuff_[color]" + usr << "\blue You wind some cable together to make some restraints." + src.use(15) else - src.amount -= 15 - B.layer = 20 + usr << "\blue You cannot do that." ..() /obj/item/weapon/cable_coil/attackby(obj/item/weapon/W, mob/user) @@ -561,3 +560,11 @@ obj/structure/cable/proc/cableColor(var/colorC) icon = 'power_cond_green.dmi' if("blue") icon = 'power_cond_blue.dmi' + if("pink") + icon = 'power_cond_pink.dmi' + if("orange") + icon = 'power_cond_orange.dmi' + if("cyan") + icon = 'power_cond_cyan.dmi' + if("white") + icon = 'power_cond_white.dmi' diff --git a/code/modules/power/cable_heavyduty.dm b/code/modules/power/cable_heavyduty.dm new file mode 100644 index 00000000000..b23d164b214 --- /dev/null +++ b/code/modules/power/cable_heavyduty.dm @@ -0,0 +1,27 @@ +/obj/item/weapon/cable_coil/heavyduty + name = "heavy cable coil" + icon = 'power.dmi' + icon_state = "wire" + +/obj/structure/cable/heavyduty + icon = 'power_cond_heavy.dmi' + name = "large power cable" + desc = "This cable is tough. It cannot be cut with simple hand tools." + +/obj/structure/cable/heavyduty/attackby(obj/item/W, mob/user) + + var/turf/T = src.loc + if(T.intact) + return + + if(istype(W, /obj/item/weapon/wirecutters)) + usr << "\blue These cables are too tough to be cut with those [W.name]." + return + else if(istype(W, /obj/item/weapon/cable_coil)) + usr << "\blue You will need heavier cables to connect to these." + return + else + ..() + +/obj/structure/cable/heavyduty/cableColor(var/colorC) + return \ No newline at end of file diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index 6a0a57fa38c..cc420efc4a8 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -4,21 +4,12 @@ /obj/item/weapon/cell/New() ..() - - charge = charge * maxcharge/100.0 // map obj has charge as percentage, convert to real value here + charge = maxcharge spawn(5) updateicon() /obj/item/weapon/cell/proc/updateicon() - /*if(maxcharge < 10000) - icon_state = "cell" - if(maxcharge >= 10000 && maxcharge < 20000) - icon_state = "hcell" - if(maxcharge >= 20000 && maxcharge < 30000) - icon_state = "scell" - else - icon_state = "hpcell"*/ overlays = null diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index e0083a135c4..15689cc7b76 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -78,7 +78,14 @@ obj/item/weapon/gun/energy/laser/retro projectile_type = "/obj/item/projectile/beam/heavylaser" - +/obj/item/weapon/gun/energy/xray + name = "xray laser gun" + desc = "A high-power laser gun capable of expelling concentrated xray blasts." + icon_state = "xray" + fire_sound = 'laser3.ogg' + origin_tech = "combat=5;materials=3;magnets=2;syndicate=2" + projectile_type = "/obj/item/projectile/beam/xray" + charge_cost = 50 ////////Laser Tag//////////////////// diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 7b119584bf6..1ffd5c926f6 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -1,5 +1,3 @@ -//This file was auto-corrected by findeclaration.exe on 29/05/2012 15:03:05 - /* #define BRUTE "brute" #define BURN "burn" @@ -30,6 +28,7 @@ var/current = null var/turf/original = null // the original turf clicked var/turf/starting = null // the projectile's starting turf + var/list/permutated = list() // we've passed through these atoms, don't try to hit them again var/p_x = 16 var/p_y = 16 // the pixel location of the tile that the player clicked. Default is the center @@ -77,6 +76,8 @@ if(bumped) return + var/forcedodge = 0 // force the projectile to pass + bumped = 1 if(firer && istype(A, /mob)) var/mob/M = A @@ -84,10 +85,18 @@ loc = A.loc return // nope.avi - if(!silenced) + // check for dodge (i can't place in bullet_act because then things get wonky) + if((REFLEXES in M.augmentations) && (!M.stat && !M.lying)) + if(prob(85)) + var/message = pick("[M] skillfully dodges the [name]!", "[M] ducks, dodging the [name]!", "[M] effortlessly jumps out of the way of the [name]!", "[M] dodges the [name] in one graceful movement!", "[M] leans back, dodging the [name] narrowly!", "[M] sidesteps, avoiding the [name] narrowly.", "[M] barely weaves out of the way of the [name].") + M.visible_message("\red [message]") + forcedodge = 1 + + if(!silenced && !forcedodge) visible_message("\red [A.name] is hit by the [src.name] in the [def_zone]!")//X has fired Y is now given by the guns so you cant tell who shot you if you could not see the shooter else - M << "\red You've been shot in the [def_zone] by the [src.name]!" + if(!forcedodge) + M << "\red You've been shot in the [def_zone] by the [src.name]!" if(istype(firer, /mob)) M.attack_log += "\[[time_stamp()]\] [firer]/[firer.ckey] shot [M]/[M.ckey] with a [src]" firer.attack_log += "\[[time_stamp()]\] [firer]/[firer.ckey] shot [M]/[M.ckey] with a [src]" @@ -106,12 +115,13 @@ spawn(0) if(A) var/permutation = A.bullet_act(src, def_zone) // searches for return value - if(permutation == -1) // the bullet passes through a dense object! + if(permutation == -1 || forcedodge) // the bullet passes through a dense object! bumped = 0 // reset bumped variable! if(istype(A, /turf)) loc = A else loc = A.loc + permutated.Add(A) return if(istype(A,/turf)) @@ -147,8 +157,9 @@ if(!bumped) if(loc == original) for(var/mob/living/M in original) - Bump(M) - sleep(1) + if(!(M in permutated)) + Bump(M) + sleep(1) return /obj/item/projectile/test //Used to see if you can hit them. diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index 0c45c0bf387..5447f6a7046 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -63,6 +63,10 @@ icon_state = "heavylaser" damage = 60 +/obj/item/projectile/beam/xray + name = "xray beam" + icon_state = "xray" + damage = 30 /obj/item/projectile/beam/pulse name = "pulse" diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index e3cae5c9f63..7392bd3dfb6 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -396,6 +396,15 @@ datum materials = list("$glass" = 2000, "acid" = 20) build_path = "/obj/item/weapon/circuitboard/comm_server" + message_monitor + name = "Circuit Design (Messaging Monitor Console)" + desc = "Allows for the construction of circuit boards used to build a messaging monitor console." + id = "message_monitor" + req_tech = list("programming" = 5) + build_type = IMPRINTER + materials = list("$glass" = 2000, "acid" = 20) + build_path = "/obj/item/weapon/circuitboard/message_monitor" + /////////////////////////////////// //////////AI Module Disks////////// /////////////////////////////////// diff --git a/code/modules/research/message_server.dm b/code/modules/research/message_server.dm index c5a6136d3ea..4f7abe9160b 100644 --- a/code/modules/research/message_server.dm +++ b/code/modules/research/message_server.dm @@ -1,9 +1,12 @@ +var/global/list/obj/machinery/message_server/message_servers = list() + /datum/data_pda_msg var/recipient = "Unspecified" //name of the person var/sender = "Unspecified" //name of the sender var/message = "Blank" //transferred message /datum/data_pda_msg/New(var/param_rec = "",var/param_sender = "",var/param_message = "") + if(param_rec) recipient = param_rec if(param_sender) @@ -53,14 +56,35 @@ var/list/datum/data_pda_msg/pda_msgs = list() var/list/datum/data_rc_msg/rc_msgs = list() - var/active = 1 + var/decryptkey = "password" + +/obj/machinery/message_server/New() + message_servers += src + decryptkey = GenerateKey() + send_pda_message("System Administrator", "system", "This is an automated message. The messaging system is functioning correctly.") + ..() + return + +/obj/machinery/message_server/Del() + message_servers -= src + ..() + return + +/obj/machinery/message_server/proc/GenerateKey() + //Feel free to move to Helpers. + var/newKey + newKey += pick("the", "if", "of", "as", "in", "a", "you", "from", "to", "an", "too", "little", "snow", "dead", "drunk", "rosebud", "duck", "al", "le") + newKey += pick("diamond", "beer", "mushroom", "assistant", "clown", "captain", "twinkie", "security", "nuke", "small", "big", "escape", "yellow", "gloves", "monkey", "engine", "nuclear", "ai") + newKey += pick("1", "2", "3", "4", "5", "6", "7", "8", "9", "0") + return newKey /obj/machinery/message_server/process() + //if(decryptkey == "password") + // decryptkey = generateKey() if((stat & (BROKEN|NOPOWER)) && active) active = 0 return - update_icon() return diff --git a/code/modules/scripting/Implementations/Telecomms.dm b/code/modules/scripting/Implementations/Telecomms.dm index 04e67974816..b6ab178a0c1 100644 --- a/code/modules/scripting/Implementations/Telecomms.dm +++ b/code/modules/scripting/Implementations/Telecomms.dm @@ -1,3 +1,5 @@ +//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33 + /* --- Traffic Control Scripting Language --- */ // Nanotrasen TCS Language - Made by Doohl @@ -16,14 +18,13 @@ /* -- Compile a raw block of text -- */ proc/Compile(code as message) - var - n_scriptOptions/nS_Options/options = new() - n_Scanner/nS_Scanner/scanner = new(code, options) - list/tokens = scanner.Scan() - n_Parser/nS_Parser/parser = new(tokens, options) - node/BlockDefinition/GlobalBlock/program = parser.Parse() + var/n_scriptOptions/nS_Options/options = new() + var/n_Scanner/nS_Scanner/scanner = new(code, options) + var/list/tokens = scanner.Scan() + var/n_Parser/nS_Parser/parser = new(tokens, options) + var/node/BlockDefinition/GlobalBlock/program = parser.Parse() - list/returnerrors = list() + var/list/returnerrors = list() returnerrors += scanner.errors returnerrors += parser.errors diff --git a/html/changelog.html b/html/changelog.html index 6c41ba358bc..c0fb3646ee1 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -57,6 +57,22 @@ Stuff which is in development and not yet visible to players or just code relate should be listed in the changelog upon commit though. Thanks. --> +
    +

    23 June 2012

    +

    TG updated:

    + +
    +

    22 June 2012

    Cael_Aislinn updated:

    diff --git a/icons/mecha/mech_construction.dmi b/icons/mecha/mech_construction.dmi index 96c3c950bdc..d7f3722c64a 100644 Binary files a/icons/mecha/mech_construction.dmi and b/icons/mecha/mech_construction.dmi differ diff --git a/icons/mob/mob.dmi b/icons/mob/mob.dmi index 0aed007843d..03310535fc5 100644 Binary files a/icons/mob/mob.dmi and b/icons/mob/mob.dmi differ diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index 596ca37a0d8..78328e97bf8 100644 Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ diff --git a/icons/obj/food.dmi b/icons/obj/food.dmi index be5913148a3..1f9f0a65c79 100644 Binary files a/icons/obj/food.dmi and b/icons/obj/food.dmi differ diff --git a/icons/obj/grenade.dmi b/icons/obj/grenade.dmi index 0d5f9892b96..54b13331312 100644 Binary files a/icons/obj/grenade.dmi and b/icons/obj/grenade.dmi differ diff --git a/icons/obj/gun.dmi b/icons/obj/gun.dmi index 1515d3a94c7..d36f986eabb 100644 Binary files a/icons/obj/gun.dmi and b/icons/obj/gun.dmi differ diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi index 79293e5ab56..e3f5eab968e 100644 Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ diff --git a/icons/obj/power.dmi b/icons/obj/power.dmi index a95d01cdff9..d424877853b 100644 Binary files a/icons/obj/power.dmi and b/icons/obj/power.dmi differ diff --git a/icons/obj/power_cond_cyan.dmi b/icons/obj/power_cond_cyan.dmi new file mode 100644 index 00000000000..6e1fa1238e6 Binary files /dev/null and b/icons/obj/power_cond_cyan.dmi differ diff --git a/icons/obj/power_cond_heavy.dmi b/icons/obj/power_cond_heavy.dmi new file mode 100644 index 00000000000..69b9ef085b1 Binary files /dev/null and b/icons/obj/power_cond_heavy.dmi differ diff --git a/icons/obj/power_cond_orange.dmi b/icons/obj/power_cond_orange.dmi new file mode 100644 index 00000000000..e3c3d0aa8c8 Binary files /dev/null and b/icons/obj/power_cond_orange.dmi differ diff --git a/icons/obj/power_cond_white.dmi b/icons/obj/power_cond_white.dmi new file mode 100644 index 00000000000..9036341ee13 Binary files /dev/null and b/icons/obj/power_cond_white.dmi differ diff --git a/icons/obj/weapons.dmi b/icons/obj/weapons.dmi index 8eab299d9a9..5ec4ffee8e3 100644 Binary files a/icons/obj/weapons.dmi and b/icons/obj/weapons.dmi differ diff --git a/icons/pda_icons/pda_chatroom.png b/icons/pda_icons/pda_chatroom.png new file mode 100644 index 00000000000..a00221c4e0d Binary files /dev/null and b/icons/pda_icons/pda_chatroom.png differ diff --git a/icons/pda_icons/pda_locked.PNG b/icons/pda_icons/pda_locked.PNG new file mode 100644 index 00000000000..79fe5829162 Binary files /dev/null and b/icons/pda_icons/pda_locked.PNG differ diff --git a/icons/turf/floors.dmi b/icons/turf/floors.dmi index d4e346d55dc..72c44448308 100644 Binary files a/icons/turf/floors.dmi and b/icons/turf/floors.dmi differ