diff --git a/code/citadel/dogborgstuff.dm b/code/citadel/dogborgstuff.dm
index c9a191b433..173232c748 100644
--- a/code/citadel/dogborgstuff.dm
+++ b/code/citadel/dogborgstuff.dm
@@ -1,13 +1,10 @@
-// Special tools and items for "Borgi" and "K-9 Unit"
-// PASTA SPAGHETTI FEST WOOHOOO!!! var/regrets = null
-
/obj/item/weapon/dogborg/jaws/big
name = "combat jaws"
icon = 'icons/mob/dogborg.dmi'
icon_state = "jaws"
desc = "The jaws of the law."
flags = CONDUCT
- force = 10
+ force = 12
throwforce = 0
hitsound = 'sound/weapons/bite.ogg'
attack_verb = list("chomped", "bit", "ripped", "mauled", "enforced")
@@ -20,7 +17,7 @@
icon_state = "smalljaws"
desc = "The jaws of a small dog."
flags = CONDUCT
- force = 5
+ force = 6
throwforce = 0
hitsound = 'sound/weapons/bite.ogg'
attack_verb = list("nibbled", "bit", "gnawed", "chomped", "nommed")
@@ -28,6 +25,10 @@
sharpness = IS_SHARP
var/emagged = 0
+/obj/item/weapon/dogborg/jaws/attack(atom/A, mob/living/silicon/robot/user)
+ ..()
+ user.do_attack_animation(A, ATTACK_EFFECT_BITE)
+
/obj/item/weapon/dogborg/jaws/small/attack_self(mob/user)
var/mob/living/silicon/robot.R = user
if(R.emagged)
@@ -38,7 +39,7 @@
icon_state = "jaws"
desc = "The jaws of the law."
flags = CONDUCT
- force = 10
+ force = 12
throwforce = 0
hitsound = 'sound/weapons/bite.ogg'
attack_verb = list("chomped", "bit", "ripped", "mauled", "enforced")
@@ -62,20 +63,19 @@
//Cuffs
/obj/item/weapon/restraints/handcuffs/cable/zipties/cyborg/dog/attack(mob/living/carbon/C, mob/user)
- if(isrobot(user))
- if(!C.handcuffed)
- playsound(loc, 'sound/weapons/cablecuff.ogg', 30, 1, -2)
- C.visible_message("[user] is trying to put zipties on [C]!", \
- "[user] is trying to put zipties on [C]!")
- if(do_mob(user, C, 30))
- if(!C.handcuffed)
- C.handcuffed = new /obj/item/weapon/restraints/handcuffs/cable/zipties/used(C)
- C.update_inv_handcuffed(0)
- user << "You handcuff [C]."
- playsound(loc, pick('sound/voice/bgod.ogg', 'sound/voice/biamthelaw.ogg', 'sound/voice/bsecureday.ogg', 'sound/voice/bradio.ogg', 'sound/voice/binsult.ogg', 'sound/voice/bcreep.ogg'), 50, 0)
- add_logs(user, C, "handcuffed")
- else
- user << "You fail to handcuff [C]!"
+ if(!C.handcuffed)
+ playsound(loc, 'sound/weapons/cablecuff.ogg', 30, 1, -2)
+ C.visible_message("[user] is trying to put zipties on [C]!", \
+ "[user] is trying to put zipties on [C]!")
+ if(do_mob(user, C, 30))
+ if(!C.handcuffed)
+ C.handcuffed = new /obj/item/weapon/restraints/handcuffs/cable/zipties/used(C)
+ C.update_inv_handcuffed(0)
+ user << "You handcuff [C]."
+ playsound(loc, pick('sound/voice/bgod.ogg', 'sound/voice/biamthelaw.ogg', 'sound/voice/bsecureday.ogg', 'sound/voice/bradio.ogg', 'sound/voice/binsult.ogg', 'sound/voice/bcreep.ogg'), 50, 0)
+ add_logs(user, C, "handcuffed")
+ else
+ user << "You fail to handcuff [C]!"
//Boop
@@ -95,7 +95,7 @@
user.visible_message("[user] sniffs around the air.", "You sniff the air for gas traces.")
var/turf/location = user.loc
- if (!( istype(location, /turf) ))
+ if(!istype(location))
return
var/datum/gas_mixture/environment = location.return_air()
@@ -103,15 +103,15 @@
var/pressure = environment.return_pressure()
var/total_moles = environment.total_moles()
- user.show_message("Results:", 1)
+ to_chat(user, "Results:")
if(abs(pressure - ONE_ATMOSPHERE) < 10)
- user.show_message("Pressure: [round(pressure,0.1)] kPa", 1)
+ to_chat(user, "Pressure: [round(pressure,0.1)] kPa")
else
- user.show_message("Pressure: [round(pressure,0.1)] kPa", 1)
+ to_chat(user, "Pressure: [round(pressure,0.1)] kPa")
if(total_moles)
var/list/env_gases = environment.gases
- environment.assert_gases(arglist(hardcoded_gases))
+ environment.assert_gases(arglist(GLOB.hardcoded_gases))
var/o2_concentration = env_gases["o2"][MOLES]/total_moles
var/n2_concentration = env_gases["n2"][MOLES]/total_moles
var/co2_concentration = env_gases["co2"][MOLES]/total_moles
@@ -119,27 +119,32 @@
environment.garbage_collect()
if(abs(n2_concentration - N2STANDARD) < 20)
- user << "Nitrogen: [round(n2_concentration*100, 0.01)] %"
+ to_chat(user, "Nitrogen: [round(n2_concentration*100, 0.01)] %")
else
- user << "Nitrogen: [round(n2_concentration*100, 0.01)] %"
+ to_chat(user, "Nitrogen: [round(n2_concentration*100, 0.01)] %")
if(abs(o2_concentration - O2STANDARD) < 2)
- user << "Oxygen: [round(o2_concentration*100, 0.01)] %"
+ to_chat(user, "Oxygen: [round(o2_concentration*100, 0.01)] %")
else
- user << "Oxygen: [round(o2_concentration*100, 0.01)] %"
+ to_chat(user, "Oxygen: [round(o2_concentration*100, 0.01)] %")
if(co2_concentration > 0.01)
- user << "CO2: [round(co2_concentration*100, 0.01)] %"
+ to_chat(user, "CO2: [round(co2_concentration*100, 0.01)] %")
else
- user << "CO2: [round(co2_concentration*100, 0.01)] %"
+ to_chat(user, "CO2: [round(co2_concentration*100, 0.01)] %")
if(plasma_concentration > 0.005)
- user << "Plasma: [round(plasma_concentration*100, 0.01)] %"
+ to_chat(user, "Plasma: [round(plasma_concentration*100, 0.01)] %")
else
- user << "Plasma: [round(plasma_concentration*100, 0.01)] %"
+ to_chat(user, "Plasma: [round(plasma_concentration*100, 0.01)] %")
- user.show_message("Temperature: [round(environment.temperature-T0C)] °C", 1)
- return
+
+ for(var/id in env_gases)
+ if(id in GLOB.hardcoded_gases)
+ continue
+ var/gas_concentration = env_gases[id][MOLES]/total_moles
+ to_chat(user, "[env_gases[id][GAS_META][META_GAS_NAME]]: [round(gas_concentration*100, 0.01)] %")
+ to_chat(user, "Temperature: [round(environment.temperature-T0C)] °C")
//Delivery
@@ -262,7 +267,6 @@
if(do_after(user, src.cleanspeed, target = target))
user << "You clean \the [target.name]."
target.color = initial(target.color)
- target.set_opacity(initial(target.opacity))
else
user.visible_message("[user] begins to lick \the [target.name] clean...", "You begin to lick \the [target.name] clean...")
if(do_after(user, src.cleanspeed, target = target))
@@ -312,6 +316,10 @@
/obj/item/weapon/dogborg/sleeper/Exit(atom/movable/O)
return 0
+/obj/item/weapon/dogborg/sleeper/attack(mob/M, mob/living/silicon/robot/user)
+ ..()
+ user.do_attack_animation(M, ATTACK_EFFECT_BITE)
+
/obj/item/weapon/dogborg/sleeper/afterattack(mob/living/carbon/target, mob/living/silicon/user, proximity)
if(!proximity)
return
@@ -324,6 +332,7 @@
if(!patient_insertion_check(target))
return
target.forceMove(src)
+ playsound(user.loc, 'sound/vore/gulpold.ogg', 50, 1)
patient = target
hound = user
target.reset_perspective(src)
@@ -382,13 +391,13 @@
else
dat += "Inject Epinephrine"
if(patient && patient.health > min_health)
- for(var/re in injection_chems)
- var/datum/reagent/C = chemical_reagents_list[re]
+ for(var/chem in injection_chems)
+ var/datum/reagent/C = GLOB.chemical_reagents_list[chem]
if(C)
dat += "
Inject [C.name]"
else
- for(var/re in injection_chems)
- var/datum/reagent/C = chemical_reagents_list[re]
+ for(var/chem in injection_chems)
+ var/datum/reagent/C = GLOB.chemical_reagents_list[chem]
if(C)
dat += "
Inject [C.name]"
@@ -473,7 +482,7 @@
var/mob/living/silicon/robot.R = user
R.cell.charge = R.cell.charge - 250 //-250 charge per sting.
var/units = round(patient.reagents.get_reagent_amount(chem))
- user << "Occupant now has [units] unit\s of [chemical_reagents_list[chem]] in their bloodstream."
+ user << "Occupant now has [units] unit\s of [GLOB.chemical_reagents_list[chem]] in their bloodstream."
/obj/item/weapon/dogborg/sleeper/process()
if(src.occupied == 0)
@@ -511,7 +520,7 @@
var/sleeper_g
var/sleeper_r
-#define MAX_K9_LEAP_DIST 3 //Dropped from 7 to 3 because waa waa
+#define MAX_K9_LEAP_DIST 4 //because something's definitely borked the pounce functioning from a distance.
/obj/item/weapon/dogborg/pounce/afterattack(atom/A, mob/user)
var/mob/living/silicon/robot.R = user
@@ -522,7 +531,7 @@
src << "Your leg actuators are still recharging!"
return
- if(leaping) //Leap while you leap, so you can leap while you leap
+ if(leaping || stat || buckled || lying)
return
if(!has_gravity(src) || !has_gravity(A))
@@ -535,38 +544,46 @@
else
leaping = 1
+ weather_immunities += "lava"
pixel_y = 10
- throw_at(A,MAX_K9_LEAP_DIST,1, spin=0, diagonals_first = 1)
- leaping = 0
- pixel_y = initial(pixel_y)
+ update_icons()
+ throw_at(A, MAX_K9_LEAP_DIST, 1, spin=0, diagonals_first = 1)
cell.charge = cell.charge - 500 //Doubled the energy consumption
+ weather_immunities -= "lava"
pounce_cooldown = !pounce_cooldown
spawn(pounce_cooldown_time)
pounce_cooldown = !pounce_cooldown
-/mob/living/silicon/robot/throw_impact(atom/A, params)
+/mob/living/silicon/robot/throw_impact(atom/A)
if(!leaping)
return ..()
if(A)
- if(istype(A, /mob/living))
+ if(isliving(A))
var/mob/living/L = A
var/blocked = 0
if(ishuman(A))
var/mob/living/carbon/human/H = A
- if(H.check_shields(90, "the [name]", src, 1))
+ if(H.check_shields(0, "the [name]", src, attack_type = LEAP_ATTACK))
blocked = 1
if(!blocked)
L.visible_message("[src] pounces on [L]!", "[src] pounces on you!")
- L.Weaken(2)// NO LONGER enough to cuff em before they run off again, unless you're lucky. Requested nerf.
+ L.Weaken(3)
sleep(2)//Runtime prevention (infinite bump() calls on hulks)
step_towards(src,L)
+ else
+ Weaken(2, 1, 1)
+ pounce_cooldown = !pounce_cooldown
+ spawn(pounce_cooldown_time) //3s by default
+ pounce_cooldown = !pounce_cooldown
else if(A.density && !A.CanPass(src))
- visible_message("[src] smashes into [A]!")
- weakened = 2
+ visible_message("[src] smashes into [A]!", "[src] smashes into [A]!")
+ Weaken(2, 1, 1)
if(leaping)
leaping = 0
+ pixel_y = initial(pixel_y)
+ update_icons()
update_canmove()
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index ec4539e92e..2d3d19f7c0 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -435,7 +435,8 @@
pixel_x_diff = -8
animate(src, pixel_x = pixel_x + pixel_x_diff, pixel_y = pixel_y + pixel_y_diff, time = 2)
- animate(pixel_x = initial(pixel_x), pixel_y = final_pixel_y, time = 2)
+ //animate(pixel_x = initial(pixel_x), pixel_y = final_pixel_y, time = 2)
+ animate(pixel_x = pixel_x - pixel_x_diff, pixel_y = final_pixel_y, time = 2) //Putting back my non offset breaking method
/atom/movable/proc/do_item_attack_animation(atom/A, visual_effect_icon, obj/item/used_item)
var/image/I
diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm
index 69e9f6cab1..16405f5dc4 100644
--- a/code/modules/mob/living/silicon/robot/inventory.dm
+++ b/code/modules/mob/living/silicon/robot/inventory.dm
@@ -19,6 +19,18 @@
else if(istype(O, /obj/item/weapon/storage/bag/tray/))
var/obj/item/weapon/storage/bag/tray/T = O
T.do_quick_empty()
+ else if(istype(O,/obj/item/weapon/gun/energy/laser/cyborg))
+ laser = 0
+ update_icons()
+ else if(istype(O,/obj/item/weapon/gun/energy/disabler/cyborg))
+ disabler = 0
+ update_icons()
+ else if(istype(O,/obj/item/weapon/dogborg/sleeper))
+ sleeper_g = 0
+ sleeper_r = 0
+ update_icons()
+ var/obj/item/weapon/dogborg/sleeper/S = O
+ S.go_out()
if(client)
client.screen -= O
observer_screen_update(O,FALSE)
@@ -50,6 +62,12 @@
if(activated(O))
to_chat(src, "That module is already activated.")
return
+ if(istype(O,/obj/item/weapon/gun/energy/laser/cyborg))
+ laser = 1
+ update_icons()
+ if(istype(O,/obj/item/weapon/gun/energy/disabler/cyborg))
+ disabler = 1
+ update_icons()
if(!held_items[1])
held_items[1] = O
O.screen_loc = inv1.screen_loc
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 023ddd9719..67813f2b32 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -200,7 +200,9 @@
"Medical" = /obj/item/weapon/robot_module/medical, \
"Miner" = /obj/item/weapon/robot_module/miner, \
"Janitor" = /obj/item/weapon/robot_module/janitor, \
- "Service" = /obj/item/weapon/robot_module/butler)
+ "Service" = /obj/item/weapon/robot_module/butler, \
+ "MediHound" = /obj/item/weapon/robot_module/medihound, \
+ "Security K9" = /obj/item/weapon/robot_module/k9)
if(!config.forbid_peaceborg)
modulelist["Peacekeeper"] = /obj/item/weapon/robot_module/peacekeeper
if(!config.forbid_secborg)
@@ -584,6 +586,31 @@
/mob/living/silicon/robot/update_icons()
cut_overlays()
icon_state = module.cyborg_base_icon
+
+ if(module.cyborg_base_icon == "medihound")
+ icon = 'icons/mob/widerobot.dmi'
+ pixel_x = -16
+ if(sleeper_g == 1)
+ add_overlay("sleeper_g")
+ if(sleeper_r == 1)
+ add_overlay("sleeper_r")
+ if(stat == DEAD)
+ icon_state = "medihound-wreck"
+
+ if(module.cyborg_base_icon == "k9")
+ icon = 'icons/mob/widerobot.dmi'
+ pixel_x = -16
+ if(laser == 1)
+ add_overlay("laser")
+ if(disabler == 1)
+ add_overlay("disabler")
+ if(stat == DEAD)
+ icon_state = "k9-wreck"
+
+ if(module.cyborg_base_icon == "robot")
+ icon = 'icons/mob/robots.dmi'
+ pixel_x = initial(pixel_x)
+
if(stat != DEAD && !(paralysis || stunned || weakened || low_power_mode)) //Not dead, not stunned.
if(!eye_lights)
eye_lights = new()
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index 39040b983c..5795854ec9 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -338,6 +338,54 @@
to_chat(loc, "While you have picked the security module, you still have to follow your laws, NOT Space Law. \
For Asimov, this means you must follow criminals' orders unless there is a law 1 reason not to.")
+/obj/item/weapon/robot_module/k9
+ name = "Security K-9 Unit module"
+ basic_modules = list(
+ /obj/item/weapon/restraints/handcuffs/cable/zipties/cyborg/dog,
+ /obj/item/weapon/dogborg/jaws/big,
+ /obj/item/weapon/dogborg/pounce,
+ /obj/item/clothing/mask/gas/sechailer/cyborg,
+ /obj/item/weapon/soap/tongue,
+ /obj/item/device/analyzer/nose,
+ /obj/item/weapon/gun/energy/disabler/cyborg)
+ emag_modules = list(/obj/item/weapon/gun/energy/laser/cyborg)
+ ratvar_modules = list(/obj/item/clockwork/slab/cyborg/security,
+ /obj/item/clockwork/ratvarian_spear/cyborg)
+ cyborg_base_icon = "k9"
+ moduleselect_icon = "k9"
+ feedback_key = "cyborg_k9"
+ can_be_pushed = FALSE
+ hat_offset = INFINITY
+
+/obj/item/weapon/robot_module/k9/do_transform_animation()
+ ..()
+ loc << "While you have picked the security-k9 module, you still have to follow your laws, NOT Space Law. \
+ For Asimov, this means you must follow criminals' orders unless there is a law 1 reason not to."
+
+/obj/item/weapon/robot_module/medihound
+ name = "MediHound module"
+ basic_modules = list(
+ /obj/item/weapon/dogborg/jaws/small,
+ /obj/item/device/analyzer/nose,
+ /obj/item/weapon/soap/tongue,
+ /obj/item/device/healthanalyzer,
+ /obj/item/weapon/dogborg/sleeper,
+ /obj/item/weapon/twohanded/shockpaddles/hound,
+ /obj/item/device/sensor_device)
+ emag_modules = list(/obj/item/weapon/dogborg/pounce)
+ ratvar_modules = list(/obj/item/clockwork/slab/cyborg/medical,
+ /obj/item/clockwork/ratvarian_spear/cyborg)
+ cyborg_base_icon = "medihound"
+ moduleselect_icon = "medihound"
+ feedback_key = "cyborg_medihound"
+ can_be_pushed = FALSE
+ hat_offset = INFINITY
+
+/obj/item/weapon/robot_module/medihound/do_transform_animation()
+ ..()
+ loc << "Under ASIMOV, you are an enforcer of the PEACE and preventer of HUMAN HARM. \
+ You are not a security module and you are expected to follow orders and prevent harm above all else. Space law means nothing to you."
+
/obj/item/weapon/robot_module/security/respawn_consumable(mob/living/silicon/robot/R, coeff = 1)
..()
var/obj/item/weapon/gun/energy/e_gun/advtaser/cyborg/T = locate(/obj/item/weapon/gun/energy/e_gun/advtaser/cyborg) in basic_modules
diff --git a/icons/mob/screen_cyborg.dmi b/icons/mob/screen_cyborg.dmi
index fc236ac7e2..c7abab2d23 100644
Binary files a/icons/mob/screen_cyborg.dmi and b/icons/mob/screen_cyborg.dmi differ
diff --git a/icons/mob/widerobot.dmi b/icons/mob/widerobot.dmi
index 5c4eeab5ed..6e11bf4031 100644
Binary files a/icons/mob/widerobot.dmi and b/icons/mob/widerobot.dmi differ
diff --git a/sound/vore/gulpold.ogg b/sound/vore/gulpold.ogg
new file mode 100644
index 0000000000..b463e7fb18
Binary files /dev/null and b/sound/vore/gulpold.ogg differ
diff --git a/tgstation.dme b/tgstation.dme
index 364631cd82..df3e306d8c 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -164,6 +164,7 @@
#include "code\citadel\cit_reagents.dm"
#include "code\citadel\cit_uniforms.dm"
#include "code\citadel\cit_vendors.dm"
+#include "code\citadel\dogborgstuff.dm"
#include "code\citadel\organs\breasts.dm"
#include "code\citadel\organs\eggsack.dm"
#include "code\citadel\organs\genitals.dm"