Merge branch 'sheepishgoat:master' into feature/small-bits-and-bob

This commit is contained in:
AlManiak
2024-10-25 11:31:41 +02:00
committed by GitHub
17 changed files with 188 additions and 9 deletions
@@ -0,0 +1,57 @@
/client/proc/breadify(atom/movable/target)
var/obj/item/reagent_containers/food/snacks/store/bread/plain/funnyBread = new(get_turf(target))
target.forceMove(funnyBread)
GLOBAL_LIST_EMPTY(transformation_animation_objects)
/*
* Creates animation that turns current icon into result appearance from top down.
*
* result_appearance - End result appearance/atom/image
* time - Animation duration
* transform_overlay - Appearance/atom/image of effect that moves along the animation - should be horizonatally centered
* reset_after - If FALSE, filters won't be reset and helper vis_objects will not be removed after animation duration expires. Cleanup must be handled by the caller!
*/
/atom/movable/proc/transformation_animation(result_appearance,time = 3 SECONDS,transform_overlay,reset_after=TRUE)
var/list/transformation_objects = GLOB.transformation_animation_objects[src] || list()
//Disappearing part
var/top_part_filter = filter(type="alpha",icon=icon('icons/effects/alphacolors.dmi',"white"),y=0)
filters += top_part_filter
var/filter_index = length(filters)
animate(filters[filter_index],y=-32,time=time)
//Appearing part
var/obj/effect/overlay/appearing_part = new
appearing_part.appearance = result_appearance
appearing_part.appearance_flags |= KEEP_TOGETHER | KEEP_APART
appearing_part.vis_flags = VIS_INHERIT_ID
appearing_part.filters = filter(type="alpha",icon=icon('icons/effects/alphacolors.dmi',"white"),y=0,flags=MASK_INVERSE)
animate(appearing_part.filters[1],y=-32,time=time)
transformation_objects += appearing_part
//Transform effect thing - todo make appearance passed in
if(transform_overlay)
var/obj/transform_effect = new
transform_effect.appearance = transform_overlay
transform_effect.vis_flags = VIS_INHERIT_ID
transform_effect.pixel_y = 16
transform_effect.alpha = 255
transformation_objects += transform_effect
animate(transform_effect,pixel_y=-16,time=time)
animate(alpha=0)
GLOB.transformation_animation_objects[src] = transformation_objects
for(var/A in transformation_objects)
vis_contents += A
if(reset_after)
addtimer(CALLBACK(src,.proc/_reset_transformation_animation,filter_index),time)
/*
* Resets filters and removes transformation animations helper objects from vis contents.
*/
/atom/movable/proc/_reset_transformation_animation(filter_index)
var/list/transformation_objects = GLOB.transformation_animation_objects[src]
for(var/A in transformation_objects)
vis_contents -= A
qdel(A)
transformation_objects.Cut()
GLOB.transformation_animation_objects -= src
if(filters && length(filters) >= filter_index)
filters -= filters[filter_index]
//else
// filters = null
@@ -0,0 +1,7 @@
/datum/mood_event/fat_bad
description = "<span class='warning'><B>I'm so fat...</B></span>\n"
mood_change = -4
/datum/mood_event/fat_good
description = "<span class='nicegreen'><B>I'm so fat!</B></span>\n"
mood_change = 4
+3
View File
@@ -93,6 +93,9 @@ GLOBAL_LIST_INIT(uncapped_resize_areas, list(/area/command/bridge, /area/mainten
return FALSE
switch(type_of_fattening)
if(FATTENING_TYPE_ALMIGHTY)
return TRUE
if(FATTENING_TYPE_ITEM)
if(!client?.prefs?.weight_gain_items)
return FALSE
@@ -239,7 +239,10 @@
fatness_delay += (H.fatness / FATNESS_LEVEL_IMMOBILE) * FATNESS_WEAKLEGS_MODIFIER
fatness_delay = min(fatness_delay, 60)
H.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/fatness, TRUE, fatness_delay)
if(fatness_delay)
H.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/fatness, TRUE, fatness_delay)
else
H.remove_movespeed_modifier(/datum/movespeed_modifier/fatness)
if(HAS_TRAIT(H, TRAIT_BLOB))
handle_fatness_trait(
+5
View File
@@ -87,6 +87,11 @@
#define ADMIN_PUNISHMENT_FRY "Fry"
#define ADMIN_PUNISHMENT_PERFORATE ":B:erforate"
#define ADMIN_PUNISHMENT_CLUWNE "Cluwne"
// GS13 PUNISHMENTS
#define ADMIN_PUNISHMENT_BONK "Bonk"
#define ADMIN_PUNISHMENT_BREADIFY "Breadify"
#define ADMIN_PUNISHMENT_FATTEN "Fatten"
#define ADMIN_PUNISHMENT_FATTEN_EVIL "Fatten (Permafat)"
#define AHELP_ACTIVE 1
#define AHELP_CLOSED 2
+1
View File
@@ -588,5 +588,6 @@ GLOBAL_LIST_INIT(pda_reskins, list(
#define FATTENING_TYPE_NANITES "nanites"
#define FATTENING_TYPE_RADIATIONS "radiations"
#define FATTENING_TYPE_WEIGHT_LOSS "weight_loss"
#define FATTENING_TYPE_ALMIGHTY "almighty" //This ignores prefs, please only use this for smites and other admin controlled instances.
#define FATNESS_TO_WEIGHT_RATIO 0.25
+7
View File
@@ -92,7 +92,11 @@
. = 1
//Please don't roast me too hard
//Oh don't worry, We Will.
/client/MouseMove(object, location, control, params)
if(!COOLDOWN_FINISHED(src, next_mousemove))
return
COOLDOWN_START(src, next_mousemove, 0) //COOLDOWN_FINISHED() sees the world tick and cooldown timer being equal as a state wherein the cooldown has not finished. So the cooldown timer here is 0 to throttle only for the rest of the tick.
mouseParams = params
mouse_location_ref = WEAKREF(location)
mouse_object_ref = WEAKREF(object)
@@ -106,6 +110,9 @@
..()
/client/MouseDrag(src_object,atom/over_object,src_location,over_location,src_control,over_control,params)
if(!COOLDOWN_FINISHED(src, next_mousedrag))
return
COOLDOWN_START(src, next_mousedrag, 0) //See comment in MouseMove() for why this is 0.
mouseParams = params
mouse_location_ref = WEAKREF(over_location)
mouse_object_ref = WEAKREF(over_object)
+14
View File
@@ -169,6 +169,7 @@
setSanity(sanity+0.4, maximum=SANITY_AMAZING)
HandleNutrition(owner)
HandleFatness(owner) //GS13 EDIT
/datum/component/mood/proc/setSanity(amount, minimum=SANITY_INSANE, maximum=SANITY_NEUTRAL)//I'm sure bunging this in here will have no negative repercussions.
var/mob/living/master = parent
@@ -315,6 +316,19 @@
/datum/component/mood/proc/hud_click(datum/source, location, control, params, mob/user)
print_mood(user)
//GS13 EDIT START
/datum/component/mood/proc/HandleFatness(mob/living/carbon/L) // GS13
if(!L)
return FALSE
switch(L.fatness)
if(FATNESS_LEVEL_FAT to INFINITY)
if(HAS_TRAIT(L, TRAIT_FAT_GOOD))
add_event(null, "fatness", /datum/mood_event/fat_good)
else if(HAS_TRAIT(L, TRAIT_FAT_BAD))
add_event(null, "fatness", /datum/mood_event/fat_bad)
//GS13 EDIT END
/datum/component/mood/proc/HandleNutrition(mob/living/L)
if(isethereal(L))
+3
View File
@@ -74,6 +74,8 @@
if(do_teleport(M, com.target, channel = TELEPORT_CHANNEL_BLUESPACE))
use_power(5000)
//GS13 EDIT
/*
if(!calibrated && iscarbon(M) && prob(30 - ((accuracy) * 10))) //oh dear a problem
var/mob/living/carbon/C = M
if(C.dna?.species && C.dna.species.id != "fly" && !HAS_TRAIT(C, TRAIT_RADIMMUNE))
@@ -81,6 +83,7 @@
C.set_species(/datum/species/fly)
log_game("[C] ([key_name(C)]) was turned into a fly person")
C.apply_effect((rand(120 - accuracy * 40, 180 - accuracy * 60)), EFFECT_IRRADIATE, 0)
*/
calibrated = FALSE
return
+35
View File
@@ -1335,6 +1335,12 @@ Traitors and the like can also be revived with the previous role mostly intact.
ADMIN_PUNISHMENT_FRY,
ADMIN_PUNISHMENT_CRACK,
ADMIN_PUNISHMENT_BLEED,
//GS13 EDIT START
ADMIN_PUNISHMENT_BONK,
ADMIN_PUNISHMENT_BREADIFY,
ADMIN_PUNISHMENT_FATTEN,
ADMIN_PUNISHMENT_FATTEN_EVIL,
//GS13 EDIT END
ADMIN_PUNISHMENT_SCARIFY,
ADMIN_PUNISHMENT_CLUWNE)
@@ -1507,6 +1513,35 @@ Traitors and the like can also be revived with the previous role mostly intact.
to_chat(usr,"<span class='warning'>This must be used on a carbon mob.</span>")
return
target.cluwneify()
// GS13 EDIT START
if(ADMIN_PUNISHMENT_BONK)
playsound(target, 'hyperstation/sound/misc/bonk.ogg', 100, 1)
target.AddElement(/datum/element/squish, 60 SECONDS)
to_chat(target, "<span class='warning big'>Bonk.</span>")
if(ADMIN_PUNISHMENT_BREADIFY)
#define BREADIFY_TIME (5 SECONDS)
var/mutable_appearance/bread_appearance = mutable_appearance('icons/obj/food/burgerbread.dmi', "bread")
var/mutable_appearance/transform_scanline = mutable_appearance('icons/effects/effects.dmi', "transform_effect")
target.transformation_animation(bread_appearance, time = BREADIFY_TIME, transform_overlay=transform_scanline, reset_after=TRUE)
addtimer(CALLBACK(src, PROC_REF(breadify), target), BREADIFY_TIME)
#undef BREADIFY_TIME
if(ADMIN_PUNISHMENT_FATTEN)
var/mob/living/carbon/human/human_target = target
if(!istype(human_target))
to_chat(usr,"<span class='warning'>This must be used on a carbon mob.</span>")
return
human_target.adjust_fatness(10000, FATTENING_TYPE_ALMIGHTY, TRUE) // MR ELECTRIC, SEND HIM TO THE ADMIN JAIL AND HAVE HIM FATTENED!
to_chat(target, span_boldwarning("You suddenly feel incredibly fat."))
if(ADMIN_PUNISHMENT_FATTEN_EVIL)
var/mob/living/carbon/human/human_target = target
if(!istype(human_target))
to_chat(usr,"<span class='warning'>This must be used on a carbon mob.</span>")
return
if(!human_target?.client?.prefs?.weight_gain_permanent)
return FALSE
human_target.fatness_perma += 10000 // Good luck getting this off, fatass.
to_chat(target, span_boldwarning("You suddenly feel incredibly fat."))
// GS13 EDIT END
punish_log(target, punishment)
@@ -6,10 +6,12 @@
can_unwrench = TRUE
construction_type = /obj/item/pipe/binary
interaction_flags_machine = INTERACT_MACHINE_OFFLINE | INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON | INTERACT_MACHINE_SET_MACHINE
pipe_state = "relief_valve-t"
shift_underlay_only = FALSE
var/opened = FALSE
var/open_pressure = ONE_ATMOSPHERE * 3
var/close_pressure = ONE_ATMOSPHERE
pipe_state = "relief_valve-t"
/obj/machinery/atmospherics/components/binary/relief_valve/layer1
piping_layer = PIPING_LAYER_MIN
@@ -24,11 +24,13 @@
return ..()
/obj/machinery/atmospherics/components/unary/portables_connector/update_icon_nopipes()
icon_state = "connector"
cut_overlays()
if(showpipe)
var/image/cap = getpipeimage(icon, "connector_cap", initialize_directions, piping_layer = piping_layer)
add_overlay(cap)
icon_state = "connector"
/obj/machinery/atmospherics/components/unary/portables_connector/process_atmos()
if(!connected_device)
return
@@ -37,7 +39,7 @@
/obj/machinery/atmospherics/components/unary/portables_connector/can_unwrench(mob/user)
. = ..()
if(. && connected_device)
to_chat(user, "<span class='warning'>You cannot unwrench [src], detach [connected_device] first!</span>")
to_chat(user, span_warning("You cannot unwrench [src], detach [connected_device] first!"))
return FALSE
/obj/machinery/atmospherics/components/unary/portables_connector/portableConnectorReturnAir()
+4
View File
@@ -189,3 +189,7 @@
/// AFK tracking
var/last_activity = 0
/// The next point in time at which the client is allowed to send a mousemove() or mousedrag()
COOLDOWN_DECLARE(next_mousemove)
COOLDOWN_DECLARE(next_mousedrag)
+15 -2
View File
@@ -230,7 +230,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
///loadout stuff
var/gear_points = 10
var/list/gear_categories
var/list/loadout_data = list()
var/list/loadout_data
var/list/unlockable_loadout_data = list()
var/loadout_slot = 1 //goes from 1 to MAXIMUM_LOADOUT_SAVES
var/gear_category
@@ -406,7 +406,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
//calculate your gear points from the chosen item
gear_points = CONFIG_GET(number/initial_gear_points)
var/list/chosen_gear = loadout_data["SAVE_[loadout_slot]"]
if(chosen_gear)
if(islist(chosen_gear))
loadout_errors = 0
for(var/loadout_item in chosen_gear)
var/loadout_item_path = loadout_item[LOADOUT_ITEM]
@@ -994,6 +994,11 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "</tr></table>"
if(LOADOUT_CHAR_TAB)
dat += "<table align='center' width='100%'>"
dat += "<tr><td colspan=4><center><b>Loadout slot</b></center></td></tr>"
dat += "<tr><td colspan=4><center>"
for(var/iteration in 1 to MAXIMUM_LOADOUT_SAVES)
dat += "<a [loadout_slot == iteration ? "class='linkOn'" : "href='?_src_=prefs;preference=gear;select_slot=[iteration]'"]>[iteration]</a>"
dat += "</center></td></tr>"
dat += "<tr><td colspan=4><center><i style=\"color: grey;\">You can only choose one item per category, unless it's an item that spawns in your backpack or hands.</center></td></tr>"
dat += "<tr><td colspan=4><center><b>"
@@ -3502,6 +3507,14 @@ GLOBAL_LIST_EMPTY(preferences_datums)
preferences_tab = text2num(href_list["tab"])
if(href_list["preference"] == "gear")
if(href_list["select_slot"])
var/chosen = text2num(href_list["select_slot"])
if(!chosen)
return
chosen = floor(chosen)
if(chosen > MAXIMUM_LOADOUT_SAVES || chosen < 1)
return
loadout_slot = chosen
if(href_list["clear_loadout"])
loadout_data["SAVE_[loadout_slot]"] = list()
save_preferences()
+7 -2
View File
@@ -953,10 +953,12 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["feature_breasts_fluid"] >> features["breasts_fluid"]
//gear loadout
if(S["loadout"])
if(istext(S["loadout"]))
loadout_data = safe_json_decode(S["loadout"])
else
loadout_data = list()
//let's remember their last used slot, i'm sure "oops i brought the wrong stuff" will be an issue now
S["loadout_slot"] >> loadout_slot
//try to fix any outdated data if necessary
//preference updating will handle saving the updated data for us.
@@ -1137,6 +1139,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
vore_smell = copytext(vore_smell, 1, MAX_TASTE_LEN)
belly_prefs = SANITIZE_LIST(belly_prefs)
loadout_slot = sanitize_num_clamp(loadout_slot, 1, MAXIMUM_LOADOUT_SAVES, 1, TRUE)
cit_character_pref_load(S)
return TRUE
@@ -1360,10 +1364,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
//gear loadout
if(length(loadout_data))
if(islist(loadout_data))
S["loadout"] << safe_json_encode(loadout_data)
else
S["loadout"] << safe_json_encode(list())
WRITE_FILE(S["loadout_slot"], loadout_slot)
if(length(tcg_cards))
S["tcg_cards"] << safe_json_encode(tcg_cards)
@@ -13,28 +13,40 @@
. = ..()
AddComponent(/datum/component/plumbing/simple_supply, bolt)
/obj/machinery/plumbing/grinder_chemical/can_be_rotated(mob/user,rotation_type)
/obj/machinery/plumbing/grinder_chemical/examine(mob/user)
. = ..()
. += span_notice("The input direction for this item can be rotated by using CTRL+SHIFT+CLICK")
/obj/machinery/plumbing/grinder_chemical/CtrlShiftClick(mob/user)
if(anchored)
to_chat(user, "<span class='warning'>It is fastened to the floor!</span>")
return FALSE
switch(eat_dir)
if(WEST)
balloon_alert(user, "set to north")
eat_dir = NORTH
return TRUE
if(EAST)
balloon_alert(user, "set to south")
eat_dir = SOUTH
return TRUE
if(NORTH)
balloon_alert(user, "set to east")
eat_dir = EAST
return TRUE
if(SOUTH)
balloon_alert(user, "set to west")
eat_dir = WEST
return TRUE
return TRUE
/obj/machinery/plumbing/grinder_chemical/CanAllowThrough(atom/movable/AM)
. = ..()
if(!anchored)
return
var/move_dir = get_dir(loc, AM.loc)
if(move_dir == eat_dir)
return TRUE
@@ -61,4 +73,8 @@
return
I.on_grind()
reagents.add_reagent_list(I.grind_results)
if(I.reagents) //If the thing has any reagents inside of it, grind them up.
I.reagents.trans_to(reagents, I.reagents.total_volume)
qdel(I)
+2
View File
@@ -3904,6 +3904,7 @@
#include "code\modules\zombie\items.dm"
#include "code\modules\zombie\organs.dm"
#include "GainStation13\code\__HELPERS\global_lists.dm"
#include "GainStation13\code\__HELPERS\transformation.dm"
#include "GainStation13\code\clothing\accessory.dm"
#include "GainStation13\code\clothing\backpacks.dm"
#include "GainStation13\code\clothing\calorite_collar.dm"
@@ -3923,6 +3924,7 @@
#include "GainStation13\code\datums\diseases\advance\presets.dm"
#include "GainStation13\code\datums\diseases\advance\symptoms\berry.dm"
#include "GainStation13\code\datums\diseases\advance\symptoms\weight_gain.dm"
#include "GainStation13\code\datums\mood_events\needs_events.dm"
#include "GainStation13\code\datums\mutations\fatfang.dm"
#include "GainStation13\code\datums\mutations\radfat.dm"
#include "GainStation13\code\datums\status_effects\fatstun.dm"