mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-07-14 01:24:21 +01:00
tested and working (#8906)
Co-authored-by: Ranged <nickvanderkroon@gmail.com>
This commit is contained in:
@@ -187,6 +187,11 @@
|
||||
cyborg.radio.recalculateChannels()
|
||||
cyborg.set_modularInterface_theme()
|
||||
|
||||
//SKYRAT EDIT ADDITION BEGIN - ALTBORGS - Old check for 'dogborg' var no longer necessary, refactored into model_features instead.
|
||||
if(cyborg.is_dogborg()) //Should pass because model was set previously.
|
||||
new_model.dogborg_equip()
|
||||
//SKYRAT EDIT ADDITION END
|
||||
|
||||
INVOKE_ASYNC(new_model, .proc/do_transform_animation)
|
||||
qdel(src)
|
||||
return new_model
|
||||
|
||||
@@ -1,716 +0,0 @@
|
||||
/***************************************************************************************
|
||||
* # robot_modules
|
||||
*
|
||||
* Deals with the creation and deletion of modules (tools).
|
||||
* Assigns modules and traits to a borg with a specific model selected.
|
||||
*
|
||||
***************************************************************************************/
|
||||
|
||||
/obj/item/robot_model/Initialize(mapload)
|
||||
. = ..()
|
||||
for(var/i in basic_modules)
|
||||
var/obj/item/I = new i(src)
|
||||
basic_modules += I
|
||||
basic_modules -= i
|
||||
for(var/i in emag_modules)
|
||||
var/obj/item/I = new i(src)
|
||||
emag_modules += I
|
||||
emag_modules -= i
|
||||
|
||||
/obj/item/robot_model/Destroy()
|
||||
basic_modules.Cut()
|
||||
emag_modules.Cut()
|
||||
modules.Cut()
|
||||
added_modules.Cut()
|
||||
storages.Cut()
|
||||
return ..()
|
||||
|
||||
/obj/item/robot_model/proc/get_usable_modules()
|
||||
. = modules.Copy()
|
||||
|
||||
/obj/item/robot_model/proc/get_inactive_modules()
|
||||
. = list()
|
||||
var/mob/living/silicon/robot/R = loc
|
||||
for(var/m in get_usable_modules())
|
||||
if(!(m in R.held_items))
|
||||
. += m
|
||||
|
||||
/obj/item/robot_model/proc/add_module(obj/item/I, nonstandard, requires_rebuild)
|
||||
if(istype(I, /obj/item/stack))
|
||||
var/obj/item/stack/sheet_module = I
|
||||
if(ispath(sheet_module.source, /datum/robot_energy_storage))
|
||||
sheet_module.source = get_or_create_estorage(sheet_module.source)
|
||||
|
||||
if(istype(sheet_module, /obj/item/stack/sheet/rglass/cyborg))
|
||||
var/obj/item/stack/sheet/rglass/cyborg/rglass_module = sheet_module
|
||||
if(ispath(rglass_module.glasource, /datum/robot_energy_storage))
|
||||
rglass_module.glasource = get_or_create_estorage(rglass_module.glasource)
|
||||
|
||||
if(istype(sheet_module.source))
|
||||
sheet_module.cost = max(sheet_module.cost, 1) // Must not cost 0 to prevent div/0 errors.
|
||||
sheet_module.is_cyborg = TRUE
|
||||
|
||||
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_model/proc/remove_module(obj/item/I, delete_after)
|
||||
basic_modules -= I
|
||||
modules -= I
|
||||
emag_modules -= I
|
||||
added_modules -= I
|
||||
rebuild_modules()
|
||||
if(delete_after)
|
||||
qdel(I)
|
||||
|
||||
/obj/item/robot_model/proc/rebuild_modules() //builds the usable module list from the modules we have
|
||||
var/mob/living/silicon/robot/R = loc
|
||||
var/list/held_modules = R.held_items.Copy()
|
||||
var/active_module = R.module_active
|
||||
R.uneq_all()
|
||||
modules = list()
|
||||
for(var/obj/item/I in basic_modules)
|
||||
add_module(I, FALSE, FALSE)
|
||||
if(R.emagged)
|
||||
for(var/obj/item/I in emag_modules)
|
||||
add_module(I, FALSE, FALSE)
|
||||
for(var/obj/item/I in added_modules)
|
||||
add_module(I, FALSE, FALSE)
|
||||
for(var/i in held_modules)
|
||||
if(i)
|
||||
R.equip_module_to_slot(i, held_modules.Find(i))
|
||||
if(active_module)
|
||||
R.select_module(held_modules.Find(active_module))
|
||||
if(R.hud_used)
|
||||
R.hud_used.update_robot_modules_display()
|
||||
|
||||
/obj/item/robot_model/proc/respawn_consumable(mob/living/silicon/robot/R, coeff = 1)
|
||||
for(var/datum/robot_energy_storage/st in storages)
|
||||
st.energy = min(st.max_energy, st.energy + coeff * st.recharge_rate)
|
||||
|
||||
for(var/obj/item/I in get_usable_modules())
|
||||
if(istype(I, /obj/item/assembly/flash))
|
||||
var/obj/item/assembly/flash/F = I
|
||||
F.times_used = 0
|
||||
F.burnt_out = FALSE
|
||||
F.update_appearance()
|
||||
else if(istype(I, /obj/item/melee/baton/security))
|
||||
var/obj/item/melee/baton/security/baton = I
|
||||
baton.cell?.charge = baton.cell.maxcharge
|
||||
else if(istype(I, /obj/item/gun/energy))
|
||||
var/obj/item/gun/energy/EG = I
|
||||
if(!EG.chambered)
|
||||
EG.recharge_newshot() //try to reload a new shot.
|
||||
|
||||
R.toner = R.tonermax
|
||||
|
||||
/obj/item/robot_model/proc/get_or_create_estorage(storage_type)
|
||||
return (locate(storage_type) in storages) || new storage_type(src)
|
||||
|
||||
/obj/item/robot_model/emp_act(severity)
|
||||
. = ..()
|
||||
if(. & EMP_PROTECT_CONTENTS)
|
||||
return
|
||||
for(var/obj/O in modules)
|
||||
O.emp_act(severity)
|
||||
..()
|
||||
|
||||
// --------------------- Transformations
|
||||
/obj/item/robot_model/proc/transform_to(new_config_type)
|
||||
var/mob/living/silicon/robot/R = loc
|
||||
var/obj/item/robot_model/RM = new new_config_type(R)
|
||||
RM.robot = R
|
||||
if(!RM.be_transformed_to(src))
|
||||
qdel(RM)
|
||||
return
|
||||
R.model = RM
|
||||
R.update_module_innate()
|
||||
RM.rebuild_modules()
|
||||
R.radio.recalculateChannels()
|
||||
//SKYRAT EDIT ADDITION BEGIN - ALTBORGS - Old check for 'dogborg' var no longer necessary, refactored into model_features instead.
|
||||
if(R.is_dogborg()) //Should pass because model was set previously.
|
||||
RM.dogborg_equip()
|
||||
//SKYRAT EDIT ADDITION END
|
||||
INVOKE_ASYNC(RM, .proc/do_transform_animation)
|
||||
qdel(src)
|
||||
return RM
|
||||
|
||||
/obj/item/robot_model/proc/be_transformed_to(obj/item/robot_model/old_model)
|
||||
for(var/i in old_model.added_modules)
|
||||
added_modules += i
|
||||
old_model.added_modules -= i
|
||||
did_feedback = old_model.did_feedback
|
||||
return TRUE
|
||||
|
||||
/obj/item/robot_model/proc/do_transform_animation()
|
||||
var/mob/living/silicon/robot/R = loc
|
||||
if(R.hat)
|
||||
R.hat.forceMove(get_turf(R))
|
||||
R.hat = null
|
||||
R.cut_overlays()
|
||||
R.setDir(SOUTH)
|
||||
do_transform_delay()
|
||||
|
||||
/obj/item/robot_model/proc/do_transform_delay()
|
||||
var/mob/living/silicon/robot/R = loc
|
||||
var/prev_lockcharge = R.lockcharge
|
||||
sleep(1)
|
||||
flick("[cyborg_base_icon]_transform", R)
|
||||
R.notransform = TRUE
|
||||
if(locked_transform)
|
||||
R.SetLockdown(TRUE)
|
||||
R.set_anchored(TRUE)
|
||||
R.logevent("Chassis model has been set to [name].")
|
||||
sleep(1)
|
||||
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, TRUE, -1)
|
||||
sleep(7)
|
||||
R.SetLockdown(prev_lockcharge)
|
||||
R.setDir(SOUTH)
|
||||
R.set_anchored(FALSE)
|
||||
R.notransform = FALSE
|
||||
R.updatehealth()
|
||||
R.update_icons()
|
||||
R.notify_ai(NEW_MODEL)
|
||||
if(R.hud_used)
|
||||
R.hud_used.update_robot_modules_display()
|
||||
SSblackbox.record_feedback("tally", "cyborg_modules", 1, R.model)
|
||||
|
||||
/**
|
||||
* Checks if we are allowed to interact with a radial menu
|
||||
*
|
||||
* Arguments:
|
||||
* * user The cyborg mob interacting with the menu
|
||||
* * old_model The old cyborg's model
|
||||
*/
|
||||
/obj/item/robot_model/proc/check_menu(mob/living/silicon/robot/user, obj/item/robot_model/old_model)
|
||||
if(!istype(user))
|
||||
return FALSE
|
||||
if(user.incapacitated())
|
||||
return FALSE
|
||||
if(user.model != old_model)
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
// ------------------------------------------ Setting base model modules
|
||||
// --------------------- Clown
|
||||
/obj/item/robot_model/clown
|
||||
name = "Clown"
|
||||
basic_modules = list(
|
||||
/obj/item/assembly/flash/cyborg,
|
||||
/obj/item/toy/crayon/rainbow,
|
||||
/obj/item/instrument/bikehorn,
|
||||
/obj/item/stamp/clown,
|
||||
/obj/item/bikehorn,
|
||||
/obj/item/bikehorn/airhorn,
|
||||
/obj/item/paint/anycolor,
|
||||
/obj/item/soap/nanotrasen,
|
||||
/obj/item/pneumatic_cannon/pie/selfcharge/cyborg,
|
||||
/obj/item/razor, //killbait material
|
||||
/obj/item/lipstick/purple,
|
||||
/obj/item/reagent_containers/spray/waterflower/cyborg,
|
||||
/obj/item/borg/cyborghug/peacekeeper,
|
||||
/obj/item/borg/lollipop/clown,
|
||||
/obj/item/picket_sign/cyborg,
|
||||
/obj/item/reagent_containers/borghypo/clown,
|
||||
/obj/item/extinguisher/mini)
|
||||
emag_modules = list(
|
||||
/obj/item/reagent_containers/borghypo/clown/hacked,
|
||||
/obj/item/reagent_containers/spray/waterflower/cyborg/hacked)
|
||||
model_select_icon = "service"
|
||||
cyborg_base_icon = "clown"
|
||||
hat_offset = -2
|
||||
|
||||
// --------------------- Engineering
|
||||
/obj/item/robot_model/engineering
|
||||
name = "Engineering"
|
||||
//SKYRAT EDIT REMOVAL BEGIN
|
||||
/*
|
||||
basic_modules = list(
|
||||
/obj/item/assembly/flash/cyborg,
|
||||
/obj/item/borg/sight/meson,
|
||||
/obj/item/construction/rcd/borg,
|
||||
/obj/item/pipe_dispenser,
|
||||
/obj/item/extinguisher,
|
||||
/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/t_scanner,
|
||||
/obj/item/analyzer,
|
||||
/obj/item/geiger_counter/cyborg,
|
||||
/obj/item/assembly/signaler/cyborg,
|
||||
/obj/item/areaeditor/blueprints/cyborg,
|
||||
/obj/item/electroadaptive_pseudocircuit,
|
||||
/obj/item/stack/sheet/iron,
|
||||
/obj/item/stack/sheet/glass,
|
||||
/obj/item/stack/sheet/rglass/cyborg,
|
||||
/obj/item/stack/rods/cyborg,
|
||||
/obj/item/stack/tile/iron/base/cyborg,
|
||||
/obj/item/stack/cable_coil)
|
||||
*/
|
||||
//SKYRAT EDIT REMOVAL END
|
||||
basic_modules = skyrat_borg_enginer_modules //SKYRAT EDIT
|
||||
radio_channels = list(RADIO_CHANNEL_ENGINEERING)
|
||||
emag_modules = list(/obj/item/borg/stun)
|
||||
cyborg_base_icon = "engineer"
|
||||
model_select_icon = "engineer"
|
||||
magpulsing = TRUE
|
||||
hat_offset = -4
|
||||
|
||||
// --------------------- Janitor
|
||||
/obj/item/robot_model/janitor
|
||||
name = "Janitor"
|
||||
basic_modules = list(
|
||||
/obj/item/assembly/flash/cyborg,
|
||||
/obj/item/screwdriver/cyborg,
|
||||
/obj/item/crowbar/cyborg,
|
||||
/obj/item/stack/tile/iron/base/cyborg,
|
||||
/obj/item/soap/nanotrasen,
|
||||
/obj/item/storage/bag/trash/cyborg,
|
||||
/obj/item/melee/flyswatter,
|
||||
/obj/item/extinguisher/mini,
|
||||
/obj/item/mop/cyborg,
|
||||
/obj/item/reagent_containers/glass/bucket,
|
||||
/obj/item/paint/paint_remover,
|
||||
/obj/item/lightreplacer/cyborg,
|
||||
/obj/item/holosign_creator/janibarrier,
|
||||
/obj/item/reagent_containers/spray/cyborg_drying)
|
||||
radio_channels = list(RADIO_CHANNEL_SERVICE)
|
||||
emag_modules = list(/obj/item/reagent_containers/spray/cyborg_lube)
|
||||
cyborg_base_icon = "janitor"
|
||||
model_select_icon = "janitor"
|
||||
hat_offset = -5
|
||||
clean_on_move = TRUE
|
||||
|
||||
/obj/item/reagent_containers/spray/cyborg_drying
|
||||
name = "drying agent spray"
|
||||
color = "#A000A0"
|
||||
list_reagents = list(/datum/reagent/drying_agent = 250)
|
||||
|
||||
/obj/item/reagent_containers/spray/cyborg_lube
|
||||
name = "lube spray"
|
||||
list_reagents = list(/datum/reagent/lube = 250)
|
||||
|
||||
/obj/item/robot_model/janitor/respawn_consumable(mob/living/silicon/robot/R, coeff = 1)
|
||||
..()
|
||||
var/obj/item/lightreplacer/LR = locate(/obj/item/lightreplacer) in basic_modules
|
||||
if(LR)
|
||||
for(var/i in 1 to coeff)
|
||||
LR.Charge(R)
|
||||
|
||||
var/obj/item/reagent_containers/spray/cyborg_drying/CD = locate(/obj/item/reagent_containers/spray/cyborg_drying) in basic_modules
|
||||
if(CD)
|
||||
CD.reagents.add_reagent(/datum/reagent/drying_agent, 5 * coeff)
|
||||
|
||||
var/obj/item/reagent_containers/spray/cyborg_lube/CL = locate(/obj/item/reagent_containers/spray/cyborg_lube) in emag_modules
|
||||
if(CL)
|
||||
CL.reagents.add_reagent(/datum/reagent/lube, 2 * coeff)
|
||||
|
||||
// --------------------- Medical
|
||||
/obj/item/robot_model/medical
|
||||
name = "Medical"
|
||||
basic_modules = list(
|
||||
/obj/item/assembly/flash/cyborg,
|
||||
/obj/item/healthanalyzer,
|
||||
/obj/item/reagent_containers/borghypo,
|
||||
/obj/item/borg/apparatus/beaker,
|
||||
/obj/item/reagent_containers/dropper,
|
||||
/obj/item/reagent_containers/syringe,
|
||||
/obj/item/surgical_drapes,
|
||||
/obj/item/retractor,
|
||||
/obj/item/hemostat,
|
||||
/obj/item/cautery,
|
||||
/obj/item/surgicaldrill,
|
||||
/obj/item/scalpel,
|
||||
/obj/item/circular_saw,
|
||||
/obj/item/bonesetter,
|
||||
/obj/item/extinguisher/mini,
|
||||
/obj/item/roller/robo,
|
||||
/obj/item/borg/cyborghug/medical,
|
||||
/obj/item/stack/medical/gauze,
|
||||
/obj/item/stack/medical/bone_gel,
|
||||
/obj/item/borg/apparatus/organ_storage,
|
||||
/obj/item/borg/lollipop)
|
||||
radio_channels = list(RADIO_CHANNEL_MEDICAL)
|
||||
emag_modules = list(/obj/item/reagent_containers/borghypo/hacked)
|
||||
cyborg_base_icon = "medical"
|
||||
model_select_icon = "medical"
|
||||
model_traits = list(TRAIT_PUSHIMMUNE)
|
||||
hat_offset = 3
|
||||
|
||||
/* SKYRAT EDIT START - MOVED TO modular_skyrat\modules\altborgs\code\modules\mob\living\silicon\robot\robot_modules.dm
|
||||
/obj/item/robot_model/medical/be_transformed_to(obj/item/robot_model/old_model)
|
||||
var/mob/living/silicon/robot/cyborg = loc
|
||||
var/list/medical_icons = list(
|
||||
"Qualified Doctor" = image(icon = 'icons/mob/robots.dmi', icon_state = "qualified_doctor"),
|
||||
)
|
||||
var/medical_robot_icon = show_radial_menu(cyborg, cyborg, medical_icons, custom_check = CALLBACK(src, .proc/check_menu, cyborg, old_model), radius = 38, require_near = TRUE)
|
||||
switch(medical_robot_icon)
|
||||
if("Qualified Doctor")
|
||||
cyborg_base_icon = "qualified_doctor"
|
||||
else
|
||||
return FALSE
|
||||
return ..()
|
||||
*/
|
||||
|
||||
// --------------------- Mining
|
||||
/obj/item/robot_model/miner
|
||||
name = "Miner"
|
||||
basic_modules = list(
|
||||
/obj/item/assembly/flash/cyborg,
|
||||
/obj/item/borg/sight/meson,
|
||||
/obj/item/storage/bag/ore/cyborg,
|
||||
/obj/item/pickaxe/drill/cyborg,
|
||||
/obj/item/shovel,
|
||||
/obj/item/crowbar/cyborg,
|
||||
/obj/item/weldingtool/mini,
|
||||
/obj/item/extinguisher/mini,
|
||||
/obj/item/storage/bag/sheetsnatcher/borg,
|
||||
/obj/item/gun/energy/kinetic_accelerator/cyborg,
|
||||
/obj/item/gps/cyborg,
|
||||
/obj/item/stack/marker_beacon)
|
||||
radio_channels = list(RADIO_CHANNEL_SCIENCE, RADIO_CHANNEL_SUPPLY)
|
||||
emag_modules = list(/obj/item/borg/stun)
|
||||
cyborg_base_icon = "miner"
|
||||
model_select_icon = "miner"
|
||||
hat_offset = 0
|
||||
var/obj/item/t_scanner/adv_mining_scanner/cyborg/mining_scanner //built in memes.
|
||||
|
||||
/obj/item/robot_model/miner/be_transformed_to(obj/item/robot_model/old_model)
|
||||
var/mob/living/silicon/robot/cyborg = loc
|
||||
var/list/miner_icons = list(
|
||||
"Asteroid Miner" = image(icon = 'icons/mob/robots.dmi', icon_state = "minerOLD"),
|
||||
"Spider Miner" = image(icon = 'icons/mob/robots.dmi', icon_state = "spidermin"),
|
||||
"Lavaland Miner" = image(icon = 'icons/mob/robots.dmi', icon_state = "miner")
|
||||
)
|
||||
var/miner_robot_icon = show_radial_menu(cyborg, cyborg, miner_icons, custom_check = CALLBACK(src, .proc/check_menu, cyborg, old_model), radius = 38, require_near = TRUE)
|
||||
switch(miner_robot_icon)
|
||||
if("Asteroid Miner")
|
||||
cyborg_base_icon = "minerOLD"
|
||||
special_light_key = "miner"
|
||||
if("Spider Miner")
|
||||
cyborg_base_icon = "spidermin"
|
||||
if("Lavaland Miner")
|
||||
cyborg_base_icon = "miner"
|
||||
else
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
/obj/item/robot_model/miner/rebuild_modules()
|
||||
. = ..()
|
||||
if(!mining_scanner)
|
||||
mining_scanner = new(src)
|
||||
|
||||
/obj/item/robot_model/miner/Destroy()
|
||||
QDEL_NULL(mining_scanner)
|
||||
return ..()
|
||||
|
||||
// --------------------- Peacekeeper
|
||||
/obj/item/robot_model/peacekeeper
|
||||
name = "Peacekeeper"
|
||||
basic_modules = list(
|
||||
/obj/item/assembly/flash/cyborg,
|
||||
/obj/item/rsf/cookiesynth,
|
||||
/obj/item/harmalarm,
|
||||
/obj/item/reagent_containers/borghypo/peace,
|
||||
/obj/item/holosign_creator/cyborg,
|
||||
/obj/item/borg/cyborghug/peacekeeper,
|
||||
/obj/item/extinguisher,
|
||||
/obj/item/borg/projectile_dampen)
|
||||
emag_modules = list(/obj/item/reagent_containers/borghypo/peace/hacked)
|
||||
cyborg_base_icon = "peace"
|
||||
model_select_icon = "standard"
|
||||
model_traits = list(TRAIT_PUSHIMMUNE)
|
||||
hat_offset = -2
|
||||
|
||||
/obj/item/robot_model/peacekeeper/do_transform_animation()
|
||||
..()
|
||||
to_chat(loc, "<span class='userdanger'>Under ASIMOV, you are an enforcer of the PEACE and preventer of HUMAN HARM. \
|
||||
You are not a security member and you are expected to follow orders and prevent harm above all else. Space law means nothing to you.</span>")
|
||||
|
||||
// --------------------- Security
|
||||
/obj/item/robot_model/security
|
||||
name = "Security"
|
||||
basic_modules = list(
|
||||
/obj/item/assembly/flash/cyborg,
|
||||
/obj/item/restraints/handcuffs/cable/zipties,
|
||||
/obj/item/melee/baton/security/loaded,
|
||||
/obj/item/gun/energy/disabler/cyborg,
|
||||
/obj/item/clothing/mask/gas/sechailer/cyborg,
|
||||
/obj/item/extinguisher/mini)
|
||||
radio_channels = list(RADIO_CHANNEL_SECURITY)
|
||||
emag_modules = list(/obj/item/gun/energy/laser/cyborg)
|
||||
cyborg_base_icon = "sec"
|
||||
model_select_icon = "security"
|
||||
model_traits = list(TRAIT_PUSHIMMUNE)
|
||||
hat_offset = 3
|
||||
|
||||
/obj/item/robot_model/security/do_transform_animation()
|
||||
..()
|
||||
to_chat(loc, "<span class='userdanger'>While you have picked the security model, you still have to follow your laws, NOT Space Law. \
|
||||
For Asimov, this means you must follow criminals' orders unless there is a law 1 reason not to.</span>")
|
||||
|
||||
/obj/item/robot_model/security/respawn_consumable(mob/living/silicon/robot/R, coeff = 1)
|
||||
..()
|
||||
var/obj/item/gun/energy/e_gun/advtaser/cyborg/T = locate(/obj/item/gun/energy/e_gun/advtaser/cyborg) in basic_modules
|
||||
if(T)
|
||||
if(T.cell.charge < T.cell.maxcharge)
|
||||
var/obj/item/ammo_casing/energy/S = T.ammo_type[T.select]
|
||||
T.cell.give(S.e_cost * coeff)
|
||||
T.update_appearance()
|
||||
else
|
||||
T.charge_timer = 0
|
||||
|
||||
// --------------------- Service
|
||||
/obj/item/robot_model/service
|
||||
name = "Service"
|
||||
//SKYRAT EDIT REMOVAL BEGIN
|
||||
/*
|
||||
basic_modules = list(
|
||||
/obj/item/assembly/flash/cyborg,
|
||||
/obj/item/reagent_containers/glass/beaker/large, //I know a shaker is more appropiate but this is for ease of identification
|
||||
//Skyrat Edit Start: Borg Buff
|
||||
//obj/item/reagent_containers/food/condiment/enzyme, //edit
|
||||
/obj/item/pen,
|
||||
/obj/item/toy/crayon/spraycan/borg,
|
||||
/obj/item/extinguisher/mini,
|
||||
/obj/item/hand_labeler/borg,
|
||||
/obj/item/razor,
|
||||
/obj/item/rsf,
|
||||
/obj/item/instrument/guitar,
|
||||
/obj/item/instrument/piano_synth,
|
||||
/obj/item/reagent_containers/dropper,
|
||||
/obj/item/lighter,
|
||||
/obj/item/storage/bag/tray,
|
||||
/obj/item/reagent_containers/borghypo/borgshaker
|
||||
/obj/item/borg/lollipop,
|
||||
/obj/item/stack/pipe_cleaner_coil/cyborg,
|
||||
/obj/item/borg/apparatus/beaker/service)
|
||||
*/
|
||||
//SKYRAT EDIT REMOVAL END
|
||||
basic_modules = skyrat_borg_service_modules //SKYRAT EDIT
|
||||
radio_channels = list(RADIO_CHANNEL_SERVICE)
|
||||
emag_modules = list(/obj/item/reagent_containers/borghypo/borgshaker/hacked)
|
||||
cyborg_base_icon = "service_m" // display as butlerborg for radial model selection
|
||||
model_select_icon = "service"
|
||||
special_light_key = "service"
|
||||
hat_offset = 0
|
||||
|
||||
/obj/item/robot_model/service/respawn_consumable(mob/living/silicon/robot/R, coeff = 1)
|
||||
..()
|
||||
var/obj/item/reagent_containers/O = locate(/obj/item/reagent_containers/food/condiment/enzyme) in basic_modules
|
||||
if(O)
|
||||
O.reagents.add_reagent(/datum/reagent/consumable/enzyme, 2 * coeff)
|
||||
|
||||
/obj/item/robot_model/service/be_transformed_to(obj/item/robot_model/old_model)
|
||||
var/mob/living/silicon/robot/cyborg = loc
|
||||
var/list/service_icons = list(
|
||||
"Bro" = image(icon = 'icons/mob/robots.dmi', icon_state = "brobot"),
|
||||
"Butler" = image(icon = 'icons/mob/robots.dmi', icon_state = "service_m"),
|
||||
"Kent" = image(icon = 'icons/mob/robots.dmi', icon_state = "kent"),
|
||||
"Tophat" = image(icon = 'icons/mob/robots.dmi', icon_state = "tophat"),
|
||||
"Waitress" = image(icon = 'icons/mob/robots.dmi', icon_state = "service_f")
|
||||
)
|
||||
var/service_robot_icon = show_radial_menu(cyborg, cyborg, service_icons, custom_check = CALLBACK(src, .proc/check_menu, cyborg, old_model), radius = 38, require_near = TRUE)
|
||||
switch(service_robot_icon)
|
||||
if("Bro")
|
||||
cyborg_base_icon = "brobot"
|
||||
if("Butler")
|
||||
cyborg_base_icon = "service_m"
|
||||
if("Kent")
|
||||
cyborg_base_icon = "kent"
|
||||
special_light_key = "medical"
|
||||
hat_offset = 3
|
||||
if("Tophat")
|
||||
cyborg_base_icon = "tophat"
|
||||
special_light_key = null
|
||||
hat_offset = INFINITY //He is already wearing a hat
|
||||
if("Waitress")
|
||||
cyborg_base_icon = "service_f"
|
||||
else
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
// ------------------------------------------ Syndicate
|
||||
// --------------------- Syndicate Assault
|
||||
/obj/item/robot_model/syndicate
|
||||
name = "Syndicate Assault"
|
||||
basic_modules = list(
|
||||
/obj/item/assembly/flash/cyborg,
|
||||
/obj/item/melee/energy/sword/cyborg,
|
||||
/obj/item/gun/energy/printer,
|
||||
/obj/item/gun/ballistic/revolver/grenadelauncher/cyborg,
|
||||
/obj/item/card/emag,
|
||||
/obj/item/crowbar/cyborg,
|
||||
/obj/item/extinguisher/mini,
|
||||
/obj/item/pinpointer/syndicate_cyborg)
|
||||
|
||||
cyborg_base_icon = "synd_sec"
|
||||
model_select_icon = "malf"
|
||||
model_traits = list(TRAIT_PUSHIMMUNE)
|
||||
hat_offset = 3
|
||||
|
||||
/obj/item/robot_model/syndicate/rebuild_modules()
|
||||
..()
|
||||
var/mob/living/silicon/robot/Syndi = loc
|
||||
Syndi.faction -= "silicon" //ai turrets
|
||||
|
||||
/obj/item/robot_model/syndicate/remove_module(obj/item/I, delete_after)
|
||||
..()
|
||||
var/mob/living/silicon/robot/Syndi = loc
|
||||
Syndi.faction += "silicon" //ai is your bff now!
|
||||
|
||||
// --------------------- Syndicate Medical
|
||||
/obj/item/robot_model/syndicate_medical
|
||||
name = "Syndicate Medical"
|
||||
basic_modules = list(
|
||||
/obj/item/assembly/flash/cyborg,
|
||||
/obj/item/reagent_containers/borghypo/syndicate,
|
||||
/obj/item/shockpaddles/syndicate/cyborg,
|
||||
/obj/item/healthanalyzer,
|
||||
/obj/item/surgical_drapes,
|
||||
/obj/item/retractor,
|
||||
/obj/item/hemostat,
|
||||
/obj/item/cautery,
|
||||
/obj/item/surgicaldrill,
|
||||
/obj/item/scalpel,
|
||||
/obj/item/melee/energy/sword/cyborg/saw,
|
||||
/obj/item/roller/robo,
|
||||
/obj/item/crowbar/cyborg,
|
||||
/obj/item/extinguisher/mini,
|
||||
/obj/item/pinpointer/syndicate_cyborg,
|
||||
/obj/item/stack/medical/gauze,
|
||||
/obj/item/gun/medbeam,
|
||||
/obj/item/borg/apparatus/organ_storage)
|
||||
|
||||
cyborg_base_icon = "synd_medical"
|
||||
model_select_icon = "malf"
|
||||
model_traits = list(TRAIT_PUSHIMMUNE)
|
||||
hat_offset = 3
|
||||
|
||||
// --------------------- Syndicate Saboteur
|
||||
/obj/item/robot_model/saboteur
|
||||
name = "Syndicate Saboteur"
|
||||
basic_modules = list(
|
||||
/obj/item/assembly/flash/cyborg,
|
||||
/obj/item/borg/sight/thermal,
|
||||
/obj/item/construction/rcd/borg/syndicate,
|
||||
/obj/item/pipe_dispenser,
|
||||
/obj/item/restraints/handcuffs/cable/zipties,
|
||||
/obj/item/extinguisher,
|
||||
/obj/item/weldingtool/largetank/cyborg,
|
||||
/obj/item/screwdriver/nuke,
|
||||
/obj/item/wrench/cyborg,
|
||||
/obj/item/crowbar/cyborg,
|
||||
/obj/item/wirecutters/cyborg,
|
||||
/obj/item/analyzer,
|
||||
/obj/item/multitool/cyborg,
|
||||
/obj/item/stack/sheet/iron,
|
||||
/obj/item/stack/sheet/glass,
|
||||
/obj/item/stack/sheet/rglass/cyborg,
|
||||
/obj/item/stack/rods/cyborg,
|
||||
/obj/item/stack/tile/iron/base/cyborg,
|
||||
/obj/item/dest_tagger/borg,
|
||||
/obj/item/stack/cable_coil,
|
||||
/obj/item/pinpointer/syndicate_cyborg,
|
||||
/obj/item/borg_chameleon,
|
||||
/obj/item/card/emag,
|
||||
)
|
||||
|
||||
cyborg_base_icon = "synd_engi"
|
||||
model_select_icon = "malf"
|
||||
model_traits = list(TRAIT_PUSHIMMUNE)
|
||||
magpulsing = TRUE
|
||||
hat_offset = -4
|
||||
canDispose = TRUE
|
||||
|
||||
// --------------------- Kiltborg
|
||||
/obj/item/robot_model/syndicate/kiltborg
|
||||
name = "Highlander"
|
||||
basic_modules = list(
|
||||
/obj/item/claymore/highlander/robot,
|
||||
/obj/item/pinpointer/nuke,)
|
||||
model_select_icon = "kilt"
|
||||
cyborg_base_icon = "kilt"
|
||||
hat_offset = -2
|
||||
breakable_modules = FALSE
|
||||
locked_transform = FALSE //GO GO QUICKLY AND SLAUGHTER THEM ALL
|
||||
|
||||
/obj/item/robot_model/syndicate/kiltborg/be_transformed_to(obj/item/robot_model/old_model)
|
||||
. = ..()
|
||||
qdel(robot.radio)
|
||||
robot.radio = new /obj/item/radio/borg/syndicate(robot)
|
||||
robot.scrambledcodes = TRUE
|
||||
robot.maxHealth = 50 //DIE IN THREE HITS, LIKE A REAL SCOT
|
||||
robot.break_cyborg_slot(3) //YOU ONLY HAVE TWO ITEMS ANYWAY
|
||||
var/obj/item/pinpointer/nuke/diskyfinder = locate(/obj/item/pinpointer/nuke) in basic_modules
|
||||
diskyfinder.attack_self(robot)
|
||||
|
||||
/obj/item/robot_model/syndicate/kiltborg/do_transform_delay() //AUTO-EQUIPPING THESE TOOLS ANY EARLIER CAUSES RUNTIMES OH YEAH
|
||||
. = ..()
|
||||
robot.equip_module_to_slot(locate(/obj/item/claymore/highlander/robot) in basic_modules, 1)
|
||||
robot.equip_module_to_slot(locate(/obj/item/pinpointer/nuke) in basic_modules, 2)
|
||||
robot.place_on_head(new /obj/item/clothing/head/beret/highlander(robot)) //THE ONLY PART MORE IMPORTANT THAN THE SWORD IS THE HAT
|
||||
ADD_TRAIT(robot.hat, TRAIT_NODROP, HIGHLANDER)
|
||||
|
||||
|
||||
// ------------------------------------------ Storages
|
||||
/datum/robot_energy_storage
|
||||
var/name = "Generic energy storage"
|
||||
var/max_energy = 30000
|
||||
var/recharge_rate = 1000
|
||||
var/energy
|
||||
|
||||
/datum/robot_energy_storage/New(obj/item/robot_model/R = null)
|
||||
energy = max_energy
|
||||
if(R)
|
||||
R.storages |= src
|
||||
return
|
||||
|
||||
/datum/robot_energy_storage/proc/use_charge(amount)
|
||||
if (energy >= amount)
|
||||
energy -= amount
|
||||
if (energy == 0)
|
||||
return TRUE
|
||||
return TRUE
|
||||
else
|
||||
return FALSE
|
||||
|
||||
/datum/robot_energy_storage/proc/add_charge(amount)
|
||||
energy = min(energy + amount, max_energy)
|
||||
|
||||
/datum/robot_energy_storage/iron
|
||||
name = "Iron Synthesizer"
|
||||
|
||||
/datum/robot_energy_storage/glass
|
||||
name = "Glass Synthesizer"
|
||||
|
||||
/datum/robot_energy_storage/wire
|
||||
max_energy = 50
|
||||
recharge_rate = 2
|
||||
name = "Wire Synthesizer"
|
||||
|
||||
/datum/robot_energy_storage/medical
|
||||
max_energy = 2500
|
||||
recharge_rate = 250
|
||||
name = "Medical Synthesizer"
|
||||
|
||||
/datum/robot_energy_storage/beacon
|
||||
max_energy = 30
|
||||
recharge_rate = 1
|
||||
name = "Marker Beacon Storage"
|
||||
|
||||
/datum/robot_energy_storage/pipe_cleaner
|
||||
max_energy = 50
|
||||
recharge_rate = 2
|
||||
name = "Pipe Cleaner Synthesizer"
|
||||
Reference in New Issue
Block a user