This commit is contained in:
Ghommie
2019-05-17 02:17:18 +02:00
105 changed files with 1057 additions and 426 deletions
+1
View File
@@ -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"
+1
View File
@@ -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))
+3 -1
View File
@@ -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
+4
View File
@@ -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
)
+3
View File
@@ -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))
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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)
+1 -1
View File
@@ -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)
+25 -1
View File
@@ -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)
+9 -1
View File
@@ -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
+1
View File
@@ -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 -1
View File
@@ -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)
@@ -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()
+1 -1
View File
@@ -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
+87 -9
View File
@@ -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
+8 -9
View File
@@ -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
+11
View File
@@ -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
+5 -5
View File
@@ -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()
+2
View File
@@ -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
+1 -1
View File
@@ -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
+2 -2
View File
@@ -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"
+3 -3
View File
@@ -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]"
+1 -1
View File
@@ -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))
+4 -3
View File
@@ -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
+2 -2
View File
@@ -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"
+24 -17
View File
@@ -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)
+7
View File
@@ -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. \