Merge pull request #1374 from Erthilo/TGUpdates

TG Updates r3778 to r3752
This commit is contained in:
SkyMarshal
2012-06-23 15:24:12 -07:00
72 changed files with 1260 additions and 384 deletions
+3
View File
@@ -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"
@@ -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)
+1 -56
View File
@@ -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))
@@ -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))
+26 -17
View File
@@ -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"
+12
View File
@@ -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'
+2 -2
View File
@@ -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"
+62 -3
View File
@@ -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"
+29 -5
View File
@@ -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 = "</font color><b>[copytext(input, i, i+1)]</b><font color='blue'>"
else
if(ui) //This is for allowing block clicks to be differentiated
pushstring = "<a href='?src=\ref[src];uimenuset=[num2text(blockpos)];uimenusubset=[num2text(subpos)]'>[copytext(input, i, i+1)]</a>"
else
pushstring = "<a href='?src=\ref[src];semenuset=[num2text(blockpos)];semenusubset=[num2text(subpos)]'>[copytext(input, i, i+1)]</a>"
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: <font color='blue'>[getleftblocks(src.connected.occupant.dna.uni_identity,uniblock,3)][src.subblock == 1 ? "<U><B>"+getblock(getblock(src.connected.occupant.dna.uni_identity,src.uniblock,3),1,1)+"</U></B>" : getblock(getblock(src.connected.occupant.dna.uni_identity,src.uniblock,3),1,1)][src.subblock == 2 ? "<U><B>"+getblock(getblock(src.connected.occupant.dna.uni_identity,src.uniblock,3),2,1)+"</U></B>" : getblock(getblock(src.connected.occupant.dna.uni_identity,src.uniblock,3),2,1)][src.subblock == 3 ? "<U><B>"+getblock(getblock(src.connected.occupant.dna.uni_identity,src.uniblock,3),3,1)+"</U></B>" : getblock(getblock(src.connected.occupant.dna.uni_identity,src.uniblock,3),3,1)][getrightblocks(src.connected.occupant.dna.uni_identity,uniblock,3)]</FONT><BR><BR>")
// New way of displaying DNA blocks
src.temphtml = text("Unique Identifier: <font color='blue'>[getblockstring(src.connected.occupant.dna.uni_identity,uniblock,subblock,3)]</FONT><br><br>")
src.temphtml = text("Unique Identifier: <font color='blue'>[getblockstring(src.connected.occupant.dna.uni_identity,uniblock,subblock,3, src,1)]</FONT><br><br>")
src.temphtml += text("Selected Block: <font color='blue'><B>[]</B></FONT><BR>", src.uniblock)
src.temphtml += text("<A href='?src=\ref[];unimenuminus=1'><-</A> Block <A href='?src=\ref[];unimenuplus=1'>-></A><BR><BR>", 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: <font color='blue'>[]</FONT><BR><BR>", src.connected.occupant.dna.struc_enzymes)
// New shit, it doesn't suck (as much)
src.temphtml = text("Structural Enzymes: <font color='blue'>[getblockstring(src.connected.occupant.dna.struc_enzymes,strucblock,subblock,3)]</FONT><br><br>")
src.temphtml = text("Structural Enzymes: <font color='blue'>[getblockstring(src.connected.occupant.dna.struc_enzymes,strucblock,subblock,3,src,0)]</FONT><br><br>")
// SE of occupant, selected block, selected subblock, block size (3 subblocks)
src.temphtml += text("Selected Block: <font color='blue'><B>[]</B></FONT><BR>", 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
@@ -407,7 +407,8 @@ var/list/obj/effect/proc_holder/power/powerinstances = list()
<td align='center'>
<font size='5'><b>Changling Evolution Menu</b></font><br>
Hover over a power to see more information<br>
Current genomes left to evolve with: [usr.changeling.geneticpoints]
Current evolution points left to evolve with: [usr.changeling.geneticpoints]<br>
Absorb genomes to acquire more evolution points
<p>
</td>
</tr>
+2 -2
View File
@@ -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
+1
View File
@@ -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"
@@ -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"
+209
View File
@@ -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 << "<span class='warning'>BZZT.. The console beeps and brings up the Message Logs.</span>"
screen = 1
else
usr << "<span class='notice'>It looks like the console is already being hacked into.</span>"
..()
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 = "<head><title>Message Monitor Console</title></head><body>"
dat += "<center><h2>Message Monitor Console</h2></center><hr>"
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<br>"
else
dat += "<A href='?src=\ref[src];active=1'>1. Toggle Power: [src.linkedServer.active ? "<font color='green'>\[On\]</font>":"<font color='red'>\[Off\]</font>"]</a><br>"
dat += "<A href='?src=\ref[src];find=1'>2. Link To A Server</a><br>"
dat += "<A href='?src=\ref[src];clear=1'>3. Clear Message Logs</a><hr>"
dat += "<font color='red'> KEY REQUIRED</font><br>"
dat += "<A href='?src=\ref[src];view=1'>4. View Message Logs </a><br>"
dat += "<A href='?src=\ref[src];pass=1'>5. Set Custom Key</a><hr><br>"
//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 += "<A href='?src=\ref[src];hack=1'><i><font color='Red'>*&@. Bruteforce Key</font></i></font></a><br>"
//Message Logs
if(1)
if(hacking)
screen = 2
return src.attack_hand(user)
if(!linkedServer || (linkedServer.stat & (NOPOWER|BROKEN)))
usr << "<span class='notice'>No server detected.</span>"
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 += "<center><A href='?src=\ref[src];back=1'>Return</a> - <A href='?src=\ref[src];refresh=1'>Refresh</center><hr>"
dat += "<table border='1' width='100%'><tr><th width='20%'>Sender</th><th width='20%'>Recipient</th><th width='300px' word-wrap: break-word>Message</th></tr>"
for(var/list/datum/data_pda_msg/pda in src.linkedServer.pda_msgs)
index++
if(index > 3000)
break
dat += "<tr><td width='20%'>[pda.sender]</td><td width='20%'>[pda.recipient]</td><td width='80%'>[pda.message]</td></tr>"
dat += "</table>"
//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.<br> 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 += "</body>"
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 << "<span class='warning'>Brute-force completed! The key is '[currentKey]'.</span>"
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.</span>"
else if(message_servers && message_servers.len > 0)
linkedServer = message_servers[1]
usr << "<span class='notice'>Single Server Detected - Server selected.</span>"
else
usr << "<span class='notice'>No server detected.</span>"
if (href_list["view"])
if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN)))
usr << "<span class='notice'>No server detected.</span>"
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 << "<span class='warning'>ALERT: Incorrect password!</span>"
if (href_list["clear"])
if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN)))
usr << "<span class='notice'>No server detected.</span>"
else
src.linkedServer.pda_msgs = list()
usr << "<span class='notice'>Logs cleared.</span>"
if (href_list["pass"])
if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN)))
usr << "<span class='notice'>No server detected.</span>"
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 << "<span class='notice'>Password set.</span>"
else
usr << "<span class='warning'>ALERT: Incorrect password!</span>"
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 = "<center><h2>Daily Key Reset</h2></center><br>The new message monitor key is '[server.decryptkey]'.<br>Please keep this a secret.<br>If necessary, change the password to a more secure one."
// info_links = info
overlays += "paper_words"
+4 -1
View File
@@ -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)
+3 -3
View File
@@ -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 = "<font color = #336699>- NEW NETWORK TAG SET IN ADDRESS \[[network]\] -</font color>"
updateUsrDialog()
@@ -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
+3 -3
View File
@@ -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))
+131 -61
View File
@@ -243,6 +243,7 @@
dat += "<li><a href='byond://?src=\ref[src];choice=1'><img src=pda_notes.png> Notekeeper</a></li>"
dat += "<li><a href='byond://?src=\ref[src];choice=2'><img src=pda_mail.png> Messenger</a></li>"
dat += "<li><a href='byond://?src=\ref[src];choice=41'><img src=pda_notes.png> View Crew Manifest</a></li>"
//dat += "<li><a href='byond://?src=\red[src];choice=chatroom'><img src=pda_chatroom.png> Nanotrasen Relay Chat</a></li>"
if (cartridge)
if (cartridge.access_clown)
@@ -382,6 +383,17 @@
dat += "OTHER: [round(unknown_level)]%<br>"
dat += "Temperature: [round(environment.temperature-T0C)]&deg;C<br>"
dat += "<br>"
if (5)
dat += "<h4><img src=pda_chatroom.png> Nanotrasen Relay Chat</h4>"
dat += "<h4><img src=pda_menu.png> Detected Channels</h4>: <li>"
for(var/datum/chatroom/C in chatrooms)
dat += "<a href='byond://?src=\ref[src];pdachannel=[C.name]'>#[html_encode(lowertext(C.name))]"
if(C.password != "")
dat += " <img src=pda_locked.png>"
dat += "</li>"
if (41) //crew manifest
dat += "<h4><img src=pda_notes.png> Crew Manifest</h4>"
@@ -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 += "<i><b>&rarr; To [P.owner]:</b></i><br>[t]<br>"
P.tnote += "<i><b>&larr; From <a href='byond://?src=\ref[P];choice=Message;target=\ref[src]'>[owner]</a> ([ownjob]):</b></i><br>[t]<br>"
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("<i>PDA message from <b>[src.owner]</b> to <b>[P:owner]</b>: [t]</i>")
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("<i>Intercepted message from <b>[who]</b>: [t]</i>")
if(!AnsweringMS)
return
tnote += "<i><b>&rarr; To [P.owner]:</b></i><br>[t]<br>"
P.tnote += "<i><b>&larr; From <a href='byond://?src=\ref[P];choice=Message;target=\ref[src]'>[owner]</a> ([ownjob]):</b></i><br>[t]<br>"
// Give every ghost the ability to see all messages
for (var/mob/dead/observer/G in world)
G.show_message("<i>PDA message from <b>[src.owner]</b> to <b>[P:owner]</b>: [t]</i>")
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("<i>Intercepted message from <b>[who]</b>: [t]</i>")
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] <b>Message from [src.owner] ([ownjob]), </b>\"[t]\" (<a href='byond://?src=\ref[P];choice=Message;skiprefresh=1;target=\ref[src]'>Reply</a>)"
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] <b>Message from [src.owner] ([ownjob]), </b>\"[t]\" (<a href='byond://?src=\ref[P];choice=Message;skiprefresh=1;target=\ref[src]'>Reply</a>)"
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 += "<i><b>&rarr; To [P]:</b></i><br>[t]<br>"
P.tnote += "<i><b>&larr; From <a href='byond://?src=\ref[P];soft=pdamessage;target=\ref[src]'>[src]</a>:</b></i><br>[t]<br>"
if(!AnsweringMS)
return
// Give every ghost the ability to see all messages
for (var/mob/dead/observer/G in world)
G.show_message("<i>PDA message from <b>[src.owner]</b> to <b>[P:owner]</b>: [t]</i>")
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("<i>Intercepted message from <b>[who]</b>: [t]</i>")
tnote += "<i><b>&rarr; To [P]:</b></i><br>[t]<br>"
P.tnote += "<i><b>&larr; From <a href='byond://?src=\ref[P];soft=pdamessage;target=\ref[src]'>[src]</a>:</b></i><br>[t]<br>"
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] <b>Message from [src.owner] ([ownjob]), </b>\"[t]\" (<a href='byond://?src=\ref[P];choice=Message;skiprefresh=1;target=\ref[src]'>Reply</a>)"
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("<i>Intercepted message from <b>[who]</b>: [t]</i>")
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("<i>PDA message to <b>[selected:owner]</b>: [t]</i>")
selected:tnote += "<i><b>&larr; From (AI) [usr.name]:</b></i><br>[t]<br>"
usr.show_message("<i>PDA message to <b>[selected:owner]</b>: [t]</i>")
selected:tnote += "<i><b>&larr; From (AI) [usr.name]:</b></i><br>[t]<br>"
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
+16
View File
@@ -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
+1 -1
View File
@@ -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
+4
View File
@@ -23,8 +23,10 @@
for(var/mob/O in viewers(user, null))
O.show_message("\red <B>[user] is trying to put handcuffs on [M]!</B>", 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
@@ -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 ..()
+155 -1
View File
@@ -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"
@@ -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 = {"
<b>Implant Specifications:</b><BR>
<b>Name:</b> Cybersun Industries Adrenalin Implant<BR>
<b>Life:</b> Five days.<BR>
<b>Important Notes:</b> <font color='red'>Illegal</font><BR>
<HR>
<b>Implant Details:</b> Subjects injected with implant can activate a massive injection of adrenalin.<BR>
<b>Function:</b> Contains nanobots to stimulate body to mass-produce Adrenalin.<BR>
<b>Special Features:</b> Will prevent and cure most forms of brainwashing.<BR>
<b>Integrity:</b> 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, <B>say *pale</B> to attempt to activate.", 0, 0)
source << "The implanted freedom implant can be activated by using the pale emote, <B>say *pale</B> to attempt to activate."
return
//BS12 Explosive
/obj/item/weapon/implant/explosive
name = "explosive implant"
@@ -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"
+3 -3
View File
@@ -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
..()
..()
+26 -26
View File
@@ -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()
+2 -2
View File
@@ -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)
+24 -22
View File
@@ -188,7 +188,7 @@
var/text = "<HTML><HEAD><TITLE>Voting</TITLE></HEAD><BODY scroll=no>"
var/footer = "<HR><A href='?src=\ref[vote];voter=\ref[src];vclose=1'>Close</A></BODY></HTML>"
var/footer = "<HR><A href='?src=\ref[vote];vclose=1'>Close</A></BODY></HTML>"
if(config.vote_no_dead && usr.stat == 2)
@@ -247,7 +247,7 @@
if(src.client.vote == md)
text += "<LI><B>[disp]</B>"
else
text += "<LI><A href='?src=\ref[vote];voter=\ref[src];vote=[md]'>[disp]</A>"
text += "<LI><A href='?src=\ref[vote];vote=[md]'>[disp]</A>"
text += "[votes[md]>0?" - [votes[md]] vote\s":null]<BR>"
@@ -276,7 +276,7 @@
if(src.client.vote == md)
text += "<LI><B>[disp]</B>"
else
text += "<LI><A href='?src=\ref[vote];voter=\ref[src];vote=[md]'>[disp]</A>"
text += "<LI><A href='?src=\ref[vote];vote=[md]'>[disp]</A>"
text += "[votes[md]>0?" - [votes[md]] vote\s":null]<BR>"
@@ -315,10 +315,10 @@
else // voting can begin
if(config.allow_vote_restart)
text += "<A href='?src=\ref[vote];voter=\ref[src];vmode=1'>Begin restart vote.</A><BR>"
text += "<A href='?src=\ref[vote];vmode=1'>Begin restart vote.</A><BR>"
if(config.allow_vote_mode)
if(!ticker || ticker.current_state == 1)
text += "<A href='?src=\ref[vote];voter=\ref[src];vmode=2'>Begin change mode vote.</A><BR>"
text += "<A href='?src=\ref[vote];vmode=2'>Begin change mode vote.</A><BR>"
else
text += "Change mode votes are disabled while a round is in progress, vote to restart first.<BR>"
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<B>*** A custom vote has been initiated by [M.key].</B>"
world << "\red<B>*** A custom vote has been initiated by [usr.key].</B>"
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<B>*** A vote to [vote.mode?"change game mode":"restart"] has been initiated by [M.key].</B>"
world << "\red<B>*** A vote to [vote.mode?"change game mode":"restart"] has been initiated by [usr.key].</B>"
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
+54
View File
@@ -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 <b>[T.loc]</b>)"
else
location_description = "([T.x], [T.y], [T.z])"
//Job + antagonist
if(M.mind)
special_role_description = "Role: <b>[M.mind.assigned_role]</b>; Antagonist: <font color='red'><b>[M.mind.special_role]</b></font>; Has been rev: [(M.mind.has_been_rev)?"Yes":"No"]"
else
special_role_description = "Role: <i>Mind datum missing</i> Antagonist: <i>Mind datum missing</i>; Has been rev: <i>Mind datum missing</i>;"
//Health
health_description = "Oxy: [M.oxyloss] - Tox: [M.toxloss] - Fire: [M.fireloss] - Brute: [M.bruteloss] - Clone: [M.cloneloss] - Brain: [M.brainloss]"
src.owner << "<b>Info about [M.name]:</b> "
src.owner << "Mob type = [M.type]; Damage = [health_description]"
src.owner << "Name = <b>[M.name]</b>; Real_name = [M.real_name]; Original_name = [M.original_name]; Key = <b>[M.key]</b>;"
src.owner << "Location = [location_description];"
src.owner << "[special_role_description]"
src.owner << "(<a href='?src=\ref[usr];priv_msg=\ref[M]'>PM</a>) (<A HREF='?src=\ref[src];adminplayeropts=\ref[M]'>PP</A>) (<A HREF='?src=\ref[src];adminplayervars=\ref[M]'>VV</A>) (<A HREF='?src=\ref[src];adminplayersubtlemessage=\ref[M]'>SM</A>) (<A HREF='?src=\ref[src];adminplayerobservejump=\ref[M]'>JMP</A>) (<A HREF='?src=\ref[src];secretsadmin=check_antagonist'>CA</A>)"
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 <b>best cookie</b>!"
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"])
+74 -4
View File
@@ -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 = "<b><font color='black'>[original_word] (<A HREF='?src=HOLDERREF;adminmoreinfo=\ref[M]'>?</A>)</font></b>"
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 <b><font color=red>HELP: </font>[key_name(src, X)] (<A HREF='?src=\ref[X.holder];adminplayeropts=[ref_mob]'>PP</A>) (<A HREF='?src=\ref[X.holder];adminplayervars=[ref_mob]'>VV</A>) (<A HREF='?src=\ref[X.holder];adminplayersubtlemessage=[ref_mob]'>SM</A>) (<A HREF='?src=\ref[X.holder];adminplayerobservejump=[ref_mob]'>JMP</A>) (<A HREF='?src=\ref[X.holder];secretsadmin=check_antagonist'>CA</A>):</b> [msg]"
var/msg_to_send = "\blue <b><font color=red>HELP: </font>[key_name(src, X)] (<A HREF='?src=\ref[X.holder];adminmoreinfo=[ref_mob]'>?</A>) (<A HREF='?src=\ref[X.holder];adminplayeropts=[ref_mob]'>PP</A>) (<A HREF='?src=\ref[X.holder];adminplayervars=[ref_mob]'>VV</A>) (<A HREF='?src=\ref[X.holder];adminplayersubtlemessage=[ref_mob]'>SM</A>) (<A HREF='?src=\ref[X.holder];adminplayerobservejump=[ref_mob]'>JMP</A>) (<A HREF='?src=\ref[X.holder];secretsadmin=check_antagonist'>CA</A>):</b> [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 <b><font color=red>HELP: </font>[key_name(src, X)] (<A HREF='?src=\ref[X.holder];adminplayervars=[ref_client]'>VV</A>) (<A HREF='?src=\ref[X.holder];secretsadmin=check_antagonist'>CA</A>):</b> [msg]"
var/msg_to_send = "\blue <b><font color=red>HELP: </font>[key_name(src, X)] (<A HREF='?src=\ref[X.holder];adminplayervars=[ref_client]'>VV</A>) (<A HREF='?src=\ref[X.holder];secretsadmin=check_antagonist'>CA</A>):</b> [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 << "<font color='blue'>PM to-<b>Admins</b>: [msg]</font>"
log_admin("HELP: [key_name(src)]: [msg]")
src << "<font color='blue'>PM to-<b>Admins</b>: [original_msg]</font>"
log_admin("HELP: [key_name(src)]: [original_msg]")
var/list/replacechars = list("'" = "","\"" = "",">" = "","<" = "","(" = "",")" = "")
msg = sanitize_simple(msg, replacechars)
if(tension_master)
+1 -1
View File
@@ -14,7 +14,7 @@
for (var/mob/M in world)
if (M.client && M.client.holder && M.client.seeprayers)
M << "\blue \icon[cross] <b><font color=purple>PRAY: </font>[key_name(src, M)] (<A HREF='?src=\ref[M.client.holder];adminplayeropts=\ref[src]'>PP</A>) (<A HREF='?src=\ref[M.client.holder];adminplayervars=\ref[src]'>VV</A>) (<A HREF='?src=\ref[M.client.holder];adminplayersubtlemessage=\ref[src]'>SM</A>) (<A HREF='?src=\ref[M.client.holder];adminplayerobservejump=\ref[src]'>JMP</A>) (<A HREF='?src=\ref[M.client.holder];secretsadmin=check_antagonist'>CA</A>):</b> [msg]"
M << "\blue \icon[cross] <b><font color=purple>PRAY: </font>[key_name(src, M)] (<A HREF='?src=\ref[M.client.holder];adminplayeropts=\ref[src]'>PP</A>) (<A HREF='?src=\ref[M.client.holder];adminplayervars=\ref[src]'>VV</A>) (<A HREF='?src=\ref[M.client.holder];adminplayersubtlemessage=\ref[src]'>SM</A>) (<A HREF='?src=\ref[M.client.holder];adminplayerobservejump=\ref[src]'>JMP</A>) (<A HREF='?src=\ref[M.client.holder];secretsadmin=check_antagonist'>CA</A>) (<A HREF='?src=\ref[M.client.holder];adminspawncookie=\ref[src]'>SC</a>):</b> [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!
@@ -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"
+2 -2
View File
@@ -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)
+33
View File
@@ -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 <b>[src]</b> is smashed into pieces!", 1)
del(src)
+9
View File
@@ -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."
@@ -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
@@ -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 <B>[message]</B>")
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)
+4 -4
View File
@@ -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
@@ -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)
+60 -103
View File
@@ -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)
+8 -3
View File
@@ -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 << "<span class='warning'>Unwield the [initial(W.name)] first!</span>"
return
u_equip(W)
back = W
+11 -6
View File
@@ -694,9 +694,13 @@
if(resisting)
for(var/mob/O in viewers(usr, null))
O.show_message(text("\red <B>[] resists!</B>", 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 <B>[] attempts to remove \the [usr:handcuffed]!</B>", usr), 1)
spawn(0)
+8 -1
View File
@@ -136,6 +136,13 @@
addtofield(i, "<font face=\"[deffont]\"><A href='?src=\ref[src];write=[i]'>write</A></font>", 1)
info_links = info_links + "<font face=\"[deffont]\"><A href='?src=\ref[src];write=end'>write</A></font>"
/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({"<HTML><HEAD><TITLE>Pen Help</TITLE></HEAD>
<BODY>
@@ -204,7 +212,6 @@
\[hr\] : Adds a horizontal rule.
</BODY></HTML>"}, "window=paper_help")
/obj/item/weapon/paper/Topic(href, href_list)
..()
if ((usr.stat || usr.restrained()))
+11 -1
View File
@@ -21,4 +21,14 @@
/obj/item/weapon/pen/red
desc = "It's a normal red ink pen."
icon_state = "pen_red"
colour = "red"
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"
+19 -12
View File
@@ -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'
+27
View File
@@ -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
+1 -10
View File
@@ -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
@@ -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////////////////////
+18 -7
View File
@@ -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 <B>[message]</B>")
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()]\] <b>[firer]/[firer.ckey]</b> shot <b>[M]/[M.ckey]</b> with a <b>[src]</b>"
firer.attack_log += "\[[time_stamp()]\] <b>[firer]/[firer.ckey]</b> shot <b>[M]/[M.ckey]</b> with a <b>[src]</b>"
@@ -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.
@@ -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"
+9
View File
@@ -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//////////
///////////////////////////////////
+26 -2
View File
@@ -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
@@ -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
+16
View File
@@ -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. -->
<!-- To take advantage of the pretty new format (well it was new when I wrote this anyway), open the "add-to-changelog.html" file in any browser and add the stuff and then generate the html code and paste it here -->
<div class="commit sansserif">
<h2 class="date">23 June 2012</h2>
<h3 class="author">TG updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Updated toilets. You can now crowbar open the cistern and hide stuff in there.</li>
<li class="rscadd">Omni-directional PA console! Never have to worry about rotating it again, because now it does it itself!</li>
<li class="rscadd">Players can fill their cigarettes with various chemicals and smoke them.</li>
<li class="rscadd">You can now click blocks to select them.</li>
<li class="tweak">Areas have been redefined and renamed to make more logical sense (eg "Arrivals North Maintenance" instead of "Secondary Fore Port Maintenance"). Same has been done with Solars.</li>
<li class="tweak">Scientists no longer start with gas masks and o2 tanks (Still available from the lockers).</li>
<li class="tweak">Hydroponics trays are now unwrenchable.</li>
<li class="tweak">The Experimental Welding Tool, rather than having a larger tank, will refill itself over time.</li>
<li class="bugfix">Borg diamond drills now properly dig sand.</li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">22 June 2012</h2>
<h3 class="author">Cael_Aislinn updated:</h3>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 189 KiB

After

Width:  |  Height:  |  Size: 190 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 264 KiB

After

Width:  |  Height:  |  Size: 264 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 81 KiB

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 751 B

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1019 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 223 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 215 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 340 KiB

After

Width:  |  Height:  |  Size: 338 KiB