Merge branch 'evilew:master' into master
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
3
GainStation13/code/modules/client/loadout/uniform.dm
Normal file
3
GainStation13/code/modules/client/loadout/uniform.dm
Normal file
@@ -0,0 +1,3 @@
|
||||
/datum/gear/uniform/modularjumpsuit
|
||||
name = "Grey jumpsuit (Modular)"
|
||||
path = /obj/item/clothing/under/color/grey
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
53
GainStation13/code/modules/vore/fatten_vore.dm
Normal file
53
GainStation13/code/modules/vore/fatten_vore.dm
Normal 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
@@ -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)
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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])
|
||||
|
||||
@@ -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>"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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)
|
||||
|
||||
BIN
icons/mob/AI.dmi
BIN
icons/mob/AI.dmi
Binary file not shown.
|
Before Width: | Height: | Size: 476 KiB After Width: | Height: | Size: 478 KiB |
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user