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