From 6809afb45c0ea3083bc6b11266e320a519d5b570 Mon Sep 17 00:00:00 2001 From: SandPoot <43283559+SandPoot@users.noreply.github.com> Date: Tue, 15 Sep 2020 23:25:59 -0300 Subject: [PATCH] Many borg changes (seriously) (#69) --- _maps/map_files/generic/CentCom.dmm | 24 +- .../objects/items/robot/robot_upgrades.dm | 2 + .../mob/living/silicon/robot/robot_modules.dm | 33 +- .../designs/mechfabricator_designs.dm | 2 + sandcode/code/datums/ai_laws.dm | 5 + .../game/objects/items/borg_shapeshifter.dm | 669 ++++++++++++++++++ .../objects/items/robot/robot_upgrades.dm | 184 +++++ .../game/objects/items/stacks/sheets/glass.dm | 40 ++ .../objects/items/stacks/sheets/mineral.dm | 15 + .../items/stacks/sheets/sheet_types.dm | 34 + .../objects/structures/ghost_role_spawners.dm | 41 ++ .../modules/mob/living/silicon/robot/robot.dm | 21 + .../mob/living/silicon/robot/robot_modules.dm | 216 ++++++ .../reagents/reagent_containers/borghydro.dm | 128 ++++ .../designs/mechfabricator_designs.dm | 46 ++ .../research/techweb/nodes/robotics_nodes.dm | 10 + .../ruins/spaceruin_code/hilbertshotel.dm | 3 + sandcode/icons/obj/drinks.dmi | Bin 0 -> 1680 bytes sandcode/icons/obj/machines/robot_storage.dmi | Bin 0 -> 5961 bytes tgstation.dme | 10 + 20 files changed, 1451 insertions(+), 32 deletions(-) create mode 100644 sandcode/code/datums/ai_laws.dm create mode 100644 sandcode/code/game/objects/items/borg_shapeshifter.dm create mode 100644 sandcode/code/game/objects/items/stacks/sheets/glass.dm create mode 100644 sandcode/code/game/objects/items/stacks/sheets/mineral.dm create mode 100644 sandcode/code/game/objects/items/stacks/sheets/sheet_types.dm create mode 100644 sandcode/code/game/objects/structures/ghost_role_spawners.dm create mode 100644 sandcode/code/modules/mob/living/silicon/robot/robot.dm create mode 100644 sandcode/code/modules/mob/living/silicon/robot/robot_modules.dm create mode 100644 sandcode/code/modules/reagents/reagent_containers/borghydro.dm create mode 100644 sandcode/code/modules/ruins/spaceruin_code/hilbertshotel.dm create mode 100644 sandcode/icons/obj/drinks.dmi create mode 100644 sandcode/icons/obj/machines/robot_storage.dmi diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index 020017c3fe..003f02cda7 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -16621,9 +16621,7 @@ /turf/open/floor/grass, /area/centcom/holding) "Ms" = ( -/obj/effect/mob_spawn/human/ghostcafe{ - dir = 8 - }, +/obj/effect/mob_spawn/human/ghostcafe, /turf/open/indestructible/hotelwood, /area/centcom/holding) "Mt" = ( @@ -18702,6 +18700,10 @@ }, /turf/open/floor/plasteel, /area/syndicate_mothership) +"XJ" = ( +/obj/effect/mob_spawn/robot/ghostcafe, +/turf/open/indestructible/hotelwood, +/area/centcom/holding) "XL" = ( /obj/machinery/door/airlock/wood, /turf/open/floor/wood, @@ -48091,7 +48093,7 @@ Sd GY NT Tw -Ms +Sd Ro NT vt @@ -48347,9 +48349,9 @@ Nd Nd Nd Nd -Nd -Nd -Nd +Ms +Sd +XJ Nd Nd Nd @@ -48603,10 +48605,10 @@ aa aa aa aa -aa -aa -aa -aa +Nd +Nd +Nd +Nd Nd vv VA diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index 80fd177d84..7225c776c4 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -547,6 +547,7 @@ desc = "A cyborg resizer, it makes a cyborg huge." icon_state = "cyborg_upgrade3" +/* moved to sandcode /obj/item/borg/upgrade/expand/action(mob/living/silicon/robot/R, user = usr) . = ..() if(.) @@ -573,6 +574,7 @@ R.resize = 2 R.hasExpanded = TRUE R.update_transform() +*/ /obj/item/borg/upgrade/expand/deactivate(mob/living/silicon/robot/R, user = usr) . = ..() diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 8c12d747d5..101334cd7f 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -92,7 +92,7 @@ return new storage_type(src) -/obj/item/robot_module/proc/add_module(obj/item/I, nonstandard, requires_rebuild) +/* /obj/item/robot_module/proc/add_module(obj/item/I, nonstandard, requires_rebuild) rad_flags |= RAD_NO_CONTAMINATE if(istype(I, /obj/item/stack)) var/obj/item/stack/S = I @@ -141,6 +141,7 @@ if(requires_rebuild) rebuild_modules() return I +*/ //replaced by the one in sandcode //Adds flavoursome dogborg items to dogborg variants without mechanical benefits /obj/item/robot_module/proc/dogborg_equip() @@ -310,8 +311,7 @@ /obj/item/t_scanner/adv_mining_scanner, /obj/item/restraints/handcuffs/cable/zipties, /obj/item/soap/nanotrasen, - /obj/item/borg/cyborghug, - /obj/item/dildo/cyborg) + /obj/item/borg/cyborghug) emag_modules = list(/obj/item/melee/transforming/energy/sword/cyborg) ratvar_modules = list( /obj/item/clockwork/slab/cyborg, @@ -346,8 +346,7 @@ /obj/item/organ_storage, /obj/item/borg/lollipop, /obj/item/sensor_device, - /obj/item/shockpaddles/cyborg, - /obj/item/dildo/cyborg) + /obj/item/shockpaddles/cyborg) emag_modules = list(/obj/item/reagent_containers/borghypo/hacked) ratvar_modules = list( /obj/item/clockwork/slab/cyborg/medical, @@ -468,8 +467,7 @@ /obj/item/stack/sheet/rglass/cyborg, /obj/item/stack/rods/cyborg, /obj/item/stack/tile/plasteel/cyborg, - /obj/item/stack/cable_coil/cyborg, - /obj/item/dildo/cyborg) + /obj/item/stack/cable_coil/cyborg) emag_modules = list(/obj/item/borg/stun) ratvar_modules = list( /obj/item/clockwork/slab/cyborg/engineer, @@ -570,8 +568,7 @@ /obj/item/melee/baton/loaded, /obj/item/gun/energy/disabler/cyborg, /obj/item/clothing/mask/gas/sechailer/cyborg, - /obj/item/pinpointer/crew, - /obj/item/dildo/cyborg) + /obj/item/pinpointer/crew) emag_modules = list(/obj/item/gun/energy/laser/cyborg) ratvar_modules = list(/obj/item/clockwork/slab/cyborg/security, /obj/item/clockwork/weapon/ratvarian_spear) @@ -681,8 +678,7 @@ /obj/item/holosign_creator/cyborg, /obj/item/borg/cyborghug/peacekeeper, /obj/item/megaphone, - /obj/item/borg/projectile_dampen, - /obj/item/dildo/cyborg) + /obj/item/borg/projectile_dampen) emag_modules = list(/obj/item/reagent_containers/borghypo/peace/hacked) ratvar_modules = list( /obj/item/clockwork/slab/cyborg/peacekeeper, @@ -820,8 +816,7 @@ /obj/item/mop/cyborg, /obj/item/lightreplacer/cyborg, /obj/item/holosign_creator, - /obj/item/reagent_containers/spray/cyborg_drying, - /obj/item/dildo/cyborg) + /obj/item/reagent_containers/spray/cyborg_drying) emag_modules = list(/obj/item/reagent_containers/borghypo/borgshaker/hacked) ratvar_modules = list(/obj/item/clockwork/slab/cyborg/service, /obj/item/borg/sight/xray/truesight_lens) @@ -964,8 +959,7 @@ /obj/item/cyborg_clamp, /obj/item/stack/marker_beacon, /obj/item/destTagger, - /obj/item/stack/packageWrap, - /obj/item/dildo/cyborg) + /obj/item/stack/packageWrap) emag_modules = list(/obj/item/borg/stun) ratvar_modules = list( /obj/item/clockwork/slab/cyborg/miner, @@ -1051,8 +1045,7 @@ /obj/item/gun/ballistic/revolver/grenadelauncher/cyborg, /obj/item/card/emag, /obj/item/crowbar/cyborg, - /obj/item/pinpointer/syndicate_cyborg, - /obj/item/dildo/cyborg) + /obj/item/pinpointer/syndicate_cyborg) ratvar_modules = list( /obj/item/clockwork/slab/cyborg/security, @@ -1094,8 +1087,7 @@ /obj/item/pinpointer/syndicate_cyborg, /obj/item/stack/medical/gauze/cyborg, /obj/item/gun/medbeam, - /obj/item/organ_storage, - /obj/item/dildo/cyborg) + /obj/item/organ_storage) ratvar_modules = list( /obj/item/clockwork/slab/cyborg/medical, /obj/item/clockwork/weapon/ratvarian_spear) @@ -1130,8 +1122,7 @@ /obj/item/destTagger/borg, /obj/item/stack/cable_coil/cyborg, /obj/item/pinpointer/syndicate_cyborg, - /obj/item/borg_chameleon, - /obj/item/dildo/cyborg) + /obj/item/borg_chameleon) ratvar_modules = list( /obj/item/clockwork/slab/cyborg/engineer, diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm index 4efcad97ba..b863db4e46 100644 --- a/code/modules/research/designs/mechfabricator_designs.dm +++ b/code/modules/research/designs/mechfabricator_designs.dm @@ -796,6 +796,7 @@ construction_time = 120 category = list("Cyborg Upgrade Modules") +/* moved to sandcode /datum/design/borg_upgrade_expand name = "Cyborg Upgrade (Expand)" id = "borg_upgrade_expand" @@ -804,6 +805,7 @@ materials = list(/datum/material/iron=200000, /datum/material/titanium=5000) construction_time = 120 category = list("Cyborg Upgrade Modules") +*/ /datum/design/boris_ai_controller name = "B.O.R.I.S. AI-Cyborg Remote Control Module" diff --git a/sandcode/code/datums/ai_laws.dm b/sandcode/code/datums/ai_laws.dm new file mode 100644 index 0000000000..4ced25e2e4 --- /dev/null +++ b/sandcode/code/datums/ai_laws.dm @@ -0,0 +1,5 @@ +/datum/ai_laws/roleplay + name = "Roleplay" + id = "roleplay" + zeroth = "Roleplay as you'd like!" + inherent = list() diff --git a/sandcode/code/game/objects/items/borg_shapeshifter.dm b/sandcode/code/game/objects/items/borg_shapeshifter.dm new file mode 100644 index 0000000000..daa5850fc2 --- /dev/null +++ b/sandcode/code/game/objects/items/borg_shapeshifter.dm @@ -0,0 +1,669 @@ +/obj/item/borg_shapeshifter + name = "cyborg chameleon projector" + icon = 'icons/obj/device.dmi' + icon_state = "shield0" + flags_1 = CONDUCT_1 + item_flags = NOBLUDGEON + item_state = "electronic" + lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' + righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' + w_class = WEIGHT_CLASS_SMALL + var/friendlyName + var/savedName + var/savedIcon + var/savedBubbleIcon + var/savedOverride + var/savedPixelOffset + var/savedModuleName + var/active = FALSE + var/activationCost = 150 + var/activationUpkeep = 5 + var/disguise = null + var/disguise_icon_override = null + var/disguise_pixel_offset = null + var/disguise_dogborg = FALSE + var/mob/listeningTo + var/list/signalCache = list( // list here all signals that should break the camouflage + COMSIG_PARENT_ATTACKBY, + COMSIG_ATOM_ATTACK_HAND, + COMSIG_MOVABLE_IMPACT_ZONE, + COMSIG_ATOM_BULLET_ACT, + COMSIG_ATOM_EX_ACT, + COMSIG_ATOM_FIRE_ACT, + COMSIG_ATOM_EMP_ACT, + ) + var/mob/living/silicon/robot/user // needed for process() + var/animation_playing = FALSE + var/list/borgmodels = list( + "(Standard) Default", + "(Standard) Heavy", + "(Standard) Sleek", + "(Standard) Marina", + "(Standard) Robot", + "(Standard) Eyebot", + "(Medical) Default", + "(Medical) Heavy", + "(Medical) Sleek", + "(Medical) Marina", + "(Medical) Droid", + "(Medical) Eyebot", + "(Medical) Medihound", + "(Medical) Medihound Dark", + "(Medical) Vale", + "(Engineering) Default", + "(Engineering) Default - Treads", + "(Engineering) Loader", + "(Engineering) Handy", + "(Engineering) Sleek", + "(Engineering) Can", + "(Engineering) Marina", + "(Engineering) Spider", + "(Engineering) Heavy", + "(Miner) Lavaland", + "(Miner) Asteroid", + "(Miner) Droid", + "(Miner) Sleek", + "(Miner) Marina", + "(Miner) Can", + "(Miner) Heavy", + "(Service) Waitress", + "(Service) Butler", + "(Service) Bro", + "(Service) Can", + "(Service) Tophat", + "(Service) Sleek", + "(Service) Heavy", + "(Janitor) Default", + "(Janitor) Marina", + "(Janitor) Sleek", + "(Janitor) Can") + +/obj/item/borg_shapeshifter/Initialize() + . = ..() + friendlyName = pick(GLOB.ai_names) + +/obj/item/borg_shapeshifter/Destroy() + return ..() + +/obj/item/borg_shapeshifter/dropped(mob/user) + . = ..() + disrupt(user) + +/obj/item/borg_shapeshifter/equipped(mob/user) + . = ..() + disrupt(user) + +/** + * check_menu: Checks if we are allowed to interact with a radial menu + * + * Arguments: + * * user The mob interacting with a menu + */ +/obj/item/borg_shapeshifter/proc/check_menu(mob/user) + if(!istype(user)) + return FALSE + if(user.incapacitated() || !user.Adjacent(src)) + return FALSE + return TRUE + +/obj/item/borg_shapeshifter/attack_self(mob/living/silicon/robot/user) + if (user && user.cell && user.cell.charge > activationCost) + if (isturf(user.loc)) + toggle(user) + else + to_chat(user, "You can't use [src] while inside something!") + else + to_chat(user, "You need at least [activationCost] charge in your cell to use [src]!") + +/obj/item/borg_shapeshifter/proc/toggle(mob/living/silicon/robot/user) + if(active) + playsound(src, 'sound/effects/pop.ogg', 100, TRUE, -6) + to_chat(user, "You deactivate \the [src].") + deactivate(user) + else + if(animation_playing) + to_chat(user, "\the [src] is recharging.") + return + var/mob/living/silicon/robot/R = loc + var/static/list/module_icons = sortList(list( + "Standard" = image(icon = 'icons/mob/robots.dmi', icon_state = "robot"), + "Medical" = image(icon = 'icons/mob/robots.dmi', icon_state = "medical"), + "Engineer" = image(icon = 'icons/mob/robots.dmi', icon_state = "engineer"), + "Security" = image(icon = 'icons/mob/robots.dmi', icon_state = "sec"), + "Service" = image(icon = 'icons/mob/robots.dmi', icon_state = "service_f"), + "Miner" = image(icon = 'icons/mob/robots.dmi', icon_state = "miner"), + "Peacekeeper" = image(icon = 'icons/mob/robots.dmi', icon_state = "peace"), + "Clown" = image(icon = 'icons/mob/robots.dmi', icon_state = "clown"), + "Syndicate" = image(icon = 'icons/mob/robots.dmi', icon_state = "synd_sec") + )) + var/module_selection = show_radial_menu(R, R , module_icons, custom_check = CALLBACK(src, .proc/check_menu, R), radius = 42, require_near = TRUE) + if(!module_selection) + return FALSE + + switch(module_selection) + if("Standard") + var/static/list/standard_icons = sortList(list( + "Default" = image(icon = 'icons/mob/robots.dmi', icon_state = "robot") + )) + var/borg_icon = show_radial_menu(R, R , standard_icons, custom_check = CALLBACK(src, .proc/check_menu, R), radius = 42, require_near = TRUE) + if(!borg_icon) + return FALSE + switch(borg_icon) + if("Default") + disguise = "robot" + disguise_icon_override = 'icons/mob/robots.dmi' + else + return FALSE + + if("Medical") + var/static/list/med_icons = list( + "Default" = image(icon = 'icons/mob/robots.dmi', icon_state = "medical"), + "Droid" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "medical"), + "Sleek" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "sleekmed"), + "Marina" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "marinamed"), + "Eyebot" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "eyebotmed"), + "Heavy" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "heavymed"), + "Drake" = image(icon = 'sandcode/icons/mob/cyborg/drakemech.dmi', icon_state = "drakemedbox") + ) + var/list/L = list("Medihound" = "medihound", "Medihound Dark" = "medihounddark", "Vale" = "valemed") + for(var/a in L) + var/image/wide = image(icon = 'modular_citadel/icons/mob/widerobot.dmi', icon_state = L[a]) + wide.pixel_x = -16 + med_icons[a] = wide + med_icons = sortList(med_icons) + var/borg_icon = show_radial_menu(R, R , med_icons, custom_check = CALLBACK(src, .proc/check_menu, R), radius = 42, require_near = TRUE) + if(!borg_icon) + return FALSE + switch(borg_icon) + if("Default") + disguise = "medical" + disguise_icon_override = 'icons/mob/robots.dmi' + if("Droid") + disguise = "medical" + disguise_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("Sleek") + disguise = "sleekmed" + disguise_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("Marina") + disguise = "marinamed" + disguise_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("Eyebot") + disguise = "eyebotmed" + disguise_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("Heavy") + disguise = "heavymed" + disguise_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("Medihound") + disguise = "medihound" + disguise_icon_override = 'modular_citadel/icons/mob/widerobot.dmi' + disguise_pixel_offset = -16 + disguise_dogborg = TRUE + if("Medihound Dark") + disguise = "medihounddark" + disguise_icon_override = 'modular_citadel/icons/mob/widerobot.dmi' + disguise_pixel_offset = -16 + disguise_dogborg = TRUE + if("Vale") + disguise = "valemed" + disguise_icon_override = 'modular_citadel/icons/mob/widerobot.dmi' + disguise_pixel_offset = -16 + disguise_dogborg = TRUE + if("Drake") + disguise = "drakemed" + disguise_icon_override = 'sandcode/icons/mob/cyborg/drakemech.dmi' + disguise_pixel_offset = -16 + disguise_dogborg = TRUE + else + return FALSE + + if("Engineer") + var/static/list/engi_icons = list( + "Default" = image(icon = 'icons/mob/robots.dmi', icon_state = "engineer"), + "Default - Treads" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "engi-tread"), + "Loader" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "loaderborg"), + "Handy" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "handyeng"), + "Sleek" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "sleekeng"), + "Can" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "caneng"), + "Marina" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "marinaeng"), + "Spider" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "spidereng"), + "Heavy" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "heavyeng"), + "Drake" = image(icon = 'sandcode/icons/mob/cyborg/drakemech.dmi', icon_state = "drakeengbox") + ) + var/list/L = list("Pup Dozer" = "pupdozer", "Vale" = "valeeng") + for(var/a in L) + var/image/wide = image(icon = 'modular_citadel/icons/mob/widerobot.dmi', icon_state = L[a]) + wide.pixel_x = -16 + engi_icons[a] = wide + engi_icons = sortList(engi_icons) + var/borg_icon = show_radial_menu(R, R , engi_icons, custom_check = CALLBACK(src, .proc/check_menu, R), radius = 42, require_near = TRUE) + if(!borg_icon) + return FALSE + switch(borg_icon) + if("Default") + disguise = "engineer" + disguise_icon_override = 'icons/mob/robots.dmi' + if("Default - Treads") + disguise = "engi-tread" + disguise_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("Loader") + disguise = "loaderborg" + disguise_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("Handy") + disguise = "handyeng" + disguise_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("Sleek") + disguise = "sleekeng" + disguise_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("Can") + disguise = "caneng" + disguise_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("Marina") + disguise = "marinaeng" + disguise_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("Spider") + disguise = "spidereng" + disguise_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("Heavy") + disguise = "heavyeng" + disguise_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("Pup Dozer") + disguise = "pupdozer" + disguise_icon_override = 'modular_citadel/icons/mob/widerobot.dmi' + disguise_pixel_offset = -16 + disguise_dogborg = TRUE + if("Vale") + disguise = "valeeng" + disguise_icon_override = 'modular_citadel/icons/mob/widerobot.dmi' + disguise_pixel_offset = -16 + disguise_dogborg = TRUE + if("Alina") + disguise = "alina-eng" + disguise_icon_override = 'modular_citadel/icons/mob/widerobot.dmi' + disguise_pixel_offset = -16 + disguise_dogborg = TRUE + if("Drake") + disguise = "drakeeng" + disguise_icon_override = 'sandcode/icons/mob/cyborg/drakemech.dmi' + disguise_pixel_offset = -16 + disguise_dogborg = TRUE + else + return FALSE + if("Security") + var/static/list/sec_icons = list( + "Default" = image(icon = 'icons/mob/robots.dmi', icon_state = "sec"), + "Default - Treads" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "sec-tread"), + "Sleek" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "sleeksec"), + "Can" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "cansec"), + "Marina" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "marinasec"), + "Spider" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "spidersec"), + "Heavy" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "heavysec"), + "Drake" = image(icon = 'sandcode/icons/mob/cyborg/drakemech.dmi', icon_state = "drakesecbox") + ) + var/list/L = list("K9" = "k9", "Vale" = "valesec", "K9 Dark" = "k9dark") + for(var/a in L) + var/image/wide = image(icon = 'modular_citadel/icons/mob/widerobot.dmi', icon_state = L[a]) + wide.pixel_x = -16 + sec_icons[a] = wide + sec_icons = sortList(sec_icons) + var/borg_icon = show_radial_menu(R, R , sec_icons, custom_check = CALLBACK(src, .proc/check_menu, R), radius = 42, require_near = TRUE) + if(!borg_icon) + return FALSE + switch(borg_icon) + if("Default") + disguise = "sec" + disguise_icon_override = 'icons/mob/robots.dmi' + if("Default - Treads") + disguise = "sec-tread" + disguise_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("Sleek") + disguise = "sleeksec" + disguise_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("Marina") + disguise = "marinasec" + disguise_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("Can") + disguise = "cansec" + disguise_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("Spider") + disguise = "spidersec" + disguise_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("Heavy") + disguise = "heavysec" + disguise_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("K9") + disguise = "k9" + disguise_icon_override = 'modular_citadel/icons/mob/widerobot.dmi' + disguise_pixel_offset = -16 + disguise_dogborg = TRUE + if("Alina") + disguise = "alina-sec" + disguise_icon_override = 'modular_citadel/icons/mob/widerobot.dmi' + disguise_pixel_offset = -16 + disguise_dogborg = TRUE + if("K9 Dark") + disguise = "k9dark" + disguise_icon_override = 'modular_citadel/icons/mob/widerobot.dmi' + disguise_pixel_offset = -16 + disguise_dogborg = TRUE + if("Vale") + disguise = "valesec" + disguise_icon_override = 'modular_citadel/icons/mob/widerobot.dmi' + disguise_pixel_offset = -16 + disguise_dogborg = TRUE + if("Drake") + disguise = "drakesec" + disguise_icon_override = 'sandcode/icons/mob/cyborg/drakemech.dmi' + disguise_pixel_offset = -16 + disguise_dogborg = TRUE + else + return FALSE + if("Service") + var/static/list/service_icons = list( + "(Service) Waitress" = image(icon = 'icons/mob/robots.dmi', icon_state = "service_f"), + "(Service) Butler" = image(icon = 'icons/mob/robots.dmi', icon_state = "service_m"), + "(Service) Bro" = image(icon = 'icons/mob/robots.dmi', icon_state = "brobot"), + "(Service) Can" = image(icon = 'icons/mob/robots.dmi', icon_state = "kent"), + "(Service) Tophat" = image(icon = 'icons/mob/robots.dmi', icon_state = "tophat"), + "(Service) Sleek" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "sleekserv"), + "(Service) Heavy" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "heavyserv"), + "(Janitor) Default" = image(icon = 'icons/mob/robots.dmi', icon_state = "janitor"), + "(Janitor) Marina" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "marinajan"), + "(Janitor) Sleek" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "sleekjan"), + "(Janitor) Can" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "canjan"), + "(Janitor) Heavy" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "heavyres"), + "(Janitor) Drake" = image(icon = 'sandcode/icons/mob/cyborg/drakemech.dmi', icon_state = "drakejanitbox") + ) + var/list/L = list("(Service) DarkK9" = "k50", "(Service) Vale" = "valeserv", "(Service) ValeDark" = "valeservdark", + "(Janitor) Scrubpuppy" = "scrubpup") + for(var/a in L) + var/image/wide = image(icon = 'modular_citadel/icons/mob/widerobot.dmi', icon_state = L[a]) + wide.pixel_x = -16 + service_icons[a] = wide + service_icons = sortList(service_icons) + var/borg_icon = show_radial_menu(R, R , service_icons, custom_check = CALLBACK(src, .proc/check_menu, R), radius = 42, require_near = TRUE) + if(!borg_icon) + return FALSE + switch(borg_icon) + if("(Service) Waitress") + disguise = "service_f" + disguise_icon_override = 'icons/mob/robots.dmi' + if("(Service) Butler") + disguise = "service_m" + disguise_icon_override = 'icons/mob/robots.dmi' + if("(Service) Bro") + disguise = "brobot" + disguise_icon_override = 'icons/mob/robots.dmi' + if("(Service) Can") + disguise = "kent" + disguise_icon_override = 'icons/mob/robots.dmi' + if("(Service) Tophat") + disguise = "tophat" + disguise_icon_override = 'icons/mob/robots.dmi' + if("(Service) Sleek") + disguise = "sleekserv" + disguise_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("(Service) Heavy") + disguise = "heavyserv" + disguise_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("(Service) DarkK9") + disguise = "k50" + disguise_icon_override = 'modular_citadel/icons/mob/widerobot.dmi' + disguise_pixel_offset = -16 + disguise_dogborg = TRUE + if("(Service) Vale") + disguise = "valeserv" + disguise_icon_override = 'modular_citadel/icons/mob/widerobot.dmi' + disguise_pixel_offset = -16 + disguise_dogborg = TRUE + if("(Service) ValeDark") + disguise = "valeservdark" + disguise_icon_override = 'modular_citadel/icons/mob/widerobot.dmi' + disguise_pixel_offset = -16 + disguise_dogborg = TRUE + if("(Janitor) Default") + disguise = "janitor" + disguise_icon_override = 'icons/mob/robots.dmi' + if("(Janitor) Marina") + disguise = "marinajan" + disguise_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("(Janitor) Sleek") + disguise = "sleekjan" + disguise_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("(Janitor) Can") + disguise = "canjan" + disguise_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("(Janitor) Heavy") + disguise = "heavyres" + disguise_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("(Janitor) Scrubpuppy") + disguise = "scrubpup" + disguise_icon_override = 'modular_citadel/icons/mob/widerobot.dmi' + disguise_pixel_offset = -16 + disguise_dogborg = TRUE + if("(Janitor) Drake") + disguise = "drakejanit" + disguise_icon_override = 'sandcode/icons/mob/cyborg/drakemech.dmi' + disguise_pixel_offset = -16 + disguise_dogborg = TRUE + else + return FALSE + if("Miner") + var/static/list/mining_icons = list( + "Lavaland" = image(icon = 'icons/mob/robots.dmi', icon_state = "miner"), + "Asteroid" = image(icon = 'icons/mob/robots.dmi', icon_state = "minerOLD"), + "Droid" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "miner"), + "Sleek" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "sleekmin"), + "Marina" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "marinamin"), + "Can" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "canmin"), + "Heavy" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "heavymin"), + "Drake" = image(icon = 'sandcode/icons/mob/cyborg/drakemech.dmi', icon_state = "drakeminebox") + ) + var/list/L = list("Blade" = "blade", "Vale" = "valemine") + for(var/a in L) + var/image/wide = image(icon = 'modular_citadel/icons/mob/widerobot.dmi', icon_state = L[a]) + wide.pixel_x = -16 + mining_icons[a] = wide + mining_icons = sortList(mining_icons) + var/borg_icon = show_radial_menu(R, R , mining_icons, custom_check = CALLBACK(src, .proc/check_menu, R), radius = 42, require_near = TRUE) + if(!borg_icon) + return FALSE + switch(borg_icon) + if("Lavaland") + disguise = "miner" + disguise_icon_override = 'icons/mob/robots.dmi' + if("Asteroid") + disguise = "minerOLD" + disguise_icon_override = 'icons/mob/robots.dmi' + if("Droid") + disguise = "miner" + disguise_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("Sleek") + disguise = "sleekmin" + disguise_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("Can") + disguise = "canmin" + disguise_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("Marina") + disguise = "marinamin" + disguise_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("Spider") + disguise = "spidermin" + disguise_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("Heavy") + disguise = "heavymin" + disguise_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("Blade") + disguise = "blade" + disguise_icon_override = 'modular_citadel/icons/mob/widerobot.dmi' + disguise_pixel_offset = -16 + disguise_dogborg = TRUE + if("Vale") + disguise = "valemine" + disguise_icon_override = 'modular_citadel/icons/mob/widerobot.dmi' + disguise_pixel_offset = -16 + disguise_dogborg = TRUE + if("Drake") + disguise = "drakemine" + disguise_icon_override = 'sandcode/icons/mob/cyborg/drakemech.dmi' + disguise_pixel_offset = -16 + disguise_dogborg = TRUE + else + return FALSE + if("Peacekeeper") + var/static/list/peace_icons = sortList(list( + "Default" = image(icon = 'icons/mob/robots.dmi', icon_state = "peace"), + "Borgi" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "borgi"), + "Spider" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "whitespider"), + "Drake" = image(icon = 'sandcode/icons/mob/cyborg/drakemech.dmi', icon_state = "drakepeacebox") + )) + var/borg_icon = show_radial_menu(R, R , peace_icons, custom_check = CALLBACK(src, .proc/check_menu, R), radius = 42, require_near = TRUE) + if(!borg_icon) + return FALSE + switch(borg_icon) + if("Default") + disguise = "peace" + disguise_icon_override = 'icons/mob/robots.dmi' + if("Spider") + disguise = "whitespider" + disguise_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("Borgi") + disguise = "borgi" + disguise_icon_override = 'modular_citadel/icons/mob/robots.dmi' + if("Drake") + disguise = "drakepeace" + disguise_icon_override = 'sandcode/icons/mob/cyborg/drakemech.dmi' + disguise_pixel_offset = -16 + disguise_dogborg = TRUE + else + return FALSE + if("Clown") + var/static/list/clown_icons = sortList(list( + "Default" = image(icon = 'icons/mob/robots.dmi', icon_state = "clown") + )) + var/borg_icon = show_radial_menu(R, R , clown_icons, custom_check = CALLBACK(src, .proc/check_menu, R), radius = 42, require_near = TRUE) + if(!borg_icon) + return FALSE + switch(borg_icon) + if("Default") + disguise = "clown" + disguise_icon_override = 'icons/mob/robots.dmi' + else + return FALSE + if("Syndicate") + var/static/list/syndicatejack_icons = sortList(list( + "Saboteur" = image(icon = 'icons/mob/robots.dmi', icon_state = "synd_engi"), + "Medical" = image(icon = 'icons/mob/robots.dmi', icon_state = "synd_medical"), + "Assault" = image(icon = 'icons/mob/robots.dmi', icon_state = "synd_sec") + )) + var/borg_icon = show_radial_menu(R, R , syndicatejack_icons, custom_check = CALLBACK(src, .proc/check_menu, R), radius = 42, require_near = TRUE) + if(!borg_icon) + return FALSE + switch(borg_icon) + if("Saboteur") + disguise = "synd_engi" + disguise_icon_override = 'icons/mob/robots.dmi' + if("Medical") + disguise = "synd_medical" + disguise_icon_override = 'icons/mob/robots.dmi' + if("Assault") + disguise = "synd_sec" + disguise_icon_override = 'icons/mob/robots.dmi' + else + return FALSE + else + return FALSE + + animation_playing = TRUE + to_chat(user, "You activate \the [src].") + playsound(src, 'sound/effects/seedling_chargeup.ogg', 100, TRUE, -6) + var/start = user.filters.len + var/X,Y,rsq,i,f + for(i=1, i<=7, ++i) + do + X = 60*rand() - 30 + Y = 60*rand() - 30 + rsq = X*X + Y*Y + while(rsq<100 || rsq>900) + user.filters += filter(type="wave", x=X, y=Y, size=rand()*2.5+0.5, offset=rand()) + for(i=1, i<=7, ++i) + f = user.filters[start+i] + animate(f, offset=f:offset, time=0, loop=3, flags=ANIMATION_PARALLEL) + animate(offset=f:offset-1, time=rand()*20+10) + if (do_after(user, 50, target=user) && user.cell.use(activationCost)) + playsound(src, 'sound/effects/bamf.ogg', 100, TRUE, -6) + to_chat(user, "You are now disguised as the Nanotrasen cyborg \"[friendlyName]\".") + activate(user, module_selection) + else + to_chat(user, "The chameleon field fizzles.") + do_sparks(3, FALSE, user) + for(i=1, i<=min(7, user.filters.len), ++i) // removing filters that are animating does nothing, we gotta stop the animations first + f = user.filters[start+i] + animate(f) + user.filters = null + animation_playing = FALSE + +/obj/item/borg_shapeshifter/process() + if (user) + if (!user.cell || !user.cell.use(activationUpkeep)) + disrupt(user) + else + return PROCESS_KILL + +/obj/item/borg_shapeshifter/proc/activate(mob/living/silicon/robot/user, disguiseModuleName) + START_PROCESSING(SSobj, src) + src.user = user + savedName = user.name + savedIcon = user.module.cyborg_base_icon + savedBubbleIcon = user.bubble_icon //tf is that + savedOverride = user.module.cyborg_icon_override + savedPixelOffset = user.module.cyborg_pixel_offset + savedModuleName = user.module.name + user.name = friendlyName + user.module.name = disguiseModuleName + user.module.cyborg_base_icon = disguise + user.module.cyborg_icon_override = disguise_icon_override + user.module.cyborg_pixel_offset = disguise_pixel_offset + user.module.dogborg = disguise_dogborg + user.bubble_icon = "robot" + active = TRUE + user.update_icons() + + if(listeningTo == user) + return + if(listeningTo) + UnregisterSignal(listeningTo, signalCache) + RegisterSignal(user, signalCache, .proc/disrupt) + listeningTo = user + +/obj/item/borg_shapeshifter/proc/deactivate(mob/living/silicon/robot/user) + STOP_PROCESSING(SSobj, src) + if(listeningTo) + UnregisterSignal(listeningTo, signalCache) + listeningTo = null + do_sparks(5, FALSE, user) + user.name = savedName + user.module.name = savedModuleName + user.module.cyborg_base_icon = savedIcon + user.module.cyborg_icon_override = savedOverride + user.module.cyborg_pixel_offset = 0 + user.module.dogborg = FALSE + user.bubble_icon = savedBubbleIcon + active = FALSE + user.update_icons() + disguise_pixel_offset = 0 + disguise_dogborg = FALSE + src.user = user + +/obj/item/borg_shapeshifter/proc/disrupt(mob/living/silicon/robot/user) + if(active) + to_chat(user, "Your chameleon field deactivates.") + deactivate(user) + +/obj/item/borg_shapeshifter/stable + signalCache = list() + activationCost = 0 + activationUpkeep = 0 + +/obj/item/borg_shapeshifter/stable/activate(mob/living/silicon/robot/user, disguiseModuleName) + friendlyName = user.name + . = ..() diff --git a/sandcode/code/game/objects/items/robot/robot_upgrades.dm b/sandcode/code/game/objects/items/robot/robot_upgrades.dm index 1664200e60..888fd67747 100644 --- a/sandcode/code/game/objects/items/robot/robot_upgrades.dm +++ b/sandcode/code/game/objects/items/robot/robot_upgrades.dm @@ -1,3 +1,68 @@ +/obj/item/borg/upgrade/xwelding + name = "engineering cyborg experimental welding tool" + desc = "An experimental welding tool replacement for the engineering module's standard welding tool." + icon_state = "cyborg_upgrade3" + require_module = 1 + module_type = list(/obj/item/robot_module/engineering) + +/obj/item/borg/upgrade/xwelding/action(mob/living/silicon/robot/R, user = usr) + . = ..() + if(.) + var/obj/item/weldingtool/largetank/cyborg/WT = locate() in R + var/obj/item/weldingtool/experimental/XW = locate() in R + if(!WT) + WT = locate() in R.module + if(!XW) + XW = locate() in R.module + if(XW) + to_chat(user, "This unit is already equipped with an experimental welding tool module.") + return FALSE + XW = new(R.module) + qdel(WT) + R.module.basic_modules += XW + R.module.add_module(XW, FALSE, TRUE) + +/obj/item/borg/upgrade/xwelding/deactivate(mob/living/silicon/robot/R, user = usr) + . = ..() + if (.) + for(var/obj/item/weldingtool/experimental/XW in R.module) + R.module.remove_module(XW, TRUE) + + var/obj/item/weldingtool/largetank/cyborg/WT = new (R.module) + R.module.basic_modules += WT + R.module.add_module(WT, FALSE, TRUE) + +/* Shit doesnt work, work on it later +/obj/item/borg/upgrade/plasma + name = "engineering cyborg plasma resource upgrade" + desc = "An upgrade that allows cyborgs the ability to use plasma and assorted plasma products." + icon_state = "cyborg_upgrade3" + require_module = 1 + module_type = list(/obj/item/robot_module/engineering) +*/ + +/* Shit doesnt work, do it later +/obj/item/borg/upgrade/plasma/action(mob/living/silicon/robot/R, user = usr) + . = ..() + if(.) + R.module.basic_modules += /obj/item/stack/sheet/plasmaglass/cyborg + R.module.add_module(/obj/item/stack/sheet/plasmaglass/cyborg, FALSE, TRUE) + R.module.basic_modules += /obj/item/stack/sheet/plasmarglass/cyborg + R.module.add_module(/obj/item/stack/sheet/plasmarglass/cyborg, FALSE, TRUE) + R.module.basic_modules += /obj/item/stack/sheet/plasteel/cyborg + R.module.add_module(/obj/item/stack/sheet/plasteel/cyborg, FALSE, TRUE) + R.module.basic_modules += /obj/item/stack/sheet/mineral/plasma/cyborg + R.module.add_module(/obj/item/stack/sheet/mineral/plasma/cyborg, FALSE, TRUE) + +/obj/item/borg/upgrade/plasma/deactivate(mob/living/silicon/robot/R, user = usr) + . = ..() + if (.) + R.module.remove_module(/obj/item/stack/sheet/plasmaglass/cyborg, TRUE) + R.module.remove_module(/obj/item/stack/sheet/plasmarglass/cyborg, TRUE) + R.module.remove_module(/obj/item/stack/sheet/plasteel/cyborg, TRUE) + R.module.remove_module(/obj/item/stack/sheet/mineral/plasma/cyborg, TRUE) +*/ + /obj/item/borg/upgrade/bsrpd name = "engineering cyborg bluespace RPD" desc = "A bluespace RPD replacement for the engineering module's standard RPD." @@ -32,3 +97,122 @@ var/obj/item/pipe_dispenser/PD = new (R.module) R.module.basic_modules += PD R.module.add_module(PD, FALSE, TRUE) + +/obj/item/borg/upgrade/premiumka + name = "mining cyborg premium KA" + desc = "A premium kinetic accelerator replacement for the mining module's standard kinetic accelerator." + icon_state = "cyborg_upgrade3" + require_module = 1 + module_type = list(/obj/item/robot_module/miner) + +/obj/item/borg/upgrade/premiumka/action(mob/living/silicon/robot/R, user = usr) + . = ..() + if(.) + for(var/obj/item/gun/energy/kinetic_accelerator/cyborg/KA in R.module) + for(var/obj/item/borg/upgrade/modkit/M in KA.modkits) + M.uninstall(src) + R.module.remove_module(KA, TRUE) + + var/obj/item/gun/energy/kinetic_accelerator/premiumka/cyborg/PKA = new /obj/item/gun/energy/kinetic_accelerator/premiumka/cyborg(R.module) + R.module.basic_modules += PKA + R.module.add_module(PKA, FALSE, TRUE) + +/obj/item/borg/upgrade/premiumka/deactivate(mob/living/silicon/robot/R, user = usr) + . = ..() + if (.) + for(var/obj/item/gun/energy/kinetic_accelerator/premiumka/cyborg/PKA in R.module) + for(var/obj/item/borg/upgrade/modkit/M in PKA.modkits) + M.uninstall(src) + R.module.remove_module(PKA, TRUE) + + var/obj/item/gun/energy/kinetic_accelerator/cyborg/KA = new (R.module) + R.module.basic_modules += KA + R.module.add_module(KA, FALSE, TRUE) + +/obj/item/borg/upgrade/expand/action(mob/living/silicon/robot/R, user = usr) + . = ..() + if(.) + + if(R.hasExpanded) + to_chat(usr, "This unit already has an expand module installed!") + return FALSE + + if(R.hasShrunk) + to_chat(usr, "This unit already has an shrink module installed!") + return FALSE + + R.mob_transforming = TRUE + var/prev_locked_down = R.locked_down + R.SetLockdown(1) + R.anchored = TRUE + var/datum/effect_system/smoke_spread/smoke = new + smoke.set_up(1, R.loc) + smoke.start() + sleep(2) + for(var/i in 1 to 4) + playsound(R, pick('sound/items/drill_use.ogg', 'sound/items/jaws_cut.ogg', 'sound/items/jaws_pry.ogg', 'sound/items/welder.ogg', 'sound/items/ratchet.ogg'), 80, 1, -1) + sleep(12) + if(!prev_locked_down) + R.SetLockdown(0) + R.anchored = FALSE + R.mob_transforming = FALSE + R.transform = R.transform.Scale(1.25, 1.25) + R.hasExpanded = TRUE + +/obj/item/borg/upgrade/expand/deactivate(mob/living/silicon/robot/R, user = usr) + . = ..() + if (.) + R.transform = R.transform.Scale(0.8, 0.8) + R.hasExpanded = FALSE + +/obj/item/borg/upgrade/shrink + name = "borg shrinker" + desc = "A cyborg resizer, it makes a cyborg small." + icon_state = "cyborg_upgrade3" + +/obj/item/borg/upgrade/shrink/action(mob/living/silicon/robot/R, user = usr) + . = ..() + if(.) + + if(R.hasShrunk) + to_chat(usr, "This unit already has an shrink module installed!") + return FALSE + + if(R.hasExpanded) + to_chat(usr, "This unit already has an expand module installed!") + return FALSE + + + R.mob_transforming = TRUE + var/prev_locked_down = R.locked_down + R.SetLockdown(1) + R.anchored = TRUE + var/datum/effect_system/smoke_spread/smoke = new + smoke.set_up(1, R.loc) + smoke.start() + sleep(2) + for(var/i in 1 to 4) + playsound(R, pick('sound/items/drill_use.ogg', 'sound/items/jaws_cut.ogg', 'sound/items/jaws_pry.ogg', 'sound/items/welder.ogg', 'sound/items/ratchet.ogg'), 80, 1, -1) + sleep(12) + if(!prev_locked_down) + R.SetLockdown(0) + R.anchored = FALSE + R.mob_transforming = FALSE + R.transform = R.transform.Scale(0.75, 0.75) + R.hasShrunk = TRUE + +/obj/item/borg/upgrade/shrink/deactivate(mob/living/silicon/robot/R, user = usr) + . = ..() + if (.) + R.transform = R.transform.Scale((4/3), (4/3)) + R.hasShrunk = FALSE + +/obj/item/borg/upgrade/transform/syndicatejack + name = "borg module picker (Syndicate)" + desc = "Allows you to to turn a cyborg into a experimental syndicate cyborg." + icon_state = "cyborg_upgrade3" + new_module = /obj/item/robot_module/syndicatejack + +/obj/item/borg/upgrade/transform/syndicatejack/action(mob/living/silicon/robot/R, user = usr) + if(R.emagged) + return ..() diff --git a/sandcode/code/game/objects/items/stacks/sheets/glass.dm b/sandcode/code/game/objects/items/stacks/sheets/glass.dm new file mode 100644 index 0000000000..b8080cc825 --- /dev/null +++ b/sandcode/code/game/objects/items/stacks/sheets/glass.dm @@ -0,0 +1,40 @@ +/obj/item/stack/sheet/plasmaglass/cyborg + custom_materials = null + //var/datum/robot_energy_storage/glasource + //var/datum/robot_energy_storage/plasource + //var/glacost = 250 + //var/placost = 250 + cost = 500 + is_cyborg = 1 +/* commented out to pick shit up +/obj/item/stack/sheet/plasmaglass/cyborg/get_amount() + return min(round(plasource.energy / placost), round(glasource.energy / glacost)) + +/obj/item/stack/sheet/plasmaglass/cyborg/use(used, transfer = FALSE) // Requires special checks, because it uses two storages + plasource.use_charge(used * placost) + glasource.use_charge(used * glacost) + +/obj/item/stack/sheet/plasmaglass/cyborg/add(amount) + plasource.add_charge(amount * placost) + glasource.add_charge(amount * glacost) +*/ +/obj/item/stack/sheet/plasmarglass/cyborg + custom_materials = null + //var/datum/robot_energy_storage/glasource + //var/datum/robot_energy_storage/plasource + //var/glacost = 500 + //var/placost = 500 + cost = 1000 + is_cyborg = 1 +/* commented out to pick shit up +/obj/item/stack/sheet/plasmarglass/cyborg/get_amount() + return min(round(glasource.energy / glacost), round(plasource.energy / placost)) + +/obj/item/stack/sheet/plasmarglass/cyborg/use(used, transfer = FALSE) // Requires special checks, because it uses two storages + glasource.use_charge(used * glacost) + plasource.use_charge(used * placost) + +/obj/item/stack/sheet/plasmarglass/cyborg/add(amount) + glasource.add_charge(amount * glacost) + plasource.add_charge(amount * placost) +*/ diff --git a/sandcode/code/game/objects/items/stacks/sheets/mineral.dm b/sandcode/code/game/objects/items/stacks/sheets/mineral.dm new file mode 100644 index 0000000000..0ac8a622fd --- /dev/null +++ b/sandcode/code/game/objects/items/stacks/sheets/mineral.dm @@ -0,0 +1,15 @@ +/obj/item/stack/sheet/mineral/plasma/cyborg + custom_materials = null + is_cyborg = 1 + cost = 500 + +/obj/item/stack/sheet/mineral/plasma/cyborg/attackby(obj/item/W as obj, mob/user as mob, params) + if(W.get_temperature() > 9999)//If the temperature of the object is over 9999, then ignite + var/turf/T = get_turf(src) + message_admins("Plasma sheets attempted to be ignited by [ADMIN_LOOKUPFLW(user)] in [ADMIN_VERBOSEJMP(T)]") + log_game("Plasma sheets attempted to be ignited by [key_name(user)] in [AREACOORD(T)]") + else + return ..() + +/obj/item/stack/sheet/mineral/plasma/cyborg/fire_act(exposed_temperature, exposed_volume) + atmos_spawn_air("plasma=[amount*0];TEMP=[null]") diff --git a/sandcode/code/game/objects/items/stacks/sheets/sheet_types.dm b/sandcode/code/game/objects/items/stacks/sheets/sheet_types.dm new file mode 100644 index 0000000000..9fd74538bb --- /dev/null +++ b/sandcode/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -0,0 +1,34 @@ +/obj/item/stack/sheet/plasteel/cyborg + custom_materials = null + //var/datum/robot_energy_storage/metsource + //var/datum/robot_energy_storage/plasource + //var/metcost = 250 + //var/placost = 250 + cost = 500 + is_cyborg = 1 +/* Commented out to pick up shit +/obj/item/stack/sheet/plasteel/cyborg/get_amount() + return min(round(source.energy / metcost), round(plasource.energy / placost)) + +/obj/item/stack/sheet/plasteel/cyborg/use(used, transfer = FALSE) // Requires special checks, because it uses two storages + source.use_charge(used * metcost) + plasource.use_charge(used * placost) + +/obj/item/stack/sheet/plasteel/cyborg/add(amount) + source.add_charge(amount * metcost) + plasource.add_charge(amount * placost) +*/ + +/obj/item/stack/sheet/mineral/wood + name = "wooden plank" + desc = "One can only guess that this is a bunch of wood. You might be able to make a stake with this if you use something sharp on it" + singular_name = "wood plank" + icon_state = "sheet-wood" + item_state = "sheet-wood" + icon = 'icons/obj/stack_objects.dmi' + sheettype = "wood" + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 0) + resistance_flags = FLAMMABLE + merge_type = /obj/item/stack/sheet/mineral/wood + novariants = TRUE + grind_results = list(/datum/reagent/cellulose = 20) diff --git a/sandcode/code/game/objects/structures/ghost_role_spawners.dm b/sandcode/code/game/objects/structures/ghost_role_spawners.dm new file mode 100644 index 0000000000..d7a9bb64b5 --- /dev/null +++ b/sandcode/code/game/objects/structures/ghost_role_spawners.dm @@ -0,0 +1,41 @@ +/obj/effect/mob_spawn/robot + mob_type = /mob/living/silicon/robot + assignedrole = "Ghost Role" + +/obj/effect/mob_spawn/robot/Initialize() + . = ..() + +/obj/effect/mob_spawn/robot/equip(mob/living/silicon/robot/R) + . = ..() + +/obj/effect/mob_spawn/robot/ghostcafe + name = "Cafe Robotic Storage" + uses = -1 + icon = 'sandcode/icons/obj/machines/robot_storage.dmi' + icon_state = "robostorage" + mob_name = "a cafe robot" + roundstart = FALSE + anchored = TRUE + density = FALSE + death = FALSE + assignedrole = "Cafe Robot" + short_desc = "You are a Cafe Robot!" + flavour_text = "Who could have thought? This awesome local cafe accepts cyborgs too!" + skip_reentry_check = TRUE + banType = ROLE_GHOSTCAFE + mob_type = /mob/living/silicon/robot/modules/roleplay + +/obj/effect/mob_spawn/robot/ghostcafe/special(mob/living/silicon/robot/new_spawn) + if(new_spawn.client) + new_spawn.updatename(new_spawn.client) + new_spawn.gender = NEUTER + var/area/A = get_area(src) + new_spawn.AddElement(/datum/element/ghost_role_eligibility, free_ghosting = TRUE) + new_spawn.AddElement(/datum/element/dusts_on_catatonia) + new_spawn.AddElement(/datum/element/dusts_on_leaving_area, list(A.type, /area/hilbertshotel)) + ADD_TRAIT(new_spawn, TRAIT_SIXTHSENSE, GHOSTROLE_TRAIT) + ADD_TRAIT(new_spawn, TRAIT_EXEMPT_HEALTH_EVENTS, GHOSTROLE_TRAIT) + ADD_TRAIT(new_spawn, TRAIT_NO_MIDROUND_ANTAG, GHOSTROLE_TRAIT) //The mob can't be made into a random antag, they are still eligible for ghost roles popups. + to_chat(new_spawn,"Ghosting is free!") + var/datum/action/toggle_dead_chat_mob/D = new(new_spawn) + D.Grant(new_spawn) diff --git a/sandcode/code/modules/mob/living/silicon/robot/robot.dm b/sandcode/code/modules/mob/living/silicon/robot/robot.dm new file mode 100644 index 0000000000..a9f6393353 --- /dev/null +++ b/sandcode/code/modules/mob/living/silicon/robot/robot.dm @@ -0,0 +1,21 @@ +/mob/living/silicon/robot + speed = 0.2 + var/hasShrunk = FALSE + +/mob/living/silicon/robot/modules/roleplay + lawupdate = FALSE + scrambledcodes = TRUE // Roleplay borgs aren't real + set_module = /obj/item/robot_module/roleplay + +/mob/living/silicon/robot/modules/roleplay/Initialize() + . = ..() + cell = new /obj/item/stock_parts/cell/infinite(src, 30000) + laws = new /datum/ai_laws/roleplay() + //You aren't allowed to unlock, not sorry + src.verbs -= /mob/living/silicon/robot/verb/unlock_own_cover + //This part is because the camera stays in the list, so we'll just do a check + if(!QDELETED(builtInCamera)) + QDEL_NULL(builtInCamera) + +/mob/living/silicon/robot/modules/roleplay/binarycheck() + return 0 //Roleplay borgs aren't truly borgs diff --git a/sandcode/code/modules/mob/living/silicon/robot/robot_modules.dm b/sandcode/code/modules/mob/living/silicon/robot/robot_modules.dm new file mode 100644 index 0000000000..8c24bb06e2 --- /dev/null +++ b/sandcode/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -0,0 +1,216 @@ +/obj/item/robot_module/proc/add_module(obj/item/I, nonstandard, requires_rebuild) + rad_flags |= RAD_NO_CONTAMINATE + if(istype(I, /obj/item/stack)) + var/obj/item/stack/S = I + + if(is_type_in_list(S, list(/obj/item/stack/sheet/metal, /obj/item/stack/rods, /obj/item/stack/tile/plasteel))) + if(S.custom_materials?.len && S.custom_materials[SSmaterials.GetMaterialRef(/datum/material/iron)]) + S.cost = S.custom_materials[SSmaterials.GetMaterialRef(/datum/material/iron)] * 0.25 + S.source = get_or_create_estorage(/datum/robot_energy_storage/metal) + + else if(istype(S, /obj/item/stack/sheet/glass)) + S.cost = 500 + S.source = get_or_create_estorage(/datum/robot_energy_storage/glass) + + else if(istype(S, /obj/item/stack/sheet/rglass/cyborg)) + var/obj/item/stack/sheet/rglass/cyborg/G = S + G.source = get_or_create_estorage(/datum/robot_energy_storage/metal) + G.glasource = get_or_create_estorage(/datum/robot_energy_storage/glass) + + else if(istype(S, /obj/item/stack/sheet/plasmaglass/cyborg)) + //var/obj/item/stack/sheet/plasmaglass/cyborg/G = S + //G.plasource = get_or_create_estorage(/datum/robot_energy_storage/plasma) + //G.glasource = get_or_create_estorage(/datum/robot_energy_storage/glass) + S.cost = 500 + S.source = get_or_create_estorage(/datum/robot_energy_storage/plasma) + + else if(istype(S, /obj/item/stack/sheet/plasmarglass/cyborg)) + //var/obj/item/stack/sheet/plasmarglass/cyborg/G = S + //G.plasource = get_or_create_estorage(/datum/robot_energy_storage/plasma) + //G.glasource = get_or_create_estorage(/datum/robot_energy_storage/glass) + S.cost = 1000 + S.source = get_or_create_estorage(/datum/robot_energy_storage/plasma) + + else if(istype(S, /obj/item/stack/sheet/plasteel/cyborg)) + //var/obj/item/stack/sheet/plasteel/cyborg/G = S + //G.source = get_or_create_estorage(/datum/robot_energy_storage/metal) + //G.plasource = get_or_create_estorage(/datum/robot_energy_storage/plasma) + S.cost = 500 + S.source = get_or_create_estorage(/datum/robot_energy_storage/plasma) + + else if(istype(S, /obj/item/stack/sheet/mineral/plasma/cyborg)) + S.cost = 500 + S.source = get_or_create_estorage(/datum/robot_energy_storage/plasma) + + else if(istype(S, /obj/item/stack/medical)) + S.cost = 250 + S.source = get_or_create_estorage(/datum/robot_energy_storage/medical) + + else if(istype(S, /obj/item/stack/cable_coil)) + S.cost = 1 + S.source = get_or_create_estorage(/datum/robot_energy_storage/wire) + + else if(istype(S, /obj/item/stack/marker_beacon)) + S.cost = 1 + S.source = get_or_create_estorage(/datum/robot_energy_storage/beacon) + + else if(istype(S, /obj/item/stack/packageWrap)) + S.cost = 1 + S.source = get_or_create_estorage(/datum/robot_energy_storage/wrapping_paper) + + if(S && S.source) + S.custom_materials = null + S.is_cyborg = 1 + + if(I.loc != src) + I.forceMove(src) + modules += I + ADD_TRAIT(I, TRAIT_NODROP, CYBORG_ITEM_TRAIT) + I.mouse_opacity = MOUSE_OPACITY_OPAQUE + if(nonstandard) + added_modules += I + if(requires_rebuild) + rebuild_modules() + return I + +/obj/item/robot_module/engineering/Initialize() + basic_modules += /obj/item/pen + basic_modules += /obj/item/electronics/airlock + basic_modules += /obj/item/stack/sheet/plasmaglass/cyborg + basic_modules += /obj/item/stack/sheet/plasmarglass/cyborg + basic_modules += /obj/item/stack/sheet/plasteel/cyborg + basic_modules += /obj/item/stack/sheet/mineral/plasma/cyborg + . = ..() + +/obj/item/robot_module/butler/Initialize() + basic_modules -= /obj/item/reagent_containers/borghypo/borgshaker + basic_modules += /obj/item/reagent_containers/borghypo/borgshaker/beershaker + basic_modules += /obj/item/reagent_containers/borghypo/borgshaker/juiceshaker + basic_modules += /obj/item/reagent_containers/borghypo/borgshaker/sodashaker + basic_modules += /obj/item/reagent_containers/borghypo/borgshaker/miscshaker + . = ..() + +/obj/item/robot_module/miner/Initialize() + basic_modules += /obj/item/card/id/miningborg + . = ..() + +/datum/robot_energy_storage/plasma + name = "Plasma Buffer Container" + recharge_rate = 0 + +/obj/item/robot_module/syndicatejack + name = "Syndicate" + basic_modules = list( + /obj/item/assembly/flash/cyborg, + /obj/item/borg/sight/thermal, + /obj/item/extinguisher, + /obj/item/weldingtool/experimental, + /obj/item/screwdriver/nuke, + /obj/item/wrench/cyborg, + /obj/item/crowbar/cyborg, + /obj/item/wirecutters/cyborg, + /obj/item/multitool/cyborg, + /obj/item/weapon/gripper, + /obj/item/cyborg_clamp, + /obj/item/lightreplacer/cyborg, + /obj/item/stack/sheet/metal/cyborg, + /obj/item/stack/sheet/glass/cyborg, + /obj/item/stack/sheet/rglass/cyborg, + /obj/item/stack/rods/cyborg, + /obj/item/stack/tile/plasteel/cyborg, + /obj/item/destTagger/borg, + /obj/item/stack/cable_coil/cyborg, + /obj/item/restraints/handcuffs/cable/zipties, + /obj/item/stack/medical/gauze/cyborg, + /obj/item/shockpaddles/cyborg, + /obj/item/healthanalyzer/advanced, + /obj/item/surgical_drapes/advanced, + /obj/item/retractor/advanced, + /obj/item/surgicaldrill/advanced, + /obj/item/scalpel/advanced, + /obj/item/gun/medbeam, + /obj/item/reagent_containers/borghypo/syndicate, + /obj/item/borg/lollipop, + /obj/item/holosign_creator/cyborg, + /obj/item/stamp/chameleon, + /obj/item/borg_shapeshifter + ) + + ratvar_modules = list( + /obj/item/clockwork/slab/cyborg/medical, + /obj/item/clockwork/slab/cyborg/engineer, + /obj/item/clockwork/replica_fabricator/cyborg) + + cyborg_base_icon = "synd_engi" + moduleselect_icon = "malf" + magpulsing = TRUE + hat_offset = INFINITY + canDispose = TRUE + +/obj/item/robot_module/syndicatejack/be_transformed_to(obj/item/robot_module/old_module) + var/mob/living/silicon/robot/R = loc + var/static/list/syndicatejack_icons = sortList(list( + "Saboteur" = image(icon = 'icons/mob/robots.dmi', icon_state = "synd_engi"), + "Medical" = image(icon = 'icons/mob/robots.dmi', icon_state = "synd_medical"), + "Assault" = image(icon = 'icons/mob/robots.dmi', icon_state = "synd_sec"), + )) + var/syndiejack_icon = show_radial_menu(R, R , syndicatejack_icons, custom_check = CALLBACK(src, .proc/check_menu, R), radius = 42, require_near = TRUE) + switch(syndiejack_icon) + if("Saboteur") + cyborg_base_icon = "synd_engi" + cyborg_icon_override = 'icons/mob/robots.dmi' + if("Medical") + cyborg_base_icon = "synd_medical" + cyborg_icon_override = 'icons/mob/robots.dmi' + if("Assault") + cyborg_base_icon = "synd_sec" + cyborg_icon_override = 'icons/mob/robots.dmi' + else + return FALSE + return ..() + +/obj/item/robot_module/syndicatejack/rebuild_modules() + ..() + var/mob/living/silicon/robot/syndicatejack = loc + syndicatejack.scrambledcodes = TRUE // We're rouge now + +/obj/item/robot_module/syndicatejack/remove_module(obj/item/I, delete_after) + ..() + var/mob/living/silicon/robot/syndicatejack = loc + syndicatejack.scrambledcodes = FALSE // Friends with the AI again + +/obj/item/robot_module/roleplay + name = "Roleplay" + basic_modules = list( + /obj/item/assembly/flash/cyborg, + /obj/item/extinguisher/mini, + /obj/item/weldingtool/largetank/cyborg, + /obj/item/screwdriver/cyborg, + /obj/item/wrench/cyborg, + /obj/item/crowbar/cyborg, + /obj/item/wirecutters/cyborg, + /obj/item/multitool/cyborg, + /obj/item/stack/sheet/metal/cyborg, + /obj/item/stack/sheet/glass/cyborg, + /obj/item/stack/sheet/rglass/cyborg, + /obj/item/stack/rods/cyborg, + /obj/item/stack/tile/plasteel/cyborg, + /obj/item/stack/cable_coil/cyborg, + /obj/item/restraints/handcuffs/cable/zipties, + /obj/item/rsf/cyborg, + /obj/item/reagent_containers/food/drinks/drinkingglass, + /obj/item/reagent_containers/borghypo/borgshaker/beershaker, + /obj/item/reagent_containers/borghypo/borgshaker/juiceshaker, + /obj/item/reagent_containers/borghypo/borgshaker/sodashaker, + /obj/item/reagent_containers/borghypo/borgshaker/miscshaker, + /obj/item/soap/nanotrasen, + /obj/item/borg/cyborghug, + /obj/item/dogborg_nose, + /obj/item/dogborg_tongue, + /obj/item/borg_shapeshifter/stable) + moduleselect_icon = "standard" + hat_offset = -3 + +/obj/item/robot_module/Initialize() + basic_modules += /obj/item/dildo/custom + . = ..() diff --git a/sandcode/code/modules/reagents/reagent_containers/borghydro.dm b/sandcode/code/modules/reagents/reagent_containers/borghydro.dm new file mode 100644 index 0000000000..7880062c70 --- /dev/null +++ b/sandcode/code/modules/reagents/reagent_containers/borghydro.dm @@ -0,0 +1,128 @@ +/* +Borg Shaker +*/ +/obj/item/reagent_containers/borghypo/borgshaker/beershaker + name = "cyborg shaker" + desc = "An advanced drink synthesizer and mixer." + icon = 'sandcode/icons/obj/drinks.dmi' + icon_state = "beershaker" + possible_transfer_amounts = list(5,10,20) + charge_cost = 20 //Lots of reagents all regenerating at once, so the charge cost is lower. They also regenerate faster. + recharge_time = 1 + accepts_reagent_upgrades = FALSE + reagent_ids = list( /datum/reagent/consumable/ethanol/beer, + /datum/reagent/consumable/ethanol/whiskey, + /datum/reagent/consumable/ethanol/vodka, + /datum/reagent/consumable/ethanol/rum, + /datum/reagent/consumable/ethanol/gin, + /datum/reagent/consumable/ethanol/tequila, + /datum/reagent/consumable/ethanol/vermouth, + /datum/reagent/consumable/ethanol/wine, + /datum/reagent/consumable/ethanol/kahlua, + /datum/reagent/consumable/ethanol/cognac, + /datum/reagent/consumable/ethanol/ale, + /datum/reagent/consumable/ethanol/fernet, + /datum/reagent/consumable/ethanol/triple_sec, + /datum/reagent/consumable/nothing, + /datum/reagent/consumable/laughter, + /datum/reagent/consumable/ethanol/creme_de_menthe, + /datum/reagent/consumable/ethanol/creme_de_cacao, + /datum/reagent/consumable/ethanol/creme_de_coconut, + /datum/reagent/consumable/ethanol/champagne, + /datum/reagent/consumable/ethanol/thirteenloko, + /datum/reagent/consumable/ethanol/absinthe, + /datum/reagent/consumable/ethanol/hooch, + /datum/reagent/consumable/ethanol/moonshine) + + +/obj/item/reagent_containers/borghypo/borgshaker/juiceshaker + name = "cyborg shaker" + desc = "An advanced drink synthesizer and mixer." + icon = 'sandcode/icons/obj/drinks.dmi' + icon_state = "juiceshaker" + possible_transfer_amounts = list(5,10,20) + charge_cost = 20 //Lots of reagents all regenerating at once, so the charge cost is lower. They also regenerate faster. + recharge_time = 1 + accepts_reagent_upgrades = FALSE + reagent_ids = list( /datum/reagent/consumable/orangejuice, + /datum/reagent/consumable/limejuice, + /datum/reagent/consumable/tomatojuice, + /datum/reagent/consumable/carrotjuice, + /datum/reagent/consumable/berryjuice, + /datum/reagent/consumable/applejuice, + /datum/reagent/consumable/peachjuice, + /datum/reagent/consumable/strawberryjuice, + /datum/reagent/consumable/pineapplejuice, + /datum/reagent/consumable/watermelonjuice, + /datum/reagent/consumable/parsnipjuice, + /datum/reagent/consumable/grapejuice, + /datum/reagent/consumable/potato_juice, + /datum/reagent/consumable/pumpkinjuice, + /datum/reagent/consumable/lemonjuice) + +/obj/item/reagent_containers/borghypo/borgshaker/sodashaker + name = "cyborg shaker" + desc = "An advanced drink synthesizer and mixer." + icon = 'sandcode/icons/obj/drinks.dmi' + icon_state = "sodashaker" + possible_transfer_amounts = list(5,10,20) + charge_cost = 20 //Lots of reagents all regenerating at once, so the charge cost is lower. They also regenerate faster. + recharge_time = 1 + accepts_reagent_upgrades = FALSE + reagent_ids = list( /datum/reagent/consumable/space_cola, + /datum/reagent/consumable/nuka_cola, + /datum/reagent/consumable/spacemountainwind, + /datum/reagent/consumable/dr_gibb, + /datum/reagent/consumable/space_up, + /datum/reagent/consumable/lemon_lime, + /datum/reagent/consumable/pwr_game, + /datum/reagent/consumable/shamblers, + /datum/reagent/consumable/buzz_fuzz, + /datum/reagent/consumable/grey_bull, + /datum/reagent/consumable/cream_soda, + /datum/reagent/consumable/sol_dry, + /datum/reagent/consumable/tonic, + /datum/reagent/consumable/sodawater) + +/obj/item/reagent_containers/borghypo/borgshaker/miscshaker + name = "cyborg shaker" + desc = "An advanced drink synthesizer and mixer." + icon = 'sandcode/icons/obj/drinks.dmi' + icon_state = "miscshaker" + possible_transfer_amounts = list(5,10,20) + charge_cost = 20 //Lots of reagents all regenerating at once, so the charge cost is lower. They also regenerate faster. + recharge_time = 1 + accepts_reagent_upgrades = FALSE + reagent_ids = list( /datum/reagent/consumable/grenadine, + /datum/reagent/consumable/banana, + /datum/reagent/consumable/honey, + /datum/reagent/consumable/sugar, + /datum/reagent/consumable/vanilla, + /datum/reagent/blood/synthetics, + /datum/reagent/consumable/capsaicin, + /datum/reagent/consumable/coco, + /datum/reagent/consumable/menthol, + /datum/reagent/consumable/ice, + /datum/reagent/consumable/cream, + /datum/reagent/consumable/milk, + /datum/reagent/consumable/soymilk, + /datum/reagent/consumable/coconutmilk, + /datum/reagent/consumable/coffee, + /datum/reagent/consumable/tea, + /datum/reagent/consumable/lemonade, + /datum/reagent/water) + +/obj/item/reagent_containers/borghypo/borgshaker/hacked + name = "cyborg shaker" + desc = "Will mix drinks that knock them dead." + icon = 'icons/obj/drinks.dmi' + icon_state = "threemileislandglass" + possible_transfer_amounts = list(5,10,20) + charge_cost = 20 //Lots of reagents all regenerating at once, so the charge cost is lower. They also regenerate faster. + recharge_time = 1 + accepts_reagent_upgrades = FALSE + reagent_ids = list( /datum/reagent/toxin/fakebeer, + /datum/reagent/consumable/poisonberryjuice, + /datum/reagent/toxin/itching_powder, + /datum/reagent/toxin/bungotoxin, + /datum/reagent/consumable/superlaughter) diff --git a/sandcode/code/modules/research/designs/mechfabricator_designs.dm b/sandcode/code/modules/research/designs/mechfabricator_designs.dm index 64cebc1e39..43bf0f3f09 100644 --- a/sandcode/code/modules/research/designs/mechfabricator_designs.dm +++ b/sandcode/code/modules/research/designs/mechfabricator_designs.dm @@ -1,3 +1,21 @@ +/datum/design/borg_upgrade_xwelding + name = "Cyborg Upgrade (Experimental Welding Tool)" + id = "borg_upgrade_xwelding" + build_type = MECHFAB + build_path = /obj/item/borg/upgrade/xwelding + materials = list(/datum/material/iron = 1000, /datum/material/plasma = 1000, /datum/material/titanium = 1000) + construction_time = 100 + category = list("Cyborg Upgrade Modules") +/* Shit doesnt work, work on it later +/datum/design/borg_upgrade_plasma + name = "Cyborg Upgrade (Plasma Resource)" + id = "borg_upgrade_plasma" + build_type = MECHFAB + build_path = /obj/item/borg/upgrade/plasma + materials = list(/datum/material/plasma = 1000, /datum/material/bluespace = 1000) + construction_time = 100 + category = list("Cyborg Upgrade Modules") +*/ /datum/design/borg_upgrade_bsrpd name = "Cyborg Upgrade (Bluespace RPD)" id = "borg_upgrade_bsrpd" @@ -7,6 +25,34 @@ construction_time = 100 category = list("Cyborg Upgrade Modules") +/datum/design/borg_upgrade_premiumka + name = "Cyborg Upgrade (Premium Kinetic Accelerator)" + id = "borg_upgrade_premiumka" + build_type = MECHFAB + build_path = /obj/item/borg/upgrade/premiumka + materials = list(/datum/material/iron=8000, /datum/material/glass=4000, /datum/material/titanium=2000) + construction_time = 120 + category = list("Cyborg Upgrade Modules") + +/datum/design/borg_upgrade_expand + name = "Cyborg Upgrade (Expand)" + id = "borg_upgrade_expand" + build_type = MECHFAB + build_path = /obj/item/borg/upgrade/expand + materials = list(/datum/material/iron=20000, /datum/material/glass=5000) + construction_time = 120 + category = list("Cyborg Upgrade Modules") + +/datum/design/borg_upgrade_shrink + name = "Cyborg Upgrade (shrink)" + id = "borg_upgrade_shrink" + build_type = MECHFAB + build_path = /obj/item/borg/upgrade/shrink + materials = list(/datum/material/iron=20000, /datum/material/glass=5000) + construction_time = 120 + category = list("Cyborg Upgrade Modules") + + ///Power Armor /datum/design/powerarmor_skeleton name = "Power Armor Skeleton" diff --git a/sandcode/code/modules/research/techweb/nodes/robotics_nodes.dm b/sandcode/code/modules/research/techweb/nodes/robotics_nodes.dm index db873a544b..4fc02785a7 100644 --- a/sandcode/code/modules/research/techweb/nodes/robotics_nodes.dm +++ b/sandcode/code/modules/research/techweb/nodes/robotics_nodes.dm @@ -5,3 +5,13 @@ prereq_ids = list("adv_biotech", "adv_bluespace", "adv_robotics") design_ids = list("powerarmor_skeleton","powerarmor_torso","powerarmor_helmet","powerarmor_armR","powerarmor_armL","powerarmor_legR","powerarmor_legL") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 7500) + +/datum/techweb_node/adv_robotics/New() + design_ids += "borg_upgrade_premiumka" + . = ..() + +/datum/techweb_node/cyborg_upg_util/New() + design_ids += "borg_upgrade_xwelding" + design_ids += "borg_upgrade_shrink" + //design_ids += "borg_upgrade_plasma" + . = ..() diff --git a/sandcode/code/modules/ruins/spaceruin_code/hilbertshotel.dm b/sandcode/code/modules/ruins/spaceruin_code/hilbertshotel.dm new file mode 100644 index 0000000000..0f90b4b90b --- /dev/null +++ b/sandcode/code/modules/ruins/spaceruin_code/hilbertshotel.dm @@ -0,0 +1,3 @@ +/obj/item/hilbertshotel/ghostdojo/attack_robot(mob/user) + . = ..() + interact(user) diff --git a/sandcode/icons/obj/drinks.dmi b/sandcode/icons/obj/drinks.dmi new file mode 100644 index 0000000000000000000000000000000000000000..898ee57b6656309334a995da010fcc013ee27ed6 GIT binary patch literal 1680 zcmV;B25V=-0C=2@$~z9iFc3x2+OvwMq(}T(H^>okk?g_510GO_G-F`<6p<)Vx_hP5 z;?$kvfY3*Jvzp9LcpNudav#aHz~itdS6FVPE@L%ShDUQ@Rx9bj+K|hl29F)NtEP#U z{?YqOMqX)c&S@o`#K!-$MK=V5KGGM_YeL?RUN{B-00qQJL_t(|ob6g~Xj4}d|796T zWNm5}F&MP5t=4AHW^G38sIaKijS2lwkjOTLB9eih>Sn;npqr?hgLZ!yQe?^$h3lZ3 z869Z1HZlrUVv7CXbM0&uq^_e$Y}ak?xpi+J>Pwrwy5`*E<*jReQ2KIia{l~s?z#8o z9z!S;!cxW)dOM&uas=q@fZka01U$+6LB^Oo_qEUGGo zgdcww!2mg1BrwM0SS*HjH++kpzA1bbs{}ahlcxYeXbf{v)RyVyonye5PFR_@%7X_9yQ!Bbsm7ziXZ)fe3O9sHms_01QMXae2^$fyg9&h>K*yyznf*Q%xHdv{)6bwnHUigy&9Gy|^fXrGN%(_D83$B>dH}zN9y|aT zD8C0V#^g<#Ho*npx1a4;|2>VtF1E| zA)|=!lo?KxX4*d$cy@dL1}*}^k{O7LKm=Lc1(qMYWKi}ZZnqmZZrngL8bvG?gD8qz zdk|6)^m@J30C3>_PZ5^PIQNr`uw+J9GAGUf%6qgxD!Qrm$r*6s#0k&n=;(E)=Y=G> zAPBg4@gm20jL-gs3l~&lJoZUjVPIi~L!nTF>V%&5$prl0u;edBas=q@fZoUvptl2h zBS(PV4(N>~Pe86efY-QkO%{*G5s$|K9r^<@VV}GeR&Iy|K}eDp6ck`$VnXvw$h3W~ z46xa3*tc(=>O7t;WYRwQV#MWg;Yw$>YOLb=?`r+{jodmnJEU%-3se2i=T$;C*^{s5&vVcBm%6fU>JUQ`ErQ5_1G+p+6q z6IXu%X$l0qCL9lT0RXy#UD(o4kM23I16~upoFLgJ!QpUVZ=)4Y8Gl7d&7P#OTi+eR z(Kp;U*)d7dNzQ0oN+>ZEzv7|9Yw*N>Unwy&qm5$pf5kQ&(0j~)x(lozwk*2Ip1A9>& z*0^?JjcX_DMRf`Jx%T~duH2AP@BncN91lH2d&_B@=}?p4t3C~X%WA+v(U^I>>Te}w zAbAyFktXbJRJX>S>1aa0dj&_Y^7ZQI1#%JeRX;uhvQY#(ujXNU?HKIVbxHF0gE8_F z2=Gh+?@X|B3!!wUD>0spDR6bjiCXj~$8e46pW)Q1lkCdWn@6nQ$wra)}Ta418 zRuG#=5QKd7d(QV?`2O(R=bU@)c<%c=_ukjN2~QsDGBR*8kdcuw>g#ElUU|EJMn`j1 zu4D&2x^mee&n^75Uimrty7~CKdA}wj1LtKX*D-WSv1wyg#qR8a+mFdMEa~Q~s z3EJVh3{i_g8-jYT zEq&cjNsU?7dwgd^fpE^mSMzQYd5O>zn0pVF-0fRDS6(n|u}rV~oO%?s;PiPt4pXb* zcaZOGsdTVrasiNi_Dz+dqBmGfu`cI*f|I%77%*bHb8k^zhW(W>;xk7!c&oCeAaEXK z$8X4Oa^Kql+!~j)W?Xg=d0xp&!gIuNM-aSQxEF)}W?ttQWJ?^qKhjJ-xnj4-nPTh~ zF8j6Ryr9rldvWIEu61Ejnc6MQ=anO~>a_L@PNfMOV*KgpPiEf1nI{Kh93=+Lh~p_P z*yEHFzvU(m`raC@jZDVht--h&dq2@SuepXl?qBZOm|TF0p`2owqpkOI8~5khK=sX( zi#U`_lqp5|wL~lWHg)7EcYHaY{e)WPuNvRc#yH?I4!sZ1Waz!u9;!e(^!_CcvrPENbsC5rsFSTK9kfsr) ziWL7eC_AD5Ij{#R{W`TzuDwjl|*mo4>h^ykqSc@vL2|M<-eI5@WSHV15n zi?iBzU(Ef4fUFxE%U6ZVb#y@zEe#(pT@s}nXNB2RxZju3buerA8&iDxl&3ZBntapQ zXrV!Mhzd>U@-55!y4SYN-x#%YB5z%b2tGOK5qqpYN6Xu|@fo)jxofi6(HH1p6Y#hq zB1Q#B*}(k3`vOf3lf{Vhp8fHoZD~v~tjmSveQ>>jJlN#&Z8y#rbC4QHV!@<^9@ z0ygNzYM64p&r6$pz3;WhI>EA1%<7#v~{7-1(WSr@^;f7gzwPbB#Bzspgj5 zmMAR+Qr98`a{s+EF`Pxz-?(Q#6Q_E&+G5Jn=c~zbhy?nSV%ioGQ^DV2(@VG19!T46 z+PcZR-|a^UKb>UUiP*aHPv`~PM^LzKQ;nV=wS^qZt{|Nul37FfRp~W=dOQFsY|F<= zKVdjQu;~b0oEbnUrKU~y_0*4Q_wU;#gmjDJ0SnBnI{ZuR(b7>osAeZ=Z6Uj{C}|2R zb+Qa5F2+zZ4{lfY|On|R)U=e79UF-zwY};UYeP( z?2(xJaMVSr6f3UQ_1W`1RN{Y}g>t290rO!QN#@S_+~l#qRWgTe)Z&5jyh2-B z&Emnbd4SM)$adufmuI)u+Cg0bULfIl;A@y=AP=4kl5J4oz`{^5q{PhXkeFO-0_`NuuY|u zoYtZmxmfXX28Ds+`)l7!i5rDX*d!NNsoS`#zL2=Y#b1xpLx62BHVe@I%$D*pX~8bv z-J*gzG=zRSR{6{bU|ijscYJ(Z>c<*N{z=h~ap$54x<6m3DnUI8_}f|eWwo+5!X9fx zC)#T)DZTaV>p7v|e&`myzXijhfQU2=lraG%8U3F7s~_gEML4-~SU1rMw-1a=;lV6k z^VP@8ohDMbsRdNyzd?j@HR_l2AWn^>pp7wlCw)o<`FU4QWF(y}3&v;*J3T4nu4sTpx z2;5&70fpj~g7%z_wtktVkchF2TaHSBd52m4wfOSaEN6GMT{;%QkHuT@F&T5=bc z@?VP-ZT?BO|Y!C=T_@WOtx~0UErkrJu zN_3n`3)kwr`P`Y9iK!`eSyZ3pQ5H=o2SD|fRA&6KO=G};L~UpA-y=X~il*(e2bn!U znJz-wa026_KL@*8il+_uy}vD|S4&ES!_6-&>emP&j-gubVQO=3C^A}03AgA~rAhCPn% zpZwCP#SfJ$lPMNM@K{yue&5bS!8}v74KSTjG()k>3&C-_x5>l$GP7iaC>T5{*RSpy zyKoEuisdePmaa3QBY=FO-oL`58gQta-tIMyno4~sao2y~vVgwJuyniQu`9H}$x|w> z0&E&4%2c3V~oO@@;H&a{#4a>6eK3(NsAN zdsfj-B{*mp2i)anqbYi#PImK*Ch-}@-B$&r6`&v+0DNLe*&I=sHeTG;!DaTZE5E!C zl{~O#D8`qVqfs(^-Bk2ICBwW%Q7G9r;#Q*&BwtFcDUlZjKs#*P_a#+ZHkUAAblzP2 zn5lj#*TzN7xpwz8-Gh&-{d!!Q(EBDa(AX6G;B8?&<$IR1p5~c=z#@fQJJ;5p!{>Sn zAF^*MDT+OUkT-2`Mqm~Rs)zsr*wMXQ)PY4Qckr2 zM*WwHyKebWc|#@119l5S`vd_aOEW|K;AuF zxA4Qix`@g2_#{z-pn-5?Q2V5(JAzzM^E*Td0lS2Vde3 z$qkOyl*bp+by$~fsgzBP-}^3Ke!A=!dc#!Ly_L0*cAb;_ix429`X@Cnhmu7%y~W@VfMKtAniL5RcPrO~l!+)Ql` z9ksDoE@2c_u+kQB>MSD*{UUG@<`o19pNk70wT;-k2?Y&a*oI}C%=^&TbM|0nNXsv= zt&uJOpcI(Y-R@}{e`dz)1Lao|DPCGylqS3|rF?*u3o^)~l zJqj7t0?rU}TYac!wIa~Vl14=K(sA`3)5&%ISLVNhMb;dJ{2%vWW~|!X8Ns!u1l>ZF zVP?`|lGx)u60`+LCrRy8<=Mhn zV1jPD(+qrpK(s9c$670eG_Kcv$p7}_==1d|Y5?%V<>CTZmaNGMf9s)kA;=Wd0&FUj z2Q{bfy^fATD~%KQ@yqZ@t%!XM9^@STxRSNk+2IRW_~45<&z4o3r6C!2?-VnH!`(%_c6<>V4_+ zC$-@r1-DnzGim+eouXX*i3*tE_Y2`NC;#EKb>@5>QX0j}pRL2o zi1;;fA8Gwu)#i^qQ0|b zwhINQ#A%$jwb}!>BB&a&yHleZ`M{WBwd^wClxVe$R3Q=(s)NN2b7Ob5;WgxD<_b4X zRB>QM0Pv#CcR}djDg-~518lAMH+aXDV3}P3#bu`8!Ll;bDyfo5C=2m|gV}fQQ1JEX ziu->K56vvBRpITCN9cvHNu`Cj4=ON^OMHl^M_5STYZltV=Eq^bu{HI9M*4>)<8&Y<%1xql_K2jt;18t^XSmi;Vj!X zPAK$Rx1;b3#!(*8QR1BB@bt4N;6M5d)oNhMn627b9r-gz>(gE&24`u;xRI%pA(G z2z!wz8R012498tWC?+3<6+rA+kjyLf&9Cip872XR&muym41jV)T}Ux|g+Ivy%zLVd zQNRJD`DBM*O1yzWlm;uG>8EU%xdS&~G4y*Ea@%jSC4{|P=Dz02mL>FWa=Axd(2HyP z3sW&bo028)&g}j{%opp9iP7s>aK0U9kV?`ky^IN;qn!bK^^fp*@*m6SOlq*ugh@Ze zTe6t|J?7BN^F`Xg=`{e$|i2aE9S!h zV5i$6+Sl1c_~`P!x@!pw*6sAnLx_$oOk+!EU7_~mgY^jxhQoURYnYDZ(wUxd{Y7V+ zKzcr&IVAbc$Gm7@Yp(VPdz2(S2=Et0UpK&^VoJYD1-aa)5vh7{_QvE_JPal@^6`wU z;?9*m$lTWDXL(L8;i8**FqLcTKERIm75MU=hH(N#mXl`=?p?Gaj%1&0mqK>`n-r#?}y zs;J09L{Sv5qCy)B9ZR_%H}wx<(2&c|Obm0A2xA0T%cBA)83Bxd zVuc#3JL=SVu?2!wS< z^V4$DNK3mAd-~qS5*oHy&*>StC02o8^>U=|?$k zdw*JkoAINV6&%Og@K!p64TP9<9!l5}Qu0Y=KSUA@R-_Dp&2KwSQU>;y`JQ*=E}-Z; zT!7e{Eyu||`><(EI-4q%PgJgE0g>+yPk&6qbR*qnU9)1~Tw8}n*2FK&dF&$?(OK8r z6?7@8raI0|Y|JwHm5|UWLAU~kmE7miof$r8-Ubc|z24Bs(ICKkid_m-zJmQH% zRIsOqdqz6vSX3Ba5wJZs;EP9kM@miZC^Ak<9+X)vxPlI#kcUcH@qaoc+<3Z-PU>Yp z-tQkj2sKY^!k7E{T(~NJc48-EJr#a)w#qT;4Cz`k{JE=1FBPEhxn|o#Z*BNWt*bfI znlg}YhBh*KOJOJ2gSId-Gl;Slq*bC~FOW4wu37K~VIv3j(*LQ$V3mj};=Y6G!u=iy z(eonxA4!W|vl6B{EiplCurjE>bW9|*y}D)9*X1gcma_!+;&@==?~+-2KkplXNL>aP zDYOF%aC{*zc6IW1wF?}=pkVCZ4{IRA-ivO?wiqqS@Q%ne4dCkW%afw**%~6x zAf1^N>I_R)b?XXc!Z~%$#&4PB-GAk$W1dw$bhCBM%Ub!uk+5kJi=`Ymgws?UdZUg6 z5+kLqvwsgCj-5_~ed+Q3jId}ZE3JS)YX9AS+pP@{hgj-DT^)su?2310Ffg zs_O9C(#x@#nMYeRQ~&R_DqeWHopWJQc@#;a62PRO*pBaaUwu52>1#jMf@|2l{U5Xp B>QDdx literal 0 HcmV?d00001 diff --git a/tgstation.dme b/tgstation.dme index f21d62875e..7c3673bee2 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -3615,6 +3615,7 @@ #include "sandcode\code\__DEFINES\wires.dm" #include "sandcode\code\_onclick\hud\screen_objects.dm" #include "sandcode\code\datums\action.dm" +#include "sandcode\code\datums\ai_laws.dm" #include "sandcode\code\datums\shuttles.dm" #include "sandcode\code\datums\interactions\_interaction.dm" #include "sandcode\code\datums\interactions\interaction_definitions.dm" @@ -3647,6 +3648,7 @@ #include "sandcode\code\game\mecha\mecha_parts.dm" #include "sandcode\code\game\objects\effects\contraband.dm" #include "sandcode\code\game\objects\items\airlock_painter.dm" +#include "sandcode\code\game\objects\items\borg_shapeshifter.dm" #include "sandcode\code\game\objects\items\BSRPD.dm" #include "sandcode\code\game\objects\items\cards_ids.dm" #include "sandcode\code\game\objects\items\chrono_eraser.dm" @@ -3658,8 +3660,12 @@ #include "sandcode\code\game\objects\items\plushes\goat_boss.dm" #include "sandcode\code\game\objects\items\plushes\plushes.dm" #include "sandcode\code\game\objects\items\robot\robot_upgrades.dm" +#include "sandcode\code\game\objects\items\stacks\sheets\glass.dm" +#include "sandcode\code\game\objects\items\stacks\sheets\mineral.dm" +#include "sandcode\code\game\objects\items\stacks\sheets\sheet_types.dm" #include "sandcode\code\game\objects\items\storage\backpack.dm" #include "sandcode\code\game\objects\items\storage\bags.dm" +#include "sandcode\code\game\objects\structures\ghost_role_spawners.dm" #include "sandcode\code\game\objects\structures\ladders.dm" #include "sandcode\code\game\objects\structures\lavaland\necropolis_tendril.dm" #include "sandcode\code\game\turfs\simulated\floor\asteroid.dm" @@ -3699,6 +3705,8 @@ #include "sandcode\code\modules\mob\living\carbon\show.dm" #include "sandcode\code\modules\mob\living\carbon\human\human.dm" #include "sandcode\code\modules\mob\living\silicon\silicon.dm" +#include "sandcode\code\modules\mob\living\silicon\robot\robot.dm" +#include "sandcode\code\modules\mob\living\silicon\robot\robot_modules.dm" #include "sandcode\code\modules\mob\living\simple_animal\friendly\doges.dm" #include "sandcode\code\modules\mob\living\simple_animal\hostile\megafauna\blood_drunk_miner.dm" #include "sandcode\code\modules\mob\living\simple_animal\hostile\megafauna\bubblegum.dm" @@ -3741,6 +3749,7 @@ #include "sandcode\code\modules\reagents\chemistry\recipes\drugs.dm" #include "sandcode\code\modules\reagents\chemistry\recipes\fermi.dm" #include "sandcode\code\modules\reagents\chemistry\recipes\others.dm" +#include "sandcode\code\modules\reagents\reagent_containers\borghydro.dm" #include "sandcode\code\modules\reagents\reagent_containers\bottle.dm" #include "sandcode\code\modules\reagents\reagent_containers\spray.dm" #include "sandcode\code\modules\research\designs\autolathe_designs.dm" @@ -3760,6 +3769,7 @@ #include "sandcode\code\modules\ruins\lavalandruin_code\doom.dm" #include "sandcode\code\modules\ruins\lavalandruin_code\kinggoat.dm" #include "sandcode\code\modules\ruins\lavalandruin_code\misc.dm" +#include "sandcode\code\modules\ruins\spaceruin_code\hilbertshotel.dm" #include "sandcode\code\modules\shuttle\spaceship_navigation_beacon.dm" #include "sandcode\code\modules\spells\spell.dm" #include "sandcode\code\modules\spells\spell_types\shapeshift.dm"