diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm
index fed4d54105..104e9b0fcc 100644
--- a/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm
+++ b/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm
@@ -132,59 +132,15 @@
cant_hold = list(/obj/item/weapon/disk/nuclear)
*/
-/obj/item/device/dogborg/dog_zapper //TODO
+/obj/item/weapon/shockpaddles/robot/hound
name = "paws of life"
icon = 'icons/mob/dogborg_vr.dmi'
icon_state = "defibpaddles0"
desc = "Zappy paws. For fixing cardiac arrest."
- flags = CONDUCT
- force = 0
- throwforce = 0
- hitsound = 'sound/weapons/bite.ogg'
+ combat = 1
attack_verb = list("batted", "pawed", "bopped", "whapped")
- w_class = ITEMSIZE_TINY
- var/charge = 0
- var/charge_required = 1000
- var/charge_per = 100
- var/state = 0 //0 = Off, 1 = Charging, 2 = Ready
+ chargecost = 500
- //[round(((world.realtime - src.disconnect_time) / 10) / 60)]
-
-/obj/item/device/dogborg/dog_zapper/attack_self(mob/user)
- switch(state)
- if(0) // Was off when clicked
- if(charge < charge_required) //Turned on and now charging
- state = 1
- //TODO Change Icon
- //TODO Start charging
- user << "[name] now charging."
- else //Turned on and was already charged
- state = 2
- user << "[name] now READY."
- if(1) // Was charging when clicked
- state = 0
- //TODO Change Icon
- user << "[name] now turned off."
- if(2) // Was ready when clicked
- state = 0
- //TODO Change Icon
- user << "[name] now turned off (fully charged)."
-/*
-/obj/item/device/dogborg/dog_zapper/proc/charge()
- var/mob/living/silicon/robot.R = usr
-
- do
- R.cell.charge -= charge_per
- charge += charge_per
- sleep(1)
- while(state = 1 && charge < charge_required && (R.cell.charge > (charge_required - charge)))
-
- if(charge = charge_required)
- usr << "[name] now READY."
-
-
-/obj/item/device/dogborg/dog_zapper/afterattack(mob/living/carbon/target, mob/living/silicon/user, proximity)
-*/
//Tongue stuff
/obj/item/device/dogborg/tongue
name = "synthetic tongue"
@@ -227,7 +183,7 @@
user << "You finish licking off \the [target.name]."
qdel(target)
var/mob/living/silicon/robot.R = user
- R.cell.charge = R.cell.charge + 50
+ R.cell.charge += 50
else if(istype(target,/obj/item))
if(istype(target,/obj/item/trash))
user.visible_message("[user] nibbles away at \the [target.name].", "You begin to nibble away at \the [target.name]...")
@@ -236,7 +192,7 @@
user << "You finish off \the [target.name]."
qdel(target)
var/mob/living/silicon/robot.R = user
- R.cell.charge = R.cell.charge + 250
+ R.cell.charge += 250
return
if(istype(target,/obj/item/weapon/cell))
user.visible_message("[user] begins cramming \the [target.name] down its throat.", "You begin cramming \the [target.name] down your throat...")
@@ -245,7 +201,7 @@
user << "You finish off \the [target.name], and gain some charge!"
var/mob/living/silicon/robot.R = user
var/obj/item/weapon/cell.C = target
- R.cell.charge = R.cell.charge + (C.maxcharge / 3)
+ R.cell.charge += C.maxcharge / 3
qdel(target)
return
user.visible_message("[user] begins to lick \the [target.name] clean...", "You begin to lick \the [target.name] clean...")
@@ -266,7 +222,7 @@
L.visible_message("[user] has shocked [L] with its tongue!", \
"[user] has shocked you with its tongue! You can feel the betrayal.")
playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1)
- R.cell.charge = R.cell.charge - 666
+ R.cell.charge -= 666
else
user.visible_message("\the [user] affectionally licks all over \the [target]'s face!", "You affectionally lick all over \the [target]'s face!")
playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1)
@@ -332,11 +288,80 @@
usr << "It has [uses] lights remaining. Attempting to fabricate a replacement. Please stand still."
cooldown = 1
if(do_after(user, 50))
- R.cell.charge = R.cell.charge - 800
+ R.cell.charge -= 800
AddUses(1)
cooldown = 0
else
cooldown = 0
else
usr << "It has [uses] lights remaining."
- return
\ No newline at end of file
+ return
+
+//Pounce stuff for K-9
+/obj/item/weapon/dogborg/pounce
+ name = "pounce"
+ icon = 'icons/mob/dogborg_vr.dmi'
+ icon_state = "pounce"
+ desc = "Leap at your target to momentarily stun them."
+ force = 0
+ throwforce = 0
+
+/obj/item/weapon/dogborg/pounce/New()
+ ..()
+ flags |= NOBLUDGEON
+
+/obj/item/weapon/dogborg/pounce/attack_self(mob/user)
+ var/mob/living/silicon/robot.R = user
+ R.leap()
+
+/mob/living/silicon/robot/proc/leap()
+ if(last_special > world.time)
+ src << "Your leap actuators are still recharging."
+ return
+
+ if(cell.charge < 1000)
+ src << "Cell charge too low to continue."
+ return
+
+ if(stat || paralysis || stunned || weakened || lying || restrained() || buckled)
+ src << "You cannot leap in your current state."
+ return
+
+ var/list/choices = list()
+ for(var/mob/living/M in view(6,src))
+ if(!istype(M,/mob/living/silicon))
+ choices += M
+ choices -= src
+
+ var/mob/living/T = input(src,"Who do you wish to leap at?") as null|anything in choices
+
+ if(!T || !src || src.stat) return
+
+ if(get_dist(get_turf(T), get_turf(src)) > 4) return
+
+ if(last_special > world.time)
+ return
+
+ if(stat || paralysis || stunned || weakened || lying || restrained() || buckled)
+ src << "You cannot leap in your current state."
+ return
+
+ last_special = world.time + 75
+ status_flags |= LEAPING
+ pixel_y = 10
+
+ src.visible_message("\The [src] leaps at [T]!")
+ src.throw_at(get_step(get_turf(T),get_turf(src)), 4, 1, src)
+ playsound(src.loc, 'sound/mecha/mechstep2.ogg', 50, 1)
+ pixel_y = 0
+ cell.charge -= 500
+
+ sleep(5)
+
+ if(status_flags & LEAPING) status_flags &= ~LEAPING
+
+ if(!src.Adjacent(T))
+ src << "You miss!"
+ return
+
+ T.Weaken(4)
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm
index 537a7b48e0..3ad88f92c7 100644
--- a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm
+++ b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm
@@ -477,10 +477,6 @@
processing_objects.Remove(src)
return
-/mob/living/silicon/robot
- var/sleeper_g
- var/sleeper_r
-
/obj/item/device/dogborg/sleeper/K9 //The K9 portabrig
name = "Brig-Belly"
desc = "Equipment for a K9 unit. A mounted portable-brig that holds criminals."
@@ -568,203 +564,4 @@
if(UI_open == 1)
sleeperUI(usr)
return
- return
-
-/mob/living/silicon/robot/attackby(obj/item/W as obj, mob/user as mob)
- if (istype(W, /obj/item/weapon/handcuffs))
- return
- if(opened)
- for(var/V in components)
- var/datum/robot_component/C = components[V]
- if(!C.installed && istype(W, C.external_type))
- C.installed = 1
- C.wrapped = W
- C.install()
- user.drop_item()
- W.loc = null
-
- var/obj/item/robot_parts/robot_component/WC = W
- if(istype(WC))
- C.brute_damage = WC.brute
- C.electronics_damage = WC.burn
-
- usr << "You install the [W.name]."
-
- return
-
-
- if (istype(W, /obj/item/weapon/weldingtool))
- if (src == user)
- user << "You lack the reach to be able to repair yourself."
- return
-
- if (!getBruteLoss())
- user << "Nothing to fix here!"
- return
- var/obj/item/weapon/weldingtool/WT = W
- if (WT.remove_fuel(0))
- user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
- adjustBruteLoss(-30)
- updatehealth()
- add_fingerprint(user)
- for(var/mob/O in viewers(user, null))
- O.show_message(text("[user] has fixed some of the dents on [src]!,"), 1)
- else
- user << "Need more welding fuel!"
- return
-
- else if(istype(W, /obj/item/stack/cable_coil) && (wiresexposed || istype(src,/mob/living/silicon/robot/drone)))
- if (!getFireLoss())
- user << "Nothing to fix here!"
- return
- var/obj/item/stack/cable_coil/coil = W
- if (coil.use(1))
- user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
- adjustFireLoss(-30)
- updatehealth()
- for(var/mob/O in viewers(user, null))
- O.show_message("\[user] has fixed some of the burnt wires on [src]", 1)
-
- else if (istype(W, /obj/item/weapon/crowbar)) // crowbar means open or close the cover
- if(opened)
- if(cell)
- user << "You close the cover."
- opened = 0
- updateicon()
- else if(wiresexposed && wires.IsAllCut())
- //Cell is out, wires are exposed, remove MMI, produce damaged chassis, baleet original mob.
- if(!mmi)
- user << "\The [src] has no brain to remove."
- return
-
- user << "You jam the crowbar into the robot and begin levering [mmi]."
- sleep(30)
- user << "You damage some parts of the chassis, but eventually manage to rip out [mmi]!"
- var/obj/item/robot_parts/robot_suit/C = new/obj/item/robot_parts/robot_suit(loc)
- C.l_leg = new/obj/item/robot_parts/l_leg(C)
- C.r_leg = new/obj/item/robot_parts/r_leg(C)
- C.l_arm = new/obj/item/robot_parts/l_arm(C)
- C.r_arm = new/obj/item/robot_parts/r_arm(C)
- C.updateicon()
- new/obj/item/robot_parts/chest(loc)
- qdel(src)
- else
- // Okay we're not removing the cell or an MMI, but maybe something else?
- var/list/removable_components = list()
- for(var/V in components)
- if(V == "power cell") continue
- var/datum/robot_component/C = components[V]
- if(C.installed == 1 || C.installed == -1)
- removable_components += V
-
- var/remove = input(user, "Which component do you want to pry out?", "Remove Component") as null|anything in removable_components
- if(!remove)
- return
- var/datum/robot_component/C = components[remove]
- var/obj/item/robot_parts/robot_component/I = C.wrapped
- user << "You remove \the [I]."
- if(istype(I))
- I.brute = C.brute_damage
- I.burn = C.electronics_damage
-
- I.loc = src.loc
-
- if(C.installed == 1)
- C.uninstall()
- C.installed = 0
-
- else
- if(locked)
- user << "The cover is locked and cannot be opened."
- else
- user << "You open the cover."
- opened = 1
- updateicon()
-
- else if (istype(W, /obj/item/weapon/cell) && opened) // trying to put a cell inside
- var/datum/robot_component/C = components["power cell"]
- if(wiresexposed)
- user << "Close the panel first."
- else if(cell)
- user << "There is a power cell already installed."
- else if(W.w_class != ITEMSIZE_NORMAL)
- user << "\The [W] is too [W.w_class < ITEMSIZE_NORMAL ? "small" : "large"] to fit here."
- else
- user.drop_item()
- W.loc = src
- cell = W
- user << "You insert the power cell."
-
- C.installed = 1
- C.wrapped = W
- C.install()
- //This will mean that removing and replacing a power cell will repair the mount, but I don't care at this point. ~Z
- C.brute_damage = 0
- C.electronics_damage = 0
-
- else if (istype(W, /obj/item/weapon/wirecutters) || istype(W, /obj/item/device/multitool))
- if (wiresexposed)
- wires.Interact(user)
- else
- user << "You can't reach the wiring."
-
- else if(istype(W, /obj/item/weapon/screwdriver) && opened && !cell) // haxing
- wiresexposed = !wiresexposed
- user << "The wires have been [wiresexposed ? "exposed" : "unexposed"]"
- updateicon()
-
- else if(istype(W, /obj/item/weapon/screwdriver) && opened && cell) // radio
- if(radio)
- radio.attackby(W,user)//Push it to the radio to let it handle everything
- else
- user << "Unable to locate a radio."
- updateicon()
-
- else if(istype(W, /obj/item/device/encryptionkey/) && opened)
- if(radio)//sanityyyyyy
- radio.attackby(W,user)//GTFO, you have your own procs
- else
- user << "Unable to locate a radio."
-
- else if (istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)||istype(W, /obj/item/weapon/card/robot)) // trying to unlock the interface with an ID card
- if(emagged)//still allow them to open the cover
- user << "The interface seems slightly damaged"
- if(opened)
- user << "You must close the cover to swipe an ID card."
- else
- if(allowed(usr))
- locked = !locked
- user << "You [ locked ? "lock" : "unlock"] [src]'s interface."
- updateicon()
- else
- user << "Access denied."
-
- else if(istype(W, /obj/item/borg/upgrade/))
- var/obj/item/borg/upgrade/U = W
- if(!opened)
- usr << "You must access the borgs internals!"
- else if(!src.module && U.require_module)
- usr << "The borg must choose a module before he can be upgraded!"
- else if(U.locked)
- usr << "The upgrade is locked and cannot be used yet!"
- else
- if(U.action(src))
- usr << "You apply the upgrade to [src]!"
- usr.drop_item()
- U.loc = src
- else
- usr << "Upgrade error!"
-
- else if(module_active && istype(module_active,/obj/item/device/dogborg/sleeper/compactor && user.a_intent == I_HELP)) //Feeding?
- if(src == user)
- return
- if(user.a_intent == I_HELP)
- var/obj/item/device/dogborg/sleeper/compactor/CR = module_active
- user << "You attempt to feed [W] to [src]."
- W.attackby(CR,src)
-
-
- else
- if( !(istype(W, /obj/item/device/robotanalyzer) || istype(W, /obj/item/device/healthanalyzer)) )
- spark_system.start()
- return ..()
+ return
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/robot/robot_modules_vr.dm b/code/modules/mob/living/silicon/robot/robot_modules_vr.dm
index f5f957b56d..5cddbb34a0 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules_vr.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules_vr.dm
@@ -37,7 +37,7 @@
src.modules += new /obj/item/taperoll/police(src) //Block out crime scenes.
src.modules += new /obj/item/device/dogborg/sleeper/K9(src) //Eat criminals. Bring them to the brig.
src.modules += new /obj/item/weapon/gun/energy/taser/mounted/cyborg(src) //They /are/ a security borg, after all.
- src.modules += new /obj/item/borg/sight/hud/sec(src) //Security hud to see criminals.
+ src.modules += new /obj/item/weapon/dogborg/pounce(src) //Pounce
src.emag = new /obj/item/weapon/gun/energy/laser/mounted(src) //Emag. Not a big problem.
R.icon = 'icons/mob/widerobot_vr.dmi'
R.hands.icon = 'icons/mob/screen1_robot_vr.dmi'
@@ -82,12 +82,13 @@
src.modules += new /obj/item/device/dogborg/tongue(src) //Clean up bloody items by licking them, and eat rubbish for minor energy.
src.modules += new /obj/item/device/healthanalyzer(src) // See who's hurt specificially.
src.modules += new /obj/item/device/dogborg/sleeper(src) //So they can nom people and heal them
- src.modules += new /obj/item/borg/sight/hud/med(src) //See who's hurt generally.
src.modules += new /obj/item/weapon/extinguisher/mini(src) //So they can put burning patients out.
src.modules += new /obj/item/weapon/reagent_containers/borghypo(src)//So medi-hounds aren't nearly useless
src.modules += new /obj/item/weapon/reagent_containers/syringe(src) //In case the chemist is nice!
src.modules += new /obj/item/weapon/reagent_containers/glass/beaker(src)//For holding the chemicals when the chemist is nice
src.modules += new /obj/item/device/sleevemate(src) //Lets them scan people.
+ src.modules += new /obj/item/weapon/shockpaddles/robot/hound(src) //Paws of life
+ src.emag = new /obj/item/weapon/dogborg/pounce(src) //Pounce
R.icon = 'icons/mob/widerobot_vr.dmi'
R.hands.icon = 'icons/mob/screen1_robot_vr.dmi'
//R.icon_state = "medihound"
@@ -116,7 +117,7 @@
src.modules += new /obj/item/weapon/gun/energy/taser/mounted/cyborg/ertgun(src)
src.modules += new /obj/item/weapon/dogborg/swordtail(src)
src.emag = new /obj/item/weapon/gun/energy/laser/mounted(src)
- R.icon = 'icons/mob/62x62robot_vr.dmi'
+ R.icon = 'icons/mob/64x64robot_vr.dmi'
R.hands.icon = 'icons/mob/screen1_robot_vr.dmi'
R.pixel_x = -16
R.old_x = -16
@@ -136,6 +137,7 @@
src.modules += new /obj/item/device/dogborg/boop_module(src)
src.modules += new /obj/item/device/dogborg/tongue(src)
src.modules += new /obj/item/device/dogborg/sleeper/compactor(src)
+ src.emag = new /obj/item/weapon/dogborg/pounce(src) //Pounce
R.icon = 'icons/mob/widerobot_vr.dmi'
R.hands.icon = 'icons/mob/screen1_robot_vr.dmi'
//R.icon_state = "scrubpup"
diff --git a/code/modules/mob/living/silicon/robot/robot_vr.dm b/code/modules/mob/living/silicon/robot/robot_vr.dm
index 847719a389..16db4b4df4 100644
--- a/code/modules/mob/living/silicon/robot/robot_vr.dm
+++ b/code/modules/mob/living/silicon/robot/robot_vr.dm
@@ -1,3 +1,11 @@
+/mob/living/silicon/robot
+ var/sleeper_g
+ var/sleeper_r
+ var/leaping = 0
+ var/pounce_cooldown = 0
+ var/pounce_cooldown_time = 40
+ var/leap_at
+
/mob/living/silicon/robot/verb/robot_nom(var/mob/living/T in oview(1))
set name = "Robot Nom"
set category = "IC"
@@ -9,12 +17,16 @@
/mob/living/silicon/robot/updateicon()
..()
- if(icon == 'icons/mob/widerobot_vr.dmi' || 'icons/mob/62x62robot_vr.dmi')
+ if(icon == 'icons/mob/widerobot_vr.dmi' || 'icons/mob/64x64robot_vr.dmi')
if(stat == CONSCIOUS)
if(sleeper_g == 1)
overlays += "[module_sprites[icontype]]-sleeper_g"
if(sleeper_r == 1)
overlays += "[module_sprites[icontype]]-sleeper_r"
+ if(istype(module_active,/obj/item/weapon/gun/energy/laser/mounted))
+ overlays += "laser"
+ if(istype(module_active,/obj/item/weapon/gun/energy/taser/mounted/cyborg))
+ overlays += "taser"
if(resting)
overlays.Cut() // Hide that gut for it has no ground sprite yo.
icon_state = "[module_sprites[icontype]]-rest"
@@ -22,8 +34,7 @@
icon_state = module_sprites[icontype]
else if(stat == DEAD)
icon_state = "[module_sprites[icontype]]-wreck"
-
-
+ overlays += "wreck-overlay"
/mob/living/silicon/robot/Move(a, b, flag)
diff --git a/icons/mob/64x64robot_vr.dmi b/icons/mob/64x64robot_vr.dmi
new file mode 100644
index 0000000000..42320c04c3
Binary files /dev/null and b/icons/mob/64x64robot_vr.dmi differ
diff --git a/icons/mob/widerobot_vr.dmi b/icons/mob/widerobot_vr.dmi
index 3743c2122c..05e0f9e6c7 100644
Binary files a/icons/mob/widerobot_vr.dmi and b/icons/mob/widerobot_vr.dmi differ