Skip to content

Commit

Permalink
[MIRROR] Photocopier butt sprites refactor (#1228)
Browse files Browse the repository at this point in the history
* Photocopier butt sprites refactor (#81693)

## About The Pull Request

- Butt sprite pngs put into a single .dmi
- All living mobs can have butt sprites defined [maybe even ghosts in
the future?]
- Human butt sprites are based on the chest bodypart instead of species
- having a human chest and felinid tail shows felinid sprite
- Added fuzzy moth butt sprite from Paradise
- Butt sprites use defines
## Why It's Good For The Game
Cleaner code, more realistic and logical for humans on the chest rather
than species, moth player flavor, butt sprites did not need to be
separate pngs at all, and gives felinid tails some more "value"
## Changelog
:cl:
refactor: Butt sprites are based on the chest bodypart for humans,
instead of the species
image: Moths have their own special butt sprites
/:cl:

* Photocopier butt sprites refactor

* Modular updates

---------

Co-authored-by: 13spacemen <[email protected]>
Co-authored-by: Mal <[email protected]>
  • Loading branch information
3 people authored and StealsThePRs committed Mar 1, 2024
1 parent b9efc07 commit db78b2f
Show file tree
Hide file tree
Showing 35 changed files with 76 additions and 32 deletions.
14 changes: 14 additions & 0 deletions code/__DEFINES/mobs.dm
Original file line number Diff line number Diff line change
Expand Up @@ -1002,3 +1002,17 @@ GLOBAL_LIST_INIT(layers_to_offset, list(

/// Types of bullets that mining mobs take full damage from
#define MINING_MOB_PROJECTILE_VULNERABILITY list(BRUTE)

// Sprites for photocopying butts
#define BUTT_SPRITE_HUMAN_MALE "human_male"
#define BUTT_SPRITE_HUMAN_FEMALE "human_female"
#define BUTT_SPRITE_LIZARD "lizard"
#define BUTT_SPRITE_QR_CODE "qr_code"
#define BUTT_SPRITE_XENOMORPH "xeno"
#define BUTT_SPRITE_DRONE "drone"
#define BUTT_SPRITE_CAT "cat"
#define BUTT_SPRITE_FLOWERPOT "flowerpot"
#define BUTT_SPRITE_GREY "grey"
#define BUTT_SPRITE_PLASMA "plasma"
#define BUTT_SPRITE_FUZZY "fuzzy"
#define BUTT_SPRITE_SLIME "slime"
4 changes: 3 additions & 1 deletion code/modules/mob/living/basic/drone/_drone.dm
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,6 @@
lighting_cutoff_red = 30
lighting_cutoff_green = 35
lighting_cutoff_blue = 25

can_be_held = TRUE
worn_slot_flags = ITEM_SLOT_HEAD
/// `TRUE` if we have picked our visual appearance, `FALSE` otherwise (default)
Expand Down Expand Up @@ -265,6 +264,9 @@
/mob/living/basic/drone/gib()
dust()

/mob/living/basic/drone/get_butt_sprite()
return BUTT_SPRITE_DRONE

/mob/living/basic/drone/examine(mob/user)
. = list("<span class='info'>This is [icon2html(src, user)] \a <b>[src]</b>!", EXAMINE_SECTION_BREAK) //NOVA EDIT CHANGE

Expand Down
3 changes: 3 additions & 0 deletions code/modules/mob/living/carbon/alien/adult/adult.dm
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,9 @@ GLOBAL_LIST_INIT(strippable_alien_humanoid_items, create_strippable_list(list(
melting_pot.consume_thing(lucky_winner)
return TRUE

/mob/living/carbon/alien/adult/get_butt_sprite()
return BUTT_SPRITE_XENOMORPH

// Aliens can touch acid
/mob/living/carbon/alien/can_touch_acid(atom/acided_atom, acid_power, acid_volume)
return TRUE
3 changes: 0 additions & 3 deletions code/modules/mob/living/carbon/human/_species.dm
Original file line number Diff line number Diff line change
Expand Up @@ -167,9 +167,6 @@ GLOBAL_LIST_EMPTY(features_by_species)
///Unique cookie given by admins through prayers
var/species_cookie = /obj/item/food/cookie

///For custom overrides for species ass images
var/icon/ass_image

/// List of family heirlooms this species can get with the family heirloom quirk. List of types.
var/list/family_heirlooms

Expand Down
4 changes: 4 additions & 0 deletions code/modules/mob/living/carbon/human/human.dm
Original file line number Diff line number Diff line change
Expand Up @@ -381,6 +381,10 @@
var/obj/item/bodypart/the_part = isbodypart(target_zone) ? target_zone : get_bodypart(check_zone(target_zone)) //keep these synced
to_chat(user, span_alert("There is no exposed flesh or thin material on [p_their()] [the_part.name]."))

/mob/living/carbon/human/get_butt_sprite()
var/obj/item/bodypart/chest/chest = get_bodypart(BODY_ZONE_CHEST)
return chest?.get_butt_sprite()

/mob/living/carbon/human/get_footprint_sprite()
var/obj/item/bodypart/leg/L = get_bodypart(BODY_ZONE_R_LEG) || get_bodypart(BODY_ZONE_L_LEG)
return shoes?.footprint_sprite || L?.footprint_sprite
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@
mutantlungs = null
mutantbrain = /obj/item/organ/internal/brain/abductor
changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT
ass_image = 'icons/ass/assgrey.png'

bodypart_overrides = list(
BODY_ZONE_HEAD = /obj/item/bodypart/head/abductor,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT
species_language_holder = /datum/language_holder/felinid
payday_modifier = 1.0
ass_image = 'icons/ass/asscat.png'
family_heirlooms = list(/obj/item/toy/cattoy)
/// When false, this is a felinid created by mass-purrbation
var/original_felinid = TRUE
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@
changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT
inherent_factions = list(FACTION_SLIME)
species_language_holder = /datum/language_holder/jelly
ass_image = 'icons/ass/assslime.png'

bodypart_overrides = list(
BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/jelly,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,6 @@
bodytemp_heat_damage_limit = BODYTEMP_HEAT_LAVALAND_SAFE
bodytemp_cold_damage_limit = (BODYTEMP_COLD_DAMAGE_LIMIT - 10)

ass_image = 'icons/ass/asslizard.png'

bodypart_overrides = list(
BODY_ZONE_HEAD = /obj/item/bodypart/head/lizard,
BODY_ZONE_CHEST = /obj/item/bodypart/chest/lizard,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,6 @@
// This effects how fast body temp stabilizes, also if cold resit is lost on the mob
bodytemp_cold_damage_limit = (BODYTEMP_COLD_DAMAGE_LIMIT - 50) // about -50c

ass_image = 'icons/ass/assplasma.png'

outfit_override_registry = list(
/datum/outfit/syndicate = /datum/outfit/syndicate/plasmaman,
/datum/outfit/syndicate/full = /datum/outfit/syndicate/full/plasmaman,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,6 @@
BODY_ZONE_CHEST = /obj/item/bodypart/chest/pod,
)

ass_image = 'icons/ass/asspodperson.png'

/datum/species/pod/on_species_gain(mob/living/carbon/new_podperson, datum/species/old_species, pref_load)
. = ..()
if(ishuman(new_podperson))
Expand Down
3 changes: 3 additions & 0 deletions code/modules/mob/living/living.dm
Original file line number Diff line number Diff line change
Expand Up @@ -2331,6 +2331,9 @@ GLOBAL_LIST_EMPTY(fire_appearances)
/mob/living/proc/is_face_visible()
return TRUE

/// Sprite to show for photocopying mob butts
/mob/living/proc/get_butt_sprite()
return null

///Proc to modify the value of num_legs and hook behavior associated to this event.
/mob/living/proc/set_num_legs(new_value)
Expand Down
3 changes: 3 additions & 0 deletions code/modules/mob/living/silicon/silicon.dm
Original file line number Diff line number Diff line change
Expand Up @@ -436,6 +436,9 @@
/mob/living/silicon/on_standing_up()
return // Silicons are always standing by default.

/mob/living/silicon/get_butt_sprite()
return BUTT_SPRITE_QR_CODE

/**
* Records an IC event log entry in the cyborg's internal tablet.
*
Expand Down
3 changes: 3 additions & 0 deletions code/modules/mob/living/simple_animal/hostile/alien.dm
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,9 @@
egg_cooldown = initial(egg_cooldown)
LayEggs()

/mob/living/simple_animal/hostile/alien/get_butt_sprite()
return BUTT_SPRITE_XENOMORPH

/mob/living/simple_animal/hostile/alien/proc/SpreadPlants()
if(!isturf(loc) || isspaceturf(loc))
return
Expand Down
25 changes: 7 additions & 18 deletions code/modules/paperwork/photocopier.dm
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,7 @@ GLOBAL_LIST_INIT(paper_blanks, init_paper_blanks())
else
to_chat(usr, span_notice("You feel kind of silly, copying [ass]\'s ass with [ass.p_their()] clothes on."))
return FALSE
do_copies(CALLBACK(src, PROC_REF(make_ass_copy), usr), usr, ASS_PAPER_USE, ASS_TONER_USE, num_copies)
do_copies(CALLBACK(src, PROC_REF(make_ass_copy)), usr, ASS_PAPER_USE, ASS_TONER_USE, num_copies)
return TRUE
else
// Basic paper
Expand Down Expand Up @@ -489,24 +489,13 @@ GLOBAL_LIST_INIT(paper_blanks, init_paper_blanks())
* Calls `check_ass()` first to make sure that `ass` exists, among other conditions. Since this proc is called from a timer, it's possible that it was removed.
* Additionally checks that the mob has their clothes off.
*/
/obj/machinery/photocopier/proc/make_ass_copy(mob/user)
/obj/machinery/photocopier/proc/make_ass_copy()
if(!check_ass())
return null
var/icon/temp_img
if(ishuman(ass))
var/mob/living/carbon/human/H = ass
var/datum/species/spec = H.dna.species
if(spec.ass_image)
temp_img = icon(spec.ass_image)
else
temp_img = icon(ass.gender == FEMALE ? 'icons/ass/assfemale.png' : 'icons/ass/assmale.png')
else if(isalienadult(ass)) //Xenos have their own asses, thanks to Pybro.
temp_img = icon('icons/ass/assalien.png')
else if(issilicon(ass))
temp_img = icon('icons/ass/assmachine.png')
else if(isdrone(ass)) //Drones are hot
temp_img = icon('icons/ass/assdrone.png')

var/butt_icon_state = ass.get_butt_sprite()
if(isnull(butt_icon_state))
return null
var/icon/temp_img = icon('icons/mob/butts.dmi', butt_icon_state)
var/obj/item/photo/copied_ass = new /obj/item/photo(src)
var/datum/picture/toEmbed = new(name = "[ass]'s Ass", desc = "You see [ass]'s ass on the photo.", image = temp_img)
toEmbed.psize_x = 128
Expand Down Expand Up @@ -629,7 +618,7 @@ GLOBAL_LIST_INIT(paper_blanks, init_paper_blanks())
* Returns FALSE if `ass` doesn't exist or is not at the copier's location. Returns TRUE otherwise.
*/
/obj/machinery/photocopier/proc/check_ass() //I'm not sure wether I made this proc because it's good form or because of the name.
if(!ass)
if(!isliving(ass))
return FALSE
if(ass.loc != loc)
ass = null
Expand Down
9 changes: 9 additions & 0 deletions code/modules/surgery/bodyparts/parts.dm
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,15 @@
cavity_item = null
return ..()

/// Sprite to show for photocopying mob butts
/obj/item/bodypart/chest/proc/get_butt_sprite()
if(!ishuman(owner))
return null
var/mob/living/carbon/human/human_owner = owner
var/butt_sprite = human_owner.physique == FEMALE ? BUTT_SPRITE_HUMAN_FEMALE : BUTT_SPRITE_HUMAN_MALE
var/obj/item/organ/external/tail/tail = human_owner.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL)
return tail?.get_butt_sprite() || butt_sprite

/obj/item/bodypart/chest/monkey
icon = 'icons/mob/human/species/monkey/bodyparts.dmi'
icon_static = 'icons/mob/human/species/monkey/bodyparts.dmi'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@
is_dimorphic = TRUE
wing_types = list(/obj/item/organ/external/wings/functional/dragon)

/obj/item/bodypart/chest/lizard/get_butt_sprite()
return BUTT_SPRITE_LIZARD

/obj/item/bodypart/arm/left/lizard
icon_greyscale = 'icons/mob/human/species/lizard/bodyparts.dmi'
limb_id = SPECIES_LIZARD
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,9 @@
should_draw_greyscale = FALSE
wing_types = NONE

/obj/item/bodypart/chest/abductor/get_butt_sprite()
return BUTT_SPRITE_GREY

/obj/item/bodypart/arm/left/abductor
limb_id = SPECIES_ABDUCTOR
should_draw_greyscale = FALSE
Expand Down Expand Up @@ -95,6 +98,9 @@
burn_modifier = 0.5 // = 1/2x generic burn damage
wing_types = list(/obj/item/organ/external/wings/functional/slime)

/obj/item/bodypart/chest/jelly/get_butt_sprite()
return BUTT_SPRITE_SLIME

/obj/item/bodypart/arm/left/jelly
biological_state = (BIO_FLESH|BIO_BLOODED)
limb_id = SPECIES_JELLYPERSON
Expand Down Expand Up @@ -230,6 +236,9 @@
burn_modifier = 1.25
wing_types = NONE

/obj/item/bodypart/chest/pod/get_butt_sprite()
return BUTT_SPRITE_FLOWERPOT

/obj/item/bodypart/arm/left/pod
limb_id = SPECIES_PODPERSON
unarmed_attack_verb = "slash"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@
should_draw_greyscale = FALSE
wing_types = list(/obj/item/organ/external/wings/functional/moth/megamoth, /obj/item/organ/external/wings/functional/moth/mothra)
/obj/item/bodypart/chest/moth/get_butt_sprite()
return BUTT_SPRITE_FUZZY
/obj/item/bodypart/arm/left/moth
icon = 'icons/mob/human/species/moth/bodyparts.dmi'
icon_state = "moth_l_arm"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@
bodypart_flags = BODYPART_UNHUSKABLE
wing_types = NONE

/obj/item/bodypart/chest/plasmaman/get_butt_sprite()
return BUTT_SPRITE_PLASMA

/obj/item/bodypart/arm/left/plasmaman
icon = 'icons/mob/human/species/plasmaman/bodyparts.dmi'
icon_state = "plasmaman_l_arm"
Expand Down
6 changes: 6 additions & 0 deletions code/modules/surgery/organs/external/tails.dm
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,9 @@
UnregisterSignal(organ_owner, COMSIG_LIVING_DEATH)
return succeeded

/obj/item/organ/external/tail/proc/get_butt_sprite()
return null

///Tail parent type, with wagging functionality
/datum/bodypart_overlay/mutant/tail
layers = EXTERNAL_FRONT|EXTERNAL_BEHIND
Expand Down Expand Up @@ -153,6 +156,9 @@

wag_flags = WAG_ABLE

/obj/item/organ/external/tail/cat/get_butt_sprite()
return BUTT_SPRITE_CAT

///Cat tail bodypart overlay
/datum/bodypart_overlay/mutant/tail/cat
feature_key = "tail" // NOVA EDIT - Customization - ORIGINAL: feature_key = "tail_cat"
Expand Down
Binary file removed icons/ass/assalien.png
Binary file not shown.
Binary file removed icons/ass/asscat.png
Binary file not shown.
Binary file removed icons/ass/assdrone.png
Binary file not shown.
Binary file removed icons/ass/assfemale.png
Binary file not shown.
Binary file removed icons/ass/assgrey.png
Binary file not shown.
Binary file removed icons/ass/asslizard.png
Binary file not shown.
Binary file removed icons/ass/assmachine.png
Binary file not shown.
Binary file removed icons/ass/assmale.png
Binary file not shown.
Binary file removed icons/ass/assplasma.png
Binary file not shown.
Binary file removed icons/ass/asspodperson.png
Binary file not shown.
Binary file removed icons/ass/assslime.png
Binary file not shown.
Binary file added icons/mob/butts.dmi
Binary file not shown.
3 changes: 3 additions & 0 deletions modular_nova/modules/bodyparts/code/moth_bodyparts.dm
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@
is_dimorphic = TRUE
wing_types = list(/obj/item/organ/external/wings/functional/moth/megamoth, /obj/item/organ/external/wings/functional/moth/mothra)

/obj/item/bodypart/chest/moth/get_butt_sprite()
return BUTT_SPRITE_FUZZY

/obj/item/bodypart/arm/left/moth
icon = BODYPART_ICON_MOTH
icon_greyscale = BODYPART_ICON_MOTH
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
payday_modifier = 1.0
changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT
examine_limb_id = SPECIES_LIZARD
ass_image = 'icons/ass/asslizard.png'

bodypart_overrides = list(
BODY_ZONE_HEAD = /obj/item/bodypart/head/lizard,
Expand Down

0 comments on commit db78b2f

Please sign in to comment.