diff --git a/code/__defines/borg_overlays.dm b/code/__defines/borg_overlays.dm new file mode 100644 index 00000000000..bc5365e25e7 --- /dev/null +++ b/code/__defines/borg_overlays.dm @@ -0,0 +1,61 @@ +/// This file contains everything that involves the borg overlay system that is applied to borgs in robot/sprites_sprite_datum.dm + +/// These are applied ON /datum/robot_sprite to tell it what overlays it can or can not have. + +/// If you make a borg that has a laser, taser, and shield, here's an Example: +/// sprite_flags = ROBOT_HAS_LASER_SPRITE | ROBOT_HAS_TASER_SPRITE | ROBOT_HAS_SHIELD_SPRITE + +/// NOTES: You are NOT EXPECTED TO HAVE A GUN SPRITE IF YOU HAVE A DEDICATED LASER/TASER/DISABLER SPRITE. Doing so will cause BAD THINGS to happen!!! +/// IMPORTANT: Flags operate on a 1 2 4 8 10 20 40 80 100 200 400 800 1000 2000 4000 8000 etc system. Not 1 2 4 8 16 32 64 like I thought at first (oops) +#define ROBOT_HAS_SPEED_SPRITE 0x1 //Ex: /obj/item/borg/combat/mobility Replaces old has_speed_sprite +#define ROBOT_HAS_SHIELD_SPRITE 0x2 //Ex: /obj/item/borg/combat/shield Replaces old has_shield_sprite +#define ROBOT_HAS_SHIELD_SPEED_SPRITE 0x4 //Ex: Has a sprite for when both is activated AND has /obj/item/borg/combat/mobility +#define ROBOT_HAS_LASER_SPRITE 0x8 //Ex: /obj/item/gun/energy/robotic/laser Replaces old has_laser_sprite +#define ROBOT_HAS_TASER_SPRITE 0x10 //Ex: /obj/item/gun/energy/robotic/taser Replaces old has_taser_sprite +#define ROBOT_HAS_GUN_SPRITE 0x20 //Ex: Has a general gun sprite. Replaces old has_gun_sprite +#define ROBOT_HAS_DISABLER_SPRITE 0x40 //Ex: /obj/item/gun/energy/taser/mounted/cyborg/ertgun HOWEVER it is not used on this codebase (Virgo) but may be used downstream. + +#define ROBOT_HAS_MELEE_SPRITE 0x80 //Ex: Generic borg melee +#define ROBOT_HAS_DAGGER_SPRITE 0x100 //Ex: Specialized dagger. +#define ROBOT_HAS_BLADE_SPRITE 0x200 //Ex: Specialized blade +/// For sanity's sake for you spriters out there that don't want to dig through the code, attach the below as a suffix for your sprites: +/// Speed: -roll +/// Shield: -shield +/// Both: -speed_shield + +/// Laser: -laser +/// Taser: -taser +/// Gun: -gun +/// Disabler: -disabler + +/// Melee: -melee +/// Blade: -blade +/// Dagger: -dagger + +/// GUN DEFINES +/// These are applied on GUNS to classify them as a GUN, TASER, OR LASER. +/// So every borg weapon is a child of '/obj/item/gun/energy/robotic' and given the 'laser' 'taser' 'gun' etc flag. ALL guns have 'gun' by default. +#define COUNTS_AS_ROBOT_GUN 0x1 +#define COUNTS_AS_ROBOT_TASER 0x2 +#define COUNTS_AS_ROBOT_LASER 0x4 +#define COUNTS_AS_ROBOT_DISABLER 0x8 + +/// MELEE WEAPON DEFINES +/// These are applied on MELEE WEAPONS to classify them as MELEE WEAPONS that give sprites. +/// Use 'melee' if your borg ONLY has a generic melee sprite. If they have more unique sprites, use the other ones! +/// Currently, only the borg blade is used. But you could expand this define list! +#define COUNTS_AS_ROBOTIC_MELEE 0x1 +#define COUNTS_AS_ROBOT_DAGGER 0x2 +#define COUNTS_AS_ROBOT_BLADE 0x4 + +/// ADDITIONAL NOTES: +/// If you want to have a special type of item that will be used on borgs that is NOT a gun OR is not included above that causes an overlay, have no fear! +/// Currently, the SHIELD, SPEED, and both are included. If you want your borg to have a cool special overlay, use 'handle_extra_icon_updates'! +/// Here's an example: + +/* +/datum/robot_sprite/combat/fluff/foopwotch/handle_extra_icon_updates(var/mob/living/silicon/robot/ourborg) //Make sure the path is correct! + ..() //THIS IS ESSENTIAL. IF YOU FORGET THIS LINE, YOU WILL NOT GET THE NORMAL SPRITES. + if(ourborg.has_active_type(/obj/item/weapon/combat_borgblade)) + ourborg.add_overlay("[sprite_icon_state]-dagger") +*/ diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index 8aa81f69e02..ba5f70a8e5a 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -361,7 +361,7 @@ generic_error(R, type) return 0 - var/obj/T = R.has_upgrade_module(/obj/item/gun/energy/taser/mounted/cyborg) + var/obj/T = R.has_upgrade_module(/obj/item/gun/energy/robotic/taser) if(!T) to_chat(usr, span_warning("This robot has had its taser removed!")) return 0 @@ -371,7 +371,7 @@ to_chat(usr, "There's no room for another cooling unit!") return 0 - var/obj/item/gun/energy/taser/mounted/cyborg/B = T + var/obj/item/gun/energy/robotic/taser/B = T B.recharge_time = max(2 , B.recharge_time - 4) return 1 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 122d2a824b2..091e6553242 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 @@ -1,110 +1,3 @@ -/obj/item/melee/dogborg/jaws - icon = 'icons/mob/dogborg_vr.dmi' - hitsound = 'sound/weapons/bite.ogg' - throwforce = 0 - w_class = ITEMSIZE_NORMAL - pry = 1 - tool_qualities = list(TOOL_CROWBAR) - -/obj/item/melee/dogborg/jaws/big - name = "combat jaws" - icon_state = "jaws" - desc = "The jaws of the law." - force = 25 - armor_penetration = 25 - defend_chance = 15 - attack_verb = list("chomped", "bit", "ripped", "mauled", "enforced") - -/obj/item/melee/dogborg/jaws/small - name = "puppy jaws" - icon_state = "smalljaws" - desc = "The jaws of a small dog." - force = 10 - defend_chance = 5 - attack_verb = list("nibbled", "bit", "gnawed", "chomped", "nommed") - var/emagged = 0 - -/obj/item/melee/dogborg/jaws/small/attack_self(mob/user) - var/mob/living/silicon/robot/R = user - if(R.emagged || R.emag_items) - emagged = !emagged - if(emagged) - name = "combat jaws" - icon_state = "jaws" - desc = "The jaws of the law." - force = 25 - armor_penetration = 25 - defend_chance = 15 - attack_verb = list("chomped", "bit", "ripped", "mauled", "enforced") - else - name = "puppy jaws" - icon_state = "smalljaws" - desc = "The jaws of a small dog." - force = 10 - armor_penetration = 0 - defend_chance = 5 - attack_verb = list("nibbled", "bit", "gnawed", "chomped", "nommed") - update_icon() - -// Baton chompers -/obj/item/melee/borg_combat_shocker - name = "combat shocker" - icon = 'icons/mob/dogborg_vr.dmi' - icon_state = "combatshocker" - desc = "Shocking!" - force = 15 - throwforce = 0 - hitsound = 'sound/weapons/genhit1.ogg' - attack_verb = list("hit") - w_class = ITEMSIZE_NORMAL - var/charge_cost = 15 - var/dogborg = FALSE - -/obj/item/melee/borg_combat_shocker/apply_hit_effect(mob/living/target, mob/living/user, var/hit_zone) - if(isrobot(target)) - return ..() - - var/agony = 60 // Copied from stun batons - var/stun = 0 // ... same - - var/obj/item/organ/external/affecting = null - if(ishuman(target)) - var/mob/living/carbon/human/H = target - affecting = H.get_organ(hit_zone) - - if(user.a_intent == I_HURT) - // Parent handles messages - . = ..() - //whacking someone causes a much poorer electrical contact than deliberately prodding them. - agony *= 0.5 - stun *= 0.5 - else - if(affecting) - if(dogborg) - target.visible_message(span_danger("[target] has been zap-chomped in the [affecting.name] with [src] by [user]!")) - else - target.visible_message(span_danger("[target] has been zapped in the [affecting.name] with [src] by [user]!")) - else - if(dogborg) - target.visible_message(span_danger("[target] has been zap-chomped with [src] by [user]!")) - else - target.visible_message(span_danger("[target] has been zapped with [src] by [user]!")) - playsound(src, 'sound/weapons/Egloves.ogg', 50, 1, -1) - - // Try to use power - var/stunning = FALSE - if(isrobot(loc)) - var/mob/living/silicon/robot/R = loc - if(R.cell?.use(charge_cost) == charge_cost) - stunning = TRUE - - if(stunning) - target.stun_effect_act(stun, agony, hit_zone, src) - msg_admin_attack("[key_name(user)] stunned [key_name(target)] with the [src].") - if(ishuman(target)) - var/mob/living/carbon/human/H = target - H.forcesay(hit_appends) - //Boop //New and improved, now a simple reagent sniffer. /obj/item/boop_module name = "boop module" @@ -347,20 +240,6 @@ recharge_time = 10 //Takes ten ticks to recharge a shot, so don't waste them all! //cell_type = null //Same cell as a taser until edits are made. -/obj/item/melee/combat_borgblade - name = "energy blade" - icon = 'icons/mob/dogborg_vr.dmi' - icon_state = "swordtail" - desc = "A glowing dagger. It appears to be extremely sharp." - force = 35 //Takes 3 hits to 100-0 - armor_penetration = 70 - sharp = TRUE - edge = TRUE - throwforce = 0 //This shouldn't be thrown in the first place. - hitsound = 'sound/weapons/blade1.ogg' - attack_verb = list("slashed", "stabbed", "jabbed", "mauled", "sliced") - w_class = ITEMSIZE_NORMAL - /obj/item/lightreplacer/dogborg name = "light replacer" desc = "A device to automatically replace lights. This version is capable to produce a few replacements using your internal matter reserves." diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm index b5c4dd522ff..f210f5e172d 100644 --- a/code/modules/mob/living/silicon/robot/inventory.dm +++ b/code/modules/mob/living/silicon/robot/inventory.dm @@ -135,13 +135,25 @@ else return 0 +/mob/living/silicon/robot/proc/get_active_modules() + return list(module_state_1, module_state_2, module_state_3) + // This one takes an object's type instead of an instance, as above. /mob/living/silicon/robot/proc/has_active_type(var/type_to_compare, var/explicit = FALSE) - var/list/active_modules = list(module_state_1, module_state_2, module_state_3) + var/list/active_modules = get_active_modules() if(is_type_in_modules(type_to_compare, active_modules, explicit)) return TRUE return FALSE +/// Searches through a provided list to see if we have a module that is in that list. +/mob/living/silicon/robot/proc/has_active_type_list(var/list/type_to_compare, var/explicit = FALSE) + var/list/active_modules = get_active_modules() + if(islist(type_to_compare)) + for(var/object_to_compare in type_to_compare) + if(is_type_in_modules(object_to_compare, active_modules, explicit)) + return TRUE + return FALSE + /mob/living/silicon/robot/proc/is_type_in_modules(var/type, var/list/modules, var/explicit = FALSE) for(var/atom/module in modules) if(explicit && isatom(module)) @@ -284,6 +296,7 @@ contents += O if(istype(module_state_1,/obj/item/borg/sight)) sight_mode |= module_state_1:sight_mode + update_icon() else if(!module_state_2) module_state_2 = O O.hud_layerise() @@ -291,6 +304,7 @@ contents += O if(istype(module_state_2,/obj/item/borg/sight)) sight_mode |= module_state_2:sight_mode + update_icon() else if(!module_state_3) module_state_3 = O O.hud_layerise() @@ -298,6 +312,7 @@ contents += O if(istype(module_state_3,/obj/item/borg/sight)) sight_mode |= module_state_3:sight_mode + update_icon() else to_chat(src, span_notice("You need to disable a module first!")) return diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index bbf89baf3a3..24bf40ce1cb 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -336,7 +336,7 @@ module_state_2:screen_loc = ui_inv2 if(module_state_3) module_state_3:screen_loc = ui_inv3 - update_icon() + //update_icon() //Removed and moved to robot/inventory.dm so it's not being called EVERY LIFE TICK /mob/living/silicon/robot/proc/process_killswitch() if(killswitch) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 97679780b41..b5f8ae2021f 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -1457,7 +1457,7 @@ else return FALSE if(given_type == /obj/item/borg/upgrade/restricted/tasercooler) - var/obj/item/gun/energy/taser/mounted/cyborg/T = has_upgrade_module(/obj/item/gun/energy/taser/mounted/cyborg) + var/obj/item/gun/energy/robotic/taser/T = has_upgrade_module(/obj/item/gun/energy/robotic/taser) if(T && T.recharge_time <= 2) return T else if(!T) diff --git a/code/modules/mob/living/silicon/robot/robot_modules/event.dm b/code/modules/mob/living/silicon/robot/robot_modules/event.dm index cfa11fd7199..26a0d6c477c 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules/event.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules/event.dm @@ -28,7 +28,7 @@ src.modules += new /obj/item/robotanalyzer(src) // Potato - src.emag += new /obj/item/gun/energy/retro/mounted(src) + src.emag += new /obj/item/gun/energy/robotic/laser/retro(src) var/datum/matter_synth/wire = new /datum/matter_synth/wire() synths += wire @@ -67,7 +67,7 @@ src.modules += new /obj/item/gripper/gravekeeper(src) // For really persistent looters - src.emag += new /obj/item/gun/energy/retro/mounted(src) + src.emag += new /obj/item/gun/energy/robotic/laser/retro(src) var/datum/matter_synth/wood = new /datum/matter_synth/wood(25000) synths += wood @@ -78,4 +78,4 @@ // For uwu src.modules += new /obj/item/dogborg/sleeper/compactor/generic(src) - src.emag += new /obj/item/dogborg/pounce(src) \ No newline at end of file + src.emag += new /obj/item/dogborg/pounce(src) diff --git a/code/modules/mob/living/silicon/robot/robot_modules/station.dm b/code/modules/mob/living/silicon/robot/robot_modules/station.dm index 2d438d1abd5..44cb525713d 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules/station.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules/station.dm @@ -479,12 +479,12 @@ var/global/list/robot_modules = list( ..() src.modules += new /obj/item/handcuffs/cyborg(src) src.modules += new /obj/item/melee/baton/robot(src) - src.modules += new /obj/item/gun/energy/taser/mounted/cyborg(src) + src.modules += new /obj/item/gun/energy/robotic/taser(src) src.modules += new /obj/item/taperoll/police(src) src.modules += new /obj/item/reagent_containers/spray/pepper(src) src.modules += new /obj/item/gripper/security(src) src.modules += new /obj/item/ticket_printer(src) //VOREStation Add - src.emag += new /obj/item/gun/energy/laser/mounted(src) + src.emag += new /obj/item/gun/energy/robotic/laser/rifle(src) src.modules += new /obj/item/dogborg/sleeper/K9(src) //Eat criminals. Bring them to the brig. src.modules += new /obj/item/dogborg/pounce(src) //Pounce @@ -715,7 +715,7 @@ var/global/list/robot_modules = list( src.modules += new /obj/item/storage/part_replacer(src) src.modules += new /obj/item/shockpaddles/robot/jumper(src) src.modules += new /obj/item/melee/baton/slime/robot(src) - src.modules += new /obj/item/gun/energy/taser/xeno/robot(src) + src.modules += new /obj/item/gun/energy/robotic/taser/xeno(src) src.modules += new /obj/item/xenoarch_multi_tool(src) src.modules += new /obj/item/pickaxe/excavationdrill(src) @@ -759,15 +759,15 @@ var/global/list/robot_modules = list( ..() src.modules += new /obj/item/handcuffs/cyborg(src) src.modules += new /obj/item/taperoll/police(src) - src.modules += new /obj/item/gun/energy/laser/mounted(src) - src.modules += new /obj/item/gun/energy/taser/mounted/cyborg/ertgun(src) + src.modules += new /obj/item/gun/energy/robotic/laser/rifle(src) + src.modules += new /obj/item/gun/energy/robotic/disabler(src) src.modules += new /obj/item/pickaxe/plasmacutter/borg(src) - src.modules += new /obj/item/melee/combat_borgblade(src) + src.modules += new /obj/item/melee/robotic/dagger(src) src.modules += new /obj/item/borg/combat/shield(src) src.modules += new /obj/item/borg/combat/mobility(src) - src.modules += new /obj/item/melee/borg_combat_shocker(src) + src.modules += new /obj/item/melee/robotic/borg_combat_shocker(src) src.modules += new /obj/item/ticket_printer(src) - src.emag += new /obj/item/gun/energy/lasercannon/mounted(src) + src.emag += new /obj/item/gun/energy/robotic/laser/heavy(src) src.modules += new /obj/item/dogborg/sleeper/K9/ert(src) src.modules += new /obj/item/dogborg/pounce(src) diff --git a/code/modules/mob/living/silicon/robot/robot_modules/swarm.dm b/code/modules/mob/living/silicon/robot/robot_modules/swarm.dm index 0919fca71b3..fe4e1a02562 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules/swarm.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules/swarm.dm @@ -12,7 +12,7 @@ src.modules += new /obj/item/flash/robot(src) src.modules += new /obj/item/handcuffs/cable/tape/cyborg(src) src.modules += new /obj/item/melee/baton/robot(src) - src.modules += new /obj/item/gun/energy/taser/mounted/cyborg/swarm(src) + src.modules += new /obj/item/gun/energy/robotic/taser/swarm(src) src.modules += new /obj/item/matter_decompiler/swarm(src) /obj/item/robot_module/drone/swarm/ranged @@ -35,4 +35,4 @@ icon_state = "disabler" projectile_type = /obj/item/projectile/beam/stun/disabler charge_cost = 800 - recharge_time = 0.5 SECONDS \ No newline at end of file + recharge_time = 0.5 SECONDS diff --git a/code/modules/mob/living/silicon/robot/robot_modules/syndicate.dm b/code/modules/mob/living/silicon/robot/robot_modules/syndicate.dm index 5fad7b3f887..eff6800d59c 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules/syndicate.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules/syndicate.dm @@ -53,7 +53,7 @@ /obj/item/robot_module/robot/syndicate/protector/create_equipment(var/mob/living/silicon/robot/robot) ..() src.modules += new /obj/item/shield_projector/rectangle/weak(src) - src.modules += new /obj/item/gun/energy/dakkalaser(src) + src.modules += new /obj/item/gun/energy/robotic/laser/dakkalaser(src) src.modules += new /obj/item/handcuffs/cyborg(src) src.modules += new /obj/item/melee/baton/robot(src) diff --git a/code/modules/mob/living/silicon/robot/sprites/_sprite_datum.dm b/code/modules/mob/living/silicon/robot/sprites/_sprite_datum.dm index 13f47dca367..c74da24749e 100644 --- a/code/modules/mob/living/silicon/robot/sprites/_sprite_datum.dm +++ b/code/modules/mob/living/silicon/robot/sprites/_sprite_datum.dm @@ -2,6 +2,7 @@ var/name var/module_type var/default_sprite = FALSE + var/sprite_flags var/sprite_icon var/sprite_icon_state @@ -27,7 +28,60 @@ var/whitelist_ckey var/whitelist_charname +/// Determines if the borg has the proper flags to show an overlay. +/datum/robot_sprite/proc/sprite_flag_check(var/flag_to_check) + return (sprite_flags & flag_to_check) + /datum/robot_sprite/proc/handle_extra_icon_updates(var/mob/living/silicon/robot/ourborg) + if(ourborg.resting) //Don't do ANY of the overlay code if we're resting. It just won't look right! + return + if(sprite_flag_check(ROBOT_HAS_SHIELD_SPEED_SPRITE)) + if(ourborg.has_active_type(/obj/item/borg/combat/shield) && ourborg.has_active_type(/obj/item/borg/combat/mobility)) + ourborg.add_overlay("[sprite_icon_state]-speed_shield") + return //Stop here. No need to add more overlays. Nothing else is compatible. + + if(sprite_flag_check(ROBOT_HAS_SPEED_SPRITE) && ourborg.has_active_type(/obj/item/borg/combat/mobility)) + ourborg.icon_state = "[sprite_icon_state]-roll" + return //Stop here. No need to add more overlays. Nothing else is compatible. + + if(sprite_flag_check(ROBOT_HAS_SHIELD_SPRITE)) + if(ourborg.has_active_type(/obj/item/borg/combat/shield)) + var/obj/item/borg/combat/shield/shield = locate() in ourborg + if(shield && shield.active) + ourborg.add_overlay("[sprite_icon_state]-shield") + + for(var/thing_to_check in ourborg.get_active_modules()) //We look at our active modules. Let's peep! + + //Melee Check + if(istype(thing_to_check, /obj/item/melee/robotic)) + var/obj/item/melee/robotic/melee = thing_to_check + if(sprite_flag_check(ROBOT_HAS_MELEE_SPRITE) && melee.weapon_flag_check(COUNTS_AS_ROBOTIC_MELEE)) + ourborg.add_overlay("[sprite_icon_state]-melee") + continue + if(sprite_flag_check(ROBOT_HAS_DAGGER_SPRITE) && melee.weapon_flag_check(COUNTS_AS_ROBOT_DAGGER)) + ourborg.add_overlay("[sprite_icon_state]-dagger") + continue + if(sprite_flag_check(ROBOT_HAS_BLADE_SPRITE) && melee.weapon_flag_check(COUNTS_AS_ROBOT_BLADE)) + ourborg.add_overlay("[sprite_icon_state]-blade") + continue + + //Gun Check + if(istype(thing_to_check, /obj/item/gun/energy/robotic)) + var/obj/item/gun/energy/robotic/gun = thing_to_check + if(sprite_flag_check(ROBOT_HAS_GUN_SPRITE) && gun.gun_flag_check(COUNTS_AS_ROBOT_GUN)) + ourborg.add_overlay("[sprite_icon_state]-gun") + continue + if(sprite_flag_check(ROBOT_HAS_LASER_SPRITE) && gun.gun_flag_check(COUNTS_AS_ROBOT_LASER)) + ourborg.add_overlay("[sprite_icon_state]-laser") + continue + if(sprite_flag_check(ROBOT_HAS_TASER_SPRITE) && gun.gun_flag_check(COUNTS_AS_ROBOT_TASER)) + ourborg.add_overlay("[sprite_icon_state]-taser") + continue + if(sprite_flag_check(ROBOT_HAS_DISABLER_SPRITE) && gun.gun_flag_check(COUNTS_AS_ROBOT_DISABLER)) + ourborg.add_overlay("[sprite_icon_state]-disabler") + continue + else //We are NEITHER a melee or a gun (Or whatever else you add in here in the future) + continue //Go on to the next. return /datum/robot_sprite/proc/get_belly_overlay(var/mob/living/silicon/robot/ourborg, var/size = 1) diff --git a/code/modules/mob/living/silicon/robot/sprites/combat.dm b/code/modules/mob/living/silicon/robot/sprites/combat.dm index beffd3256ab..a0b8140cb7f 100644 --- a/code/modules/mob/living/silicon/robot/sprites/combat.dm +++ b/code/modules/mob/living/silicon/robot/sprites/combat.dm @@ -4,18 +4,6 @@ module_type = "Combat" sprite_icon = 'icons/mob/robot/combat.dmi' - var/has_speed_sprite = FALSE - var/has_shield_sprite = FALSE - -/datum/robot_sprite/combat/handle_extra_icon_updates(var/mob/living/silicon/robot/ourborg) - if(has_speed_sprite && istype(ourborg.module_active, /obj/item/borg/combat/mobility)) - ourborg.icon_state = "[sprite_icon_state]-roll" - if(has_shield_sprite) - if(ourborg.has_active_type(/obj/item/borg/combat/shield)) - var/obj/item/borg/combat/shield/shield = locate() in ourborg - if(shield && shield.active) - ourborg.add_overlay("[sprite_icon_state]-shield") - /datum/robot_sprite/combat/default name = DEFAULT_ROBOT_SPRITE_NAME default_sprite = TRUE @@ -24,17 +12,15 @@ /datum/robot_sprite/combat/marina name = "Haruka" sprite_icon_state = "marina" - has_speed_sprite = TRUE - has_shield_sprite = TRUE + sprite_flags = ROBOT_HAS_SPEED_SPRITE | ROBOT_HAS_SHIELD_SPRITE /datum/robot_sprite/combat/droid name = "Android" sprite_icon_state = "droid" - has_speed_sprite = TRUE - has_shield_sprite = TRUE + sprite_flags = ROBOT_HAS_SPEED_SPRITE | ROBOT_HAS_SHIELD_SPRITE /datum/robot_sprite/combat/droid/get_eyes_overlay(var/mob/living/silicon/robot/ourborg) - if(istype(ourborg.module_active,/obj/item/borg/combat/mobility)) + if(ourborg.has_active_type(/obj/item/borg/combat/mobility)) return else return ..() @@ -42,32 +28,30 @@ /datum/robot_sprite/combat/insekt name = "Insekt" sprite_icon_state = "insekt" - has_shield_sprite = TRUE + sprite_flags = ROBOT_HAS_SHIELD_SPRITE /datum/robot_sprite/combat/decapod name = "Decapod" sprite_icon_state = "decapod" has_custom_open_sprites = TRUE - has_shield_sprite = TRUE + sprite_flags = ROBOT_HAS_SHIELD_SPRITE /datum/robot_sprite/combat/mechoid name = "Acheron" sprite_icon_state = "mechoid" - has_speed_sprite = TRUE - has_shield_sprite = TRUE + sprite_flags = ROBOT_HAS_SPEED_SPRITE | ROBOT_HAS_SHIELD_SPRITE /datum/robot_sprite/combat/zoomba name = "ZOOM-BA" sprite_icon_state = "zoomba" has_dead_sprite = TRUE - has_speed_sprite = TRUE - has_shield_sprite = TRUE + sprite_flags = ROBOT_HAS_SPEED_SPRITE | ROBOT_HAS_SHIELD_SPRITE /datum/robot_sprite/combat/worm name = "W02M" sprite_icon_state = "worm" has_custom_open_sprites = TRUE - has_shield_sprite = TRUE + sprite_flags = ROBOT_HAS_SHIELD_SPRITE /datum/robot_sprite/combat/uptall name = "Feminine Humanoid" @@ -88,33 +72,17 @@ sprite_icon = 'icons/mob/robot/combat_large.dmi' has_custom_equipment_sprites = TRUE - var/has_gun_sprite = FALSE - var/has_speed_sprite = FALSE - var/has_shield_sprite = FALSE - -/datum/robot_sprite/dogborg/tall/combat/handle_extra_icon_updates(var/mob/living/silicon/robot/ourborg) - if(has_gun_sprite && (istype(ourborg.module_active, /obj/item/gun/energy/laser/mounted) || istype(ourborg.module_active, /obj/item/gun/energy/taser/mounted/cyborg/ertgun) || istype(ourborg.module_active, /obj/item/gun/energy/lasercannon/mounted))) - ourborg.add_overlay("[sprite_icon_state]-gun") - if(has_speed_sprite && (istype(ourborg.module_active, /obj/item/borg/combat/mobility))) - ourborg.icon_state = "[sprite_icon_state]-roll" - if(has_shield_sprite) - if(ourborg.has_active_type(/obj/item/borg/combat/shield)) - var/obj/item/borg/combat/shield/shield = locate() in ourborg - if(shield && shield.active) - ourborg.add_overlay("[sprite_icon_state]-shield") - - /datum/robot_sprite/dogborg/tall/combat/do_equipment_glamour(var/obj/item/robot_module/module) if(!has_custom_equipment_sprites) return ..() - var/obj/item/melee/combat_borgblade/CBB = locate() in module.modules + var/obj/item/melee/robotic/dagger/CBB = locate() in module.modules if(CBB) CBB.name = "sword tail" CBB.desc = "A glowing dagger normally attached to the end of a cyborg's tail. It appears to be extremely sharp." - var/obj/item/melee/borg_combat_shocker/BCS = locate() in module.modules + var/obj/item/melee/robotic/borg_combat_shocker/BCS = locate() in module.modules if(BCS) BCS.name = "combat jaws" BCS.desc = "Shockingly chompy!" @@ -127,7 +95,7 @@ name = "ERT" sprite_icon_state = "derg" rest_sprite_options = list("Default") - has_gun_sprite = TRUE + sprite_flags = ROBOT_HAS_GUN_SPRITE /datum/robot_sprite/dogborg/tall/combat/hound name = "Hound" @@ -148,23 +116,21 @@ sprite_icon_state = "raptor" sprite_hud_icon_state = "ert" rest_sprite_options = list("Default", "Bellyup") - has_gun_sprite = TRUE has_eye_light_sprites = TRUE - has_shield_sprite = TRUE - has_speed_sprite = TRUE + sprite_flags = ROBOT_HAS_GUN_SPRITE | ROBOT_HAS_SHIELD_SPRITE | ROBOT_HAS_SPEED_SPRITE /datum/robot_sprite/dogborg/tall/combat/raptor/get_eyes_overlay(var/mob/living/silicon/robot/ourborg) - if(istype(ourborg.module_active,/obj/item/borg/combat/mobility)) + if(ourborg.has_active_type(/obj/item/borg/combat/mobility)) return else return ..() /datum/robot_sprite/dogborg/tall/combat/raptor/get_eye_light_overlay(var/mob/living/silicon/robot/ourborg) - if(istype(ourborg.module_active,/obj/item/borg/combat/mobility)) + if(ourborg.has_active_type(/obj/item/borg/combat/mobility)) return else return ..() /datum/robot_sprite/dogborg/tall/combat/raptor/get_belly_overlay(var/mob/living/silicon/robot/ourborg) - if(istype(ourborg.module_active,/obj/item/borg/combat/mobility)) + if(ourborg.has_active_type(/obj/item/borg/combat/mobility)) return else return ..() diff --git a/code/modules/mob/living/silicon/robot/sprites/event.dm b/code/modules/mob/living/silicon/robot/sprites/event.dm index 8a7165a3f30..42bc06dcdc8 100644 --- a/code/modules/mob/living/silicon/robot/sprites/event.dm +++ b/code/modules/mob/living/silicon/robot/sprites/event.dm @@ -8,19 +8,10 @@ module_type = "Lost" sprite_icon = 'icons/mob/robot/lost.dmi' - var/has_shield_sprite = FALSE - -/datum/robot_sprite/lost/handle_extra_icon_updates(var/mob/living/silicon/robot/ourborg) - if(has_shield_sprite) - if(ourborg.has_active_type(/obj/item/borg/combat/shield)) - var/obj/item/borg/combat/shield/shield = locate() in ourborg - if(shield && shield.active) - ourborg.add_overlay("[sprite_icon_state]-shield") - /datum/robot_sprite/lost/drone name = "AG Model" sprite_icon_state = "drone" - has_shield_sprite = TRUE + sprite_flags = ROBOT_HAS_SHIELD_SPRITE // Wide/dogborg sprites @@ -54,23 +45,10 @@ sprite_icon = 'icons/mob/robot/lost_large.dmi' sprite_hud_icon_state = "lost" - var/has_shield_sprite = FALSE - var/has_laser_sprite = FALSE - -/datum/robot_sprite/dogborg/tall/lost/handle_extra_icon_updates(var/mob/living/silicon/robot/ourborg) - if(has_laser_sprite && istype(ourborg.module_active, /obj/item/gun/energy/retro/mounted)) - ourborg.add_overlay("[sprite_icon_state]-laser") - if(has_shield_sprite) - if(ourborg.has_active_type(/obj/item/borg/combat/shield)) - var/obj/item/borg/combat/shield/shield = locate() in ourborg - if(shield && shield.active) - ourborg.add_overlay("[sprite_icon_state]-shield") - /datum/robot_sprite/dogborg/tall/lost/raptor name = "Raptor V-4" sprite_icon_state = "raptor" - has_shield_sprite = TRUE - has_laser_sprite = TRUE + sprite_flags = ROBOT_HAS_SHIELD_SPRITE | ROBOT_HAS_LASER_SPRITE // Gravekeeper @@ -82,24 +60,15 @@ sprite_icon = 'icons/mob/robot/gravekeeper.dmi' sprite_hud_icon_state = "lost" - var/has_shield_sprite = FALSE - -/datum/robot_sprite/gravekeeper/handle_extra_icon_updates(var/mob/living/silicon/robot/ourborg) - if(has_shield_sprite) - if(ourborg.has_active_type(/obj/item/borg/combat/shield)) - var/obj/item/borg/combat/shield/shield = locate() in ourborg - if(shield && shield.active) - ourborg.add_overlay("[sprite_icon_state]-shield") - /datum/robot_sprite/gravekeeper/drone name = "AG Model" sprite_icon_state = "drone" - has_shield_sprite = TRUE + sprite_flags = ROBOT_HAS_SHIELD_SPRITE /datum/robot_sprite/gravekeeper/sleek name = "WTOperator" sprite_icon_state = "sleek" - has_shield_sprite = TRUE + sprite_flags = ROBOT_HAS_SHIELD_SPRITE // Tall sprites @@ -109,20 +78,7 @@ sprite_icon = 'icons/mob/robot/gravekeeper_large.dmi' sprite_hud_icon_state = "lost" - var/has_shield_sprite = FALSE - var/has_laser_sprite = FALSE - -/datum/robot_sprite/dogborg/tall/gravekeeper/handle_extra_icon_updates(var/mob/living/silicon/robot/ourborg) - if(has_laser_sprite && istype(ourborg.module_active, /obj/item/gun/energy/retro/mounted)) - ourborg.add_overlay("[sprite_icon_state]-laser") - if(has_shield_sprite) - if(ourborg.has_active_type(/obj/item/borg/combat/shield)) - var/obj/item/borg/combat/shield/shield = locate() in ourborg - if(shield && shield.active) - ourborg.add_overlay("[sprite_icon_state]-shield") - /datum/robot_sprite/dogborg/tall/gravekeeper/raptor name = "Raptor V-4" sprite_icon_state = "raptor" - has_shield_sprite = TRUE - has_laser_sprite = TRUE + sprite_flags = ROBOT_HAS_SHIELD_SPRITE | ROBOT_HAS_LASER_SPRITE diff --git a/code/modules/mob/living/silicon/robot/sprites/fluff.dm b/code/modules/mob/living/silicon/robot/sprites/fluff.dm index a420ae2f02a..6312a73b034 100644 --- a/code/modules/mob/living/silicon/robot/sprites/fluff.dm +++ b/code/modules/mob/living/silicon/robot/sprites/fluff.dm @@ -84,12 +84,6 @@ whitelist_ckey = "jademanique" whitelist_charname = "B.A.U-Kingside" -/datum/robot_sprite/fluff/jademanique/handle_extra_icon_updates(var/mob/living/silicon/robot/ourborg) - if(istype(ourborg.module_active, /obj/item/gun/energy/laser/mounted)) - ourborg.add_overlay("[sprite_icon_state]-laser") - if(istype(ourborg.module_active, /obj/item/gun/energy/taser/mounted/cyborg)) - ourborg.add_overlay("[sprite_icon_state]-taser") - // L /datum/robot_sprite/fluff/lunarfleet diff --git a/code/modules/mob/living/silicon/robot/sprites/science.dm b/code/modules/mob/living/silicon/robot/sprites/science.dm index c03f8da7f74..ee6ffdc1784 100644 --- a/code/modules/mob/living/silicon/robot/sprites/science.dm +++ b/code/modules/mob/living/silicon/robot/sprites/science.dm @@ -148,12 +148,6 @@ module_type = "Research" sprite_icon = 'icons/mob/robot/science_large.dmi' - var/has_taser_sprite = FALSE - -/datum/robot_sprite/dogborg/tall/science/handle_extra_icon_updates(var/mob/living/silicon/robot/ourborg) - if(has_taser_sprite && istype(ourborg.module_active, /obj/item/gun/energy/taser/xeno/robot)) - ourborg.add_overlay("[sprite_icon_state]-taser") - /datum/robot_sprite/dogborg/tall/science/do_equipment_glamour(var/obj/item/robot_module/module) if(!has_custom_equipment_sprites) return @@ -172,7 +166,7 @@ name = "Raptor V-4" sprite_icon_state = "raptor" has_custom_equipment_sprites = TRUE - has_taser_sprite = TRUE + sprite_flags = ROBOT_HAS_TASER_SPRITE rest_sprite_options = list("Default", "Bellyup") /datum/robot_sprite/dogborg/tall/science/meka diff --git a/code/modules/mob/living/silicon/robot/sprites/security.dm b/code/modules/mob/living/silicon/robot/sprites/security.dm index 677b27d5389..3a8cd71e070 100644 --- a/code/modules/mob/living/silicon/robot/sprites/security.dm +++ b/code/modules/mob/living/silicon/robot/sprites/security.dm @@ -121,38 +121,26 @@ module_type = "Security" sprite_icon = 'icons/mob/robot/security_wide.dmi' - var/has_laser_sprite = FALSE - var/has_taser_sprite = FALSE - -/datum/robot_sprite/dogborg/security/handle_extra_icon_updates(var/mob/living/silicon/robot/ourborg) - if(has_laser_sprite && istype(ourborg.module_active, /obj/item/gun/energy/laser/mounted)) - ourborg.add_overlay("[sprite_icon_state]-laser") - if(has_taser_sprite && istype(ourborg.module_active, /obj/item/gun/energy/taser/mounted/cyborg)) - ourborg.add_overlay("[sprite_icon_state]-taser") - /datum/robot_sprite/dogborg/security/k9 name = "K9" sprite_icon_state = "k9" sprite_hud_icon_state = "k9" has_eye_light_sprites = TRUE - has_laser_sprite = TRUE - has_taser_sprite = TRUE + sprite_flags = ROBOT_HAS_TASER_SPRITE | ROBOT_HAS_LASER_SPRITE /datum/robot_sprite/dogborg/security/k92 name = "K9 Alt" sprite_icon_state = "k92" sprite_hud_icon_state = "k9" has_eye_sprites = FALSE - has_laser_sprite = TRUE - has_taser_sprite = TRUE + sprite_flags = ROBOT_HAS_TASER_SPRITE | ROBOT_HAS_LASER_SPRITE /datum/robot_sprite/dogborg/security/vale name = "Hound V2" sprite_icon_state = "vale" sprite_hud_icon_state = "k9" has_eye_light_sprites = TRUE - has_laser_sprite = TRUE - has_taser_sprite = TRUE + sprite_flags = ROBOT_HAS_TASER_SPRITE | ROBOT_HAS_LASER_SPRITE /datum/robot_sprite/dogborg/security/borgi name = "Borgi" @@ -167,14 +155,12 @@ sprite_icon_state = "otie" sprite_hud_icon_state = "k9" has_eye_light_sprites = TRUE - has_laser_sprite = TRUE - has_taser_sprite = TRUE + sprite_flags = ROBOT_HAS_TASER_SPRITE | ROBOT_HAS_LASER_SPRITE /datum/robot_sprite/dogborg/security/drake name = "Drake" sprite_icon_state = "drake" - has_laser_sprite = TRUE - has_taser_sprite = TRUE + sprite_flags = ROBOT_HAS_TASER_SPRITE | ROBOT_HAS_LASER_SPRITE // Tall sprites @@ -182,21 +168,11 @@ module_type = "Security" sprite_icon = 'icons/mob/robot/security_large.dmi' - var/has_laser_sprite = FALSE - var/has_taser_sprite = FALSE - -/datum/robot_sprite/dogborg/tall/security/handle_extra_icon_updates(var/mob/living/silicon/robot/ourborg) - if(has_laser_sprite && istype(ourborg.module_active, /obj/item/gun/energy/laser/mounted)) - ourborg.add_overlay("[sprite_icon_state]-laser") - if(has_taser_sprite && istype(ourborg.module_active, /obj/item/gun/energy/taser/mounted/cyborg)) - ourborg.add_overlay("[sprite_icon_state]-taser") - /datum/robot_sprite/dogborg/tall/security/raptor name = "Raptor V-4" sprite_icon_state = "raptor" has_custom_equipment_sprites = TRUE - has_laser_sprite = TRUE - has_taser_sprite = TRUE + sprite_flags = ROBOT_HAS_TASER_SPRITE | ROBOT_HAS_LASER_SPRITE rest_sprite_options = list("Default", "Bellyup") /datum/robot_sprite/dogborg/tall/security/meka diff --git a/code/modules/mob/living/silicon/robot/sprites/syndicate.dm b/code/modules/mob/living/silicon/robot/sprites/syndicate.dm index 4bc2fe54ea3..86d1a0ade3f 100644 --- a/code/modules/mob/living/silicon/robot/sprites/syndicate.dm +++ b/code/modules/mob/living/silicon/robot/sprites/syndicate.dm @@ -114,17 +114,11 @@ sprite_icon = 'icons/mob/robot/syndie_large.dmi' sprite_hud_icon_state = "malf" - var/has_gun_sprite = FALSE - -/datum/robot_sprite/dogborg/tall/protector/handle_extra_icon_updates(var/mob/living/silicon/robot/ourborg) - if(has_gun_sprite && istype (ourborg.module_active, /obj/item/gun/energy/dakkalaser)) - ourborg.add_overlay("[sprite_icon_state]-gun") - /datum/robot_sprite/dogborg/tall/protector/syndiprotraptor name = "Raptor V-4" sprite_icon_state = "syndiprotraptor" has_eye_light_sprites = TRUE - has_gun_sprite = TRUE + sprite_flags = ROBOT_HAS_GUN_SPRITE rest_sprite_options = list("Default", "Bellyup") // Mechanist diff --git a/code/modules/projectiles/guns/energy/cyborg.dm b/code/modules/projectiles/guns/energy/cyborg.dm new file mode 100644 index 00000000000..78247e1555b --- /dev/null +++ b/code/modules/projectiles/guns/energy/cyborg.dm @@ -0,0 +1,279 @@ +/// This file PRIMARILY contains guns for borgs. The key word being PRIMARILY. +/// Some things are included in here for relevence's sake (like the dogborg blade) + + +/obj/item/gun/energy/robotic/proc/gun_flag_check(var/flag_to_check) //Checks for the flag of the gun. + return (borg_flags & flag_to_check) + +/obj/item/melee/robotic/proc/weapon_flag_check(var/flag_to_check) //Checks for the flag of the gun. + return (borg_flags & flag_to_check) + +/// The base gun types. Build off these four. +/obj/item/gun/energy/robotic + name = "Cybernetic Gun" + desc = "A gun commonly used by cyborgs and other robotic lifeforms to stun" + var/borg_flags = COUNTS_AS_ROBOT_GUN //We add flags to this! + self_recharge = 1 + use_external_power = 1 + projectile_type = /obj/item/projectile/beam/lasertag //This is the base gun and should never be used. + +/obj/item/gun/energy/robotic/laser + borg_flags = COUNTS_AS_ROBOT_GUN | COUNTS_AS_ROBOT_LASER + projectile_type = /obj/item/projectile/beam + +/obj/item/gun/energy/robotic/taser + name = "Cybernetic Taser" + desc = "An integrated taser that is used to neutralize foes." + borg_flags = COUNTS_AS_ROBOT_GUN | COUNTS_AS_ROBOT_TASER + icon_state = "taser" + item_state = null //so the human update icon uses the icon_state instead. + projectile_type = /obj/item/projectile/beam/stun + charge_cost = 400 + recharge_time = 7 //Time it takes for shots to recharge (in ticks) + +/obj/item/gun/energy/robotic/disabler + borg_flags = COUNTS_AS_ROBOT_GUN | COUNTS_AS_ROBOT_DISABLER + name = "disabler" + desc = "A small and nonlethal gun produced by NT.." + icon = 'icons/mob/dogborg_vr.dmi' + icon_state = "ertgunstun" + fire_sound = 'sound/weapons/eLuger.ogg' + projectile_type = /obj/item/projectile/beam/disable + charge_cost = 240 + recharge_time = 10 + + + +/// Variant gun types + + +/// Tasers +/obj/item/gun/energy/robotic/taser/xeno + name = "xeno taser gun" + desc = "Straight out of NT's testing laboratories, this small gun is used to subdue non-humanoid xeno life forms. \ + While marketed towards handling slimes, it may be useful for other creatures." + icon_state = "taserblue" + fire_sound = 'sound/weapons/taser2.ogg' + charge_cost = 120 + projectile_type = /obj/item/projectile/beam/stun/xeno + accuracy = 30 + description_info = "This gun will stun a slime or other lesser slimy lifeform for about two seconds if hit with the projectile it fires." + description_fluff = "An easy to use weapon designed by NanoTrasen, for NanoTrasen. This weapon is based on the NT Mk30 NL, \ + it's core components swaped out for a new design made to subdue lesser slime-based xeno lifeforms at a distance. It is \ + ineffective at stunning non-slimy lifeforms such as humanoids." + recharge_time = 3 + +/obj/item/gun/energy/robotic/taser/swarm + name = "disabler" + desc = "An archaic device which attacks the target's nervous-system or control circuits." + icon_state = "disabler" + projectile_type = /obj/item/projectile/beam/stun/disabler + charge_cost = 800 + recharge_time = 5 //0.5 SECONDS + + +/// Lasers +/obj/item/gun/energy/robotic/laser/retro + name = "retro laser" + icon_state = "retro" + item_state = "retro" + desc = "A 23rd century model of the basic lasergun. Nevertheless, it is still quite deadly and easy to maintain, making it a favorite amongst pirates and other outlaws." + projectile_type = /obj/item/projectile/beam + fire_delay = 10 + +/obj/item/gun/energy/robotic/laser/rifle + name = "Mounted Laser Rifle" + desc = "A Hephaestus Industries G40E rifle, designed to kill with concentrated energy blasts. This variant has the ability to \ + switch between standard fire and a more efficent but weaker 'suppressive' fire." + description_fluff = "The leading arms producer in the SCG, Hephaestus typically only uses its 'top level' branding for its military-grade equipment used by armed forces across human space." + icon_state = "laser" + item_state = "laser" + wielded_item_state = "laser-wielded" + fire_delay = 8 + force = 10 + projectile_type = /obj/item/projectile/beam/midlaser + firemodes = list( + list(mode_name="normal", fire_delay=8, projectile_type=/obj/item/projectile/beam/midlaser, charge_cost = 240), + list(mode_name="suppressive", fire_delay=5, projectile_type=/obj/item/projectile/beam/weaklaser, charge_cost = 60), + ) + one_handed_penalty = 0 + +/obj/item/gun/energy/robotic/laser/heavy + name = "mounted laser cannon" + desc = "With the laser cannon, the lasing medium is enclosed in a tube lined with uranium-235 and subjected to high neutron \ + flux in a nuclear reactor core. This incredible technology may help YOU achieve high excitation rates with small laser volumes!" + icon_state = "lasercannon" + item_state = null + wielded_item_state = "mhdhowitzer-wielded" //Placeholder (Sure it is.) + projectile_type = /obj/item/projectile/beam/heavylaser //Fun fact: This isn't actually the normal cannon. + recharge_time = 10 + accuracy = 0 + one_handed_penalty = 0 + charge_cost = 400 + fire_delay = 20 + +/obj/item/gun/energy/robotic/laser/dakkalaser + name = "suppression gun" + desc = "A massive weapon designed to pressure the opposition by raining down a torrent of energy pellets." + icon_state = "dakkalaser" + item_state = "dakkalaser" + wielded_item_state = "dakkalaser-wielded" + charge_cost = 24 + projectile_type = /obj/item/projectile/energy/blue_pellet + cell_type = /obj/item/cell/device/weapon/recharge //This one doesn't use borg power, it has it's own power cell. I don't know why, but I'm not here to balance/unbalance it. + self_recharge = 0 //Ditto + use_external_power = 0 //Ditto + accuracy = 75 // Suppressive weapons don't work too well if there's no risk of being hit. + burst_delay = 1 // Burst faster than average. + + firemodes = list( + list(mode_name="single shot", burst = 1, burst_accuracy = list(75), dispersion = list(0), charge_cost = 24), + list(mode_name="five shot burst", burst = 5, burst_accuracy = list(75,75,75,75,75), dispersion = list(1,1,1,1,1)), + list(mode_name="ten shot burst", burst = 10, burst_accuracy = list(75,75,75,75,75,75,75,75,75,75), dispersion = list(2,2,2,2,2,2,2,2,2,2)), + ) + + +/// MELEE WEAPONS + +/obj/item/melee/robotic //Just the parent. Don't use this one. + name = "Robotic Appendage" + desc = "A robotic weapon of some sort." + icon = 'icons/mob/dogborg_vr.dmi' + icon_state = "swordtail" + var/borg_flags = COUNTS_AS_ROBOTIC_MELEE + +/obj/item/melee/robotic/jaws + icon = 'icons/mob/dogborg_vr.dmi' + hitsound = 'sound/weapons/bite.ogg' + throwforce = 0 + w_class = ITEMSIZE_NORMAL + pry = 1 + tool_qualities = list(TOOL_CROWBAR) + +/obj/item/melee/robotic/jaws/big + name = "combat jaws" + icon_state = "jaws" + desc = "The jaws of the law." + force = 25 + armor_penetration = 25 + defend_chance = 15 + attack_verb = list("chomped", "bit", "ripped", "mauled", "enforced") + +/obj/item/melee/robotic/jaws/small + name = "puppy jaws" + icon_state = "smalljaws" + desc = "The jaws of a small dog." + force = 10 + defend_chance = 5 + attack_verb = list("nibbled", "bit", "gnawed", "chomped", "nommed") + var/emagged = 0 +/obj/item/melee/robotic/jaws/small/attack_self(mob/user) + var/mob/living/silicon/robot/R = user + if(R.emagged || R.emag_items) + emagged = !emagged + if(emagged) + name = "combat jaws" + icon_state = "jaws" + desc = "The jaws of the law." + force = 25 + armor_penetration = 25 + defend_chance = 15 + attack_verb = list("chomped", "bit", "ripped", "mauled", "enforced") + else + name = "puppy jaws" + icon_state = "smalljaws" + desc = "The jaws of a small dog." + force = 10 + armor_penetration = 0 + defend_chance = 5 + attack_verb = list("nibbled", "bit", "gnawed", "chomped", "nommed") + update_icon() + + +/obj/item/melee/robotic/borg_combat_shocker + name = "combat shocker" + icon = 'icons/mob/dogborg_vr.dmi' + icon_state = "combatshocker" + desc = "Shocking!" + force = 15 + throwforce = 0 + hitsound = 'sound/weapons/genhit1.ogg' + attack_verb = list("hit") + w_class = ITEMSIZE_NORMAL + var/charge_cost = 15 + var/dogborg = FALSE + +/obj/item/melee/robotic/borg_combat_shocker/apply_hit_effect(mob/living/target, mob/living/user, var/hit_zone) + if(isrobot(target)) + return ..() + + var/agony = 60 // Copied from stun batons + var/stun = 0 // ... same + + var/obj/item/organ/external/affecting = null + if(ishuman(target)) + var/mob/living/carbon/human/H = target + affecting = H.get_organ(hit_zone) + + if(user.a_intent == I_HURT) + // Parent handles messages + . = ..() + //whacking someone causes a much poorer electrical contact than deliberately prodding them. + agony *= 0.5 + stun *= 0.5 + else + if(affecting) + if(dogborg) + target.visible_message(span_danger("[target] has been zap-chomped in the [affecting.name] with [src] by [user]!")) + else + target.visible_message(span_danger("[target] has been zapped in the [affecting.name] with [src] by [user]!")) + else + if(dogborg) + target.visible_message(span_danger("[target] has been zap-chomped with [src] by [user]!")) + else + target.visible_message(span_danger("[target] has been zapped with [src] by [user]!")) + playsound(src, 'sound/weapons/Egloves.ogg', 50, 1, -1) + + // Try to use power + var/stunning = FALSE + if(isrobot(loc)) + var/mob/living/silicon/robot/R = loc + if(R.cell?.use(charge_cost) == charge_cost) + stunning = TRUE + + if(stunning) + target.stun_effect_act(stun, agony, hit_zone, src) + msg_admin_attack("[key_name(user)] stunned [key_name(target)] with the [src].") + if(ishuman(target)) + var/mob/living/carbon/human/H = target + H.forcesay(hit_appends) + +/obj/item/melee/robotic/blade //For downstreams that use blade + name = "Robotic Blade" + desc = "A glowing blade. It appears to be extremely sharp." + borg_flags = COUNTS_AS_ROBOTIC_MELEE | COUNTS_AS_ROBOT_BLADE + icon = 'icons/mob/dogborg_vr.dmi' + icon_state = "swordtail" + force = 35 //Takes 3 hits to 100-0 + armor_penetration = 70 + sharp = TRUE + edge = TRUE + throwforce = 0 //This shouldn't be thrown in the first place. + hitsound = 'sound/weapons/blade1.ogg' + attack_verb = list("slashed", "stabbed", "jabbed", "mauled", "sliced") + w_class = ITEMSIZE_NORMAL + +/obj/item/melee/robotic/dagger //For downstreams that use dagger + name = "Robotic Dagger" + desc = "A glowing dagger. It appears to be extremely sharp." + borg_flags = COUNTS_AS_ROBOTIC_MELEE | COUNTS_AS_ROBOT_DAGGER + icon = 'icons/mob/dogborg_vr.dmi' + icon_state = "swordtail" + force = 35 //Takes 3 hits to 100-0 + armor_penetration = 70 + sharp = TRUE + edge = TRUE + throwforce = 0 //This shouldn't be thrown in the first place. + hitsound = 'sound/weapons/blade1.ogg' + attack_verb = list("slashed", "stabbed", "jabbed", "mauled", "sliced") + w_class = ITEMSIZE_NORMAL diff --git a/vorestation.dme b/vorestation.dme index 39493a0a481..696c098f4b1 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -42,6 +42,7 @@ #include "code\__defines\atoms_movable.dm" #include "code\__defines\belly_modes_vr.dm" #include "code\__defines\blueprints.dm" +#include "code\__defines\borg_overlays.dm" #include "code\__defines\callbacks.dm" #include "code\__defines\chat.dm" #include "code\__defines\chemistry.dm" @@ -3824,6 +3825,7 @@ #include "code\modules\projectiles\guns\energy\altevian_vr.dm" #include "code\modules\projectiles\guns\energy\bsharpoon_vr.dm" #include "code\modules\projectiles\guns\energy\crestrose_vr.dm" +#include "code\modules\projectiles\guns\energy\cyborg.dm" #include "code\modules\projectiles\guns\energy\dominator_vr.dm" #include "code\modules\projectiles\guns\energy\gunsword_vr.dm" #include "code\modules\projectiles\guns\energy\hooklauncher.dm"