diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm
index 0e83d0fa1ce..034fdb53ebc 100644
--- a/code/game/objects/items/devices/chameleonproj.dm
+++ b/code/game/objects/items/devices/chameleonproj.dm
@@ -5,82 +5,85 @@
slot_flags = SLOT_BELT
item_state = "electronic"
throwforce = 5.0
- throw_speed = 1
+ throw_speed = 3
throw_range = 5
w_class = 2.0
origin_tech = "syndicate=4;magnets=4"
var/can_use = 1
var/obj/effect/dummy/chameleon/active_dummy = null
- var/saved_item = "/obj/item/weapon/cigbutt"
+ var/saved_item = /obj/item/weapon/cigbutt
+ var/saved_icon = 'icons/obj/clothing/masks.dmi'
+ var/saved_icon_state = "cigbutt"
+ var/saved_overlays = null
+ var/saved_underlays = null
- dropped()
- disrupt()
+/obj/item/device/chameleon/dropped()
+ disrupt()
- attack_self()
- toggle()
+/obj/item/device/chameleon/equipped()
+ disrupt()
- afterattack(atom/target, mob/user, proximity)
- if(!proximity) return
- if(istype(target,/obj/item/toy/cards/singlecard))
- user << "\red Unable to scan [target]."
- return
- if(istype(target,/obj/item))
- playsound(src, 'sound/weapons/flash.ogg', 100, 1, 1)
- user << "\blue Scanned [target]."
+/obj/item/device/chameleon/attack_self()
+ toggle()
+
+/obj/item/device/chameleon/afterattack(atom/target, mob/user , proximity)
+ if(!proximity) return
+ if(!active_dummy)
+ if(istype(target,/obj/item) && !istype(target, /obj/item/weapon/disk/nuclear))
+ playsound(get_turf(src), 'sound/weapons/flash.ogg', 100, 1, -6)
+ user << "Scanned [target]."
saved_item = target.type
+ saved_icon = target.icon
+ saved_icon_state = target.icon_state
+ saved_overlays = target.overlays
+ saved_underlays = target.underlays
- proc/toggle()
- if(!can_use || !saved_item) return
- if(active_dummy)
- playsound(src, 'sound/effects/pop.ogg', 100, 1, 1)
- for(var/atom/movable/A in active_dummy)
- A.loc = active_dummy.loc
- if(ismob(A))
- if(A:client)
- A:client:eye = A
- del(active_dummy)
- active_dummy = null
- usr << "\blue You deactivate the [src]."
- var/obj/effect/overlay/T = new/obj/effect/overlay(get_turf(src))
- T.icon = 'icons/effects/effects.dmi'
- flick("emppulse",T)
- spawn(8) T.delete()
- else
- playsound(src, 'sound/effects/pop.ogg', 100, 1, 1)
- var/obj/O = new saved_item(src)
- if(!O) return
- var/obj/effect/dummy/chameleon/C = new/obj/effect/dummy/chameleon(usr.loc)
- C.name = O.name
- C.desc = O.desc
- C.icon = O.icon
- C.icon_state = O.icon_state
- C.dir = O.dir
- usr.loc = C
- C.master = src
- src.active_dummy = C
- del(O)
- usr << "\blue You activate the [src]."
- var/obj/effect/overlay/T = new/obj/effect/overlay(get_turf(src))
- T.icon = 'icons/effects/effects.dmi'
- flick("emppulse",T)
- spawn(8) T.delete()
+/obj/item/device/chameleon/proc/toggle()
+ if(!can_use || !saved_item) return
+ if(active_dummy)
+ eject_all()
+ playsound(get_turf(src), 'sound/effects/pop.ogg', 100, 1, -6)
+ qdel(active_dummy)
+ active_dummy = null
+ usr << "You deactivate \the [src]."
+ var/obj/effect/overlay/T = new/obj/effect/overlay(get_turf(src))
+ T.icon = 'icons/effects/effects.dmi'
+ flick("emppulse",T)
+ spawn(8)
+ qdel(T)
+ else
+ playsound(get_turf(src), 'sound/effects/pop.ogg', 100, 1, -6)
+ var/obj/O = new saved_item(src)
+ if(!O) return
+ 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)
+ usr << "You activate \the [src]."
+ var/obj/effect/overlay/T = new/obj/effect/overlay(get_turf(src))
+ T.icon = 'icons/effects/effects.dmi'
+ flick("emppulse",T)
+ spawn(8)
+ qdel(T)
- proc/disrupt()
- if(active_dummy)
- var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread
- spark_system.set_up(5, 0, src)
- spark_system.attach(src)
- spark_system.start()
- for(var/atom/movable/A in active_dummy)
- A.loc = active_dummy.loc
- if(ismob(A))
- if(A:client)
- A:client:eye = A
- del(active_dummy)
- active_dummy = null
- can_use = 0
- spawn(100) can_use = 1
+/obj/item/device/chameleon/proc/disrupt(var/delete_dummy = 1)
+ if(active_dummy)
+ var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread
+ spark_system.set_up(5, 0, src)
+ spark_system.attach(src)
+ spark_system.start()
+ eject_all()
+ if(delete_dummy)
+ qdel(active_dummy)
+ active_dummy = null
+ can_use = 0
+ spawn(50) can_use = 1
+/obj/item/device/chameleon/proc/eject_all()
+ for(var/atom/movable/A in active_dummy)
+ A.loc = active_dummy.loc
+ if(ismob(A))
+ var/mob/M = A
+ M.reset_view(null)
/obj/effect/dummy/chameleon
name = ""
@@ -89,38 +92,60 @@
anchored = 1
var/can_move = 1
var/obj/item/device/chameleon/master = null
- attackby()
- for(var/mob/M in src)
- M << "\red Your chameleon-projector deactivates."
- master.disrupt()
- attack_hand()
- for(var/mob/M in src)
- M << "\red Your chameleon-projector deactivates."
- master.disrupt()
- ex_act()
- for(var/mob/M in src)
- M << "\red Your chameleon-projector deactivates."
- master.disrupt()
- bullet_act()
- for(var/mob/M in src)
- M << "\red Your chameleon-projector deactivates."
- ..()
- master.disrupt()
- relaymove(var/mob/user, direction)
- if(istype(loc, /turf/space)) return //No magical space movement!
- if(can_move)
- can_move = 0
- switch(usr.bodytemperature)
- if(300 to INFINITY)
- spawn(10) can_move = 1
- if(295 to 300)
- spawn(13) can_move = 1
- if(280 to 295)
- spawn(16) can_move = 1
- if(260 to 280)
- spawn(20) can_move = 1
- else
- spawn(25) can_move = 1
- step(src,direction)
- return
+/obj/effect/dummy/chameleon/proc/activate(var/obj/O, var/mob/M, new_icon, new_iconstate, new_overlays, new_underlays, var/obj/item/device/chameleon/C)
+ name = O.name
+ desc = O.desc
+ icon = new_icon
+ icon_state = new_iconstate
+ overlays = new_overlays
+ underlays = new_underlays
+ dir = O.dir
+ M.loc = src
+ master = C
+ master.active_dummy = src
+
+/obj/effect/dummy/chameleon/attackby()
+ for(var/mob/M in src)
+ M << "Your chameleon-projector deactivates."
+ master.disrupt()
+
+/obj/effect/dummy/chameleon/attack_hand()
+ for(var/mob/M in src)
+ M << "Your chameleon-projector deactivates."
+ master.disrupt()
+
+/obj/effect/dummy/chameleon/ex_act() //ok now THATS some serious protection against explosions right here
+ for(var/mob/M in src)
+ M << "Your chameleon-projector deactivates."
+ master.disrupt()
+
+/obj/effect/dummy/chameleon/bullet_act()
+ for(var/mob/M in src)
+ M << "Your chameleon-projector deactivates."
+ ..()
+ master.disrupt()
+
+/obj/effect/dummy/chameleon/relaymove(var/mob/user, direction)
+ if(istype(loc, /turf/space) || !direction)
+ return //No magical space movement!
+
+ if(can_move)
+ can_move = 0
+ switch(user.bodytemperature)
+ if(300 to INFINITY)
+ spawn(10) can_move = 1
+ if(295 to 300)
+ spawn(13) can_move = 1
+ if(280 to 295)
+ spawn(16) can_move = 1
+ if(260 to 280)
+ spawn(20) can_move = 1
+ else
+ spawn(25) can_move = 1
+ step(src, direction)
+ return
+
+/obj/effect/dummy/chameleon/Destroy()
+ master.disrupt(0)
+ return ..()
\ No newline at end of file