Merge branch 'master' of https://github.com/Citadel-Station-13/Citadel-Station-13 into Ghommie-cit11
This commit is contained in:
@@ -121,3 +121,4 @@
|
||||
#define ORGAN_SLOT_BRAIN_ANTIDROP "brain_antidrop"
|
||||
#define ORGAN_SLOT_BRAIN_ANTISTUN "brain_antistun"
|
||||
#define ORGAN_SLOT_TAIL "tail"
|
||||
#define ORGAN_SLOT_PENIS "penis"
|
||||
|
||||
@@ -95,6 +95,7 @@
|
||||
#define NOAROUSAL 37 //Stops all arousal effects
|
||||
#define NOGENITALS 38 //Cannot create, use, or otherwise have genitals
|
||||
#define MATRIXED 39 //if icon is color matrix'd
|
||||
#define SKINTONE 40 //uses skin tones
|
||||
|
||||
//Citadel istypes
|
||||
#define isborer(A) (istype(A, /mob/living/simple_animal/borer))
|
||||
|
||||
@@ -474,4 +474,6 @@ GLOBAL_LIST_INIT(pda_styles, list(MONO, VT, ORBITRON, SHARE))
|
||||
#define CLIENT_FROM_VAR(I) (ismob(I) ? I:client : (istype(I, /client) ? I : (istype(I, /datum/mind) ? I:current?:client : null)))
|
||||
|
||||
#define AREASELECT_CORNERA "corner A"
|
||||
#define AREASELECT_CORNERB "corner B"
|
||||
#define AREASELECT_CORNERB "corner B"
|
||||
|
||||
#define PREF_SAVELOAD_COOLDOWN 5
|
||||
@@ -199,6 +199,10 @@
|
||||
if(length(CONFIG_GET(keyed_list/cross_server)))
|
||||
send_news_report()
|
||||
|
||||
//tell the nice people on discord what went on before the salt cannon happens.
|
||||
world.TgsTargetedChatBroadcast("The current round has ended. Please standby for your shift interlude Nanotrasen News Network's report!", FALSE)
|
||||
world.TgsTargetedChatBroadcast(send_news_report(),FALSE)
|
||||
|
||||
CHECK_TICK
|
||||
|
||||
//These need update to actually reflect the real antagonists
|
||||
|
||||
@@ -108,5 +108,6 @@ GLOBAL_LIST_INIT(maintenance_loot, list(
|
||||
/obj/item/toy/eightball = 1,
|
||||
/obj/item/reagent_containers/pill/floorpill = 1,
|
||||
/obj/item/storage/daki = 3, //VERY IMPORTANT CIT CHANGE - adds bodypillows to maint
|
||||
/obj/item/storage/pill_bottle/penis_enlargement = 2,
|
||||
"" = 3
|
||||
))
|
||||
|
||||
@@ -50,17 +50,20 @@ PROCESSING_SUBSYSTEM_DEF(circuit)
|
||||
/obj/item/electronic_assembly/simple,
|
||||
/obj/item/electronic_assembly/hook,
|
||||
/obj/item/electronic_assembly/pda,
|
||||
/obj/item/electronic_assembly/dildo,
|
||||
/obj/item/electronic_assembly/small/default,
|
||||
/obj/item/electronic_assembly/small/cylinder,
|
||||
/obj/item/electronic_assembly/small/scanner,
|
||||
/obj/item/electronic_assembly/small/hook,
|
||||
/obj/item/electronic_assembly/small/box,
|
||||
/obj/item/electronic_assembly/small/dildo,
|
||||
/obj/item/electronic_assembly/medium/default,
|
||||
/obj/item/electronic_assembly/medium/box,
|
||||
/obj/item/electronic_assembly/medium/clam,
|
||||
/obj/item/electronic_assembly/medium/medical,
|
||||
/obj/item/electronic_assembly/medium/gun,
|
||||
/obj/item/electronic_assembly/medium/radio,
|
||||
/obj/item/electronic_assembly/medium/dildo,
|
||||
/obj/item/electronic_assembly/large/default,
|
||||
/obj/item/electronic_assembly/large/scope,
|
||||
/obj/item/electronic_assembly/large/terminal,
|
||||
@@ -89,4 +92,4 @@ PROCESSING_SUBSYSTEM_DEF(circuit)
|
||||
/obj/item/card/data/full_color,
|
||||
/obj/item/card/data/disk
|
||||
)
|
||||
|
||||
|
||||
|
||||
@@ -564,6 +564,9 @@ SUBSYSTEM_DEF(ticker)
|
||||
|
||||
if(news_message)
|
||||
send2otherserver(news_source, news_message,"News_Report")
|
||||
return news_message
|
||||
else
|
||||
return "We regret to inform you that shit be whack, yo. None of our reporters have any idea of what may or may not have gone on."
|
||||
|
||||
/datum/controller/subsystem/ticker/proc/GetTimeLeft()
|
||||
if(isnull(SSticker.timeLeft))
|
||||
|
||||
@@ -63,7 +63,7 @@
|
||||
storage_type = /obj/item/watertank/atmos
|
||||
|
||||
/obj/machinery/suit_storage_unit/mining
|
||||
suit_type = /obj/item/clothing/suit/hooded/explorer
|
||||
suit_type = /obj/item/clothing/suit/hooded/explorer/standard
|
||||
mask_type = /obj/item/clothing/mask/gas/explorer
|
||||
|
||||
/obj/machinery/suit_storage_unit/mining/eva
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
message_admins("EMP with size ([heavy_range], [light_range]) in area [epicenter.loc.name] ")
|
||||
log_game("EMP with size ([heavy_range], [light_range]) in area [epicenter.loc.name] ")
|
||||
|
||||
if(heavy_range > 1)
|
||||
if(heavy_range >= 1)
|
||||
new /obj/effect/temp_visual/emp/pulse(epicenter)
|
||||
|
||||
if(heavy_range > light_range)
|
||||
|
||||
@@ -362,7 +362,7 @@ AI MODULES
|
||||
/obj/item/aiModule/core/full/asimov
|
||||
name = "'Asimov' Core AI Module"
|
||||
law_id = "asimov"
|
||||
var/subject = "human being"
|
||||
var/subject = "person of an NT approved crew species" //CITADEL CHANGED FROM HUMANS!
|
||||
|
||||
/obj/item/aiModule/core/full/asimov/attack_self(var/mob/user as mob)
|
||||
var/targName = stripped_input(user, "Please enter a new subject that asimov is concerned with.", "Asimov to whom?", subject)
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
var/cell_type = /obj/item/stock_parts/cell/high
|
||||
var/obj/item/stock_parts/cell/cell
|
||||
var/recharging = FALSE
|
||||
var/gun_charger = FALSE
|
||||
|
||||
/obj/item/inducer/Initialize()
|
||||
. = ..()
|
||||
@@ -104,7 +105,7 @@
|
||||
var/obj/item/stock_parts/cell/C = A.get_cell()
|
||||
var/obj/O
|
||||
var/coefficient = 1
|
||||
if(istype(A, /obj/item/gun/energy))
|
||||
if(istype(A, /obj/item/gun/energy) && gun_charger != TRUE)
|
||||
to_chat(user,"Error unable to interface with device")
|
||||
return FALSE
|
||||
if(istype(A, /obj))
|
||||
@@ -181,3 +182,26 @@
|
||||
/obj/item/inducer/sci/Initialize()
|
||||
. = ..()
|
||||
update_icon()
|
||||
|
||||
/obj/item/inducer/sci/combat
|
||||
icon_state = "inducer-combat"
|
||||
item_state = "inducer-combat"
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
slot_flags = SLOT_BELT
|
||||
desc = "A tool for inductively charging internal power cells. This one has been modified and upgraded to be able to charge into guns as well as normal electronics."
|
||||
cell_type = /obj/item/stock_parts/cell/hyper
|
||||
powertransfer = 1300
|
||||
opened = FALSE
|
||||
gun_charger = TRUE
|
||||
|
||||
/obj/item/inducer/sci/combat/dry
|
||||
cell_type = null
|
||||
opened = TRUE
|
||||
|
||||
/obj/item/inducer/sci/combat/dry/Initialize() //Just in case
|
||||
. = ..()
|
||||
update_icon()
|
||||
|
||||
/obj/item/inducer/sci/combat/Initialize()
|
||||
. = ..()
|
||||
update_icon()
|
||||
|
||||
@@ -382,8 +382,8 @@ GLOBAL_LIST_INIT(runed_metal_recipes, list ( \
|
||||
GLOBAL_LIST_INIT(brass_recipes, list ( \
|
||||
new/datum/stack_recipe("wall gear", /obj/structure/destructible/clockwork/wall_gear, 3, time = 10, one_per_turf = TRUE, on_floor = TRUE), \
|
||||
null,
|
||||
new/datum/stack_recipe("pinion airlock", /obj/machinery/door/airlock/clockwork, 5, time = 50, one_per_turf = TRUE, on_floor = TRUE), \
|
||||
new/datum/stack_recipe("brass pinion airlock", /obj/machinery/door/airlock/clockwork/brass, 5, time = 50, one_per_turf = TRUE, on_floor = TRUE), \
|
||||
new/datum/stack_recipe("brass pinion airlock", /obj/machinery/door/airlock/clockwork, 5, time = 50, one_per_turf = TRUE, on_floor = TRUE), \
|
||||
new/datum/stack_recipe("brass pinion airlock - windowed", /obj/machinery/door/airlock/clockwork/brass, 5, time = 50, one_per_turf = TRUE, on_floor = TRUE), \
|
||||
new/datum/stack_recipe("brass windoor", /obj/machinery/door/window/clockwork, 2, time = 30, on_floor = TRUE, window_checks = TRUE), \
|
||||
null,
|
||||
new/datum/stack_recipe("directional brass window", /obj/structure/window/reinforced/clockwork/unanchored, time = 0, on_floor = TRUE, window_checks = TRUE), \
|
||||
@@ -392,11 +392,14 @@ GLOBAL_LIST_INIT(brass_recipes, list ( \
|
||||
new/datum/stack_recipe("brass table frame", /obj/structure/table_frame/brass, 1, time = 5, one_per_turf = TRUE, on_floor = TRUE), \
|
||||
null,
|
||||
new/datum/stack_recipe("sender - pressure sensor", /obj/structure/destructible/clockwork/trap/trigger/pressure_sensor, 2, time = 20, one_per_turf = TRUE, on_floor = TRUE), \
|
||||
new/datum/stack_recipe("sender - mech sensor", /obj/structure/destructible/clockwork/trap/trigger/pressure_sensor/mech, 2, time = 20, one_per_turf = TRUE, on_floor = TRUE), \
|
||||
new/datum/stack_recipe("sender - lever", /obj/structure/destructible/clockwork/trap/trigger/lever, 1, time = 10, one_per_turf = TRUE, on_floor = TRUE), \
|
||||
new/datum/stack_recipe("sender - repeater", /obj/structure/destructible/clockwork/trap/trigger/repeater, 2, time = 20, one_per_turf = TRUE, on_floor = TRUE), \
|
||||
null,
|
||||
new/datum/stack_recipe("receiver - brass skewer", /obj/structure/destructible/clockwork/trap/brass_skewer, 2, time = 20, one_per_turf = TRUE, on_floor = TRUE, placement_checks = STACK_CHECK_ADJACENT), \
|
||||
new/datum/stack_recipe("receiver - steam vent", /obj/structure/destructible/clockwork/trap/steam_vent, 3, time = 30, one_per_turf = TRUE, on_floor = TRUE, placement_checks = STACK_CHECK_CARDINALS), \
|
||||
new/datum/stack_recipe("receiver - power nullifier", /obj/structure/destructible/clockwork/trap/power_nullifier, 5, time = 20, one_per_turf = TRUE, on_floor = TRUE, placement_checks = STACK_CHECK_CARDINALS), \
|
||||
|
||||
))
|
||||
|
||||
/obj/item/stack/tile/brass
|
||||
|
||||
@@ -48,6 +48,13 @@
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 50)
|
||||
component_type = /datum/component/storage/concrete/bluespace/bag_of_holding
|
||||
|
||||
/obj/item/storage/backpack/holding/satchel
|
||||
name = "satchel of holding"
|
||||
desc = "A satchel that opens into a localized pocket of Blue Space."
|
||||
icon_state = "holdingsat"
|
||||
item_state = "holdingsat"
|
||||
species_exception = list(/datum/species/angel)
|
||||
|
||||
/obj/item/storage/backpack/holding/ComponentInitialize()
|
||||
. = ..()
|
||||
GET_COMPONENT(STR, /datum/component/storage)
|
||||
|
||||
@@ -122,7 +122,7 @@
|
||||
new /obj/item/reagent_containers/pill/antirad(src)
|
||||
new /obj/item/reagent_containers/food/drinks/bottle/vodka(src)
|
||||
new /obj/item/healthanalyzer(src)
|
||||
|
||||
|
||||
|
||||
/obj/item/storage/firstaid/o2
|
||||
name = "oxygen deprivation treatment kit"
|
||||
@@ -312,3 +312,11 @@
|
||||
/obj/item/storage/pill_bottle/mutarad/PopulateContents()
|
||||
for(var/i in 1 to 7)
|
||||
new /obj/item/reagent_containers/pill/mutarad(src)
|
||||
|
||||
/obj/item/storage/pill_bottle/penis_enlargement
|
||||
name = "penis enlargement pills"
|
||||
desc = "You want penis enlargement pills?"
|
||||
|
||||
/obj/item/storage/pill_bottle/penis_enlargement/PopulateContents()
|
||||
for(var/i in 1 to 7)
|
||||
new /obj/item/reagent_containers/pill/penis_enlargement(src)
|
||||
|
||||
@@ -208,3 +208,38 @@
|
||||
new/obj/item/stack/cable_coil/orange(src)
|
||||
new/obj/item/stack/cable_coil/cyan(src)
|
||||
new/obj/item/stack/cable_coil/white(src)
|
||||
|
||||
/obj/item/storage/toolbox/gold_real
|
||||
name = "golden toolbox"
|
||||
desc = "A larger then normal toolbox made of gold plated plastitanium."
|
||||
item_state = "gold"
|
||||
icon_state = "gold"
|
||||
has_latches = FALSE
|
||||
force = 16 // Less then a spear
|
||||
throwforce = 14
|
||||
throw_speed = 5
|
||||
throw_range = 10
|
||||
|
||||
/obj/item/storage/toolbox/gold_real/PopulateContents()
|
||||
new /obj/item/screwdriver/nuke(src)
|
||||
new /obj/item/wrench(src)
|
||||
new /obj/item/weldingtool/largetank(src)
|
||||
new /obj/item/crowbar/red(src)
|
||||
new /obj/item/wirecutters(src, "red")
|
||||
new /obj/item/multitool/ai_detect(src)
|
||||
new /obj/item/clothing/gloves/combat(src)
|
||||
|
||||
/obj/item/storage/toolbox/gold_real/ComponentInitialize()
|
||||
. = ..()
|
||||
GET_COMPONENT(STR, /datum/component/storage)
|
||||
STR.max_combined_w_class = 40
|
||||
STR.max_items = 12
|
||||
|
||||
/obj/item/storage/toolbox/gold_fake // used in crafting
|
||||
name = "golden toolbox"
|
||||
desc = "A gold plated toolbox, fancy and harmless do to the gold plating being on cardboard!"
|
||||
icon_state = "gold"
|
||||
item_state = "gold"
|
||||
has_latches = FALSE
|
||||
force = 0
|
||||
throwforce = 0
|
||||
|
||||
@@ -225,6 +225,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
|
||||
|
||||
/obj/item/katana/cursed
|
||||
slot_flags = null
|
||||
item_flags = NODROP
|
||||
|
||||
/obj/item/katana/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] is slitting [user.p_their()] stomach open with [src]! It looks like [user.p_theyre()] trying to commit seppuku!</span>")
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
|
||||
#define MUSICIAN_HEARCHECK_MINDELAY 4
|
||||
#define MUSIC_MAXLINES 300
|
||||
#define MUSIC_MAXLINES 600
|
||||
#define MUSIC_MAXLINECHARS 50
|
||||
|
||||
/datum/song
|
||||
|
||||
@@ -217,3 +217,7 @@
|
||||
/proc/_step_away(ref, trg, max)
|
||||
step_away(ref, trg, max)
|
||||
|
||||
/proc/_instantiate_at(thing, location)
|
||||
new thing(location)
|
||||
|
||||
|
||||
|
||||
@@ -503,6 +503,7 @@ Congratulations! You are now trained for invasive xenobiology research!"}
|
||||
L.lastattacker = user.real_name
|
||||
L.lastattackerckey = user.ckey
|
||||
|
||||
L.adjustStaminaLoss(35) //because previously it took 5-6 hits to actually "incapacitate" someone for the purposes of the sleep inducement
|
||||
L.Knockdown(140)
|
||||
L.apply_effect(EFFECT_STUTTER, 7)
|
||||
SEND_SIGNAL(L, COMSIG_LIVING_MINOR_SHOCK)
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
explosion_block = 3
|
||||
point_return = 4
|
||||
atmosblock = TRUE
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90)
|
||||
armor = list("melee" = 25, "bullet" = 25, "laser" = 15, "energy" = 10, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90)
|
||||
|
||||
/obj/structure/blob/shield/scannerreport()
|
||||
if(atmosblock)
|
||||
@@ -20,11 +20,12 @@
|
||||
|
||||
/obj/structure/blob/shield/update_icon()
|
||||
..()
|
||||
if(obj_integrity <= 75)
|
||||
if(obj_integrity <= 70)
|
||||
icon_state = "blob_shield_damaged"
|
||||
name = "weakened strong blob"
|
||||
desc = "A wall of twitching tendrils."
|
||||
atmosblock = FALSE
|
||||
armor = list("melee" = 15, "bullet" = 15, "laser" = 5, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90)
|
||||
else
|
||||
icon_state = initial(icon_state)
|
||||
name = initial(name)
|
||||
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
//Mech sensor: Activates when stepped on by a mech
|
||||
/obj/structure/destructible/clockwork/trap/trigger/pressure_sensor/mech
|
||||
name = "mech sensor"
|
||||
desc = "A thin plate of brass, barely visible but clearly distinct."
|
||||
clockwork_desc = "A trigger that will activate when a mech controlled by a non-servant runs across it."
|
||||
max_integrity = 5
|
||||
icon_state = "pressure_sensor"
|
||||
alpha = 75
|
||||
|
||||
/obj/structure/destructible/clockwork/trap/trigger/pressure_sensor/mech/Crossed(atom/movable/AM)
|
||||
|
||||
if(!istype(AM,/obj/mecha/))
|
||||
return
|
||||
|
||||
var/obj/mecha/M = AM
|
||||
if(M.occupant && is_servant_of_ratvar(M.occupant))
|
||||
return
|
||||
audible_message("<i>*click*</i>")
|
||||
playsound(src, 'sound/items/screwdriver2.ogg', 50, TRUE)
|
||||
activate()
|
||||
@@ -68,7 +68,14 @@
|
||||
mouse_opacity = MOUSE_OPACITY_OPAQUE //So players can interact with the tile it's on to pull them off
|
||||
buckle_mob(squirrel, TRUE)
|
||||
else
|
||||
visible_message("<span class='danger'>A massive brass spike erupts from the ground!</span>")
|
||||
var/obj/mecha/M = locate() in get_turf(src)
|
||||
if(M)
|
||||
M.take_damage(50,BRUTE,"melee")
|
||||
M.visible_message("<span class='danger'>A massive brass spike erupts from the ground, penetrating \the [M] and shattering the trap into pieces!</span>")
|
||||
addtimer(CALLBACK(src, .proc/take_damage, max_integrity), 1)
|
||||
else
|
||||
visible_message("<span class='danger'>A massive brass spike erupts from the ground!</span>")
|
||||
|
||||
playsound(src, 'sound/machines/clockcult/brass_skewer.ogg', 75, FALSE)
|
||||
icon_state = "[initial(icon_state)]_extended"
|
||||
density = TRUE //Skewers are one-use only
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
/obj/structure/destructible/clockwork/trap/power_nullifier
|
||||
name = "power nullifier"
|
||||
desc = "A well hidden set of wires and connections."
|
||||
clockwork_desc = "When triggered, it sets off a 3x3 emp pulse with the center suffering a stronger pulse."
|
||||
icon_state = "electric_trap"
|
||||
break_message = "<span class='warning'>The power nullifier sparks, then slowly crumbles to debris!</span>"
|
||||
max_integrity = 40
|
||||
density = FALSE
|
||||
var/activated = FALSE
|
||||
|
||||
/obj/structure/destructible/clockwork/trap/power_nullifier/activate()
|
||||
if(!activated)
|
||||
activated = TRUE
|
||||
empulse(get_turf(src),1,1,TRUE)
|
||||
|
||||
/obj/structure/destructible/clockwork/trap/power_nullifier/emp_act(var/strength=1)
|
||||
activate()
|
||||
@@ -1699,7 +1699,7 @@
|
||||
/obj/item/t_scanner/adv_mining_scanner/lesser,
|
||||
/obj/item/radio/headset/headset_cargo/mining,
|
||||
/obj/item/storage/bag/ore,
|
||||
/obj/item/clothing/suit/hooded/explorer,
|
||||
/obj/item/clothing/suit/hooded/explorer/standard,
|
||||
/obj/item/clothing/mask/gas/explorer)
|
||||
crate_name = "shaft miner starter kit"
|
||||
crate_type = /obj/structure/closet/crate/secure
|
||||
|
||||
@@ -21,6 +21,12 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
var/last_ip
|
||||
var/last_id
|
||||
|
||||
//Cooldowns for saving/loading. These are four are all separate due to loading code calling these one after another
|
||||
var/saveprefcooldown
|
||||
var/loadprefcooldown
|
||||
var/savecharcooldown
|
||||
var/loadcharcooldown
|
||||
|
||||
//game-preferences
|
||||
var/lastchangelog = "" //Saved changlog filesize to detect if there was a change
|
||||
var/ooccolor = null
|
||||
@@ -75,10 +81,76 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
var/eye_color = "000" //Eye color
|
||||
var/datum/species/pref_species = new /datum/species/human() //Mutant race
|
||||
var/list/features = list("mcolor" = "FFF",
|
||||
"tail_lizard" = "Smooth", "tail_human" = "Cat",
|
||||
"snout" = "Round", "horns" = "None", "ears" = "Cat",
|
||||
"wings" = "None", "frills" = "None", "spines" = "None",
|
||||
"body_markings" = "None", "legs" = "Normal Legs", "moth_wings" = "Plain")
|
||||
"tail_lizard" = "Smooth",
|
||||
"tail_human" = "None",
|
||||
"snout" = "Round",
|
||||
"horns" = "None",
|
||||
"ears" = "None",
|
||||
"wings" = "None",
|
||||
"frills" = "None",
|
||||
"spines" = "None",
|
||||
"body_markings" = "None",
|
||||
"legs" = "Normal Legs",
|
||||
"moth_wings" = "Plain",
|
||||
"mcolor2" = "FFF",
|
||||
"mcolor3" = "FFF",
|
||||
"mam_body_markings" = "Plain",
|
||||
"mam_ears" = "None",
|
||||
"mam_snouts" = "None",
|
||||
"mam_tail" = "None",
|
||||
"mam_tail_animated" = "None",
|
||||
"xenodorsal" = "Standard",
|
||||
"xenohead" = "Standard",
|
||||
"xenotail" = "Xenomorph Tail",
|
||||
"taur" = "None",
|
||||
"exhibitionist" = FALSE,
|
||||
"genitals_use_skintone" = FALSE,
|
||||
"has_cock" = FALSE,
|
||||
"cock_shape" = "Human",
|
||||
"cock_length" = 6,
|
||||
"cock_girth_ratio" = COCK_GIRTH_RATIO_DEF,
|
||||
"cock_color" = "fff",
|
||||
"has_sheath" = FALSE,
|
||||
"sheath_color" = "fff",
|
||||
"has_balls" = FALSE,
|
||||
"balls_internal" = FALSE,
|
||||
"balls_color" = "fff",
|
||||
"balls_amount" = 2,
|
||||
"balls_sack_size" = BALLS_SACK_SIZE_DEF,
|
||||
"balls_size" = BALLS_SIZE_DEF,
|
||||
"balls_cum_rate" = CUM_RATE,
|
||||
"balls_cum_mult" = CUM_RATE_MULT,
|
||||
"balls_efficiency" = CUM_EFFICIENCY,
|
||||
"balls_fluid" = "semen",
|
||||
"has_ovi" = FALSE,
|
||||
"ovi_shape" = "knotted",
|
||||
"ovi_length" = 6,
|
||||
"ovi_color" = "fff",
|
||||
"has_eggsack" = FALSE,
|
||||
"eggsack_internal" = TRUE,
|
||||
"eggsack_color" = "fff",
|
||||
"eggsack_size" = BALLS_SACK_SIZE_DEF,
|
||||
"eggsack_egg_color" = "fff",
|
||||
"eggsack_egg_size" = EGG_GIRTH_DEF,
|
||||
"has_breasts" = FALSE,
|
||||
"breasts_color" = "fff",
|
||||
"breasts_size" = "C",
|
||||
"breasts_shape" = "Pair",
|
||||
"breasts_fluid" = "milk",
|
||||
"has_vag" = FALSE,
|
||||
"vag_shape" = "Human",
|
||||
"vag_color" = "fff",
|
||||
"vag_clits" = 1,
|
||||
"vag_clit_diam" = 0.25,
|
||||
"has_womb" = FALSE,
|
||||
"womb_cum_rate" = CUM_RATE,
|
||||
"womb_cum_mult" = CUM_RATE_MULT,
|
||||
"womb_efficiency" = CUM_EFFICIENCY,
|
||||
"womb_fluid" = "femcum",
|
||||
"ipc_screen" = "Sunburst",
|
||||
"ipc_antenna" = "None",
|
||||
"flavor_text" = ""
|
||||
)
|
||||
|
||||
var/list/custom_names = list()
|
||||
var/prefered_security_department = SEC_DEPT_RANDOM
|
||||
@@ -842,9 +914,14 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
dat += "<td width = 5% style='vertical-align:top'>[gear.cost]</td><td>"
|
||||
if(islist(gear.restricted_roles))
|
||||
if(gear.restricted_roles.len)
|
||||
dat += "<font size=2>"
|
||||
dat += gear.restricted_roles.Join(";")
|
||||
dat += "</font>"
|
||||
if(gear.restricted_desc)
|
||||
dat += "<font size=2>"
|
||||
dat += gear.restricted_desc
|
||||
dat += "</font>"
|
||||
else
|
||||
dat += "<font size=2>"
|
||||
dat += gear.restricted_roles.Join(";")
|
||||
dat += "</font>"
|
||||
dat += "</td><td><font size=2><i>[gear.description]</i></font></td></tr>"
|
||||
dat += "</table>"
|
||||
|
||||
@@ -1463,8 +1540,9 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
features["body_markings"] = "None"
|
||||
if(!("mam_body_markings" in pref_species.default_features))
|
||||
features["mam_body_markings"] = "None"
|
||||
if("mam_body_markings" in pref_species.default_features && features["mam_body_markings"] == "None")
|
||||
features["mam_body_markings"] = "Plain"
|
||||
if("mam_body_markings" in pref_species.default_features)
|
||||
if(features["mam_body_markings"] == "None")
|
||||
features["mam_body_markings"] = "Plain"
|
||||
if("tail_lizard" in pref_species.default_features)
|
||||
features["tail_lizard"] = "Smooth"
|
||||
if(pref_species.id == "felinid")
|
||||
|
||||
@@ -58,6 +58,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
/datum/preferences/proc/load_preferences()
|
||||
if(!path)
|
||||
return 0
|
||||
if(world.time < loadprefcooldown)
|
||||
if(istype(parent))
|
||||
to_chat(parent, "<span class='warning'>You're attempting to load your preferences a little too fast. Wait half a second, then try again.</span>")
|
||||
return 0
|
||||
loadprefcooldown = world.time + PREF_SAVELOAD_COOLDOWN
|
||||
if(!fexists(path))
|
||||
return 0
|
||||
|
||||
@@ -152,6 +157,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
/datum/preferences/proc/save_preferences()
|
||||
if(!path)
|
||||
return 0
|
||||
if(world.time < saveprefcooldown)
|
||||
if(istype(parent))
|
||||
to_chat(parent, "<span class='warning'>You're attempting to save your preferences a little too fast. Wait half a second, then try again.</span>")
|
||||
return 0
|
||||
saveprefcooldown = world.time + PREF_SAVELOAD_COOLDOWN
|
||||
var/savefile/S = new /savefile(path)
|
||||
if(!S)
|
||||
return 0
|
||||
@@ -204,6 +214,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
/datum/preferences/proc/load_character(slot)
|
||||
if(!path)
|
||||
return 0
|
||||
if(world.time < loadcharcooldown) //This is before the check to see if the filepath exists to ensure that BYOND can't get hung up on read attempts when the hard drive is a little slow
|
||||
if(istype(parent))
|
||||
to_chat(parent, "<span class='warning'>You're attempting to load your character a little too fast. Wait half a second, then try again.</span>")
|
||||
return "SLOW THE FUCK DOWN" //the reason this isn't null is to make sure that people don't have their character slots overridden by random chars if they accidentally double-click a slot
|
||||
loadcharcooldown = world.time + PREF_SAVELOAD_COOLDOWN
|
||||
if(!fexists(path))
|
||||
return 0
|
||||
var/savefile/S = new /savefile(path)
|
||||
@@ -418,6 +433,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
/datum/preferences/proc/save_character()
|
||||
if(!path)
|
||||
return 0
|
||||
if(world.time < savecharcooldown)
|
||||
if(istype(parent))
|
||||
to_chat(parent, "<span class='warning'>You're attempting to save your character a little too fast. Wait half a second, then try again.</span>")
|
||||
return 0
|
||||
savecharcooldown = world.time + PREF_SAVELOAD_COOLDOWN
|
||||
var/savefile/S = new /savefile(path)
|
||||
if(!S)
|
||||
return 0
|
||||
|
||||
@@ -193,15 +193,14 @@
|
||||
pocket_storage_component_path = /datum/component/storage/concrete/pockets/small/collar/locked
|
||||
var/lock = FALSE
|
||||
|
||||
/obj/item/clothing/neck/petcollar/locked/attackby(obj/item/key/collar, mob/user, params)
|
||||
if(lock != FALSE)
|
||||
to_chat(user, "<span class='warning'>With a click the collar unlocks!</span>")
|
||||
lock = FALSE
|
||||
item_flags = NONE
|
||||
else
|
||||
to_chat(user, "<span class='warning'>With a click the collar locks!</span>")
|
||||
lock = TRUE
|
||||
item_flags = NODROP
|
||||
/obj/item/clothing/neck/petcollar/locked/attackby(obj/item/K, mob/user, params)
|
||||
if(istype(K, /obj/item/key/collar))
|
||||
if(lock != FALSE)
|
||||
to_chat(user, "<span class='warning'>With a click the collar unlocks!</span>")
|
||||
lock = FALSE
|
||||
else
|
||||
to_chat(user, "<span class='warning'>With a click the collar locks!</span>")
|
||||
lock = TRUE
|
||||
return
|
||||
|
||||
/obj/item/clothing/neck/petcollar/locked/attack_hand(mob/user)
|
||||
|
||||
@@ -443,7 +443,6 @@
|
||||
icon_state = "hardsuit0-medical"
|
||||
item_state = "medical_helm"
|
||||
item_color = "medical"
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
|
||||
flash_protect = 0
|
||||
armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 60, "fire" = 60, "acid" = 75)
|
||||
scan_reagents = 1
|
||||
|
||||
@@ -709,3 +709,14 @@
|
||||
reqs = list(/obj/item/tank/internals/oxygen/red = 2, /obj/item/extinguisher = 1, /obj/item/pipe = 3, /obj/item/stack/cable_coil = 30)//red oxygen tank so it looks right
|
||||
category = CAT_MISC
|
||||
tools = list(TOOL_WRENCH, TOOL_WELDER, TOOL_WIRECUTTER)
|
||||
|
||||
/datum/crafting_recipe/goldenbox
|
||||
name = "Gold Plated Toolbox"
|
||||
result = /obj/item/storage/toolbox/gold_fake
|
||||
reqs = list(/obj/item/stack/sheet/cardboard = 1, //so we dont null items in crafting
|
||||
/obj/item/stack/cable_coil = 10,
|
||||
/obj/item/stack/sheet/mineral/gold = 1,
|
||||
/obj/item/stock_parts/cell = 1,
|
||||
/datum/reagent/water = 15)
|
||||
time = 40
|
||||
category = CAT_MISC
|
||||
|
||||
@@ -73,7 +73,7 @@
|
||||
var/obj/machinery/atmospherics/components/unary/vent = pick(vents)
|
||||
vents -= vent
|
||||
|
||||
if(!vent)
|
||||
if(!vent || vent.welded)
|
||||
return
|
||||
|
||||
var/turf/T = get_turf(vent)
|
||||
@@ -150,7 +150,7 @@
|
||||
|
||||
/datum/round_event/vent_clog/beer/start()
|
||||
for(var/obj/machinery/atmospherics/components/unary/vent in vents)
|
||||
if(vent && vent.loc)
|
||||
if(vent && vent.loc && !vent.welded)
|
||||
var/datum/reagents/R = new/datum/reagents(1000)
|
||||
R.my_atom = vent
|
||||
R.add_reagent("beer", reagentsAmount)
|
||||
@@ -165,7 +165,7 @@
|
||||
|
||||
/datum/round_event/vent_clog/male/start()
|
||||
for(var/obj/machinery/atmospherics/components/unary/vent in vents)
|
||||
if(vent && vent.loc)
|
||||
if(vent && vent.loc && !vent.welded)
|
||||
var/datum/reagents/R = new/datum/reagents(1000)
|
||||
R.my_atom = vent
|
||||
R.add_reagent("semen", reagentsAmount)
|
||||
@@ -180,7 +180,7 @@
|
||||
|
||||
/datum/round_event/vent_clog/female/start()
|
||||
for(var/obj/machinery/atmospherics/components/unary/vent in vents)
|
||||
if(vent && vent.loc)
|
||||
if(vent && vent.loc && !vent.welded)
|
||||
var/datum/reagents/R = new/datum/reagents(1000)
|
||||
R.my_atom = vent
|
||||
R.add_reagent("femcum", reagentsAmount)
|
||||
@@ -195,7 +195,7 @@
|
||||
|
||||
/datum/round_event/vent_clog/plasma_decon/start()
|
||||
for(var/obj/machinery/atmospherics/components/unary/vent in vents)
|
||||
if(vent && vent.loc)
|
||||
if(vent && vent.loc && !vent.welded)
|
||||
var/datum/effect_system/smoke_spread/freezing/decon/smoke = new
|
||||
smoke.set_up(7, get_turf(vent), 7)
|
||||
smoke.start()
|
||||
|
||||
@@ -304,6 +304,8 @@
|
||||
|
||||
else if(href_list["create"])
|
||||
var/amount = (text2num(href_list["amount"]))
|
||||
//Can't be outside these (if you change this keep a sane limit)
|
||||
amount = CLAMP(amount, 1, 50)
|
||||
var/datum/design/D = locate(href_list["create"])
|
||||
create_product(D, amount)
|
||||
updateUsrDialog()
|
||||
|
||||
@@ -643,6 +643,11 @@
|
||||
icon_state = "setup_small_pda"
|
||||
desc = "It's a case, for building small electronics with. This one resembles a PDA."
|
||||
|
||||
/obj/item/electronic_assembly/dildo
|
||||
name = "type-g electronic assembly"
|
||||
icon_state = "setup_dildo_medium"
|
||||
desc = "It's a case, for building small electronics with. This one has a phallic design."
|
||||
|
||||
/obj/item/electronic_assembly/small
|
||||
name = "electronic device"
|
||||
icon_state = "setup_device"
|
||||
@@ -674,6 +679,11 @@
|
||||
icon_state = "setup_device_box"
|
||||
desc = "It's a case, for building tiny-sized electronics with. This one has a boxy design."
|
||||
|
||||
/obj/item/electronic_assembly/small/dildo
|
||||
name = "type-f electronic device"
|
||||
icon_state = "setup_dildo_small"
|
||||
desc = "It's a case, for building tiny-sized electronics with. This one has a phallic design."
|
||||
|
||||
/obj/item/electronic_assembly/medium
|
||||
name = "electronic mechanism"
|
||||
icon_state = "setup_medium"
|
||||
@@ -714,6 +724,12 @@
|
||||
icon_state = "setup_medium_radio"
|
||||
desc = "It's a case, for building medium-sized electronics with. This one resembles an old radio."
|
||||
|
||||
/obj/item/electronic_assembly/medium/dildo
|
||||
name = "type-g electronic mechanism"
|
||||
icon_state = "setup_dildo_large"
|
||||
desc = "It's a case, for building medium-sized electronics with. This one has a phallic design."
|
||||
|
||||
|
||||
/obj/item/electronic_assembly/large
|
||||
name = "electronic machine"
|
||||
icon_state = "setup_large"
|
||||
|
||||
@@ -1,139 +1,6 @@
|
||||
/obj/item/integrated_circuit/manipulation
|
||||
category_text = "Manipulation"
|
||||
|
||||
/obj/item/integrated_circuit/manipulation/weapon_firing
|
||||
name = "weapon firing mechanism"
|
||||
desc = "This somewhat complicated system allows one to slot in a gun, direct it towards a position, and remotely fire it."
|
||||
extended_desc = "The firing mechanism can slot in any energy weapon. \
|
||||
The first and second inputs need to be numbers which correspond to coordinates for the gun to fire at relative to the machine itself. \
|
||||
The 'fire' activator will cause the mechanism to attempt to fire the weapon at the coordinates, if possible. Mode will switch between \
|
||||
lethal (TRUE) or stun (FALSE) modes. It uses the internal battery of the weapon itself, not the assembly. If you wish to fire the gun while the circuit is in \
|
||||
hand, you will need to use an assembly that is a gun."
|
||||
complexity = 20
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
size = 3
|
||||
inputs = list(
|
||||
"target X rel" = IC_PINTYPE_NUMBER,
|
||||
"target Y rel" = IC_PINTYPE_NUMBER,
|
||||
"mode" = IC_PINTYPE_BOOLEAN
|
||||
)
|
||||
outputs = list("reference to gun" = IC_PINTYPE_REF)
|
||||
activators = list(
|
||||
"fire" = IC_PINTYPE_PULSE_IN
|
||||
|
||||
)
|
||||
var/obj/item/gun/energy/installed_gun = null
|
||||
spawn_flags = IC_SPAWN_RESEARCH
|
||||
action_flags = IC_ACTION_COMBAT
|
||||
power_draw_per_use = 0
|
||||
ext_cooldown = 1
|
||||
var/mode = FALSE
|
||||
|
||||
var/stun_projectile = null //stun mode projectile type
|
||||
var/stun_projectile_sound
|
||||
var/lethal_projectile = null //lethal mode projectile type
|
||||
var/lethal_projectile_sound
|
||||
|
||||
demands_object_input = TRUE // You can put stuff in once the circuit is in assembly,passed down from additem and handled by attackby()
|
||||
|
||||
|
||||
|
||||
/obj/item/integrated_circuit/manipulation/weapon_firing/Destroy()
|
||||
qdel(installed_gun)
|
||||
return ..()
|
||||
|
||||
/obj/item/integrated_circuit/manipulation/weapon_firing/attackby(var/obj/O, var/mob/user)
|
||||
if(istype(O, /obj/item/gun/energy))
|
||||
var/obj/item/gun/gun = O
|
||||
if(installed_gun)
|
||||
to_chat(user, "<span class='warning'>There's already a weapon installed.</span>")
|
||||
return
|
||||
user.transferItemToLoc(gun,src)
|
||||
installed_gun = gun
|
||||
var/list/gun_properties = gun.get_turret_properties()
|
||||
to_chat(user, "<span class='notice'>You slide \the [gun] into the firing mechanism.</span>")
|
||||
playsound(src, 'sound/items/Crowbar.ogg', 50, 1)
|
||||
stun_projectile = gun_properties["stun_projectile"]
|
||||
stun_projectile_sound = gun_properties["stun_projectile_sound"]
|
||||
lethal_projectile = gun_properties["lethal_projectile"]
|
||||
lethal_projectile_sound = gun_properties["lethal_projectile_sound"]
|
||||
if(gun_properties["shot_delay"])
|
||||
cooldown_per_use = gun_properties["shot_delay"]*10
|
||||
if(cooldown_per_use<30)
|
||||
cooldown_per_use = 30
|
||||
if(gun_properties["reqpower"])
|
||||
power_draw_per_use = gun_properties["reqpower"]
|
||||
set_pin_data(IC_OUTPUT, 1, WEAKREF(installed_gun))
|
||||
push_data()
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/item/integrated_circuit/manipulation/weapon_firing/attack_self(var/mob/user)
|
||||
if(installed_gun)
|
||||
installed_gun.forceMove(drop_location())
|
||||
to_chat(user, "<span class='notice'>You slide \the [installed_gun] out of the firing mechanism.</span>")
|
||||
size = initial(size)
|
||||
playsound(src, 'sound/items/Crowbar.ogg', 50, 1)
|
||||
installed_gun = null
|
||||
set_pin_data(IC_OUTPUT, 1, WEAKREF(null))
|
||||
push_data()
|
||||
else
|
||||
to_chat(user, "<span class='notice'>There's no weapon to remove from the mechanism.</span>")
|
||||
|
||||
/obj/item/integrated_circuit/manipulation/weapon_firing/do_work()
|
||||
if(!installed_gun || !installed_gun.handle_pins())
|
||||
return
|
||||
if(!isturf(assembly.loc) && !(assembly.can_fire_equipped && ishuman(assembly.loc)))
|
||||
return
|
||||
set_pin_data(IC_OUTPUT, 1, WEAKREF(installed_gun))
|
||||
push_data()
|
||||
var/datum/integrated_io/xo = inputs[1]
|
||||
var/datum/integrated_io/yo = inputs[2]
|
||||
var/datum/integrated_io/mode1 = inputs[3]
|
||||
|
||||
mode = mode1.data
|
||||
if(assembly)
|
||||
if(isnum(xo.data))
|
||||
xo.data = round(xo.data, 1)
|
||||
if(isnum(yo.data))
|
||||
yo.data = round(yo.data, 1)
|
||||
|
||||
var/turf/T = get_turf(assembly)
|
||||
var/target_x = CLAMP(T.x + xo.data, 0, world.maxx)
|
||||
var/target_y = CLAMP(T.y + yo.data, 0, world.maxy)
|
||||
|
||||
assembly.visible_message("<span class='danger'>[assembly] fires [installed_gun]!</span>")
|
||||
shootAt(locate(target_x, target_y, T.z))
|
||||
|
||||
/obj/item/integrated_circuit/manipulation/weapon_firing/proc/shootAt(turf/target)
|
||||
var/turf/T = get_turf(src)
|
||||
var/turf/U = target
|
||||
if(!istype(T) || !istype(U))
|
||||
return
|
||||
if(!installed_gun.cell)
|
||||
return
|
||||
if(!installed_gun.cell.charge)
|
||||
return
|
||||
var/obj/item/ammo_casing/energy/shot = installed_gun.ammo_type[mode?2:1]
|
||||
if(installed_gun.cell.charge < shot.e_cost)
|
||||
return
|
||||
if(!shot)
|
||||
return
|
||||
update_icon()
|
||||
var/obj/item/projectile/A
|
||||
if(!mode)
|
||||
A = new stun_projectile(T)
|
||||
playsound(loc, stun_projectile_sound, 75, 1)
|
||||
else
|
||||
A = new lethal_projectile(T)
|
||||
playsound(loc, lethal_projectile_sound, 75, 1)
|
||||
installed_gun.cell.use(shot.e_cost)
|
||||
//Shooting Code:
|
||||
A.preparePixelProjectile(target, src)
|
||||
A.fire()
|
||||
log_attack("[assembly] [REF(assembly)] has fired [installed_gun].")
|
||||
return A
|
||||
|
||||
/obj/item/integrated_circuit/manipulation/locomotion
|
||||
name = "locomotion circuit"
|
||||
desc = "This allows a machine to move in a given direction."
|
||||
@@ -171,80 +38,6 @@
|
||||
return FALSE
|
||||
return FALSE
|
||||
|
||||
/obj/item/integrated_circuit/manipulation/grenade
|
||||
name = "grenade primer"
|
||||
desc = "This circuit comes with the ability to attach most types of grenades and prime them at will."
|
||||
extended_desc = "The time between priming and detonation is limited to between 1 to 12 seconds, but is optional. \
|
||||
If the input is not set, not a number, or a number less than 1, the grenade's built-in timing will be used. \
|
||||
Beware: Once primed, there is no aborting the process!"
|
||||
icon_state = "grenade"
|
||||
complexity = 30
|
||||
cooldown_per_use = 10
|
||||
inputs = list("detonation time" = IC_PINTYPE_NUMBER)
|
||||
outputs = list()
|
||||
activators = list("prime grenade" = IC_PINTYPE_PULSE_IN)
|
||||
spawn_flags = IC_SPAWN_RESEARCH
|
||||
action_flags = IC_ACTION_COMBAT
|
||||
var/obj/item/grenade/attached_grenade
|
||||
var/pre_attached_grenade_type
|
||||
demands_object_input = TRUE // You can put stuff in once the circuit is in assembly,passed down from additem and handled by attackby()
|
||||
|
||||
/obj/item/integrated_circuit/manipulation/grenade/Initialize()
|
||||
. = ..()
|
||||
if(pre_attached_grenade_type)
|
||||
var/grenade = new pre_attached_grenade_type(src)
|
||||
attach_grenade(grenade)
|
||||
|
||||
/obj/item/integrated_circuit/manipulation/grenade/Destroy()
|
||||
if(attached_grenade && !attached_grenade.active)
|
||||
attached_grenade.forceMove(loc)
|
||||
detach_grenade()
|
||||
return ..()
|
||||
|
||||
/obj/item/integrated_circuit/manipulation/grenade/attackby(var/obj/item/grenade/G, var/mob/user)
|
||||
if(istype(G))
|
||||
if(attached_grenade)
|
||||
to_chat(user, "<span class='warning'>There is already a grenade attached!</span>")
|
||||
else if(user.transferItemToLoc(G,src))
|
||||
user.visible_message("<span class='warning'>\The [user] attaches \a [G] to \the [src]!</span>", "<span class='notice'>You attach \the [G] to \the [src].</span>")
|
||||
attach_grenade(G)
|
||||
G.forceMove(src)
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/integrated_circuit/manipulation/grenade/attack_self(var/mob/user)
|
||||
if(attached_grenade)
|
||||
user.visible_message("<span class='warning'>\The [user] removes \an [attached_grenade] from \the [src]!</span>", "<span class='notice'>You remove \the [attached_grenade] from \the [src].</span>")
|
||||
user.put_in_hands(attached_grenade)
|
||||
detach_grenade()
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/integrated_circuit/manipulation/grenade/do_work()
|
||||
if(attached_grenade && !attached_grenade.active)
|
||||
var/datum/integrated_io/detonation_time = inputs[1]
|
||||
var/dt
|
||||
if(isnum(detonation_time.data) && detonation_time.data > 0)
|
||||
dt = CLAMP(detonation_time.data, 1, 12)*10
|
||||
else
|
||||
dt = 15
|
||||
addtimer(CALLBACK(attached_grenade, /obj/item/grenade.proc/prime), dt)
|
||||
var/atom/holder = loc
|
||||
message_admins("activated a grenade assembly. Last touches: Assembly: [holder.fingerprintslast] Circuit: [fingerprintslast] Grenade: [attached_grenade.fingerprintslast]")
|
||||
|
||||
// These procs do not relocate the grenade, that's the callers responsibility
|
||||
/obj/item/integrated_circuit/manipulation/grenade/proc/attach_grenade(var/obj/item/grenade/G)
|
||||
attached_grenade = G
|
||||
G.forceMove(src)
|
||||
desc += " \An [attached_grenade] is attached to it!"
|
||||
|
||||
/obj/item/integrated_circuit/manipulation/grenade/proc/detach_grenade()
|
||||
if(!attached_grenade)
|
||||
return
|
||||
attached_grenade.forceMove(drop_location())
|
||||
attached_grenade = null
|
||||
desc = initial(desc)
|
||||
|
||||
/obj/item/integrated_circuit/manipulation/plant_module
|
||||
name = "plant manipulation module"
|
||||
desc = "Used to uproot weeds and harvest/plant trays."
|
||||
@@ -478,7 +271,7 @@
|
||||
|
||||
/obj/item/integrated_circuit/manipulation/thrower
|
||||
name = "thrower"
|
||||
desc = "A compact launcher to throw things from inside or nearby tiles."
|
||||
desc = "A compact launcher to throw things from inside or nearby tiles at a low enough velocity not to harm someone."
|
||||
extended_desc = "The first and second inputs need to be numbers which correspond to the coordinates to throw objects at relative to the machine itself. \
|
||||
The 'fire' activator will cause the mechanism to attempt to throw objects at the coordinates, if possible. Note that the \
|
||||
projectile needs to be inside the machine, or on an adjacent tile, and must be medium sized or smaller. The assembly \
|
||||
@@ -544,7 +337,7 @@
|
||||
A.embedding = list("embed_chance" = 0)
|
||||
//throw it
|
||||
assembly.visible_message("<span class='danger'>[assembly] has thrown [A]!</span>")
|
||||
log_attack("[assembly] [REF(assembly)] has thrown [A].")
|
||||
log_attack("[assembly] [REF(assembly)] has thrown [A] with non-lethal force.")
|
||||
A.forceMove(drop_location())
|
||||
A.throw_at(locate(x_abs, y_abs, T.z), range, 3, , , , CALLBACK(src, .proc/post_throw, A))
|
||||
|
||||
@@ -813,4 +606,7 @@
|
||||
set_pin_data(IC_OUTPUT, 1, assembly.detail_color)
|
||||
push_data()
|
||||
|
||||
activate_pin(3)
|
||||
activate_pin(3)
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -548,9 +548,12 @@
|
||||
desc = "Unlike most electronics, creating smoke is completely intentional."
|
||||
icon_state = "smoke"
|
||||
extended_desc = "This smoke generator creates clouds of smoke on command. It can also hold liquids inside, which will go \
|
||||
into the smoke clouds when activated. The reagents are consumed when the smoke is made."
|
||||
into the smoke clouds when activated. The reagents are consumed when the smoke is made. Requires at least 10 units of reagents to generate smoke."
|
||||
ext_cooldown = 1
|
||||
|
||||
volume = 100
|
||||
container_type = OPENCONTAINER
|
||||
|
||||
complexity = 20
|
||||
cooldown_per_use = 1 SECONDS
|
||||
inputs = list()
|
||||
@@ -573,6 +576,7 @@
|
||||
if(changetype == ADD_REAGENT)
|
||||
notified = FALSE
|
||||
push_vol()
|
||||
|
||||
/obj/item/integrated_circuit/reagent/smoke/do_work(ord)
|
||||
switch(ord)
|
||||
if(1)
|
||||
@@ -598,9 +602,10 @@
|
||||
name = "integrated extinguisher"
|
||||
desc = "This circuit sprays any of its contents out like an extinguisher."
|
||||
icon_state = "injector"
|
||||
extended_desc = "This circuit can hold up to 30 units of any given chemicals. On each use, it sprays these reagents like a fire extinguisher."
|
||||
extended_desc = "This circuit can hold up to 30 units of any given chemicals. On each use, it sprays these reagents like a fire extinguisher. Requires at least 10 units of reagents to work."
|
||||
|
||||
volume = 30
|
||||
container_type = OPENCONTAINER
|
||||
|
||||
complexity = 20
|
||||
cooldown_per_use = 6 SECONDS
|
||||
@@ -631,7 +636,7 @@
|
||||
/obj/item/integrated_circuit/reagent/extinguisher/do_work()
|
||||
//Check if enough volume
|
||||
set_pin_data(IC_OUTPUT, 1, reagents.total_volume)
|
||||
if(!reagents || reagents.total_volume < 5 || busy)
|
||||
if(!reagents || reagents.total_volume < IC_SMOKE_REAGENTS_MINIMUM_UNITS || busy)
|
||||
push_data()
|
||||
activate_pin(3)
|
||||
return
|
||||
|
||||
@@ -0,0 +1,343 @@
|
||||
/obj/item/integrated_circuit/weaponized
|
||||
category_text = "Weaponized"
|
||||
|
||||
/obj/item/integrated_circuit/weaponized/weapon_firing
|
||||
name = "weapon firing mechanism"
|
||||
desc = "This somewhat complicated system allows one to slot in a gun, direct it towards a position, and remotely fire it."
|
||||
extended_desc = "The firing mechanism can slot in any energy weapon. \
|
||||
The first and second inputs need to be numbers which correspond to coordinates for the gun to fire at relative to the machine itself. \
|
||||
The 'fire' activator will cause the mechanism to attempt to fire the weapon at the coordinates, if possible. Mode will switch between \
|
||||
lethal (TRUE) or stun (FALSE) modes. It uses the internal battery of the weapon itself, not the assembly. If you wish to fire the gun while the circuit is in \
|
||||
hand, you will need to use an assembly that is a gun."
|
||||
complexity = 20
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
size = 3
|
||||
inputs = list(
|
||||
"target X rel" = IC_PINTYPE_NUMBER,
|
||||
"target Y rel" = IC_PINTYPE_NUMBER,
|
||||
"mode" = IC_PINTYPE_BOOLEAN
|
||||
)
|
||||
outputs = list("reference to gun" = IC_PINTYPE_REF)
|
||||
activators = list(
|
||||
"fire" = IC_PINTYPE_PULSE_IN
|
||||
|
||||
)
|
||||
var/obj/item/gun/energy/installed_gun = null
|
||||
spawn_flags = IC_SPAWN_RESEARCH
|
||||
action_flags = IC_ACTION_COMBAT
|
||||
power_draw_per_use = 0
|
||||
ext_cooldown = 1
|
||||
var/mode = FALSE
|
||||
|
||||
var/stun_projectile = null //stun mode projectile type
|
||||
var/stun_projectile_sound
|
||||
var/lethal_projectile = null //lethal mode projectile type
|
||||
var/lethal_projectile_sound
|
||||
|
||||
demands_object_input = TRUE // You can put stuff in once the circuit is in assembly,passed down from additem and handled by attackby()
|
||||
|
||||
|
||||
|
||||
/obj/item/integrated_circuit/weaponized/weapon_firing/Destroy()
|
||||
qdel(installed_gun)
|
||||
return ..()
|
||||
|
||||
/obj/item/integrated_circuit/weaponized/weapon_firing/attackby(var/obj/O, var/mob/user)
|
||||
if(istype(O, /obj/item/gun/energy))
|
||||
var/obj/item/gun/gun = O
|
||||
if(installed_gun)
|
||||
to_chat(user, "<span class='warning'>There's already a weapon installed.</span>")
|
||||
return
|
||||
user.transferItemToLoc(gun,src)
|
||||
installed_gun = gun
|
||||
var/list/gun_properties = gun.get_turret_properties()
|
||||
to_chat(user, "<span class='notice'>You slide \the [gun] into the firing mechanism.</span>")
|
||||
playsound(src, 'sound/items/Crowbar.ogg', 50, 1)
|
||||
stun_projectile = gun_properties["stun_projectile"]
|
||||
stun_projectile_sound = gun_properties["stun_projectile_sound"]
|
||||
lethal_projectile = gun_properties["lethal_projectile"]
|
||||
lethal_projectile_sound = gun_properties["lethal_projectile_sound"]
|
||||
if(gun_properties["shot_delay"])
|
||||
cooldown_per_use = gun_properties["shot_delay"]*10
|
||||
if(cooldown_per_use<30)
|
||||
cooldown_per_use = 30
|
||||
if(gun_properties["reqpower"])
|
||||
power_draw_per_use = gun_properties["reqpower"]
|
||||
set_pin_data(IC_OUTPUT, 1, WEAKREF(installed_gun))
|
||||
push_data()
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/item/integrated_circuit/weaponized/weapon_firing/attack_self(var/mob/user)
|
||||
if(installed_gun)
|
||||
installed_gun.forceMove(drop_location())
|
||||
to_chat(user, "<span class='notice'>You slide \the [installed_gun] out of the firing mechanism.</span>")
|
||||
size = initial(size)
|
||||
playsound(src, 'sound/items/Crowbar.ogg', 50, 1)
|
||||
installed_gun = null
|
||||
set_pin_data(IC_OUTPUT, 1, WEAKREF(null))
|
||||
push_data()
|
||||
else
|
||||
to_chat(user, "<span class='notice'>There's no weapon to remove from the mechanism.</span>")
|
||||
|
||||
/obj/item/integrated_circuit/weaponized/weapon_firing/do_work()
|
||||
if(!installed_gun || !installed_gun.handle_pins())
|
||||
return
|
||||
if(!isturf(assembly.loc) && !(assembly.can_fire_equipped && ishuman(assembly.loc)))
|
||||
return
|
||||
set_pin_data(IC_OUTPUT, 1, WEAKREF(installed_gun))
|
||||
push_data()
|
||||
var/datum/integrated_io/xo = inputs[1]
|
||||
var/datum/integrated_io/yo = inputs[2]
|
||||
var/datum/integrated_io/mode1 = inputs[3]
|
||||
|
||||
mode = mode1.data
|
||||
if(assembly)
|
||||
if(isnum(xo.data))
|
||||
xo.data = round(xo.data, 1)
|
||||
if(isnum(yo.data))
|
||||
yo.data = round(yo.data, 1)
|
||||
|
||||
var/turf/T = get_turf(assembly)
|
||||
var/target_x = CLAMP(T.x + xo.data, 0, world.maxx)
|
||||
var/target_y = CLAMP(T.y + yo.data, 0, world.maxy)
|
||||
|
||||
assembly.visible_message("<span class='danger'>[assembly] fires [installed_gun]!</span>")
|
||||
shootAt(locate(target_x, target_y, T.z))
|
||||
|
||||
/obj/item/integrated_circuit/weaponized/weapon_firing/proc/shootAt(turf/target)
|
||||
var/turf/T = get_turf(src)
|
||||
var/turf/U = target
|
||||
if(!istype(T) || !istype(U))
|
||||
return
|
||||
if(!installed_gun.cell)
|
||||
return
|
||||
if(!installed_gun.cell.charge)
|
||||
return
|
||||
var/obj/item/ammo_casing/energy/shot = installed_gun.ammo_type[mode?2:1]
|
||||
if(installed_gun.cell.charge < shot.e_cost)
|
||||
return
|
||||
if(!shot)
|
||||
return
|
||||
update_icon()
|
||||
var/obj/item/projectile/A
|
||||
if(!mode)
|
||||
A = new stun_projectile(T)
|
||||
playsound(loc, stun_projectile_sound, 75, 1)
|
||||
else
|
||||
A = new lethal_projectile(T)
|
||||
playsound(loc, lethal_projectile_sound, 75, 1)
|
||||
installed_gun.cell.use(shot.e_cost)
|
||||
//Shooting Code:
|
||||
A.preparePixelProjectile(target, src)
|
||||
A.fire()
|
||||
log_attack("[assembly] [REF(assembly)] has fired [installed_gun].")
|
||||
return A
|
||||
|
||||
/obj/item/integrated_circuit/weaponized/grenade
|
||||
name = "grenade primer"
|
||||
desc = "This circuit comes with the ability to attach most types of grenades and prime them at will."
|
||||
extended_desc = "The time between priming and detonation is limited to between 1 to 12 seconds, but is optional. \
|
||||
If the input is not set, not a number, or a number less than 1, the grenade's built-in timing will be used. \
|
||||
Beware: Once primed, there is no aborting the process!"
|
||||
icon_state = "grenade"
|
||||
complexity = 30
|
||||
cooldown_per_use = 10
|
||||
inputs = list("detonation time" = IC_PINTYPE_NUMBER)
|
||||
outputs = list()
|
||||
activators = list("prime grenade" = IC_PINTYPE_PULSE_IN)
|
||||
spawn_flags = IC_SPAWN_RESEARCH
|
||||
action_flags = IC_ACTION_COMBAT
|
||||
var/obj/item/grenade/attached_grenade
|
||||
var/pre_attached_grenade_type
|
||||
demands_object_input = TRUE // You can put stuff in once the circuit is in assembly,passed down from additem and handled by attackby()
|
||||
|
||||
/obj/item/integrated_circuit/weaponized/grenade/Initialize()
|
||||
. = ..()
|
||||
if(pre_attached_grenade_type)
|
||||
var/grenade = new pre_attached_grenade_type(src)
|
||||
attach_grenade(grenade)
|
||||
|
||||
/obj/item/integrated_circuit/weaponized/grenade/Destroy()
|
||||
if(attached_grenade && !attached_grenade.active)
|
||||
attached_grenade.forceMove(loc)
|
||||
detach_grenade()
|
||||
return ..()
|
||||
|
||||
/obj/item/integrated_circuit/weaponized/grenade/attackby(var/obj/item/grenade/G, var/mob/user)
|
||||
if(istype(G))
|
||||
if(attached_grenade)
|
||||
to_chat(user, "<span class='warning'>There is already a grenade attached!</span>")
|
||||
else if(user.transferItemToLoc(G,src))
|
||||
user.visible_message("<span class='warning'>\The [user] attaches \a [G] to \the [src]!</span>", "<span class='notice'>You attach \the [G] to \the [src].</span>")
|
||||
attach_grenade(G)
|
||||
G.forceMove(src)
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/integrated_circuit/weaponized/grenade/attack_self(var/mob/user)
|
||||
if(attached_grenade)
|
||||
user.visible_message("<span class='warning'>\The [user] removes \an [attached_grenade] from \the [src]!</span>", "<span class='notice'>You remove \the [attached_grenade] from \the [src].</span>")
|
||||
user.put_in_hands(attached_grenade)
|
||||
detach_grenade()
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/integrated_circuit/weaponized/grenade/do_work()
|
||||
if(attached_grenade && !attached_grenade.active)
|
||||
var/datum/integrated_io/detonation_time = inputs[1]
|
||||
var/dt
|
||||
if(isnum(detonation_time.data) && detonation_time.data > 0)
|
||||
dt = CLAMP(detonation_time.data, 1, 12)*10
|
||||
else
|
||||
dt = 15
|
||||
addtimer(CALLBACK(attached_grenade, /obj/item/grenade.proc/prime), dt)
|
||||
var/atom/holder = loc
|
||||
message_admins("activated a grenade assembly. Last touches: Assembly: [holder.fingerprintslast] Circuit: [fingerprintslast] Grenade: [attached_grenade.fingerprintslast]")
|
||||
|
||||
// These procs do not relocate the grenade, that's the callers responsibility
|
||||
/obj/item/integrated_circuit/weaponized/grenade/proc/attach_grenade(var/obj/item/grenade/G)
|
||||
attached_grenade = G
|
||||
G.forceMove(src)
|
||||
desc += " \An [attached_grenade] is attached to it!"
|
||||
|
||||
/obj/item/integrated_circuit/weaponized/grenade/proc/detach_grenade()
|
||||
if(!attached_grenade)
|
||||
return
|
||||
attached_grenade.forceMove(drop_location())
|
||||
attached_grenade = null
|
||||
desc = initial(desc)
|
||||
|
||||
/obj/item/integrated_circuit/weaponized/air_cannon
|
||||
name = "pneumatic cannon"
|
||||
desc = "A compact pneumatic cannon to throw things from inside or nearby tiles at a high enough velocity to cause damage. Requires air from a canister to fire."
|
||||
extended_desc = "The first and second inputs need to be numbers which correspond to the coordinates to throw objects at relative to the machine itself. \
|
||||
The 'fire' activator will cause the mechanism to attempt to launch objects at the coordinates, if possible. Note that the \
|
||||
projectile needs to be inside the machine, or on an adjacent tile, and must be medium sized or smaller. The assembly \
|
||||
must also be a gun if you wish to launch something while the assembly is in hand."
|
||||
complexity = 75
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
size = 4
|
||||
cooldown_per_use = 30
|
||||
ext_cooldown = 15
|
||||
inputs = list(
|
||||
"target X rel" = IC_PINTYPE_NUMBER,
|
||||
"target Y rel" = IC_PINTYPE_NUMBER,
|
||||
"projectile" = IC_PINTYPE_REF,
|
||||
"canister" = IC_PINTYPE_REF
|
||||
)
|
||||
outputs = list()
|
||||
activators = list(
|
||||
"fire" = IC_PINTYPE_PULSE_IN
|
||||
)
|
||||
spawn_flags = IC_SPAWN_RESEARCH
|
||||
action_flags = IC_ACTION_COMBAT
|
||||
power_draw_per_use = 50
|
||||
var/gas_per_throw = 6
|
||||
|
||||
/obj/item/integrated_circuit/weaponized/air_cannon/do_work()
|
||||
|
||||
var/max_w_class = assembly.w_class
|
||||
var/target_x_rel = round(get_pin_data(IC_INPUT, 1))
|
||||
var/target_y_rel = round(get_pin_data(IC_INPUT, 2))
|
||||
var/obj/item/A = get_pin_data_as_type(IC_INPUT, 3, /obj/item)
|
||||
var/obj/item/integrated_circuit/atmospherics/AT = get_pin_data_as_type(IC_INPUT, 4, /obj/item/integrated_circuit/atmospherics)
|
||||
|
||||
if(!A || A.anchored || A.throwing || A == assembly || istype(A, /obj/item/twohanded) || istype(A, /obj/item/transfer_valve))
|
||||
return
|
||||
|
||||
if(!AT || !AT.air_contents)
|
||||
return
|
||||
|
||||
if (istype(assembly.loc, /obj/item/implant/storage)) //Prevents the more abusive form of chestgun.
|
||||
return
|
||||
|
||||
if(max_w_class && (A.w_class > max_w_class))
|
||||
return
|
||||
|
||||
if(!assembly.can_fire_equipped && ishuman(assembly.loc))
|
||||
return
|
||||
|
||||
// Is the target inside the assembly or close to it?
|
||||
if(!check_target(A, exclude_components = TRUE))
|
||||
return
|
||||
|
||||
var/turf/T = get_turf(get_object())
|
||||
if(!T)
|
||||
return
|
||||
|
||||
// If the item is in mob's inventory, try to remove it from there.
|
||||
if(ismob(A.loc))
|
||||
var/mob/living/M = A.loc
|
||||
if(!M.temporarilyRemoveItemFromInventory(A))
|
||||
return
|
||||
|
||||
var/datum/gas_mixture/source_air = AT.return_air()
|
||||
var/datum/gas_mixture/target_air = T.return_air()
|
||||
|
||||
if(!source_air || !target_air)
|
||||
return
|
||||
|
||||
var/datum/gas_mixture/removed = source_air.remove(gas_per_throw)
|
||||
if(!removed)
|
||||
return
|
||||
target_air.merge(removed)
|
||||
|
||||
// If the item is in a grabber circuit we'll update the grabber's outputs after we've thrown it.
|
||||
var/obj/item/integrated_circuit/manipulation/grabber/G = A.loc
|
||||
|
||||
var/x_abs = CLAMP(T.x + target_x_rel, 0, world.maxx)
|
||||
var/y_abs = CLAMP(T.y + target_y_rel, 0, world.maxy)
|
||||
var/range = round(CLAMP(sqrt(target_x_rel*target_x_rel+target_y_rel*target_y_rel),0,8),1)
|
||||
assembly.visible_message("<span class='danger'>\The [assembly] has thrown [A]!</span>")
|
||||
log_attack("[assembly] [REF(assembly)] has thrown [A] with lethal force.")
|
||||
A.forceMove(drop_location())
|
||||
A.throw_at(locate(x_abs, y_abs, T.z), range, 3)
|
||||
|
||||
air_update_turf()
|
||||
|
||||
// If the item came from a grabber now we can update the outputs since we've thrown it.
|
||||
if(istype(G))
|
||||
G.update_outputs()
|
||||
|
||||
|
||||
/obj/item/integrated_circuit/weaponized/stun
|
||||
name = "electronic stun module"
|
||||
desc = "Used to stun a target holding the device via electricity."
|
||||
icon_state = "power_relay"
|
||||
extended_desc = "Attempts to stun the holder of this device, with the strength input being the strength of the stun, from 1 to 70."
|
||||
complexity = 60
|
||||
size = 4
|
||||
inputs = list("strength" = IC_PINTYPE_NUMBER)
|
||||
activators = list("stun" = IC_PINTYPE_PULSE_IN, "on success" = IC_PINTYPE_PULSE_OUT, "on fail" = IC_PINTYPE_PULSE_OUT)
|
||||
spawn_flags = IC_SPAWN_RESEARCH
|
||||
power_draw_per_use = 2000
|
||||
cooldown_per_use = 50
|
||||
ext_cooldown = 25
|
||||
|
||||
|
||||
/obj/item/integrated_circuit/weaponized/stun/do_work()
|
||||
var/stunforce = CLAMP(get_pin_data(IC_INPUT, 1),1,70)
|
||||
var/mob/living/L = assembly.loc
|
||||
if(attempt_stun(L,stunforce))
|
||||
activate_pin(2)
|
||||
else
|
||||
activate_pin(3)
|
||||
|
||||
/obj/item/integrated_circuit/weaponized/proc/attempt_stun(var/mob/living/L,var/stunforce = 70) //Copied from stunbaton code.
|
||||
|
||||
if(!L || !isliving(L))
|
||||
return 0
|
||||
|
||||
L.Knockdown(stunforce)
|
||||
SEND_SIGNAL(L, COMSIG_LIVING_MINOR_SHOCK)
|
||||
|
||||
message_admins("stunned someone with an assembly. Last touches: Assembly: [assembly.fingerprintslast] Circuit: [fingerprintslast]")
|
||||
|
||||
L.visible_message("<span class='danger'>\The [assembly] has stunned \the [L] with \the [src]!</span>", "<span class='userdanger'>\The [assembly] has stunned you with \the [src]!</span>")
|
||||
playsound(loc, 'sound/weapons/egloves.ogg', 50, 1, -1)
|
||||
if(ishuman(L))
|
||||
var/mob/living/carbon/human/H = L
|
||||
H.forcesay(GLOB.hit_appends)
|
||||
|
||||
return 1
|
||||
@@ -110,7 +110,7 @@ Shaft Miner
|
||||
|
||||
/datum/outfit/job/miner/equipped
|
||||
name = "Shaft Miner (Lavaland + Equipment)"
|
||||
suit = /obj/item/clothing/suit/hooded/explorer
|
||||
suit = /obj/item/clothing/suit/hooded/explorer/standard
|
||||
mask = /obj/item/clothing/mask/gas/explorer
|
||||
glasses = /obj/item/clothing/glasses/meson
|
||||
suit_store = /obj/item/tank/internals/oxygen
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
resistance_flags = FIRE_PROOF
|
||||
tauric = TRUE //Citadel Add for tauric hardsuits
|
||||
|
||||
|
||||
/obj/item/clothing/head/hooded/explorer
|
||||
name = "explorer hood"
|
||||
desc = "An armoured hood for exploring harsh environments."
|
||||
@@ -26,11 +27,15 @@
|
||||
armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 50)
|
||||
resistance_flags = FIRE_PROOF
|
||||
|
||||
/obj/item/clothing/suit/hooded/explorer/Initialize()
|
||||
/obj/item/clothing/suit/hooded/explorer/standard
|
||||
|
||||
/obj/item/clothing/head/hooded/explorer/standard
|
||||
|
||||
/obj/item/clothing/suit/hooded/explorer/standard/Initialize()
|
||||
. = ..()
|
||||
AddComponent(/datum/component/armor_plate)
|
||||
|
||||
/obj/item/clothing/head/hooded/explorer/Initialize()
|
||||
/obj/item/clothing/head/hooded/explorer/standard/Initialize()
|
||||
. = ..()
|
||||
AddComponent(/datum/component/armor_plate)
|
||||
|
||||
@@ -176,4 +181,4 @@
|
||||
desc = "A face-covering mask that can be connected to an air supply. Intended for use with the Exosuit."
|
||||
icon_state = "exo"
|
||||
item_state = "exo"
|
||||
resistance_flags = FIRE_PROOF
|
||||
resistance_flags = FIRE_PROOF
|
||||
|
||||
@@ -319,7 +319,7 @@
|
||||
new /obj/item/clothing/glasses/meson(src)
|
||||
new /obj/item/t_scanner/adv_mining_scanner/lesser(src)
|
||||
new /obj/item/storage/bag/ore(src)
|
||||
new /obj/item/clothing/suit/hooded/explorer(src)
|
||||
new /obj/item/clothing/suit/hooded/explorer/standard(src)
|
||||
new /obj/item/encryptionkey/headset_cargo(src)
|
||||
new /obj/item/clothing/mask/gas/explorer(src)
|
||||
new /obj/item/card/mining_access_card(src)
|
||||
@@ -340,7 +340,7 @@
|
||||
new /obj/item/storage/firstaid/regular(src)
|
||||
new /obj/item/reagent_containers/hypospray/medipen/survival(src)
|
||||
new /obj/item/t_scanner/adv_mining_scanner(src)
|
||||
new /obj/item/clothing/suit/hooded/explorer(src)
|
||||
new /obj/item/clothing/suit/hooded/explorer/standard(src)
|
||||
new /obj/item/encryptionkey/headset_cargo(src)
|
||||
new /obj/item/clothing/mask/gas/explorer(src)
|
||||
new /obj/item/card/id/mining(src)
|
||||
|
||||
@@ -39,6 +39,19 @@
|
||||
restraint_check = TRUE
|
||||
emote_type = EMOTE_AUDIBLE
|
||||
|
||||
/datum/emote/living/carbon/human/mawp
|
||||
key = "mawp"
|
||||
key_third_person = "mawps"
|
||||
message = "mawps annoyingly."
|
||||
emote_type = EMOTE_AUDIBLE
|
||||
|
||||
/datum/emote/living/carbon/human/mawp/run_emote(mob/living/user, params)
|
||||
. = ..()
|
||||
if(.)
|
||||
if(ishuman(user))
|
||||
if(prob(10))
|
||||
user.adjustEarDamage(-5, -5)
|
||||
|
||||
/datum/emote/living/carbon/human/mumble
|
||||
key = "mumble"
|
||||
key_third_person = "mumbles"
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
/mob/living/carbon/human/say_mod(input, message_mode)
|
||||
verb_say = dna.species.say_mod
|
||||
switch(slurring)
|
||||
if(25 to 50)
|
||||
if(10 to 25)
|
||||
return "jumbles"
|
||||
if(50 to 75)
|
||||
if(25 to 50)
|
||||
return "slurs"
|
||||
if(75 to INFINITY)
|
||||
if(50 to INFINITY)
|
||||
return "garbles"
|
||||
else
|
||||
. = ..()
|
||||
|
||||
@@ -755,6 +755,8 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
if(!(H.has_trait(TRAIT_HUSK)))
|
||||
if(!forced_colour)
|
||||
switch(S.color_src)
|
||||
if(SKINTONE)
|
||||
accessory_overlay.color = skintone2hex(H.skin_tone)
|
||||
if(MUTCOLORS)
|
||||
if(fixed_mut_color)
|
||||
accessory_overlay.color = "#[fixed_mut_color]"
|
||||
|
||||
@@ -531,7 +531,7 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put
|
||||
if(stuttering)
|
||||
stuttering = max(stuttering-1, 0)
|
||||
|
||||
if(slurring)
|
||||
if(slurring || drunkenness)
|
||||
slurring = max(slurring-1,0,drunkenness)
|
||||
|
||||
if(cultslurring)
|
||||
|
||||
@@ -290,7 +290,7 @@
|
||||
gloves = /obj/item/clothing/gloves/color/black
|
||||
mask = /obj/item/clothing/mask/gas/explorer
|
||||
if(prob(20))
|
||||
suit = pickweight(list(/obj/item/clothing/suit/hooded/explorer = 6, /obj/item/clothing/suit/hooded/cloak/goliath = 2, /obj/item/clothing/suit/hooded/explorer/exo = 6, /obj/item/clothing/suit/hooded/explorer/seva = 6))
|
||||
suit = pickweight(list(/obj/item/clothing/suit/hooded/explorer/standard = 6, /obj/item/clothing/suit/hooded/cloak/goliath = 2, /obj/item/clothing/suit/hooded/explorer/exo = 6, /obj/item/clothing/suit/hooded/explorer/seva = 6))
|
||||
if(prob(30))
|
||||
r_pocket = pickweight(list(/obj/item/stack/marker_beacon = 20, /obj/item/stack/spacecash/c1000 = 7, /obj/item/reagent_containers/hypospray/medipen/survival = 2, /obj/item/borg/upgrade/modkit/damage = 1 ))
|
||||
if(prob(10))
|
||||
|
||||
@@ -65,6 +65,7 @@
|
||||
return sanitize(t)
|
||||
|
||||
/proc/slur(n,var/strength=50)
|
||||
strength = min(strength,50)
|
||||
var/phrase = html_decode(n)
|
||||
var/leng = lentext(phrase)
|
||||
var/counter=lentext(phrase)
|
||||
@@ -72,7 +73,7 @@
|
||||
var/newletter=""
|
||||
while(counter>=1)
|
||||
newletter=copytext(phrase,(leng-counter)+1,(leng-counter)+2)
|
||||
if(rand(1,100)<=strength)
|
||||
if(rand(1,100)<=strength*0.5)
|
||||
if(lowertext(newletter)=="o")
|
||||
newletter="u"
|
||||
if(lowertext(newletter)=="s")
|
||||
@@ -83,12 +84,12 @@
|
||||
newletter="oo"
|
||||
if(lowertext(newletter)=="c")
|
||||
newletter="k"
|
||||
if(rand(1,100) <= strength*0.5)
|
||||
if(rand(1,100) <= strength*0.25)
|
||||
if(newletter==" ")
|
||||
newletter="...huuuhhh..."
|
||||
if(newletter==".")
|
||||
newletter=" *BURP*."
|
||||
if(rand(1,100) <= strength)
|
||||
if(rand(1,100) <= strength*0.5)
|
||||
if(rand(1,5) == 1)
|
||||
newletter+="'"
|
||||
if(rand(1,5) == 1)
|
||||
|
||||
@@ -42,6 +42,7 @@
|
||||
/obj/item/gun/energy/laser/carbine
|
||||
name = "laser carbine"
|
||||
desc = "A ruggedized laser carbine featuring much higher capacity and improved handling when compared to a normal laser gun."
|
||||
icon = 'icons/obj/guns/energy.dmi'
|
||||
icon_state = "lasernew"
|
||||
item_state = "laser"
|
||||
force = 10
|
||||
@@ -50,6 +51,9 @@
|
||||
cell_type = /obj/item/stock_parts/cell/lascarbine
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
|
||||
/obj/item/gun/energy/laser/carbine/nopin
|
||||
pin = null
|
||||
|
||||
/obj/item/gun/energy/laser/captain/scattershot
|
||||
name = "scatter shot laser rifle"
|
||||
icon_state = "lasercannon"
|
||||
|
||||
@@ -1863,3 +1863,20 @@
|
||||
description = "The primary precursor for an ancient feline delicacy known as skooma. While it has no notable effects on it's own, mixing it with morphine in a chilled container may yield interesting results."
|
||||
color = "#FAEAFF"
|
||||
taste_description = "synthetic catnip"
|
||||
|
||||
/datum/reagent/penis_enlargement
|
||||
name = "Penis Enlargement"
|
||||
id = "penis_enlargement"
|
||||
description = "A patented chemical forumula by Doctor Ronald Hyatt that is guaranteed to bring maximum GROWTH and LENGTH to your penis, today!"
|
||||
color = "#888888"
|
||||
taste_description = "chinese dragon powder"
|
||||
metabolization_rate = INFINITY //So it instantly removes all of itself. Don't want to put strain on the system.
|
||||
|
||||
/datum/reagent/penis_enlargement/on_mob_life(mob/living/carbon/C)
|
||||
var/obj/item/organ/genital/penis/P = C.getorganslot(ORGAN_SLOT_PENIS)
|
||||
if(P)
|
||||
var/added_length = round(volume/30,0.01) //Every 30u gives an extra inch. Rounded to the nearest 0.01 so float fuckery doesn't occur with the division by 30.
|
||||
if(added_length >= 0.20) //Only add the length if it's greater than or equal to 0.2. This is to prevent people from smoking the reagents and causing the penis to update constantly.
|
||||
P.length += added_length
|
||||
P.update()
|
||||
..()
|
||||
@@ -759,6 +759,7 @@
|
||||
taste_description = "skewing"
|
||||
|
||||
/datum/reagent/toxin/skewium/on_mob_life(mob/living/carbon/M)
|
||||
/*
|
||||
if(M.hud_used)
|
||||
if(current_cycle >= 5 && current_cycle % 3 == 0)
|
||||
var/list/screens = list(M.hud_used.plane_masters["[FLOOR_PLANE]"], M.hud_used.plane_masters["[GAME_PLANE]"], M.hud_used.plane_masters["[LIGHTING_PLANE]"])
|
||||
@@ -774,6 +775,7 @@
|
||||
for(var/whole_screen in screens)
|
||||
animate(whole_screen, transform = newmatrix, time = 5, easing = QUAD_EASING, loop = -1)
|
||||
animate(transform = -newmatrix, time = 5, easing = QUAD_EASING)
|
||||
*/
|
||||
return ..()
|
||||
|
||||
/datum/reagent/toxin/skewium/on_mob_delete(mob/living/M)
|
||||
|
||||
@@ -233,3 +233,7 @@
|
||||
|
||||
/obj/item/reagent_containers/pill/get_belt_overlay()
|
||||
return mutable_appearance('icons/obj/clothing/belt_overlays.dmi', "pouch")
|
||||
|
||||
/obj/item/reagent_containers/pill/penis_enlargement
|
||||
name = "penis enlargement pill"
|
||||
list_reagents = list("penis_enlargement" = 30)
|
||||
|
||||
@@ -870,3 +870,19 @@
|
||||
materials = list(MAT_METAL = 100, MAT_GLASS = 100)
|
||||
build_path = /obj/item/disk/holodisk
|
||||
category = list("initial", "Misc")
|
||||
|
||||
/datum/design/lock_collar
|
||||
name = "Lockable Collar"
|
||||
id = "lock_collar"
|
||||
build_type = AUTOLATHE
|
||||
materials = list(MAT_METAL = 1200, MAT_GLASS = 100)
|
||||
build_path = /obj/item/clothing/neck/petcollar/locked
|
||||
category = list("initial", "Misc")
|
||||
|
||||
/datum/design/collar_key
|
||||
name = "Collar Key"
|
||||
id = "collar_key"
|
||||
build_type = AUTOLATHE
|
||||
materials = list(MAT_METAL = 300, MAT_GLASS = 150)
|
||||
build_path = /obj/item/key/collar
|
||||
category = list("initial", "Misc")
|
||||
|
||||
@@ -24,6 +24,17 @@
|
||||
dangerous_construction = TRUE
|
||||
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
/datum/design/satchel_holding
|
||||
name = "Satchel of Holding"
|
||||
desc = "A satchel that opens into a localized pocket of bluespace."
|
||||
id = "satchel_holding"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_GOLD = 3000, MAT_DIAMOND = 1500, MAT_URANIUM = 250, MAT_BLUESPACE = 2000)
|
||||
build_path = /obj/item/storage/backpack/holding/satchel
|
||||
category = list("Bluespace Designs")
|
||||
dangerous_construction = TRUE
|
||||
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
|
||||
|
||||
/datum/design/biobag_holding
|
||||
name = "Bio Bag of Holding"
|
||||
desc = "A chemical holding thingy. Mostly used for xenobiology."
|
||||
|
||||
@@ -77,6 +77,16 @@
|
||||
category = list("Power Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING
|
||||
|
||||
/datum/design/inducercombat
|
||||
name = "Combat Ready Inducer"
|
||||
desc = "The improved NT-8475 Electromagnetic Power Inducer can this one has been SCIENCED to allow for combat. It still comes printed with SCIENCED colors!"
|
||||
id = "combatinducer"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 13000, MAT_GLASS = 10000, MAT_SILVER = 1500, MAT_GOLD = 1250, MAT_DIAMOND = 500, MAT_TITANIUM = 1200)
|
||||
build_path = /obj/item/inducer/sci/combat/dry
|
||||
category = list("Power Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
|
||||
|
||||
/datum/design/board/pacman
|
||||
name = "Machine Design (PACMAN-type Generator Board)"
|
||||
desc = "The circuit board that for a PACMAN-type portable generator."
|
||||
|
||||
@@ -145,7 +145,7 @@
|
||||
id = "lasercarbine"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 15000, MAT_GLASS = 10000, MAT_GOLD = 2500, MAT_SILVER = 2500)
|
||||
build_path = /obj/item/gun/energy/laser/carbine
|
||||
build_path = /obj/item/gun/energy/laser/carbine/nopin
|
||||
category = list("Weapons")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
|
||||
|
||||
|
||||
@@ -246,7 +246,7 @@
|
||||
display_name = "Bluespace Pockets"
|
||||
description = "Studies into the mysterious alternate dimension known as bluespace and how to place items in the threads of reality."
|
||||
prereq_ids = list("adv_power", "adv_bluespace", "adv_biotech", "adv_plasma")
|
||||
design_ids = list( "bluespacebodybag","bag_holding", "bluespace_pod", "borg_upgrade_trashofholding", "blutrash")
|
||||
design_ids = list( "bluespacebodybag","bag_holding", "bluespace_pod", "borg_upgrade_trashofholding", "blutrash", "satchel_holding")
|
||||
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5500)
|
||||
export_price = 5000
|
||||
/////////////////////////plasma tech/////////////////////////
|
||||
@@ -428,7 +428,7 @@
|
||||
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1500)
|
||||
export_price = 5000
|
||||
design_ids = list("s-receiver", "s-bus", "s-broadcaster", "s-processor", "s-hub", "s-server", "s-relay", "comm_monitor", "comm_server",
|
||||
"s-ansible", "s-filter", "s-amplifier", "ntnet_relay", "s-treatment", "s-analyzer", "s-crystal", "s-transmitter")
|
||||
"s-ansible", "s-filter", "s-amplifier", "ntnet_relay", "s-treatment", "s-analyzer", "s-crystal", "s-transmitter", "message_monitor")
|
||||
|
||||
/datum/techweb_node/integrated_HUDs
|
||||
id = "integrated_HUDs"
|
||||
|
||||
@@ -45,7 +45,8 @@
|
||||
var/species_color = ""
|
||||
var/mutation_color = ""
|
||||
var/no_update = 0
|
||||
var/body_markings //for bodypart markings
|
||||
var/body_markings = "" //for bodypart markings
|
||||
var/body_markings_icon = 'modular_citadel/icons/mob/mam_markings.dmi'
|
||||
var/list/markings_color = list()
|
||||
var/auxmarking
|
||||
var/list/auxmarking_color = list()
|
||||
@@ -260,6 +261,7 @@
|
||||
icon = DEFAULT_BODYPART_ICON_ORGANIC
|
||||
else if(status == BODYPART_ROBOTIC)
|
||||
icon = DEFAULT_BODYPART_ICON_ROBOTIC
|
||||
body_markings = null
|
||||
|
||||
if(owner)
|
||||
owner.updatehealth()
|
||||
@@ -332,14 +334,18 @@
|
||||
species_color = ""
|
||||
|
||||
if("mam_body_markings" in S.default_features)
|
||||
var/datum/sprite_accessory/Smark
|
||||
Smark = GLOB.mam_body_markings_list[H.dna.features["mam_body_markings"]]
|
||||
if(H.dna.features.["mam_body_markings"] != "None")
|
||||
body_markings_icon = Smark.icon
|
||||
body_markings = lowertext(H.dna.features.["mam_body_markings"])
|
||||
if(MATRIXED)
|
||||
markings_color = list(colorlist)
|
||||
else
|
||||
body_markings = "plain"
|
||||
markings_color = (H.dna.features.["mcolor"])
|
||||
else
|
||||
body_markings = "None"
|
||||
body_markings = null
|
||||
markings_color = ""
|
||||
|
||||
if(!dropping_limb && H.dna.check_mutation(HULK))
|
||||
@@ -354,6 +360,7 @@
|
||||
|
||||
if(status == BODYPART_ROBOTIC)
|
||||
dmg_overlay_type = "robotic"
|
||||
body_markings = null
|
||||
|
||||
if(dropping_limb)
|
||||
no_update = TRUE //when attached, the limb won't be affected by the appearance changes of its mob owner.
|
||||
@@ -385,11 +392,11 @@
|
||||
. += image('icons/mob/dam_mob.dmi', "[dmg_overlay_type]_[body_zone]_[brutestate]0", -DAMAGE_LAYER, image_dir)
|
||||
if(burnstate)
|
||||
. += image('icons/mob/dam_mob.dmi', "[dmg_overlay_type]_[body_zone]_0[burnstate]", -DAMAGE_LAYER, image_dir)
|
||||
if(body_markings)
|
||||
if(body_markings && status != BODYPART_ROBOTIC)
|
||||
if(use_digitigrade == NOT_DIGITIGRADE)
|
||||
. += image('modular_citadel/icons/mob/mam_markings.dmi', "[body_markings]_[body_zone]", -MARKING_LAYER, image_dir)
|
||||
. += image(body_markings_icon, "[body_markings]_[body_zone]", -MARKING_LAYER, image_dir)
|
||||
else
|
||||
. += image('modular_citadel/icons/mob/mam_markings.dmi', "[body_markings]_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
|
||||
. += image(body_markings_icon, "[body_markings]_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
|
||||
|
||||
var/image/limb = image(layer = -BODYPARTS_LAYER, dir = image_dir)
|
||||
var/image/aux
|
||||
@@ -442,14 +449,14 @@
|
||||
// Body markings
|
||||
if(body_markings)
|
||||
if(species_id == "husk")
|
||||
marking = image('modular_citadel/icons/mob/mam_markings.dmi', "husk_[body_zone]", -MARKING_LAYER, image_dir)
|
||||
marking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[body_zone]", -MARKING_LAYER, image_dir)
|
||||
else if(species_id == "husk" && use_digitigrade)
|
||||
marking = image('modular_citadel/icons/mob/mam_markings.dmi', "husk_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
|
||||
marking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
|
||||
|
||||
else if(!use_digitigrade)
|
||||
marking = image('modular_citadel/icons/mob/mam_markings.dmi', "[body_markings]_[body_zone]", -MARKING_LAYER, image_dir)
|
||||
marking = image(body_markings_icon, "[body_markings]_[body_zone]", -MARKING_LAYER, image_dir)
|
||||
else
|
||||
marking = image('modular_citadel/icons/mob/mam_markings.dmi', "[body_markings]_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
|
||||
marking = image(body_markings_icon, "[body_markings]_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
|
||||
. += marking
|
||||
|
||||
// Citadel End
|
||||
@@ -459,9 +466,9 @@
|
||||
. += aux
|
||||
if(body_markings)
|
||||
if(species_id == "husk")
|
||||
auxmarking = image('modular_citadel/icons/mob/mam_markings.dmi', "husk_[aux_zone]", -aux_layer, image_dir)
|
||||
auxmarking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[aux_zone]", -aux_layer, image_dir)
|
||||
else
|
||||
auxmarking = image('modular_citadel/icons/mob/mam_markings.dmi', "[body_markings]_[aux_zone]", -aux_layer, image_dir)
|
||||
auxmarking = image(body_markings_icon, "[body_markings]_[aux_zone]", -aux_layer, image_dir)
|
||||
. += auxmarking
|
||||
|
||||
else
|
||||
@@ -475,21 +482,21 @@
|
||||
. += aux
|
||||
if(body_markings)
|
||||
if(species_id == "husk")
|
||||
auxmarking = image('modular_citadel/icons/mob/mam_markings.dmi', "husk_[aux_zone]", -aux_layer, image_dir)
|
||||
auxmarking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[aux_zone]", -aux_layer, image_dir)
|
||||
else
|
||||
auxmarking = image('modular_citadel/icons/mob/mam_markings.dmi', "[body_markings]_[aux_zone]", -aux_layer, image_dir)
|
||||
auxmarking = image(body_markings_icon, "[body_markings]_[aux_zone]", -aux_layer, image_dir)
|
||||
. += auxmarking
|
||||
|
||||
if(body_markings)
|
||||
if(species_id == "husk")
|
||||
marking = image('modular_citadel/icons/mob/mam_markings.dmi', "husk_[body_zone]", -MARKING_LAYER, image_dir)
|
||||
marking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[body_zone]", -MARKING_LAYER, image_dir)
|
||||
else if(species_id == "husk" && use_digitigrade)
|
||||
marking = image('modular_citadel/icons/mob/mam_markings.dmi', "husk_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
|
||||
marking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
|
||||
|
||||
else if(!use_digitigrade)
|
||||
marking = image('modular_citadel/icons/mob/mam_markings.dmi', "[body_markings]_[body_zone]", -MARKING_LAYER, image_dir)
|
||||
marking = image(body_markings_icon, "[body_markings]_[body_zone]", -MARKING_LAYER, image_dir)
|
||||
else
|
||||
marking = image('modular_citadel/icons/mob/mam_markings.dmi', "[body_markings]_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
|
||||
marking = image(body_markings_icon, "[body_markings]_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
|
||||
. += marking
|
||||
return
|
||||
|
||||
|
||||
@@ -178,6 +178,7 @@
|
||||
L.update_limb(fixed_icon, src)
|
||||
if(robotic)
|
||||
L.change_bodypart_status(BODYPART_ROBOTIC)
|
||||
L.body_markings = null
|
||||
. = L
|
||||
|
||||
/mob/living/carbon/monkey/newBodyPart(zone, robotic, fixed_icon)
|
||||
|
||||
@@ -1438,6 +1438,13 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
|
||||
cost = 20
|
||||
restricted_roles = list("Assistant")
|
||||
|
||||
/datum/uplink_item/role_restricted/goldenbox
|
||||
name = "Gold Toolbox"
|
||||
desc = "A gold planted plastitanium toolbox loaded with tools. Comes with a set of AI detection multi-tool and a pare of combat gloves."
|
||||
item = /obj/item/storage/toolbox/gold_real
|
||||
cost = 5 // Has synda tools + gloves + a robust weapon
|
||||
restricted_roles = list("Assistant", "Curator") //Curator do to being made of gold - It fits the theme
|
||||
|
||||
/datum/uplink_item/role_restricted/brainwash_disk
|
||||
name = "Brainwashing Surgery Program"
|
||||
desc = "A disk containing the procedure to perform a brainwashing surgery, allowing you to implant an objective onto a target. \
|
||||
|
||||
Reference in New Issue
Block a user