diff --git a/code/game/dna.dm b/code/game/dna.dm
index 534950cb02..8aa0f24142 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 <= 13) && (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/machinery/telecomms/telemonitor.dm b/code/game/machinery/telecomms/telemonitor.dm
index 4e9c114b53..130963c7e5 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()
+ machines = 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 6c44e0881e..12292ce27f 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/devices/PDA/PDA.dm b/code/game/objects/devices/PDA/PDA.dm
index 83658eb318..84194da1ce 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"
diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm
index 0d2cebe65c..7e9bfc3b94 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 b9ed0be9c8..084d9fb48c 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
*/
@@ -231,6 +232,7 @@ FLASHBANG
else
if (M.ear_damage >= 5)
M << "\red Your ears start to ring!"
+ M.update_icons()
prime() // Prime now just handles the two loops that query for people in lockers and people who can see it.
var/turf/T = get_turf(src)
@@ -289,7 +291,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 +369,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 9278947952..75640a756b 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 d07152f7e8..167e3e4d98 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/modules/chemical/Chemistry-Tools.dm b/code/modules/chemical/Chemistry-Tools.dm
index 75d2b206e5..e923720413 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/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index d72b6fca9f..36c44ae4db 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/metroid/life.dm b/code/modules/mob/living/carbon/metroid/life.dm
index 7b8c7aef51..79c9a1f121 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/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm
index e0083a135c..15689cc7b7 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 7b119584bf..1ffd5c926f 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 0c45c0bf38..5447f6a704 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/scripting/Implementations/Telecomms.dm b/code/modules/scripting/Implementations/Telecomms.dm
index 04e6797481..b6ab178a0c 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/icons/obj/grenade.dmi b/icons/obj/grenade.dmi
index 0d5f9892b9..54b1333131 100644
Binary files a/icons/obj/grenade.dmi and b/icons/obj/grenade.dmi differ
diff --git a/icons/obj/weapons.dmi b/icons/obj/weapons.dmi
index 8eab299d9a..5ec4ffee8e 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 0000000000..a00221c4e0
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 0000000000..79fe582916
Binary files /dev/null and b/icons/pda_icons/pda_locked.PNG differ