From e50eb495df70fff50fb7c50c5d2c5e6131e8ffdb Mon Sep 17 00:00:00 2001
From: kevinz000 <2003111+kevinz000@users.noreply.github.com>
Date: Mon, 27 Jan 2020 16:30:23 -0700
Subject: [PATCH 01/57] pre attack refactor
---
code/_onclick/item_attack.dm | 40 ++++++++++---------
code/game/objects/items/RPD.dm | 2 +-
code/game/objects/items/teleportation.dm | 2 +-
.../clock_items/replica_fabricator.dm | 4 +-
code/modules/mining/equipment/resonator.dm | 2 +-
code/modules/research/stock_parts.dm | 2 +-
6 files changed, 28 insertions(+), 24 deletions(-)
diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm
index cda19dbaac..2c22df63c5 100644
--- a/code/_onclick/item_attack.dm
+++ b/code/_onclick/item_attack.dm
@@ -1,19 +1,23 @@
-
+/**
+ *This is the proc that handles the order of an item_attack.
+ *The order of procs called is:
+ *tool_act on the target. If it returns TRUE, the chain will be stopped.
+ *pre_attack() on src. If this returns TRUE, the chain will be stopped.
+ *attackby on the target. If it returns TRUE, the chain will be stopped.
+ *and lastly
+ *afterattack. The return value does not matter.
+ */
/obj/item/proc/melee_attack_chain(mob/user, atom/target, params)
- if(!tool_attack_chain(user, target) && pre_attack(target, user, params))
- // Return 1 in attackby() to prevent afterattack() effects (when safely moving items for example)
- var/resolved = target.attackby(src, user, params)
- if(!resolved && target && !QDELETED(src))
- afterattack(target, user, 1, params) // 1: clicking something Adjacent
-
-
-//Checks if the item can work as a tool, calling the appropriate tool behavior on the target
-/obj/item/proc/tool_attack_chain(mob/user, atom/target)
- if(!tool_behaviour)
- return FALSE
-
- return target.tool_act(user, src, tool_behaviour)
-
+ if(tool_behaviour && target.tool_act(user, src, tool_behaviour))
+ return
+ if(pre_attack(target, user, params))
+ return
+ if(target.attackby(src,user, params))
+ return
+ if(QDELETED(src) || QDELETED(target))
+ attack_qdeleted(target, user, TRUE, params)
+ return
+ afterattack(target, user, TRUE, params)
// Called when the item is in the active hand, and clicked; alternately, there is an 'activate held object' verb or you can hit pagedown.
/obj/item/proc/attack_self(mob/user)
@@ -23,8 +27,8 @@
/obj/item/proc/pre_attack(atom/A, mob/living/user, params) //do stuff before attackby!
if(SEND_SIGNAL(src, COMSIG_ITEM_PRE_ATTACK, A, user, params) & COMPONENT_NO_ATTACK)
- return FALSE
- return TRUE //return FALSE to avoid calling attackby after this proc does stuff
+ return TRUE
+ return FALSE //return TRUE to avoid calling attackby after this proc does stuff
// No comment
/atom/proc/attackby(obj/item/W, mob/user, params)
@@ -112,7 +116,7 @@
send_item_attack_message(I, user)
if(I.force)
apply_damage(totitemdamage, I.damtype) //CIT CHANGE - replaces I.force with totitemdamage
- if(I.damtype == BRUTE && !HAS_TRAIT(src, TRAIT_NOMARROW))
+ if(I.damtype == BRUTE && !HAS_TRAIT(src, TRAIT_NOMARROW))
if(prob(33))
I.add_mob_blood(src)
var/turf/location = get_turf(src)
diff --git a/code/game/objects/items/RPD.dm b/code/game/objects/items/RPD.dm
index 8df1ae49de..8059e59145 100644
--- a/code/game/objects/items/RPD.dm
+++ b/code/game/objects/items/RPD.dm
@@ -344,7 +344,7 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list(
make_pipe_whitelist = typecacheof(list(/obj/structure/lattice, /obj/structure/girder, /obj/item/pipe, /obj/structure/window, /obj/structure/grille))
var/can_make_pipe = (isturf(A) || is_type_in_typecache(A, make_pipe_whitelist))
- . = FALSE
+ . = TRUE
if((mode&DESTROY_MODE) && istype(A, /obj/item/pipe) || istype(A, /obj/structure/disposalconstruct) || istype(A, /obj/structure/c_transit_tube) || istype(A, /obj/structure/c_transit_tube_pod) || istype(A, /obj/item/pipe_meter))
to_chat(user, "You start destroying a pipe...")
diff --git a/code/game/objects/items/teleportation.dm b/code/game/objects/items/teleportation.dm
index 8c0f315ca3..add2d12ee6 100644
--- a/code/game/objects/items/teleportation.dm
+++ b/code/game/objects/items/teleportation.dm
@@ -138,7 +138,7 @@
/obj/item/hand_tele/pre_attack(atom/target, mob/user, params)
if(try_dispel_portal(target, user))
- return FALSE
+ return TRUE
return ..()
/obj/item/hand_tele/proc/try_dispel_portal(atom/target, mob/user)
diff --git a/code/modules/antagonists/clockcult/clock_items/replica_fabricator.dm b/code/modules/antagonists/clockcult/clock_items/replica_fabricator.dm
index 501bcdc1c4..7be9ef039b 100644
--- a/code/modules/antagonists/clockcult/clock_items/replica_fabricator.dm
+++ b/code/modules/antagonists/clockcult/clock_items/replica_fabricator.dm
@@ -68,8 +68,8 @@
/obj/item/clockwork/replica_fabricator/pre_attack(atom/target, mob/living/user, params)
if(!target || !user || !is_servant_of_ratvar(user) || istype(target, /obj/item/storage))
- return TRUE
- return fabricate(target, user)
+ return ..()
+ return !fabricate(target, user)
//A note here; return values are for if we CAN BE PUT ON A TABLE, not IF WE ARE SUCCESSFUL, unless no_table_check is TRUE
/obj/item/clockwork/replica_fabricator/proc/fabricate(atom/target, mob/living/user, silent, no_table_check)
diff --git a/code/modules/mining/equipment/resonator.dm b/code/modules/mining/equipment/resonator.dm
index f63b459f10..133cb41c33 100644
--- a/code/modules/mining/equipment/resonator.dm
+++ b/code/modules/mining/equipment/resonator.dm
@@ -46,7 +46,7 @@
/obj/item/resonator/pre_attack(atom/target, mob/user, params)
if(check_allowed_items(target, 1))
CreateResonance(target, user)
- return TRUE
+ return ..()
//resonance field, crushes rock, damages mobs
/obj/effect/temp_visual/resonance
diff --git a/code/modules/research/stock_parts.dm b/code/modules/research/stock_parts.dm
index e29cf28f34..e5b66cd90d 100644
--- a/code/modules/research/stock_parts.dm
+++ b/code/modules/research/stock_parts.dm
@@ -22,7 +22,7 @@ If you create T5+ please take a pass at gene_modder.dm [L40]. Max_values MUST fi
if(works_from_distance)
user.Beam(T, icon_state = "rped_upgrade", time = 5)
T.exchange_parts(user, src)
- return FALSE
+ return TRUE
return ..()
/obj/item/storage/part_replacer/afterattack(obj/machinery/T, mob/living/user, adjacent, params)
From 28697a375f654f92237b277218f04f94cfbb3df7 Mon Sep 17 00:00:00 2001
From: kevinz000 <2003111+kevinz000@users.noreply.github.com>
Date: Mon, 27 Jan 2020 17:43:21 -0700
Subject: [PATCH 02/57] Update item_attack.dm
---
code/_onclick/item_attack.dm | 1 -
1 file changed, 1 deletion(-)
diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm
index 2c22df63c5..3f11c8a2f2 100644
--- a/code/_onclick/item_attack.dm
+++ b/code/_onclick/item_attack.dm
@@ -15,7 +15,6 @@
if(target.attackby(src,user, params))
return
if(QDELETED(src) || QDELETED(target))
- attack_qdeleted(target, user, TRUE, params)
return
afterattack(target, user, TRUE, params)
From d89e0de32cce9a0d39c4e8945096527e4b3a5d4d Mon Sep 17 00:00:00 2001
From: Seris02
Date: Sun, 2 Feb 2020 11:43:20 +0800
Subject: [PATCH 03/57] yeehaw
---
code/game/objects/structures/crates_lockers/crates.dm | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm
index eaa9074bd8..3858cb6a8c 100644
--- a/code/game/objects/structures/crates_lockers/crates.dm
+++ b/code/game/objects/structures/crates_lockers/crates.dm
@@ -31,6 +31,11 @@
return 1
return !density
+/obj/structure/closet/crate/crowbar_act(mob/user,obj/item/tool)
+ if (manifest)
+ tear_manifest(user)
+ return ..()
+
/obj/structure/closet/crate/update_icon()
icon_state = "[initial(icon_state)][opened ? "open" : ""]"
From 28df05bbb03dc2a19ec7a6601019d5b5185dfc80 Mon Sep 17 00:00:00 2001
From: Ghommie <42542238+Ghommie@users.noreply.github.com>
Date: Fri, 7 Feb 2020 00:19:17 +0100
Subject: [PATCH 04/57] step 1
---
.../code/modules/arousal/genitals.dm | 97 +++++++++----------
1 file changed, 47 insertions(+), 50 deletions(-)
diff --git a/modular_citadel/code/modules/arousal/genitals.dm b/modular_citadel/code/modules/arousal/genitals.dm
index ca01ef46cb..0820a564ad 100644
--- a/modular_citadel/code/modules/arousal/genitals.dm
+++ b/modular_citadel/code/modules/arousal/genitals.dm
@@ -262,53 +262,21 @@
update_genitals()
/mob/living/carbon/human/proc/update_genitals()
- if(!QDELETED(src))
- dna.species.handle_genitals(src)
-
-//Checks to see if organs are new on the mob, and changes their colours so that they don't get crazy colours.
-/mob/living/carbon/human/proc/emergent_genital_call()
- if(!client.prefs.arousable)
- return FALSE
-
- var/organCheck = locate(/obj/item/organ/genital) in internal_organs
- var/breastCheck = getorganslot(ORGAN_SLOT_BREASTS)
- var/willyCheck = getorganslot(ORGAN_SLOT_PENIS)
-
- if(organCheck == FALSE)
- if(ishuman(src) && dna.species.id == "human")
- dna.features["genitals_use_skintone"] = TRUE
- dna.species.use_skintones = TRUE
- if(MUTCOLORS)
- if(src.dna.species.fixed_mut_color)
- dna.features["cock_color"] = "[dna.species.fixed_mut_color]"
- dna.features["breasts_color"] = "[dna.species.fixed_mut_color]"
- return
- //So people who haven't set stuff up don't get rainbow surprises.
- dna.features["cock_color"] = "[dna.features["mcolor"]]"
- dna.features["breasts_color"] = "[dna.features["mcolor"]]"
- else //If there's a new organ, make it the same colour.
- if(breastCheck == FALSE)
- dna.features["breasts_color"] = dna.features["cock_color"]
- else if (willyCheck == FALSE)
- dna.features["cock_color"] = dna.features["breasts_color"]
- return TRUE
-
-/datum/species/proc/handle_genitals(mob/living/carbon/human/H)//more like handle sadness
- if(!H)//no args
- CRASH("H = null")
- if(!LAZYLEN(H.internal_organs) || ((NOGENITALS in species_traits) && !H.genital_override) || HAS_TRAIT(H, TRAIT_HUSK))
+ if(QDELETED(src))
return
var/list/relevant_layers = list(GENITALS_BEHIND_LAYER, GENITALS_FRONT_LAYER)
-
for(var/L in relevant_layers) //Less hardcode
- H.remove_overlay(L)
- H.remove_overlay(GENITALS_EXPOSED_LAYER)
+ remove_overlay(L)
+ remove_overlay(GENITALS_EXPOSED_LAYER)
+ if(!LAZYLEN(internal_organs) || ((NOGENITALS in dna.species.species_traits) && !genital_override) || HAS_TRAIT(src, TRAIT_HUSK))
+ return
+
//start scanning for genitals
var/list/gen_index[GENITAL_LAYER_INDEX_LENGTH]
var/list/genitals_to_add
var/list/fully_exposed
- for(var/obj/item/organ/genital/G in H.internal_organs)
+ for(var/obj/item/organ/genital/G in internal_organs)
if(G.is_exposed()) //Checks appropriate clothing slot and if it's through_clothes
LAZYADD(gen_index[G.layer_index], G)
for(var/L in gen_index)
@@ -345,19 +313,19 @@
if(S.center)
genital_overlay = center_image(genital_overlay, S.dimension_x, S.dimension_y)
- if(use_skintones && H.dna.features["genitals_use_skintone"])
- genital_overlay.color = "#[skintone2hex(H.skin_tone)]"
+ if(use_skintones && dna.features["genitals_use_skintone"])
+ genital_overlay.color = "#[skintone2hex(skin_tone)]"
else
switch(S.color_src)
if("cock_color")
- genital_overlay.color = "#[H.dna.features["cock_color"]]"
+ genital_overlay.color = "#[dna.features["cock_color"]]"
if("balls_color")
- genital_overlay.color = "#[H.dna.features["balls_color"]]"
+ genital_overlay.color = "#[dna.features["balls_color"]]"
if("breasts_color")
- genital_overlay.color = "#[H.dna.features["breasts_color"]]"
+ genital_overlay.color = "#[dna.features["breasts_color"]]"
if("vag_color")
- genital_overlay.color = "#[H.dna.features["vag_color"]]"
-
+ genital_overlay.color = "#[dna.features["vag_color"]]"
+
genital_overlay.icon_state = "[G.slot]_[S.icon_state]_[size]-s_[aroused_state]_[layertext]"
if(layer == GENITALS_FRONT_LAYER && CHECK_BITFIELD(G.genital_flags, GENITAL_THROUGH_CLOTHES))
@@ -367,11 +335,40 @@
standing += genital_overlay
if(LAZYLEN(standing))
- H.overlays_standing[layer] = standing
+ overlays_standing[layer] = standing
if(LAZYLEN(fully_exposed))
- H.overlays_standing[GENITALS_EXPOSED_LAYER] = fully_exposed
- H.apply_overlay(GENITALS_EXPOSED_LAYER)
+ overlays_standing[GENITALS_EXPOSED_LAYER] = fully_exposed
+ apply_overlay(GENITALS_EXPOSED_LAYER)
for(var/L in relevant_layers)
- H.apply_overlay(L)
+ apply_overlay(L)
+
+
+//Checks to see if organs are new on the mob, and changes their colours so that they don't get crazy colours.
+/mob/living/carbon/human/proc/emergent_genital_call()
+ if(!client.prefs.arousable)
+ return FALSE
+
+ var/organCheck = locate(/obj/item/organ/genital) in internal_organs
+ var/breastCheck = getorganslot(ORGAN_SLOT_BREASTS)
+ var/willyCheck = getorganslot(ORGAN_SLOT_PENIS)
+
+ if(organCheck == FALSE)
+ if(ishuman(src) && dna.species.id == "human")
+ dna.features["genitals_use_skintone"] = TRUE
+ dna.species.use_skintones = TRUE
+ if(MUTCOLORS)
+ if(src.dna.species.fixed_mut_color)
+ dna.features["cock_color"] = "[dna.species.fixed_mut_color]"
+ dna.features["breasts_color"] = "[dna.species.fixed_mut_color]"
+ return
+ //So people who haven't set stuff up don't get rainbow surprises.
+ dna.features["cock_color"] = "[dna.features["mcolor"]]"
+ dna.features["breasts_color"] = "[dna.features["mcolor"]]"
+ else //If there's a new organ, make it the same colour.
+ if(breastCheck == FALSE)
+ dna.features["breasts_color"] = dna.features["cock_color"]
+ else if (willyCheck == FALSE)
+ dna.features["cock_color"] = dna.features["breasts_color"]
+ return TRUE
From 39d6980bab35c231c7cd4f144f5988cb0dad6dd0 Mon Sep 17 00:00:00 2001
From: Ghommie <42542238+Ghommie@users.noreply.github.com>
Date: Fri, 7 Feb 2020 01:03:59 +0100
Subject: [PATCH 05/57] genitals code is so bad.
---
.../code/modules/arousal/arousal.dm | 6 ----
.../code/modules/arousal/genitals.dm | 32 ++++++++-----------
.../code/modules/arousal/organs/breasts.dm | 1 -
.../code/modules/arousal/organs/penis.dm | 2 +-
4 files changed, 15 insertions(+), 26 deletions(-)
diff --git a/modular_citadel/code/modules/arousal/arousal.dm b/modular_citadel/code/modules/arousal/arousal.dm
index 3a586d061d..c23bef9a7d 100644
--- a/modular_citadel/code/modules/arousal/arousal.dm
+++ b/modular_citadel/code/modules/arousal/arousal.dm
@@ -10,12 +10,6 @@
var/hidden_undershirt = FALSE
var/hidden_socks = FALSE
-//Species vars
-/datum/species
- var/list/cum_fluids = list("semen")
- var/list/milk_fluids = list("milk")
- var/list/femcum_fluids = list("femcum")
-
//Mob procs
/mob/living/carbon/human/proc/underwear_toggle()
set name = "Toggle undergarments"
diff --git a/modular_citadel/code/modules/arousal/genitals.dm b/modular_citadel/code/modules/arousal/genitals.dm
index 0820a564ad..7231b536ea 100644
--- a/modular_citadel/code/modules/arousal/genitals.dm
+++ b/modular_citadel/code/modules/arousal/genitals.dm
@@ -32,23 +32,18 @@
else
update()
-/obj/item/organ/genital/Destroy()
- if(linked_organ)
- update_link(TRUE)//this should remove any other links it has
- return ..()
-
/obj/item/organ/genital/proc/set_aroused_state(new_state)
if(!((HAS_TRAIT(owner,TRAIT_PERMABONER) && !new_state) || HAS_TRAIT(owner,TRAIT_NEVERBONER) && new_state))
aroused_state = new_state
return aroused_state
-/obj/item/organ/genital/proc/update(removing = FALSE)
+/obj/item/organ/genital/proc/update()
if(QDELETED(src))
return
update_size()
update_appearance()
- if(linked_organ_slot || (linked_organ && removing))
- update_link(removing)
+ if(linked_organ_slot || (linked_organ && !owner))
+ update_link()
//exposure and through-clothing code
/mob/living/carbon
@@ -174,19 +169,18 @@
return TRUE
return FALSE
-/obj/item/organ/genital/proc/update_link(removing = FALSE)
- if(!removing && owner)
+/obj/item/organ/genital/proc/update_link()
+ if(owner)
if(linked_organ)
- return
+ return FALSE
linked_organ = owner.getorganslot(linked_organ_slot)
if(linked_organ)
linked_organ.linked_organ = src
linked_organ.upon_link()
upon_link()
return TRUE
- else
- if(linked_organ)
- linked_organ.linked_organ = null
+ if(linked_organ)
+ linked_organ.linked_organ = null
linked_organ = null
return FALSE
@@ -200,10 +194,12 @@
update()
RegisterSignal(owner, COMSIG_MOB_DEATH, .proc/update_appearance)
-/obj/item/organ/genital/Remove(mob/living/carbon/M, special = FALSE, drop_if_replaced = TRUE)
- update(TRUE)
- if(!QDELETED(owner))
- UnregisterSignal(owner, COMSIG_MOB_DEATH)
+/obj/item/organ/genital/Remove(special = FALSE)
+ var/mob/living/carbon/human/H = . = ..()
+ update()
+ if(!QDELETED(H))
+ UnregisterSignal(H, COMSIG_MOB_DEATH)
+ H.update_genitals()
//proc to give a player their genitals and stuff when they log in
/mob/living/carbon/human/proc/give_genitals(clean = FALSE)//clean will remove all pre-existing genitals. proc will then give them any genitals that are enabled in their DNA
diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm
index 1537d5cebe..fa1a48b17d 100644
--- a/modular_citadel/code/modules/arousal/organs/breasts.dm
+++ b/modular_citadel/code/modules/arousal/organs/breasts.dm
@@ -63,7 +63,6 @@
var/mob/living/carbon/human/H = owner
icon_state = sanitize_text(string)
H.update_genitals()
- icon_state = sanitize_text(string)
//Allows breasts to grow and change size, with sprite changes too.
//maximum wah
diff --git a/modular_citadel/code/modules/arousal/organs/penis.dm b/modular_citadel/code/modules/arousal/organs/penis.dm
index c6d3c764ac..a8d1a67b19 100644
--- a/modular_citadel/code/modules/arousal/organs/penis.dm
+++ b/modular_citadel/code/modules/arousal/organs/penis.dm
@@ -14,7 +14,7 @@
size = 2 //arbitrary value derived from length and girth for sprites.
layer_index = PENIS_LAYER_INDEX
var/length = 6 //inches
- var/prev_length = 6 //really should be renamed to prev_length
+ var/prev_length = 6
var/girth = 4.38
var/girth_ratio = COCK_GIRTH_RATIO_DEF //0.73; check citadel_defines.dm
From 00042292cf3ac17fdfdec9f35f864eb7301b1d6c Mon Sep 17 00:00:00 2001
From: Ghommie <42542238+Ghommie@users.noreply.github.com>
Date: Fri, 7 Feb 2020 01:14:19 +0100
Subject: [PATCH 06/57] Byond is pretty special.
---
modular_citadel/code/modules/arousal/genitals.dm | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/modular_citadel/code/modules/arousal/genitals.dm b/modular_citadel/code/modules/arousal/genitals.dm
index 7231b536ea..001a4932d8 100644
--- a/modular_citadel/code/modules/arousal/genitals.dm
+++ b/modular_citadel/code/modules/arousal/genitals.dm
@@ -195,7 +195,8 @@
RegisterSignal(owner, COMSIG_MOB_DEATH, .proc/update_appearance)
/obj/item/organ/genital/Remove(special = FALSE)
- var/mob/living/carbon/human/H = . = ..()
+ . = ..()
+ var/mob/living/carbon/human/H = .
update()
if(!QDELETED(H))
UnregisterSignal(H, COMSIG_MOB_DEATH)
From 7f431af99d07df228c5c82955341b79e7223d109 Mon Sep 17 00:00:00 2001
From: Ghommie <42542238+Ghommie@users.noreply.github.com>
Date: Fri, 7 Feb 2020 01:33:47 +0100
Subject: [PATCH 07/57] Ok
---
.../code/modules/arousal/genitals.dm | 17 ++++++++---------
1 file changed, 8 insertions(+), 9 deletions(-)
diff --git a/modular_citadel/code/modules/arousal/genitals.dm b/modular_citadel/code/modules/arousal/genitals.dm
index 001a4932d8..087b45cbb5 100644
--- a/modular_citadel/code/modules/arousal/genitals.dm
+++ b/modular_citadel/code/modules/arousal/genitals.dm
@@ -235,12 +235,6 @@
/obj/item/organ/genital/proc/get_features(mob/living/carbon/human/H)
return
-/datum/species/proc/genitals_layertext(layer)
- switch(layer)
- if(GENITALS_BEHIND_LAYER)
- return "BEHIND"
- if(GENITALS_FRONT_LAYER)
- return "FRONT"
//procs to handle sprite overlays being applied to humans
@@ -261,7 +255,12 @@
/mob/living/carbon/human/proc/update_genitals()
if(QDELETED(src))
return
- var/list/relevant_layers = list(GENITALS_BEHIND_LAYER, GENITALS_FRONT_LAYER)
+ var/static/list/relevant_layers
+ if(!relevant_layers)
+ relevant_layers = list()
+ relevant_layers[GENITALS_BEHIND_LAYER] = "BEHIND"
+ relevant_layers[GENITALS_FRONT_LAYER] = "FRONT"
+ var/static/list/layer_strings = list
for(var/L in relevant_layers) //Less hardcode
remove_overlay(L)
remove_overlay(GENITALS_EXPOSED_LAYER)
@@ -285,7 +284,7 @@
//start applying overlays
for(var/layer in relevant_layers)
var/list/standing = list()
- var/layertext = genitals_layertext(layer)
+ var/layertext = relevant_layers[layer]
for(var/A in genitals_to_add)
var/obj/item/organ/genital/G = A
var/datum/sprite_accessory/S
@@ -310,7 +309,7 @@
if(S.center)
genital_overlay = center_image(genital_overlay, S.dimension_x, S.dimension_y)
- if(use_skintones && dna.features["genitals_use_skintone"])
+ if(dna.species.use_skintones && dna.features["genitals_use_skintone"])
genital_overlay.color = "#[skintone2hex(skin_tone)]"
else
switch(S.color_src)
From 2370de52f9d80201821819753a70efcceeaa7a68 Mon Sep 17 00:00:00 2001
From: Ghom <42542238+Ghommie@users.noreply.github.com>
Date: Fri, 7 Feb 2020 02:46:15 +0100
Subject: [PATCH 08/57] Update genitals.dm
---
modular_citadel/code/modules/arousal/genitals.dm | 1 -
1 file changed, 1 deletion(-)
diff --git a/modular_citadel/code/modules/arousal/genitals.dm b/modular_citadel/code/modules/arousal/genitals.dm
index 087b45cbb5..d457bcd128 100644
--- a/modular_citadel/code/modules/arousal/genitals.dm
+++ b/modular_citadel/code/modules/arousal/genitals.dm
@@ -260,7 +260,6 @@
relevant_layers = list()
relevant_layers[GENITALS_BEHIND_LAYER] = "BEHIND"
relevant_layers[GENITALS_FRONT_LAYER] = "FRONT"
- var/static/list/layer_strings = list
for(var/L in relevant_layers) //Less hardcode
remove_overlay(L)
remove_overlay(GENITALS_EXPOSED_LAYER)
From b5d6afac9a060fbddcd6d956d9dd454a6baeefa3 Mon Sep 17 00:00:00 2001
From: kevinz000 <2003111+kevinz000@users.noreply.github.com>
Date: Fri, 7 Feb 2020 03:20:45 -0700
Subject: [PATCH 09/57] Update gravity.dm
---
code/modules/projectiles/ammunition/energy/gravity.dm | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/code/modules/projectiles/ammunition/energy/gravity.dm b/code/modules/projectiles/ammunition/energy/gravity.dm
index eabb4f66d7..be7b618803 100644
--- a/code/modules/projectiles/ammunition/energy/gravity.dm
+++ b/code/modules/projectiles/ammunition/energy/gravity.dm
@@ -15,15 +15,15 @@
. = ..()
/obj/item/ammo_casing/energy/gravity/repulse
- projectile_type = /obj/item/projectile/gravityrepulse
+ projectile_type = /obj/item/projectile/gravity/repulse
select_name = "repulse"
/obj/item/ammo_casing/energy/gravity/attract
- projectile_type = /obj/item/projectile/gravityattract
+ projectile_type = /obj/item/projectile/gravity/attract
select_name = "attract"
/obj/item/ammo_casing/energy/gravity/chaos
- projectile_type = /obj/item/projectile/gravitychaos
+ projectile_type = /obj/item/projectile/gravity/chaos
select_name = "chaos"
From 673079f99568238e31e8b958d8a06b3bd3e613aa Mon Sep 17 00:00:00 2001
From: kevinz000 <2003111+kevinz000@users.noreply.github.com>
Date: Fri, 7 Feb 2020 03:31:15 -0700
Subject: [PATCH 10/57] Update gravity.dm
---
.../projectiles/projectile/special/gravity.dm | 141 ++++++++----------
1 file changed, 62 insertions(+), 79 deletions(-)
diff --git a/code/modules/projectiles/projectile/special/gravity.dm b/code/modules/projectiles/projectile/special/gravity.dm
index 0ef9bc6653..6c298d0d51 100644
--- a/code/modules/projectiles/projectile/special/gravity.dm
+++ b/code/modules/projectiles/projectile/special/gravity.dm
@@ -1,90 +1,73 @@
-/obj/item/projectile/gravityrepulse
+/obj/item/projectile/gravity
+ name = "gravity bolt"
+ icon = 'icons/effects/effects.dmi'
+ icon_state = "chronofield"
+ hitsound = 'sound/weapons/wave.ogg'
+ damage = 0
+ damage_type = BRUTE
+ nodamage = TRUE
+ var/power = 4
+ var/list/thrown = list() //normally we wouldn't need this but incase on_hit is called multiple times, yeah.. this is a good idea.
+
+/obj/item/projectile/gravity/Initialize(mapload)
+ . = ..()
+ var/obj/item/ammo_casing/energy/gravity/G = loc
+ if(istype(G))
+ power = min(G.gun.power, 15)
+
+/obj/item/projectile/gravity/on_hit()
+ . = ..()
+ var/turf/T = get_turf(src)
+ var/list/tothrow
+ var/list/mobs = list()
+ var/list/objs = list()
+ var/list/cachedrange = range(T, power)
+ for(var/mob/M in cachedrange)
+ mobs += M
+ for(var/obj/O in cachedrange)
+ objs += O
+ tothrow = mobs + objs //mobs priority
+ var/safety = 50
+ for(var/i in tothrow)
+ if(!safety)
+ break
+ var/atom/movable/AM = i
+ if(can_throw(AM, thrown) && do_the_throw(T, AM, thrown))
+ safety--
+ for(var/turf/F in range(T,power))
+ new /obj/effect/temp_visual/gravpush(F)
+
+/obj/item/projectile/gravity/proc/can_throw(atom/movable/AM, list/thrown)
+ return (AM != src) && (AM != firer) && !AM.anchored && !thrown[AM]
+
+/obj/item/projectile/garvity/proc/do_the_throw(turf/origin, atom/movable/AM, list/thrown)
+ thrown[AM] = TRUE
+ var/target = get_target(origin, AM)
+ if(!target)
+ return FALSE
+ AM.throw_at(target, power + 1, 1)
+ return TRUE
+
+/obj/item/projectile/gravity/proc/get_target(turf/origin, atom/movable/AM)
+ return origin
+
+/obj/item/projectile/gravity/repulse
name = "repulsion bolt"
- icon = 'icons/effects/effects.dmi'
- icon_state = "chronofield"
- hitsound = 'sound/weapons/wave.ogg'
- damage = 0
- damage_type = BRUTE
- nodamage = 1
color = "#33CCFF"
- var/turf/T
- var/power = 4
- var/list/thrown_items = list()
-/obj/item/projectile/gravityrepulse/Initialize()
- . = ..()
- var/obj/item/ammo_casing/energy/gravity/repulse/C = loc
- if(istype(C)) //Hard-coded maximum power so servers can't be crashed by trying to throw the entire Z level's items
- power = min(C.gun.power, 15)
+/obj/item/projectile/gravity/repulse/get_target(turf/origin, atom/movable/AM)
+ return get_turf_in_angle(Get_Angle(origin, AM), origin, power)
-/obj/item/projectile/gravityrepulse/on_hit()
- . = ..()
- T = get_turf(src)
- for(var/atom/movable/A in range(T, power))
- if(A == src || (firer && A == src.firer) || A.anchored || thrown_items[A])
- continue
- var/throwtarget = get_edge_target_turf(src, get_dir(src, get_step_away(A, src)))
- A.throw_at(throwtarget,power+1,1)
- thrown_items[A] = A
- for(var/turf/F in range(T,power))
- new /obj/effect/temp_visual/gravpush(F)
-
-/obj/item/projectile/gravityattract
+/obj/item/projectile/gravity/attract
name = "attraction bolt"
- icon = 'icons/effects/effects.dmi'
- icon_state = "chronofield"
- hitsound = 'sound/weapons/wave.ogg'
- damage = 0
- damage_type = BRUTE
- nodamage = 1
color = "#FF6600"
- var/turf/T
- var/power = 4
- var/list/thrown_items = list()
-/obj/item/projectile/gravityattract/Initialize()
- . = ..()
- var/obj/item/ammo_casing/energy/gravity/attract/C = loc
- if(istype(C)) //Hard-coded maximum power so servers can't be crashed by trying to throw the entire Z level's items
- power = min(C.gun.power, 15)
+/obj/item/projectile/gravity/attract/get_target(turf/origin, atom/movable/AM)
+ return origin
-/obj/item/projectile/gravityattract/on_hit()
- . = ..()
- T = get_turf(src)
- for(var/atom/movable/A in range(T, power))
- if(A == src || (firer && A == src.firer) || A.anchored || thrown_items[A])
- continue
- A.throw_at(T, power+1, 1)
- thrown_items[A] = A
- for(var/turf/F in range(T,power))
- new /obj/effect/temp_visual/gravpush(F)
-
-/obj/item/projectile/gravitychaos
+/obj/item/projectile/gravity/chaos
name = "gravitational blast"
- icon = 'icons/effects/effects.dmi'
- icon_state = "chronofield"
- hitsound = 'sound/weapons/wave.ogg'
- damage = 0
- damage_type = BRUTE
- nodamage = 1
color = "#101010"
- var/turf/T
- var/power = 4
- var/list/thrown_items = list()
-/obj/item/projectile/gravitychaos/Initialize()
- . = ..()
- var/obj/item/ammo_casing/energy/gravity/chaos/C = loc
- if(istype(C)) //Hard-coded maximum power so servers can't be crashed by trying to throw the entire Z level's items
- power = min(C.gun.power, 15)
-
-/obj/item/projectile/gravitychaos/on_hit()
- . = ..()
- T = get_turf(src)
- for(var/atom/movable/A in range(T, power))
- if(A == src|| (firer && A == src.firer) || A.anchored || thrown_items[A])
- continue
- A.throw_at(get_edge_target_turf(A, pick(GLOB.cardinals)), power+1, 1)
- thrown_items[A] = A
- for(var/turf/Z in range(T,power))
- new /obj/effect/temp_visual/gravpush(Z)
+/obj/item/projectile/gravity/chaos/get_target(turf/origin, atom/movable/AM)
+ return get_turf_in_angle(rand(0, 359), origin, power)
From f8d5eae0c3b54b40bde153c4fa4eb07e7acd3d0a Mon Sep 17 00:00:00 2001
From: kevinz000 <2003111+kevinz000@users.noreply.github.com>
Date: Fri, 7 Feb 2020 16:24:12 -0700
Subject: [PATCH 11/57] Update gravity.dm
---
code/modules/projectiles/projectile/special/gravity.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/modules/projectiles/projectile/special/gravity.dm b/code/modules/projectiles/projectile/special/gravity.dm
index 6c298d0d51..0efdc77806 100644
--- a/code/modules/projectiles/projectile/special/gravity.dm
+++ b/code/modules/projectiles/projectile/special/gravity.dm
@@ -40,7 +40,7 @@
/obj/item/projectile/gravity/proc/can_throw(atom/movable/AM, list/thrown)
return (AM != src) && (AM != firer) && !AM.anchored && !thrown[AM]
-/obj/item/projectile/garvity/proc/do_the_throw(turf/origin, atom/movable/AM, list/thrown)
+/obj/item/projectile/gravity/proc/do_the_throw(turf/origin, atom/movable/AM, list/thrown)
thrown[AM] = TRUE
var/target = get_target(origin, AM)
if(!target)
From 6af421994abb0185573cb45fea2de4eea565fcb5 Mon Sep 17 00:00:00 2001
From: Seris02
Date: Sat, 8 Feb 2020 13:53:43 +0800
Subject: [PATCH 12/57] yay
---
.../game/objects/structures/crates_lockers/crates.dm | 12 +++++++-----
1 file changed, 7 insertions(+), 5 deletions(-)
diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm
index 3858cb6a8c..7eb0860ac0 100644
--- a/code/game/objects/structures/crates_lockers/crates.dm
+++ b/code/game/objects/structures/crates_lockers/crates.dm
@@ -31,11 +31,6 @@
return 1
return !density
-/obj/structure/closet/crate/crowbar_act(mob/user,obj/item/tool)
- if (manifest)
- tear_manifest(user)
- return ..()
-
/obj/structure/closet/crate/update_icon()
icon_state = "[initial(icon_state)][opened ? "open" : ""]"
@@ -50,6 +45,13 @@
if(manifest)
tear_manifest(user)
+/obj/structure/closet/crate/tool_interact(obj/item/W, mob/user)
+ if(istype(W, /obj/item/crowbar))
+ if (manifest)
+ tear_manifest(user)
+ return TRUE
+ return ..()
+
/obj/structure/closet/crate/open(mob/living/user)
. = ..()
if(. && manifest)
From 6d8bfd2a380aa8bfc3535098b52549bd4e4c986d Mon Sep 17 00:00:00 2001
From: Seris02 <49109742+Seris02@users.noreply.github.com>
Date: Sat, 8 Feb 2020 14:01:51 +0800
Subject: [PATCH 13/57] tru
---
code/game/objects/structures/crates_lockers/crates.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm
index 7eb0860ac0..708cee2aa4 100644
--- a/code/game/objects/structures/crates_lockers/crates.dm
+++ b/code/game/objects/structures/crates_lockers/crates.dm
@@ -46,7 +46,7 @@
tear_manifest(user)
/obj/structure/closet/crate/tool_interact(obj/item/W, mob/user)
- if(istype(W, /obj/item/crowbar))
+ if(istype(W, /obj/item/wirecutters))
if (manifest)
tear_manifest(user)
return TRUE
From 5dbfc9a5146873185ff64991978d85c99341bbdd Mon Sep 17 00:00:00 2001
From: TrilbySpaceClone
Date: Sat, 8 Feb 2020 03:25:09 -0500
Subject: [PATCH 14/57] Yay
---
code/modules/projectiles/pins.dm | 16 +++++++++++++---
code/modules/research/designs/weapon_designs.dm | 10 ++++++++++
code/modules/research/techweb/all_nodes.dm | 2 +-
3 files changed, 24 insertions(+), 4 deletions(-)
diff --git a/code/modules/projectiles/pins.dm b/code/modules/projectiles/pins.dm
index 0465a611cd..a99a3bf45d 100644
--- a/code/modules/projectiles/pins.dm
+++ b/code/modules/projectiles/pins.dm
@@ -69,13 +69,10 @@
if(gun)
qdel(gun)
-
-
/obj/item/firing_pin/magic
name = "magic crystal shard"
desc = "A small enchanted shard which allows magical weapons to fire."
-
// Test pin, works only near firing range.
/obj/item/firing_pin/test_range
name = "test-range firing pin"
@@ -229,3 +226,16 @@
if(gun)
gun.pin = null
return ..()
+
+//Station Locked
+
+/obj/item/firing_pin/away
+ name = "station locked pin"
+ desc = "A firing pin that only will fire when off the station."
+
+/obj/item/firing_pin/away/pin_auth(mob/living/user)
+ var/station_zlevel = get_area(src)
+ if(station_zlevel in GLOB.the_station_areas)
+ to_chat(user, "The pin beeps, refusing to fire.")
+ return FALSE
+ return TRUE
diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm
index 1d65edbe9a..467679fea6 100644
--- a/code/modules/research/designs/weapon_designs.dm
+++ b/code/modules/research/designs/weapon_designs.dm
@@ -225,6 +225,16 @@
category = list("Firing Pins")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+/datum/design/pin_away
+ name = "Station Locked Pin"
+ desc = "This is a security firing pin which only authorizes users who are off station."
+ id = "pin_away"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 1500, MAT_GLASS = 2000)
+ build_path = /obj/item/firing_pin/away
+ category = list("Firing Pins")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
//////////////
//Guns////////
//////////////
diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm
index e1abfedde6..acc278d3e6 100644
--- a/code/modules/research/techweb/all_nodes.dm
+++ b/code/modules/research/techweb/all_nodes.dm
@@ -666,7 +666,7 @@
display_name = "Weapon Development Technology"
description = "Our researchers have found new to weaponize just about everything now."
prereq_ids = list("engineering")
- design_ids = list("pin_testing", "tele_shield", "lasercarbine")
+ design_ids = list("pin_testing", "tele_shield", "lasercarbine", "pin_away")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 7500)
export_price = 5000
From 612b5c5da353646261e7cb84e59a99762b97c150 Mon Sep 17 00:00:00 2001
From: TrilbySpaceClone
Date: Sat, 8 Feb 2020 03:27:43 -0500
Subject: [PATCH 15/57] better name
---
code/modules/projectiles/pins.dm | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/code/modules/projectiles/pins.dm b/code/modules/projectiles/pins.dm
index a99a3bf45d..0a27eb31ed 100644
--- a/code/modules/projectiles/pins.dm
+++ b/code/modules/projectiles/pins.dm
@@ -234,8 +234,8 @@
desc = "A firing pin that only will fire when off the station."
/obj/item/firing_pin/away/pin_auth(mob/living/user)
- var/station_zlevel = get_area(src)
- if(station_zlevel in GLOB.the_station_areas)
+ var/station_area = get_area(src)
+ if(station_area in GLOB.the_station_areas)
to_chat(user, "The pin beeps, refusing to fire.")
return FALSE
return TRUE
From f6adce72fbcdabec184f4b6eb85c131d82f957f0 Mon Sep 17 00:00:00 2001
From: Ghommie <42542238+Ghommie@users.noreply.github.com>
Date: Sun, 9 Feb 2020 06:51:57 +0100
Subject: [PATCH 16/57] Something about missing private sprites and their bad
code.
---
code/__DEFINES/citadel_defines.dm | 1 +
code/__HELPERS/_cit_helpers.dm | 5 +---
code/__HELPERS/global_lists.dm | 13 +----------
.../sprite_accessories/_sprite_accessories.dm | 4 ++--
.../code/modules/arousal/arousal.dm | 20 +++++-----------
.../code/modules/arousal/genitals.dm | 22 +++++-------------
.../arousal/genitals_sprite_accessories.dm | 9 ++++---
.../code/modules/arousal/organs/breasts.dm | 18 +++++++++-----
.../code/modules/arousal/organs/penis.dm | 11 ++++-----
.../code/modules/arousal/organs/testicles.dm | 8 +++----
.../code/modules/arousal/organs/vagina.dm | 8 +++----
.../icons/obj/genitals/breasts.dmi | Bin 1407 -> 1295 bytes
.../icons/obj/genitals/breasts_onmob.dmi | Bin 8830 -> 6159 bytes
modular_citadel/icons/obj/genitals/penis.dmi | Bin 4707 -> 4303 bytes
.../icons/obj/genitals/penis_onmob.dmi | Bin 10002 -> 9279 bytes
.../icons/obj/genitals/taur_penis_onmob.dmi | Bin 1673 -> 1672 bytes
.../icons/obj/genitals/testicles.dmi | Bin 1116 -> 1039 bytes
modular_citadel/icons/obj/genitals/vagina.dmi | Bin 626 -> 546 bytes
.../icons/obj/genitals/vagina_onmob.dmi | Bin 1330 -> 1112 bytes
19 files changed, 45 insertions(+), 74 deletions(-)
diff --git a/code/__DEFINES/citadel_defines.dm b/code/__DEFINES/citadel_defines.dm
index 2b19610040..56d5c63833 100644
--- a/code/__DEFINES/citadel_defines.dm
+++ b/code/__DEFINES/citadel_defines.dm
@@ -34,6 +34,7 @@
#define CAN_MASTURBATE_WITH (1<<5)
#define MASTURBATE_LINKED_ORGAN (1<<6) //used to pass our mission to the linked organ
#define CAN_CLIMAX_WITH (1<<7)
+#define GENITAL_CAN_AROUSE (1<<8)
#define COCK_SIZE_MIN 1
#define COCK_SIZE_MAX 20
diff --git a/code/__HELPERS/_cit_helpers.dm b/code/__HELPERS/_cit_helpers.dm
index c0acf4c5a5..1bde770045 100644
--- a/code/__HELPERS/_cit_helpers.dm
+++ b/code/__HELPERS/_cit_helpers.dm
@@ -57,14 +57,11 @@ GLOBAL_LIST_EMPTY(ipc_antennas_list)
//Genitals and Arousal Lists
GLOBAL_LIST_EMPTY(genitals_list)
-GLOBAL_LIST_EMPTY(cock_shapes_list)//global_lists.dm for the list initializations //Now also _DATASTRUCTURES globals.dm
-GLOBAL_LIST_EMPTY(cock_shapes_icons) //Associated list for names->icon_states for cockshapes.
+GLOBAL_LIST_EMPTY(cock_shapes_list)
GLOBAL_LIST_EMPTY(gentlemans_organ_names)
GLOBAL_LIST_EMPTY(balls_shapes_list)
-GLOBAL_LIST_EMPTY(balls_shapes_icons)
GLOBAL_LIST_EMPTY(breasts_size_list)
GLOBAL_LIST_EMPTY(breasts_shapes_list)
-GLOBAL_LIST_EMPTY(breasts_shapes_icons)
GLOBAL_LIST_EMPTY(vagina_shapes_list)
GLOBAL_LIST_INIT(cum_into_containers_list, list(/obj/item/reagent_containers/food/snacks/pie)) //Yer fuggin snowflake name list jfc
GLOBAL_LIST_INIT(dick_nouns, list("dick","cock","member","shaft"))
diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm
index ff9d1bec4c..7045767f98 100644
--- a/code/__HELPERS/global_lists.dm
+++ b/code/__HELPERS/global_lists.dm
@@ -51,26 +51,15 @@
init_sprite_accessory_subtypes(/datum/sprite_accessory/antenna, GLOB.ipc_antennas_list, roundstart = TRUE)
//genitals
init_sprite_accessory_subtypes(/datum/sprite_accessory/penis, GLOB.cock_shapes_list)
- for(var/K in GLOB.cock_shapes_list)
- var/datum/sprite_accessory/penis/value = GLOB.cock_shapes_list[K]
- GLOB.cock_shapes_icons[K] = value.icon_state
-
init_sprite_accessory_subtypes(/datum/sprite_accessory/vagina, GLOB.vagina_shapes_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/breasts, GLOB.breasts_shapes_list)
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/testicles, GLOB.balls_shapes_list)
GLOB.breasts_size_list = list ("a", "b", "c", "d", "e") //We need the list to choose from initialized, but it's no longer a sprite_accessory thing.
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", "Mutton dagger", "old blind bob","Hanging Johnny", "fishing rod", "Tally whacker", "polly rocket",
"One eyed trouser trout", "Ding dong", "ankle spanker", "Pork sword", "engine cranker", "Harry hot dog", "Davy Crockett",
"Kidney cracker", "Heat seeking moisture missile", "Giggle stick", "love whistle", "Tube steak", "Uncle Dick", "Purple helmet warrior")
- for(var/K in GLOB.breasts_shapes_list)
- var/datum/sprite_accessory/breasts/value = GLOB.breasts_shapes_list[K]
- GLOB.breasts_shapes_icons[K] = value.icon_state
-
- init_sprite_accessory_subtypes(/datum/sprite_accessory/testicles, GLOB.balls_shapes_list)
- for(var/K in GLOB.balls_shapes_list)
- var/datum/sprite_accessory/testicles/value = GLOB.balls_shapes_list[K]
- GLOB.balls_shapes_icons[K] = value.icon_state
for(var/gpath in subtypesof(/obj/item/organ/genital))
var/obj/item/organ/genital/G = gpath
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm b/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm
index 241ec8118e..92bc8e407b 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm
@@ -16,7 +16,7 @@
from doing this unless you absolutely know what you are doing, and have defined a
conversion in savefile.dm
*/
-/proc/init_sprite_accessory_subtypes(prototype, list/L, list/male, list/female,var/roundstart = FALSE)//Roundstart argument builds a specific list for roundstart parts where some parts may be locked
+/proc/init_sprite_accessory_subtypes(prototype, list/L, list/male, list/female, roundstart = FALSE, skip_prototype = TRUE)//Roundstart argument builds a specific list for roundstart parts where some parts may be locked
if(!istype(L))
L = list()
if(!istype(male))
@@ -25,7 +25,7 @@
female = list()
for(var/path in typesof(prototype))
- if(path == prototype)
+ if(path == prototype && skip_prototype)
continue
if(roundstart)
var/datum/sprite_accessory/P = path
diff --git a/modular_citadel/code/modules/arousal/arousal.dm b/modular_citadel/code/modules/arousal/arousal.dm
index 3a586d061d..aa0021bd8f 100644
--- a/modular_citadel/code/modules/arousal/arousal.dm
+++ b/modular_citadel/code/modules/arousal/arousal.dm
@@ -46,20 +46,12 @@
var/list/obj/item/organ/genital/genit_list = list()
if(!client?.prefs.arousable || (aphro && (client?.prefs.cit_toggles & NO_APHRO)) || (maso && !HAS_TRAIT(src, TRAIT_MASO)))
return // no adjusting made here
- if(strength>0)
- for(var/obj/item/organ/genital/G in internal_organs)
- if(!G.aroused_state && prob(strength*G.sensitivity))
- G.set_aroused_state(TRUE)
- G.update_appearance()
- if(G.aroused_state)
- genit_list += G
- else
- for(var/obj/item/organ/genital/G in internal_organs)
- if(G.aroused_state && prob(strength*G.sensitivity))
- G.set_aroused_state(FALSE)
- G.update_appearance()
- if(G.aroused_state)
- genit_list += G
+ for(var/obj/item/organ/genital/G in internal_organs)
+ if(genital_flags & GENITAL_CAN_AROUSE && !G.aroused_state && prob(strength*G.sensitivity))
+ G.set_aroused_state(strength > 0)
+ G.update_appearance()
+ if(G.aroused_state)
+ genit_list += G
return genit_list
/obj/item/organ/genital/proc/climaxable(mob/living/carbon/human/H, silent = FALSE) //returns the fluid source (ergo reagents holder) if found.
diff --git a/modular_citadel/code/modules/arousal/genitals.dm b/modular_citadel/code/modules/arousal/genitals.dm
index ca01ef46cb..dc299e4d4c 100644
--- a/modular_citadel/code/modules/arousal/genitals.dm
+++ b/modular_citadel/code/modules/arousal/genitals.dm
@@ -38,6 +38,8 @@
return ..()
/obj/item/organ/genital/proc/set_aroused_state(new_state)
+ if(!(genital_flags & GENITAL_CAN_AROUSE))
+ return FALSE
if(!((HAS_TRAIT(owner,TRAIT_PERMABONER) && !new_state) || HAS_TRAIT(owner,TRAIT_NEVERBONER) && new_state))
aroused_state = new_state
return aroused_state
@@ -113,17 +115,7 @@
set desc = "Allows you to toggle which genitals are showing signs of arousal."
var/list/genital_list = list()
for(var/obj/item/organ/genital/G in internal_organs)
- var/datum/sprite_accessory/S
- switch(G.type)
- if(/obj/item/organ/genital/penis)
- S = GLOB.cock_shapes_list[G.shape]
- if(/obj/item/organ/genital/testicles)
- S = GLOB.balls_shapes_list[G.shape]
- if(/obj/item/organ/genital/vagina)
- S = GLOB.vagina_shapes_list[G.shape]
- if(/obj/item/organ/genital/breasts)
- S = GLOB.breasts_shapes_list[G.shape]
- if(S?.alt_aroused)
+ if(G.genital_flags & GENITAL_CAN_AROUSE)
genital_list += G
if(!genital_list.len) //There's nothing that can show arousal
return
@@ -325,7 +317,6 @@
var/obj/item/organ/genital/G = A
var/datum/sprite_accessory/S
var/size = G.size
- var/aroused_state = G.aroused_state
switch(G.type)
if(/obj/item/organ/genital/penis)
S = GLOB.cock_shapes_list[G.shape]
@@ -338,10 +329,9 @@
if(!S || S.icon_state == "none")
continue
+ var/aroused_state = G.aroused_state && S.alt_aroused
var/mutable_appearance/genital_overlay = mutable_appearance(S.icon, layer = -layer)
- genital_overlay.icon_state = "[G.slot]_[S.icon_state]_[size]_[aroused_state]_[layertext]"
-
if(S.center)
genital_overlay = center_image(genital_overlay, S.dimension_x, S.dimension_y)
@@ -357,8 +347,8 @@
genital_overlay.color = "#[H.dna.features["breasts_color"]]"
if("vag_color")
genital_overlay.color = "#[H.dna.features["vag_color"]]"
-
- genital_overlay.icon_state = "[G.slot]_[S.icon_state]_[size]-s_[aroused_state]_[layertext]"
+
+ genital_overlay.icon_state = "[G.slot]_[S.icon_state]_[size][use_skintones ? "_s" : ""]_[aroused_state]_[layertext]"
if(layer == GENITALS_FRONT_LAYER && CHECK_BITFIELD(G.genital_flags, GENITAL_THROUGH_CLOTHES))
genital_overlay.layer = -GENITALS_EXPOSED_LAYER
diff --git a/modular_citadel/code/modules/arousal/genitals_sprite_accessories.dm b/modular_citadel/code/modules/arousal/genitals_sprite_accessories.dm
index 0c1763b8e2..594fc83e46 100644
--- a/modular_citadel/code/modules/arousal/genitals_sprite_accessories.dm
+++ b/modular_citadel/code/modules/arousal/genitals_sprite_accessories.dm
@@ -85,36 +85,36 @@
//Vaginas
/datum/sprite_accessory/vagina
icon = 'modular_citadel/icons/obj/genitals/vagina_onmob.dmi'
- icon_state = null
name = "vagina"
color_src = "vag_color"
+ alt_aroused = TRUE
/datum/sprite_accessory/vagina/human
icon_state = "human"
name = "Human"
- alt_aroused = TRUE
/datum/sprite_accessory/vagina/tentacles
icon_state = "tentacle"
name = "Tentacle"
- alt_aroused = TRUE
/datum/sprite_accessory/vagina/dentata
icon_state = "dentata"
name = "Dentata"
- alt_aroused = TRUE
/datum/sprite_accessory/vagina/hairy
icon_state = "hairy"
name = "Hairy"
+ alt_aroused = FALSE
/datum/sprite_accessory/vagina/spade
icon_state = "spade"
name = "Spade"
+ alt_aroused = FALSE
/datum/sprite_accessory/vagina/furred
icon_state = "furred"
name = "Furred"
+ alt_aroused = FALSE
/datum/sprite_accessory/vagina/gaping
icon_state = "gaping"
@@ -125,7 +125,6 @@
icon = 'modular_citadel/icons/obj/genitals/breasts_onmob.dmi'
name = "breasts"
color_src = "breasts_color"
- alt_aroused = TRUE
/datum/sprite_accessory/breasts/pair
icon_state = "pair"
diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm
index 1537d5cebe..dc7923e448 100644
--- a/modular_citadel/code/modules/arousal/organs/breasts.dm
+++ b/modular_citadel/code/modules/arousal/organs/breasts.dm
@@ -1,3 +1,6 @@
+#define BREASTS_ICON_MIN_SIZE 1
+#define BREASTS_ICON_MAX_SIZE 6
+
/obj/item/organ/genital/breasts
name = "breasts"
desc = "Female milk producing organs."
@@ -9,7 +12,7 @@
fluid_id = /datum/reagent/consumable/milk
fluid_rate = MILK_RATE
shape = "pair"
- genital_flags = CAN_MASTURBATE_WITH|CAN_CLIMAX_WITH|GENITAL_FUID_PRODUCTION
+ genital_flags = CAN_MASTURBATE_WITH|CAN_CLIMAX_WITH|GENITAL_FUID_PRODUCTION|GENITAL_CAN_AROUSE
masturbation_verb = "massage"
arousal_verb = "Your breasts start feeling sensitive"
unarousal_verb = "Your breasts no longer feel sensitive"
@@ -49,21 +52,21 @@
var/datum/reagent/R = GLOB.chemical_reagents_list[fluid_id]
if(R)
desc += " They're leaking [lowertext(R.name)]."
- var/string
+ var/datum/sprite_accessory/S = GLOB.breasts_shapes_list[shape]
+ var/icon_shape = S ? S.icon_state : "pair"
+ var/icon_size = CLAMP(breast_values[size], BREASTS_ICON_MIN_SIZE, BREASTS_ICON_MAX_SIZE)
+ icon_state = "breasts_[icon_shape]_[breast_values[icon_size]]"
if(owner)
if(owner.dna.species.use_skintones && owner.dna.features["genitals_use_skintone"])
if(ishuman(owner)) // Check before recasting type, although someone fucked up if you're not human AND have use_skintones somehow...
var/mob/living/carbon/human/H = owner // only human mobs have skin_tone, which we need.
color = "#[skintone2hex(H.skin_tone)]"
- string = "breasts_[GLOB.breasts_shapes_icons[shape]]_[size]-s"
+ icon_state += "_s"
else
color = "#[owner.dna.features["breasts_color"]]"
- string = "breasts_[GLOB.breasts_shapes_icons[shape]]_[size]"
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
- icon_state = sanitize_text(string)
H.update_genitals()
- icon_state = sanitize_text(string)
//Allows breasts to grow and change size, with sprite changes too.
//maximum wah
@@ -130,3 +133,6 @@
cached_size = size
size = breast_values[size]
prev_size = cached_size
+
+#undef BREASTS_ICON_MIN_SIZE
+#undef BREASTS_ICON_MAX_SIZE
\ No newline at end of file
diff --git a/modular_citadel/code/modules/arousal/organs/penis.dm b/modular_citadel/code/modules/arousal/organs/penis.dm
index c6d3c764ac..791a186732 100644
--- a/modular_citadel/code/modules/arousal/organs/penis.dm
+++ b/modular_citadel/code/modules/arousal/organs/penis.dm
@@ -8,7 +8,7 @@
masturbation_verb = "stroke"
arousal_verb = "You pop a boner"
unarousal_verb = "Your boner goes down"
- genital_flags = CAN_MASTURBATE_WITH|CAN_CLIMAX_WITH
+ genital_flags = CAN_MASTURBATE_WITH|CAN_CLIMAX_WITH|GENITAL_CAN_AROUSE
linked_organ_slot = ORGAN_SLOT_TESTICLES
fluid_transfer_factor = 0.5
size = 2 //arbitrary value derived from length and girth for sprites.
@@ -73,22 +73,21 @@
/obj/item/organ/genital/penis/update_appearance()
. = ..()
- var/string
+ var/datum/sprite_accessory/S = GLOB.cock_shapes_list[shape]
+ var/icon_shape = S ? S.icon_state : "human"
+ icon_state = "penis_[icon_shape]_[size]"
var/lowershape = lowertext(shape)
desc = "You see [aroused_state ? "an erect" : "a flaccid"] [lowershape] [name]. You estimate it's about [round(length, 0.25)] inch[round(length, 0.25) != 1 ? "es" : ""] long and [round(girth, 0.25)] inch[round(girth, 0.25) != 1 ? "es" : ""] in girth."
-
if(owner)
if(owner.dna.species.use_skintones && owner.dna.features["genitals_use_skintone"])
if(ishuman(owner)) // Check before recasting type, although someone fucked up if you're not human AND have use_skintones somehow...
var/mob/living/carbon/human/H = owner // only human mobs have skin_tone, which we need.
color = "#[skintone2hex(H.skin_tone)]"
- string = "penis_[GLOB.cock_shapes_icons[shape]]_[size]-s"
+ icon_state += "_s"
else
color = "#[owner.dna.features["cock_color"]]"
- string = "penis_[GLOB.cock_shapes_icons[shape]]_[size]"
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
- icon_state = sanitize_text(string)
H.update_genitals()
/obj/item/organ/genital/penis/get_features(mob/living/carbon/human/H)
diff --git a/modular_citadel/code/modules/arousal/organs/testicles.dm b/modular_citadel/code/modules/arousal/organs/testicles.dm
index 9573020417..eb6c1536cb 100644
--- a/modular_citadel/code/modules/arousal/organs/testicles.dm
+++ b/modular_citadel/code/modules/arousal/organs/testicles.dm
@@ -43,19 +43,19 @@
/obj/item/organ/genital/testicles/update_appearance()
. = ..()
desc = "You see an [size_name] pair of testicles."
+ var/datum/sprite_accessory/S = GLOB.balls_shapes_list[shape]
+ var/icon_shape = S ? S.icon_state : "single"
+ icon_state = "testicles_[icon_shape]_[size]"
if(owner)
- var/string
if(owner.dna.species.use_skintones && owner.dna.features["genitals_use_skintone"])
if(ishuman(owner)) // Check before recasting type, although someone fucked up if you're not human AND have use_skintones somehow...
var/mob/living/carbon/human/H = owner // only human mobs have skin_tone, which we need.
color = "#[skintone2hex(H.skin_tone)]"
- string = "testicles_[GLOB.balls_shapes_icons[shape]]_[size]-s"
+ icon_state += "_s"
else
color = "#[owner.dna.features["balls_color"]]"
- string = "testicles_[GLOB.balls_shapes_icons[shape]]_[size]"
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
- icon_state = sanitize_text(string)
H.update_genitals()
/obj/item/organ/genital/testicles/get_features(mob/living/carbon/human/H)
diff --git a/modular_citadel/code/modules/arousal/organs/vagina.dm b/modular_citadel/code/modules/arousal/organs/vagina.dm
index 3f1bcc5f9b..311afe75b0 100644
--- a/modular_citadel/code/modules/arousal/organs/vagina.dm
+++ b/modular_citadel/code/modules/arousal/organs/vagina.dm
@@ -6,7 +6,7 @@
zone = BODY_ZONE_PRECISE_GROIN
slot = "vagina"
size = 1 //There is only 1 size right now
- genital_flags = CAN_MASTURBATE_WITH|CAN_CLIMAX_WITH
+ genital_flags = CAN_MASTURBATE_WITH|CAN_CLIMAX_WITH|GENITAL_CAN_AROUSE
masturbation_verb = "finger"
arousal_verb = "You feel wetness on your crotch"
unarousal_verb = "You no longer feel wet"
@@ -22,7 +22,7 @@
/obj/item/organ/genital/vagina/update_appearance()
. = ..()
- var/string //Keeping this code here, so making multiple sprites for the different kinds is easier.
+ icon_state = "vagina"
var/lowershape = lowertext(shape)
var/details
@@ -55,13 +55,11 @@
if(ishuman(owner)) // Check before recasting type, although someone fucked up if you're not human AND have use_skintones somehow...
var/mob/living/carbon/human/H = owner // only human mobs have skin_tone, which we need.
color = "#[skintone2hex(H.skin_tone)]"
- string = "vagina-s"
+ icon_state += "_s"
else
color = "#[owner.dna.features["vag_color"]]"
- string = "vagina"
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
- icon_state = sanitize_text(string)
H.update_genitals()
/obj/item/organ/genital/vagina/get_features(mob/living/carbon/human/H)
diff --git a/modular_citadel/icons/obj/genitals/breasts.dmi b/modular_citadel/icons/obj/genitals/breasts.dmi
index d70207ee69ace42c2e782db691617821177f0389..24656062d26e3edf15d6a753650aaef61ed9abb4 100644
GIT binary patch
delta 1265
zcmey*)z78c8Q|y6%O%Cdz`(%k>ERLtqz`~F3p0>h@Tt%QNXbo9m6!P6@V`>Bs2|8>
zED7=pW^j0RBMr!TGBIAX{xny!fq?7vli@6Pr|;W#S7hmq75fz~`eZNQpM7N8{CH1=
zbzD2&r9GH;bgr<6UfaxDc
z(+Zbu*?4)!!#7D!<{pw^UaOcnHmJ)j=~s&w9+`)*F?h$D^O-ZrxU1YPcDWP_q{>|`
z%{~8h`W>D^`}ql+EqfY&^88;IGo|!leVcrG-_xGIPj5RjFfgz8ba4!+nDcg4px@>I
zf!5Qh%u74DA0+kmvpr(^^`uxjrcwGuy_}EK^uO^LN$KYlg6G_RA^&`j>=NUc1toU;
ztEZkWH5R@4Ya6fAn$Kk~tllN}n0^gST`iwf!*pIs<-GWoFCxpTcz;yvPuthVU(m1Z
zVlSfN%^}QtL#XLXj;ruIQ;k*3*#a95wxnx2#h2;kPIz^9Bb)2iMAp?^<{DaY0<~E;
zF4VI*|95_KJ;m9Vdl~bMBjIIi=C}X8%C-;5k++lXQGb%RJGuV;9r?`WUt8mg{mb0#
z!*cG;=q-)k$orN1b@=yy4fb_!&-31p^s0XI!*t!lWo!Gc4Zm#t;+rl%
z72^5&!q!UUiD>uI{(Y1564q?Ldy&oc&b|lf(^kHIvDrj-;q&&0)PFx$uJNy*e){RJ
z)mk^1Z|fP#uv>+tOnAU8vwouZG_Ll`47?M>r_FPE(p_j!S&=kPH=|W9oI~#Te}jt+
zx{4nCE-kw^v!<CjgbX9OhJ7RM(_GFOvB|YY9_D^QOnF2f6o2{E~n1hIP*by9>wo
z%h+xoKfOlN=F`y%r+F{m9IZ^evGAuwqx$Y<@fyRt3_sc17e3UT<>Z=F_kuOP=W@yC
zW8X6#EPFenzGnG$)ru$GpLg)FKAg4DcwSp-RnrCTeHQr-uJ`;jslWHRNp-Jc3&@ZK
z()s)}SrLXg|;gtBX8i%Lc*>(#)
zwwlTZ{5&*^e??8=S@w{9^#;$Fwc;Z{n%4YmI0sVq9H_2A_5{~WD{SN&4XKEqzJ53GyD^1S{jc9VT4Ch(v63^exw)b=JrAoI{1{tSo}95A~-
zfz*KPo^juv>F$HS%6j$x>rXr_+F7@@&Q5*?aeaYK^k|
zjK|!?5O)I&1-V{v}2G>s6loY&Z=xJZAo`uldtv
zJTLYZ@J{QjwA)@V@4T+z`TL6)`&LJ)sz3XAN9c1+-btWD&9{=BG4`wKZ|w`IN_$|w
R6j($tc)I$ztaD0e0sv0PT3Y}B
delta 1395
zcmXw(e>~H99LK+Y^kb7IA~)w(Wx7hYZXx5$gteHKcGn(p*wGSWWJQ9{EQ&KPAov-_^={`frKKR)mG`|*0bAD_o33$B6NrIY;$
zhHxYt002YcVXpwljzXtFUk~DZ<=Jt_*xs*2&Yp>7ongiRKqCKk-pkD?Xmg*_s;!11B(wZVvibT8>jEP3P{CCWGRYOY
z+`m?>19|*rd0aMX^}3}ZrL>e^n=4SoNiWp}R#2DvdmPoLUeb=;UAiCF+=?9oDPU%p
z88Mmx20fl)w2%y?0L2G3vo~)~;2qLKbkNU}EYqL{X(i6-q7k=3F$IC$j!PEFm-B)Dtl;yf#-UpDU
zzK6`4GEu&HWYiGjTIvBOaL$RK>OI-?c>6MQVq2Y;WBt^g{iXn*Z$$LMQxf@eh4>g5
z+9)kOUMJ;^UQ2GqvqS0cb*Kr3CI8qj>((B+|LbMvx#*FDd*!PrD>ACgQ!y|6YPD@M
zab*d^EAT_yEh!usc%?i!Ac$79)qY9{I?;C!Csn5zHke`2_b&bh&TR8mIM9mIBx@JC
zWY~eCS)iZRl$cKQjt?%e4J`4EdUq$hE#KCUO1VUzdL{R~>e?c!j?Sn3Ab>@z+0&^M
z13I8)@hw70_EnjN9id|*ldowZ^J-hGvawVu&NAfpbC1WcB5@76SvBVd)+Zk=cbExr
z12-)f$;vEeK#p+2l~?J`7^ES~#2#v_c*Nps_q3TD8VlB}-$w}QX}AfVmMKGVedRx~
zEkcL8&4<(W9gz1DH+`4~mb&RI{IlmTibfSdX78I#ZRUzWXR-Bq@p@DOu_%Oa>w4G5
z3c$g(P>_UFonDMji)q?dH)qgqG?_J@9@=1;5eQmO*oD|cZZX?xVa8d;iZAC4oy&1K
z;_D{2qnOlRD;F?vIUV8OegB|y)*wpPO(c}q(z}3-o0XU(WQi+qiwfVyZ*TV+us0By>SG~sv
z&0=@If#HlR)N)_Zg)Pb(D)2eJW6WSC)p|O!PLoVq%_FV|bo8cOa^zth$fi}c&v@IS
zknp@Ei$pcTv@0YLuZ>;nQr&RZPL!{G#1#0UdJjd&*yv>IWwueS{K2OeN*g$>Ir)wS
z4*{=n@pjLjAf0cFWx3}|NXu;UBx#sU{y?haBaYMzGK=Z%yTAoHuDC!O_GUw&d=l2Z
zRe?`;KB||YEN{wHVS4gYen=g3lM=|4EUyPz2RzyLpHq%`p-x
zr(?-CTtgt;<0Cq29`X?xH88d_);c#aK820${%>ge`7j0khI8_~kCbc7e56IBl)L?l
zoH?x~2$K+E_cD)EYwl`gcZ91PvKR5uwgPXIe!0WW{?yPsy9ut$coCoAVr$KBLEl0=
t^6lKvXE)AO880@%So6|M?K8|>(_?aPhGc-HP0$Ys5WW4qDm+6|{sr=IyNUn+
diff --git a/modular_citadel/icons/obj/genitals/breasts_onmob.dmi b/modular_citadel/icons/obj/genitals/breasts_onmob.dmi
index 371041b6f43e5bcfb878cc3f3162725d82fafe8e..578086c4c30308b403f1930738b9141dd13da6f3 100644
GIT binary patch
literal 6159
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
diff --git a/modular_citadel/icons/obj/genitals/penis.dmi b/modular_citadel/icons/obj/genitals/penis.dmi
index 517758b24833b7b4c7b6a29b55861948a93a239e..c3fd184a7c2c900c8ea9183564f8724d2463011a 100644
GIT binary patch
delta 4301
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
literal 4707
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
HgC+eROJWij
diff --git a/modular_citadel/icons/obj/genitals/penis_onmob.dmi b/modular_citadel/icons/obj/genitals/penis_onmob.dmi
index 4f84c52360e29564eae9c42e40747cf9df328bdb..4a92bffa2a6ff4664f4391bd542c2eee7209ee93 100644
GIT binary patch
literal 9279
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
literal 10002
zcmaKS2|QG7|Nbzc)SyzbWO!PIrcxv^(@H5srLv4|VWr_+}
zMtNj6mNd4^h_Q{qSZ6zP{%6$tyzlRQ>+i#yai25ie3$F{y{`Md=cbL7IZ9ql9)Uoh
z4q5ECMIaX7B!3H$@JNUD*9iEq#pcNI0|o{L{r&wA1bzAPWq5cvD=Ul3;$4-Y@XH
zuMYwdlH8Wm;M0jyK1iQX-q`W{#OrVFMoZtiAKP@|+nUTHf1U6nao&z}(Q&4!m)+Jg
z7RhJlUH&75KNdIG;~f`Z{NWKHxxxHCEx#9I7vB+K7K%OG#
zoij3Fc{(E@8-sbjo>p5qa`yhfE$;VFZZA8LUvR6}<S;;(kWy>F#H@cJhQp0SS?rn}y~aBElJaow(EIhU={qtY&9+r8c1v=SYa
z?a}F)cGgONr@Z_-=FqN|_Z7MsNt}wY&_nD0Hd>dYH>dGPKiy@&%(;!L*w@~_tiESf
zGjK#tey{gpwUsixmvYiycJAq|uW{cK({;GseGe&V*XCQHT92{WYZv;oVzbsRyx0}C
z_lfnmS$abJ>Fq;zTk5U6PVM|+ooc~OXgVTabZVg65V67T$jH~w0|||p8f~bc!^%mv
zI$22S*+)t5o4FZQ?(u~MX#Feg-o!04qfL?MQf0OM`?%v3Owr>eqA`)B
zu+Z?Gc|&U5o;@emvNX;pDb|MW3O{-=cPRT+-Gyzdm4c-Ch7)VGYcl;!pRPXP^Ja)c
zoz3w0;+l23wj;1#$s8>`y*u=;FDIMp-nXUttXDKi(_0zy#4B-U|85@-kNd;X_fXGf
zx{&J(yJV$p1sj`PDNYJ0%~!P&zD#-U*?3dhlCkir-pmP#gD`B5cr=|Dqud^SZeT^%
zs{RzAYJWe)TrI|en0#QPC$sxWrE_Vrh}VtVFW-Lz2FXADX7=WhWRPCYItCEsaaH!T0huU~!&!s7Bp_
zaiw{IuJ-rlcO0cMw?#d~8vJ{R3T|eliuhZM>;SLI^e`ph$JD#In
z0_*ng{xCxo38=wNb07tHYqxtZmj^1lrXPJN^2%&s$Jw6>0vFA^Ivf%~D}yT7zM;qz
z5K#&a5tNrmTwy%Ur$W)EfM!cxODlExcL$(?jlGIY`5ujDBq)KoBS}3tg{C6KrVa)a
zVJ>P`5_a14VVFfmHlKkFn*{iDc?>j-nl=xIFwyO*r7TpSK-NEKgKwI7q4fE#8Y86*
z!PB7P?_9*?`hF{T!ljv=ZWLITiEHzd4i7>-SH8{NTVzEgzNEUu^id#BDBnxe$rol5
zl_O+mWyF_IHyg<5!qyIAOr7UO)vE=xQgHz}fr2}nY5h=Ks!5IWO=Hbx@KqI-FSSc3
z@Wx+Lru9Hu(u&ujjw7?P!;w1SGM|c4N{MA6Q&KIIu;_OdA|gu#wf8dxWNwW|o%Z{u
z^hW&KNYgjogTVIL`(GOI)JPOo_#vNv0nO~>=SW`Ax52gVrsxf{`Cb*46~z
z&>=39c1$Sx+DJW$)Op~HY{s3TQD6BZv%@0~aw3W&^mq-pLfmaP2CF8n;CCL#mgkI(u&`jj__Ofr+HtSrh-1e
z>g|q`1LXONVui0g<&)l8lZo{dVl{pXpvAMR1}1`E&&oc)BkxkZ#5YW;@3bc<+6>QS
z`b$+Y2rViY9P;Y!C|Un$&V~rS^kWXXjb=R~y(!oR+$WWBUQ4Zd-y8B%0ryz>gQ&@`
z3Vz?F+ZMMkEp?O1z<-;3LDrP{Ujxh4AeWUBS!JzzyiRk#ut`y-uhs@UVd{df3*S5V
z^@m{~5IeF`>0~kTYY!H4Ir72hZM$`$xehIG&XWZ=)=DXea%SJr(exBJv_@OjK?S+v
z)Tl?ABW0$#5MA15xM0c}SpPJVl7lBq2S{?k1&KLkoiJ%cwO1y;8
z??cc^MN~ZTcILqLrePGX<&zJ`yGqVN=$uAeVAwR>Q^n}_t+Us%HZCua-3G|yl@`X%
zKo?E|Wikee`er-QiDuz4_gZm@>LEL)b@VP>6Ca|uFy+_gT%(5atX1WBoUWF2)A!A!
zkoHjo7qZJ^)*kP}G;X?2%qo3;9Uw=Q_XM*l842n1&BHZ_XC4=z*Pxb^W=fAL7qtsCtt
zoZxco2et?xkP6)zh%5Sg-x5V|2zX3D?oi@;4*)sc*q+Z%w1W=#3Q=Eh{gj8~8I|lY
zlS18~BI!+;zUjn-qxez;%1sWA_SKyqWIuI{c)#u2?D0`PsB*JCjwL<@ijHHLJp5Vh
z{qUohm)Bv+gZ5*R%0i{Wa-|lpO#3Yf=&OHyUN^3WVZ5(ny&;>{2)TWfs2FohiJ0wo
z`$l02=0;(exslD@h>ZDhtXO~<|Mop8eE5mFR(ct8imU{@LMARr?d?bP@2XT>e`=n<
z7%zIaftZ!wC(ZOq>vXZ5I_YIwXQz*S|M{BXJzQ}u1v?Sp1}t1H4nc+-btLZ+hxU;Bc&
zGnnWYbL%Whpy)Xry~FW2v|{l*eT9nV=7ttI{qQPOl)dKwovJa<*Dc&6XQ2JcswZgf
zPks)b?5)o9P1}G6x;v!!%MthrJy7
zRzigU&0mV?oh0b|&=xa1r*N=tUPb7xrVh`?LY+2@S>w)2)}!oosesP@
zy`xd!(tEG5*JPB*4MlgcV$GEqL@zDx?Mf&&ry7O4H9;`u&
z%x!1MSGQliGM@fiFP$s@;{Rv2X7fk|F=h=T%kXb0Y~7E7i6@|#U|W#(hjxij>YZp(8;|Q4_b#@Il1p5n)yU#G{!kE
zGOGQA(7aY&`4{nK9T%(AMaI<1g_NY0T>m0gk+T+0R<#kNywS{bA1QkJEOwWpQ3Quh
z4H6GXh6gDTk?@OHK&3lDTb7)dsyg8l`3_&+DK|9D*F`h)jb0a8!c1)BcUYWJwArLZ
zQB}rq;5jumkuztg1BJ)3@6c|0NN;so
z!-(vBZC
zF0T-dzG4o4Y-oo&2iCpfqSV}U65sACPzMz)y&O(6HI-K#au1kEDDuXZ9%h3xUfmcN_Y*SbxiiRJ%D{Txtg
zg$=P4Kaw7UHA=8CpQ=1@mtYVA<;Ok8FM6}uN&JD2{77~+06s}+_AsK0jC)$Iw^|#f
zCi_K3`@D|~6O8Hb2jzJd)JH$?o1KdFm$?@Y_3DydigI!Nn5CdHDyr%SqRks=5B?j_
zYSqpELUZ~Sxxz`Q-0pJp9Z*A11&_~5xqV3Ek|-lD4uTGoTIA|x%at~QHhpX8cR|?s
zyz~C~!-EvlRfojq;+}`kfOtoajF&`Wq8Eyl-%UlgIY-L=0n|te@t6s4>i?WHKS7~}
zNF_uYs5eH8%GwGS9LGlPX@glq(;5$oPQpc(ohy)*S79RT&B_zhc@^_ob8$|YG^(Eq
zE6pZcrxiI}AblA4Q%B8JC{q4UqbUOJuV;D)gv&`z&GwAJy;q!6(3;ataSC?{}>>uL9rp7M}NuT(3WuGn@lFIELe!_1}
zome6J%bYVeo)n)R7^1d2&XO~z;8Vy+gcjqkhU)p-!ZHL~BJSk-7JJ8xzmA>*IHDwC
zz)08IWS8BuUS;Qz4B4FhMiY}$!gjCfXM)33KnVD5%DR|s*uM5dg=P-~2k+1eU%UK#
zQ=!oD`Q}~5&)P3`{BvR4T#?1Tz`U9YA>0S`56xV<@SfNmw$E;s{@w3AC;Jloyc>kt(Jq)A
z{q40bZHGhcJ!sv5CxZC-{OsePN)8}(lBly%xha5U^VHn9f?LNziP(dRp2mL2L#N@;
z5Wy>uVXjn3`KMS@kp3n9suCAF_)Nl2+ixVRixYRBDBEv
zq4y02Lt^|GoLJvXonVo;a7*VY9CO(SH*;)yfT2*VOZHIfI-7`+OO+kXIvZ*TGs7yBM#`q?lyL34YTih4>Fb{+cC~gZQxK6GAZV8
z91Q$=r|fq_$}Sq8pP-(N3npZp2n4E`+MD^TtTqH%#AgWNLNm2Icp!s@=ZgA56m2f%
zSu%pL&mq&@0j$Jm&m4Fzye_+}Vt_nL$F@RGgzVmqy!rf7T*X|o)47fy7_r?o5HKUa
zRL8hy$GAK-I7+Ef^y7#e4wI>qe9O4!qOF&j(9K#ARHg4#13hr=Ef2#r4AI_F#W!VD
ztNv7iE{=hn{DNm+>Xo=K;vFEE?NFZfa-4ml`}#xg!*%U0<*Nr}Wz7unQHtiOYTy+iu-q=>oDR#x%Vg7&|h
zOdt=h>*+xYt`3<;S5s9#%zU)TVAVfxifzJrzUTDu3%s;U^vqY04Z3EzB8U0q4x=_r
zEBJGgE>`j87K|&qe|NQK4?AI9_3vi**Dp?+mhFK;zLp_(3q2)W?+H=QbPAw$2S<8B
zN8rA3dOPU~5g8r~u?D2XeKbuy$OC@V@T1^4ypJXmD<1tg>Fd#q`zoX07d*vfvygCY
zeY1Vs$)9s;#yv>o3z3BRKKVNSd63u?zMFf*s23cD1sjz8hAfp}S$tRAF0+4mY~nXIw;k}`RcsHdeJ#A+T(h#P0C*zmz$tjgR;W6UT`*b0&Z
zdT2Y8RxfaNv_cLGFe(}a<{zS(%FiD4ELj{(%1v?&FY9?oU|3^gKFi+8p`yiUI)5LD
z7mNM28~Qm$Fe-gdbf2jlH6^7qWDoZ?dD0{*U^20RJgI*!TaGh&^e8$le^7A&yd0Hd
z{d`mIFfwp6l>FCYO
zMW5@wM~x+*Bm5#QSCW*%rdI3a2>8cvSJh%3y@7}MK!8ucb3^47}N
zYeH+Jm$}+=&^o#{zet!#{q2D;!it%CQN_6gNI!27UN}@NhJ>H4tgR%IIggeWP6(=!
zBg`6Cr^QwulB^Do3h)G|pc&`0FA`f>WO{F_;oFidgR@H8!^kNUunBf7@l=lv>EY4bUbE)`zoMP|lT}$j@Y2<>|@v33Dk4-v~
z2TTYIX6>o(p{I1kX2G%x8_|IL*5w>i}?jP_QpzO75t($CKE(=r>Ii0Eq<8Skc(w)N@t3#Unp+u9g>?Kn)z5XgC8eo);6<$
zO(U?ps_6DA8?--0yF%YbVZ*anj(9xat1-6AV2xkzT<_z28YMt()6)3*y0@|7KmPwVv9edBR4&3+dzyO=(KZp1PQrr*z270S6;wG91_GF*eInOtZ@l=#cN#6)dhOK-`n0
zrDKLcCH#F|xeJ0(V<(6_xT6L4*ZF5e<$!6y5VZ$1j>9f{!NfF(m^01vKY}Y`**q
zX(2nEeg&S~2SIbj?BpNF6mA(9ow_`RaNlqB0$wEXfLB{U^c}Jt^HOMk=FS51ZJ%!#
zHsfw^>*U5bceOQ(Zp*fe3E&-pr`*gPpUta+3b^@XA?H$-TX>%D;RxO5re;yWLtBn)
zH3NFAsOU`ef_<5=yduDx146N4)p&7KN9)w`msnW`Irv0@Yl-iVCcqW@Z3#RKt3aa?
zNlyJlW#ixRZ9bT`(cp64ce@dXt#|f`as-^L`W|GAuQ(o7fW9H1Cj;X0xH&HiSX~De
zd0S`u9uRF3Ug8Ix{nTTf4SRD#;thV6+3zBQK+p`09*^@+d@(S3%!LmDaC9Odb2=8=
zHPw7UY;8ebofwYQQv?m@GC>Metv>RBUT}~GBICo>;q#xZ*>QWlAzU&j{
z7JK{B6XM%qaWdF8CdU3PDDG0`(m)SE1e#o8(x#MZQ|8gx*Slz0H
z;HTU1VB3Tk`&p1V7>utQ8dsF_W*0xIzWG@=p!j%i{eD$=12^3dG_Dr6`@O`AuyWIpN
zIxUbo14A>HgFt#Q5N-RRET8ggorFL{e#$M@40ZZ<=+4uDhK@mc5i)+MaW=fzndAhJ
z^J#;g#U2Ybhbz#^#IIvfp{35b^K9Vw-81V?Nxv{K^a9XKk&YEW9@Rjrcfo5)SHWZS
zx~_E}_E8e+l>4SmKO#Wf>n`(t7nF$0!Ym&m0ClQ>|FZkWrl8)Um#RNDCM%vR*2E$M
zQ;c=~2@`zz@V;$*h=!wnR;r`P$9{A^J@@N9jWwgDkrVv$Fse($@u*Of4R8_1@%~c%sZOS?bPhW3uC%LMf*Q(SgEsJxAs4~T}
z*d{`OkP-|jWCTWd;<3L&-=7V)J;GsfO^yJ6f-utw+Tls2(SjNlI`TA9BfyA8Gni&2
zz%$-06jTUx&s}#OM<&DA>)BvZRrT4h33tXB_$UPpVD{k91K6$fe+NDXZe
z9=SPWTJ5E*@9TCa?sy6(#X$nibw?tpxA9>3NuPZyiYFYu#!3Ki73>9fL|Axeq!le{
z)VZEwAnDYs8EXmlynL<&)Vd7*b6rB-9^XMX3Fx+jFGf9M&17C|>N1wlD0&HFuOx%b
zV8WzMQFt+YUh5|qYBT#`3Z2l8{E4?-@I>hKe_DU51bGvvenQT8;b3Ms96A7+8Dpf!
z=Z?cVbq%S4QO;xZrDFQE$s`t3Rk34euE{
z`}A$ak`ua`iY-Gnvu7qx22Ni*D0)DL9&9Zsby!91w8k#HvDw7IOlQx>85Kb4Gd~})
zzi~F3xTN?@^{1$B@gEyoqeFUSm&L)G>Gu_yS_1j`Fo@W`&xm?|ubSII63*+9e+5!U
zJ&<2V;2GkUqnZ)&Ijs6Z8ccI;`R^4;5|Ke1Ub}sj0?%YPzJ%3gC27?$X1lu;X{6LWgW2D{oFkxH@asG{v+l7GN!0{Fcv3+638+gYu*mb;A
zXWL-`e0}~n@VkmbAe`v6$s>l8gaB3*}zCZZ)f0>RLrUVu-GXZY(u)58ZzD~!9s
zePX=BU$Z6uedl&LK^=3zsl&vn<>9bz$^YdW%>Hq;4>y}FvBWTy2#X9x9PV!|EoDDY
zuu(DFn~_;Zj*yV~Sz`=yZ!DLGacPt~6Vr@_5U{L~jH}9Q20Cs5sEhD22hb76ko8KJ
zG$dFl6vmF9Uzd=J=?e=zlp*OUur~SitV-f<$W{a7^c^!hOj|vovL&Ebkp&mcxR`c&
zpj(N?bD@RB$7<>Nzvp)=(RnU($$yo71@kJCH~lSk)4&Ga9n}Ei`3xotV~bwGUe0R_
z^lkFi(y&zzoXfRE%O0d|PW^>*y}aLe7Y&0IKl>ezbeMnBS0Hsp(wv}CSh2#XI|KXm
zpNWH>{+4TCwxMn}VCGIc`Y{jGqqwn(vnA#=3#B#MMN!|jp7VJwD^0ny>VaCdl8<&q
z<}GA`{&ZZJ+|AElam-46#%K&fwiy>$<=$=n9}!GD523wA;?fV}k6e(1@X!IP{keNx
GuKho^x18Sq
diff --git a/modular_citadel/icons/obj/genitals/taur_penis_onmob.dmi b/modular_citadel/icons/obj/genitals/taur_penis_onmob.dmi
index ae2339e2e0bd84400814bd62b29f58045746a76b..e8efbec21664496ce1b1c9b3be94166cff7f994d 100644
GIT binary patch
delta 308
zcmV-40n7f04TuepNq-%BR9JLGWpiV4X>fFDZ*Bkpc$}q{u?~VT5Qb;^6b9V<3qpZuY+?Ppq&WqG%UVp7dJ%5II%~(C;d=7tb
z5y%NDck6m%5K#+~O)W@PHPs-Ynp%*oYC*E^=)OfsK_}OFgSRe>0>bOO!Mhhm{}B#&R-~UF;5YCyRlguIo8z-^
G0T~5Dl!re6
delta 309
zcmV-50m}Y}4T%kqNq-)CR9JLGWpiV4X>fFDZ*Bkpc$~eKyAFad6ozN|6b;N8ZgF!V
z5M_{8AS4uNR3Nm`*B6W}EGC}c#H}5^o-gN?dOXPvdBM|D&hBDVvhVnw$6KE{4_WJW
zy6j@+v_hU+Jzb)ZDP3tX9o<26QkBiM8bw_OrC%o5F)vb=Ie)br)%*-|nz6cx`5b)U
zLXeB7+@qwRab+6a%w=bssYKW?`p(oZpff9{UKt2MkInZHy9UyTnKUz
zm0KnX1j(k$M1eIVt1c4-f@D=w{f$C5DojRn()Iw30=~8n=&0=k90i1JH^8-t@hkzT
z-Fd%7MK>)ST`6S=pSM5nTYALxw4pl}M*-pWw4s|9N52vFcvhsZ@9z^1aZqm(9pSCB
HZvhzv9qfoa
diff --git a/modular_citadel/icons/obj/genitals/testicles.dmi b/modular_citadel/icons/obj/genitals/testicles.dmi
index 3d7a5f4f4801004f4439bf82c46f6f34a1b8b14f..386eab095611a897e830e17f1f6caab623bec21a 100644
GIT binary patch
delta 1002
zcmV=g(t+%(gz`(!<3C0`%0004WQchCk-DN1l!+ZsiHM0R%p$XgTuT0%-hxGOb^1+{vl;+Z2yWTXnPQM@$F2S75>2TEQ
zjgEa9Y^{|CoII}s@yL*3QE25bQi_#Uk2pSI&A$Z(V!Y2l17VnE7%DkZ%MqJVY@m#4
zIgk}W9-V_A^0py=5^ozK@wOMsxklz~FZUlRP1`r$5B>mfe%kYP?Z(#t00P)aL_t(|
zob8%zlfobjgey|8umAt&9tq$%XA(M%=-gd)oc2St`&6jPuESt5nM`lf1@uXOcfC5-
zK=2@q34f6n=a4`|@Z%W9@jO8?iOGQlZ~(wPA^QWsX#((nh>QXH7XX%^0tf`+M5+LU
z0UWyBa13rN0r-zWB)Cj&nx>iecabJ20Pq&Tjs;lYEm#%-Kp?o_)kSb%0B#k4Bv{jx
zCvOB`2$DY!P%aVy+|Os+0R#d77y)2p0p>{{z!3ld#{fKz0SSPkpJyQl5aTq#g94aw
z^z$ry0@z%C#uLZD!vqXC3s(kU-y>)z$6$sD7;zRp5pJ>Il^fA*6u`QMu==zK48Sla
z1bFax=`cmOrDNa^Pr-YI0!Sak>*`^{`6B{61U%U6&!^w;&D%k^Cjs!gplr@*2Dq6d
z+|Yd6%Kof_LL2B|Z!(!oCX>nZdTE!|YJXhTbw&_>F4EV9WlsbtKk%(p&1?MG{J=jf
zt26{Fs0Bb6)Rk>sS@Hy}pvo`lG>b6GTz*ghaB0h~Z5#PQ1`r6O{2&7?6@ViU^M$0a
z2moS!a0jRa=Yupa~%53)!QXkS~|=
z17BW$8Ox1GPXak#Kmtez0_`v62XG9@^EHIPBpgz{P!R_9gFwm;kS^fI2=2KXQOXw%
zNXQR7nrA*K;pnIOMfK@#Ws}KdGMP+&S-+zHSDPsN|CU-m*R=hA)4%cm1a<%4_Lu*k
zpzZ&M^ZCNvMAiQ*@`Y-m>i-8tzVPj#=>Ii;`9k$j_5YfD0i^H$75PFTQ1<_dd?5p<
z`~UO#LLt!i|EKeXJ3`<7U-kb4>;FwAlgVT<_1CAHhPU+pqW>HE{}w>+{=ez}g8u)k
zj`sh(0b2ckZ-8e1{{{fD{q79V?*BXLSpVM>;86eH6X00?-fFD
zZ*Bkpc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDSycTa*U0*I5Sc+(=$pS
zoZ^zil2jm5sU)?yBr`cDwOEOZGbOXA7$|1Q#hF%=n41b=W2%fV&df{CNsTuoU5gRv
zT8xR;qDzh^$kAj(jwWLwG?8FxMrKM%Y92|E0M$ZDBtW&05D9RHkrYNSr;(!xPrxcG
zxca$(^92APn1Ay_ka-$)0009VNkl9$npaU4O6pYxx0yP66#yfR=uOi_if8
z0m}CP?GB)hl56A+YQ>@h05Ja(01)sQqz-BopziX#h>rb+k#%
zFn_2$9vp+7CQ!q(NOW)!X4v;^lfi4nM@{=$@G3r
zq&xlRWtry#gj7h7Kg}}}Km->=kk|b|J^@hc3=F0aa+Lt(vwr|k4fYNI!Ad#;5b{@d
zblZ3gHr2qNBuFrAuA2>vvX&nJh>vzE0Ef5;9e)52pnMOo?Es>|ewF~@vH<{?{|T@Y
z2;)dGvuD%*)-4c7(*WlC#;-9D0hVtQRRQ2^w}}8K-!B3TP)&4x7M?|`0$hu$|jTP@9BAz&Y57?LuKsP~cIRP{m(3BZK
zw$WSi14uqQ9u9%
z>jNTGwmu+2W$OcC0Ls<}L;#en4~QWsTOSaIP_#ZERaPHhGMWBI{R8RdNV9Q0pyL1l
N002ovPDHLkV1n;}{p$b#
diff --git a/modular_citadel/icons/obj/genitals/vagina.dmi b/modular_citadel/icons/obj/genitals/vagina.dmi
index 39bdd48e89a70449a43ab36290da524de343af45..1bbe62ba0e1df13061cdb88e32cf16670d5991ff 100644
GIT binary patch
delta 434
zcmV;j0Zsn$1fm3xBrqpXOjJex0D$Gj%k=d0`R?-9*Vo##va_?Z&vsvef`XJoMf$Fs
z;DvDcn}|Q-F9nfTS$|21i!&v&s2IpJ0s
z1uYHCE_7755kR(fH1)UqG+Yg5rqjB5NC}($`Ph>9U#24vdR$FnqUCo6GE~F
zHUXe8m)7gW&s3h0Ma7@lFB
z{P6UCd;bXt^26pXJ|cqru<6q-c$4UdRN$*dKUC=wEBXxd!;T-tei#?X4;=QxDC~!E
c*bo0M--LNcEw6HLRR91007*qoM6N<$f?|)(fdBvi
delta 515
zcmV+e0{s1=1o8xsBr_^dOjJex0D#xm*Yx!C<;KhT?((yf`Wq2c3=Mh0F*;T
z`mUVdg>dW->$c
zU%y#{co*{M=mdczk0EDvDuDAG6xpRkg~=08?Ar_!Lz8Q+7|v`83KJ(WR~$^UV^C;q
za>Epbo!JXeXfNPv6kcI@+XHPD$)w3+J1eq7-lmTAf&pHU762H%r+J>+)07aHK%S@Y
ze;SJ4ckCHt-z4Tye@3DPB9A5T=jv8e8`v6sEtfng)dtk&^gTsPp{NT`ox!9*8oZmSJg+!v_Bt;HUkPrQ6+(e{O^mPyMQk!`;>O2>>e{F_Ah%iq
zt(PT%*6S8P$ALkhI_wvf?{|Sbkb?$fN@jw6o002ovPDHLk
FV1lFg^BVvF
diff --git a/modular_citadel/icons/obj/genitals/vagina_onmob.dmi b/modular_citadel/icons/obj/genitals/vagina_onmob.dmi
index ab71b22e3bb99d66c83325bdc1f2cf560dcd372c..6c34ffadfaaa02b7002b835cb886c81805aa6a2e 100644
GIT binary patch
literal 1112
zcmeAS@N?(olHy`uVBq!ia0y~yV0-|?2UwVaA{}ANCIBhj0G|+7AU$i=tj(J@A3l8e
z>9Nzdwru+U|NpC-cYbTc{r`Wdms#z>g9q>5zdv*4%+Gh9+ZGSa74PKkwQPBzG4ouI)x7g3JSA3to5h#8UU=ezH9ICBU3S_-
zq4m_#-T7;n)w_&r9M_qoeA>Z0_h{r4-)Y??qLUi5lTYiZ+>p4@xv6h|(nfx1k>yF;
z(-)-#?yiqs^Y`w-Yg;#*t$0!pV0FCxRV0MDhs3RSL;^D
znmxI((|N)1NnrT}OJDuiTzYuRzh_lX{#~tn-B)s8dt$BCzmtM@!SW0RMyuwl&&`@E
z9&Yb%ReEzr-51W{H!80#BzuD8=WM&STi^Y@{GOesU#V}mx0t)(??Gi@xZX=98+Psc
z`tO0szP0P}_u5yWYQAvk#qZ|e$+zX_T=TE3FPIhH?^klzpqvA2@&Wt1Pwv^*$X(MH
zf5@4&wDPrU*uAyuyxMi<{W0=<`d#;XpF}OI%$+ak47oqWnLt_|v}&iz>w8<>v-u_Q
zv#T`riow}z@nrUWcUM{5zt>ULKX3iBqrx^84?ez`7QXb;!(X@dRK@YlXn%bCX?xJ$
zgt*&l#g=lL&G{boUSIEiVC$Z(&-nK&-?wKG-<
zS(9$^I_coIllt{+!TS>Sa@tCLe5UrwK006f{f18u4>JSpJ^b}4qsXu8>sI{#&-ead
z^e;(fKm8w#zHh@>!FE1it-idYZvMeNrnPckrk{`eySzX0@4UZ9n=7+_*}Qlrd~dRv
z*r!{MjptmKTYS)z2dt-H%e{N`$F5qv|NG6<#&PYnkI(zxN7in=CR{gtDk!TnFdWz%
zd#~Q_^!oXcwX?1-`@8z{$J?*hB+k0tcW?i<)}y;G?b%jZ4_3(VKy&%D{^ONzpDd}=
bWnkFP==|A)#cqaNDoEDT)z4*}Q$iB}m#!e%
literal 1330
zcmZ8hdsNbA82$-fQjpBkRj25VYhISMEW3Cs=XEwQqtGb9JYia?5nhMjbPG*QTczf`
z&C*KINv5WWWXf@=q-bi2GRX^(q7W!@8`vK^XWu{1bI$v`=R42yzUR#f3iLHLGBW}I
zz}VlgUVf+1|33h;3?qP+!#*7O;eB|1h0$NBk)migs9jU07xpW
zJN?G!)jku~Lzpd}&pyn}E7|e*rh!A|YGcuue)L@%d)3Rw!EhwRKftl1^90U`R+U{%
z>)zip7@g&K!k)A>DV?GOl2L*2IA?Hrd(O%MHY<0i^1hwR4!_nk8yEO7n{ZPbasSb&
zgnZvtq#i^hHHFpIbkQ3cV9w6f-%(2J{JD9S*=whb?Mhqx7QHX+KJW?uZd2$4W0}J^
zrK<7thS(cR&89lf8h!}y9NEMb;bL`VQC|MIQGdjdM+@LFpIgwfh~J?@M*^nDZbaFK
zy&lileh0fCjkMdj4+q&dH_}g1D
z2>J>D!1w&Ujw6#w7ddYD37?(%*nJ*O
zwgi%ceWv00b3E{JKvCpk>2Z^5hC13x+;4+Ii@l0bi*eF~BNBc>6k5Jws$^zR?ZzEYGY&_RFGD)G-_xU%2=}%#L+n6^bui
z-9KQpAxVRr9-YUytA?LYS!6~2Y{ZB}#;Rx}p0li{vgk%)z8I2rkJbhH+R=JL?}#F;
zCdMZ#!qG0O0~8rShp(SaP<5Ru+K2`KZUlvK>Zafgu}wT?Y>l6ouVd?xv9ru#`+w=3
zar-3*B2K>MRKh3?#FqbQSjB_S=zZFJk~q~AbBDJXfo?u8(8fn>l3(51QCgA6fx)H~
z%MZmWohwZE0Iq?Y*;A27ao&UO!{GJGo*hOXQ$x=UtbY4;mq#BHJv}U%YPndCQd2HHB0>MMo#PliHOFGLeBTa-K5(?)-)VXz`0rb*~pzKM{yW
zWTJIqd`G)GrYutOslkc|P0tM2q?K`hUSG3*Q!O_S!>z1IKe0&u+%nbdc!^75U-!nkC9?
b`L(jggSr04@rbOq8!`KP2YOLGvFZN;OA3XU
From c68c96373c5e03cdf7de78c6f92ecd6dd282a3d4 Mon Sep 17 00:00:00 2001
From: Ghommie <42542238+Ghommie@users.noreply.github.com>
Date: Sun, 9 Feb 2020 07:07:47 +0100
Subject: [PATCH 17/57] Ok.
---
modular_citadel/code/modules/arousal/arousal.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modular_citadel/code/modules/arousal/arousal.dm b/modular_citadel/code/modules/arousal/arousal.dm
index aa0021bd8f..4fe57dfebe 100644
--- a/modular_citadel/code/modules/arousal/arousal.dm
+++ b/modular_citadel/code/modules/arousal/arousal.dm
@@ -47,7 +47,7 @@
if(!client?.prefs.arousable || (aphro && (client?.prefs.cit_toggles & NO_APHRO)) || (maso && !HAS_TRAIT(src, TRAIT_MASO)))
return // no adjusting made here
for(var/obj/item/organ/genital/G in internal_organs)
- if(genital_flags & GENITAL_CAN_AROUSE && !G.aroused_state && prob(strength*G.sensitivity))
+ if(G.genital_flags & GENITAL_CAN_AROUSE && !G.aroused_state && prob(strength*G.sensitivity))
G.set_aroused_state(strength > 0)
G.update_appearance()
if(G.aroused_state)
From 0b28e17860fbc89cac3da4b7cbca20867f36ca9c Mon Sep 17 00:00:00 2001
From: kevinz000 <2003111+kevinz000@users.noreply.github.com>
Date: Mon, 10 Feb 2020 04:13:59 -0700
Subject: [PATCH 18/57] Update gravity.dm
---
code/modules/projectiles/projectile/special/gravity.dm | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/code/modules/projectiles/projectile/special/gravity.dm b/code/modules/projectiles/projectile/special/gravity.dm
index 0efdc77806..418548bac9 100644
--- a/code/modules/projectiles/projectile/special/gravity.dm
+++ b/code/modules/projectiles/projectile/special/gravity.dm
@@ -32,15 +32,14 @@
if(!safety)
break
var/atom/movable/AM = i
- if(can_throw(AM, thrown) && do_the_throw(T, AM, thrown))
+ if(do_the_throw(T, AM, thrown))
safety--
for(var/turf/F in range(T,power))
new /obj/effect/temp_visual/gravpush(F)
-/obj/item/projectile/gravity/proc/can_throw(atom/movable/AM, list/thrown)
- return (AM != src) && (AM != firer) && !AM.anchored && !thrown[AM]
-
/obj/item/projectile/gravity/proc/do_the_throw(turf/origin, atom/movable/AM, list/thrown)
+ if((AM == src) || (AM == firer) || AM.anchored || thrown[AM])
+ return
thrown[AM] = TRUE
var/target = get_target(origin, AM)
if(!target)
From 3a655d71d4030745ef260ce442953fce20d24678 Mon Sep 17 00:00:00 2001
From: kevinz000 <2003111+kevinz000@users.noreply.github.com>
Date: Mon, 10 Feb 2020 04:19:52 -0700
Subject: [PATCH 19/57] fix
---
code/modules/awaymissions/capture_the_flag.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/modules/awaymissions/capture_the_flag.dm b/code/modules/awaymissions/capture_the_flag.dm
index 3562350473..1344ee0ad3 100644
--- a/code/modules/awaymissions/capture_the_flag.dm
+++ b/code/modules/awaymissions/capture_the_flag.dm
@@ -470,7 +470,7 @@
/obj/item/claymore/ctf/pre_attack(atom/target, mob/user, params)
if(!is_ctf_target(target))
- return FALSE
+ return TRUE
return ..()
/obj/item/claymore/ctf/dropped()
From d40608625847b4fe132a406c31ca3ad26bf6cddc Mon Sep 17 00:00:00 2001
From: kevinz000 <2003111+kevinz000@users.noreply.github.com>
Date: Mon, 10 Feb 2020 04:26:26 -0700
Subject: [PATCH 20/57] Update gravity.dm
---
.../projectiles/projectile/special/gravity.dm | 20 ++++++++-----------
1 file changed, 8 insertions(+), 12 deletions(-)
diff --git a/code/modules/projectiles/projectile/special/gravity.dm b/code/modules/projectiles/projectile/special/gravity.dm
index 418548bac9..359d255092 100644
--- a/code/modules/projectiles/projectile/special/gravity.dm
+++ b/code/modules/projectiles/projectile/special/gravity.dm
@@ -32,21 +32,17 @@
if(!safety)
break
var/atom/movable/AM = i
- if(do_the_throw(T, AM, thrown))
- safety--
+ if((AM == src) || (AM == firer) || (AM.move_resist > MOVE_FORCE_EXTREMELY_STRONG) || AM.anchored || thrown[AM])
+ continue
+ thrown[AM] = TRUE
+ safety--
+ var/target = get_target(T, AM)
+ if(!target)
+ return FALSE
+ AM.throw_at(target, power + 1, 1)
for(var/turf/F in range(T,power))
new /obj/effect/temp_visual/gravpush(F)
-/obj/item/projectile/gravity/proc/do_the_throw(turf/origin, atom/movable/AM, list/thrown)
- if((AM == src) || (AM == firer) || AM.anchored || thrown[AM])
- return
- thrown[AM] = TRUE
- var/target = get_target(origin, AM)
- if(!target)
- return FALSE
- AM.throw_at(target, power + 1, 1)
- return TRUE
-
/obj/item/projectile/gravity/proc/get_target(turf/origin, atom/movable/AM)
return origin
From af95921155bb40357fc39db16d86b919e4ad2714 Mon Sep 17 00:00:00 2001
From: Artur
Date: Mon, 10 Feb 2020 15:20:22 +0100
Subject: [PATCH 21/57] Goddamnit
---
code/modules/reagents/reagent_containers/hypospray.dm | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm
index eac8edcbc8..ab0d2db0e2 100644
--- a/code/modules/reagents/reagent_containers/hypospray.dm
+++ b/code/modules/reagents/reagent_containers/hypospray.dm
@@ -423,7 +423,7 @@
else
unload_hypo(vial,user)
-/obj/item/hypospray/mkii/AltClick(mob/living/user)
+/obj/item/hypospray/mkii/CtrlClick(mob/living/user)
. = ..()
if(user.canUseTopic(src, FALSE))
switch(mode)
@@ -437,7 +437,7 @@
/obj/item/hypospray/mkii/examine(mob/user)
. = ..()
- . += "