From 7dd9580adf7f640dc558e8da22bc93c5593e6d5c Mon Sep 17 00:00:00 2001 From: datlo Date: Sun, 6 Jan 2019 16:19:31 +0000 Subject: [PATCH 1/8] port icon and module --- .../mob/living/silicon/robot/robot_modules.dm | 41 ++++++++++++++++++ icons/mob/robots.dmi | Bin 263078 -> 265351 bytes 2 files changed, 41 insertions(+) diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 2330d0ecd64..c8a9f60290d 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -432,6 +432,47 @@ fix_modules() +/obj/item/robot_module/syndicate_saboteur + name = "syndicate saboteur module" + module_type = "Malf" + module_actions = list( + /datum/action/innate/robot_sight/meson, + /datum/action/innate/robot_sight/thermal, + ) + stacktypes = list( + /obj/item/stack/sheet/metal/cyborg = 50, + /obj/item/stack/sheet/glass/cyborg = 50, + /obj/item/stack/sheet/rglass/cyborg = 50, + /obj/item/stack/cable_coil/cyborg = 50, + /obj/item/stack/rods/cyborg = 60, + /obj/item/stack/tile/plasteel = 20 + ) + +/obj/item/robot_module/syndicate_saboteur/New() + ..() + modules += new /obj/item/assembly/flash/cyborg(src) + modules += new /obj/item/construction/rcd/borg/syndicate(src) + modules += new /obj/item/pipe_dispenser(src) + modules += new /obj/item/extinguisher(src) + modules += new /obj/item/weldingtool/largetank/cyborg(src) + modules += new /obj/item/screwdriver/nuke(src) + modules += new /obj/item/wrench/cyborg(src) + modules += new /obj/item/crowbar/cyborg(src) + modules += new /obj/item/wirecutters/cyborg(src) + modules += new /obj/item/multitool/cyborg(src) + modules += new /obj/item/destTagger/borg(src) + modules += new /obj/item/stack/cable_coil/cyborg(src) + modules += new /obj/item/pinpointer/operative(src) + modules += new /obj/item/borg_chameleon(src) + emag = null + + for(var/T in stacktypes) + var/obj/item/stack/sheet/W = new T(src) + W.amount = stacktypes[T] + modules += W + + fix_modules() + /obj/item/robot_module/combat name = "combat robot module" module_type = "Malf" diff --git a/icons/mob/robots.dmi b/icons/mob/robots.dmi index 653dfd5dfa964051c8349d9070d7ca5c3cfa3014..d35638a6d19f72fdd58f2bda1bebd9e1a9121f73 100644 GIT binary patch delta 10024 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 delta 7717 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 From d66b8d9f2046497a8b0087ac4c2c06832dd2c8e5 Mon Sep 17 00:00:00 2001 From: datlo Date: Sun, 6 Jan 2019 21:51:22 +0000 Subject: [PATCH 2/8] functional --- code/datums/uplink_item.dm | 2 +- .../objects/items/devices/chameleonproj.dm | 97 +++++++++++++ code/game/objects/items/weapons/RCD.dm | 14 +- .../antagonists/_common/antag_spawner.dm | 4 +- .../modules/mob/living/silicon/robot/robot.dm | 55 -------- .../mob/living/silicon/robot/robot_modules.dm | 23 ++-- .../mob/living/silicon/robot/syndicate.dm | 129 ++++++++++++++++++ icons/mob/robots.dmi | Bin 265351 -> 265350 bytes paradise.dme | 3 +- 9 files changed, 252 insertions(+), 75 deletions(-) create mode 100644 code/modules/mob/living/silicon/robot/syndicate.dm diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index 9eace6f7c1d..3671dc34c62 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -560,7 +560,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) /datum/uplink_item/dangerous/syndieborg name = "Syndicate Cyborg" - desc = "A cyborg designed and programmed for systematic extermination of non-Syndicate personnel." + desc = "A cyborg designed and programmed for systematic extermination of non-Syndicate personnel. Comes in Assault, Medical, or Saboteur variants." reference = "SC" item = /obj/item/antag_spawner/borg_tele refund_path = /obj/item/antag_spawner/borg_tele diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm index 7a25f4ece1b..2572f826735 100644 --- a/code/game/objects/items/devices/chameleonproj.dm +++ b/code/game/objects/items/devices/chameleonproj.dm @@ -148,3 +148,100 @@ /obj/effect/dummy/chameleon/Destroy() master.disrupt(0) return ..() + +/obj/item/borg_chameleon + name = "cyborg chameleon projector" + icon = 'icons/obj/device.dmi' + icon_state = "shield0" + item_state = "electronic" + w_class = WEIGHT_CLASS_SMALL + var/active = FALSE + var/activationCost = 300 + var/activationUpkeep = 50 + var/disguise = "landmate" + var/datum/component/mobhook // need this to deal with unregistration properly + var/mob/living/silicon/robot/syndicate/saboteur/user // needed for process() + +/obj/item/borg_chameleon/Destroy() + QDEL_NULL(mobhook) + return ..() + +/obj/item/borg_chameleon/dropped(mob/user) + . = ..() + disrupt(user) + +/obj/item/borg_chameleon/equipped(mob/user) + . = ..() + disrupt(user) + +/obj/item/borg_chameleon/attack_self(mob/living/silicon/robot/syndicate/saboteur/user) + if (user && user.cell && user.cell.charge > activationCost) + if (isturf(user.loc)) + toggle(user) + else + to_chat(user, "You can't use [src] while inside something!") + else + to_chat(user, "You need at least [activationCost] charge in your cell to use [src]!") + +/obj/item/borg_chameleon/proc/toggle(mob/living/silicon/robot/syndicate/saboteur/user) + if(active) + playsound(src, 'sound/effects/pop.ogg', 100, 1, -6) + to_chat(user, "You deactivate \the [src].") + deactivate(user) + else + to_chat(user, "You activate \the [src].") + var/start = user.filters.len + var/X,Y,rsq,i,f + for(i=1, i<=7, ++i) + do + X = 60*rand() - 30 + Y = 60*rand() - 30 + rsq = X*X + Y*Y + while(rsq<100 || rsq>900) + user.filters += filter(type="wave", x=X, y=Y, size=rand()*2.5+0.5, offset=rand()) + for(i=1, i<=7, ++i) + f = user.filters[start+i] + animate(f, offset=f:offset, time=0, loop=3, flags=ANIMATION_PARALLEL) + animate(offset=f:offset-1, time=rand()*20+10) + if (do_after(user, 50, target=user) && user.cell.use(activationCost)) + playsound(src, 'sound/effects/bamf.ogg', 100, 1, -6) + to_chat(user, "You are now disguised as a Nanotrasen engineering cyborg.") + activate(user) + else + to_chat(user, "The chameleon field fizzles.") + do_sparks(3, FALSE, user) + for(i=1, i<=min(7, user.filters.len), ++i) // removing filters that are animating does nothing, we gotta stop the animations first + f = user.filters[start+i] + animate(f) + user.filters = null + +/obj/item/borg_chameleon/process() + if (user) + if (!user.cell || !user.cell.use(activationUpkeep)) + disrupt(user) + else + return PROCESS_KILL + +/obj/item/borg_chameleon/proc/activate(mob/living/silicon/robot/syndicate/saboteur/user) + processing_objects.Add(src) + src.user = user + user.base_icon = disguise + user.icon_state = disguise + active = TRUE + user.active_proj = src + user.update_icons() + +/obj/item/borg_chameleon/proc/deactivate(mob/living/silicon/robot/syndicate/saboteur/user) + processing_objects.Remove(src) + QDEL_NULL(mobhook) + user.base_icon = initial(user.base_icon) + user.icon_state = initial(user.icon_state) + active = FALSE + user.active_proj = null + user.update_icons() + src.user = user + +/obj/item/borg_chameleon/proc/disrupt(mob/living/silicon/robot/syndicate/saboteur/user) + if(active) + to_chat(user, "Your chameleon field deactivates.") + deactivate(user) \ No newline at end of file diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm index e4624a00ba6..2bf94ff465a 100644 --- a/code/game/objects/items/weapons/RCD.dm +++ b/code/game/objects/items/weapons/RCD.dm @@ -456,20 +456,24 @@ GLOBAL_LIST_INIT(rcd_door_types, list( /obj/item/rcd/proc/checkResource(amount, mob/user) return matter >= amount +/obj/item/rcd/borg + canRwall = 1 + var/use_multiplier = 160 + +/obj/item/rcd/borg/syndicate + use_multiplier = 80 + /obj/item/rcd/borg/useResource(amount, mob/user) if(!isrobot(user)) return 0 var/mob/living/silicon/robot/R = user - return R.cell.use(amount * 160) + return R.cell.use(amount * use_multiplier) /obj/item/rcd/borg/checkResource(amount, mob/user) if(!isrobot(user)) return 0 var/mob/living/silicon/robot/R = user - return R.cell.charge >= (amount * 160) - -/obj/item/rcd/borg - canRwall = 1 + return R.cell.charge >= (amount * use_multiplier) /obj/item/rcd/proc/detonate_pulse() audible_message("[src] begins to vibrate and \ diff --git a/code/modules/antagonists/_common/antag_spawner.dm b/code/modules/antagonists/_common/antag_spawner.dm index 80a62f9c818..3ced0d5ceb0 100644 --- a/code/modules/antagonists/_common/antag_spawner.dm +++ b/code/modules/antagonists/_common/antag_spawner.dm @@ -19,7 +19,7 @@ var/checking = FALSE var/TC_cost = 0 var/borg_to_spawn - var/list/possible_types = list("Assault", "Medical") + var/list/possible_types = list("Assault", "Medical", "Saboteur") /obj/item/antag_spawner/borg_tele/attack_self(mob/user) if(used) @@ -57,6 +57,8 @@ switch(borg_to_spawn) if("Medical") R = new /mob/living/silicon/robot/syndicate/medical(T) + else if("Saboteur") + R = new /mob/living/silicon/robot/syndicate/saboteur(T) else R = new /mob/living/silicon/robot/syndicate(T) //Assault borg by default R.key = C.key diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 2f4056f6149..a546e299cd6 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -1293,61 +1293,6 @@ var/list/robot_verbs_default = list( playsound(loc, 'sound/mecha/nominalsyndi.ogg', 75, 0) - - -/mob/living/silicon/robot/syndicate - base_icon = "syndie_bloodhound" - icon_state = "syndie_bloodhound" - lawupdate = 0 - scrambledcodes = 1 - pdahide = 1 - faction = list("syndicate") - designation = "Syndicate Assault" - modtype = "Syndicate" - req_access = list(access_syndicate) - ionpulse = 1 - magpulse = 1 - lawchannel = "State" - var/playstyle_string = "You are a Syndicate assault cyborg!
\ - You are armed with powerful offensive tools to aid you in your mission: help the operatives secure the nuclear authentication disk. \ - Your cyborg LMG will slowly produce ammunition from your power supply, and your operative pinpointer will find and locate fellow nuclear operatives. \ - Help the operatives secure the disk at all costs!" - -/mob/living/silicon/robot/syndicate/New(loc) - ..() - cell.maxcharge = 25000 - cell.charge = 25000 - -/mob/living/silicon/robot/syndicate/init() - laws = new /datum/ai_laws/syndicate_override - module = new /obj/item/robot_module/syndicate(src) - - aiCamera = new/obj/item/camera/siliconcam/robot_camera(src) - radio = new /obj/item/radio/borg/syndicate(src) - radio.recalculateChannels() - - spawn(5) - if(playstyle_string) - to_chat(src, playstyle_string) - - playsound(loc, 'sound/mecha/nominalsyndi.ogg', 75, 0) - -/mob/living/silicon/robot/syndicate/medical - base_icon = "syndi-medi" - icon_state = "syndi-medi" - modtype = "Syndicate Medical" - designation = "Syndicate Medical" - playstyle_string = "You are a Syndicate medical cyborg!
\ - You are armed with powerful medical tools to aid you in your mission: help the operatives secure the nuclear authentication disk. \ - Your hypospray will produce Restorative Nanites, a wonder-drug that will heal most types of bodily damages, including clone and brain damage. It also produces morphine for offense. \ - Your defibrillator paddles can revive operatives through their hardsuits, or can be used on harm intent to shock enemies! \ - Your energy saw functions as a circular saw, but can be activated to deal more damage, and your operative pinpointer will find and locate fellow nuclear operatives. \ - Help the operatives secure the disk at all costs!" - -/mob/living/silicon/robot/syndicate/medical/init() - ..() - module = new /obj/item/robot_module/syndicate_medical(src) - /mob/living/silicon/robot/combat base_icon = "droidcombat" icon_state = "droidcombat" diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index c8a9f60290d..ee0cf0db06f 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -433,12 +433,9 @@ fix_modules() /obj/item/robot_module/syndicate_saboteur - name = "syndicate saboteur module" + name = "engineering robot module" //to disguise in examine module_type = "Malf" - module_actions = list( - /datum/action/innate/robot_sight/meson, - /datum/action/innate/robot_sight/thermal, - ) + stacktypes = list( /obj/item/stack/sheet/metal/cyborg = 50, /obj/item/stack/sheet/glass/cyborg = 50, @@ -450,20 +447,22 @@ /obj/item/robot_module/syndicate_saboteur/New() ..() - modules += new /obj/item/assembly/flash/cyborg(src) - modules += new /obj/item/construction/rcd/borg/syndicate(src) - modules += new /obj/item/pipe_dispenser(src) + modules += new /obj/item/rcd/borg/syndicate(src) + modules += new /obj/item/rpd(src) modules += new /obj/item/extinguisher(src) modules += new /obj/item/weldingtool/largetank/cyborg(src) - modules += new /obj/item/screwdriver/nuke(src) + modules += new /obj/item/screwdriver/cyborg(src) modules += new /obj/item/wrench/cyborg(src) modules += new /obj/item/crowbar/cyborg(src) modules += new /obj/item/wirecutters/cyborg(src) modules += new /obj/item/multitool/cyborg(src) - modules += new /obj/item/destTagger/borg(src) - modules += new /obj/item/stack/cable_coil/cyborg(src) - modules += new /obj/item/pinpointer/operative(src) + modules += new /obj/item/t_scanner(src) + modules += new /obj/item/analyzer(src) + modules += new /obj/item/gripper(src) + modules += new /obj/item/melee/energy/sword/cyborg(src) + modules += new /obj/item/card/emag(src) modules += new /obj/item/borg_chameleon(src) + modules += new /obj/item/pinpointer/operative(src) emag = null for(var/T in stacktypes) diff --git a/code/modules/mob/living/silicon/robot/syndicate.dm b/code/modules/mob/living/silicon/robot/syndicate.dm new file mode 100644 index 00000000000..25cf1dd184d --- /dev/null +++ b/code/modules/mob/living/silicon/robot/syndicate.dm @@ -0,0 +1,129 @@ +/mob/living/silicon/robot/syndicate + base_icon = "syndie_bloodhound" + icon_state = "syndie_bloodhound" + lawupdate = 0 + scrambledcodes = 1 + pdahide = 1 + faction = list("syndicate") + designation = "Syndicate Assault" + modtype = "Syndicate" + req_access = list(access_syndicate) + ionpulse = 1 + magpulse = 1 + lawchannel = "State" + var/playstyle_string = "You are a Syndicate assault cyborg!
\ + You are armed with powerful offensive tools to aid you in your mission: help the operatives secure the nuclear authentication disk. \ + Your cyborg LMG will slowly produce ammunition from your power supply, and your operative pinpointer will find and locate fellow nuclear operatives. \ + Help the operatives secure the disk at all costs!" + +/mob/living/silicon/robot/syndicate/New(loc) + ..() + cell.maxcharge = 25000 + cell.charge = 25000 + +/mob/living/silicon/robot/syndicate/init() + laws = new /datum/ai_laws/syndicate_override + module = new /obj/item/robot_module/syndicate(src) + + aiCamera = new/obj/item/camera/siliconcam/robot_camera(src) + radio = new /obj/item/radio/borg/syndicate(src) + radio.recalculateChannels() + + spawn(5) + if(playstyle_string) + to_chat(src, playstyle_string) + + playsound(loc, 'sound/mecha/nominalsyndi.ogg', 75, 0) + +/mob/living/silicon/robot/syndicate/medical + base_icon = "syndi-medi" + icon_state = "syndi-medi" + modtype = "Syndicate Medical" + designation = "Syndicate Medical" + playstyle_string = "You are a Syndicate medical cyborg!
\ + You are armed with powerful medical tools to aid you in your mission: help the operatives secure the nuclear authentication disk. \ + Your hypospray will produce Restorative Nanites, a wonder-drug that will heal most types of bodily damages, including clone and brain damage. It also produces morphine for offense. \ + Your defibrillator paddles can revive operatives through their hardsuits, or can be used on harm intent to shock enemies! \ + Your energy saw functions as a circular saw, but can be activated to deal more damage, and your operative pinpointer will find and locate fellow nuclear operatives. \ + Help the operatives secure the disk at all costs!" + +/mob/living/silicon/robot/syndicate/medical/init() + ..() + module = new /obj/item/robot_module/syndicate_medical(src) + +/mob/living/silicon/robot/syndicate/saboteur + base_icon = "syndi-engi" + icon_state = "syndi-engi" + modtype = "Syndicate Saboteur" + designation = "Syndicate Saboteur" + var/mail_destination = 0 + var/obj/item/borg_chameleon/active_proj = null + playstyle_string = "You are a Syndicate saboteur cyborg!
\ + You are equipped with robust engineering tools to aid you in your mission: help the operatives secure the nuclear authentication disk. \ + Your destination tagger will allow you to stealthily traverse the disposal network across the station \ + Your cyborg chameleon projector allows you to assume the appearance of a Nanotrasen engineering cyborg, and undertake covert actions on the station. \ + You are able to hijack Nanotrasen cyborgs by emagging their internal components, make sure to flash them first. \ + You are armed with a standard energy sword, use it to ambush key targets if needed.\ + Be aware that taking damage or being touched will break your disguise. \ + Help the operatives secure the disk at all costs!" + +/mob/living/silicon/robot/syndicate/saboteur/init() + ..() + module = new /obj/item/robot_module/syndicate_saboteur(src) + +/mob/living/silicon/robot/verb/modify_name() + set name = "Modify name" + set category = "Saboteur" + rename_self(braintype, 1) + +/mob/living/silicon/robot/syndicate/saboteur/verb/set_mail_tag() + set name = "Set mail tag" + set desc = "Tag yourself for delivery through the disposals system." + set category = "Saboteur" + + var/tag = input("Select the desired destination.", "Set Mail Tag", null) as null|anything in GLOB.TAGGERLOCATIONS + + if(!tag || GLOB.TAGGERLOCATIONS[tag]) + mail_destination = 0 + return + + to_chat(src, "You configure your internal beacon, tagging yourself for delivery to '[tag]'.") + mail_destination = GLOB.TAGGERLOCATIONS.Find(tag) + + //Auto flush if we use this verb inside a disposal chute. + var/obj/machinery/disposal/D = src.loc + if(istype(D)) + to_chat(src, "\The [D] acknowledges your signal.") + D.flush_count = D.flush_every_ticks + + return + +/mob/living/silicon/robot/syndicate/saboteur/attackby() + if(active_proj) + active_proj.disrupt(src) + ..() + +/mob/living/silicon/robot/syndicate/saboteur/attack_hand() + if(active_proj) + active_proj.disrupt(src) + ..() + +/mob/living/silicon/robot/syndicate/saboteur/ex_act() + if(active_proj) + active_proj.disrupt(src) + ..() + +/mob/living/silicon/robot/syndicate/saboteur/emp_act() + if(active_proj) + active_proj.disrupt(src) + ..() + +/mob/living/silicon/robot/syndicate/saboteur/bullet_act() + if(active_proj) + active_proj.disrupt(src) + ..() + +/mob/living/silicon/robot/syndicate/saboteur/attackby() + if(active_proj) + active_proj.disrupt(src) + ..() diff --git a/icons/mob/robots.dmi b/icons/mob/robots.dmi index d35638a6d19f72fdd58f2bda1bebd9e1a9121f73..eb59b0288b34baf880c7447e20ddbfa0a24e97bb 100644 GIT binary patch delta 1093 zcmV-L1iJf&nGlAV5RfE)OnOvUbVOxyV{&P5bZKvH004NLrI^8T;y4h7&+rtgnImWl zoG`l=4x8Z0l3F+nTYH_7tsbMqR=Xqt@!RjgNiblc7E>+`RDFM|-B!0+{gpkWPs=r1 ztd_$)7^_gTIlKQh84eCgx-FZtyJR@nf-1JI{bQYQz~=1BgTV}c-Iw7&Dr4E4-46%9 zjHtk}Ih!7_R2NDE7^RCK`*$O0MxTX#K$ir$6-bJ?mC|5-hf0P638iS*oK45m;h@4j zRG?jtfzb3v%PWv77bVRLUXjvX z8dNgJDih&C(qXy5lITcKaDNdPUy143vs(qex^PyoKJ`$EPMMx|6yJM4&Tvp7)~!JU z2c_kyKk#1tX=NQ6usr6#fCen5Rc~m(@`#K*<9Vryt+O;X*_BP+i<0+kSK@!`KfQU> zXNkDAp#jTFp=Bjp_-r_#qhfcHsKUAcVGO*H6Ub*EYF#Zf{*05?0Um#KBbbb*vvYBy zrGn^KT*#t4cBo2l-pUg4`BNUXD6N$JDiO`Jzm%S12@SiWVfQp_M#H|-us?!Wp|Wr| z3YCR}QK&2&ib7@KKolwqhoMkeI0%KxNFflWqF`A`ij~BJrf?;A4)s%PR|lyVp_N18 zaZWxhK0sn`T!}YTsj`1mzGBs7+mrQ*!`)VBGM-L4TBX6ffU8CRO6)Q&C8R=sB8zEG zt5;8d?`hXMLQg~A2}d&ST=#$Hh`mAU>2G5XT-o$n$|!>eX8?aVgl`jrEjnAHV{?{F z#?x7M*MFEPce!V9(#@C2ct)}oX!j{5?A2*b=LRqvpFCHMTgWps;cM5&;=tA&1FSP3Uc=o%%Y~b% zmJ9b&Ef;R7S}s4_RYhGkZk2foUHn}o@}hARzJbOJO~I`b4!8(!{YFd0E0DhZ?p;b6 zRI&y^nA{%Gh$&Twj~r69=5Cr%eU6i{0~mjwg^r*%VD=GyD@`2akR!OptOWk}&zeYX ze*8xy7t5!9a(2?bPrl8%zjG_AbV2njeI%0U+T)pT|GqEqFVz*SLGxN@2q)@iAIPB+ zMFE69iKd`+knMaV+J{qF5Pvi(e+5VSL?7%bT`bA)^IvN^oUWhf@M^hEBi@gY9nh0V z1Pvs*6cH{*?b!#E0(l%B-oyt6eqUL-Ua-Y#Is6}TqxZ3Z71+FkdIX1h1ObP71OkV8 L1OvBv1OyET+gk$V delta 1094 zcmV-M1iAZ$nGlDW5RfE)O?p&VbVOxyV{&P5bZKvH004NLrI;Pw!ee@oaFLcp}@B=G(tRS{fk6V^$Fdq~Cu$nRv$I`O5Cnhvk|r zR?Fcl7^_gTIlKKf84mVJx-FZtn`AiHf-1JI{bQYQz~=1Boxu!$-Iw7&Dr4E4-3|x8 zji|t~Ih%fBsVuT)Vf+|e2SCT0Um#JBbbb*vr}=S zrGn^KoXMg*cBo2l-pUg4`5=#4lvc`qmxyNCUrJB0gofSFuv;27qha4^*pDDqs4N_g zLS^A#6e`osw{t%uUK{2_GG=_aJLnjjHi>1R%tNL;A)Y-5W9?X38~N@$zqz* z>c!LFd)l>*(9_U&!jX(S*Zn^^Vz1D8`rFt87hgHnplhL_WTQNi-^cMhY~Mg7l(r|^ z(UWWjYM~4z(*h)IJV8rpgBiLJc4O&tza=@9+yf0HWt73aGXQ@a!ncXR7M-opu{ld7 zp#qtyWBH4>E_F1JR?~PwEGkj_Tn_Ba|4)-kDiOhE#w)R@U`n>aoUctwUS^m zbUfb*YgM?<-*NW z%Z2-?mJ7F3Ef+uTs-i9%*UCJFF8;0(dC~Y3zJbOJO~I`b4!8(!{YFd0E0DhZ?p;b6 zRI&y^nB0D%5mTxVA33CI&0RI4I*gOC0~miFg^r*%U|u8qR+>1-AxChHSqc39pEZ%( z{Q8ebE|w4d4NH6dQT+NwZ}8x{(WEIU#crugXXo+5Kh!XAIPB+ zMFE69iKd`+knMaV+J|FV5WhDne*s7OL?7%bT`bA)<6mn!oUR|}@M^hEBi@gY9nh0V z1PvuR7ZEN;w$btlDE09$JG=%DO#8mFbiH7U)pGbhpm_HT&-8dAgLwppc?1E6c?1H7 Mc?1Kuc?1Lv2$zl$9{>OV diff --git a/paradise.dme b/paradise.dme index f80ea688c86..45a4f96f7d7 100644 --- a/paradise.dme +++ b/paradise.dme @@ -1797,6 +1797,7 @@ #include "code\modules\mob\living\silicon\robot\robot_module_actions.dm" #include "code\modules\mob\living\silicon\robot\robot_modules.dm" #include "code\modules\mob\living\silicon\robot\robot_movement.dm" +#include "code\modules\mob\living\silicon\robot\syndicate.dm" #include "code\modules\mob\living\silicon\robot\update_status.dm" #include "code\modules\mob\living\silicon\robot\drone\drone.dm" #include "code\modules\mob\living\silicon\robot\drone\drone_abilities.dm" @@ -2350,4 +2351,4 @@ #include "goon\code\datums\browserOutput.dm" #include "interface\interface.dm" #include "interface\skin.dmf" -// END_INCLUDE \ No newline at end of file +// END_INCLUDE From b8fac2681fdffb0644f1e990bb6e0a6a66870de8 Mon Sep 17 00:00:00 2001 From: datlo Date: Mon, 7 Jan 2019 06:35:22 +0000 Subject: [PATCH 3/8] add verb to cham, general improvements --- .../objects/items/devices/chameleonproj.dm | 12 ++--- .../mob/living/silicon/robot/syndicate.dm | 48 +++++++++++-------- code/modules/mob/mob_helpers.dm | 9 ++-- 3 files changed, 41 insertions(+), 28 deletions(-) diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm index 2572f826735..d4e41a824fc 100644 --- a/code/game/objects/items/devices/chameleonproj.dm +++ b/code/game/objects/items/devices/chameleonproj.dm @@ -159,11 +159,14 @@ var/activationCost = 300 var/activationUpkeep = 50 var/disguise = "landmate" - var/datum/component/mobhook // need this to deal with unregistration properly - var/mob/living/silicon/robot/syndicate/saboteur/user // needed for process() + var/mob/living/silicon/robot/syndicate/saboteur/user + +/obj/item/borg_chameleon/New() + ..() + user.cham_proj = src /obj/item/borg_chameleon/Destroy() - QDEL_NULL(mobhook) + user.cham_proj = null return ..() /obj/item/borg_chameleon/dropped(mob/user) @@ -228,16 +231,13 @@ user.base_icon = disguise user.icon_state = disguise active = TRUE - user.active_proj = src user.update_icons() /obj/item/borg_chameleon/proc/deactivate(mob/living/silicon/robot/syndicate/saboteur/user) processing_objects.Remove(src) - QDEL_NULL(mobhook) user.base_icon = initial(user.base_icon) user.icon_state = initial(user.icon_state) active = FALSE - user.active_proj = null user.update_icons() src.user = user diff --git a/code/modules/mob/living/silicon/robot/syndicate.dm b/code/modules/mob/living/silicon/robot/syndicate.dm index 25cf1dd184d..13cbed08ec0 100644 --- a/code/modules/mob/living/silicon/robot/syndicate.dm +++ b/code/modules/mob/living/silicon/robot/syndicate.dm @@ -57,27 +57,37 @@ modtype = "Syndicate Saboteur" designation = "Syndicate Saboteur" var/mail_destination = 0 - var/obj/item/borg_chameleon/active_proj = null + var/obj/item/borg_chameleon/cham_proj = null playstyle_string = "You are a Syndicate saboteur cyborg!
\ You are equipped with robust engineering tools to aid you in your mission: help the operatives secure the nuclear authentication disk. \ - Your destination tagger will allow you to stealthily traverse the disposal network across the station \ + Your built-in mail tagger will allow you to stealthily traverse the disposal network across the station. \ Your cyborg chameleon projector allows you to assume the appearance of a Nanotrasen engineering cyborg, and undertake covert actions on the station. \ You are able to hijack Nanotrasen cyborgs by emagging their internal components, make sure to flash them first. \ You are armed with a standard energy sword, use it to ambush key targets if needed.\ - Be aware that taking damage or being touched will break your disguise. \ + Be aware that taking damage will break your disguise. \ Help the operatives secure the disk at all costs!" /mob/living/silicon/robot/syndicate/saboteur/init() ..() module = new /obj/item/robot_module/syndicate_saboteur(src) -/mob/living/silicon/robot/verb/modify_name() - set name = "Modify name" +/mob/living/silicon/robot/syndicate/saboteur/verb/modify_name() + set name = "Modify Name" + set desc = "Change your systems' registered name to fool Nanotrasen systems. No cost." set category = "Saboteur" - rename_self(braintype, 1) + rename_self(braintype, TRUE, TRUE) + +/mob/living/silicon/robot/syndicate/saboteur/verb/toggle_chameleon() + set name = "Toggle Chameleon Projector" + set desc = "Change your appearance to a Nanotrasen cyborg. Costs power to use and maintain." + set category = "Saboteur" + if(cham_proj) + cham_proj.attack_self(src) + else + to_chat("Error : No chameleon projector system found.") /mob/living/silicon/robot/syndicate/saboteur/verb/set_mail_tag() - set name = "Set mail tag" + set name = "Set Mail Tag" set desc = "Tag yourself for delivery through the disposals system." set category = "Saboteur" @@ -99,31 +109,31 @@ return /mob/living/silicon/robot/syndicate/saboteur/attackby() - if(active_proj) - active_proj.disrupt(src) + if(cham_proj) + cham_proj.disrupt(src) ..() /mob/living/silicon/robot/syndicate/saboteur/attack_hand() - if(active_proj) - active_proj.disrupt(src) + if(cham_proj) + cham_proj.disrupt(src) ..() /mob/living/silicon/robot/syndicate/saboteur/ex_act() - if(active_proj) - active_proj.disrupt(src) + if(cham_proj) + cham_proj.disrupt(src) ..() /mob/living/silicon/robot/syndicate/saboteur/emp_act() - if(active_proj) - active_proj.disrupt(src) + if(cham_proj) + cham_proj.disrupt(src) ..() /mob/living/silicon/robot/syndicate/saboteur/bullet_act() - if(active_proj) - active_proj.disrupt(src) + if(cham_proj) + cham_proj.disrupt(src) ..() /mob/living/silicon/robot/syndicate/saboteur/attackby() - if(active_proj) - active_proj.disrupt(src) + if(cham_proj) + cham_proj.disrupt(src) ..() diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 46b7d1141b8..8115e4d9ff0 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -560,7 +560,7 @@ var/list/intents = list(INTENT_HELP,INTENT_DISARM,INTENT_GRAB,INTENT_HARM) objective.explanation_text = copytext(objective.explanation_text, 1, pos)+newname+copytext(objective.explanation_text, pos+length) return 1 -/mob/proc/rename_self(var/role, var/allow_numbers=0) +/mob/proc/rename_self(var/role, var/allow_numbers = FALSE, var/force = FALSE) spawn(0) var/oldname = real_name @@ -568,8 +568,11 @@ var/list/intents = list(INTENT_HELP,INTENT_DISARM,INTENT_GRAB,INTENT_HARM) var/newname for(var/i=1,i<=3,i++) //we get 3 attempts to pick a suitable name. - newname = input(src, "You are a [role]. Would you like to change your name to something else? (You have 3 minutes to select a new name.)", "Name Change", oldname) as text - if((world.time - time_passed) > 1800) + if(force) + newname = input(src, "Pick a new name.", "Name Change", oldname) as text + else + newname = input(src, "You are a [role]. Would you like to change your name to something else? (You have 3 minutes to select a new name.)", "Name Change", oldname) as text + if(((world.time - time_passed) > 1800) && !force) alert(src, "Unfortunately, more than 3 minutes have passed for selecting your name. If you are a robot, use the Namepick verb; otherwise, adminhelp.", "Name Change") return //took too long newname = reject_bad_name(newname,allow_numbers) //returns null if the name doesn't meet some basic requirements. Tidies up a few other things like bad-characters. From 52f753f5b883b7462d10b6c7f33062b3163dc21f Mon Sep 17 00:00:00 2001 From: datlo Date: Mon, 7 Jan 2019 10:17:23 +0000 Subject: [PATCH 4/8] fix disposal mailing and chameleon verb, add self repair --- .../objects/items/devices/chameleonproj.dm | 16 ++++++-------- .../mob/living/silicon/robot/syndicate.dm | 22 ++++++++++++++----- code/modules/recycling/disposal.dm | 14 ++++++++---- 3 files changed, 33 insertions(+), 19 deletions(-) diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm index d4e41a824fc..aedbcccd5f9 100644 --- a/code/game/objects/items/devices/chameleonproj.dm +++ b/code/game/objects/items/devices/chameleonproj.dm @@ -161,12 +161,9 @@ var/disguise = "landmate" var/mob/living/silicon/robot/syndicate/saboteur/user -/obj/item/borg_chameleon/New() - ..() - user.cham_proj = src - /obj/item/borg_chameleon/Destroy() - user.cham_proj = null + if(user) + user.cham_proj = null return ..() /obj/item/borg_chameleon/dropped(mob/user) @@ -178,8 +175,8 @@ disrupt(user) /obj/item/borg_chameleon/attack_self(mob/living/silicon/robot/syndicate/saboteur/user) - if (user && user.cell && user.cell.charge > activationCost) - if (isturf(user.loc)) + if(user && user.cell && user.cell.charge > activationCost) + if(isturf(user.loc)) toggle(user) else to_chat(user, "You can't use [src] while inside something!") @@ -219,8 +216,8 @@ user.filters = null /obj/item/borg_chameleon/process() - if (user) - if (!user.cell || !user.cell.use(activationUpkeep)) + if(user) + if(!user.cell || !user.cell.use(activationUpkeep)) disrupt(user) else return PROCESS_KILL @@ -230,6 +227,7 @@ src.user = user user.base_icon = disguise user.icon_state = disguise + user.cham_proj = src active = TRUE user.update_icons() diff --git a/code/modules/mob/living/silicon/robot/syndicate.dm b/code/modules/mob/living/silicon/robot/syndicate.dm index 13cbed08ec0..48179e8d374 100644 --- a/code/modules/mob/living/silicon/robot/syndicate.dm +++ b/code/modules/mob/living/silicon/robot/syndicate.dm @@ -63,13 +63,18 @@ Your built-in mail tagger will allow you to stealthily traverse the disposal network across the station. \ Your cyborg chameleon projector allows you to assume the appearance of a Nanotrasen engineering cyborg, and undertake covert actions on the station. \ You are able to hijack Nanotrasen cyborgs by emagging their internal components, make sure to flash them first. \ - You are armed with a standard energy sword, use it to ambush key targets if needed.\ - Be aware that taking damage will break your disguise. \ + You are armed with a standard energy sword, use it to ambush key targets if needed. Your pinpointer will let you locate fellow nuclear operatives to regroup.\ + Be aware that physical contact or taking damage will break your disguise. \ Help the operatives secure the disk at all costs!
" /mob/living/silicon/robot/syndicate/saboteur/init() ..() module = new /obj/item/robot_module/syndicate_saboteur(src) + var/obj/item/borg/upgrade/selfrepair/SR = new /obj/item/borg/upgrade/selfrepair(src) + SR.cyborg = src + SR.icon_state = "selfrepair_off" + var/datum/action/A = new /datum/action/item_action/toggle(SR) + A.Grant(src) /mob/living/silicon/robot/syndicate/saboteur/verb/modify_name() set name = "Modify Name" @@ -81,10 +86,15 @@ set name = "Toggle Chameleon Projector" set desc = "Change your appearance to a Nanotrasen cyborg. Costs power to use and maintain." set category = "Saboteur" - if(cham_proj) - cham_proj.attack_self(src) - else - to_chat("Error : No chameleon projector system found.") + if(!cham_proj) + for(var/obj/item/borg_chameleon/C in contents) + cham_proj = C + for(var/obj/item/borg_chameleon/C in module.contents) + cham_proj = C + if(!cham_proj) + to_chat(src, "Error : No chameleon projector system found.") + return + cham_proj.attack_self(src) /mob/living/silicon/robot/syndicate/saboteur/verb/set_mail_tag() set name = "Set Mail Tag" diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index d0007ab7266..ef002caa1ec 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -417,6 +417,9 @@ for(var/mob/living/silicon/robot/drone/D in src) wrapcheck = 1 + for(var/mob/living/silicon/robot/syndicate/saboteur/R in src) + wrapcheck = 1 + for(var/obj/item/smallDelivery/O in src) wrapcheck = 1 @@ -461,7 +464,7 @@ AM.loc = src.loc AM.pipe_eject(0) - if(!istype(AM,/mob/living/silicon/robot/drone)) //Poor drones kept smashing windows and taking system damage being fired out of disposals. ~Z + if(!istype(AM, /mob/living/silicon/robot/drone) && !istype(AM, /mob/living/silicon/robot/syndicate/saboteur)) //Poor drones kept smashing windows and taking system damage being fired out of disposals. ~Z spawn(1) if(AM) AM.throw_at(target, 5, 1) @@ -523,7 +526,7 @@ //Check for any living mobs trigger hasmob. //hasmob effects whether the package goes to cargo or its tagged destination. for(var/mob/living/M in D) - if(M && M.stat != 2 && !istype(M,/mob/living/silicon/robot/drone)) + if(M && M.stat != 2 && !istype(M, /mob/living/silicon/robot/drone) && !istype(M, /mob/living/silicon/robot/syndicate/saboteur)) hasmob = 1 //Checks 1 contents level deep. This means that players can be sent through disposals... @@ -531,7 +534,7 @@ for(var/obj/O in D) if(O.contents) for(var/mob/living/M in O.contents) - if(M && M.stat != 2 && !istype(M,/mob/living/silicon/robot/drone)) + if(M && M.stat != 2 && !istype(M,/mob/living/silicon/robot/drone) && !istype(M, /mob/living/silicon/robot/syndicate/saboteur)) hasmob = 1 // now everything inside the disposal gets put into the holder @@ -553,6 +556,9 @@ if(istype(AM, /mob/living/silicon/robot/drone)) var/mob/living/silicon/robot/drone/drone = AM destinationTag = drone.mail_destination + if(istype(AM, /mob/living/silicon/robot/syndicate/saboteur)) + var/mob/living/silicon/robot/syndicate/saboteur/S = AM + destinationTag = S.mail_destination if(istype(AM, /obj/item/shippingPackage) && !hasmob) var/obj/item/shippingPackage/sp = AM if(sp.sealed) //only sealed packages get delivered to their intended destination @@ -1304,7 +1310,7 @@ for(var/atom/movable/AM in contents) AM.forceMove(loc) AM.pipe_eject(dir) - if(istype(AM,/mob/living/silicon/robot/drone)) //Drones keep smashing windows from being fired out of chutes. Bad for the station. ~Z + if(istype(AM,/mob/living/silicon/robot/drone) || istype(AM, /mob/living/silicon/robot/syndicate/saboteur)) //Drones keep smashing windows from being fired out of chutes. Bad for the station. ~Z return spawn(5) if(QDELETED(AM)) From f293ef1354ac4b48254895cea60bdc227392181e Mon Sep 17 00:00:00 2001 From: datlo Date: Mon, 7 Jan 2019 19:51:27 +0000 Subject: [PATCH 5/8] fix exploit --- code/modules/antagonists/_common/antag_spawner.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/antagonists/_common/antag_spawner.dm b/code/modules/antagonists/_common/antag_spawner.dm index 3ced0d5ceb0..c51201aaf28 100644 --- a/code/modules/antagonists/_common/antag_spawner.dm +++ b/code/modules/antagonists/_common/antag_spawner.dm @@ -43,6 +43,7 @@ var/mob/M = pick(borg_candidates) var/client/C = M.client spawn_antag(C, get_turf(src.loc), "syndieborg") + qdel(src) else checking = FALSE to_chat(user, "Unable to connect to Syndicate command. Please wait and try again later or refund your teleporter through your uplink.") From 4e10283b00b7a7cf8a564e46e54b74fd721a2e64 Mon Sep 17 00:00:00 2001 From: datlo Date: Mon, 7 Jan 2019 20:20:00 +0000 Subject: [PATCH 6/8] fix indentation dream maker wtf --- code/modules/antagonists/_common/antag_spawner.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/antagonists/_common/antag_spawner.dm b/code/modules/antagonists/_common/antag_spawner.dm index c51201aaf28..c8809ed98bf 100644 --- a/code/modules/antagonists/_common/antag_spawner.dm +++ b/code/modules/antagonists/_common/antag_spawner.dm @@ -43,7 +43,7 @@ var/mob/M = pick(borg_candidates) var/client/C = M.client spawn_antag(C, get_turf(src.loc), "syndieborg") - qdel(src) + qdel(src) else checking = FALSE to_chat(user, "Unable to connect to Syndicate command. Please wait and try again later or refund your teleporter through your uplink.") From 35f13a850f0a17d9a319c972bc87ab2d9e4bc087 Mon Sep 17 00:00:00 2001 From: datlo Date: Tue, 8 Jan 2019 09:34:41 +0000 Subject: [PATCH 7/8] somebody toucha mah spaghet --- .../objects/items/devices/chameleonproj.dm | 54 ++++++++++--------- 1 file changed, 29 insertions(+), 25 deletions(-) diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm index aedbcccd5f9..0b3ea4076a8 100644 --- a/code/game/objects/items/devices/chameleonproj.dm +++ b/code/game/objects/items/devices/chameleonproj.dm @@ -45,7 +45,7 @@ eject_all() playsound(get_turf(src), 'sound/effects/pop.ogg', 100, 1, -6) QDEL_NULL(active_dummy) - to_chat(usr, "You deactivate \the [src].") + to_chat(usr, "You deactivate [src].") var/obj/effect/overlay/T = new/obj/effect/overlay(get_turf(src)) T.icon = 'icons/effects/effects.dmi' flick("emppulse",T) @@ -58,7 +58,7 @@ var/obj/effect/dummy/chameleon/C = new/obj/effect/dummy/chameleon(usr.loc) C.activate(O, usr, saved_icon, saved_icon_state, saved_overlays, saved_underlays, src) qdel(O) - to_chat(usr, "You activate \the [src].") + to_chat(usr, "You activate [src].") var/obj/effect/overlay/T = new/obj/effect/overlay(get_turf(src)) T.icon = 'icons/effects/effects.dmi' flick("emppulse",T) @@ -159,11 +159,11 @@ var/activationCost = 300 var/activationUpkeep = 50 var/disguise = "landmate" - var/mob/living/silicon/robot/syndicate/saboteur/user + var/mob/living/silicon/robot/syndicate/saboteur/S /obj/item/borg_chameleon/Destroy() - if(user) - user.cham_proj = null + if(S) + S.cham_proj = null return ..() /obj/item/borg_chameleon/dropped(mob/user) @@ -186,45 +186,49 @@ /obj/item/borg_chameleon/proc/toggle(mob/living/silicon/robot/syndicate/saboteur/user) if(active) playsound(src, 'sound/effects/pop.ogg', 100, 1, -6) - to_chat(user, "You deactivate \the [src].") + to_chat(user, "You deactivate [src].") deactivate(user) else - to_chat(user, "You activate \the [src].") + to_chat(user, "You activate [src].") var/start = user.filters.len - var/X,Y,rsq,i,f - for(i=1, i<=7, ++i) + var/X + var/Y + var/rsq + var/i + var/f + for(i in 1 to 7) do - X = 60*rand() - 30 - Y = 60*rand() - 30 - rsq = X*X + Y*Y - while(rsq<100 || rsq>900) - user.filters += filter(type="wave", x=X, y=Y, size=rand()*2.5+0.5, offset=rand()) - for(i=1, i<=7, ++i) + X = 60 * rand() - 30 + Y = 60 * rand() - 30 + rsq = X * X + Y * Y + while(rsq < 100 || rsq > 900) + user.filters += filter(type = "wave", x = X, y = Y, size = rand() * 2.5 + 0.5, offset = rand()) + for(i in 1 to 7) f = user.filters[start+i] - animate(f, offset=f:offset, time=0, loop=3, flags=ANIMATION_PARALLEL) - animate(offset=f:offset-1, time=rand()*20+10) - if (do_after(user, 50, target=user) && user.cell.use(activationCost)) + animate(f, offset = f:offset, time = 0, loop = 3, flags = ANIMATION_PARALLEL) + animate(offset = f:offset - 1, time = rand() * 20 + 10) + if (do_after(user, 50, target = user) && user.cell.use(activationCost)) playsound(src, 'sound/effects/bamf.ogg', 100, 1, -6) to_chat(user, "You are now disguised as a Nanotrasen engineering cyborg.") activate(user) else to_chat(user, "The chameleon field fizzles.") do_sparks(3, FALSE, user) - for(i=1, i<=min(7, user.filters.len), ++i) // removing filters that are animating does nothing, we gotta stop the animations first - f = user.filters[start+i] + for(i in 1 to min(7, user.filters.len)) // removing filters that are animating does nothing, we gotta stop the animations first + f = user.filters[start + i] animate(f) user.filters = null /obj/item/borg_chameleon/process() - if(user) - if(!user.cell || !user.cell.use(activationUpkeep)) - disrupt(user) + if(S) + if(!S.cell || !S.cell.use(activationUpkeep)) + disrupt(S) else return PROCESS_KILL /obj/item/borg_chameleon/proc/activate(mob/living/silicon/robot/syndicate/saboteur/user) processing_objects.Add(src) - src.user = user + S = user user.base_icon = disguise user.icon_state = disguise user.cham_proj = src @@ -233,11 +237,11 @@ /obj/item/borg_chameleon/proc/deactivate(mob/living/silicon/robot/syndicate/saboteur/user) processing_objects.Remove(src) + S = user user.base_icon = initial(user.base_icon) user.icon_state = initial(user.icon_state) active = FALSE user.update_icons() - src.user = user /obj/item/borg_chameleon/proc/disrupt(mob/living/silicon/robot/syndicate/saboteur/user) if(active) From 451bf81dedf3cbee844a0dcee858288310c7e453 Mon Sep 17 00:00:00 2001 From: datlo Date: Sat, 12 Jan 2019 07:51:32 +0000 Subject: [PATCH 8/8] spacing --- code/game/objects/items/devices/chameleonproj.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm index 0b3ea4076a8..27132b75346 100644 --- a/code/game/objects/items/devices/chameleonproj.dm +++ b/code/game/objects/items/devices/chameleonproj.dm @@ -207,7 +207,7 @@ f = user.filters[start+i] animate(f, offset = f:offset, time = 0, loop = 3, flags = ANIMATION_PARALLEL) animate(offset = f:offset - 1, time = rand() * 20 + 10) - if (do_after(user, 50, target = user) && user.cell.use(activationCost)) + if(do_after(user, 50, target = user) && user.cell.use(activationCost)) playsound(src, 'sound/effects/bamf.ogg', 100, 1, -6) to_chat(user, "You are now disguised as a Nanotrasen engineering cyborg.") activate(user) @@ -246,4 +246,4 @@ /obj/item/borg_chameleon/proc/disrupt(mob/living/silicon/robot/syndicate/saboteur/user) if(active) to_chat(user, "Your chameleon field deactivates.") - deactivate(user) \ No newline at end of file + deactivate(user)