Merge branch 'evilew:master' into master

This commit is contained in:
Phantastic-Swan
2024-12-17 07:44:17 +01:00
committed by GitHub
21 changed files with 2802 additions and 1475 deletions

View File

@@ -9,7 +9,7 @@
to_chat(H, "<span class='warning'>You are too fat to wear anything on your back.</span>")
return FALSE
if(HAS_TRAIT(H, TRAIT_NO_JUMPSUIT) && slot == ITEM_SLOT_ICLOTHING)
if(I.modular_icon_location == null && HAS_TRAIT(H, TRAIT_NO_JUMPSUIT) && slot == ITEM_SLOT_ICLOTHING)
to_chat(H, "<span class='warning'>You are too fat to wear [I].</span>")
return FALSE

View File

@@ -2,7 +2,7 @@
var/savekey
var/ckeyslot
/mob/living/carbon/proc/perma_fat_save(mob/living/carbon/character)
/mob/living/carbon/proc/perma_fat_save()
var/key = savekey
if(!key)
return FALSE
@@ -13,26 +13,34 @@
if(!path)
return FALSE
if(character.ckeyslot)
var/slot = character.ckeyslot
if(ckeyslot)
var/slot = ckeyslot
S.cd = "/character[slot]"
var/persi
S["weight_gain_persistent"] >> persi
if(persi)
WRITE_FILE(S["starting_weight"] , character.fatness_real)
WRITE_FILE(S["starting_weight"] , fatness_real)
client.prefs.starting_weight = fatness_real
to_chat(src, span_notice("Your starting weight has been updated!"))
var/perma
S["weight_gain_permanent"] >> perma
if(S["weight_gain_permanent"])
WRITE_FILE(S["permanent_fat"] , character.fatness_perma)
WRITE_FILE(S["permanent_fat"] , fatness_perma)
client.prefs.permanent_fat = fatness_perma
to_chat(src, span_notice("Your permanent fat has been updated!"))
/datum/controller/subsystem/ticker/gather_roundend_feedback()
/mob/living/carbon/proc/queue_perma_save()
to_chat(src,"Your permanence options are being saved, please wait." )
addtimer(CALLBACK(src, PROC_REF(perma_fat_save), TRUE, silent), 3 SECONDS, TIMER_STOPPABLE)
/datum/controller/subsystem/ticker/declare_completion()
. = ..()
for(var/mob/m in GLOB.player_list)
if(iscarbon(m))
var/mob/living/carbon/C = m
if(C)
C.perma_fat_save(C)
. = ..()
C.queue_perma_save()
/obj/machinery/cryopod/despawn_occupant()
var/mob/living/mob_occupant = occupant

View File

@@ -6,6 +6,9 @@
lose_text = "<span class='notice'>You don't feel absorbant anymore.</span>"
mob_trait = TRAIT_WATER_SPONGE
/datum/reagent/water
var/bloat_coeff = 3.5
/datum/reagent/water/on_mob_add(mob/living/L, amount)
if(HAS_TRAIT(L, TRAIT_WATER_SPONGE))
if(iscarbon(L))
@@ -30,7 +33,7 @@
/datum/reagent/water/proc/fat_hide(mob/living/carbon/user)
return volume * 3.5
return volume * bloat_coeff
/obj/machinery/shower/process()
..()
@@ -57,6 +60,9 @@
water_check(breath, H)
. = ..()
/datum/reagent/water/overdose_start(mob/living/M)
. = 1
/obj/structure/sink
var/mob/living/attached

View File

@@ -41,7 +41,7 @@
var/obj/item/clothing/suit = target.wear_suit
if(istype(suit, /obj/item/clothing/suit/straight_jacket/web))
user.visible_message("<span class='warning'>[user] begins to fully encase [target] in a cocoon!</span>", "<span class='warning'>You begin to fully encase [target] in a cocoon.</span>")
if(!do_after_mob(user, target, 30 SECONDS))
if(!do_after(user, 30 SECONDS, target))
return FALSE
var/obj/structure/spider/cocoon/quirk/spawned_cocoon = new(target.loc)
@@ -60,7 +60,7 @@
return TRUE
user.visible_message("<span class='warning'>[user] attempts to remove [target]'s [target.wear_suit]!</span>", "<span class='warning'>You attempt to remove [target]'s [target.wear_suit].</span>")
if(!do_after_mob(user, target, 10 SECONDS) || !target.dropItemToGround(suit))
if(!do_after(user, 10 SECONDS, target) || !target.dropItemToGround(suit))
return FALSE
var/obj/item/clothing/suit/straight_jacket/web/wrapping = new
@@ -68,7 +68,7 @@
return FALSE
user.visible_message("<span class='warning'>[user] attempts to wrap [target] inside of [wrapping]!</span>", "<span class='warning'>You attempt to wrap [target] inside of [wrapping].</span>")
if(!do_after_mob(user, target, 20 SECONDS) || !target.equip_to_slot_if_possible(wrapping, ITEM_SLOT_OCLOTHING, TRUE, TRUE))
if(!do_after(user, 20 SECONDS, target) || !target.equip_to_slot_if_possible(wrapping, ITEM_SLOT_OCLOTHING, TRUE, TRUE))
user.visible_message("<span class='warning'>[user] fails to wrap [target] inside of [wrapping]!</span>", "<span class='warning'>You fail to wrap [target] inside of [wrapping].</span>")
return FALSE
@@ -105,9 +105,28 @@
/datum/action/innate/make_web/Activate()
var/turf/T = get_turf(owner)
owner.visible_message("<span class='warning'>[owner] begins spinning a web!</span>", "<span class='warning'>You begin spinning a web.</span>")
if(!do_after(owner, 10 SECONDS, 1, null, 1))
var/obj/structure/spider/stickyweb/W = locate() in get_turf(src)
if(W || !do_after(owner, 10 SECONDS, T))
owner.visible_message("<span class='warning'>[owner] fails to spin a web!</span>", "<span class='warning'>You fail to spin web.</span>")
return FALSE
T.ChangeTurf(/obj/structure/spider/stickyweb)
owner.visible_message("<span class='warning'>[owner] spin a sticky web!</span>", "<span class='warning'>You spin a sticky web.</span>")
new /obj/structure/spider/stickyweb(T)
owner.visible_message("<span class='warning'>[owner] spins a sticky web!</span>", "<span class='warning'>You spin a sticky web.</span>")
return TRUE
/obj/structure/spider/stickyweb/CanPass(atom/movable/mover, turf/target)
if (genetic)
return
if(istype(mover, /mob/living/simple_animal/hostile/poison/giant_spider) || HAS_TRAIT(mover, TRAIT_WEB_WEAVER))
return TRUE
else if(isliving(mover))
if(istype(mover.pulledby, /mob/living/simple_animal/hostile/poison/giant_spider))
return TRUE
if(mover.pulledby)
if(HAS_TRAIT(mover.pulledby, TRAIT_WEB_WEAVER))
return TRUE
if(prob(50))
to_chat(mover, "<span class='danger'>You get stuck in \the [src] for a moment.</span>")
return FALSE
else if(istype(mover, /obj/item/projectile))
return prob(30)
return TRUE

View File

@@ -0,0 +1,3 @@
/datum/gear/uniform/modularjumpsuit
name = "Grey jumpsuit (Modular)"
path = /obj/item/clothing/under/color/grey

View File

@@ -1,41 +1,150 @@
//////////////////////////////////////
// MODULAR ITEMS 2.0 //
// BETTER AND BIGGER THAN EVER //
//////////////////////////////////////
//HOW TO CREATE A NEW MODULAR ITEM
// 1) DRAW THE SPRITES (see already made modular sprites)
// 2) FIND THE ITEM YOU WANT TO MAKE MODULAR (example: the grey jumpsuit is /obj/item/clothing/under/color/grey )
// 3) CHANGE IT'S modular_icon_location TO BE THE LOCATION OF THE SPRITES YOU'VE MADE (example: modular_icon_location = 'GainStation13/icons/mob/modclothes/modular_grey.dmi')
// 4) YOU ARE DONE. YOUR ITEM IS NOW MODULAR
//Many functions of the system can be customized by overloading the various procs
//If you know what you are doing then I encoourage you to tweak your item to work better for the idea you had in mind
/mob/living/carbon
var/modular_items = list()
// Called by handle_fatness, this is called periodically to tell all items to check for sprites and, if needed, build new ones
/mob/living/carbon/proc/handle_modular_items(adjustment_amount, type_of_fattening = FATTENING_TYPE_ITEM)
for(var/obj/item/item in modular_items)
item.update_modular_overlays(src)
/obj/item
var/modular_icon_location = null
var/mod_overlays = list()
var/mod_breasts_size = 0
var/mod_butt_size = 0
var/mod_belly_size = 0
var/modular_icon_location = null //Locates the sprites, null if it is not a modular item. Changing this makes the item modular
var/mod_overlays = list() //Keeps track of the modular sprite overlays for the item
var/mod_breasts_rec //Records the last used sprite for breasts to avoid building sprites if no change occurred
var/mod_butt_rec //^^^ for butt
var/mod_belly_rec //^^^ for belly
//General condition for activating modular sprites for an item.
//When equipped to that item's appropriate slot, if the item has modular icons then initialize it as a modular item
/obj/item/equipped(mob/user, slot)
if(modular_icon_location != null && slot == slot_flags) //if(slot == ITEM_SLOT_ICLOTHING)
if(modular_icon_location != null && slot == slot_flags)
add_modular_item(user)
..()
//General condition for deactivating modular sprites for an item.
//When dropped. And/or moved to another slot, works together with equipped checking the approporiate slot
/obj/item/dropped(mob/user)
remove_modular_item(user)
..()
//Initialize a modular item by resetting any recorded sprite names and force a sprite update
/obj/item/proc/add_modular_item(mob/user)
mod_breasts_size = 0
mod_butt_size = 0
mod_belly_size = 0
mod_breasts_rec = null
mod_butt_rec = null
mod_belly_rec = null
update_modular_overlays(user)
//Remove a modular item by deleting it from the user's list of tracked modular items
//and forcing sprite deletion
/obj/item/proc/remove_modular_item(mob/user)
if(!iscarbon(user))
return
delete_modular_overlays(user)
var/mob/living/carbon/U = user
if(src in U.modular_items)
U.modular_items -= src
//The meat of the system, checks the genitals, compares to recorded size and request
//the sprites if new ones are needed
/obj/item/proc/update_modular_overlays(mob/user)
if(!iscarbon(user))
return
var/mob/living/carbon/U = user
var/list/genitals_list
var/build_modular = FALSE
//Before requesting sprites we must make sure new ones are actually needed
//Go through the genitals of the user to detect belly, butt and breasts (individually, not all 3 are needed)
//Add it to a list of found genitals to not go through all organs again
//Get the sprite name of the sprites needed and compare it to the ones recorded
//If they are different, record the sprites and build_modular to TRUE to signal that new sprites are needed
var/obj/item/organ/genital/O
for(O in U.internal_organs)
if(istype(O, /obj/item/organ/genital/belly))
genitals_list += list(O)
var/belly = get_modular_belly(O)
if(belly != mod_belly_rec)
mod_belly_rec = belly
build_modular = TRUE
if(istype(O, /obj/item/organ/genital/butt))
genitals_list += list(O)
var/butt = get_modular_butt(O)
if(butt != mod_butt_rec)
mod_butt_rec = butt
build_modular = TRUE
if(istype(O, /obj/item/organ/genital/breasts))
genitals_list += list(O)
var/breasts = get_modular_breasts(O)
if(breasts != mod_breasts_rec)
mod_breasts_rec = breasts
build_modular = TRUE
if(!build_modular) //Stop early if no new sprites are needed
return
delete_modular_overlays(U) //Delete the old sprites
if(!(src in U.modular_items)) //Make sure the item is inside the user's tracked modular items
U.modular_items += src //used on the first sprite request and to ensure it's being tracked for future updates
//Go through the list of genitals previously found and for each add the modular sprite overlays to the user
var/obj/item/organ/genital/G
for(G in genitals_list)
if(istype(G, /obj/item/organ/genital/belly))
add_modular_overlay(U, mod_belly_rec, MODULAR_BELLY_LAYER, color)
add_modular_overlay(U, "[mod_belly_rec]_SOUTH", BELLY_FRONT_LAYER, color)
if(istype(G, /obj/item/organ/genital/butt))
add_modular_overlay(U, mod_butt_rec, MODULAR_BUTT_LAYER, color)
add_modular_overlay(U, "[mod_butt_rec]_NORTH", BUTT_BEHIND_LAYER, color)
if(istype(G, /obj/item/organ/genital/breasts))
add_modular_overlay(U, mod_breasts_rec, MODULAR_BREASTS_LAYER, color)
add_modular_overlay(U, "[mod_breasts_rec]_NORTH", BREASTS_BEHIND_LAYER, color)
add_modular_overlay(U, "[mod_breasts_rec]_SOUTH", BREASTS_FRONT_LAYER, color)
//Remove the previously built modular sprite overlays and empty the list of tracked overlays
/obj/item/proc/delete_modular_overlays(mob/user)
if(!iscarbon(user))
return
var/mob/living/carbon/U = user
if(!(src in U.modular_items))
return
for(var/mutable_appearance/overlay in mod_overlays)
U.cut_overlay(overlay)
mod_overlays -= mod_overlays
//Function to easily add a requested overlay
//Create the appropriate sprite object (mod_overlay) using the icon previously found, from the item's modular sprites file, on the appropriate overlay and with the item's color
//The sprite is then added to the item's list of built modular sprites overlay
//Added to the appropriate layer of the user
//Then the layer is applied
//
// Why is the layer in mutable appearance entered as its negative version?
// No. Damn. Clue. SS13, I don't question it further.
//
/obj/item/proc/add_modular_overlay(mob/living/carbon/U, modular_icon, modular_layer, sprite_color)
var/mutable_appearance/mod_overlay = mutable_appearance(modular_icon_location, modular_icon, -(modular_layer), color = sprite_color)
mod_overlays += mod_overlay
U.overlays_standing[modular_layer] = mod_overlay
U.apply_overlay(modular_layer)
//General function to generate the right icon_state for belly modular sprites
/obj/item/proc/get_modular_belly(obj/item/organ/genital/G)
return "belly_[get_belly_size(G)][get_belly_alt()]"
//General function to get the appropriate shape and size for the belly, accounting for fullness
/obj/item/proc/get_belly_size(obj/item/organ/genital/G)
var/size = G.size
if(G.size > 9)
@@ -61,18 +170,19 @@
return "[shape]_[size]"
//Placeholder function for alternate variants of the shape and size sprites for belly
/obj/item/proc/get_belly_alt()
return ""
/obj/item/clothing/under/get_belly_alt()
return "[(adjusted) ? "_d" : ""]"
//General function to get the appropriate shape and size for the butt
/obj/item/proc/get_modular_butt(obj/item/organ/genital/G)
return "butt_[(G.size <= 10 ) ? "[G.size]" : "10"][get_butt_alt()]"
//General function to get the alternate variants for butt sprites, used for digitigrade characters
/obj/item/proc/get_butt_alt()
return "[(mutantrace_variation == STYLE_DIGITIGRADE) ? "_l" : ""]"
//General function to get the appropriate size for the breasts
/obj/item/proc/get_modular_breasts(obj/item/organ/genital/G)
var/size
if(G.size <= "o")
@@ -89,80 +199,21 @@
size = "impossible"
return "breasts_[size][get_breasts_alt()]"
//Placeholder function for alternate variants of the breasts
/obj/item/proc/get_breasts_alt()
return ""
/obj/item/proc/update_modular_overlays(mob/user)
if(!iscarbon(user))
return
var/mob/living/carbon/U = user
var/list/genitals_list
var/build_modular = FALSE
var/obj/item/organ/genital/O
for(O in U.internal_organs)
if(istype(O, /obj/item/organ/genital/belly))
genitals_list += list(O)
if(O.size != mod_belly_size)
mod_belly_size = O.size
build_modular = TRUE
if(istype(O, /obj/item/organ/genital/butt))
genitals_list += list(O)
if(O.size != mod_butt_size)
mod_butt_size = O.size
build_modular = TRUE
if(istype(O, /obj/item/organ/genital/breasts))
genitals_list += list(O)
var/obj/item/organ/genital/breasts/G = O
if(G.cached_size != mod_breasts_size)
mod_breasts_size = G.cached_size
build_modular = TRUE
if(!build_modular)
return
delete_modular_overlays(U)
if(!(src in U.modular_items))
U.modular_items += src
var/obj/item/organ/genital/G
for(G in genitals_list) //check the user for the organs they have
if(istype(G, /obj/item/organ/genital/belly)) //if that organ is a belly
var/modular_sprite = get_modular_belly(G)
add_modular_overlay(U, modular_sprite, MODULAR_BELLY_LAYER, color)
add_modular_overlay(U, "[modular_sprite]_SOUTH", BELLY_FRONT_LAYER, color)
if(istype(G, /obj/item/organ/genital/butt)) //if that organ is the butt
var/modular_sprite = get_modular_butt(G)
add_modular_overlay(U, modular_sprite, MODULAR_BUTT_LAYER, color)
add_modular_overlay(U, "[modular_sprite]_NORTH", BUTT_BEHIND_LAYER, color)
if(istype(G, /obj/item/organ/genital/breasts)) //if the organ is the breasts
var/modular_sprite = get_modular_breasts(G)
add_modular_overlay(U, modular_sprite, MODULAR_BREASTS_LAYER, color)
add_modular_overlay(U, "[modular_sprite]_NORTH", BREASTS_BEHIND_LAYER, color)
add_modular_overlay(U, "[modular_sprite]_SOUTH", BREASTS_FRONT_LAYER, color)
/obj/item/proc/delete_modular_overlays(mob/user)
if(!iscarbon(user))
return
var/mob/living/carbon/U = user
if(!(src in U.modular_items))
return
for(var/mutable_appearance/overlay in mod_overlays)
U.cut_overlay(overlay)
mod_overlays -= mod_overlays
/obj/item/proc/remove_modular_item(mob/user)
if(!iscarbon(user))
return
delete_modular_overlays(user)
var/mob/living/carbon/U = user
if(src in U.modular_items)
U.modular_items -= src
//The modular grey jumpsuit. The foundation of modular items and our holy grail
/obj/item/clothing/under/color/grey
name = "grey jumpsuit (Modular)"
modular_icon_location = 'GainStation13/icons/mob/modclothes/modular_grey.dmi'
name = "grey jumpsuit (Modular)" //(Modular) to tell players it is modular
modular_icon_location = 'GainStation13/icons/mob/modclothes/modular_grey.dmi' //Location of the sprites, to make it modular
desc = "A tasteful grey jumpsuit that reminds you of the good old days."
//Overload of the alt belly sprites function, for adjusteable clothing
/obj/item/clothing/under/get_belly_alt()
return "[(adjusted) ? "_d" : ""]"
//The placeholder colored jumpsuits
/obj/item/clothing/under/color/grey/service
name = "service grey jumpsuit (Modular)"
desc = "Grey only in name"

View File

@@ -1,11 +1,10 @@
//GS13 - markings, ported or our own (preferably mark where you took them from)
/datum/sprite_accessory/hair/elize
name = "Elize"
icon = 'GainStation13/icons/mob/human_face.dmi'
icon_state = "hair_elize"
#define NEWHAIR(_name, new_state) /datum/sprite_accessory/hair/##new_state/icon_state=#new_state;/datum/sprite_accessory/hair/##new_state/name = #_name;/datum/sprite_accessory/hair/##new_state/icon = 'GainStation13/icons/mob/human_face.dmi'
NEWHAIR(Elize, hair_elize)
NEWHAIR(Lem, hair_lem)
NEWHAIR(Straight (Floorlength), hair_straightfloorlength)
#undef NEWHAIR
/datum/sprite_accessory/hair/lem
name = "Lem"
icon = 'GainStation13/icons/mob/human_face.dmi'
icon_state = "hair_lem"

View File

@@ -53,3 +53,10 @@
icon_state = "feasterndnw"
color_src = MATRIXED
matrixed_sections = MATRIX_RED_GREEN
/datum/sprite_accessory/snouts/mam_snouts/hhorse
name = "Horse"
icon = 'GainStation13/icons/mob/markings/mam_snouts.dmi'
icon_state = "hhorse"
color_src = MATRIXED
matrixed_sections = MATRIX_RED_GREEN

View File

@@ -142,7 +142,7 @@
ADD_TRAIT(fatty, TRAIT_NO_JUMPSUIT, HELPLESSNESS_TRAIT)
var/obj/item/clothing/under/jumpsuit = fatty.w_uniform
if(istype(jumpsuit))
if(istype(jumpsuit) && jumpsuit.modular_icon_location == null)
to_chat(fatty, "<span class='warning'>[jumpsuit] can no longer contain your weight!</span>")
fatty.dropItemToGround(jumpsuit)

View File

@@ -0,0 +1,53 @@
/obj/belly/release_all_contents(var/include_absorbed = FALSE, var/silent = FALSE)
if(iscarbon(owner))
var/mob/living/carbon/predator = owner
predator.hider_remove(src)
. = ..()
/obj/belly/release_specific_contents(var/atom/movable/M, var/silent = FALSE)
if(iscarbon(owner))
var/mob/living/carbon/predator = owner
var/found = FALSE
for(var/prey in contents)
if(istype(prey, /mob/living/carbon))
found = TRUE
if(found)
predator.hider_add(src)
else
predator.hider_remove(src)
. = ..()
/obj/belly/process_belly(var/times_fired,var/wait)
////////////////////////// Vore Fatness /////////////////////////////
if(iscarbon(owner))
var/mob/living/carbon/predator = owner
var/found = FALSE
for(var/prey in contents)
if(istype(prey, /mob/living/carbon))
found = TRUE
if(found)
predator.hider_add(src)
else
predator.hider_remove(src)
///////////////////////////// DM_FATTEN /////////////////////////////
if(digest_mode == DM_FATTEN)
if(iscarbon(owner))
var/mob/living/carbon/predator = owner
for(var/mob/living/M in contents)
var/mob/living/carbon/prey = M
if(iscarbon(prey) && predator.fatness_real)
if(predator.fatness_real > 50)
prey.adjust_fatness(predator.fatness_real * 0.02, FATTENING_TYPE_FOOD)
predator.adjust_fatness(-predator.fatness_real * 0.02, FATTENING_TYPE_FOOD)
if(predator.nutrition > NUTRITION_LEVEL_HUNGRY)
predator.nutrition -= 3
. = ..()
/obj/belly/proc/fat_hide(var/mob/living/carbon/user)
var/preys_fatness = 0
for(var/prey in contents)
if(iscarbon(prey))
var/mob/living/carbon/cprey = prey
preys_fatness += cprey.fatness
return preys_fatness

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -6,6 +6,7 @@
#define DM_DRAGON "Dragon"
#define DM_ABSORB "Absorb"
#define DM_UNABSORB "Un-absorb"
#define DM_FATTEN "Fatten" // GS13 Edit - Added Fatten mode
#define DIGESTABLE (1<<0)
#define DEVOURABLE (1<<1)

View File

@@ -135,6 +135,10 @@ GLOBAL_LIST_INIT(ai_core_display_screens, list(
"Girl-Malf",
"Database",
"Dorf",
//GS13 CONTENT START
"Fat",
"Fat hair",
//GS13 CONTENT END
"Firewall",
"Fuzzy",
"Gentoo",

View File

@@ -253,7 +253,7 @@ SUBSYSTEM_DEF(vote)
calculate_highest_median(vote_title_text)
var/list/winners = list()
if(mode == "transfer")
var/amount_required = 1 + transfer_votes_done
var/amount_required = 0 //gs13 tweaked from 1 to 0
transfer_votes_done = 0 //gs13 tweaked from 1 to 0 (also removed it incrementing with each vote)
text += "\nExtending requires at least [amount_required] votes to win."
if(choices[VOTE_CONTINUE] < amount_required || choices[VOTE_TRANSFER] >= choices[VOTE_CONTINUE])

View File

@@ -172,7 +172,7 @@
/datum/quirk/voracious
name = "Voracious"
desc = "Nothing gets between you and your food. You eat twice as fast as everyone else!"
desc = "Nothing gets between you and your food. You eat and recover from stuffing twice as fast, while getting less full!" //GS13 Edit - Changed description
value = 1
mob_trait = TRAIT_VORACIOUS
gain_text = "<span class='notice'>You feel HONGRY.</span>"

View File

@@ -1862,6 +1862,8 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
var/aim_for_groin = user.zone_selected == "groin"
var/target_aiming_for_groin = target.zone_selected == "groin"
var/opposite_dir = user.dir == DIRFLIP(target.dir) //GS13 edit, slap gut
if(target.check_martial_melee_block()) //END EDIT
target.visible_message("<span class='warning'>[target] blocks [user]'s disarm attempt!</span>", target = user, \
target_message = "<span class='warning'>[target] blocks your disarm attempt!</span>")
@@ -1883,25 +1885,51 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
if (!HAS_TRAIT(target, TRAIT_PERMABONER))
stop_wagging_tail(target)
return FALSE
else if(aim_for_groin && (target == user || target.lying || same_dir) && (target_on_help || target_restrained || target_aiming_for_groin))
if(target.client?.prefs.cit_toggles & NO_ASS_SLAP)
to_chat(user,"A force stays your hand, preventing you from slapping \the [target]'s ass!")
return FALSE
if(!user.UseStaminaBuffer(3, warn = TRUE))
return FALSE
user.do_attack_animation(target, ATTACK_EFFECT_ASS_SLAP)
target.adjust_arousal(20,"masochism", maso = TRUE)
if (ishuman(target) && HAS_TRAIT(target, TRAIT_MASO) && target.has_dna() && prob(10))
target.mob_climax(forced_climax=TRUE, cause = "masochism")
if (!HAS_TRAIT(target, TRAIT_PERMABONER))
stop_wagging_tail(target)
playsound(target.loc, 'sound/weapons/slap.ogg', 50, 1, -1)
target.visible_message(\
"<span class='danger'>\The [user] slaps [user == target ? "[user.p_their()] own" : "\the [target]'s"] ass!</span>",\
"<span class='notice'>[user] slaps your ass! </span>",\
"You hear a slap.", target = user, target_message = "<span class='notice'>You slap [user == target ? "your own" : "\the [target]'s"] ass! </span>")
//GS13 edit - checks for opposite_dir in else if, and then again to determine whether it's gut or ass slap.
else if(aim_for_groin && (target == user || target.lying || same_dir || opposite_dir) && (target_on_help || target_restrained || target_aiming_for_groin))
if(!opposite_dir)
if(target.client?.prefs.cit_toggles & NO_ASS_SLAP)
to_chat(user,"A force stays your hand, preventing you from slapping \the [target]'s ass!")
return FALSE
if(!user.UseStaminaBuffer(3, warn = TRUE))
return FALSE
user.do_attack_animation(target, ATTACK_EFFECT_ASS_SLAP)
target.adjust_arousal(20,"masochism", maso = TRUE)
if (ishuman(target) && HAS_TRAIT(target, TRAIT_MASO) && target.has_dna() && prob(10))
target.mob_climax(forced_climax=TRUE, cause = "masochism")
if (!HAS_TRAIT(target, TRAIT_PERMABONER))
stop_wagging_tail(target)
playsound(target.loc, 'sound/weapons/slap.ogg', 50, 1, -1)
target.visible_message(\
"<span class='danger'>\The [user] slaps [user == target ? "[user.p_their()] own" : "\the [target]'s"] ass!</span>",\
"<span class='notice'>[user] slaps your ass! </span>",\
"You hear a slap.", target = user, target_message = "<span class='notice'>You slap [user == target ? "your own" : "\the [target]'s"] ass! </span>")
return FALSE
return FALSE
else
if(target.client?.prefs.cit_toggles & NO_ASS_SLAP)
to_chat(user,"A force stays your hand, preventing you from slapping \the [target]'s gut!")
return FALSE
if(!user.UseStaminaBuffer(3, warn = TRUE))
return FALSE
user.do_attack_animation(target, ATTACK_EFFECT_ASS_SLAP)
target.adjust_arousal(20,"masochism", maso = TRUE)
if (ishuman(target) && HAS_TRAIT(target, TRAIT_MASO) && target.has_dna() && prob(10))
target.mob_climax(forced_climax=TRUE, cause = "masochism")
if (!HAS_TRAIT(target, TRAIT_PERMABONER))
stop_wagging_tail(target)
playsound(target.loc, 'sound/weapons/slap.ogg', 50, 1, -1)
target.visible_message(\
"<span class='danger'>\The [user] slaps [user == target ? "[user.p_their()] own" : "\the [target]'s"] gut!</span>",\
"<span class='notice'>[user] slaps your gut! </span>",\
"You hear a slap.", target = user, target_message = "<span class='notice'>You slap [user == target ? "your own" : "\the [target]'s"] gut! </span>")
to_chat(target, "<span class='danger'><B>The pressure on your stomach causes you to belch!</B></span>")
target.emote(pick("belch","burp"))
return FALSE
//end of GS13 edit
else
user.do_attack_animation(target, ATTACK_EFFECT_DISARM)

View File

@@ -8,6 +8,7 @@
products = list(/obj/item/clothing/head/that = 4,
/obj/item/clothing/head/fedora = 3,
//GS13 EDIT START
/obj/item/clothing/under/color/grey = 20,
/obj/item/clothing/suit/jacket/letterman_gato = 5,
//GS13 EDIT END
/obj/item/clothing/head/beret = 3,

View File

@@ -43,7 +43,7 @@
var/wet_loop = TRUE // Does this belly have a slimy internal loop?
//I don't think we've ever altered these lists. making them static until someone actually overrides them somewhere.
var/tmp/static/list/digest_modes = list(DM_HOLD,DM_DIGEST,DM_HEAL,DM_NOISY,DM_ABSORB,DM_UNABSORB) // Possible digest modes
var/tmp/static/list/digest_modes = list(DM_HOLD,DM_DIGEST,DM_HEAL,DM_NOISY,DM_ABSORB,DM_UNABSORB,DM_FATTEN) // GS13 Edit- Added DM_FATTEN
var/tmp/mob/living/owner // The mob whose belly this is.
var/tmp/digest_mode = DM_HOLD // Current mode the belly is set to from digest_modes (+transform_modes if human)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 476 KiB

After

Width:  |  Height:  |  Size: 478 KiB

View File

@@ -4013,6 +4013,7 @@
#include "GainStation13\code\modules\cargo\packs.dm"
#include "GainStation13\code\modules\client\border_control.dm"
#include "GainStation13\code\modules\client\loadout\head.dm"
#include "GainStation13\code\modules\client\loadout\uniform.dm"
#include "GainStation13\code\modules\client\preferences\preferences.dm"
#include "GainStation13\code\modules\clothing\under\jobs\modular_items.dm"
#include "GainStation13\code\modules\events\vent_clog.dm\vent_clog.dm"
@@ -4075,6 +4076,7 @@
#include "GainStation13\code\modules\vehicles\grocery_cart_scooter_unmortorized.dm"
#include "GainStation13\code\modules\vending\gatocola.dm"
#include "GainStation13\code\modules\vending\mealdor.dm"
#include "GainStation13\code\modules\vore\fatten_vore.dm"
#include "GainStation13\code\modules\weapons\grenades.dm"
#include "GainStation13\code\obj\items\bluespace_belt.dm"
#include "GainStation13\code\obj\items\circuits.dm"