Revert "Merge branch 'master' into fairylights"
This reverts commit2947727659, reversing changes made to91063fe882.
@@ -5,7 +5,5 @@
|
||||
|
||||
"workbench.editorAssociations": {
|
||||
"*.dmi": "imagePreview.previewEditor"
|
||||
},
|
||||
"files.eol": "\n",
|
||||
"files.insertFinalNewline": true,
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -64,7 +64,7 @@
|
||||
//DNA - Because fuck you and your magic numbers being all over the codebase.
|
||||
#define DNA_BLOCK_SIZE 3
|
||||
|
||||
#define DNA_UNI_IDENTITY_BLOCKS 20
|
||||
#define DNA_UNI_IDENTITY_BLOCKS 14
|
||||
#define DNA_HAIR_COLOR_BLOCK 1
|
||||
#define DNA_FACIAL_HAIR_COLOR_BLOCK 2
|
||||
#define DNA_SKIN_TONE_BLOCK 3
|
||||
@@ -80,14 +80,6 @@
|
||||
#define DNA_MUTANTMARKING_BLOCK 13
|
||||
#define DNA_TAUR_BLOCK 14
|
||||
|
||||
// hyper edit
|
||||
#define DNA_COSMETIC_HEAD_BLOCK 15
|
||||
#define DNA_COSMETIC_CHEST_BLOCK 16
|
||||
#define DNA_COSMETIC_L_ARM_BLOCK 17
|
||||
#define DNA_COSMETIC_R_ARM_BLOCK 18
|
||||
#define DNA_COSMETIC_L_LEG_BLOCK 19
|
||||
#define DNA_COSMETIC_R_LEG_BLOCK 20
|
||||
|
||||
#define DNA_SEQUENCE_LENGTH 4
|
||||
#define DNA_MUTATION_BLOCKS 8
|
||||
#define DNA_UNIQUE_ENZYMES_LEN 32
|
||||
@@ -126,9 +118,6 @@
|
||||
#define MARKINGS 17
|
||||
#define WINGCOLOR 18
|
||||
|
||||
#define NOMOUTH 19
|
||||
|
||||
|
||||
//organ slots
|
||||
#define ORGAN_SLOT_BRAIN "brain"
|
||||
#define ORGAN_SLOT_APPENDIX "appendix"
|
||||
|
||||
@@ -705,11 +705,6 @@
|
||||
///(obj/item/insertion_candidate, mob/user, silent) - returns bool
|
||||
#define COMSIG_TRY_STORAGE_CAN_INSERT "storage_can_equip"
|
||||
|
||||
//from base of atom/movable/on_enter_storage(): (datum/component/storage/concrete/master_storage)
|
||||
#define COMSIG_STORAGE_ENTERED "storage_entered"
|
||||
//from base of atom/movable/on_exit_storage(): (datum/component/storage/concrete/master_storage)
|
||||
#define COMSIG_STORAGE_EXITED "storage_exited"
|
||||
|
||||
// /datum/component/two_handed signals
|
||||
|
||||
///from base of datum/component/two_handed/proc/wield(mob/living/carbon/user): (/mob/user)
|
||||
|
||||
@@ -5,9 +5,4 @@
|
||||
#define BELLY_STRETCH_SIZE 6 // for flavor text
|
||||
|
||||
#define BUTT_MIN_SIZE 0
|
||||
#define BUTT_MAX_SIZE_SELECTABLE 5
|
||||
#define BUTT_MAX_SIZE 8
|
||||
|
||||
#define GENITALS_HIDDEN "hidden"
|
||||
#define GENITALS_CLOTHES "clothes"
|
||||
#define GENITALS_VISIBLE "visible"
|
||||
#define BUTT_MAX_SIZE 5
|
||||
@@ -60,8 +60,6 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list(
|
||||
|
||||
#define isbrain(A) (istype(A, /mob/living/brain))
|
||||
|
||||
#define isnoncarbon(A) (isliving(A) && !iscarbon(A))
|
||||
|
||||
//Carbon mobs
|
||||
#define iscarbon(A) (istype(A, /mob/living/carbon))
|
||||
|
||||
|
||||
@@ -7,5 +7,4 @@
|
||||
#define MARTIALART_MUSHPUNCH "mushroom punch"
|
||||
#define MARTIALART_KRAVMAGA "krav maga"
|
||||
#define MARTIALART_CQC "CQC"
|
||||
#define MARTIALART_PLASMAFIST "plasma fist"
|
||||
#define MARTIALART_KNS_CQC "KNS CQC"
|
||||
#define MARTIALART_PLASMAFIST "plasma fist"
|
||||
@@ -151,7 +151,6 @@
|
||||
//Nutrition levels for humans
|
||||
#define NUTRITION_LEVEL_FAT 600
|
||||
#define NUTRITION_LEVEL_FULL 550
|
||||
#define NUTRITION_LEVEL_ALMOST_FULL 535
|
||||
#define NUTRITION_LEVEL_WELL_FED 450
|
||||
#define NUTRITION_LEVEL_FED 350
|
||||
#define NUTRITION_LEVEL_HUNGRY 250
|
||||
|
||||
@@ -120,6 +120,7 @@
|
||||
#define VV_HK_PURRBATION "purrbation"
|
||||
|
||||
// misc
|
||||
#define VV_HK_WEAKREF_RESOLVE "weakref_resolve"
|
||||
#define VV_HK_SPACEVINE_PURGE "spacevine_purge"
|
||||
|
||||
// paintings
|
||||
#define VV_HK_REMOVE_PAINTING "remove_painting"
|
||||
|
||||
@@ -1,10 +0,0 @@
|
||||
GLOBAL_LIST_EMPTY(cosmetic_heads)
|
||||
GLOBAL_LIST_EMPTY(cosmetic_chests)
|
||||
GLOBAL_LIST_EMPTY(cosmetic_arms)
|
||||
GLOBAL_LIST_EMPTY(cosmetic_legs)
|
||||
|
||||
/proc/init_cosmetic_parts(datum/cosmetic_part/type, list/global_list)
|
||||
for(var/subtype in subtypesof(type))
|
||||
var/datum/cosmetic_part/part = new subtype()
|
||||
global_list[part.id] = part
|
||||
return global_list
|
||||
@@ -54,14 +54,6 @@
|
||||
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/vagina, GLOB.vagina_shapes_list)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/breasts, GLOB.breasts_shapes_list)
|
||||
|
||||
// hyper: cosmetic parts
|
||||
init_cosmetic_parts(/datum/cosmetic_part/head, GLOB.cosmetic_heads)
|
||||
init_cosmetic_parts(/datum/cosmetic_part/chest, GLOB.cosmetic_chests)
|
||||
init_cosmetic_parts(/datum/cosmetic_part/arms, GLOB.cosmetic_arms)
|
||||
init_cosmetic_parts(/datum/cosmetic_part/legs, GLOB.cosmetic_legs)
|
||||
// end cosmetic parts
|
||||
|
||||
GLOB.breasts_size_list = list ("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o") //We need the list to choose from initialized, but it's no longer a sprite_accessory thing.
|
||||
GLOB.genital_fluids_list = list ("Milk", "Water", "Semen", "Femcum", "Honey")
|
||||
GLOB.gentlemans_organ_names = list("phallus", "willy", "dick", "prick", "member", "tool", "gentleman's organ", "cock", "wang", "knob", "dong", "joystick", "pecker", "johnson", "weenie", "tadger", "schlong", "thirsty ferret", "baloney pony", "schlanger")
|
||||
|
||||
@@ -136,27 +136,15 @@
|
||||
var/datum/sprite_accessory/S = instance
|
||||
if(!S.ckeys_allowed)
|
||||
snowflake_mam_snouts_list[S.name] = mspath
|
||||
|
||||
var/list/snowflake_ipc_antenna_list = list()
|
||||
for(var/mspath in GLOB.ipc_antennas_list)
|
||||
var/datum/sprite_accessory/antenna/instance = GLOB.ipc_antennas_list[mspath]
|
||||
var/datum/sprite_accessory/mam_snouts/instance = GLOB.ipc_antennas_list[mspath]
|
||||
if(istype(instance, /datum/sprite_accessory))
|
||||
var/datum/sprite_accessory/S = instance
|
||||
if(intendedspecies && S.recommended_species && !S.recommended_species.Find(intendedspecies))
|
||||
continue
|
||||
if(!S.ckeys_allowed)
|
||||
snowflake_ipc_antenna_list[S.name] = mspath
|
||||
|
||||
var/list/snowflake_ipc_screen_list = list()
|
||||
for(var/mspath in GLOB.ipc_screens_list)
|
||||
var/datum/sprite_accessory/screen/instance = GLOB.ipc_screens_list[mspath]
|
||||
if(istype(instance, /datum/sprite_accessory))
|
||||
var/datum/sprite_accessory/S = instance
|
||||
if(intendedspecies && S.recommended_species && !S.recommended_species.Find(intendedspecies))
|
||||
continue
|
||||
if(!S.ckeys_allowed)
|
||||
snowflake_ipc_screen_list[S.name] = mspath
|
||||
|
||||
var/color1 = random_short_color()
|
||||
var/color2 = random_short_color()
|
||||
var/color3 = random_short_color()
|
||||
@@ -245,17 +233,11 @@
|
||||
"womb_cum_mult" = CUM_RATE_MULT,
|
||||
"womb_efficiency" = CUM_EFFICIENCY,
|
||||
"womb_fluid" = "femcum",
|
||||
"ipc_screen" = snowflake_ipc_screen_list ? pick(snowflake_ipc_screen_list) : "None",
|
||||
"ipc_antenna" = snowflake_ipc_antenna_list ? pick(snowflake_ipc_antenna_list) : "None",
|
||||
"ipc_screen" = snowflake_ipc_antenna_list ? pick(snowflake_ipc_antenna_list) : "None",
|
||||
"ipc_antenna" = "None",
|
||||
"flavor_text" = "",
|
||||
"silicon_flavor_text" = "",
|
||||
"ooc_text" = "",
|
||||
"cosmetic_head" = GLOB.cosmetic_heads["default"],
|
||||
"cosmetic_chest" = GLOB.cosmetic_chests["default"],
|
||||
"cosmetic_l_arm" = GLOB.cosmetic_arms["default"],
|
||||
"cosmetic_r_arm" = GLOB.cosmetic_arms["default"],
|
||||
"cosmetic_l_leg" = GLOB.cosmetic_legs["default"],
|
||||
"cosmetic_r_leg" = GLOB.cosmetic_legs["default"]))
|
||||
"ooc_text" = ""))
|
||||
|
||||
/proc/random_hair_style(gender)
|
||||
switch(gender)
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
PROCESSING_SUBSYSTEM_DEF(chemistry)
|
||||
name = "Chemistry"
|
||||
wait = 5
|
||||
flags = SS_KEEP_TIMING
|
||||
|
||||
|
||||
|
||||
@@ -132,12 +132,6 @@
|
||||
if(!GLOB.taur_list.len)
|
||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/taur, GLOB.taur_list)
|
||||
L[DNA_TAUR_BLOCK] = construct_block(GLOB.taur_list.Find(features["taur"]), GLOB.taur_list.len)
|
||||
L[DNA_COSMETIC_HEAD_BLOCK] = construct_block(GLOB.cosmetic_heads.Find(features["cosmetic_head"]), GLOB.cosmetic_heads.len)
|
||||
L[DNA_COSMETIC_CHEST_BLOCK] = construct_block(GLOB.cosmetic_chests.Find(features["cosmetic_chest"]), GLOB.cosmetic_chests.len)
|
||||
L[DNA_COSMETIC_L_ARM_BLOCK] = construct_block(GLOB.cosmetic_arms.Find(features["cosmetic_l_arm"]), GLOB.cosmetic_arms.len)
|
||||
L[DNA_COSMETIC_R_ARM_BLOCK] = construct_block(GLOB.cosmetic_arms.Find(features["cosmetic_r_arm"]), GLOB.cosmetic_arms.len)
|
||||
L[DNA_COSMETIC_L_LEG_BLOCK] = construct_block(GLOB.cosmetic_legs.Find(features["cosmetic_l_leg"]), GLOB.cosmetic_legs.len)
|
||||
L[DNA_COSMETIC_R_LEG_BLOCK] = construct_block(GLOB.cosmetic_legs.Find(features["cosmetic_r_leg"]), GLOB.cosmetic_legs.len)
|
||||
|
||||
for(var/i=1, i<=DNA_UNI_IDENTITY_BLOCKS, i++)
|
||||
if(L[i])
|
||||
@@ -233,18 +227,6 @@
|
||||
construct_block(GLOB.mam_body_markings_list.Find(features["mam_body_markings"]), GLOB.mam_body_markings_list.len)
|
||||
if(DNA_TAUR_BLOCK)
|
||||
construct_block(GLOB.taur_list.Find(features["taur"]), GLOB.taur_list.len)
|
||||
if(DNA_COSMETIC_HEAD_BLOCK)
|
||||
construct_block(GLOB.cosmetic_heads.Find(features["cosmetic_head"]), GLOB.cosmetic_heads.len)
|
||||
if(DNA_COSMETIC_CHEST_BLOCK)
|
||||
construct_block(GLOB.cosmetic_chests.Find(features["cosmetic_chest"]), GLOB.cosmetic_chests.len)
|
||||
if(DNA_COSMETIC_L_ARM_BLOCK)
|
||||
construct_block(GLOB.cosmetic_arms.Find(features["cosmetic_l_arm"]), GLOB.cosmetic_arms.len)
|
||||
if(DNA_COSMETIC_R_ARM_BLOCK)
|
||||
construct_block(GLOB.cosmetic_arms.Find(features["cosmetic_r_arm"]), GLOB.cosmetic_arms.len)
|
||||
if(DNA_COSMETIC_L_LEG_BLOCK)
|
||||
construct_block(GLOB.cosmetic_legs.Find(features["cosmetic_l_leg"]), GLOB.cosmetic_legs.len)
|
||||
if(DNA_COSMETIC_R_LEG_BLOCK)
|
||||
construct_block(GLOB.cosmetic_legs.Find(features["cosmetic_r_leg"]), GLOB.cosmetic_legs.len)
|
||||
|
||||
//Please use add_mutation or activate_mutation instead
|
||||
/datum/dna/proc/force_give(datum/mutation/human/HM)
|
||||
|
||||
@@ -1,39 +0,0 @@
|
||||
/**
|
||||
* Element for making items change scaling depending on if they appear in the world or in a storage container.
|
||||
*
|
||||
* For context, overworld items are anything on a turf, storage scaling includes anywhere that the item is used as a UI element.
|
||||
* Scaling should affect the target's icon and any affecting overlays
|
||||
*/
|
||||
/datum/element/item_scaling
|
||||
element_flags = ELEMENT_BESPOKE
|
||||
id_arg_index = 2
|
||||
/// Value to scale the target by when it's in the overworld (on a turf)
|
||||
var/overworld_scaling = 1
|
||||
/// Value to scale the target by when it's in a storage component or inventory slot
|
||||
var/storage_scaling = 1
|
||||
|
||||
/datum/element/item_scaling/Attach(datum/target, overworld_scaling = 1, storage_scaling = 1)
|
||||
. = ..()
|
||||
if(!isatom(target))
|
||||
return ELEMENT_INCOMPATIBLE
|
||||
|
||||
src.overworld_scaling = overworld_scaling
|
||||
src.storage_scaling = storage_scaling
|
||||
|
||||
scale(target, overworld_scaling)
|
||||
|
||||
RegisterSignal(target, list(COMSIG_ITEM_DROPPED, COMSIG_STORAGE_EXITED), .proc/scale_overworld)
|
||||
RegisterSignal(target, list(COMSIG_ITEM_EQUIPPED, COMSIG_STORAGE_ENTERED), .proc/scale_storage)
|
||||
|
||||
//scale :)
|
||||
/datum/element/item_scaling/proc/scale(atom/source, scaling)
|
||||
var/matrix/M = matrix()
|
||||
source.transform = M.Scale(scaling)
|
||||
|
||||
/// Signal handler for when the item is dropped
|
||||
/datum/element/item_scaling/proc/scale_overworld(datum/source)
|
||||
scale(source, overworld_scaling)
|
||||
|
||||
/// Signal handler for when the item is picked up
|
||||
/datum/element/item_scaling/proc/scale_storage(datum/source)
|
||||
scale(source, storage_scaling)
|
||||
@@ -1,143 +0,0 @@
|
||||
#define KNS_KICK_COMBO "DG"
|
||||
#define KNS_RESTRAIN_COMBO "GG"
|
||||
|
||||
/datum/martial_art/kinaris
|
||||
name = "KNS CQC"
|
||||
id = MARTIALART_KNS_CQC
|
||||
help_verb = /mob/living/carbon/human/proc/KNS_CQC_help
|
||||
block_chance = 75
|
||||
|
||||
/datum/martial_art/kinaris/proc/drop_restraining()
|
||||
restraining = FALSE
|
||||
|
||||
/datum/martial_art/kinaris/proc/check_streak(mob/living/carbon/human/A, mob/living/carbon/human/D)
|
||||
if(!can_use(A))
|
||||
return FALSE
|
||||
if(findtext(streak,KNS_KICK_COMBO))
|
||||
streak = ""
|
||||
Kick(A,D)
|
||||
return TRUE
|
||||
if(findtext(streak,KNS_RESTRAIN_COMBO))
|
||||
streak = ""
|
||||
Restrain(A,D)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/datum/martial_art/kinaris/proc/Kick(mob/living/carbon/human/A, mob/living/carbon/human/D)
|
||||
if(!can_use(A))
|
||||
return FALSE
|
||||
if(!D.stat || !D.IsKnockdown())
|
||||
D.visible_message("<span class='warning'>[A] kicks [D] back!</span>", \
|
||||
"<span class='userdanger'>[A] kicks you back!</span>")
|
||||
playsound(get_turf(A), 'sound/weapons/cqchit1.ogg', 50, 1, -1)
|
||||
var/atom/throw_target = get_edge_target_turf(D, A.dir)
|
||||
D.throw_at(throw_target, 1, 14, A)
|
||||
D.apply_damage(10, BRUTE)
|
||||
log_combat(A, D, "kicked (KNS CQC)")
|
||||
if(D.IsKnockdown() && !D.stat)
|
||||
D.visible_message("<span class='warning'>[A] kicks [D]'s head, knocking [D.p_them()] out!</span>", \
|
||||
"<span class='userdanger'>[A] kicks your head, knocking you out!</span>")
|
||||
playsound(get_turf(A), 'sound/weapons/genhit1.ogg', 50, 1, -1)
|
||||
D.SetSleeping(300)
|
||||
D.adjustOrganLoss(ORGAN_SLOT_BRAIN, 15, 150)
|
||||
return TRUE
|
||||
|
||||
/datum/martial_art/kinaris/proc/Restrain(mob/living/carbon/human/A, mob/living/carbon/human/D)
|
||||
if(restraining)
|
||||
return
|
||||
if(!can_use(A))
|
||||
return FALSE
|
||||
if(!D.stat)
|
||||
D.visible_message("<span class='warning'>[A] locks [D] into a restraining position!</span>", \
|
||||
"<span class='userdanger'>[A] locks you into a restraining position!</span>")
|
||||
D.adjustStaminaLoss(20)
|
||||
D.Stun(100)
|
||||
restraining = TRUE
|
||||
addtimer(CALLBACK(src, .proc/drop_restraining), 50, TIMER_UNIQUE)
|
||||
return TRUE
|
||||
|
||||
/datum/martial_art/kinaris/grab_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
|
||||
if(!can_use(A))
|
||||
return FALSE
|
||||
add_to_streak("G",D)
|
||||
if(check_streak(A,D))
|
||||
return TRUE
|
||||
if(A.grab_state >= GRAB_AGGRESSIVE)
|
||||
D.grabbedby(A, 1)
|
||||
else
|
||||
A.start_pulling(D, 1)
|
||||
if(A.pulling)
|
||||
D.stop_pulling()
|
||||
log_combat(A, D, "grabbed", addition="aggressively")
|
||||
A.grab_state = GRAB_AGGRESSIVE //Instant aggressive grab
|
||||
return TRUE
|
||||
|
||||
/datum/martial_art/kinaris/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
|
||||
if(!can_use(A))
|
||||
return FALSE
|
||||
add_to_streak("D",D)
|
||||
var/obj/item/I = null
|
||||
if(check_streak(A,D))
|
||||
return TRUE
|
||||
if(prob(65))
|
||||
if(!D.stat || !D.IsKnockdown() || !restraining)
|
||||
I = D.get_active_held_item()
|
||||
D.visible_message("<span class='warning'>[A] strikes [D]'s jaw with their hand!</span>", \
|
||||
"<span class='userdanger'>[A] strikes your jaw, disorienting you!</span>")
|
||||
playsound(get_turf(D), 'sound/weapons/cqchit1.ogg', 50, 1, -1)
|
||||
if(I && D.temporarilyRemoveItemFromInventory(I))
|
||||
A.put_in_hands(I)
|
||||
D.Jitter(2)
|
||||
D.apply_damage(5, BRUTE)
|
||||
else
|
||||
D.visible_message("<span class='danger'>[A] attempted to disarm [D]!</span>", \
|
||||
"<span class='userdanger'>[A] attempted to disarm [D]!</span>")
|
||||
playsound(D, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
|
||||
log_combat(A, D, "disarmed (KNS CQC)", "[I ? " grabbing \the [I]" : ""]")
|
||||
if(restraining && A.pulling == D)
|
||||
D.visible_message("<span class='danger'>[A] puts [D] into a chokehold!</span>", \
|
||||
"<span class='userdanger'>[A] puts you into a chokehold!</span>")
|
||||
D.SetSleeping(400)
|
||||
restraining = FALSE
|
||||
if(A.grab_state < GRAB_NECK)
|
||||
A.grab_state = GRAB_NECK
|
||||
else
|
||||
restraining = FALSE
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/datum/martial_art/kinaris/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
|
||||
if(!can_use(A))
|
||||
return FALSE
|
||||
log_combat(A, D, "attacked (KNS CQC)")
|
||||
A.do_attack_animation(D)
|
||||
var/picked_hit_type = pick("CQC'd", "Big Bossed")
|
||||
var/bonus_damage = 13
|
||||
if(D.IsKnockdown() || D.resting || D.lying)
|
||||
bonus_damage += 5
|
||||
picked_hit_type = "stomps on"
|
||||
D.apply_damage(bonus_damage, PAIN)
|
||||
if(picked_hit_type == "kicks" || picked_hit_type == "stomps on")
|
||||
playsound(get_turf(D), 'sound/weapons/cqchit2.ogg', 50, 1, -1)
|
||||
else
|
||||
playsound(get_turf(D), 'sound/weapons/cqchit1.ogg', 50, 1, -1)
|
||||
D.visible_message("<span class='danger'>[A] [picked_hit_type] [D]!</span>", \
|
||||
"<span class='userdanger'>[A] [picked_hit_type] you!</span>")
|
||||
log_combat(A, D, "[picked_hit_type] (KNS CQC)")
|
||||
if(A.resting && !D.stat && !D.IsKnockdown())
|
||||
D.visible_message("<span class='warning'>[A] leg sweeps [D]!", \
|
||||
"<span class='userdanger'>[A] leg sweeps you!</span>")
|
||||
playsound(get_turf(A), 'sound/effects/hit_kick.ogg', 50, 1, -1)
|
||||
D.apply_damage(10, PAIN)
|
||||
D.Knockdown(60)
|
||||
log_combat(A, D, "sweeped (KNS CQC)")
|
||||
return TRUE
|
||||
|
||||
/mob/living/carbon/human/proc/KNS_CQC_help()
|
||||
set name = "Remember The Basics"
|
||||
set desc = "You try to remember some of the basics of training."
|
||||
set category = "KNS CQC"
|
||||
to_chat(usr, "<b><i>You try to remember some of your training, undertaken when entering Kinaris employ.</i></b>")
|
||||
|
||||
to_chat(usr, "<span class='notice'>CQC Kick</span>: Disarm Grab. Knocks opponent away. Knocks out stunned or knocked down opponents.")
|
||||
to_chat(usr, "<span class='notice'>Restrain</span>: Grab Grab. Locks opponents into a restraining position, disarm to knock them out with a choke hold.")
|
||||
@@ -1,7 +1,3 @@
|
||||
/*
|
||||
* Creates a weakref to the given input.
|
||||
* See /datum/weakref's documentation for more information.
|
||||
*/
|
||||
/proc/WEAKREF(datum/input)
|
||||
if(istype(input) && !QDELETED(input))
|
||||
if(istype(input, /datum/weakref))
|
||||
@@ -14,80 +10,16 @@
|
||||
/datum/proc/create_weakref() //Forced creation for admin proccalls
|
||||
return WEAKREF(src)
|
||||
|
||||
/**
|
||||
* A weakref holds a non-owning reference to a datum.
|
||||
* The datum can be referenced again using `resolve()`.
|
||||
*
|
||||
* To figure out why this is important, you must understand how deletion in
|
||||
* BYOND works.
|
||||
*
|
||||
* Imagine a datum as a TV in a living room. When one person enters to watch
|
||||
* TV, they turn it on. Others can come into the room and watch the TV.
|
||||
* When the last person leaves the room, they turn off the TV because it's
|
||||
* no longer being used.
|
||||
*
|
||||
* A datum being deleted tells everyone who's watching the TV to stop.
|
||||
* If everyone leaves properly (AKA cleaning up their references), then the
|
||||
* last person will turn off the TV, and everything is well.
|
||||
* However, if someone is resistant (holds a hard reference after deletion),
|
||||
* then someone has to walk in, drag them away, and turn off the TV forecefully.
|
||||
* This process is very slow, and it's known as hard deletion.
|
||||
*
|
||||
* This is where weak references come in. Weak references don't count as someone
|
||||
* watching the TV. Thus, when what it's referencing is destroyed, it will
|
||||
* hopefully clean up properly, and limit hard deletions.
|
||||
*
|
||||
* A common use case for weak references is holding onto what created itself.
|
||||
* For example, if a machine wanted to know what its last user was, it might
|
||||
* create a `var/mob/living/last_user`. However, this is a strong reference to
|
||||
* the mob, and thus will force a hard deletion when that mob is deleted.
|
||||
* It is often better in this case to instead create a weakref to the user,
|
||||
* meaning this type definition becomes `var/datum/weakref/last_user`.
|
||||
*
|
||||
* A good rule of thumb is that you should hold strong references to things
|
||||
* that you *own*. For example, a dog holding a chew toy would be the owner
|
||||
* of that chew toy, and thus a `var/obj/item/chew_toy` reference is fine
|
||||
* (as long as it is cleaned up properly).
|
||||
* However, a chew toy does not own its dog, so a `var/mob/living/dog/owner`
|
||||
* might be inferior to a weakref.
|
||||
* This is also a good rule of thumb to avoid circular references, such as the
|
||||
* chew toy example. A circular reference that doesn't clean itself up properly
|
||||
* will always hard delete.
|
||||
*/
|
||||
/datum/weakref
|
||||
var/reference
|
||||
|
||||
/datum/weakref/New(datum/thing)
|
||||
reference = REF(thing)
|
||||
|
||||
/datum/weakref/Destroy(force)
|
||||
var/datum/target = resolve()
|
||||
qdel(target)
|
||||
/datum/weakref/Destroy()
|
||||
return QDEL_HINT_LETMELIVE //Let BYOND autoGC thiswhen nothing is using it anymore.
|
||||
|
||||
if(!force)
|
||||
return QDEL_HINT_LETMELIVE //Let BYOND autoGC thiswhen nothing is using it anymore.
|
||||
target?.weak_reference = null
|
||||
return ..()
|
||||
|
||||
/**
|
||||
* Retrieves the datum that this weakref is referencing.
|
||||
*
|
||||
* This will return `null` if the datum was deleted. This MUST be respected.
|
||||
*/
|
||||
/datum/weakref/proc/resolve()
|
||||
var/datum/D = locate(reference)
|
||||
return (!QDELETED(D) && D.weak_reference == src) ? D : null
|
||||
|
||||
|
||||
/datum/weakref/vv_get_dropdown()
|
||||
. = ..()
|
||||
VV_DROPDOWN_OPTION(VV_HK_WEAKREF_RESOLVE, "Go to reference")
|
||||
|
||||
/datum/weakref/vv_do_topic(list/href_list)
|
||||
. = ..()
|
||||
if(href_list[VV_HK_WEAKREF_RESOLVE])
|
||||
if(!check_rights(NONE))
|
||||
return
|
||||
var/datum/R = resolve()
|
||||
if(R)
|
||||
usr.client.debug_variables(R)
|
||||
|
||||
@@ -699,11 +699,11 @@
|
||||
|
||||
// called when this atom is removed from a storage item, which is passed on as S. The loc variable is already set to the new destination before this is called.
|
||||
/atom/movable/proc/on_exit_storage(datum/component/storage/concrete/S)
|
||||
SEND_SIGNAL(src, COMSIG_STORAGE_EXITED, S)
|
||||
return
|
||||
|
||||
// called when this atom is added into a storage item, which is passed on as S. The loc variable is already set to the storage item.
|
||||
/atom/movable/proc/on_enter_storage(datum/component/storage/concrete/S)
|
||||
SEND_SIGNAL(src, COMSIG_STORAGE_ENTERED, S)
|
||||
return
|
||||
|
||||
/atom/movable/proc/get_spacemove_backup()
|
||||
var/atom/movable/dense_object_backup
|
||||
|
||||
@@ -76,23 +76,11 @@
|
||||
|
||||
if(!calibrated && iscarbon(M) && prob(30 - ((accuracy) * 10))) //oh dear a problem
|
||||
var/mob/living/carbon/C = M
|
||||
|
||||
//Rework to teleporter mishap
|
||||
log_game("[C] ([key_name(C)]) had a teleporter mishap")
|
||||
|
||||
|
||||
to_chat(C, "<span class='italics'>You feel the world contort and twist....</span>") //idk a good line
|
||||
C.adjustCloneLoss( rand(40,75) )
|
||||
C.apply_effect((rand(120 - accuracy * 40, 180 - accuracy * 60)), EFFECT_IRRADIATE, 0) //recycling this for some extra spice
|
||||
|
||||
//Oh yea, random limb removal, adjust/comment out if too harsh a punishment
|
||||
|
||||
for( var/obj/item/bodypart/BP in C.bodyparts )
|
||||
if( BP.body_part != CHEST ) //I am not ready to find out what happens if your chest is missing
|
||||
if(prob(50))
|
||||
|
||||
BP.dismember()
|
||||
|
||||
if(C.dna?.species && C.dna.species.id != "fly" && !HAS_TRAIT(C, TRAIT_RADIMMUNE))
|
||||
to_chat(C, "<span class='italics'>You hear a buzzing in your ears.</span>")
|
||||
C.set_species(/datum/species/fly)
|
||||
log_game("[C] ([key_name(C)]) was turned into a fly person")
|
||||
C.apply_effect((rand(120 - accuracy * 40, 180 - accuracy * 60)), EFFECT_IRRADIATE, 0)
|
||||
|
||||
calibrated = FALSE
|
||||
return
|
||||
|
||||
@@ -86,11 +86,11 @@
|
||||
to_chat(user, "<span class='warning'>Your [src] is already occupied.</span>")
|
||||
return
|
||||
|
||||
user.visible_message("<span class='warning'>[hound.name] is carefully inserting [target.name] into their [src].</span>",
|
||||
user.visible_message("<span class='warning'>[hound.name] is carefully inserting [target.name] into their [src].</span>",
|
||||
"<span class='notice'>You start placing [target] into your [src]...</span>")
|
||||
|
||||
if(!patient && iscarbon(target) && !target.buckled && do_after (user, 100, target = target))
|
||||
if(!in_range(src, target))
|
||||
if(!in_range(src, target))
|
||||
return
|
||||
if(patient)
|
||||
return
|
||||
@@ -217,7 +217,7 @@
|
||||
data["occupant"]["fireLoss"] = mob_occupant.getFireLoss()
|
||||
data["occupant"]["cloneLoss"] = mob_occupant.getCloneLoss()
|
||||
data["occupant"]["brainLoss"] = mob_occupant.getOrganLoss(ORGAN_SLOT_BRAIN)
|
||||
|
||||
|
||||
if(mob_occupant.reagents.reagent_list.len)
|
||||
for(var/datum/reagent/R in mob_occupant.reagents.reagent_list)
|
||||
chemical_list += list(list("name" = R.name, "volume" = R.volume))
|
||||
@@ -393,7 +393,7 @@
|
||||
H.playsound_local(source, null, 45, falloff = 0, S = pred_digest)
|
||||
else if(H in contents)
|
||||
H.playsound_local(source, null, 65, falloff = 0, S = prey_digest)
|
||||
|
||||
|
||||
UpdateGut(hound)
|
||||
if(cleaning)
|
||||
addtimer(CALLBACK(src, .proc/clean_cycle, hound), 50)
|
||||
@@ -515,7 +515,7 @@
|
||||
trashman.reset_perspective(src)
|
||||
user.visible_message("<span class='warning'>[hound.name]'s garbage processor groans lightly as [trashman] slips inside.</span>", "<span class='notice'>Your garbage compactor groans lightly as [trashman] slips inside.</span>")
|
||||
playsound(hound, 'sound/effects/bin_close.ogg', 80, 1)
|
||||
|
||||
|
||||
UpdateGut(hound)
|
||||
|
||||
|
||||
@@ -523,11 +523,4 @@
|
||||
var/current_belly = ..()
|
||||
if(length(contents) > 11)
|
||||
current_belly = BORGBELLY_RED
|
||||
return current_belly
|
||||
|
||||
|
||||
/obj/item/dogborg/sleeper/compactor/ore//identical to janihound for moment
|
||||
name = "ore processor"
|
||||
desc = "A mounted compactor unit with fuel processor."
|
||||
icon = 'icons/mob/dogborg.dmi'
|
||||
icon_state = "compactorb"//needs its own icon
|
||||
return current_belly
|
||||
@@ -67,12 +67,6 @@
|
||||
syndie = TRUE
|
||||
if(keyslot.independent)
|
||||
independent = TRUE
|
||||
//Skyrat edit start
|
||||
if(extra_channels)
|
||||
for(var/ch_name in extra_channels)
|
||||
if(!(ch_name in channels))
|
||||
channels[ch_name] = extra_channels[ch_name]
|
||||
//Skyrat edit end
|
||||
|
||||
for(var/ch_name in channels)
|
||||
secure_radio_connections[ch_name] = add_radio(src, GLOB.radiochannels[ch_name])
|
||||
|
||||
@@ -1,38 +0,0 @@
|
||||
/obj/item/implant/kinaris
|
||||
name = "KNS ENH implant"
|
||||
desc = "Enables enhanced reflexes, permitting the user to deploy specialised training."
|
||||
icon = 'icons/obj/implants.dmi'
|
||||
icon_state ="adrenal"
|
||||
activated = 1
|
||||
var/datum/martial_art/kinaris/style = new
|
||||
|
||||
/obj/item/implant/kinaris/get_data()
|
||||
var/dat = {"<b>Implant Specifications:</b><BR>
|
||||
<b>Name:</b> KNS ENH Implant<BR>
|
||||
<b>Life:</b> Roughly twelve hours after death of host<BR>
|
||||
<b>Implant Details:</b> <BR>
|
||||
<b>Function:</b> Forces certain sections of the brain and body into a state of higher function, permitting the user to deploy specialised training."}
|
||||
return dat
|
||||
|
||||
/obj/item/implant/kinaris/activate()
|
||||
. = ..()
|
||||
var/mob/living/carbon/human/H = imp_in
|
||||
if(!ishuman(H))
|
||||
return
|
||||
if(!H.mind)
|
||||
return
|
||||
if(H.mind.has_martialart(MARTIALART_KNS_CQC))
|
||||
style.remove(H)
|
||||
to_chat(H, "<span class='notice'>You disable your reflex implant.</span>")
|
||||
else
|
||||
style.teach(H,1)
|
||||
to_chat(H, "<span class='notice'>You feel your body burn briefly as you enable your reflex implant.</span>")
|
||||
|
||||
/obj/item/implanter/kinaris
|
||||
name = "implanter (KNS ENH)"
|
||||
imp_type = /obj/item/implant/kinaris
|
||||
|
||||
/obj/item/implantcase/kinaris
|
||||
name = "implant case - 'KNS ENH'"
|
||||
desc = "A glass case containing an implant that can enhance the body of the user."
|
||||
imp_type = /obj/item/implant/kinaris
|
||||
@@ -150,7 +150,7 @@
|
||||
desc = "A diamond drill replacement for the mining module's standard drill."
|
||||
icon_state = "cyborg_upgrade3"
|
||||
require_module = 1
|
||||
module_type = list(/obj/item/robot_module/miner, /obj/item/robot_module/orepup)
|
||||
module_type = /obj/item/robot_module/miner
|
||||
|
||||
/obj/item/borg/upgrade/ddrill/action(mob/living/silicon/robot/R, user = usr)
|
||||
. = ..()
|
||||
@@ -182,7 +182,7 @@
|
||||
desc = "A satchel of holding replacement for mining cyborg's ore satchel module."
|
||||
icon_state = "cyborg_upgrade3"
|
||||
require_module = 1
|
||||
module_type = list(/obj/item/robot_module/miner, /obj/item/robot_module/orepup)
|
||||
module_type = /obj/item/robot_module/miner
|
||||
|
||||
/obj/item/borg/upgrade/soh/action(mob/living/silicon/robot/R)
|
||||
. = ..()
|
||||
@@ -285,7 +285,7 @@
|
||||
icon_state = "ash_plating"
|
||||
resistance_flags = LAVA_PROOF | FIRE_PROOF
|
||||
require_module = 1
|
||||
module_type = list(/obj/item/robot_module/miner, /obj/item/robot_module/orepup)
|
||||
module_type = /obj/item/robot_module/miner
|
||||
|
||||
/obj/item/borg/upgrade/lavaproof/action(mob/living/silicon/robot/R, user = usr)
|
||||
. = ..()
|
||||
@@ -417,7 +417,7 @@
|
||||
module_type = list(
|
||||
/obj/item/robot_module/medical,
|
||||
/obj/item/robot_module/medihound)
|
||||
|
||||
|
||||
var/list/additional_reagents = list()
|
||||
|
||||
/obj/item/borg/upgrade/hypospray/action(mob/living/silicon/robot/R, user = usr)
|
||||
|
||||
@@ -481,11 +481,6 @@ GLOBAL_LIST_INIT(cardboard_recipes, list ( \
|
||||
new /datum/stack_recipe("donk-pockets teriyaki box", /obj/item/storage/box/donkpockets/donkpocketteriyaki), \
|
||||
new /datum/stack_recipe("donk-pockets pizza box", /obj/item/storage/box/donkpockets/donkpocketpizza), \
|
||||
new /datum/stack_recipe("donk-pockets berry box", /obj/item/storage/box/donkpockets/donkpocketberry), \
|
||||
new /datum/stack_recipe("donk-pockets taco box", /obj/item/storage/box/donkpockets/donkpockettaco), \
|
||||
new /datum/stack_recipe("donk-pockets plasma box", /obj/item/storage/box/donkpockets/donkpocketplasma), \
|
||||
new /datum/stack_recipe("donk-pockets breakfast box", /obj/item/storage/box/donkpockets/donkpocketbreakfast), \
|
||||
new /datum/stack_recipe("donk-pockets moth box", /obj/item/storage/box/donkpockets/donkpocketmoth), \
|
||||
new /datum/stack_recipe("donk-pockets vegan box", /obj/item/storage/box/donkpockets/donkpocketvegan), \
|
||||
new /datum/stack_recipe("donk-pockets honk box", /obj/item/storage/box/donkpockets/donkpockethonk), \
|
||||
new /datum/stack_recipe("monkey cube box", /obj/item/storage/box/monkeycubes),
|
||||
null, \
|
||||
|
||||
@@ -437,36 +437,6 @@
|
||||
donktype = /obj/item/reagent_containers/food/snacks/donkpocket/spicy
|
||||
warmtype = /obj/item/reagent_containers/food/snacks/donkpocket/warm/spicy
|
||||
|
||||
/obj/item/storage/box/donkpockets/donkpockettaco //Property of Angel's Donk Co. subsidary Not'cho Corp. "They're mine! Not yo's."
|
||||
name = "box of taco-flavoured donk-pockets"
|
||||
icon_state = "donkpocketboxtaco"
|
||||
donktype = /obj/item/reagent_containers/food/snacks/donkpocket/taco
|
||||
warmtype = /obj/item/reagent_containers/food/snacks/donkpocket/warm/taco
|
||||
|
||||
/obj/item/storage/box/donkpockets/donkpocketplasma
|
||||
name = "box of toxic-flavoured donk-pockets"
|
||||
icon_state = "donkpocketboxplasma"
|
||||
donktype = /obj/item/reagent_containers/food/snacks/donkpocket/plasma
|
||||
warmtype = /obj/item/reagent_containers/food/snacks/donkpocket/warm/plasma
|
||||
|
||||
/obj/item/storage/box/donkpockets/donkpocketbreakfast
|
||||
name = "box of breakfast-flavoured donk-pockets"
|
||||
icon_state = "donkpocketboxbreakfast"
|
||||
donktype = /obj/item/reagent_containers/food/snacks/donkpocket/breakfast
|
||||
warmtype = /obj/item/reagent_containers/food/snacks/donkpocket/warm/breakfast
|
||||
|
||||
/obj/item/storage/box/donkpockets/donkpocketmoth
|
||||
name = "box of cloth-flavoured donk-pockets"
|
||||
icon_state = "donkpocketboxmoth"
|
||||
donktype = /obj/item/reagent_containers/food/snacks/donkpocket/moth
|
||||
warmtype = /obj/item/reagent_containers/food/snacks/donkpocket/warm/moth
|
||||
|
||||
/obj/item/storage/box/donkpockets/donkpocketvegan
|
||||
name = "box of veggie-flavoured donk-pockets"
|
||||
icon_state = "donkpocketboxvegan"
|
||||
donktype = /obj/item/reagent_containers/food/snacks/donkpocket/vegan
|
||||
warmtype = /obj/item/reagent_containers/food/snacks/donkpocket/warm/vegan
|
||||
|
||||
/obj/item/storage/box/donkpockets/donkpocketteriyaki
|
||||
name = "box of teriyaki-flavoured donk-pockets"
|
||||
icon_state = "donkpocketboxteriyaki"
|
||||
@@ -1355,4 +1325,4 @@
|
||||
|
||||
/obj/item/storage/box/marshmallow/PopulateContents()
|
||||
for (var/i in 1 to 5)
|
||||
new /obj/item/reagent_containers/food/snacks/marshmallow(src)
|
||||
new /obj/item/reagent_containers/food/snacks/marshmallow(src)
|
||||
|
||||
@@ -123,9 +123,8 @@
|
||||
planetary_atmos = TRUE
|
||||
baseturfs = /turf/open/lava/smooth/lava_land_surface
|
||||
|
||||
/turf/open/floor/plating/asteroid/spacehermit
|
||||
initial_gas_mix = OPENTURF_DEFAULT_ATMOS
|
||||
baseturfs = /turf/open/floor/plating/asteroid/spacehermit
|
||||
|
||||
|
||||
|
||||
/turf/open/floor/plating/asteroid/airless
|
||||
initial_gas_mix = AIRLESS_ATMOS
|
||||
|
||||
@@ -221,22 +221,6 @@
|
||||
/turf/closed/mineral/iron/volcanic = 95)
|
||||
|
||||
|
||||
//For spacehermit stuff
|
||||
|
||||
|
||||
/turf/closed/mineral/random/spacehermit
|
||||
icon_state = "rock"
|
||||
turf_type = /turf/open/floor/plating/asteroid/spacehermit
|
||||
baseturfs = /turf/open/floor/plating/asteroid/spacehermit
|
||||
initial_gas_mix = OPENTURF_DEFAULT_ATMOS
|
||||
defer_change = 1
|
||||
mineralChance = 6
|
||||
mineralSpawnChanceList = list(
|
||||
/turf/closed/mineral/uranium = 2, /turf/closed/mineral/diamond = 1, /turf/closed/mineral/gold = 4, /turf/closed/mineral/titanium = 4,
|
||||
/turf/closed/mineral/silver = 6, /turf/closed/mineral/plasma = 15, /turf/closed/mineral/iron = 40,
|
||||
/turf/closed/mineral/gibtonite = 2, /turf/closed/mineral/bscrystal = 1)
|
||||
|
||||
//end of spacehermit stuff
|
||||
|
||||
/turf/closed/mineral/iron
|
||||
mineralType = /obj/item/stack/ore/iron
|
||||
|
||||
@@ -58,15 +58,12 @@
|
||||
reward = 3000
|
||||
wanted_types = list(/obj/item/organ/tail/cat)
|
||||
|
||||
|
||||
/*
|
||||
/datum/bounty/item/medical/blood
|
||||
name = "Generic Blood"
|
||||
description = "The Kinaris annual blood drive is back up to full speed, following the garlic incident. Good blood in good volumes accepted for Credit returns."
|
||||
reward = 3500
|
||||
required_count = 600
|
||||
wanted_types = list(/datum/reagent/blood)
|
||||
*/
|
||||
|
||||
/* If anyone wants to try and fix/work, go for it
|
||||
/datum/bounty/item/medical/medibot // Mob so this dosn't work yet*
|
||||
|
||||
@@ -105,6 +105,7 @@ datum/bounty/reagent/complex_drink/New()
|
||||
/datum/reagent/consumable/ethanol/hearty_punch,\
|
||||
/datum/reagent/consumable/ethanol/manhattan_proj,\
|
||||
/datum/reagent/consumable/ethanol/narsour,\
|
||||
/datum/reagent/consumable/ethanol/neurotoxin,\
|
||||
/datum/reagent/consumable/ethanol/patron,\
|
||||
/datum/reagent/consumable/ethanol/quadruple_sec,\
|
||||
/datum/reagent/consumable/ethanol/quintuple_sec,\
|
||||
@@ -169,15 +170,3 @@ datum/bounty/reagent/chemical/New()
|
||||
description = "CentCom is in desperate need of the chemical [name]. Ship a container of it to be rewarded."
|
||||
reward += rand(0, 4) * 500
|
||||
|
||||
/datum/bounty/reagent/blood
|
||||
name = "Blood Drive"
|
||||
reward = 3500
|
||||
required_volume = 600
|
||||
|
||||
/datum/bounty/reagent/blood/New()
|
||||
|
||||
var/reagent_type = /datum/reagent/blood
|
||||
wanted_reagent = new reagent_type
|
||||
name = wanted_reagent.name
|
||||
description = "The Kinaris annual blood drive is back up to full speed, following the garlic incident. Good blood in good volumes accepted for Credit returns."
|
||||
reward += rand(0, 2) * 300
|
||||
|
||||
@@ -75,7 +75,7 @@ GLOBAL_LIST_EMPTY(bounties_list)
|
||||
|
||||
// Returns a new bounty of random type, but does not add it to GLOB.bounties_list.
|
||||
/proc/random_bounty()
|
||||
switch(rand(1, 15))
|
||||
switch(rand(1, 14))
|
||||
if(1)
|
||||
var/subtype = pick(subtypesof(/datum/bounty/item/assistant))
|
||||
return new subtype
|
||||
@@ -118,8 +118,6 @@ GLOBAL_LIST_EMPTY(bounties_list)
|
||||
if(14)
|
||||
var/subtype = pick(subtypesof(/datum/bounty/lewd))
|
||||
return new subtype
|
||||
if(15)
|
||||
return new /datum/bounty/reagent/blood
|
||||
|
||||
// Called lazily at startup to populate GLOB.bounties_list with random bounties.
|
||||
/proc/setup_bounties()
|
||||
@@ -146,8 +144,7 @@ GLOBAL_LIST_EMPTY(bounties_list)
|
||||
/********************************Strict Type Gens********************************/
|
||||
var/list/easy_add_list_strict_types = list(/datum/bounty/reagent/simple_drink = 1,
|
||||
/datum/bounty/reagent/complex_drink = 1,
|
||||
/datum/bounty/reagent/chemical = 1,
|
||||
/datum/bounty/reagent/blood = 1)
|
||||
/datum/bounty/reagent/chemical = 1)
|
||||
|
||||
for(var/the_strict_type in easy_add_list_strict_types)
|
||||
for(var/i in 1 to easy_add_list_strict_types[the_strict_type])
|
||||
|
||||
@@ -108,6 +108,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
var/roleplayroles = FALSE //for the roleplay roles
|
||||
var/importantroles = FALSE //for things that define as important.
|
||||
|
||||
|
||||
var/datum/species/pref_species = new /datum/species/human() //Mutant race
|
||||
var/list/features = list("mcolor" = "FFF",
|
||||
"tail_lizard" = "Smooth",
|
||||
@@ -195,14 +196,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
"flavor_text" = "",
|
||||
"silicon_flavor_text" = "",
|
||||
"ooc_text" = "",
|
||||
"front_genitals_over_hair" = FALSE,
|
||||
"cosmetic_head" = /datum/cosmetic_part/head/default,
|
||||
"cosmetic_chest" = /datum/cosmetic_part/chest/default,
|
||||
"cosmetic_l_arm" = /datum/cosmetic_part/arms/default,
|
||||
"cosmetic_r_arm" = /datum/cosmetic_part/arms/default,
|
||||
"cosmetic_l_leg" = /datum/cosmetic_part/legs/default,
|
||||
"cosmetic_r_leg" = /datum/cosmetic_part/legs/default,
|
||||
"cosmetic_markings" = FALSE
|
||||
"front_genitals_over_hair" = FALSE
|
||||
)
|
||||
|
||||
/// Security record note section
|
||||
@@ -277,6 +271,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
|
||||
/datum/preferences/New(client/C)
|
||||
parent = C
|
||||
clientfps = world.fps*2
|
||||
for(var/custom_name_id in GLOB.preferences_custom_names)
|
||||
custom_names[custom_name_id] = get_default_name(custom_name_id)
|
||||
|
||||
@@ -444,7 +439,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
dat += "<b>Custom Species Name:</b><a style='display:block;width:100px' href='?_src_=prefs;preference=custom_species;task=input'>[custom_species ? custom_species : "None"]</a><BR>"
|
||||
dat += "<a style='display:block;width:100px' href='?_src_=prefs;preference=all;task=random'>Random Body</A><BR>"
|
||||
dat += "<b>Always Random Body:</b><a href='?_src_=prefs;preference=all'>[be_random_body ? "Yes" : "No"]</A><BR>"
|
||||
dat += "<br><b>Select background:</b><a style='display:block;width:100px' href='?_src_=prefs;preference=select_bg;task=input'>[bgstate]</a><BR>"
|
||||
dat += "<br><b>Cycle background:</b><a style='display:block;width:100px' href='?_src_=prefs;preference=cycle_bg;task=input'>[bgstate]</a><BR>"
|
||||
dat += "<b>Render front genitals over hair:</b><a href='?_src_=prefs;task=front_genitals_over_hair'>[features["front_genitals_over_hair"] ? "Yes" : "No"]</A><BR>"
|
||||
|
||||
var/use_skintones = pref_species.use_skintones
|
||||
@@ -829,55 +824,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
mutant_category = 0
|
||||
|
||||
dat += "</tr></table>"
|
||||
|
||||
dat += "</td>"
|
||||
|
||||
// HYPER EDIT: Cosmetic body parts
|
||||
|
||||
var/datum/cosmetic_part/cosmetic_head = features["cosmetic_head"]
|
||||
var/datum/cosmetic_part/cosmetic_chest = features["cosmetic_chest"]
|
||||
var/datum/cosmetic_part/cosmetic_arms = features["cosmetic_l_arm"]
|
||||
var/datum/cosmetic_part/cosmetic_legs = features["cosmetic_l_leg"]
|
||||
|
||||
dat += "<div style='width:100%;display:block;'>"
|
||||
dat += "<h2>Cosmetic Parts</h2>"
|
||||
dat += "<b>Use markings on cosmetic parts?</b> "
|
||||
dat += "<a href='?_src_=prefs;preference=cosmetic_markings'>[features["cosmetic_markings"] ? "Yes" : "No"]</a>"
|
||||
dat += "<div style='display:flex; align-items:stretch; justify-content:space-around;'>"
|
||||
dat += "<div style='flex: 1 1 0;'>"
|
||||
dat += "<h3 style='text-align:center;'>Head</h3>"
|
||||
dat += "<a style='display:block; width:100px'"
|
||||
dat += "href='?_src_=prefs;preference=cosmetic_head;task=input'>"
|
||||
dat += cosmetic_head.name
|
||||
dat += "</a>"
|
||||
dat += "</div>"
|
||||
dat += "<div style='flex: 1 1 0;'>"
|
||||
dat += "<h3 style='text-align:center;'>Chest</h3>"
|
||||
dat += "<a style='display:block; width:100px'"
|
||||
dat += "href='?_src_=prefs;preference=cosmetic_chest;task=input'>"
|
||||
dat += cosmetic_chest.name
|
||||
dat += "</a>"
|
||||
dat += "</div>"
|
||||
dat += "<div style='flex: 1 1 0;'>"
|
||||
dat += "<h3 style='text-align:center;'>Arms</h3>"
|
||||
dat += "<a style='display:block; width:100px'"
|
||||
dat += "href='?_src_=prefs;preference=cosmetic_arms;task=input'>"
|
||||
dat += cosmetic_arms.name
|
||||
dat += "</a>"
|
||||
dat += "</div>"
|
||||
dat += "<div style='flex: 1 1 0;'>"
|
||||
dat += "<h3 style='text-align:center;'>Legs</h3>"
|
||||
dat += "<a style='display:block; width:100px'"
|
||||
dat += "href='?_src_=prefs;preference=cosmetic_legs;task=input'>"
|
||||
dat += cosmetic_legs.name
|
||||
dat += "</a>"
|
||||
dat += "</div>"
|
||||
dat += "</div>"
|
||||
dat += "</div>"
|
||||
|
||||
|
||||
|
||||
// End hyper edit
|
||||
|
||||
dat += "<table><tr><td width='340px' height='300px' valign='top'>"
|
||||
dat += "<h2>Clothing & Equipment</h2>"
|
||||
dat += "<b>Underwear:</b><a style='display:block;width:100px' href ='?_src_=prefs;preference=underwear;task=input'>[underwear]</a>"
|
||||
@@ -1955,10 +1903,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
grad_style = previous_list_item(grad_style, GLOB.hair_gradients_list)
|
||||
|
||||
|
||||
if("select_bg")
|
||||
var/new_bg = input(user, "Select a background:", "Character Preference") as null|anything in bgstate_options
|
||||
if(new_bg)
|
||||
bgstate = new_bg
|
||||
if("cycle_bg")
|
||||
bgstate = next_list_item(bgstate, bgstate_options)
|
||||
|
||||
if("underwear")
|
||||
var/new_underwear = input(user, "Choose your character's underwear:", "Character Preference") as null|anything in GLOB.underwear_list
|
||||
@@ -2347,81 +2293,6 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
new_dors = input(user, "Choose your character's dorsal tube type:", "Character Preference") as null|anything in GLOB.xeno_dorsal_list
|
||||
if(new_dors)
|
||||
features["xenodorsal"] = new_dors
|
||||
|
||||
// HYPER EDIT: Cosmetic body parts
|
||||
if("cosmetic_head")
|
||||
var/list/selectable_parts = list()
|
||||
for(var/path in GLOB.cosmetic_heads)
|
||||
var/datum/cosmetic_part/possible_part = GLOB.cosmetic_heads[path]
|
||||
var/list/supported_species = possible_part.supported_species
|
||||
if(!show_mismatched_markings && supported_species && !supported_species.Find(pref_species.id))
|
||||
continue
|
||||
selectable_parts[possible_part.name] = path
|
||||
if(!selectable_parts.len)
|
||||
to_chat(user, "<span class='warning'>There are no valid alt heads for this species!</span>")
|
||||
var/new_cosmetic_part
|
||||
var/question = "Choose your character's alt head style:"
|
||||
new_cosmetic_part = input(user, question, "Character Preference") as null|anything in selectable_parts
|
||||
if(new_cosmetic_part)
|
||||
features["cosmetic_head"] = GLOB.cosmetic_heads[selectable_parts[new_cosmetic_part]]
|
||||
update_preview_icon()
|
||||
|
||||
if("cosmetic_chest")
|
||||
var/list/selectable_parts = list()
|
||||
for(var/path in GLOB.cosmetic_chests)
|
||||
var/datum/cosmetic_part/possible_part = GLOB.cosmetic_chests[path]
|
||||
var/list/supported_species = possible_part.supported_species
|
||||
if(!show_mismatched_markings && supported_species && !supported_species.Find(pref_species.id))
|
||||
continue
|
||||
selectable_parts[possible_part.name] = path
|
||||
if(!selectable_parts.len)
|
||||
to_chat(user, "<span class='warning'>There are no valid alt chests for this species!</span>")
|
||||
var/new_cosmetic_part
|
||||
var/question = "Choose your character's alt chest style:"
|
||||
new_cosmetic_part = input(user, question, "Character Preference") as null|anything in selectable_parts
|
||||
if(new_cosmetic_part)
|
||||
features["cosmetic_chest"] = GLOB.cosmetic_chests[selectable_parts[new_cosmetic_part]]
|
||||
update_preview_icon()
|
||||
|
||||
// currently symmetrical
|
||||
if("cosmetic_arms")
|
||||
var/list/selectable_parts = list()
|
||||
for(var/path in GLOB.cosmetic_arms)
|
||||
var/datum/cosmetic_part/possible_part = GLOB.cosmetic_arms[path]
|
||||
var/list/supported_species = possible_part.supported_species
|
||||
if(!show_mismatched_markings && supported_species && !supported_species.Find(pref_species.id))
|
||||
continue
|
||||
selectable_parts[possible_part.name] = path
|
||||
if(!selectable_parts.len)
|
||||
to_chat(user, "<span class='warning'>There are no valid alt arms for this species!</span>")
|
||||
var/new_cosmetic_part
|
||||
var/question = "Choose your character's alt arms style:"
|
||||
new_cosmetic_part = input(user, question, "Character Preference") as null|anything in selectable_parts
|
||||
if(new_cosmetic_part)
|
||||
features["cosmetic_l_arm"] = GLOB.cosmetic_arms[selectable_parts[new_cosmetic_part]]
|
||||
features["cosmetic_r_arm"] = GLOB.cosmetic_arms[selectable_parts[new_cosmetic_part]]
|
||||
update_preview_icon()
|
||||
|
||||
if("cosmetic_legs")
|
||||
var/list/selectable_parts = list()
|
||||
for(var/path in GLOB.cosmetic_legs)
|
||||
var/datum/cosmetic_part/possible_part = GLOB.cosmetic_legs[path]
|
||||
var/list/supported_species = possible_part.supported_species
|
||||
if(!show_mismatched_markings && supported_species && !supported_species.Find(pref_species.id))
|
||||
continue
|
||||
selectable_parts[possible_part.name] = path
|
||||
if(!selectable_parts.len)
|
||||
to_chat(user, "<span class='warning'>There are no valid alt legs for this species!</span>")
|
||||
var/new_cosmetic_part
|
||||
var/question = "Choose your character's alt legs style:"
|
||||
new_cosmetic_part = input(user, question, "Character Preference") as null|anything in selectable_parts
|
||||
if(new_cosmetic_part)
|
||||
features["cosmetic_l_leg"] = GLOB.cosmetic_legs[selectable_parts[new_cosmetic_part]]
|
||||
features["cosmetic_r_leg"] = GLOB.cosmetic_legs[selectable_parts[new_cosmetic_part]]
|
||||
update_preview_icon()
|
||||
|
||||
// End hyper edit
|
||||
|
||||
//Genital code
|
||||
if("cock_color")
|
||||
var/new_cockcolor = input(user, "Penis color:", "Character Preference") as color|null
|
||||
@@ -2569,10 +2440,9 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
features["belly_size"] = clamp(new_bellysize, BELLY_MIN_SIZE, BELLY_MAX_SIZE)
|
||||
|
||||
if("butt_size")
|
||||
var/new_buttsize = input(user, "Butt size :\n([BUTT_MIN_SIZE]-[BUTT_MAX_SIZE_SELECTABLE])", "Character Preference") as num|null
|
||||
var/new_buttsize = input(user, "Butt size :\n([BUTT_MIN_SIZE]-[BUTT_MAX_SIZE])", "Character Preference") as num|null
|
||||
if(new_buttsize != null)
|
||||
features["butt_size"] = clamp(new_buttsize, BUTT_MIN_SIZE, BUTT_MAX_SIZE_SELECTABLE)
|
||||
//Restricted to 5 in menu, because we have chems to make them big IC, like with breasts and what not.
|
||||
features["butt_size"] = clamp(new_buttsize, BUTT_MIN_SIZE, BUTT_MAX_SIZE)
|
||||
|
||||
if("vag_shape")
|
||||
var/new_shape
|
||||
@@ -2822,9 +2692,6 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
if("all")
|
||||
be_random_body = !be_random_body
|
||||
|
||||
if("cosmetic_markings")
|
||||
features["cosmetic_markings"] = !features["cosmetic_markings"]
|
||||
|
||||
if("hear_midis")
|
||||
toggles ^= SOUND_MIDI
|
||||
|
||||
|
||||
@@ -576,7 +576,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
all_quirks -= V
|
||||
|
||||
cit_character_pref_load(S)
|
||||
hyper_character_pref_load(S)
|
||||
|
||||
return 1
|
||||
|
||||
@@ -672,7 +671,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
WRITE_FILE(S["all_quirks"] , all_quirks)
|
||||
|
||||
cit_character_pref_save(S)
|
||||
hyper_character_pref_save(S)
|
||||
|
||||
return 1
|
||||
|
||||
|
||||
@@ -28,6 +28,46 @@
|
||||
allowed = list (/obj/item/gun/energy/laser/redtag)
|
||||
resistance_flags = NONE
|
||||
|
||||
/*
|
||||
* Posshim's Corpus atire
|
||||
*/
|
||||
/obj/item/clothing/suit/hooded/corpus/
|
||||
name = "Standard Voidsuit"
|
||||
desc = "Standard issue voidsuit in the name of Grofit!"
|
||||
icon_state = "corpus"
|
||||
item_state = "armor"
|
||||
body_parts_covered = CHEST|GROIN|LEGS|ARMS|FEET|HANDS
|
||||
hoodtype = /obj/item/clothing/head/hooded/corpus
|
||||
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT //"Hide shoes" but digi shoes dont get hidden, too bad!
|
||||
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION //There is no need for a digi variant, it's a costume
|
||||
|
||||
/obj/item/clothing/suit/hooded/corpus/s //sec
|
||||
name = "Enforcer Voidsuit"
|
||||
desc = "Delux issue grofit voidsuit. Let the middle class know You're in charge."
|
||||
icon_state = "corpuss"
|
||||
hoodtype = /obj/item/clothing/head/hooded/corpus/s //Enjoy this nice red outfit Kinaris! There is NO NEED for a pink one! xoxo -VivI Fanteriso
|
||||
|
||||
/obj/item/clothing/suit/hooded/corpus/c //command
|
||||
name = "Commander Voidsuit"
|
||||
desc = "Premium issue correctional worker attire. Grease the gears of production."
|
||||
icon_state = "corpusc"
|
||||
hoodtype = /obj/item/clothing/head/hooded/corpus/c
|
||||
|
||||
/obj/item/clothing/head/hooded/corpus
|
||||
name = "Voidsuit helmet"
|
||||
desc = "galvanized reinforced helm to protect against the elements"
|
||||
icon_state = "corpus"
|
||||
body_parts_covered = HEAD
|
||||
flags_inv = HIDEHAIR|HIDEEARS|HIDEFACIALHAIR|HIDEFACE|HIDEMASK|HIDESNOUT|HIDENECK //hide your ugly face with this one simple trick!
|
||||
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
|
||||
|
||||
/obj/item/clothing/head/hooded/corpus/s //sec
|
||||
icon_state = "corpuss"
|
||||
|
||||
/obj/item/clothing/head/hooded/corpus/c //command
|
||||
icon_state = "corpusc"
|
||||
|
||||
/*
|
||||
* Costume
|
||||
*/
|
||||
|
||||
@@ -461,120 +461,6 @@
|
||||
tastes = list("meat" = 2, "dough" = 2, "laziness" = 1)
|
||||
foodtype = GRAIN | ANTITOXIC
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donkpocket/taco
|
||||
name = "\improper Taco-pocket"
|
||||
desc = "Es hora de adentrarse en el espacio de bolsillo más salvaje jamás conocido. ¡jajaja!"
|
||||
icon_state = "donkpockettaco"
|
||||
list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/capsaicin = 2)
|
||||
cooked_type = /obj/item/reagent_containers/food/snacks/donkpocket/warm/taco
|
||||
filling_color = "#CD853F"
|
||||
tastes = list("meat" = 2, "dough" = 2, "spice" = 2, "vegetables" = 2, "cheese" = 2)
|
||||
foodtype = GRAIN | VEGETABLES | MEAT
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donkpocket/warm/taco
|
||||
name = "warm Taco-pocket"
|
||||
desc = "Es hora de adentrarse en el espacio de bolsillo más salvaje jamás conocido. ¡jajaja!"
|
||||
icon_state = "donkpockettaco"
|
||||
bonus_reagents = list(/datum/reagent/medicine/omnizine = 1)
|
||||
list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/capsaicin = 2)
|
||||
tastes = list("meat" = 2, "dough" = 2, "spice" = 2, "vegetables" = 2, "cheese" = 2)
|
||||
foodtype = GRAIN | VEGETABLES | MEAT
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donkpocket/plasma
|
||||
name = "\improper Poison-pocket"
|
||||
desc = "NOTE: WARNING. For slime species consumption only. Call ###-##-### if injested"
|
||||
icon_state = "donkpocketplasma"
|
||||
list_reagents = list(/datum/reagent/toxin/carpotoxin = 2, /datum/reagent/toxin/plasma = 2, /datum/reagent/fuel = 2)
|
||||
cooked_type = /obj/item/reagent_containers/food/snacks/donkpocket/warm/plasma
|
||||
filling_color = "#CD853F"
|
||||
tastes = list("meat" = 2, "dough" = 2, "poison" = 2, "welding fuel" = 2)
|
||||
foodtype = GRAIN | TOXIC | MEAT
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donkpocket/warm/plasma
|
||||
name = "warm Poison-pocket"
|
||||
desc = "NOTE: WARNING. For slime species consumption only. Call ###-##-### if injested"
|
||||
icon_state = "donkpocketplasma"
|
||||
bonus_reagents = list(/datum/reagent/toxin/carpotoxin = 2, /datum/reagent/toxin/plasma = 2, /datum/reagent/fuel = 2)
|
||||
list_reagents = list(/datum/reagent/consumable/nutriment = 4)
|
||||
tastes = list("meat" = 2, "dough" = 2, "poison" = 2, "welding fuel" = 2)
|
||||
foodtype = GRAIN | TOXIC | MEAT
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donkpocket/breakfast
|
||||
name = "\improper Breakfast-pocket"
|
||||
desc = "Now for all you early morning Joes!."
|
||||
icon_state = "donkpocketbreakfast"
|
||||
list_reagents = list(/datum/reagent/consumable/nutriment = 4)
|
||||
cooked_type = /obj/item/reagent_containers/food/snacks/donkpocket/warm/breakfast
|
||||
filling_color = "#CD853F"
|
||||
tastes = list("meat" = 2, "dough" = 2, "eggs" =2, "bacon" =2)
|
||||
foodtype = GRAIN | DAIRY | MEAT | BREAKFAST
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donkpocket/warm/breakfast //IT'S BEEN ELEVEN FUCKING HOURS I HATE BYOND I HATE BYOND I HATE BEYOND!!!
|
||||
name = "warm Breakfast-pocket"
|
||||
desc = "Now for all you early morning Joes!."
|
||||
icon_state = "donkpocketbreakfast"
|
||||
bonus_reagents = list(/datum/reagent/medicine/omnizine = 1)
|
||||
list_reagents = list(/datum/reagent/consumable/nutriment = 4)
|
||||
tastes = list("meat" = 2, "dough" = 2, "eggs" = 2, "bacon" = 2)
|
||||
foodtype = GRAIN | DAIRY | MEAT | BREAKFAST | ANTITOXIC
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donkpocket/moth
|
||||
name = "\improper Moth-pocket"
|
||||
desc = "Donk Corp is now reaching out to all species! Dig in moths one and all."
|
||||
icon_state = "donkpocketmoth"
|
||||
list_reagents = list(/datum/reagent/consumable/nutriment = 4)
|
||||
cooked_type = /obj/item/reagent_containers/food/snacks/donkpocket/warm/moth
|
||||
filling_color = "#CD853F"
|
||||
tastes = list("lint" = 2, "dough" = 2, "felt" = 2)
|
||||
foodtype = GRAIN | DAIRY | CLOTH
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donkpocket/warm/moth
|
||||
name = "warm Moth-pocket"
|
||||
desc = "Donk Corp is now reaching out to all species! Dig in moths one and all."
|
||||
icon_state = "donkpocketmoth"
|
||||
bonus_reagents = list(/datum/reagent/medicine/omnizine = 1)
|
||||
list_reagents = list(/datum/reagent/consumable/nutriment = 4)
|
||||
tastes = list("lint" = 2, "dough" = 2, "felt" = 2)
|
||||
foodtype = GRAIN | DAIRY | CLOTH
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donkpocket/vegan
|
||||
name = "\improper Vegan-pocket"
|
||||
desc = "For all you Animal Rights Consortium members out there!."
|
||||
icon_state = "donkpocketvegan"
|
||||
list_reagents = list(/datum/reagent/consumable/nutriment = 2)
|
||||
cooked_type = /obj/item/reagent_containers/food/snacks/donkpocket/warm/vegan
|
||||
filling_color = "#CD853F"
|
||||
tastes = list("vegetables" = 2, "dough" = 2)
|
||||
foodtype = GRAIN | VEGETABLES
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donkpocket/warm/vegan
|
||||
name = "warm Vegan-pocket"
|
||||
desc = "For all you Animal Rights Consortium members out there!."
|
||||
icon_state = "donkpocketvegan"
|
||||
bonus_reagents = list(/datum/reagent/medicine/omnizine = 1)
|
||||
list_reagents = list(/datum/reagent/consumable/nutriment = 3)
|
||||
tastes = list("vegetables" = 2, "dough" = 2)
|
||||
foodtype = GRAIN | VEGETABLES
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donkpocket/sm
|
||||
name = "\improper Super-pocket"
|
||||
desc = "You're probably not in a good spot if you're laying eyes on this."
|
||||
icon_state = "donkpocketsm"
|
||||
list_reagents = list(/datum/reagent/consumable/nutriment = 99)
|
||||
cooked_type = /obj/item/reagent_containers/food/snacks/donkpocket/warm/sm
|
||||
filling_color = "#CD853F"
|
||||
tastes = list("white-noise" = 2)
|
||||
foodtype = TOXIC
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donkpocket/warm/sm
|
||||
name = "warm Super-pocket"
|
||||
desc = "You're probably not in a good spot if you're laying eyes on this."
|
||||
icon_state = "donkpocketsm"
|
||||
bonus_reagents = list(/datum/reagent/medicine/omnizine = 1)
|
||||
list_reagents = list(/datum/reagent/consumable/nutriment = 99)
|
||||
tastes = list("white-noise" = 2)
|
||||
foodtype = TOXIC
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/dankpocket
|
||||
name = "\improper Dank-pocket"
|
||||
desc = "The food of choice for the seasoned botanist."
|
||||
@@ -668,7 +554,7 @@
|
||||
cooked_type = /obj/item/reagent_containers/food/snacks/donkpocket/warm/berry
|
||||
filling_color = "#CD853F"
|
||||
tastes = list("dough" = 2, "jam" = 2)
|
||||
foodtype = GRAIN | SUGAR
|
||||
foodtype = GRAIN
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donkpocket/warm/berry
|
||||
name = "warm Berry-pocket"
|
||||
@@ -677,7 +563,7 @@
|
||||
bonus_reagents = list(/datum/reagent/medicine/omnizine = 1)
|
||||
list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/medicine/omnizine = 1, /datum/reagent/consumable/berryjuice = 3)
|
||||
tastes = list("dough" = 2, "warm jam" = 2)
|
||||
foodtype = GRAIN | SUGAR
|
||||
foodtype = GRAIN
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donkpocket/gondola
|
||||
name = "\improper Gondola-pocket"
|
||||
|
||||
@@ -362,159 +362,6 @@ datum/crafting_recipe/food/donut/meat
|
||||
tastes = list("meat" = 2, "dough" = 2)
|
||||
foodtype = GRAIN | VEGETABLES
|
||||
|
||||
/datum/crafting_recipe/food/donkpocket/taco
|
||||
time = 15
|
||||
name = "Taco-pocket"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/pastrybase = 1,
|
||||
/obj/item/reagent_containers/food/snacks/meatball = 1,
|
||||
/obj/item/reagent_containers/food/snacks/grown/carrot = 1,
|
||||
/obj/item/reagent_containers/food/snacks/grown/citrus/lime = 1,
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/donkpocket/taco
|
||||
subcategory = CAT_PASTRY
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donkpocket/taco
|
||||
name = "\improper Taco-pocket"
|
||||
desc = "Es hora de adentrarse en el espacio de bolsillo más salvaje jamás conocido. ¡jajaja!"
|
||||
icon_state = "donkpockettaco"
|
||||
list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/capsaicin = 2)
|
||||
cooked_type = /obj/item/reagent_containers/food/snacks/donkpocket/warm/taco
|
||||
filling_color = "#CD853F"
|
||||
tastes = list("meat" = 2, "dough" = 2, "spice" = 2, "vegetables" = 2, "cheese" = 2)
|
||||
foodtype = GRAIN | VEGETABLES | MEAT
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donkpocket/warm/taco
|
||||
name = "warm Taco-pocket"
|
||||
desc = "Es hora de adentrarse en el espacio de bolsillo más salvaje jamás conocido. ¡jajaja!"
|
||||
icon_state = "donkpockettaco"
|
||||
bonus_reagents = list(/datum/reagent/medicine/omnizine = 1)
|
||||
list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/capsaicin = 2)
|
||||
tastes = list("meat" = 2, "dough" = 2, "spice" = 2, "vegetables" = 2, "cheese" = 2)
|
||||
foodtype = GRAIN | VEGETABLES | MEAT
|
||||
|
||||
/datum/crafting_recipe/food/donkpocket/plasma
|
||||
time = 15
|
||||
name = "Plasma-pocket"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/pastrybase = 1,
|
||||
/obj/item/reagent_containers/food/snacks/meatball = 1,
|
||||
/datum/reagent/fuel = 1,
|
||||
/datum/reagent/toxin/plasma = 1,
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/donkpocket/plasma
|
||||
subcategory = CAT_PASTRY
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donkpocket/plasma
|
||||
name = "\improper Poison-pocket"
|
||||
desc = "NOTE: WARNING. For slime species consumption only. Call ###-##-### if injested"
|
||||
icon_state = "donkpocketplasma"
|
||||
list_reagents = list(/datum/reagent/toxin/carpotoxin = 2, /datum/reagent/toxin/plasma = 2, /datum/reagent/fuel = 2)
|
||||
cooked_type = /obj/item/reagent_containers/food/snacks/donkpocket/warm/plasma
|
||||
filling_color = "#CD853F"
|
||||
tastes = list("meat" = 2, "dough" = 2, "poison" = 2, "welding fuel" = 2)
|
||||
foodtype = GRAIN | TOXIC | MEAT
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donkpocket/warm/plasma
|
||||
name = "warm Poison-pocket"
|
||||
desc = "NOTE: WARNING. For slime species consumption only. Call ###-##-### if injested"
|
||||
icon_state = "donkpocketplasma"
|
||||
bonus_reagents = list(/datum/reagent/toxin/carpotoxin = 2, /datum/reagent/toxin/plasma = 2, /datum/reagent/fuel = 2)
|
||||
list_reagents = list(/datum/reagent/consumable/nutriment = 4)
|
||||
tastes = list("meat" = 2, "dough" = 2, "poison" = 2, "welding fuel" = 2)
|
||||
foodtype = GRAIN | TOXIC | MEAT
|
||||
|
||||
/datum/crafting_recipe/food/donkpocket/breakfast
|
||||
time = 15
|
||||
name = "Breakfast-pocket"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/pastrybase = 1,
|
||||
/obj/item/reagent_containers/food/snacks/cheesewedge = 1,
|
||||
/obj/item/reagent_containers/food/snacks/friedegg = 1,
|
||||
/obj/item/reagent_containers/food/snacks/meat/cutlet = 1,
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/donkpocket/breakfast
|
||||
subcategory = CAT_PASTRY
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donkpocket/breakfast
|
||||
name = "\improper Breakfast-pocket"
|
||||
desc = "Now for all you early morning Joes!."
|
||||
icon_state = "donkpocketbreakfast"
|
||||
list_reagents = list(/datum/reagent/consumable/nutriment = 4)
|
||||
cooked_type = /obj/item/reagent_containers/food/snacks/donkpocket/warm/breakfast
|
||||
filling_color = "#CD853F"
|
||||
tastes = list("meat" = 2, "dough" = 2, "eggs" = 2, "bacon" = 2)
|
||||
foodtype = GRAIN | DAIRY | MEAT | BREAKFAST
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donkpocket/warm/breakfast
|
||||
name = "warm Breakfast-pocket"
|
||||
desc = "Now for all you early morning Joes!."
|
||||
icon_state = "donkpocketbreakfast"
|
||||
bonus_reagents = list(/datum/reagent/medicine/omnizine = 1)
|
||||
list_reagents = list(/datum/reagent/consumable/nutriment = 4)
|
||||
tastes = list("meat" = 2, "dough" = 2, "eggs" = 2, "bacon" = 2)
|
||||
foodtype = GRAIN | DAIRY | MEAT | BREAKFAST | ANTITOXIC
|
||||
|
||||
/datum/crafting_recipe/food/donkpocket/moth
|
||||
time = 15
|
||||
name = "Moth-pocket"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/pastrybase = 1,
|
||||
/obj/item/reagent_containers/food/snacks/cheesewedge = 1,
|
||||
/obj/item/stack/sheet/cloth = 1,
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/donkpocket/moth
|
||||
subcategory = CAT_PASTRY
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donkpocket/moth
|
||||
name = "\improper Moth-pocket"
|
||||
desc = "Donk Corp is now reaching out to all species! Dig in moths one and all."
|
||||
icon_state = "donkpocketmoth"
|
||||
list_reagents = list(/datum/reagent/consumable/nutriment = 4)
|
||||
cooked_type = /obj/item/reagent_containers/food/snacks/donkpocket/warm/moth
|
||||
filling_color = "#CD853F"
|
||||
tastes = list("lint" = 2, "dough" = 2, "felt" = 2)
|
||||
foodtype = GRAIN | DAIRY | CLOTH
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donkpocket/warm/moth
|
||||
name = "warm Moth-pocket"
|
||||
desc = "Donk Corp is now reaching out to all species! Dig in moths one and all."
|
||||
icon_state = "donkpocketmoth"
|
||||
bonus_reagents = list(/datum/reagent/medicine/omnizine = 1)
|
||||
list_reagents = list(/datum/reagent/consumable/nutriment = 4)
|
||||
tastes = list("lint" = 2, "dough" = 2, "felt" = 2)
|
||||
foodtype = GRAIN | DAIRY | CLOTH
|
||||
|
||||
/datum/crafting_recipe/food/donkpocket/vegan
|
||||
time = 15
|
||||
name = "Vegan-pocket"
|
||||
reqs = list(
|
||||
/obj/item/reagent_containers/food/snacks/pastrybase = 1,
|
||||
/obj/item/reagent_containers/food/snacks/grown/cabbage = 1,
|
||||
/obj/item/reagent_containers/food/snacks/grown/mushroom/chanterelle = 1,
|
||||
)
|
||||
result = /obj/item/reagent_containers/food/snacks/donkpocket/vegan
|
||||
subcategory = CAT_PASTRY
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donkpocket/vegan
|
||||
name = "\improper Vegan-pocket"
|
||||
desc = "For all you Animal Rights Consortium members out there!."
|
||||
icon_state = "donkpocketvegan"
|
||||
list_reagents = list(/datum/reagent/consumable/nutriment = 2)
|
||||
cooked_type = /obj/item/reagent_containers/food/snacks/donkpocket/warm/vegan
|
||||
filling_color = "#CD853F"
|
||||
tastes = list("vegetables" = 2, "dough" = 2)
|
||||
foodtype = GRAIN | VEGETABLES
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donkpocket/warm/vegan
|
||||
name = "warm Vegan-pocket"
|
||||
desc = "For all you Animal Rights Consortium members out there!."
|
||||
icon_state = "donkpocketvegan"
|
||||
bonus_reagents = list(/datum/reagent/medicine/omnizine = 1)
|
||||
list_reagents = list(/datum/reagent/consumable/nutriment = 3)
|
||||
tastes = list("vegetables" = 2, "dough" = 2)
|
||||
foodtype = GRAIN | VEGETABLES
|
||||
|
||||
/datum/crafting_recipe/food/donkpocket/spicy
|
||||
time = 15
|
||||
name = "Spicy-pocket"
|
||||
|
||||
@@ -33,9 +33,6 @@
|
||||
// This is for adminspawn or map-placed growns. They get the default stats of their seed type.
|
||||
seed = new seed()
|
||||
seed.adjust_potency(50-seed.potency)
|
||||
else if(!seed)
|
||||
stack_trace("Grown initialized without seed. Okay.")
|
||||
return INITIALIZE_HINT_QDEL
|
||||
|
||||
pixel_x = rand(-5, 5)
|
||||
pixel_y = rand(-5, 5)
|
||||
@@ -43,11 +40,13 @@
|
||||
if(dried_type == -1)
|
||||
dried_type = src.type
|
||||
|
||||
for(var/datum/plant_gene/trait/T in seed.genes)
|
||||
T.on_new(src, loc)
|
||||
seed.prepare_result(src)
|
||||
AddElement(/datum/element/item_scaling, TRANSFORM_USING_VARIABLE(seed.potency, 100) + 0.5, 1) //Makes the resulting produce's sprite larger or smaller based on potency!
|
||||
add_juice()
|
||||
if(seed)
|
||||
for(var/datum/plant_gene/trait/T in seed.genes)
|
||||
T.on_new(src, loc)
|
||||
seed.prepare_result(src)
|
||||
transform *= TRANSFORM_USING_VARIABLE(seed.potency, 100) + 0.5 //Makes the resulting produce's sprite larger or smaller based on potency!
|
||||
add_juice()
|
||||
|
||||
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/grown/proc/add_juice()
|
||||
|
||||
@@ -65,7 +65,7 @@ Captain
|
||||
satchel = /obj/item/storage/backpack/satchel/cap
|
||||
duffelbag = /obj/item/storage/backpack/duffelbag/captain
|
||||
|
||||
implants = list(/obj/item/implant/mindshield, /obj/item/implant/kinaris)
|
||||
implants = list(/obj/item/implant/mindshield)
|
||||
accessory = /obj/item/clothing/accessory/medal/gold/captain
|
||||
|
||||
chameleon_extras = list(/obj/item/gun/energy/e_gun, /obj/item/stamp/captain)
|
||||
|
||||
@@ -62,7 +62,7 @@ Head of Security
|
||||
duffelbag = /obj/item/storage/backpack/duffelbag/sec
|
||||
box = /obj/item/storage/box/security
|
||||
|
||||
implants = list(/obj/item/implant/mindshield, /obj/item/implant/kinaris)
|
||||
implants = list(/obj/item/implant/mindshield)
|
||||
|
||||
chameleon_extras = list(/obj/item/gun/energy/e_gun/hos, /obj/item/stamp/hos)
|
||||
|
||||
|
||||
@@ -43,14 +43,7 @@
|
||||
S.cd = "/"
|
||||
var/slot
|
||||
S["default_slot"] >> slot
|
||||
var/differing_version_notification = 0
|
||||
if(slot)
|
||||
S.cd = "/character[slot]"
|
||||
var/slot_version = 0
|
||||
S["version"] >> slot_version
|
||||
if(slot_version && slot_version < SAVEFILE_VERSION_MAX)
|
||||
S.cd = "/"
|
||||
S["new_differences_notification"] >> differing_version_notification
|
||||
if(!differing_version_notification || differing_version_notification <= slot_version)
|
||||
S["new_differences_notification"] << slot_version
|
||||
to_chat(src, "<span class='danger'><B>There were recent changes with characters, and your savefiles are outdated. Your characters may not look the same depending on what changed.</B></span>")
|
||||
if(S["version"] < SAVEFILE_VERSION_MAX)
|
||||
to_chat(src, "<span class='redtext'>Your characters are outdated from recent updates. Please make sure if everything is within reasonable levels.</span>")
|
||||
|
||||
@@ -487,9 +487,6 @@
|
||||
if(HAS_TRAIT(src, TRAIT_NOHUNGER))
|
||||
return 1
|
||||
|
||||
if(!has_mouth())
|
||||
return 1
|
||||
|
||||
if(nutrition < 100 && !blood)
|
||||
if(message)
|
||||
visible_message("<span class='warning'>[src] dry heaves!</span>", \
|
||||
|
||||
@@ -5,24 +5,30 @@
|
||||
icon_state = "caucasian_m"
|
||||
appearance_flags = KEEP_TOGETHER|TILE_BOUND|PIXEL_SCALE|LONG_GLIDE
|
||||
|
||||
|
||||
/mob/living/carbon/human/Initialize()
|
||||
add_verb(src, /mob/living/proc/mob_sleep)
|
||||
add_verb(src, /mob/living/proc/lay_down)
|
||||
time_initialized = world.time
|
||||
|
||||
//initialize limbs first
|
||||
create_bodyparts()
|
||||
|
||||
//initialize dna. for spawned humans; overwritten by other code
|
||||
create_dna(src)
|
||||
randomize_human(src)
|
||||
dna.initialize_dna()
|
||||
|
||||
if(dna.species)
|
||||
set_species(dna.species.type)
|
||||
|
||||
//initialise organs
|
||||
create_internal_organs() //most of it is done in set_species now, this is only for parent call
|
||||
physiology = new()
|
||||
|
||||
AddComponent(/datum/component/personal_crafting)
|
||||
|
||||
. = ..()
|
||||
|
||||
RegisterSignal(src, COMSIG_COMPONENT_CLEAN_ACT, /mob/living/carbon/human/clean_blood)
|
||||
|
||||
|
||||
|
||||
@@ -318,24 +318,15 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
var/mob/living/carbon/human/H = C
|
||||
if(NOGENITALS in H.dna.species.species_traits)
|
||||
H.give_genitals(TRUE) //call the clean up proc to delete anything on the mob then return.
|
||||
|
||||
// EDIT ENDS
|
||||
|
||||
if(NOMOUTH in species_traits)
|
||||
for(var/obj/item/bodypart/head/head in C.bodyparts)
|
||||
head.mouth = FALSE
|
||||
|
||||
|
||||
/datum/species/proc/on_species_loss(mob/living/carbon/human/C, datum/species/new_species, pref_load)
|
||||
if(C.dna.species.exotic_bloodtype)
|
||||
if(!new_species.exotic_bloodtype)
|
||||
C.dna.blood_type = random_blood_type()
|
||||
else
|
||||
C.dna.blood_type = new_species.exotic_bloodtype
|
||||
|
||||
if(NOMOUTH in species_traits)
|
||||
for(var/obj/item/bodypart/head/head in C.bodyparts)
|
||||
head.mouth = TRUE
|
||||
|
||||
if(DIGITIGRADE in species_traits)
|
||||
C.Digitigrade_Leg_Swap(TRUE)
|
||||
for(var/X in inherent_traits)
|
||||
@@ -511,7 +502,6 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
var/list/standing = list()
|
||||
|
||||
var/obj/item/bodypart/head/HD = H.get_bodypart(BODY_ZONE_HEAD)
|
||||
H.handle_cosmetic_parts()
|
||||
|
||||
if(HD && !(HAS_TRAIT(H, TRAIT_HUSK)))
|
||||
// lipstick
|
||||
@@ -604,7 +594,6 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
//CITADEL EDIT - Do not forget to add this to relevent_layers list just above too!
|
||||
H.remove_overlay(BODY_TAUR_LAYER)
|
||||
//END EDIT
|
||||
H.handle_cosmetic_parts()
|
||||
|
||||
if(!mutant_bodyparts)
|
||||
return
|
||||
@@ -689,17 +678,21 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
if("mam_tail" in mutant_bodyparts)
|
||||
if(H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR) || (!H.dna.features["taur"] == "None"))
|
||||
bodyparts_to_add -= "mam_tail"
|
||||
|
||||
if("mam_waggingtail" in mutant_bodyparts)
|
||||
if(H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR) || (!H.dna.features["taur"] == "None"))
|
||||
bodyparts_to_add -= "mam_waggingtail"
|
||||
else if ("mam_tail" in mutant_bodyparts)
|
||||
bodyparts_to_add -= "mam_waggingtail"
|
||||
|
||||
if("mam_ears" in mutant_bodyparts)
|
||||
if(!H.dna.features["mam_ears"] || H.dna.features["mam_ears"] == "None" || H.head && (H.head.flags_inv & HIDEEARS) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEEARS)) || !HD || HD.status == BODYPART_ROBOTIC)
|
||||
bodyparts_to_add -= "mam_ears"
|
||||
|
||||
if("mam_snouts" in mutant_bodyparts) //Take a closer look at that snout!
|
||||
if((H.wear_mask && (H.wear_mask.flags_inv & HIDESNOUT)) || (H.head && (H.head.flags_inv & HIDESNOUT)) || !HD || HD.status == BODYPART_ROBOTIC)
|
||||
bodyparts_to_add -= "mam_snouts"
|
||||
|
||||
if("taur" in mutant_bodyparts)
|
||||
if(!H.dna.features["taur"] || H.dna.features["taur"] == "None" || (H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)))
|
||||
bodyparts_to_add -= "taur"
|
||||
@@ -1654,8 +1647,8 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
)
|
||||
if (target.canbearoused)
|
||||
target.adjustArousalLoss(5)
|
||||
if (HAS_TRAIT(target, TRAIT_MASO))
|
||||
target.mob_climax_instant()
|
||||
if (target.getArousalLoss() >= 100 && ishuman(target) && HAS_TRAIT(target, TRAIT_MASO) && target.has_dna())
|
||||
target.mob_climax(forced_climax=TRUE)
|
||||
if (!HAS_TRAIT(target, TRAIT_NYMPHO))
|
||||
stop_wagging_tail(target)
|
||||
|
||||
@@ -2012,7 +2005,8 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
H.update_damage_overlays()
|
||||
if(HAS_TRAIT(H, TRAIT_MASO))
|
||||
H.adjustArousalLoss(damage * brutemod * H.physiology.brute_mod)
|
||||
H.mob_climax_instant()
|
||||
if (H.getArousalLoss() >= 100 && ishuman(H) && H.has_dna())
|
||||
H.mob_climax(forced_climax=TRUE)
|
||||
|
||||
else//no bodypart, we deal damage with a more general method.
|
||||
H.adjustBruteLoss(damage * hit_percent * brutemod * H.physiology.brute_mod)
|
||||
|
||||
@@ -690,8 +690,6 @@ generate/load female uniform sprites matching all previously decided variables
|
||||
. += "-[BP.digitigrade_type]"
|
||||
if(BP.dmg_overlay_type)
|
||||
. += "-[BP.dmg_overlay_type]"
|
||||
if(BP.cosmetic_icon)
|
||||
. += "-cosm[BP.cosmetic_icon]"
|
||||
if(BP.body_markings)
|
||||
. += "-[BP.body_markings]"
|
||||
else
|
||||
|
||||
@@ -77,7 +77,8 @@
|
||||
var/mob/living/carbon/human/B = src
|
||||
if(HAS_TRAIT(B, TRAIT_CHOKE_SLUT))
|
||||
B.adjustArousalLoss(7)
|
||||
B.mob_climax_instant()
|
||||
if (B.getArousalLoss() >= 100 && ishuman(B) && B.has_dna())
|
||||
B.mob_climax(forced_climax=TRUE)
|
||||
else
|
||||
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "suffocation", /datum/mood_event/suffocation)
|
||||
else
|
||||
|
||||
@@ -200,10 +200,6 @@
|
||||
INVOKE_ASYNC(RM, .proc/do_transform_animation)
|
||||
SEND_SIGNAL(R, COMSIG_CYBORG_MODULE_CHANGE) //hyperstation edit
|
||||
qdel(src)
|
||||
//Skyrat change start
|
||||
R.radio.extra_channels = RM.added_channels
|
||||
R.radio.recalculateChannels()
|
||||
//Skyrat change stop
|
||||
return RM
|
||||
|
||||
/obj/item/robot_module/proc/be_transformed_to(obj/item/robot_module/old_module)
|
||||
|
||||
@@ -57,9 +57,7 @@
|
||||
var/datum/callback/CB = foo
|
||||
CB.Invoke()
|
||||
|
||||
if(client.prefs)
|
||||
mind?.hide_ckey = client.prefs.hide_ckey
|
||||
client.fps = client.prefs.clientfps
|
||||
mind?.hide_ckey = client?.prefs?.hide_ckey
|
||||
log_message("Client [key_name(src)] has taken ownership of mob [src]([src.type])", LOG_OWNERSHIP)
|
||||
SEND_SIGNAL(src, COMSIG_MOB_CLIENT_LOGIN, client)
|
||||
client.init_verbs()
|
||||
|
||||
@@ -104,8 +104,6 @@
|
||||
var/icon_update_needed = FALSE
|
||||
var/obj/machinery/computer/apc_control/remote_control = null
|
||||
|
||||
var/obj/effect/light/lighteffect //light effect
|
||||
|
||||
/obj/machinery/power/apc/unlocked
|
||||
locked = FALSE
|
||||
|
||||
@@ -187,8 +185,6 @@
|
||||
addtimer(CALLBACK(src, .proc/update), 5)
|
||||
|
||||
/obj/machinery/power/apc/Destroy()
|
||||
if(lighteffect)
|
||||
lighteffect.Del()
|
||||
GLOB.apcs_list -= src
|
||||
|
||||
if(malfai && operating)
|
||||
@@ -324,13 +320,6 @@
|
||||
|
||||
// And now, separately for cleanness, the lighting changing
|
||||
if(update_state & UPSTATE_ALLGOOD)
|
||||
if(!lighteffect)//make the light
|
||||
lighteffect = new/obj/effect/light
|
||||
lighteffect.loc = src.loc
|
||||
lighteffect.alpha = 50
|
||||
lighteffect.pixel_x = pixel_x
|
||||
lighteffect.pixel_y = pixel_y
|
||||
|
||||
switch(charging)
|
||||
if(APC_NOT_CHARGING)
|
||||
light_color = LIGHT_COLOR_RED
|
||||
@@ -339,7 +328,6 @@
|
||||
if(APC_FULLY_CHARGED)
|
||||
light_color = LIGHT_COLOR_GREEN
|
||||
set_light(lon_range)
|
||||
lighteffect.color = light_color
|
||||
else if(update_state & UPSTATE_BLUESCREEN)
|
||||
light_color = LIGHT_COLOR_BLUE
|
||||
set_light(lon_range)
|
||||
@@ -348,10 +336,6 @@
|
||||
|
||||
icon_update_needed = FALSE
|
||||
|
||||
/obj/machinery/power/apc/Move()
|
||||
if(lighteffect)
|
||||
lighteffect.loc = src.loc //move the light overlay
|
||||
|
||||
/obj/machinery/power/apc/proc/check_updates()
|
||||
var/last_update_state = update_state
|
||||
var/last_update_overlay = update_overlay
|
||||
|
||||
@@ -223,9 +223,6 @@
|
||||
var/bulb_emergency_pow_mul = 0.75 // the multiplier for determining the light's power in emergency mode
|
||||
var/bulb_emergency_pow_min = 0.5 // the minimum value for the light's power in emergency mode
|
||||
|
||||
var/obj/effect/light/lighteffect //light effect
|
||||
|
||||
|
||||
/obj/machinery/light/broken
|
||||
status = LIGHT_BROKEN
|
||||
icon_state = "tube-broken"
|
||||
@@ -245,8 +242,6 @@
|
||||
icon_state = "bulb-broken"
|
||||
|
||||
/obj/machinery/light/Move()
|
||||
if(lighteffect)
|
||||
lighteffect.loc = src.loc
|
||||
if(status != LIGHT_BROKEN)
|
||||
break_light_tube(1)
|
||||
return ..()
|
||||
@@ -290,8 +285,6 @@
|
||||
|
||||
/obj/machinery/light/Destroy()
|
||||
var/area/A = get_area(src)
|
||||
if(lighteffect)
|
||||
lighteffect.Del()
|
||||
if(A)
|
||||
on = FALSE
|
||||
// A.update_lights()
|
||||
@@ -299,35 +292,24 @@
|
||||
return ..()
|
||||
|
||||
/obj/machinery/light/update_icon()
|
||||
if(!lighteffect) //dont have a light bloom, make it.
|
||||
lighteffect = new/obj/effect/light/large
|
||||
lighteffect.loc = src.loc
|
||||
cut_overlays()
|
||||
switch(status) // set icon_states
|
||||
if(LIGHT_OK)
|
||||
var/area/A = get_area(src)
|
||||
if(emergency_mode || (A && A.fire))
|
||||
icon_state = "[base_state]_emergency"
|
||||
lighteffect.alpha = 0
|
||||
else
|
||||
icon_state = "[base_state]"
|
||||
if(on)
|
||||
lighteffect.alpha = CLAMP(light_power*35, 5, 100)
|
||||
lighteffect.color = light_color
|
||||
var/mutable_appearance/glowybit = mutable_appearance(overlayicon, base_state, ABOVE_LIGHTING_LAYER, ABOVE_LIGHTING_PLANE)
|
||||
glowybit.alpha = CLAMP(light_power*250, 30, 200)
|
||||
add_overlay(glowybit)
|
||||
if(LIGHT_EMPTY)
|
||||
icon_state = "[base_state]-empty"
|
||||
lighteffect.alpha = 0
|
||||
if(LIGHT_BURNED)
|
||||
icon_state = "[base_state]-burned"
|
||||
lighteffect.alpha = 0
|
||||
if(LIGHT_BROKEN)
|
||||
icon_state = "[base_state]-broken"
|
||||
lighteffect.alpha = 0
|
||||
if(!on)
|
||||
lighteffect.alpha = 0
|
||||
return
|
||||
|
||||
// update the icon_state and luminosity of the light depending on its state
|
||||
|
||||
@@ -266,7 +266,7 @@
|
||||
icon_state = "modkit"
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
require_module = 1
|
||||
module_type = list(/obj/item/robot_module/miner, /obj/item/robot_module/orepup)
|
||||
module_type = /obj/item/robot_module/miner
|
||||
var/denied_type = null
|
||||
var/maximum_of_type = 1
|
||||
var/cost = 30
|
||||
|
||||
@@ -197,10 +197,7 @@
|
||||
L.visible_message("<span class='danger'>[L] is hit by \a [src][organ_hit_text]!</span>", \
|
||||
"<span class='userdanger'>[L] is hit by \a [src][organ_hit_text]!</span>", null, COMBAT_MESSAGE_RANGE)
|
||||
if(candink && def_zone == BODY_ZONE_HEAD)
|
||||
if(prob(2))
|
||||
playsound(src, 'hyperstation/sound/weapons/dinkalternate.ogg', 30, 0)
|
||||
else
|
||||
playsound(src, 'sound/weapons/dink.ogg', 30, 1)
|
||||
playsound(src, 'sound/weapons/dink.ogg', 30, 1)
|
||||
L.on_hit(src)
|
||||
|
||||
var/reagent_note
|
||||
|
||||
@@ -65,12 +65,6 @@
|
||||
var/who = (isnull(user) || eater == user) ? "your" : "[eater.p_their()]"
|
||||
to_chat(user, "<span class='warning'>You have to remove [who] [covered] first!</span>")
|
||||
return 0
|
||||
if(!eater.has_mouth())
|
||||
if(eater == user)
|
||||
to_chat(eater, "<span class='warning'>You have no mouth, and cannot eat.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You can't feed [eater], because they have no mouth!</span>")
|
||||
return 0
|
||||
return 1
|
||||
|
||||
/obj/item/reagent_containers/ex_act()
|
||||
|
||||
@@ -282,16 +282,16 @@
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
if(chalice_taken)
|
||||
if(chalice_taken == 1)
|
||||
to_chat(user, "<i>You hear a voice in your head... <b>\"My chalice has already been taken, dear. I cannot give you another...\"</i></b>")
|
||||
return
|
||||
if(user.getArousalLoss() < 100)
|
||||
to_chat(user, "<i>You hear a voice in your head... <b>\"You are not horny enough to receive my blessing, dear~\"</i></b>")
|
||||
return
|
||||
var/mob/living/carbon/user_carbon = user
|
||||
user_carbon.mob_climax_instant()
|
||||
to_chat(user, "<i>You hear a voice in your head... <b>\"You are worthy of my blessing, dear~\"</i></b>")
|
||||
to_chat(user, "<span class='userdanger'>You feel overpowering pleasure surge through your entire body.</span>")
|
||||
var/A = new /obj/item/reagent_containers/chalice/lust
|
||||
user.put_in_hands(A)
|
||||
chalice_taken = TRUE
|
||||
if (ishuman(user) && user.has_dna())
|
||||
user.mob_climax(forced_climax=TRUE)
|
||||
to_chat(user, "<i>You hear a voice in your head... <b>\"You are worth of my blessing dear~\"</i></b>")
|
||||
to_chat(user, "<span class='userdanger'>You feel overpowering pleasure surge through your entire body.</span>")
|
||||
var/A = new /obj/item/reagent_containers/chalice/lust
|
||||
user.put_in_hands(A)
|
||||
chalice_taken = 1
|
||||
@@ -44,13 +44,6 @@
|
||||
var/skin_tone = ""
|
||||
var/body_gender = ""
|
||||
var/species_id = ""
|
||||
/**
|
||||
* HYPER: when getting the appearance of a limb, the game will check
|
||||
* for `cosmetic_icon` first. if there is none, it will default back
|
||||
* to `species_id`. this allows us to use custom body part types for
|
||||
* each limb in character customization.
|
||||
*/
|
||||
var/datum/cosmetic_part/cosmetic_icon
|
||||
var/color_src
|
||||
var/base_bp_icon //Overrides the icon being used for this limb. This is mainly for downstreams, implemented and maintained as a favor in return for implementing synths. And also because should_draw_* for icon overrides was pretty messy. You're welcome.
|
||||
var/should_draw_gender = FALSE
|
||||
@@ -398,22 +391,12 @@
|
||||
else
|
||||
body_markings = "plain"
|
||||
auxmarking = "plain"
|
||||
markings_color = list(colorlist)
|
||||
|
||||
else
|
||||
body_markings = null
|
||||
auxmarking = null
|
||||
|
||||
if(cosmetic_icon && is_organic_limb())
|
||||
if(cosmetic_icon.icon)
|
||||
base_bp_icon = cosmetic_icon.icon
|
||||
use_digitigrade = cosmetic_icon.support_digitigrade ? use_digitigrade : NOT_DIGITIGRADE
|
||||
color_src = cosmetic_icon.color_src ? cosmetic_icon.color_src : MUTCOLORS
|
||||
if(!H.dna.features["cosmetic_markings"])
|
||||
body_markings = null
|
||||
auxmarking = null
|
||||
|
||||
if((MUTCOLORS in S.species_traits) || (MUTCOLORS_PARTSONLY in S.species_traits))
|
||||
markings_color = list(colorlist)
|
||||
|
||||
if(!dropping_limb && H.dna.check_mutation(HULK))
|
||||
mutation_color = "00aa00"
|
||||
else
|
||||
@@ -453,11 +436,6 @@
|
||||
|
||||
var/image_dir = 0
|
||||
var/icon_gender = (body_gender == FEMALE) ? "f" : "m" //gender of the icon, if applicable
|
||||
var/is_husk = species_id == "husk"
|
||||
|
||||
/// HYPER: allow for custom limb icons in character customization
|
||||
var/has_cosmetic_state = !isnull(cosmetic_icon) && !isnull(cosmetic_icon.icon_state)
|
||||
var/limb_style = has_cosmetic_state ? cosmetic_icon.icon_state : species_id
|
||||
|
||||
if(dropped)
|
||||
image_dir = SOUTH
|
||||
@@ -486,7 +464,7 @@
|
||||
if(animal_origin)
|
||||
if(is_organic_limb())
|
||||
limb.icon = 'icons/mob/animal_parts.dmi'
|
||||
if(is_husk)
|
||||
if(species_id == "husk")
|
||||
limb.icon_state = "[animal_origin]_husk_[body_zone]"
|
||||
else
|
||||
limb.icon_state = "[animal_origin]_[body_zone]"
|
||||
@@ -501,21 +479,21 @@
|
||||
if(is_organic_limb())
|
||||
limb.icon = base_bp_icon || 'icons/mob/human_parts.dmi'
|
||||
if(should_draw_gender)
|
||||
limb.icon_state = "[limb_style]_[body_zone]_[icon_gender]"
|
||||
limb.icon_state = "[species_id]_[body_zone]_[icon_gender]"
|
||||
else if (use_digitigrade)
|
||||
if(base_bp_icon == DEFAULT_BODYPART_ICON_ORGANIC) //Compatibility hack for the current iconset.
|
||||
limb.icon_state = "digitigrade_[use_digitigrade]_[body_zone]"
|
||||
else
|
||||
limb.icon_state = "[limb_style]_digitigrade_[use_digitigrade]_[body_zone]"
|
||||
limb.icon_state = "[species_id]_digitigrade_[use_digitigrade]_[body_zone]"
|
||||
|
||||
else
|
||||
limb.icon_state = "[limb_style]_[body_zone]"
|
||||
limb.icon_state = "[species_id]_[body_zone]"
|
||||
|
||||
// Body markings
|
||||
if(body_markings)
|
||||
if(is_husk)
|
||||
if(species_id == "husk")
|
||||
marking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[body_zone]", -MARKING_LAYER, image_dir)
|
||||
else if(is_husk && use_digitigrade)
|
||||
else if(species_id == "husk" && use_digitigrade)
|
||||
marking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
|
||||
|
||||
else if(!use_digitigrade)
|
||||
@@ -530,10 +508,10 @@
|
||||
// Citadel End
|
||||
|
||||
if(aux_zone)
|
||||
aux = image(limb.icon, "[limb_style]_[aux_zone]", -aux_layer, image_dir)
|
||||
aux = image(limb.icon, "[species_id]_[aux_zone]", -aux_layer, image_dir)
|
||||
. += aux
|
||||
if(body_markings)
|
||||
if(is_husk)
|
||||
if(species_id == "husk")
|
||||
auxmarking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[aux_zone]", -aux_layer, image_dir)
|
||||
else
|
||||
auxmarking = image(body_markings_icon, "[body_markings]_[aux_zone]", -aux_layer, image_dir)
|
||||
@@ -550,16 +528,16 @@
|
||||
aux = image(limb.icon, "[aux_zone]", -aux_layer, image_dir)
|
||||
. += aux
|
||||
if(!isnull(auxmarking))
|
||||
if(is_husk)
|
||||
if(species_id == "husk")
|
||||
auxmarking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[aux_zone]", -aux_layer, image_dir)
|
||||
else
|
||||
auxmarking = image(body_markings_icon, "[body_markings]_[aux_zone]", -aux_layer, image_dir)
|
||||
. += auxmarking
|
||||
|
||||
if(!isnull(body_markings))
|
||||
if(is_husk)
|
||||
if(species_id == "husk")
|
||||
marking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[body_zone]", -MARKING_LAYER, image_dir)
|
||||
else if(is_husk && use_digitigrade)
|
||||
else if(species_id == "husk" && use_digitigrade)
|
||||
marking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
|
||||
|
||||
else if(!use_digitigrade)
|
||||
@@ -572,27 +550,20 @@
|
||||
. += marking
|
||||
return
|
||||
|
||||
if(!color_src)
|
||||
return
|
||||
switch(color_src)
|
||||
if(MUTCOLORS)
|
||||
var/draw_color = mutation_color || species_color || (skin_tone && skintone2hex(skin_tone))
|
||||
if(draw_color)
|
||||
limb.color = "#[draw_color]"
|
||||
if(aux_zone)
|
||||
aux.color = "#[draw_color]"
|
||||
if(MATRIXED)
|
||||
limb.color = list(markings_color)
|
||||
if(color_src) //TODO - add color matrix support for base species limbs
|
||||
var/draw_color = mutation_color || species_color || (skin_tone && skintone2hex(skin_tone))
|
||||
if(draw_color)
|
||||
limb.color = "#[draw_color]"
|
||||
if(aux_zone)
|
||||
aux.color = list(markings_color)
|
||||
aux.color = "#[draw_color]"
|
||||
if(!isnull(auxmarking))
|
||||
auxmarking.color = list(markings_color)
|
||||
|
||||
if(!isnull(auxmarking))
|
||||
auxmarking.color = list(markings_color)
|
||||
if(!isnull(body_markings))
|
||||
if(is_husk)
|
||||
marking.color = "#141414"
|
||||
else
|
||||
marking.color = list(markings_color)
|
||||
if(!isnull(body_markings))
|
||||
if(species_id == "husk")
|
||||
marking.color = "#141414"
|
||||
else
|
||||
marking.color = list(markings_color)
|
||||
|
||||
|
||||
/obj/item/bodypart/deconstruct(disassembled = TRUE)
|
||||
|
||||
@@ -34,9 +34,6 @@
|
||||
var/lip_color = "white"
|
||||
//If the head is a special sprite
|
||||
var/custom_head
|
||||
|
||||
// if head has mouth; may depend on species
|
||||
var/mouth = TRUE
|
||||
|
||||
/obj/item/bodypart/head/can_dismember(obj/item/I)
|
||||
if(!((owner.stat == DEAD) || owner.InFullCritical()))
|
||||
|
||||
@@ -120,27 +120,6 @@
|
||||
return
|
||||
owner.vomit(stun = FALSE)
|
||||
|
||||
|
||||
/obj/item/organ/stomach/synthliz
|
||||
name = "synthliz stomach"
|
||||
/obj/item/organ/stomach/ipc
|
||||
name = "ipc stomach"
|
||||
icon_state = "stomach-ipc"
|
||||
|
||||
// ipc power cell from oracle
|
||||
/obj/item/organ/stomach/cell
|
||||
name = "micro-cell"
|
||||
icon_state = "microcell"
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
zone = BODY_ZONE_CHEST
|
||||
slot = ORGAN_SLOT_STOMACH
|
||||
status = ORGAN_ROBOTIC
|
||||
attack_verb = list("assault and battery'd")
|
||||
desc = "A micro-cell, for IPC use only. Do not swallow."
|
||||
|
||||
/obj/item/organ/stomach/cell/emp_act(severity)
|
||||
switch(severity)
|
||||
if(1)
|
||||
owner.nutrition = 50
|
||||
to_chat(owner, "<span class='warning'>Alert: Heavy EMP Detected. Rebooting power cell to prevent damage.</span>")
|
||||
if(2)
|
||||
owner.nutrition = 250
|
||||
to_chat(owner, "<span class='warning'>Alert: EMP Detected. Cycling battery.</span>")
|
||||
@@ -581,7 +581,7 @@
|
||||
for(var/V in listeners)
|
||||
var/mob/living/carbon/human/H = V
|
||||
if(H.canbearoused && H.has_dna() && HAS_TRAIT(H, TRAIT_NYMPHO)) // probably a redundant check but for good measure
|
||||
H.mob_climax_instant()
|
||||
H.mob_climax(forced_climax=TRUE)
|
||||
*/
|
||||
else if((findtext(message, family_friendly_words)))
|
||||
cooldown = COOLDOWN_MEME
|
||||
@@ -1123,7 +1123,7 @@
|
||||
if(E.phase > 1)
|
||||
if(HAS_TRAIT(H, TRAIT_NYMPHO) && H.canbearoused && E.lewd) // probably a redundant check but for good measure
|
||||
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "<span class='love'>Your [E.enthrallGender] pushes you over the limit, overwhelming your body with pleasure.</b></span>"), 5)
|
||||
H.mob_climax_instant()
|
||||
H.mob_climax(forced_climax=TRUE)
|
||||
H.SetStun(20)
|
||||
H.setArousalLoss(H.min_arousal)
|
||||
E.resistanceTally = 0 //makes resistance 0, but resets arousal, resistance buildup is faster unaroused (massively so).
|
||||
|
||||
@@ -8,7 +8,8 @@
|
||||
vend_reply = "Thank you for using AutoDrobe!"
|
||||
products = list(/obj/item/clothing/suit/chickensuit = 1,
|
||||
/obj/item/clothing/head/chicken = 1,
|
||||
/obj/item/clothing/suit/hooded/wintercoat/corpus = 1,
|
||||
/obj/item/clothing/suit/hooded/corpus = 1,
|
||||
/obj/item/clothing/suit/hooded/corpus/c = 1,
|
||||
/obj/item/clothing/under/gladiator = 1,
|
||||
/obj/item/clothing/head/helmet/gladiator = 1,
|
||||
/obj/item/clothing/under/gimmick/rank/captain/suit = 1,
|
||||
@@ -111,9 +112,6 @@
|
||||
/obj/item/clothing/head/wig/random = 3,
|
||||
/obj/item/clothing/suit/ran = 2,
|
||||
/obj/item/clothing/head/ran = 2,
|
||||
/obj/item/clothing/suit/threepwoodjacket = 3,
|
||||
/obj/item/clothing/under/threepwood = 2,
|
||||
/obj/item/clothing/shoes/threepwoodboots = 1,
|
||||
/obj/item/clothing/under/vaultsuit = 3)
|
||||
contraband = list(/obj/item/clothing/suit/judgerobe = 1,
|
||||
/obj/item/clothing/head/powdered_wig = 1,
|
||||
@@ -122,26 +120,25 @@
|
||||
/obj/item/clothing/glasses/sunglasses/blindfold = 1,
|
||||
/obj/item/clothing/mask/muzzle = 2)
|
||||
premium = list(/obj/item/clothing/suit/pirate/captain = 2,
|
||||
/obj/item/clothing/head/pirate/captain = 2,
|
||||
/obj/item/clothing/head/helmet/roman/fake = 1,
|
||||
/obj/item/clothing/head/helmet/roman/legionnaire/fake = 1,
|
||||
/obj/item/clothing/under/roman = 1,
|
||||
/obj/item/clothing/shoes/roman = 1,
|
||||
/obj/item/shield/riot/roman/fake = 1,
|
||||
/obj/item/clothing/head/delinquent = 1, // One per vendor, please dear god don't mass produce these.
|
||||
/obj/item/skub = 1,
|
||||
/obj/item/clothing/under/lobster = 1, // CIT CHANGES
|
||||
/obj/item/clothing/head/lobsterhat = 1,
|
||||
/obj/item/clothing/head/drfreezehat = 1,
|
||||
/obj/item/clothing/suit/dracula = 1,
|
||||
/obj/item/clothing/suit/drfreeze_coat = 1,
|
||||
/obj/item/clothing/suit/gothcoat = 2,
|
||||
/obj/item/clothing/under/draculass = 1,
|
||||
/obj/item/clothing/under/drfreeze = 1, //End of Cit Changes
|
||||
/obj/item/clothing/head/pirate/captain = 2,
|
||||
/obj/item/clothing/head/helmet/roman/fake = 1,
|
||||
/obj/item/clothing/head/helmet/roman/legionnaire/fake = 1,
|
||||
/obj/item/clothing/under/roman = 1,
|
||||
/obj/item/clothing/shoes/roman = 1,
|
||||
/obj/item/shield/riot/roman/fake = 1,
|
||||
/obj/item/clothing/head/delinquent = 1, // One per vendor, please dear god don't mass produce these.
|
||||
/obj/item/skub = 1,
|
||||
/obj/item/clothing/under/lobster = 1, // CIT CHANGES
|
||||
/obj/item/clothing/head/lobsterhat = 1,
|
||||
/obj/item/clothing/head/drfreezehat = 1,
|
||||
/obj/item/clothing/suit/dracula = 1,
|
||||
/obj/item/clothing/suit/drfreeze_coat = 1,
|
||||
/obj/item/clothing/suit/gothcoat = 2,
|
||||
/obj/item/clothing/under/draculass = 1,
|
||||
/obj/item/clothing/under/drfreeze = 1, //End of Cit Changes
|
||||
/obj/item/clothing/under/wedding_dress = 1,
|
||||
/obj/item/clothing/under/tuxedo = 1,
|
||||
/obj/item/clothing/suit/hooded/wintercoat/corpus/command = 1,
|
||||
/obj/item/storage/belt/cummerbund = 1)
|
||||
/obj/item/clothing/under/tuxedo = 1,
|
||||
/obj/item/storage/belt/cummerbund = 1)
|
||||
refill_canister = /obj/item/vending_refill/autodrobe
|
||||
|
||||
/obj/machinery/vending/autodrobe/all_access
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
/obj/item/clothing/under/rank/security/skirt = 5,
|
||||
/obj/item/clothing/under/rank/security/grey = 5,
|
||||
/obj/item/clothing/under/pants/khaki = 5,
|
||||
/obj/item/clothing/suit/hooded/wintercoat/corpus/sec = 5)
|
||||
/obj/item/clothing/suit/hooded/corpus/s = 5)
|
||||
premium = list(/obj/item/clothing/under/rank/security/navyblue = 5,
|
||||
/obj/item/clothing/suit/security/officer = 5,
|
||||
/obj/item/clothing/head/beret/sec/navyofficer = 5,
|
||||
|
||||
@@ -1,18 +0,0 @@
|
||||
/obj/effect/light/
|
||||
name = "bloom"
|
||||
icon = 'hyperstation/icons/effects/lighting.dmi'
|
||||
icon_state = "light"
|
||||
plane = ABOVE_LIGHTING_PLANE
|
||||
blend_mode = BLEND_ADD
|
||||
mouse_opacity = 0
|
||||
anchored = TRUE //no more flying around.
|
||||
|
||||
/obj/effect/light/medium
|
||||
icon = 'hyperstation/icons/effects/lightingmed.dmi'
|
||||
pixel_x = -16
|
||||
pixel_y = -16
|
||||
|
||||
/obj/effect/light/large
|
||||
icon = 'hyperstation/icons/effects/lightinglarge.dmi'
|
||||
pixel_x = -48
|
||||
pixel_y = -48
|
||||
@@ -1,2 +0,0 @@
|
||||
/obj/item/radio
|
||||
var/list/extra_channels = list() //Allows indivudal channels, used for borgs
|
||||
@@ -16,7 +16,6 @@
|
||||
var/heat_resistance = 800
|
||||
var/health = 70
|
||||
var/maxhealth = 70
|
||||
layer = BELOW_MOB_LAYER
|
||||
|
||||
|
||||
resistance_flags = ACID_PROOF
|
||||
@@ -165,14 +164,6 @@
|
||||
usr.visible_message("<span class='warning'>[user] climbed over \the [src]!</span>")
|
||||
usr.do_twist(targetangle = 45, timer = 8)
|
||||
|
||||
/obj/structure/railing/Initialize(mapload) //mobs will show under the south railing sprite, thanks Cyanosis for helping with the fix
|
||||
. = ..()
|
||||
if(!mapload)
|
||||
return
|
||||
if(!(dir & SOUTH))
|
||||
return
|
||||
layer = ABOVE_MOB_LAYER
|
||||
|
||||
/obj/structure/railing/handrail
|
||||
name = "handrail"
|
||||
desc = "A waist high handrail, perhaps you could climb over it."
|
||||
|
||||
@@ -11,15 +11,7 @@
|
||||
for(var/obj/item/organ/genital/G in U.internal_organs)
|
||||
if(!G.nochange)
|
||||
if(!G.dontlist)
|
||||
var/genital_visibility = "[G.name] <font color='green'>(Visible)</font>"
|
||||
switch(G.mode)
|
||||
if(GENITALS_HIDDEN)
|
||||
genital_visibility = "[G.name] <font color='red'>(Hidden)</font>"
|
||||
if(GENITALS_CLOTHES)
|
||||
genital_visibility = "[G.name] <font color='yellow'>(Hidden by Clothes)</font>"
|
||||
if(GENITALS_VISIBLE)
|
||||
genital_visibility = "[G.name] <font color='green'>(Visible)</font>"
|
||||
dat += "<a href='byond://?src=[REF(src)];hide[G.name]=1'>[genital_visibility]</a><BR>"
|
||||
dat += "<a href='byond://?src=[REF(src)];hide[G.name]=1'>[G.mode == "hidden" ? "[G.name] <font color='red'>(Hidden)</font>" : (G.mode == "clothes" ? "[G.name] <font color='yellow'>(Hidden by Clothes)</font>" : (G.mode == "visable" ? "[G.name] <font color='green'>(Visable)</font>" : "[G.name] <font color='green'>(Visable)</font>"))]</a><BR>"
|
||||
|
||||
dat += {"<BR><B>Contexual Options</B><BR><HR>"}
|
||||
var/obj/item/organ/genital/penis/P = user.getorganslot("penis")
|
||||
@@ -53,17 +45,20 @@
|
||||
if(Belly.inflatable)
|
||||
dat += "<a href='byond://?src=[REF(src)];shrink_belly=1'>Deflate belly</A>"
|
||||
dat += "(Shrink your belly down a size)<BR>"
|
||||
|
||||
if(user.pulling && !isnoncarbon(user.pulling)) // do not fuck animals
|
||||
|
||||
|
||||
if(user.pulling)
|
||||
dat += "<a href='byond://?src=[REF(src)];climaxover=1'>Climax over [user.pulling]</A>" //you can cum on objects if you really want...
|
||||
dat += "(Orgasm over a person or object.)<BR>"
|
||||
if(iscarbon(user.pulling))
|
||||
dat += "<a href='byond://?src=[REF(src)];climaxwith=1'>Climax with [user.pulling]</A>"
|
||||
dat += {"(Orgasm with another person.)<BR>"}
|
||||
var/mob/living/carbon/human/H = user.pulling
|
||||
if(H && H.breedable && P)
|
||||
dat += "<a href='byond://?src=[REF(src)];impreg=1'>Impregnate [U.pulling] ([clamp(U.impregchance,0,100)]%)</A>"
|
||||
dat += "(Climax inside another person, and attempt to knock them up.)<BR>"
|
||||
if(isliving(user.pulling))
|
||||
if(iscarbon(user.pulling))
|
||||
dat += "<a href='byond://?src=[REF(src)];climaxwith=1'>Climax with [user.pulling]</A>"
|
||||
dat += {"(Orgasm with another person.)<BR>"}
|
||||
|
||||
var/mob/living/carbon/human/H = user.pulling
|
||||
if(H.breedable && P && H)
|
||||
dat += "<a href='byond://?src=[REF(src)];impreg=1'>Impregnate [U.pulling] ([clamp(U.impregchance,0,100)]%)</A>"
|
||||
dat += "(Climax inside another person, and attempt to knock them up.)<BR>"
|
||||
else
|
||||
dat += "<span class='linkOff'>Climax over</span></A>"
|
||||
dat += "(Requires a partner)<BR>"
|
||||
@@ -86,9 +81,11 @@
|
||||
dat += "<a href='byond://?src=[REF(src)];omenu=1'>Old Menu</A>"
|
||||
dat += "<a href='byond://?src=[REF(src)];underwear=1'>Toggle Undergarments </A>"
|
||||
dat += "<BR>"
|
||||
|
||||
var/datum/browser/popup = new(user, "arousal", "Arousal Panel")
|
||||
popup.set_content(dat)
|
||||
popup.set_title_image(user.browse_rsc_icon(icon, icon_state), 500,600)
|
||||
|
||||
popup.open()
|
||||
|
||||
|
||||
@@ -143,7 +140,7 @@
|
||||
T.toggle_visibility(picked_visibility)
|
||||
|
||||
if(href_list["masturbate"])
|
||||
if (H.isPercentAroused(33)) //requires 33% arousal.
|
||||
if (H.arousalloss >= (H.max_arousal / 100) * 33) //requires 33% arousal.
|
||||
H.solomasturbate()
|
||||
return
|
||||
else
|
||||
@@ -151,7 +148,7 @@
|
||||
return
|
||||
|
||||
if(href_list["container"])
|
||||
if (H.isPercentAroused(33)) //requires 33% arousal.
|
||||
if (H.arousalloss >= (H.max_arousal / 100) * 33) //requires 33% arousal.
|
||||
H.cumcontainer()
|
||||
return
|
||||
else
|
||||
@@ -159,7 +156,7 @@
|
||||
return
|
||||
|
||||
if(href_list["clothesplosion"])
|
||||
if (H.isPercentAroused(33)) //Requires 33% arousal.
|
||||
if (H.arousalloss >= (H.max_arousal / 100) * 33) //Requires 33% arousal.
|
||||
H.clothesplosion()
|
||||
return
|
||||
else
|
||||
@@ -167,7 +164,7 @@
|
||||
return
|
||||
|
||||
if(href_list["climaxself"])
|
||||
if (H.isPercentAroused(33)) //requires 33% arousal.
|
||||
if (H.arousalloss >= (H.max_arousal / 100) * 33) //requires 33% arousal.
|
||||
H.climaxself()
|
||||
return
|
||||
else
|
||||
@@ -175,7 +172,7 @@
|
||||
return
|
||||
|
||||
if(href_list["climax"])
|
||||
if (H.isPercentAroused(33)) //requires 33% arousal.
|
||||
if (H.arousalloss >= (H.max_arousal / 100) * 33) //requires 33% arousal.
|
||||
H.climaxalone(FALSE)
|
||||
return
|
||||
else
|
||||
@@ -183,7 +180,7 @@
|
||||
return
|
||||
|
||||
if(href_list["climaxover"])
|
||||
if (H.isPercentAroused(33)) //requires 33% arousal.
|
||||
if (H.arousalloss >= (H.max_arousal / 100) * 33) //requires 33% arousal.
|
||||
H.climaxover(usr.pulling)
|
||||
return
|
||||
else
|
||||
@@ -191,7 +188,7 @@
|
||||
return
|
||||
|
||||
if(href_list["climaxwith"])
|
||||
if (H.isPercentAroused(33)) //requires 33% arousal.
|
||||
if (H.arousalloss >= (H.max_arousal / 100) * 33) //requires 33% arousal.
|
||||
H.climaxwith(usr.pulling)
|
||||
return
|
||||
else
|
||||
@@ -199,7 +196,7 @@
|
||||
return
|
||||
|
||||
if(href_list["impreg"])
|
||||
if (H.isPercentAroused(33)) //requires 33% arousal.
|
||||
if (H.arousalloss >= (H.max_arousal / 100) * 33) //requires 33% arousal.
|
||||
H.impregwith(usr.pulling)
|
||||
return
|
||||
else
|
||||
@@ -334,7 +331,7 @@ obj/screen/arousal/proc/kiss()
|
||||
return
|
||||
//We got hands, let's pick an organ
|
||||
var/obj/item/organ/genital/picked_organ
|
||||
picked_organ = pick_climax_genitals(masturbation=TRUE, title="Masturbation")
|
||||
picked_organ = pick_masturbate_genitals()
|
||||
if(picked_organ)
|
||||
src << browse(null, "window=arousal") //closes the window
|
||||
mob_masturbate(picked_organ)
|
||||
@@ -368,31 +365,55 @@ obj/screen/arousal/proc/kiss()
|
||||
to_chat(src, "<span class='warning'>You cannot climax without choosing genitals.</span>")
|
||||
return
|
||||
|
||||
/mob/living/carbon/human/proc/climaxwith(mob/living/carbon/human/partner)
|
||||
if(!partner)
|
||||
to_chat(src, "<span class='warning'>You cannot do this alone.</span>")
|
||||
return
|
||||
/mob/living/carbon/human/proc/climaxwith(mob/living/T)
|
||||
|
||||
var/mob/living/carbon/human/L = pick_partner()
|
||||
var/obj/item/organ/genital/picked_organ
|
||||
picked_organ = pick_climax_genitals()
|
||||
if(!picked_organ)
|
||||
if(picked_organ)
|
||||
var/mob/living/partner = L
|
||||
if(partner)
|
||||
src << browse(null, "window=arousal") //alls fine, we can close the window now.
|
||||
var/obj/item/organ/genital/penis/P = picked_organ
|
||||
var/spillage = "No" //default to no, just incase player has items on to prevent climax
|
||||
if(!P.condom == 1&&!P.sounding == 1) //you cant climax with a condom on or sounding in.
|
||||
spillage = input(src, "Would your fluids spill outside?", "Choose overflowing option", "Yes") as anything in list("Yes", "No")
|
||||
if(spillage == "Yes")
|
||||
mob_climax_partner(picked_organ, partner, TRUE, FALSE, FALSE)
|
||||
else
|
||||
mob_climax_partner(picked_organ, partner, FALSE, FALSE, FALSE)
|
||||
else
|
||||
to_chat(src, "<span class='warning'>You cannot do this alone.</span>")
|
||||
return
|
||||
else //They either lack organs that can masturbate, or they didn't pick one.
|
||||
to_chat(src, "<span class='warning'>You cannot climax without choosing genitals.</span>")
|
||||
return
|
||||
src << browse(null, "window=arousal") // close arousal window
|
||||
mob_climax_inside_spillage(picked_organ, partner, impreg=FALSE)
|
||||
|
||||
|
||||
/mob/living/carbon/human/proc/climaxover(atom/partner)
|
||||
|
||||
/mob/living/carbon/human/proc/climaxover(mob/living/T)
|
||||
|
||||
var/mob/living/carbon/human/L = T
|
||||
var/obj/item/organ/genital/picked_organ
|
||||
picked_organ = pick_climax_genitals()
|
||||
if(!picked_organ)
|
||||
if(picked_organ)
|
||||
src << browse(null, "window=arousal") //alls fine, we can close the window now.
|
||||
var/mob/living/partner = L
|
||||
if(partner)
|
||||
var/obj/item/organ/genital/penis/P = picked_organ
|
||||
if(P.condom == 1)
|
||||
to_chat(src, "<span class='warning'>You cannot do this action with a condom on.</span>")
|
||||
return
|
||||
if(P.sounding == 1)
|
||||
to_chat(src, "<span class='warning'>You cannot do this action with a sounding in.</span>")
|
||||
return
|
||||
mob_climax_partner(picked_organ, partner, FALSE, FALSE, TRUE)
|
||||
else
|
||||
to_chat(src, "<span class='warning'>You cannot do this alone.</span>")
|
||||
return
|
||||
else //They either lack organs that can masturbate, or they didn't pick one.
|
||||
to_chat(src, "<span class='warning'>You cannot climax without choosing genitals.</span>")
|
||||
return
|
||||
src << browse(null, "window=arousal") //alls fine, we can close the window now.
|
||||
if(!partner || isnoncarbon(partner))
|
||||
to_chat(src, "<span class='warning'>You cannot do this alone.</span>")
|
||||
return
|
||||
mob_climax_cover(picked_organ, partner)
|
||||
|
||||
|
||||
/mob/living/carbon/human/proc/clothesplosion()
|
||||
if(usr.restrained(TRUE))
|
||||
@@ -407,29 +428,39 @@ obj/screen/arousal/proc/kiss()
|
||||
H.visible_message("<span class='boldnotice'>[H] explodes out of their clothes!'</span>")
|
||||
|
||||
|
||||
/mob/living/carbon/human/proc/impregwith(mob/living/carbon/T)
|
||||
var/mob/living/carbon/human/partner = pick_partner()
|
||||
var/obj/item/organ/genital/penis/picked_organ = src.getorganslot("penis")
|
||||
// wow that is a lot of conditionals huh
|
||||
if(!picked_organ) // no penis :(
|
||||
to_chat(src, "<span class='warning'>You cannot impregnate someone without a penis.</span>")
|
||||
return
|
||||
if(!partner)
|
||||
to_chat(src, "<span class='warning'>You cannot do this alone.</span>")
|
||||
return
|
||||
if(!partner.breedable) //check if impregable.
|
||||
to_chat(src, "<span class='warning'>Your partner cannot be impregnated.</span>")
|
||||
//some fuckery happening, you shouldnt even get to this point tbh.
|
||||
return
|
||||
if(picked_organ.condom)
|
||||
to_chat(src, "<span class='warning'>You cannot impregnate someone with a condom on.</span>")
|
||||
return
|
||||
if(picked_organ.sounding)
|
||||
to_chat(src, "<span class='warning'>You cannot impregnate someone with a sounding rod in.</span>")
|
||||
return
|
||||
src << browse(null, "window=arousal") //alls fine, we can close the window now.
|
||||
mob_climax_inside_spillage(picked_organ, partner, impreg=TRUE)
|
||||
|
||||
/mob/living/carbon/human/proc/impregwith(mob/living/T)
|
||||
|
||||
var/mob/living/carbon/human/L = pick_partner()
|
||||
var/obj/item/organ/genital/picked_organ
|
||||
picked_organ = src.getorganslot("penis") //Impregnation must be done with a penis.
|
||||
if(picked_organ)
|
||||
var/mob/living/partner = L
|
||||
if(partner)
|
||||
if(!partner.breedable)//check if impregable.
|
||||
to_chat(src, "<span class='warning'>Your partner cannot be impregnated.</span>")//some fuckary happening, you shouldnt even get to this point tbh.
|
||||
return
|
||||
var/obj/item/organ/genital/penis/P = picked_organ
|
||||
//you cant impreg with a condom on or sounding in.
|
||||
if(P.condom == 1)
|
||||
to_chat(src, "<span class='warning'>You cannot do this action with a condom on.</span>")
|
||||
return
|
||||
if(P.sounding == 1)
|
||||
to_chat(src, "<span class='warning'>You cannot do this action with a sounding in.</span>")
|
||||
return
|
||||
src << browse(null, "window=arousal") //alls fine, we can close the window now.
|
||||
//Keeping this for messy fun
|
||||
var/spillage = input(src, "Would your fluids spill outside?", "Choose overflowing option", "Yes") as anything in list("Yes", "No")
|
||||
if(spillage == "Yes")
|
||||
mob_climax_partner(picked_organ, partner, TRUE, TRUE, FALSE)
|
||||
else
|
||||
mob_climax_partner(picked_organ, partner, FALSE, TRUE, FALSE)
|
||||
else
|
||||
to_chat(src, "<span class='warning'>You cannot do this alone.</span>")
|
||||
return
|
||||
else //no penis :(
|
||||
to_chat(src, "<span class='warning'>You cannot impregnate without a penis.</span>")
|
||||
return
|
||||
|
||||
/mob/living/carbon/human/proc/cumcontainer(mob/living/T)
|
||||
//We'll need hands and no restraints.
|
||||
@@ -469,11 +500,6 @@ obj/screen/arousal/proc/kiss()
|
||||
cum_splatter_icon.Blend(icon('hyperstation/icons/effects/cumoverlay.dmi', "cum_obj"), ICON_MULTIPLY)
|
||||
add_overlay(cum_splatter_icon)
|
||||
|
||||
/mob/living/carbon/add_cum_overlay(type="normal")
|
||||
var/mutable_appearance/cumoverlay = mutable_appearance('hyperstation/icons/effects/cumoverlay.dmi')
|
||||
cumoverlay.icon_state = "cum_[type]"
|
||||
add_overlay(cumoverlay)
|
||||
|
||||
/atom/proc/wash_cum()
|
||||
cut_overlay(mutable_appearance('hyperstation/icons/effects/cumoverlay.dmi', "cum_normal"))
|
||||
cut_overlay(mutable_appearance('hyperstation/icons/effects/cumoverlay.dmi', "cum_large"))
|
||||
@@ -497,7 +523,7 @@ obj/screen/arousal/proc/kiss()
|
||||
return
|
||||
//We got hands, let's pick an organ
|
||||
var/obj/item/organ/genital/picked_organ
|
||||
picked_organ = pick_climax_genitals(masturbation=TRUE, title="Masturbation")
|
||||
picked_organ = pick_masturbate_genitals()
|
||||
if(picked_organ)
|
||||
src << browse(null, "window=arousal") //closes the window
|
||||
mob_masturbate(picked_organ, cover = TRUE)
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
/obj/item/organ/genital/proc/get_fluid_source()
|
||||
if(producing)
|
||||
return src.reagents
|
||||
if(linked_organ && linked_organ.producing)
|
||||
return linked_organ.reagents
|
||||
return null
|
||||
@@ -5,31 +5,3 @@
|
||||
contains = list(/obj/item/polepack/,
|
||||
/obj/item/wrench/)
|
||||
crate_name = "stripper pole crate"
|
||||
|
||||
/datum/supply_pack/organic/donkpockets
|
||||
name = "Donkpocket Shipment"
|
||||
desc = "We at Donk corp provide a wide five selection of holovid ready dinner pockets for all your dietary needs from extra-cheese to vegan to even mothpeople. Product of Donk co."
|
||||
cost = 1500
|
||||
contains = list()
|
||||
crate_name = "Donk Crate"
|
||||
crate_type = /obj/structure/closet/crate/freezer
|
||||
var/num_contained = 5
|
||||
//Put the types you want to contain inside this list below.
|
||||
var/can_contain = list( /obj/item/storage/box/donkpockets,
|
||||
/obj/item/storage/box/donkpockets/donkpockettaco,
|
||||
/obj/item/storage/box/donkpockets/donkpocketplasma,
|
||||
/obj/item/storage/box/donkpockets/donkpocketbreakfast,
|
||||
/obj/item/storage/box/donkpockets/donkpocketmoth,
|
||||
/obj/item/storage/box/donkpockets/donkpocketvegan,
|
||||
/obj/item/storage/box/donkpockets/donkpocketspicy,
|
||||
/obj/item/storage/box/donkpockets/donkpocketteriyaki,
|
||||
/obj/item/storage/box/donkpockets/donkpocketpizza,
|
||||
/obj/item/storage/box/donkpockets/donkpocketberry,
|
||||
/obj/item/storage/box/donkpockets/donkpockethonk
|
||||
)
|
||||
|
||||
/datum/supply_pack/organic/donkpockets/fill(obj/structure/closet/crate/C)
|
||||
contains = list()
|
||||
for(var/i = 0; i < num_contained; i++)
|
||||
contains += pick(can_contain)
|
||||
. = ..()
|
||||
@@ -1,36 +0,0 @@
|
||||
/datum/preferences/proc/hyper_character_pref_load(savefile/S)
|
||||
S["feature_cosmetic_head"] >> features["cosmetic_head"]
|
||||
S["feature_cosmetic_chest"] >> features["cosmetic_chest"]
|
||||
S["feature_cosmetic_l_arm"] >> features["cosmetic_l_arm"]
|
||||
S["feature_cosmetic_r_arm"] >> features["cosmetic_r_arm"]
|
||||
S["feature_cosmetic_l_leg"] >> features["cosmetic_l_leg"]
|
||||
S["feature_cosmetic_r_leg"] >> features["cosmetic_r_leg"]
|
||||
S["cosmetic_markings"] >> features["cosmetic_markings"]
|
||||
var/cosmetic_head = sanitize_inlist(features["cosmetic_head"], GLOB.cosmetic_heads, "default")
|
||||
var/cosmetic_chest = sanitize_inlist(features["cosmetic_chest"], GLOB.cosmetic_chests, "default")
|
||||
var/cosmetic_l_arm = sanitize_inlist(features["cosmetic_l_arm"], GLOB.cosmetic_arms, "default")
|
||||
var/cosmetic_r_arm = sanitize_inlist(features["cosmetic_r_arm"], GLOB.cosmetic_arms, "default")
|
||||
var/cosmetic_l_leg = sanitize_inlist(features["cosmetic_l_leg"], GLOB.cosmetic_legs, "default")
|
||||
var/cosmetic_r_leg = sanitize_inlist(features["cosmetic_r_leg"], GLOB.cosmetic_legs, "default")
|
||||
features["cosmetic_head"] = GLOB.cosmetic_heads[cosmetic_head]
|
||||
features["cosmetic_chest"] = GLOB.cosmetic_chests[cosmetic_chest]
|
||||
features["cosmetic_l_arm"] = GLOB.cosmetic_arms[cosmetic_l_arm]
|
||||
features["cosmetic_r_arm"] = GLOB.cosmetic_arms[cosmetic_r_arm]
|
||||
features["cosmetic_l_leg"] = GLOB.cosmetic_legs[cosmetic_l_leg]
|
||||
features["cosmetic_r_leg"] = GLOB.cosmetic_legs[cosmetic_r_leg]
|
||||
|
||||
|
||||
/datum/preferences/proc/hyper_character_pref_save(savefile/S)
|
||||
var/datum/cosmetic_part/head = features["cosmetic_head"]
|
||||
var/datum/cosmetic_part/chest = features["cosmetic_chest"]
|
||||
var/datum/cosmetic_part/l_arm = features["cosmetic_l_arm"]
|
||||
var/datum/cosmetic_part/r_arm = features["cosmetic_r_arm"]
|
||||
var/datum/cosmetic_part/l_leg = features["cosmetic_l_leg"]
|
||||
var/datum/cosmetic_part/r_leg = features["cosmetic_r_leg"]
|
||||
WRITE_FILE(S["feature_cosmetic_head"], head.id)
|
||||
WRITE_FILE(S["feature_cosmetic_chest"], chest.id)
|
||||
WRITE_FILE(S["feature_cosmetic_l_arm"], l_arm.id)
|
||||
WRITE_FILE(S["feature_cosmetic_r_arm"], r_arm.id)
|
||||
WRITE_FILE(S["feature_cosmetic_l_leg"], l_leg.id)
|
||||
WRITE_FILE(S["feature_cosmetic_r_leg"], r_leg.id)
|
||||
WRITE_FILE(S["cosmetic_markings"], features["cosmetic_markings"])
|
||||
@@ -21,43 +21,4 @@
|
||||
name = "\improper Hellraider's Vest"
|
||||
desc = "An open leather vest with battlescarred metal shoulderpads, discovered in a dimensional anomaly. Smells of gunpowder and plasma."
|
||||
icon_state = "guncaster_alt"
|
||||
item_state = "guncaster_alt"
|
||||
|
||||
/*
|
||||
* Posshim's Corpus atire
|
||||
*/
|
||||
//Making this a subset of wintercoats/winterhoods since poss intends it to have wintercoat stats --Archie
|
||||
|
||||
/obj/item/clothing/suit/hooded/wintercoat/corpus
|
||||
name = "Standard Voidsuit"
|
||||
desc = "Standard issue voidsuit in the name of Grofit!"
|
||||
icon_state = "corpus"
|
||||
item_state = "armor"
|
||||
body_parts_covered = CHEST|GROIN|LEGS|ARMS|FEET|HANDS
|
||||
hoodtype = /obj/item/clothing/head/hooded/winterhood/corpus
|
||||
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT //"Hide shoes" but digi shoes dont get hidden, too bad!
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION //There is no need for a digi variant, it's a costume
|
||||
|
||||
/obj/item/clothing/suit/hooded/wintercoat/corpus/sec
|
||||
name = "Enforcer Voidsuit"
|
||||
desc = "Delux issue grofit voidsuit. Let the middle class know You're in charge."
|
||||
icon_state = "corpuss"
|
||||
hoodtype = /obj/item/clothing/head/hooded/winterhood/corpus/sec //Enjoy this nice red outfit Kinaris! There is NO NEED for a pink one! xoxo -VivI Fanteriso
|
||||
|
||||
/obj/item/clothing/suit/hooded/wintercoat/corpus/command
|
||||
name = "Commander Voidsuit"
|
||||
desc = "Premium issue correctional worker attire. Grease the gears of production."
|
||||
icon_state = "corpusc"
|
||||
hoodtype = /obj/item/clothing/head/hooded/winterhood/corpus/command
|
||||
|
||||
/obj/item/clothing/head/hooded/winterhood/corpus
|
||||
name = "Voidsuit helmet"
|
||||
desc = "galvanized reinforced helm to protect against the elements"
|
||||
icon_state = "corpus"
|
||||
flags_inv = HIDEHAIR|HIDEEARS|HIDEFACIALHAIR|HIDEFACE|HIDEMASK|HIDESNOUT|HIDENECK //hide your ugly face with this one simple trick!
|
||||
|
||||
/obj/item/clothing/head/hooded/winterhood/corpus/sec
|
||||
icon_state = "corpuss"
|
||||
|
||||
/obj/item/clothing/head/hooded/winterhood/corpus/command
|
||||
icon_state = "corpusc"
|
||||
item_state = "guncaster_alt"
|
||||
@@ -1,154 +0,0 @@
|
||||
/*
|
||||
COSMETIC PARTS
|
||||
|
||||
this system allows you to change the _base_ appearance of a limb independent
|
||||
of species or markings. this, for example, allows us to create "hybrids" like a
|
||||
mammal with avian legs.
|
||||
|
||||
keep in mind that this does not change the species of a leg! in the above example,
|
||||
the mammal's bird-legs are still mammal legs. this matters in some places, like
|
||||
body part transplants; mis-matched species will cause extra damage if the surgery
|
||||
fails and the part is rejected. so you can't attach mammal-bird legs to avians
|
||||
safely.
|
||||
*/
|
||||
|
||||
/datum/cosmetic_part
|
||||
/** A unique string that is used to identify this part for save files. Allows name changes without breaking saves */
|
||||
var/id
|
||||
/** The name of the cosmetic part. This shows up in the preferences dropdown. */
|
||||
var/name
|
||||
var/icon = 'hyperstation/icons/mob/char_parts.dmi'
|
||||
var/icon_state
|
||||
/** How colors are determined for this part. MUTCOLORS for base color, MATRIXED to allow multiple channels. */
|
||||
var/color_src = MUTCOLORS
|
||||
/** Whether or not this cosmetic part has an alternate form for digitigrade legs. */
|
||||
var/support_digitigrade = TRUE
|
||||
/** Species IDs that support this cosmetic part. Bypassed with "show mismatched markings" option. */
|
||||
var/list/supported_species
|
||||
|
||||
/datum/cosmetic_part/head
|
||||
/datum/cosmetic_part/chest
|
||||
/datum/cosmetic_part/arms
|
||||
/datum/cosmetic_part/legs
|
||||
|
||||
// HEADS
|
||||
// =========================================
|
||||
|
||||
/datum/cosmetic_part/head/default
|
||||
id = "default"
|
||||
name = "default"
|
||||
icon = null
|
||||
|
||||
/datum/cosmetic_part/head/ipc_round
|
||||
id = "ipc_round"
|
||||
name = "round ipc head"
|
||||
icon_state = "ipc_round"
|
||||
supported_species = list("ipc")
|
||||
|
||||
|
||||
// CHESTS
|
||||
// =========================================
|
||||
|
||||
/datum/cosmetic_part/chest/default
|
||||
id = "default"
|
||||
name = "default"
|
||||
icon = null
|
||||
|
||||
/datum/cosmetic_part/chest/ipc_sleek
|
||||
id = "ipc_sleek"
|
||||
name = "sleek ipc chest"
|
||||
icon_state = "ipc_sleek"
|
||||
supported_species = list("ipc")
|
||||
color_src = MATRIXED
|
||||
|
||||
/datum/cosmetic_part/chest/ipc_jointed
|
||||
id = "ipc_jointed"
|
||||
name = "jointed ipc chest"
|
||||
icon_state = "ipc_jointed"
|
||||
supported_species = list("ipc")
|
||||
color_src = MATRIXED
|
||||
|
||||
|
||||
// ARMS
|
||||
// =========================================
|
||||
|
||||
/datum/cosmetic_part/arms/default
|
||||
id = "default"
|
||||
name = "default"
|
||||
icon = null
|
||||
|
||||
/datum/cosmetic_part/arms/avian_alt
|
||||
id = "avian_alt"
|
||||
name = "avian claws"
|
||||
icon_state = "avian_alt"
|
||||
supported_species = list("mammal", "avian", "aquatic", "insect", "xeno", "synthliz")
|
||||
|
||||
/datum/cosmetic_part/arms/insect
|
||||
id = "insect"
|
||||
name = "insect arms"
|
||||
icon = 'modular_citadel/icons/mob/mutant_bodyparts.dmi'
|
||||
icon_state = "insect"
|
||||
supported_species = list("mammal", "avian", "aquatic", "insect", "xeno", "synthliz")
|
||||
|
||||
/datum/cosmetic_part/arms/ipc_sleek
|
||||
id = "ipc_sleek"
|
||||
name = "sleek ipc arms"
|
||||
icon_state = "ipc_sleek"
|
||||
supported_species = list("ipc")
|
||||
color_src = MATRIXED
|
||||
|
||||
/datum/cosmetic_part/arms/ipc_jointed
|
||||
id = "ipc_jointed"
|
||||
name = "jointed ipc arms"
|
||||
icon_state = "ipc_jointed"
|
||||
supported_species = list("ipc")
|
||||
color_src = MATRIXED
|
||||
|
||||
|
||||
// LEGS
|
||||
// =========================================
|
||||
|
||||
/datum/cosmetic_part/legs/default
|
||||
id = "default"
|
||||
name = "default"
|
||||
icon = null
|
||||
|
||||
/datum/cosmetic_part/legs/avian
|
||||
id = "avian"
|
||||
name = "avian legs"
|
||||
icon = 'modular_citadel/icons/mob/mutant_bodyparts.dmi'
|
||||
icon_state = "avian"
|
||||
supported_species = list("mammal", "avian", "aquatic", "insect", "xeno", "synthliz")
|
||||
support_digitigrade = FALSE
|
||||
|
||||
/datum/cosmetic_part/legs/mammal
|
||||
id = "mammal"
|
||||
name = "mammal legs"
|
||||
icon = 'modular_citadel/icons/mob/mutant_bodyparts.dmi'
|
||||
icon_state = "mammal"
|
||||
supported_species = list("mammal", "avian", "aquatic", "insect", "xeno", "synthliz")
|
||||
support_digitigrade = TRUE
|
||||
|
||||
/datum/cosmetic_part/legs/insect
|
||||
id = "insect"
|
||||
name = "insect legs"
|
||||
icon = 'modular_citadel/icons/mob/mutant_bodyparts.dmi'
|
||||
icon_state = "insect"
|
||||
supported_species = list("mammal", "avian", "aquatic", "insect", "xeno", "synthliz")
|
||||
support_digitigrade = TRUE
|
||||
|
||||
/datum/cosmetic_part/legs/ipc_sleek
|
||||
id = "ipc_sleek"
|
||||
name = "sleek ipc legs"
|
||||
icon_state = "ipc_sleek"
|
||||
supported_species = list("ipc")
|
||||
color_src = MATRIXED
|
||||
support_digitigrade = FALSE
|
||||
|
||||
/datum/cosmetic_part/legs/ipc_jointed
|
||||
id = "ipc_jointed"
|
||||
name = "jointed ipc legs"
|
||||
icon_state = "ipc_jointed"
|
||||
supported_species = list("ipc")
|
||||
color_src = MATRIXED
|
||||
support_digitigrade = FALSE
|
||||
@@ -87,11 +87,6 @@ SNOUTS
|
||||
icon_state = "feasterndnw"
|
||||
icon = 'hyperstation/icons/mob/char_snouts.dmi'
|
||||
|
||||
/datum/sprite_accessory/mam_snouts/knshuttle // Dahlular and Arcstaisia @ hyperstation, april 2022. Feel free to remove comment. Just remember this is snowflakey Kinaris stuff.
|
||||
name = "Kinaris - Shuttle (Hyper)"
|
||||
icon_state = "knshuttle"
|
||||
icon = 'hyperstation/icons/mob/char_snouts.dmi'
|
||||
|
||||
/datum/sprite_accessory/mam_snouts/fchemlight
|
||||
name = "RadDog (Top) (Hyper)"
|
||||
icon_state = "fchemlight"
|
||||
@@ -148,11 +143,6 @@ EARS
|
||||
icon_state = "easternd"
|
||||
icon = 'hyperstation/icons/mob/char_ears.dmi'
|
||||
|
||||
/datum/sprite_accessory/mam_ears/knshuttle // Dahlular and Arcstaisia @ hyperstation, april 2022. Feel free to remove comment. Just remember this is snowflakey Kinaris stuff.
|
||||
name = "Kinaris - Shuttle (Hyper)"
|
||||
icon_state = "knshuttle"
|
||||
icon = 'hyperstation/icons/mob/char_ears.dmi'
|
||||
|
||||
/datum/sprite_accessory/mam_ears/chemlight
|
||||
name = "RadDog (Hyper)"
|
||||
icon_state = "chemlight"
|
||||
@@ -195,13 +185,6 @@ WINGS
|
||||
icon_state = "insect"
|
||||
icon = 'hyperstation/icons/mob/char_wings.dmi'
|
||||
|
||||
/datum/sprite_accessory/deco_wings/knshuttle // Dahlular and Arcstaisia @ hyperstation, april 2022. Feel free to remove comment. Just remember this is snowflakey Kinaris stuff.
|
||||
name = "Kinaris - Shuttle (Hyper)"
|
||||
icon_state = "knshuttle"
|
||||
icon = 'hyperstation/icons/mob/char_wings.dmi'
|
||||
//recommended_species = list("synthliz") need to give synths a deco wing slot
|
||||
color_src = MATRIXED
|
||||
|
||||
/datum/sprite_accessory/deco_wings/minibat // sarcoph @ hyperstation, march 2022
|
||||
name = "Mini Bat (Hyper)"
|
||||
icon_state = "minibat"
|
||||
@@ -341,18 +324,6 @@ TAILS + ANIMATED TAILS
|
||||
icon_state = "easternd"
|
||||
icon = 'hyperstation/icons/mob/char_tails.dmi'
|
||||
|
||||
/datum/sprite_accessory/mam_tails/knshuttle // Dahlular and Arcstaisia @ hyperstation, april 2022. Feel free to remove comment. Just remember this is snowflakey Kinaris stuff.
|
||||
name = "Kinaris - Shuttle (Hyper)"
|
||||
icon_state = "knshuttle"
|
||||
icon = 'hyperstation/icons/mob/char_tails.dmi'
|
||||
recommended_species = list("synthliz")
|
||||
|
||||
/datum/sprite_accessory/mam_tails_animated/knshuttle
|
||||
name = "Kinaris - Shuttle (Hyper)"
|
||||
icon_state = "knshuttle"
|
||||
icon = 'hyperstation/icons/mob/char_tails.dmi'
|
||||
recommended_species = list("synthliz")
|
||||
|
||||
/datum/sprite_accessory/mam_tails/chemlight
|
||||
name = "RadDog (Hyper)"
|
||||
icon_state = "chemlight"
|
||||
@@ -427,11 +398,6 @@ from modular_citadel/code/modules/mob/dead/new_player/sprite_accessories.dm:
|
||||
icon_state = "easternd"
|
||||
icon = 'hyperstation/icons/mob/char_markings.dmi'
|
||||
|
||||
/datum/sprite_accessory/mam_body_markings/knshuttle // Dahlular and Arcstaisia @ hyperstation, april 2022. Feel free to remove comment. Just remember this is snowflakey Kinaris stuff.
|
||||
name = "Kinaris - Shuttle (Hyper)"
|
||||
icon_state = "knshuttle"
|
||||
icon = 'hyperstation/icons/mob/char_markings.dmi'
|
||||
|
||||
//doged was here
|
||||
/datum/sprite_accessory/mam_body_markings/chemlight
|
||||
name = "RadDog (Hyper)"
|
||||
@@ -475,92 +441,6 @@ from modular_citadel/code/modules/mob/dead/new_player/sprite_accessories.dm:
|
||||
taur_mode = PAW_TAURIC
|
||||
ckeys_allowed = list("chemlight")
|
||||
|
||||
|
||||
/*
|
||||
IPCS
|
||||
==========================================================
|
||||
*/
|
||||
|
||||
/*
|
||||
from modular_citadel/code/modules/mob/dead/new_player/sprite_accessories.dm:
|
||||
|
||||
/datum/sprite_accessory/antenna
|
||||
icon = 'modular_citadel/icons/mob/ipc_antennas.dmi'
|
||||
color_src = MUTCOLORS3
|
||||
recommended_species = list("ipc")
|
||||
|
||||
/datum/sprite_accessory/screen
|
||||
icon = 'modular_citadel/icons/mob/ipc_screens.dmi'
|
||||
color_src = null
|
||||
*/
|
||||
|
||||
/datum/sprite_accessory/antenna/idog_down
|
||||
name = "Dog, down (Hyper)"
|
||||
icon_state = "idog_down"
|
||||
color_src = MATRIXED
|
||||
|
||||
/datum/sprite_accessory/antenna/idog_up
|
||||
name = "Dog, up (Hyper)"
|
||||
icon_state = "idog_up"
|
||||
color_src = MATRIXED
|
||||
|
||||
/datum/sprite_accessory/antenna/headset
|
||||
name = "Headphones (Hyper)"
|
||||
icon_state = "headset"
|
||||
color_src = MATRIXED
|
||||
|
||||
/datum/sprite_accessory/antenna/aquatic
|
||||
name = "Fins (Hyper)"
|
||||
icon_state = "aquatic"
|
||||
color_src = MATRIXED
|
||||
|
||||
/datum/sprite_accessory/screen/ghost
|
||||
name = "Ghost (Hyper)"
|
||||
icon_state = "ghost"
|
||||
|
||||
/datum/sprite_accessory/screen/heartbeat
|
||||
name = "Heartbeat (Hyper)"
|
||||
icon_state = "heartbeat"
|
||||
|
||||
/datum/sprite_accessory/screen/ocean
|
||||
name = "Ocean (Hyper)"
|
||||
icon_state = "ocean"
|
||||
|
||||
/datum/sprite_accessory/antenna/catears
|
||||
name = "Pointy Ears (Hyper)"
|
||||
icon_state = "catears"
|
||||
color_src = MATRIXED
|
||||
|
||||
/datum/sprite_accessory/screen/valley
|
||||
name = "Valley (Hyper)"
|
||||
icon_state = "valley"
|
||||
|
||||
/datum/sprite_accessory/screen/visor
|
||||
name = "Black Visor (Hyper)"
|
||||
icon = 'hyperstation/icons/mob/ipc_screen_visor.dmi'
|
||||
icon_state = "visor_black"
|
||||
|
||||
/datum/sprite_accessory/screen/visor/blue
|
||||
name = "Blue Visor (Hyper)"
|
||||
icon_state = "visor_blue"
|
||||
|
||||
/datum/sprite_accessory/screen/visor/green
|
||||
name = "Green Visor (Hyper)"
|
||||
icon_state = "visor_green"
|
||||
|
||||
/datum/sprite_accessory/screen/visor/red
|
||||
name = "Red Visor (Hyper)"
|
||||
icon_state = "visor_red"
|
||||
|
||||
/datum/sprite_accessory/screen/visor/white
|
||||
name = "White Visor (Hyper)"
|
||||
icon_state = "visor_white"
|
||||
|
||||
/datum/sprite_accessory/screen/visor/yellow
|
||||
name = "Yellow Visor (Hyper)"
|
||||
icon_state = "visor_yellow"
|
||||
|
||||
|
||||
/*
|
||||
HAIRSTYLES
|
||||
==========================================================
|
||||
@@ -600,4 +480,4 @@ from code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm:
|
||||
|
||||
/datum/sprite_accessory/hair/emoh
|
||||
name = "Emo (Hyper)"
|
||||
icon_state = "hair_emoh"
|
||||
icon_state = "hair_emoh"
|
||||
@@ -13,11 +13,6 @@
|
||||
/mob/living/carbon/handle_status_effects()
|
||||
..()
|
||||
handle_pain()
|
||||
|
||||
/mob/living/carbon/has_mouth()
|
||||
var/obj/item/bodypart/head/head = get_bodypart(BODY_ZONE_HEAD)
|
||||
if(head && head.mouth)
|
||||
return TRUE
|
||||
|
||||
/mob/living/carbon/proc/handle_pain()
|
||||
var/pain_amount = 0
|
||||
|
||||
@@ -1,17 +0,0 @@
|
||||
/obj/item/bodypart/proc/apply_cosmetic(datum/cosmetic_part/part)
|
||||
if(!is_organic_limb() || animal_origin || !part)
|
||||
return
|
||||
cosmetic_icon = part
|
||||
|
||||
|
||||
/mob/living/carbon/human/proc/handle_cosmetic_parts()
|
||||
var/features = dna.features
|
||||
var/list/body_zones = list(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
|
||||
for(var/zone in body_zones)
|
||||
var/datum/cosmetic_part/cosmetic_pref = features["cosmetic_" + zone]
|
||||
if(!istype(cosmetic_pref, /datum/cosmetic_part))
|
||||
continue
|
||||
var/datum/cosmetic_part/part = cosmetic_pref
|
||||
var/obj/item/bodypart/body_part = get_bodypart(zone)
|
||||
if(body_part && part)
|
||||
body_part.apply_cosmetic(part)
|
||||
@@ -1,58 +0,0 @@
|
||||
// APC powercord: oracle port
|
||||
|
||||
/obj/item/apc_powercord
|
||||
name = "power cord"
|
||||
desc = "An internal power cord hooked up to a battery. Useful if you run on electricity. Not so much otherwise."
|
||||
icon = 'icons/obj/power.dmi'
|
||||
icon_state = "wire1"
|
||||
|
||||
|
||||
/obj/item/apc_powercord/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
|
||||
if(!istype(target, /obj/machinery/power/apc) || !ishuman(user) || !proximity_flag)
|
||||
return ..()
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
var/mob/living/carbon/human/H = user
|
||||
var/obj/item/organ/stomach/cell/battery = H.getorganslot(ORGAN_SLOT_STOMACH)
|
||||
if(!battery)
|
||||
to_chat(H, "<span class='warning'>You try to siphon energy from \the [target], but your power cell is gone!</span>")
|
||||
return
|
||||
|
||||
if(istype(H) && H.nutrition >= NUTRITION_LEVEL_ALMOST_FULL)
|
||||
to_chat(user, "<span class='warning'>You are already fully charged!</span>")
|
||||
return
|
||||
|
||||
if(istype(target, /obj/machinery/power/apc))
|
||||
var/obj/machinery/power/apc/A = target
|
||||
if(A.cell && A.cell.charge > A.cell.maxcharge*0.25)
|
||||
powerdraw_loop(A, H)
|
||||
return
|
||||
else
|
||||
to_chat(user, "<span class='warning'>There is not enough charge to draw from that APC.</span>")
|
||||
return
|
||||
|
||||
|
||||
/obj/item/apc_powercord/proc/powerdraw_loop(obj/machinery/power/apc/A, mob/living/carbon/human/H)
|
||||
H.visible_message("<span class='notice'>[H] inserts a power connector into the [A].</span>", "<span class='notice'>You begin to draw power from the [A].</span>")
|
||||
while(do_after(H, 10, target = A))
|
||||
if(!istype(A))
|
||||
return
|
||||
if(loc != H)
|
||||
to_chat(H, "<span class='warning'>You must keep your connector out while charging!</span>")
|
||||
break
|
||||
if(A.cell.charge == 0)
|
||||
to_chat(H, "<span class='warning'>The [A] doesn't have enough charge to spare.</span>")
|
||||
break
|
||||
A.charging = 1
|
||||
if(A.cell.charge >= 500)
|
||||
H.nutrition += 50
|
||||
A.cell.charge -= 250
|
||||
to_chat(H, "<span class='notice'>You siphon off some of the stored charge for your own use.</span>")
|
||||
else
|
||||
H.nutrition += A.cell.charge/10
|
||||
A.cell.charge = 0
|
||||
to_chat(H, "<span class='notice'>You siphon off as much as the [A] can spare.</span>")
|
||||
break
|
||||
if(H.nutrition > NUTRITION_LEVEL_WELL_FED)
|
||||
to_chat(H, "<span class='notice'>You are now fully charged.</span>")
|
||||
break
|
||||
H.visible_message("<span class='notice'>[H] unplugs from the [A].</span>", "<span class='notice'>You unplug from the [A].</span>")
|
||||
@@ -1,8 +0,0 @@
|
||||
/mob/living/silicon/robot/proc/examine_bellies_borg()
|
||||
|
||||
var/message = ""
|
||||
for(var/belly in vore_organs)
|
||||
var/obj/belly/B = belly
|
||||
message += B.get_examine_msg()
|
||||
|
||||
return message
|
||||
@@ -1,3 +1,3 @@
|
||||
//This file is empty right now, but leaves room for people to put shit here in the future for those who are lazy
|
||||
/mob/living/silicon/robot
|
||||
var/datum/action/cyborg_small_sprite/small_sprite_action //This gets replaced every time the cyborg changes modules --Cyanosis
|
||||
var/datum/action/cyborg_small_sprite/small_sprite_action //This gets replaced every time the cyborg changes modules --Cyanosis
|
||||
@@ -1,60 +1,11 @@
|
||||
//This file is empty right now, but leaves room for people to put shit here in the future for those who are lazy
|
||||
|
||||
/obj/item/robot_module
|
||||
var/list/added_channels = list() //Borg radio stuffs
|
||||
|
||||
//service
|
||||
/obj/item/robot_module/butler
|
||||
added_channels = list(RADIO_CHANNEL_SERVICE = 1)
|
||||
|
||||
/obj/item/robot_module/clown
|
||||
added_channels = list(RADIO_CHANNEL_SERVICE = 1)
|
||||
|
||||
/obj/item/robot_module/janitor
|
||||
added_channels = list(RADIO_CHANNEL_SERVICE = 1)
|
||||
|
||||
//engineering
|
||||
/obj/item/robot_module/engineering
|
||||
added_channels = list(RADIO_CHANNEL_ENGINEERING = 1)
|
||||
|
||||
//medical
|
||||
/obj/item/robot_module/medical
|
||||
added_channels = list(RADIO_CHANNEL_MEDICAL = 1)
|
||||
|
||||
//security
|
||||
/obj/item/robot_module/peacekeeper
|
||||
added_channels = list(RADIO_CHANNEL_SECURITY = 1)
|
||||
|
||||
/obj/item/robot_module/security
|
||||
added_channels = list(RADIO_CHANNEL_SECURITY = 1)
|
||||
|
||||
//supply
|
||||
/obj/item/robot_module/miner
|
||||
added_channels = list(RADIO_CHANNEL_SUPPLY = 1) // Probably already handled by other code when spawned with pre-set module, but whatever.
|
||||
|
||||
//dogborgs
|
||||
/obj/item/robot_module/k9
|
||||
added_channels = list(RADIO_CHANNEL_SECURITY = 1)
|
||||
|
||||
/obj/item/robot_module/medihound
|
||||
added_channels = list(RADIO_CHANNEL_MEDICAL = 1)
|
||||
|
||||
/obj/item/robot_module/scrubpup
|
||||
added_channels = list(RADIO_CHANNEL_SERVICE = 1)
|
||||
|
||||
/obj/item/robot_module/borgi
|
||||
added_channels = list(RADIO_CHANNEL_SERVICE = 1)
|
||||
|
||||
/obj/item/robot_module/orepup
|
||||
added_channels = list(RADIO_CHANNEL_SUPPLY = 1)
|
||||
|
||||
|
||||
//This proc gets called whenever a new robot module is being applied --Cyanosis
|
||||
/obj/item/robot_module/proc/handle_sprite_action(mob/living/silicon/robot/R, is_huge = FALSE)
|
||||
ASSERT(istype(R))
|
||||
if(R.small_sprite_action)
|
||||
QDEL_NULL(R.small_sprite_action)
|
||||
if(!is_huge) //only from the expander upgrade. The borg won't have an action if they don't have the expander upgrade
|
||||
if(!is_huge) //only from the expander upgrade. The borg won't have an action if they don't have the expander upgrade
|
||||
return
|
||||
for(var/P in typesof(/datum/action/cyborg_small_sprite))
|
||||
var/datum/action/cyborg_small_sprite/action = P
|
||||
|
||||
@@ -241,6 +241,6 @@
|
||||
|
||||
/mob/living/simple_animal/chicken/examine()
|
||||
. = ..()
|
||||
. += "<span class='notice'>This one is [gender].</span>"
|
||||
. += "this one is [gender]."
|
||||
if(happiness<20)
|
||||
. += "<span class='warning'>It looks stressed.</span>"
|
||||
|
||||
@@ -27,7 +27,3 @@ mob/proc/checkloadappearance()
|
||||
else
|
||||
to_chat(H, "<span class='boldannounce'>You either took too long or chose not to change. Alrighty. Remember, you have 90 seconds from spawn to get to a mirror and still do it if you wish.</span>")
|
||||
return
|
||||
|
||||
// oracle port
|
||||
/mob/proc/has_mouth()
|
||||
return FALSE
|
||||
@@ -1,69 +0,0 @@
|
||||
/datum/design/ipc_liver
|
||||
name = "IPC Reagent Processor"
|
||||
id = "ipc_liver"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 2000, MAT_GLASS = 1000)
|
||||
build_path = /obj/item/organ/liver/ipc
|
||||
category = list("Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
|
||||
construction_time = 100
|
||||
|
||||
/datum/design/ipc_eyes
|
||||
name = "IPC Eyes"
|
||||
id = "ipc_eyes"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 1000, MAT_GLASS = 2000)
|
||||
build_path = /obj/item/organ/eyes/ipc
|
||||
category = list("Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
|
||||
construction_time = 100
|
||||
|
||||
/datum/design/ipc_tongue
|
||||
name = "Positronic Voicebox"
|
||||
id = "ipc_tongue"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 2000, MAT_GLASS = 1000)
|
||||
build_path = /obj/item/organ/tongue/robot/ipc
|
||||
category = list("Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
|
||||
construction_time = 100
|
||||
|
||||
/datum/design/ipc_stomach
|
||||
name = "Micro-cell"
|
||||
id = "ipc_stomach"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 2000, MAT_GLASS = 1000, MAT_PLASMA = 200)
|
||||
build_path = /obj/item/organ/stomach/cell
|
||||
category = list("Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
|
||||
construction_time = 100
|
||||
|
||||
/datum/design/synthliz_stomach
|
||||
name = "Synthetic Lizardperson Stomach"
|
||||
id = "synthliz_stomach"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 2000, MAT_GLASS = 1000)
|
||||
build_path = /obj/item/organ/stomach/synthliz
|
||||
category = list("Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
|
||||
construction_time = 100
|
||||
|
||||
/datum/design/power_cord
|
||||
name = "IPC Power Cord"
|
||||
id = "power_cord"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(MAT_METAL = 2000, MAT_GLASS = 1000)
|
||||
build_path = /obj/item/organ/cyberimp/arm/power_cord
|
||||
category = list("Medical Designs")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
|
||||
construction_time = 100
|
||||
|
||||
|
||||
/datum/techweb_node/ipc_organs
|
||||
id = "ipc_organs"
|
||||
display_name = "IPC Parts"
|
||||
description = "We have the technology to replace him."
|
||||
prereq_ids = list("cyber_organs","robotics")
|
||||
design_ids = list("ipc_liver", "ipc_eyes", "ipc_tongue", "ipc_stomach", "synthliz_stomach", "power_cord")
|
||||
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1500)
|
||||
export_price = 5000
|
||||
@@ -23,11 +23,3 @@
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
sharpness = IS_SHARP_ACCURATE
|
||||
attack_verb = list("slashed", "cut")
|
||||
|
||||
|
||||
// oracle port
|
||||
/obj/item/organ/cyberimp/arm/power_cord
|
||||
name = "power cord implant"
|
||||
desc = "An internal power cord hooked up to a battery. Useful if you run on volts."
|
||||
contents = newlist(/obj/item/apc_powercord)
|
||||
zone = "l_arm"
|
||||
@@ -115,6 +115,7 @@ obj/item/condom/update_icon()
|
||||
return
|
||||
if(!P.condom)
|
||||
return
|
||||
|
||||
var/obj/item/condom/filled/C = new
|
||||
P.linked_organ.reagents.trans_to(C, P.linked_organ.reagents.total_volume)
|
||||
C.loc = loc
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/obj/item/reagent_containers/food/snacks/grown/wheat
|
||||
var/stacktype = /obj/item/stack/tile/hay
|
||||
/obj/item/reagent_containers/food/snacks/grown/wheat/
|
||||
var stacktype = /obj/item/stack/tile/hay
|
||||
var/tile_coefficient = 0.02 // same as grass
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/grown/wheat/attack_self(mob/user)
|
||||
|
||||
@@ -45,9 +45,11 @@
|
||||
inuse = 1
|
||||
if(!(C == user)) //if we are targeting someone else.
|
||||
C.visible_message("<span class='userlove'>[user] is trying to use [src] on [C]'s penis.</span>", "<span class='userlove'>[user] is trying to use [src] on your penis.</span>")
|
||||
|
||||
if(!do_mob(user, C, 3 SECONDS)) //3 second delay
|
||||
inuse = 0
|
||||
return
|
||||
|
||||
//checked if not used on yourself, if not, carry on.
|
||||
playsound(src, 'sound/lewd/slaps.ogg', 30, 1, -1) //slapping sound
|
||||
inuse = 0
|
||||
@@ -55,22 +57,27 @@
|
||||
C.visible_message("<span class='userlove'>[user] pumps [src] on [C]'s penis.</span>", "<span class='userlove'>[user] pumps [src] up and down on your penis.</span>")
|
||||
else
|
||||
user.visible_message("<span class='userlove'>[user] pumps [src] on their penis.</span>", "<span class='userlove'>You pump the fleshlight on your penis.</span>")
|
||||
|
||||
if(prob(30)) //30% chance to make them moan.
|
||||
C.emote("moan")
|
||||
|
||||
C.do_jitter_animation()
|
||||
C.adjustArousalLoss(20) //make the target more aroused.
|
||||
if(C.can_orgasm() && ishuman(C))
|
||||
var/mob/living/carbon/human/user_human = C
|
||||
user_human.mob_climax_outside(P, mb_time=0) // instant, because we already did a warmup
|
||||
if (C.getArousalLoss() >= 100 && ishuman(C) && C.has_dna())
|
||||
C.mob_climax(forced_climax=TRUE) //make them cum if they are over the edge.
|
||||
|
||||
return
|
||||
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You don't see anywhere to use this on.</span>")
|
||||
|
||||
inuse = 0
|
||||
..()
|
||||
|
||||
|
||||
//Hyperstation 13 portal fleshlight
|
||||
//kinky!
|
||||
|
||||
/obj/item/portallight
|
||||
name = "portal fleshlight"
|
||||
desc = "A silver love(TM) fleshlight, used to stimulate someones penis, with bluespace tech that allows lovers to hump at a distance."
|
||||
@@ -88,6 +95,7 @@
|
||||
var/paired = 0
|
||||
var/obj/item/portalunderwear
|
||||
var/useable = FALSE
|
||||
var/option = ""
|
||||
|
||||
/obj/item/portallight/examine(mob/user)
|
||||
. = ..()
|
||||
@@ -96,109 +104,136 @@
|
||||
else
|
||||
. += "<span class='notice'>The device is paired, and awaiting input. </span>"
|
||||
|
||||
/obj/item/portallight/attack(mob/living/carbon/user, mob/living/holder)
|
||||
/obj/item/portallight/attack(mob/living/carbon/C, mob/living/user) //use portallight! nearly the same as the fleshlight apart from you have a buddy!
|
||||
var/obj/item/organ/genital/penis/P = C.getorganslot("penis")
|
||||
|
||||
if(inuse) //just to stop stacking and causing people to cum instantly
|
||||
return
|
||||
if(!UpdateUsability())
|
||||
to_chat(holder, "<span class='notice'>\The [src] appears to be currently unusable.</span>")
|
||||
return
|
||||
var/option = "Fuck"
|
||||
if(user == holder)
|
||||
if(!useable)
|
||||
to_chat(user, "<span class='notice'>It seems the device has failed or your partner is not wearing their device.</span>")
|
||||
|
||||
if(C == user)//if your using it on yourself, more options! otherwise, just fuck.
|
||||
option = input(usr, "Choose action", "Portal Fleshlight", "Fuck") in list("Fuck", "Lick", "Touch")
|
||||
var/obj/item/organ/genital/target_genital = portalunderwear.loc
|
||||
var/mob/living/carbon/human/target = target_genital.owner
|
||||
var/obj/item/organ/genital/penis/P = user.getorganslot("penis")
|
||||
if(option == "Fuck" && !P.is_exposed())
|
||||
to_chat(holder, "<span class='notice'>You don't see anywhere to use this on.</span>")
|
||||
else
|
||||
option = "Fuck"
|
||||
|
||||
var/obj/item/organ/genital/G
|
||||
if(istype(portalunderwear.loc, /obj/item/organ/genital)) //Sanity check. Without this it will runtime error.
|
||||
G = portalunderwear.loc
|
||||
if(!G)
|
||||
return
|
||||
/*
|
||||
WARMUP START - prevents spam/instant climax
|
||||
*/
|
||||
inuse = TRUE
|
||||
if(user != holder)
|
||||
user.visible_message("<span class='userlove'>[holder] is trying to use [src] on [user]'s penis.</span>",\
|
||||
"<span class='userlove'>[holder] is trying to use [src] on your penis.</span>")
|
||||
if(!do_mob(holder, user, 3 SECONDS))
|
||||
inuse = FALSE
|
||||
var/mob/living/carbon/human/M = G.owner
|
||||
|
||||
if(option == "Fuck"&&!P.is_exposed()) //we are trying to fuck with no penis!
|
||||
to_chat(user, "<span class='notice'>You don't see anywhere to use this on.</span>")
|
||||
return
|
||||
else //other options dont need checks
|
||||
inuse = 1
|
||||
if(!(C == user)) //if we are targeting someone else.
|
||||
C.visible_message("<span class='userlove'>[user] is trying to use [src] on [C]'s penis.</span>", "<span class='userlove'>[user] is trying to use [src] on your penis.</span>")
|
||||
|
||||
if(!do_mob(user, C, 3 SECONDS)) //3 second delay
|
||||
inuse = 0
|
||||
return
|
||||
|
||||
//checked if not used on yourself, if not, carry on.
|
||||
if(option == "Fuck")
|
||||
playsound(src, 'sound/lewd/slaps.ogg', 30, 1, -1) //slapping sound for fuck.
|
||||
|
||||
inuse = 0
|
||||
if(!(C == user))
|
||||
C.visible_message("<span class='userlove'>[user] pumps [src] on [C]'s penis.</span>", "<span class='userlove'>[user] pumps [src] up and down on your penis.</span>")
|
||||
else
|
||||
if(option == "Fuck")
|
||||
user.visible_message("<span class='userlove'>[user] pumps [src] on their penis.</span>", "<span class='userlove'>You pump the fleshlight on your penis.</span>")
|
||||
if(option == "Lick")
|
||||
user.visible_message("<span class='userlove'>[user] licks into [src].</span>", "<span class='userlove'>You lick into [src].</span>")
|
||||
if(option == "Touch")
|
||||
user.visible_message("<span class='userlove'>[user] touches softly against [src].</span>", "<span class='userlove'>You touch softly on [src].</span>")
|
||||
|
||||
|
||||
if(prob(30)) //30% chance to make your partner moan.
|
||||
M.emote("moan")
|
||||
|
||||
if(option == "Fuck")// normal fuck
|
||||
to_chat(M, "<span class='love'>You feel a [P.length] inch, [P.shape] shaped penis pumping through the portal into your [G.name].</span>")//message your partner, and kinky!
|
||||
if(prob(30)) //30% chance to make them moan.
|
||||
C.emote("moan")
|
||||
if(prob(30)) //30% chance to make your partner moan.
|
||||
M.emote("moan")
|
||||
C.adjustArousalLoss(20)
|
||||
M.adjustArousalLoss(20)
|
||||
M.do_jitter_animation() //make your partner shake too!
|
||||
|
||||
if (M.getArousalLoss() >= 100 && ishuman(M) && prob(5))//Why not have a probability to cum when someone's getting nailed with max arousal?~
|
||||
if(G.is_exposed()) //Oh yea, if vagina is not exposed, the climax will not cause a spill
|
||||
M.mob_climax_outside(G, spillage = TRUE)
|
||||
else
|
||||
M.mob_climax_outside(G, spillage = FALSE)
|
||||
|
||||
if (C.getArousalLoss() >= 100 && ishuman(C) && C.has_dna())
|
||||
var/mob/living/carbon/human/O = C
|
||||
|
||||
if( (P.condom == 1) || (P.sounding == 1)) //If coundomed and/or sounded, do not fire impreg chance
|
||||
O.mob_climax_partner(P, M, FALSE, FALSE, FALSE, TRUE)
|
||||
else //Else, fire impreg chance
|
||||
if(G.name == "vagina") //no more spontaneous impregnations through the butt!
|
||||
O.mob_climax_partner(P, M, FALSE, TRUE, FALSE, TRUE)
|
||||
else
|
||||
O.mob_climax_partner(P, M, FALSE, FALSE, FALSE, TRUE)
|
||||
|
||||
if(option == "Lick")
|
||||
to_chat(M, "<span class='love'>You feel a tongue lick you through the portal against your [G.name].</span>")
|
||||
M.adjustArousalLoss(10)
|
||||
if(option == "Touch")
|
||||
to_chat(M, "<span class='love'>You feel someone touching your [G.name] through the portal.</span>")
|
||||
M.adjustArousalLoss(5)
|
||||
|
||||
return
|
||||
inuse = FALSE
|
||||
/*
|
||||
WARMUP END - proceed with the action
|
||||
*/
|
||||
switch(option)
|
||||
if("Fuck")
|
||||
playsound(src, 'sound/lewd/slaps.ogg', 30, 1, -1)
|
||||
if(user == holder)
|
||||
holder.visible_message("<span class='userlove'>[holder] pumps [src] on their penis.</span>",
|
||||
"<span class='userlove'>You pump the fleshlight on your penis.</span>")
|
||||
else
|
||||
user.visible_message("<span class='userlove'>[holder] pumps [src] on [user]'s penis.</span>",\
|
||||
"<span class='userlove'>[holder] pumps [src] up and down on your penis.</span>")
|
||||
to_chat(target, "<span class='love'>You feel a [P.length] inch, [P.shape] shaped penis pumping through the portal into your [target_genital.name].</span>")
|
||||
if(prob(30))
|
||||
user.emote("moan")
|
||||
user.adjustArousalLoss(20)
|
||||
target.adjustArousalLoss(20)
|
||||
target.do_jitter_animation()
|
||||
if(target.can_orgasm() && prob(5))
|
||||
target.mob_climax_outside(target_genital, spillage=target_genital.is_exposed())
|
||||
if(user.can_orgasm())
|
||||
var/mob/living/carbon/human/O = user
|
||||
var/impreg_chance = target_genital.name == "vagina" && !P.condom && !P.sounding
|
||||
if(O.mob_climax_in_partner(P, target, spillage=FALSE, remote=TRUE) && impreg_chance)
|
||||
target.impregnate(by=O)
|
||||
if("Lick")
|
||||
holder.visible_message("<span class='userlove'>[holder] licks into [src].</span>",\
|
||||
"<span class='userlove'>You lick into [src].</span>")
|
||||
to_chat(target, "<span class='love'>You feel a tongue lick you through the portal against your [target_genital.name].</span>")
|
||||
target.adjustArousalLoss(10)
|
||||
if("Touch")
|
||||
holder.visible_message("<span class='userlove'>[holder] touches softly against [src].</span>",\
|
||||
"<span class='userlove'>You touch softly on [src].</span>")
|
||||
to_chat(target, "<span class='love'>You feel someone touching your [target_genital.name] through the portal.</span>")
|
||||
target.adjustArousalLoss(5)
|
||||
if(prob(30))
|
||||
target.emote("moan")
|
||||
..()
|
||||
|
||||
/obj/item/portallight/proc/updatesleeve()
|
||||
//get their looks and vagina colour!
|
||||
cut_overlays()
|
||||
if(!UpdateUsability())
|
||||
cut_overlays()//remove current overlays
|
||||
|
||||
var/obj/item/organ/genital/G
|
||||
if(istype(portalunderwear.loc, /obj/item/organ/genital)) //Sanity check. Without this it will runtime.
|
||||
G = portalunderwear.loc
|
||||
if(!G)
|
||||
useable = FALSE
|
||||
return
|
||||
var/obj/item/organ/genital/G = portalunderwear.loc
|
||||
var/mob/living/carbon/human/H = G.owner // H is verified by UpdateUsability()
|
||||
var/sleeve_species = "normal"
|
||||
switch(H.dna.species.name)
|
||||
if("Lizardperson")
|
||||
sleeve_species = "lizard"
|
||||
if("Slimeperson")
|
||||
sleeve_species = "slime"
|
||||
if("Avian")
|
||||
sleeve_species = "avian"
|
||||
sleeve = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "portal_sleeve_[sleeve_species]")
|
||||
sleeve.color = "#" + H.dna.features["mcolor"]
|
||||
add_overlay(sleeve)
|
||||
if(G.name == "vagina")
|
||||
organ = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "portal_vag")
|
||||
organ.color = portalunderwear.loc.color
|
||||
if(G.name == "anus")
|
||||
organ = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "portal_anus")
|
||||
organ.color = "#" + H.dna.features["mcolor"]
|
||||
add_overlay(organ)
|
||||
|
||||
/obj/item/portallight/proc/UpdateUsability()
|
||||
var/useable = FALSE
|
||||
if(portalunderwear && istype(portalunderwear.loc, /obj/item/organ/genital))
|
||||
var/obj/item/organ/genital/loc_genitals = portalunderwear.loc
|
||||
if(loc_genitals.owner && ishuman(loc_genitals.owner))
|
||||
useable = TRUE
|
||||
src.useable = useable
|
||||
return useable
|
||||
var/mob/living/carbon/human/H = G.owner
|
||||
|
||||
if(H) //if the portal panties are on someone.
|
||||
sleeve = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "portal_sleeve_normal")
|
||||
if(H.dna.species.name == "Lizardperson") // lizard nerd
|
||||
sleeve = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "portal_sleeve_lizard")
|
||||
|
||||
if(H.dna.species.name == "Slimeperson") // slime nerd
|
||||
sleeve = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "portal_sleeve_slime")
|
||||
|
||||
if(H.dna.species.name == "Avian") // bird nerd
|
||||
sleeve = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "portal_sleeve_avian")
|
||||
|
||||
sleeve.color = "#" + H.dna.features["mcolor"]
|
||||
add_overlay(sleeve)
|
||||
|
||||
if(G.name == "vagina")
|
||||
organ = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "portal_vag")
|
||||
organ.color = portalunderwear.loc.color
|
||||
if(G.name == "anus")
|
||||
organ = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "portal_anus")
|
||||
organ.color = "#" + H.dna.features["mcolor"]
|
||||
|
||||
useable = TRUE
|
||||
add_overlay(organ)
|
||||
else
|
||||
useable = FALSE
|
||||
|
||||
//Hyperstation 13 portal underwear
|
||||
//can be attached to vagina or anus, just like the vibrator, still requires pairing with the portallight
|
||||
|
||||
/obj/item/portalpanties
|
||||
name = "portal panties"
|
||||
desc = "A silver love(TM) pair of portal underwear, with bluespace tech allows lovers to hump at a distance. Needs to be paired with a portal fleshlight before use."
|
||||
@@ -217,6 +252,7 @@
|
||||
else
|
||||
. += "<span class='notice'>The device is paired, and awaiting attachment. </span>"
|
||||
|
||||
|
||||
/obj/item/portalpanties/attackby(obj/item/I, mob/living/user) //pairing
|
||||
if(istype(I, /obj/item/portallight))
|
||||
var/obj/item/portallight/P = I
|
||||
@@ -232,9 +268,11 @@
|
||||
..() //just allows people to hit it with other objects, if they so wished.
|
||||
|
||||
/obj/item/portalpanties/attack(mob/living/carbon/C, mob/living/user)
|
||||
|
||||
if(!portallight) //we arent paired yet! noobie trap, let them know.
|
||||
to_chat(user, "<span class='warning'>[src] can only be attached once paired with a portal fleshlight.</span>")
|
||||
return
|
||||
|
||||
var/obj/item/organ/genital/picked_organ
|
||||
var/mob/living/carbon/human/S = user
|
||||
var/mob/living/carbon/human/T = C
|
||||
@@ -244,17 +282,21 @@
|
||||
"<span class='warning'>[user] is trying to put [src] on you!</span>")
|
||||
if(!do_mob(user, C, 3 SECONDS))//warn them and have a delay of 5 seconds to apply.
|
||||
return
|
||||
|
||||
if((picked_organ.name == "vagina")||(picked_organ.name == "anus")) //only fits on a vagina or anus
|
||||
|
||||
src.shapetype = picked_organ.name
|
||||
if(!picked_organ.equipment)
|
||||
to_chat(user, "<span class='love'>You wrap [src] around [T]'s [picked_organ.name].</span>")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>They already have [picked_organ.equipment.name] there.</span>")
|
||||
return
|
||||
|
||||
if(!user.transferItemToLoc(src, picked_organ)) //check if you can put it in
|
||||
return
|
||||
src.attached = TRUE
|
||||
picked_organ.equipment = src
|
||||
|
||||
var/obj/item/portallight/P = portallight
|
||||
//now we need to send what they look like, but saddly if the person changes colour for what ever reason, it wont update. but dont tell people shh.
|
||||
if(P) //just to make sure
|
||||
@@ -270,7 +312,6 @@
|
||||
var/obj/item/portallight/P = portallight
|
||||
P.updatesleeve()
|
||||
|
||||
|
||||
/obj/item/storage/box/portallight
|
||||
name = "Portal Fleshlight and Underwear"
|
||||
icon = 'hyperstation/icons/obj/fleshlight.dmi'
|
||||
|
||||
@@ -160,6 +160,9 @@ obj/item/clothing/neck/stole/black
|
||||
var/firstpickup = TRUE
|
||||
var/pickupsound = TRUE
|
||||
|
||||
/obj/item/clothing/under/vaultsuit/no_sound
|
||||
pickupsound = FALSE
|
||||
|
||||
/obj/item/clothing/under/vaultsuit/equipped(mob/user, slot)
|
||||
. = ..()
|
||||
if(!pickupsound)
|
||||
@@ -195,44 +198,3 @@ obj/item/clothing/neck/stole/black
|
||||
body_parts_covered = CHEST|LEGS|ARMS
|
||||
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
|
||||
|
||||
/obj/item/clothing/suit/threepwoodjacket
|
||||
name = "threepwood's jacket"
|
||||
desc = "A jacket fit for a Mighty Pirate!"
|
||||
icon = 'hyperstation/icons/obj/clothing/suits.dmi'
|
||||
icon_state = "threepwoodjacket"
|
||||
alternate_worn_icon = 'hyperstation/icons/mobs/suits.dmi'
|
||||
item_state = "b_suit"
|
||||
var/firstpickup = TRUE
|
||||
var/pickupsound = TRUE
|
||||
|
||||
/obj/item/clothing/suit/threepwoodjacket/equipped(mob/user, slot)
|
||||
. = ..()
|
||||
if(!pickupsound)
|
||||
return
|
||||
if(!ishuman(user))
|
||||
return
|
||||
if(slot == SLOT_WEAR_SUIT)
|
||||
if(!firstpickup)
|
||||
SEND_SOUND(user, sound('hyperstation/sound/effects/vaultsuit/FalloutEXPUp.ogg', volume = 00))
|
||||
else
|
||||
firstpickup = FALSE
|
||||
SEND_SOUND(user, sound('hyperstation/sound/effects/vaultsuit/bartandfink.ogg', volume = 60))
|
||||
return
|
||||
|
||||
/obj/item/clothing/under/threepwood
|
||||
name = "threepwood's outfit"
|
||||
desc = "An outfit fit for a Mighty Pirate!."
|
||||
icon = 'hyperstation/icons/obj/clothing/uniforms.dmi'
|
||||
icon_state = "threepwood"
|
||||
alternate_worn_icon = 'hyperstation/icons/mobs/uniforms.dmi'
|
||||
item_state = "w_suit"
|
||||
can_adjust = FALSE
|
||||
|
||||
/obj/item/clothing/shoes/threepwoodboots
|
||||
name = "threepwood's boots"
|
||||
desc = "A pair of boots fit for a Mighty Pirate!."
|
||||
icon = 'hyperstation/icons/obj/clothing/shoes.dmi'
|
||||
icon_state = "threepwoodboots"
|
||||
alternate_worn_icon = 'hyperstation/icons/obj/clothing/shoes.dmi'
|
||||
item_state = "threepwoodboots"
|
||||
alternate_worn_icon = 'hyperstation/icons/mobs/feet.dmi'
|
||||
@@ -8,6 +8,7 @@
|
||||
var/results = "null"
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
|
||||
|
||||
/obj/item/pregnancytest/attack_self(mob/user)
|
||||
if(QDELETED(src))
|
||||
return
|
||||
@@ -15,26 +16,28 @@
|
||||
return
|
||||
if(isAI(user))
|
||||
return
|
||||
if(user.stat > CONSCIOUS)//unconscious or dead
|
||||
if(user.stat > 0)//unconscious or dead
|
||||
return
|
||||
Test(user)
|
||||
if(status == 1)
|
||||
return //Already been used once, pregnancy tests only work once.
|
||||
test(user)
|
||||
|
||||
/obj/item/pregnancytest/proc/force(mob/living/user)
|
||||
//Force it negative
|
||||
icon_state = "negative"
|
||||
name = "[results] pregnancy test"
|
||||
status = 1
|
||||
to_chat(user, "<span class='notice'>You use the pregnancy test, the display reads negative!</span>")
|
||||
|
||||
|
||||
/obj/item/pregnancytest/proc/test(mob/living/user)
|
||||
|
||||
/obj/item/pregnancytest/proc/Test(mob/living/user)
|
||||
if(status)
|
||||
return
|
||||
var/_results = FALSE
|
||||
var/obj/item/organ/genital/womb/W = user.getorganslot("womb")
|
||||
if(!W)
|
||||
return // no reason to waste the single-use on them
|
||||
if(W.pregnant)
|
||||
_results = TRUE
|
||||
UpdateResult(user, _results)
|
||||
|
||||
/obj/item/pregnancytest/proc/UpdateResult(mob/living/user, results)
|
||||
var/result_text = results ? "positive" : "negative"
|
||||
src.results = result_text
|
||||
icon_state = result_text
|
||||
name = "[results] preganancy test"
|
||||
status = TRUE
|
||||
if(user)
|
||||
to_chat(user, "<span class='notice'>You use the pregnancy test, the display reads [results]!</span>")
|
||||
if(W.pregnant == 1)
|
||||
results = "positive"
|
||||
icon_state = "positive"
|
||||
name = "[results] pregnancy test"
|
||||
status = 1
|
||||
to_chat(user, "<span class='notice'>You use the pregnancy test, the display reads positive!</span>")
|
||||
else
|
||||
force(user)
|
||||
@@ -132,13 +132,14 @@ Code:
|
||||
if(2) //med, can make you cum
|
||||
to_chat(U, "<span class='love'>You feel intense pleasure surge through your [G.name]</span>")
|
||||
U.do_jitter_animation()
|
||||
U.mob_climax_instant()
|
||||
if (U.getArousalLoss() >= 100 && ishuman(U) && U.has_dna())
|
||||
U.mob_climax(forced_climax=TRUE)
|
||||
if(3) //high, makes you stun
|
||||
to_chat(U, "<span class='userdanger'>You feel overpowering pleasure surge through your [G.name]</span>")
|
||||
U.Jitter(3)
|
||||
U.Stun(30)
|
||||
if (U.can_orgasm())
|
||||
U.mob_climax_instant()
|
||||
if (U.getArousalLoss() >= 100 && ishuman(U) && U.has_dna())
|
||||
U.mob_climax(forced_climax=TRUE)
|
||||
if(prob(50))
|
||||
U.emote("moan")
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 1006 B |
|
Before Width: | Height: | Size: 8.0 KiB |
|
Before Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 974 B |
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 595 B |
|
Before Width: | Height: | Size: 7.3 KiB After Width: | Height: | Size: 7.2 KiB |
|
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 6.5 KiB After Width: | Height: | Size: 6.8 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |