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"