diff --git a/code/citadel/dogborgs.dm b/code/citadel/dogborgs.dm new file mode 100644 index 0000000000..351f8aca3b --- /dev/null +++ b/code/citadel/dogborgs.dm @@ -0,0 +1,76 @@ +/obj/item/weapon/robot_module/loader + name = "loader robot module" +/obj/item/weapon/robot_module/loader/New() + ..() + emag = new /obj/item/borg/stun(src) + modules += new /obj/item/weapon/extinguisher(src) + modules += new /obj/item/weapon/weldingtool/largetank/cyborg(src) + modules += new /obj/item/weapon/screwdriver(src) + modules += new /obj/item/weapon/wrench(src) + modules += new /obj/item/weapon/crowbar(src) + modules += new /obj/item/weapon/wirecutters(src) + modules += new /obj/item/device/multitool(src) + modules += new /obj/item/device/t_scanner(src) + modules += new /obj/item/device/analyzer(src) + modules += new /obj/item/device/assembly/signaler + modules += new /obj/item/weapon/soap/nanotrasen(src) + + fix_modules() + +/obj/item/weapon/robot_module/k9 + name = "Security K-9 Unit module" +/obj/item/weapon/robot_module/k9/New() + ..() + modules += new /obj/item/weapon/restraints/handcuffs/cable/zipties/cyborg/dog(src) + modules += new /obj/item/weapon/dogborg/jaws/big(src) + modules += new /obj/item/weapon/dogborg/pounce(src) + modules += new /obj/item/clothing/mask/gas/sechailer/cyborg(src) + modules += new /obj/item/weapon/soap/tongue(src) + modules += new /obj/item/device/analyzer/nose(src) + modules += new /obj/item/weapon/storage/bag/borgdelivery(src) + //modules += new /obj/item/device/assembly/signaler(src) + //modules += new /obj/item/device/detective_scanner(src) + modules += new /obj/item/weapon/gun/energy/disabler/cyborg(src) + emag = new /obj/item/weapon/gun/energy/laser/cyborg(src) + fix_modules() + +/obj/item/weapon/robot_module/security/respawn_consumable(mob/living/silicon/robot/R, coeff = 1) + ..() + var/obj/item/weapon/gun/energy/gun/advtaser/cyborg/T = locate(/obj/item/weapon/gun/energy/gun/advtaser/cyborg) in get_usable_modules() + if(T) + if(T.power_supply.charge < T.power_supply.maxcharge) + var/obj/item/ammo_casing/energy/S = T.ammo_type[T.select] + T.power_supply.give(S.e_cost * coeff) + T.update_icon() + else + T.charge_tick = 0 + fix_modules() + +/obj/item/weapon/robot_module/borgi + name = "Borgi module" + +/obj/item/weapon/robot_module/borgi/New() + ..() + modules += new /obj/item/weapon/dogborg/jaws/small(src) + modules += new /obj/item/weapon/storage/bag/borgdelivery(src) + modules += new /obj/item/weapon/soap/tongue(src) + modules += new /obj/item/device/healthanalyzer(src) + modules += new /obj/item/device/analyzer/nose(src) + emag = new /obj/item/weapon/dogborg/pounce(src) + fix_modules() + +/obj/item/weapon/robot_module/medihound + name = "MediHound module" + +/obj/item/weapon/robot_module/medihound/New() + ..() + modules += new /obj/item/weapon/dogborg/jaws/small(src) + modules += new /obj/item/weapon/storage/bag/borgdelivery(src) + modules += new /obj/item/device/analyzer/nose(src) + modules += new /obj/item/weapon/soap/tongue(src) + modules += new /obj/item/device/healthanalyzer(src) + modules += new /obj/item/weapon/dogborg/sleeper(src) + modules += new /obj/item/weapon/twohanded/shockpaddles/hound(src) + modules += new /obj/item/device/sensor_device(src) + emag = new /obj/item/weapon/dogborg/pounce(src) + fix_modules() \ No newline at end of file diff --git a/code/citadel/dogborgstuff.dm b/code/citadel/dogborgstuff.dm new file mode 100644 index 0000000000..0eeae3fa97 --- /dev/null +++ b/code/citadel/dogborgstuff.dm @@ -0,0 +1,568 @@ +// 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 + throwforce = 0 + hitsound = 'sound/weapons/bite.ogg' + attack_verb = list("chomped", "bit", "ripped", "mauled", "enforced") + w_class = 3 + sharpness = IS_SHARP + +/obj/item/weapon/dogborg/jaws/small + name = "puppy jaws" + icon = 'icons/mob/dogborg.dmi' + icon_state = "smalljaws" + desc = "The jaws of a small dog." + flags = CONDUCT + force = 5 + throwforce = 0 + hitsound = 'sound/weapons/bite.ogg' + attack_verb = list("nibbled", "bit", "gnawed", "chomped", "nommed") + w_class = 3 + sharpness = IS_SHARP + var/emagged = 0 + +/obj/item/weapon/dogborg/jaws/small/attack_self(mob/user) + var/mob/living/silicon/robot.R = user + if(R.emagged) + emagged = !emagged + if(emagged) + name = "combat jaws" + icon = 'icons/mob/dogborg.dmi' + icon_state = "jaws" + desc = "The jaws of the law." + flags = CONDUCT + force = 10 + throwforce = 0 + hitsound = 'sound/weapons/bite.ogg' + attack_verb = list("chomped", "bit", "ripped", "mauled", "enforced") + w_class = 3 + sharpness = IS_SHARP + else + name = "puppy jaws" + icon = 'icons/mob/dogborg.dmi' + icon_state = "smalljaws" + desc = "The jaws of a small dog." + flags = CONDUCT + force = 5 + throwforce = 0 + hitsound = 'sound/weapons/bite.ogg' + attack_verb = list("nibbled", "bit", "gnawed", "chomped", "nommed") + w_class = 3 + sharpness = IS_SHARP + update_icon() + + +//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]!" + + +//Boop + +/obj/item/device/analyzer/nose + name = "boop module" + icon = 'icons/mob/dogborg.dmi' + icon_state = "nose" + desc = "The BOOP module" + flags = CONDUCT + force = 0 + throwforce = 0 + attack_verb = list("nuzzled", "nosed", "booped") + w_class = 1 + +/obj/item/device/analyzer/nose/attack_self(mob/user) + user.visible_message("[user] sniffs around the air.", "You sniff the air for gas traces.") + + var/turf/location = user.loc + if (!( istype(location, /turf) )) + return + + var/datum/gas_mixture/environment = location.return_air() + + var/pressure = environment.return_pressure() + var/total_moles = environment.total_moles() + + user.show_message("Results:", 1) + if(abs(pressure - ONE_ATMOSPHERE) < 10) + user.show_message("Pressure: [round(pressure,0.1)] kPa", 1) + else + user.show_message("Pressure: [round(pressure,0.1)] kPa", 1) + if(total_moles) + var/list/env_gases = environment.gases + + environment.assert_gases(arglist(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 + var/plasma_concentration = env_gases["plasma"][MOLES]/total_moles + environment.garbage_collect() + + if(abs(n2_concentration - N2STANDARD) < 20) + user << "Nitrogen: [round(n2_concentration*100, 0.01)] %" + else + user << "Nitrogen: [round(n2_concentration*100, 0.01)] %" + + if(abs(o2_concentration - O2STANDARD) < 2) + user << "Oxygen: [round(o2_concentration*100, 0.01)] %" + else + user << "Oxygen: [round(o2_concentration*100, 0.01)] %" + + if(co2_concentration > 0.01) + user << "CO2: [round(co2_concentration*100, 0.01)] %" + else + user << "CO2: [round(co2_concentration*100, 0.01)] %" + + if(plasma_concentration > 0.005) + user << "Plasma: [round(plasma_concentration*100, 0.01)] %" + else + user << "Plasma: [round(plasma_concentration*100, 0.01)] %" + + user.show_message("Temperature: [round(environment.temperature-T0C)] °C", 1) + return + + +//Delivery + +/obj/item/weapon/storage/bag/borgdelivery + name = "fetching storage" + desc = "Fetch the thing!" + icon = 'icons/mob/dogborg.dmi' + icon_state = "dbag" + //Can hold one big item at a time. Drops contents on unequip.(see inventory.dm) + w_class = 5 + max_w_class = 2 + max_combined_w_class = 2 + storage_slots = 1 + collection_mode = 0 + can_hold = list() // any + cant_hold = list(/obj/item/weapon/disk/nuclear) + + +//Tongue stuff + +/obj/item/weapon/soap/tongue + name = "synthetic tongue" + desc = "Useful for slurping mess off the floor before affectionally licking the crew members in the face." + icon = 'icons/mob/dogborg.dmi' + icon_state = "synthtongue" + hitsound = 'sound/effects/attackblob.ogg' + cleanspeed = 80 + var/emagged = 0 + +/obj/item/trash/rkibble + name = "robo kibble" + desc = "A novelty bowl of assorted mech fabricator byproducts. Mockingly feed this to the sec-dog to help it recharge." + icon = 'icons/mob/dogborg.dmi' + icon_state= "kibble" + +/obj/item/weapon/soap/tongue/attack_self(mob/user) + var/mob/living/silicon/robot.R = user + if(R.emagged) + emagged = !emagged + if(emagged) + name = "hacked tongue of doom" + desc = "Your tongue has been upgraded successfully. Congratulations." + icon = 'icons/mob/dogborg.dmi' + icon_state = "syndietongue" + cleanspeed = 60 //(nerf'd)tator soap stat + else + name = "synthetic tongue" + desc = "Useful for slurping mess off the floor before affectionally licking the crew members in the face." + icon = 'icons/mob/dogborg.dmi' + icon_state = "synthtongue" + cleanspeed = 80 + update_icon() + +/obj/item/weapon/soap/tongue/afterattack(atom/target, mob/user, proximity) + if(!proximity || !check_allowed_items(target)) + return + if(user.client && (target in user.client.screen)) + user << "You need to take that [target.name] off before cleaning it!" + else if(istype(target,/obj/effect/decal/cleanable)) + user.visible_message("[user] begins to lick off \the [target.name].", "You begin to lick off \the [target.name]...") + if(do_after(user, src.cleanspeed, target = target)) + user << "You finish licking off \the [target.name]." + qdel(target) + var/mob/living/silicon/robot.R = user + R.cell.charge = R.cell.charge + 50 + else if(istype(target,/obj/item)) //hoo boy. danger zone man + 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]...") + if(do_after(user, src.cleanspeed, target = target)) + user << "You finish off \the [target.name]." + qdel(target) + var/mob/living/silicon/robot.R = user + R.cell.charge = R.cell.charge + 250 + return + if(istype(target,/obj/item/weapon/stock_parts/cell)) + user.visible_message("[user] begins cramming \the [target.name] down its throat.", "You begin cramming \the [target.name] down your throat...") + if(do_after(user, 50, target = target)) + user << "You finish off \the [target.name]." + var/mob/living/silicon/robot.R = user + var/obj/item/weapon/stock_parts/cell.C = target + R.cell.charge = R.cell.charge + (C.charge / 3) //Instant full cell upgrades op idgaf + qdel(target) + return + var/obj/item/I = target //HAHA FUCK IT, NOT LIKE WE ALREADY HAVE A SHITTON OF WAYS TO REMOVE SHIT + if(!I.anchored && src.emagged) + user.visible_message("[user] begins chewing up \the [target.name]. Looks like it's trying to loophole around its diet restriction!", "You begin chewing up \the [target.name]...") + if(do_after(user, 100, target = I)) //Nerf dat time yo + visible_message("[user] chews up \the [target.name] and cleans off the debris!") + user << "You finish off \the [target.name]." + qdel(I) + var/mob/living/silicon/robot.R = user + R.cell.charge = R.cell.charge + 500 + return + 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)) + user << "You clean \the [target.name]." + var/obj/effect/decal/cleanable/C = locate() in target + qdel(C) + target.clean_blood() + else if(ishuman(target)) + if(src.emagged) + var/mob/living/silicon/robot.R = user + var/mob/living/L = target + if(R.cell.charge <= 666) + return + L.Stun(4) // normal stunbaton is force 7 gimme a break good sir! + L.Weaken(4) + L.apply_effect(STUTTER, 4) + 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 + else + user.visible_message("\the [user] affectionally licks \the [target]'s face!", "You affectionally lick \the [target]'s face!") + playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1) + return + else if(istype(target, /obj/structure/window)) + 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)) + user << "You clean \the [target.name]." + target.color = initial(target.color) + target.SetOpacity(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)) + user << "You clean \the [target.name]." + var/obj/effect/decal/cleanable/C = locate() in target + qdel(C) + target.clean_blood() + return + + + +//Defibs + +/obj/item/weapon/twohanded/shockpaddles/hound + name = "defibrillator paws" + desc = "MediHound specific shock paws." + icon = 'icons/mob/dogborg.dmi' + icon_state = "defibpaddles0" + item_state = "defibpaddles0" + req_defib = 0 + wielded = 1 + +/obj/item/weapon/twohanded/shockpaddles/hound/attack(mob/M, mob/user) + ...() + var/mob/living/silicon/robot.R = user + if(R.cell.charge < 1000) + user_visible_message("You don't have enough charge for this operation!") + return + if(src.cooldown == 0) + R.cell.charge = R.cell.charge - 1000 + return ..() + + +//Sleeper + +/obj/item/weapon/dogborg/sleeper + name = "mounted sleeper" + desc = "Equipment for medical hound. A mounted sleeper that stabilizes patients and can inject reagents in the borg's reserves." + icon = 'icons/mob/dogborg.dmi' + icon_state = "sleeper" + var/mob/living/carbon/patient = null + var/mob/living/silicon/hound = null + var/inject_amount = 10 + var/min_health = -100 + var/occupied = 0 + var/list/injection_chems = list("morphine", "salbutamol", "bicaridine", "kelotane","antitoxin") + +/obj/item/weapon/dogborg/sleeper/Exit(atom/movable/O) + return 0 + +/obj/item/weapon/dogborg/sleeper/afterattack(mob/living/carbon/target, mob/living/silicon/user, proximity) + if(!proximity) + return + if(!ishuman(target)) + return + if(!patient_insertion_check(target)) + return + user.visible_message("[user] starts putting [target] into \the [src].", "You start putting [target] into [src]...") + if(do_after(user, 50, target = target)) + if(!patient_insertion_check(target)) + return + target.forceMove(src) + patient = target + hound = user + target.reset_perspective(src) + user << "[target] successfully loaded into [src]. Life support functions engaged." + user.visible_message("[user] loads [target] into [src].") + user.visible_message("[target] loaded. Life support functions engaged.") + src.occupied = 1 + var/mob/living/silicon/robot.R = user + if(patient.stat < 2) + R.sleeper_r = 0 + R.sleeper_g = 1 + R.update_icons() + else + R.sleeper_g = 0 + R.sleeper_r = 1 + R.update_icons() + SSobj.processing |= src + +/obj/item/weapon/dogborg/sleeper/proc/patient_insertion_check(mob/living/carbon/target, mob/user) + if(target.anchored) + user << "[target] will not fit into the sleeper because they are buckled to [target.buckled]!" + return + if(patient) + user << "The sleeper is already occupied!" + return + return 1 + +/obj/item/weapon/dogborg/sleeper/proc/go_out() + if(src.occupied == 0) + return + var/mob/living/silicon/robot.R = hound + hound << "[patient] ejected. Life support functions disabled." + R.sleeper_r = 0 + R.sleeper_g = 0 + R.update_icons() + patient.forceMove(get_turf(src)) + patient.reset_perspective() + patient = null + src.occupied = 0 + src.occupied = 0 //double check just in case + +/obj/item/weapon/dogborg/sleeper/proc/drain() + var/mob/living/silicon/robot.R = hound + R.cell.charge = R.cell.charge - 10 + +/obj/item/weapon/dogborg/sleeper/attack_self(mob/user) + if(..()) + return + sleeperUI(user) + +/obj/item/weapon/dogborg/sleeper/proc/sleeperUI(mob/user) + var/dat + dat += "

Injector

" + if(patient) + dat += "Inject Epinephrine" + else + dat += "Inject Epinephrine" + if(patient && patient.health > min_health) + for(var/re in injection_chems) + var/datum/reagent/C = chemical_reagents_list[re] + if(C) + dat += "
Inject [C.name]" + else + for(var/re in injection_chems) + var/datum/reagent/C = chemical_reagents_list[re] + if(C) + dat += "
Inject [C.name]" + + dat += "

Sleeper Status

" + dat += "Scan" + dat += "Eject" + dat += "
" + if(!patient) + dat += "Sleeper Unoccupied" + else + dat += "[patient.name] => " + switch(patient.stat) //obvious, see what their status is + if(0) + dat += "Conscious" + var/mob/living/silicon/robot.R = user + R.sleeper_r = 0 + R.sleeper_g = 1 + R.update_icons() + if(1) + dat += "Unconscious" + var/mob/living/silicon/robot.R = user + R.sleeper_r = 0 + R.sleeper_g = 1 + R.update_icons() + else + dat += "DEAD" + var/mob/living/silicon/robot.R = user + R.sleeper_g = 0 + R.sleeper_r = 1 + R.update_icons() + dat += "
" + dat += "
Health:
[patient.stat > 1 ? "" : "[patient.health]%"]
" + dat += "
\> Brute Damage:
[patient.getBruteLoss()]%
" + dat += "
\> Resp. Damage:
[patient.getOxyLoss()]%
" + dat += "
\> Toxin Content:
[patient.getToxLoss()]%
" + dat += "
\> Burn Severity:
[patient.getFireLoss()]%

" + + dat += "
Paralysis Summary:
[round(patient.paralysis)]% [patient.paralysis ? "([round(patient.paralysis / 4)] seconds left)" : ""]

" + if(patient.getCloneLoss()) + dat += "
Subject appears to have cellular damage.

" + if(patient.getBrainLoss()) + dat += "
Significant brain damage detected.

" + if(patient.reagents.reagent_list.len) + for(var/datum/reagent/R in patient.reagents.reagent_list) + dat += "
[R.name]:
[round(R.volume, 0.1)] units

" + dat += "
" + + var/datum/browser/popup = new(user, "sleeper", "Sleeper Console", 520, 540) //Set up the popup browser window + popup.set_title_image(user.browse_rsc_icon(icon, icon_state)) + popup.set_content(dat) + popup.open() + +/obj/item/weapon/dogborg/sleeper/Topic(href, href_list) + if(..() || usr == patient) + return + usr.set_machine(src) + if(href_list["refresh"]) + updateUsrDialog() + return + if(href_list["eject"]) + go_out() + return + if(patient && patient.stat != DEAD) + if(href_list["inject"] == "epinephrine" || patient.health > min_health) + inject_chem(usr, href_list["inject"]) + else + usr << "ERROR: Subject is not in stable condition for auto-injection." + else + usr << "ERROR: Subject cannot metabolise chemicals." + updateUsrDialog() + +/obj/item/weapon/dogborg/sleeper/proc/inject_chem(mob/user, chem) + if(patient && patient.reagents) + if(chem in injection_chems + "epinephrine") + if(patient.reagents.get_reagent_amount(chem) + 10 <= 20) + patient.reagents.add_reagent(chem, 10) + 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." + +/obj/item/weapon/dogborg/sleeper/process() + if(src.occupied == 0) + SSobj.processing.Remove(src) + return + if(patient.health > 0) + patient.adjustOxyLoss(-1) + patient.updatehealth() + patient.AdjustStunned(-4) + patient.AdjustWeakened(-4) + src.drain() + if(patient.reagents.get_reagent_amount("epinephrine") < 5) + patient.reagents.add_reagent("epinephrine", 5) + +/obj/item/weapon/dogborg/sleeper/container_resist() + go_out() + +// Pounce stuff for K-9 + +/obj/item/weapon/dogborg/pounce + name = "pounce" + icon = 'icons/mob/dogborg.dmi' + icon_state = "pounce" + desc = "Leap at your target to momentarily stun them." + force = 0 + throwforce = 0 + +/mob/living/silicon/robot + var/leaping = 0 + var/pounce_cooldown = 0 + var/pounce_cooldown_time = 40 //Nearly doubled, u happy? + var/leap_at + var/disabler + var/laser + var/sleeper_g + var/sleeper_r + +#define MAX_K9_LEAP_DIST 3 //Dropped from 7 to 3 because waa waa + +/obj/item/weapon/dogborg/pounce/afterattack(atom/A, mob/user) + var/mob/living/silicon/robot.R = user + R.leap_at(A) + +/mob/living/silicon/robot/proc/leap_at(atom/A) + if(pounce_cooldown) + src << "Your leg actuators are still recharging!" + return + + if(leaping) //Leap while you leap, so you can leap while you leap + return + + if(!has_gravity(src) || !has_gravity(A)) + src << "It is unsafe to leap without gravity!" + //It's also extremely buggy visually, so it's balance+bugfix + return + + if(cell.charge <= 500) + return + + else + leaping = 1 + pixel_y = 10 + throw_at(A,MAX_K9_LEAP_DIST,1, spin=0, diagonals_first = 1) + leaping = 0 + pixel_y = initial(pixel_y) + cell.charge = cell.charge - 500 //Doubled the energy consumption + pounce_cooldown = !pounce_cooldown + spawn(pounce_cooldown_time) + pounce_cooldown = !pounce_cooldown + +/mob/living/silicon/robot/throw_impact(atom/A, params) + + if(!leaping) + return ..() + + if(A) + if(istype(A, /mob/living)) + 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)) + 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. + sleep(2)//Runtime prevention (infinite bump() calls on hulks) + step_towards(src,L) + + else if(A.density && !A.CanPass(src)) + visible_message("[src] smashes into [A]!") + weakened = 2 + + if(leaping) + leaping = 0 + update_canmove() diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 90b3b3ef87..e91ed2d529 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -166,7 +166,7 @@ if(module) return - var/list/modulelist = list("Standard", "Engineering", "Medical", "Miner", "Janitor", "Service") + var/list/modulelist = list("Standard", "Engineering", "Medical", "Miner", "Janitor", "Service", "Loader", "Security K-9 Unit", "MediHound", "Borgi") if(!config.forbid_peaceborg) modulelist += "Peacekeeper" if(!config.forbid_secborg) @@ -264,6 +264,40 @@ modtype = "Jan" feedback_inc("cyborg_janitor",1) + if("Loader") + module = new /obj/item/weapon/robot_module/loader(src) + hands.icon_state = "loader" + icon_state = "loaderborg" + animation_length = 29 + modtype = "Loader" + feedback_inc("cyborg_loader",1) + + if("Security K-9 Unit") + module = new /obj/item/weapon/robot_module/k9(src) + icon = 'icons/mob/widerobot.dmi' + icon_state = "k9" + hands.icon_state = "k9" + animation_length = 37 + modtype = "Security K-9 Unit" + feedback_inc("cyborg_k9",1) + + if("MediHound") + module = new /obj/item/weapon/robot_module/medihound(src) + icon = 'icons/mob/widerobot.dmi' + icon_state = "medihound" + hands.icon_state = "medihound" + animation_length = 35 + modtype = "MediHound" + feedback_inc("cyborg_medihound",1) + + if("Borgi") + module = new /obj/item/weapon/robot_module/borgi(src) + hands.icon_state = "borgi" + icon_state = "borgi" + animation_length = 37 + modtype = "Borgi" + feedback_inc("cyborg_borgi",1) + transform_animation(animation_length) notify_ai(2) @@ -281,6 +315,14 @@ flick(icon_state, src) sleep(animation_length+1) notransform = 0 + if(icon_state == "k9") //use for wide sprites + icon = 'icons/mob/widerobot.dmi' + pixel_x = -16 + return + if(icon_state == "medihound") //use for wide sprites + icon = 'icons/mob/widerobot.dmi' + pixel_x = -16 + return icon = 'icons/mob/robots.dmi' /mob/living/silicon/robot/proc/updatename() @@ -833,6 +875,14 @@ add_overlay("eyes-peaceborg[is_servant_of_ratvar(src) ? "_r" : ""]") if("syndie_bloodhound") add_overlay("eyes-syndie_bloodhound") + if("loaderborg") + add_overlay("eyes-loaderborg") + if("k9") + add_overlay("eyes-k9") + if("medihound") + add_overlay("eyes-medihound") + if("borgi") + add_overlay("eyes-borgi") else add_overlay("eyes") state_name = "serviceborg" diff --git a/icons/mob/dogborg.dmi b/icons/mob/dogborg.dmi new file mode 100644 index 0000000000..2ccf941237 Binary files /dev/null and b/icons/mob/dogborg.dmi differ diff --git a/icons/mob/robot_transformations.dmi b/icons/mob/robot_transformations.dmi index 9860c004cf..333ce69b14 100644 Binary files a/icons/mob/robot_transformations.dmi and b/icons/mob/robot_transformations.dmi differ diff --git a/icons/mob/werenerdleap.dmi b/icons/mob/werenerdleap.dmi new file mode 100644 index 0000000000..eb5339733b Binary files /dev/null and b/icons/mob/werenerdleap.dmi differ diff --git a/tgstation.dme b/tgstation.dme index 80c9b6b439..0deda38447 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -128,8 +128,8 @@ #include "code\_onclick\hud\robot.dm" #include "code\_onclick\hud\screen_objects.dm" #include "code\_onclick\hud\swarmer.dm" -#include "code\citadel\_helpers.dm" -#include "code\citadel\organs.dm" +#include "code\citadel\dogborgs.dm" +#include "code\citadel\dogborgstuff.dm" #include "code\citadel\vore\hook-defs_vr.dm" #include "code\citadel\vore\trycatch_vr.dm" #include "code\citadel\vore\eating\belly_vr.dm"