From dfb6676ebb248ad6eab01b579d5dc786010e78dc Mon Sep 17 00:00:00 2001 From: Erthilo Date: Sat, 23 Jun 2012 14:59:54 +0100 Subject: [PATCH] TG: Not a whole lot going on in this commit, just more work on preparation for the traitor factions update. Added some new sprites and weapons. New weapon: Delivery grenade. Can spawn an x amount of mob/object y in a constant radius. It is currently used for carp and manhack delivery grenades. !! Important !!: Certain telecomms computers were causing very nasty machine disruption through some very silly mishap involving re-programming a computer's network. Basically, it was breaking machine procs every time you messed with them. This should hopefully make telecomms a lot more stable. Fixed a bug where the reflexes nanoaug would not actually dodge the projectile if the person was clicking directly inside the target's 32x32 border. I changed around some core PDA messaging functions in preparation to PDA Chatrooms (yes Legality it's happening). However I'm going to hold off actually implementing it until Messycakes is either completed with his PDA UI overhaul or just stops working on it. Committed two patches from separate people in the forums. Chemical Cigarettes by Neek (http://nanotrasen.com/phpBB3/viewtopic.php?f=16&t=8775) and Clicking genetics blocks by Willox (http://nanotrasen.com/phpBB3/viewtopic.php?f=16&t=8857). Check their respective threads for more details. Sorry I couldn't get this earlier, guys! Revision: r3755 Author: vageyenaman --- code/game/dna.dm | 34 +++- code/game/machinery/telecomms/telemonitor.dm | 6 +- .../machinery/telecomms/traffic_control.dm | 2 +- code/game/objects/devices/PDA/PDA.dm | 165 ++++++++++++------ .../objects/items/weapons/cigs_lighters.dm | 54 ++++++ code/game/objects/items/weapons/grenades.dm | 157 ++++++++++++++++- .../objects/items/weapons/implants/implant.dm | 40 ++++- .../items/weapons/implants/implanter.dm | 9 + code/modules/chemical/Chemistry-Tools.dm | 4 +- .../mob/living/carbon/human/human_defense.dm | 6 - .../modules/mob/living/carbon/metroid/life.dm | 1 + code/modules/projectiles/guns/energy/laser.dm | 9 +- code/modules/projectiles/projectile.dm | 25 ++- code/modules/projectiles/projectile/beams.dm | 4 + .../scripting/Implementations/Telecomms.dm | 15 +- icons/obj/grenade.dmi | Bin 751 -> 1284 bytes icons/obj/weapons.dmi | Bin 22992 -> 23582 bytes icons/pda_icons/pda_chatroom.png | Bin 0 -> 223 bytes icons/pda_icons/pda_locked.PNG | Bin 0 -> 215 bytes 19 files changed, 443 insertions(+), 88 deletions(-) create mode 100644 icons/pda_icons/pda_chatroom.png create mode 100644 icons/pda_icons/pda_locked.PNG 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 0d5f9892b96631643cf2a994f9b53df573db838e..54b1333131237587d56430e7a2cb923cc9fa45fc 100644 GIT binary patch delta 1162 zcmV;51a zMZmzo9v&WKWMoN6Nr#7rz`(%&fI$BMGymiO|Fi)AW-|aYGynep|I7dY00960X8+7H zW&i-p001-pW&i*)CN&^3Mh$0vOjvF>N?arc76AVM0RNd806R+&*)p^%00001bW%=J z06^y0W&i*Hy^(Z_e-h0G3T6VswUVIeFoihGH$gVvNC$|KLM%ToxwIG*b%X;Kt`vto zhFr=Du6{1y^Z)=E>6n(V-HMR_00WOnL_t(|ob8$mSEDcxg&7D%tuF4m8^o6X|2KCg zp%n6%;SgGTc600Ts2|O}6P^=W6j@nWS#trvH}kR#Zvmu{f7_q;<xWO#~_7YH;iO61B|uVIs*n0 zA8WVsuqD8_fA^+68LDt2_X2o-xBF0y19<03Dqk7Ep27BP4jF9civaF5>@tGAh8?QI zcs*OZe>HEaCd8!~plftRcM)4b;Es{XuiM4$Q*;}H#XW6bE^D4FlroiPWo2b$Wo12z z9(R3UEk7Ppczk_eH9scu==18Gc>IZd9e;g&dwbi?f0^}xl{`5>ylY#}xc~x>t`AH+ z-q&8=&jk?p4m0pWm;s(g+w;}D6^;RcKTd$nd^Fg~_XzMV1Ymi=tYNO>4=@910oZly zd+@BRtgNi8tgP=}$(Q^0nI@%(HaH)w1Kx1ZzBPIqnH5n=?{FnGBxba3!#5E1=$Aip}(j4 zP(40zSDO+e)TCS-W-eDy zfBHp;{rzd;CocdxOf{mw4Y1%Qg!T;*`g`5aYs3I*xtkW81fO02vA;jh_}Srl7#1}G zo@_eGjkKFU?C(!A?(PHK_vp~|)`NC|S_W8h^YW)4p}*GyIiN*n{LL|-<2({T>hDhz z_YcAz9ms+_P32=EdK!T{mslvc@X2EaZf2}b#zQlJ)Fex;?#CJ$wE$B$!#CM4hKEKxT ctp8Jg0g@?M(9u{_N&o-=07*qoM6N<$f`{!S@c;k- delta 635 zcmV->0)+j93hxDfiBL{Q4GJ0x0000DNk~Le0001B0001B2m=5B0M$l^3IG5AHc(7d zMZmzo9v&WKWMoN6Nr#7rz`(%&fI$D`0ROZA{{S=pW-|aYGynep|I7dY05bpp0RR7H z|I9PturU1q0004WQchCYCSDgbJX zVt~{zD<%K{0mVr~K~!jg?U~_j!Y~Ykag!E8VQlaJvP+uKQW~EPQIV$keoWgwle42X zy>5qt$z)oKh<4^(SFfO?!t?j9@wu*ZRYuM^-&5wjk3Z2%{Hc$c!H^cniVF-I1I*|C zyUBYCONWuiJ>Y*QVEMhwdu$N7_rQSVb6Fg)VnFu=GVh<;koZz~Je{CHxOB(5~bS9reKYX&@D z8C37Va=uVMxS`yytItbZnjoDaE}dez!^(*z@uiMC2h)EsNvkvSH7@JXxz>fmO(v7c z^p~{X`++XsOV29sexc3x?9*1@Er;7jp002ovPDHLkV1j13EcE~Y diff --git a/icons/obj/weapons.dmi b/icons/obj/weapons.dmi index 8eab299d9a9f39ec5beb4d85608c1ce3e6defaff..5ec4ffee8e3c8a28051701a967351eeafd38c549 100644 GIT binary patch delta 4211 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 Q0oujj>FVdQ&MBb@06U#am;e9( literal 0 HcmV?d00001 diff --git a/icons/pda_icons/pda_locked.PNG b/icons/pda_icons/pda_locked.PNG new file mode 100644 index 0000000000000000000000000000000000000000..79fe5829162168f1c062c6be4b694dd751a83b1b GIT binary patch literal 215 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Ea{HEjtmSN`?>!lvI6<+C7!;n z?6){%_*q$l`wM>ng~Ur-BT9nv(@M${i&7cfeO!RXDwL%bDH!XS6t*sT2vic`>Eak- z;h&tKz-(e-Akev>ZShLCZ9=<6Hfbzl-gx3r>w{H_N*OUN9JAPblrQ?K1T+78;996M zt9#=sl?9BKIkK`3h)Qc1`fgf2F`3KP_*{j;43?7~H+dL1dvh57ZL+utw1dIZ)z4*} HQ$iB}&C5a~ literal 0 HcmV?d00001