From 50fe4050b3065f41423c929895603294193f932a Mon Sep 17 00:00:00 2001
From: Alphas00 <154434082+Alphas00@users.noreply.github.com>
Date: Fri, 24 May 2024 14:22:17 +0200
Subject: [PATCH] Dream Breaker, Adipoelectric machine tweak, fatness hiding
tweak
dipoelectric generator and transformer now provide chat messages to inform the players of any errors when attempting to use them and, when examined, give information on their last processed added fatness (transformer) or their rate of power generation (generator)
Bluespace belt updated to tie its fatness override with a variable (can be edited in-game)
Fatness hiding has been tweaked, will now keep track of the object that is currently hiding the user's fatness
Null rod and bible end cursed fat steps and remove items from a person that are using fatness hiding when they hit them. Same with holy water while it is metabolizing
Added Dream Breaker, sprite provided by green6317, a null rod chaplain weapon. Has double the cooldown while attacking enemies compared to other melee weapons, but always emits light and is an effective ranged weapon when throw. It also provides a short-ranged (2 tiles) slide action that uses a lot of stamina (34)
---
.../code/machinery/adipoelectric_generator.dm | 10 ++
.../machinery/adipoelectric_transformer.dm | 19 +++-
GainStation13/code/mechanics/fatness.dm | 16 +--
.../code/obj/items/bluespace_belt.dm | 3 +-
GainStation13/code/obj/items/holy.dm | 93 ++++++++++++++++++
GainStation13/icons/obj/dreambreaker.dmi | Bin 0 -> 658 bytes
GainStation13/icons/obj/dreambreaker_left.dmi | Bin 0 -> 446 bytes
.../icons/obj/dreambreaker_right.dmi | Bin 0 -> 440 bytes
tgstation.dme | 1 +
9 files changed, 132 insertions(+), 10 deletions(-)
create mode 100644 GainStation13/code/obj/items/holy.dm
create mode 100644 GainStation13/icons/obj/dreambreaker.dmi
create mode 100644 GainStation13/icons/obj/dreambreaker_left.dmi
create mode 100644 GainStation13/icons/obj/dreambreaker_right.dmi
diff --git a/GainStation13/code/machinery/adipoelectric_generator.dm b/GainStation13/code/machinery/adipoelectric_generator.dm
index a42add21..35093d20 100644
--- a/GainStation13/code/machinery/adipoelectric_generator.dm
+++ b/GainStation13/code/machinery/adipoelectric_generator.dm
@@ -34,6 +34,7 @@
/obj/machinery/power/adipoelectric_generator/process()
if(!occupant)
+ src.visible_message("The [src] buzzes. It needs someon inside.")
playsound(src, 'sound/machines/buzz-two.ogg', 50)
return PROCESS_KILL
if(occupant:fatness_real > 0 && powernet && anchored && (emp_timer < world.time))
@@ -57,6 +58,7 @@
if(!(stat & (BROKEN|NOPOWER)))
emp_timer = world.time + 600
if(occupant)
+ src.visible_message("The [src] buzzes and expels anyone inside!.")
open_machine()
/obj/machinery/power/adipoelectric_generator/attackby(obj/item/P, mob/user, params)
@@ -107,6 +109,7 @@
add_fingerprint(occupant)
START_PROCESSING(SSobj, src)
else
+ src.visible_message("[src] needs to be anchored to a working wire and have a person going inside!")
open_machine()
/obj/machinery/power/adipoelectric_generator/update_icon()
@@ -136,6 +139,13 @@
QDEL_NULL(soundloop)
. = ..()
+/obj/machinery/power/adipoelectric_generator/examine(mob/user)
+ . = ..()
+ if(is_operational())
+ . += "[src]'s show it can produce [conversion_rate * laser_modifier]W per adipose unit, taking in [max_fat] max each time."
+ else
+ . += "[src]'s display is currently offline."
+
/obj/item/circuitboard/machine/power/adipoelectric_generator
name = "Adipoelectric Generator (Machine Board)"
build_path = /obj/machinery/power/adipoelectric_generator
diff --git a/GainStation13/code/machinery/adipoelectric_transformer.dm b/GainStation13/code/machinery/adipoelectric_transformer.dm
index 027b3c04..81c72458 100644
--- a/GainStation13/code/machinery/adipoelectric_transformer.dm
+++ b/GainStation13/code/machinery/adipoelectric_transformer.dm
@@ -18,6 +18,7 @@ GLOBAL_LIST_EMPTY(adipoelectric_transformer)
var/conversion_rate = 0.000001
var/emp_timer = 0
var/emp_multiplier = 5
+ var/datum/powernet/PN
/obj/machinery/adipoelectric_transformer/Initialize()
. = ..()
@@ -32,9 +33,10 @@ GLOBAL_LIST_EMPTY(adipoelectric_transformer)
if(!is_operational())
return
if(!attached)
+ src.visible_message("[src] buzzes. Seems like it's not attached to a working power net.")
playsound(src, 'sound/machines/buzz-two.ogg', 50)
return PROCESS_KILL
- var/datum/powernet/PN = attached.powernet
+ PN = attached.powernet
if(PN)
power_avaliable = PN.netexcess
update_icon()
@@ -59,6 +61,7 @@ GLOBAL_LIST_EMPTY(adipoelectric_transformer)
. = ..()
if(!(stat & (BROKEN|NOPOWER)))
if(occupant)
+ src.visible_message("[src] emits ominous cracking noises!")
emp_timer = world.time //stuck in for 600 ticks, about 60 seconds
/obj/machinery/adipoelectric_transformer/attackby(obj/item/P, mob/user, params)
@@ -101,6 +104,7 @@ GLOBAL_LIST_EMPTY(adipoelectric_transformer)
GLOB.adipoelectric_transformer += src
START_PROCESSING(SSobj, src)
else
+ src.visible_message("[src] buzzes. There must be another a person going in an no other transformer active in the area.")
playsound(src, 'sound/machines/buzz-two.ogg', 50)
open_machine()
@@ -133,6 +137,19 @@ GLOBAL_LIST_EMPTY(adipoelectric_transformer)
. = ..()
GLOB.adipoelectric_transformer -= src
+/obj/machinery/adipoelectric_transformer/examine(mob/user)
+ . = ..()
+ if(is_operational() && attached)
+ if(PN)
+ if(lastprocessed)
+ . += "[src]'s last reading on display was [lastprocessed * recharge_speed] adipose units."
+ else
+ . += "[src] has no last reading."
+ else
+ . += "[src]'s display states 'ERROR'. There must be something wrong with the power."
+ else
+ . += "[src]'s display is currently offline."
+
/obj/item/circuitboard/machine/adipoelectric_transformer
name = "Adipoelectric Transformer (Machine Board)"
build_path = /obj/machinery/adipoelectric_transformer
diff --git a/GainStation13/code/mechanics/fatness.dm b/GainStation13/code/mechanics/fatness.dm
index 1d60d6f2..e275defd 100644
--- a/GainStation13/code/mechanics/fatness.dm
+++ b/GainStation13/code/mechanics/fatness.dm
@@ -5,11 +5,11 @@
// -fatness_real is the value a mob is actually at, even if it's being hidden. For permanent changes, use this one
//What level of fatness is the parent mob currently at?
var/fatness = 0
- //Is something overriding the actual fatness value of a character?
- var/fatness_hidden = FALSE
- //The actual value a mob is at. Is equal to fatness if fatness_hidden is FALSE.
+ //Is something hiding the actual fatness value of a character?
+ var/fat_hider = FALSE
+ //The actual value a mob is at. Is equal to fatness if fat_hider is FALSE.
var/fatness_real = 0
- //The value a mob's fatness is being overwritten with if fatness_hidden is TRUE.
+ //The value a mob's fatness is being overwritten with if fat_hider has something in it.
var/fatness_over = 0
///At what rate does the parent mob gain weight? 1 = 100%
var/weight_gain_rate = 1
@@ -44,7 +44,7 @@
if(client?.prefs?.max_weight) // GS13
fatness_real = min(fatness_real, (client?.prefs?.max_weight - 1))
- if(fatness_hidden) //If a character's real fatness is being hidden
+ if(fat_hider) //If a character's real fatness is being hidden
if(client?.prefs?.max_weight) //Check their prefs
fatness_over = min(fatness_over, (client?.prefs?.max_weight - 1)) //And make sure it's not above their preferred max
@@ -102,8 +102,8 @@
return TRUE
-/mob/living/carbon/proc/fat_hide(hide_amount) //If something wants to hide fatness_real, it'll call this method and give it an amount to cover it with
- fatness_hidden = TRUE
+/mob/living/carbon/proc/fat_hide(hide_amount, hide_source) //If something wants to hide fatness_real, it'll call this method and give it an amount to cover it with
+ fat_hider = hide_source
fatness_over = hide_amount
fatness = fatness_over //To update a mob's fatness with the new amount to be shown immediately
if(client?.prefs?.weight_gain_extreme)
@@ -112,7 +112,7 @@
return TRUE
/mob/living/carbon/proc/fat_show() //If something that hides fatness is removed or expires, it'll call this method
- fatness_hidden = FALSE
+ fat_hider = FALSE
fatness = fatness_real //To update a mob's fatness with their real one immediately
if(client?.prefs?.weight_gain_extreme)
xwg_resize()
diff --git a/GainStation13/code/obj/items/bluespace_belt.dm b/GainStation13/code/obj/items/bluespace_belt.dm
index 0b959276..db676eb1 100644
--- a/GainStation13/code/obj/items/bluespace_belt.dm
+++ b/GainStation13/code/obj/items/bluespace_belt.dm
@@ -8,13 +8,14 @@
equip_sound = 'sound/items/equip/toolbelt_equip.ogg'
drop_sound = 'sound/items/handling/toolbelt_drop.ogg'
pickup_sound = 'sound/items/handling/toolbelt_pickup.ogg'
+ var/hide_value = 0
/obj/item/bluespace_belt/equipped(mob/user, slot)
..()
var/mob/living/carbon/U = user
if(slot == SLOT_BELT)
to_chat(user, "You put the belt around your waist and your mass begins to shrink...")
- U.fat_hide(0)
+ U.fat_hide(hide_value, src)
else
to_chat(user, "The belt is opened, letting your mass flow out!")
U.fat_show()
diff --git a/GainStation13/code/obj/items/holy.dm b/GainStation13/code/obj/items/holy.dm
new file mode 100644
index 00000000..f1ae3358
--- /dev/null
+++ b/GainStation13/code/obj/items/holy.dm
@@ -0,0 +1,93 @@
+/obj/item/nullrod/attack(mob/target, mob/living/user)
+ . = ..()
+ if(iscarbon(target))
+ var/mob/living/carbon/T = target
+ if(T.fat_hider)
+ if(isitem(T.fat_hider))
+ var/obj/item/O = T.fat_hider
+ T.dropItemToGround(O)
+ if(T.cursed_fat == 1)
+ T.cursed_fat = 0
+ T.fattening_steps_left = 0
+
+/obj/item/storage/book/bible/attack(mob/living/M, mob/living/carbon/human/user, heal_mode = TRUE)
+ . = ..()
+ if(iscarbon(M))
+ var/mob/living/carbon/T = M
+ if(T.fat_hider)
+ if(isitem(T.fat_hider))
+ var/obj/item/O = T.fat_hider
+ T.dropItemToGround(O)
+ if(T.cursed_fat == 1)
+ T.cursed_fat = 0
+ T.fattening_steps_left = 0
+
+/datum/reagent/water/holywater/on_mob_life(mob/living/carbon/M)
+ . = ..()
+ if(M.fat_hider)
+ if(isitem(M.fat_hider))
+ var/obj/item/O = M.fat_hider
+ M.dropItemToGround(O)
+ if(M.cursed_fat == 1)
+ M.cursed_fat = 0
+ M.fattening_steps_left = 0
+
+/obj/item/nullrod/dream_breaker
+ name = "dream breaker"
+ desc = "A cross-shaped weapon emitting a faint, dream-like light. Its blows will wake any dreamer."
+ icon = 'GainStation13/icons/obj/dreambreaker.dmi'
+ icon_state = "dreambreaker"
+ item_state = "dreambreaker"
+ lefthand_file = 'GainStation13/icons/obj/dreambreaker_left.dmi'
+ righthand_file = 'GainStation13/icons/obj/dreambreaker_right.dmi'
+
+ actions_types = list(/datum/action/item_action/db_slide)
+ var/slidedistance = 2
+ var/slidespeed = 3
+ var/stamina_cost = 34
+
+ force = 20
+ throwforce = 25
+ throw_range = 10
+ throw_speed = 2
+ var/click_delay = 2
+
+ slot_flags = ITEM_SLOT_BACK
+ sharpness = IS_BLUNT
+ w_class = WEIGHT_CLASS_BULKY
+ attack_verb = list("smashed", "whacked", "smacked", "bonked")
+ hitsound = "swing_hit"
+
+ var/l_range = 3
+ var/l_power = 0.8
+ light_color = "#FFCC66"
+
+/obj/item/nullrod/dream_breaker/Initialize()
+ . = ..()
+ set_light(l_range, l_power, light_color)
+
+/obj/item/nullrod/dream_breaker/attack(mob/living/target, mob/living/user)
+ . = ..()
+ user.changeNext_move(CLICK_CD_MELEE * click_delay)
+
+/obj/item/nullrod/dream_breaker/ui_action_click(mob/user, action)
+ if(!isliving(user))
+ return
+
+ var/atom/target = get_edge_target_turf(user, user.dir) //gets the user's direction
+ user.resting = TRUE
+ if(user:getStaminaLoss() < 100)
+ if (user.throw_at(target, slidedistance, slidespeed, spin = FALSE, diagonals_first = TRUE))
+ user:adjustStaminaLoss(stamina_cost) //reduce stamina loss by 0.3 per tick, 6 per 2 seconds
+ user.visible_message("[usr] slides forward!")
+ user.resting = FALSE
+ else
+ to_chat(user, "Something prevents you from sliding forward!")
+ else
+ to_chat(user, "You fall down when attempting to slide!")
+
+/datum/action/item_action/db_slide
+ name = "Dream Breaker Slide"
+ desc = "Use dream-like atheletics to slide forward, but don't wear yourself out!."
+ icon_icon = 'GainStation13/icons/obj/dreambreaker.dmi'
+ button_icon_state = "dreambreaker"
diff --git a/GainStation13/icons/obj/dreambreaker.dmi b/GainStation13/icons/obj/dreambreaker.dmi
new file mode 100644
index 0000000000000000000000000000000000000000..de21cabc878bbd8d008f349ee67073701128b713
GIT binary patch
literal 658
zcmV;D0&V??P)V=-0C=1w$2$suFc1a6I(v$T_TsNiBN0iVcZg&)K~&fTy}pIrOo?Hf>;f}e
zdRS7tFKF~tP3nz42WWIHslag$`A^C&Gc*b>?9Nr#9V`VYA0<{A+(|@1R9J=Wm%VD+U>JpuLcvD8fRaJ&(5ZuKG6mV~pe0K{?bHh>
z*$N^<$JEG?)y&fsf!IHz$MnOnyG$#Lw}00?bU86vbz_J(D=S|6b|EaS_rhvT20
zwRwFva1EWAZ!xq@sseaH%FMSY5+`?Z$=r!tL!Vx>woygg>7uq#1pt)3HW4)k`1EH7
zt;Ps%e*9j}msF
zlLrfM^8Op*{R#l&%JHq)$07*qoM6N<$g6JeF>;M1&
literal 0
HcmV?d00001
diff --git a/GainStation13/icons/obj/dreambreaker_left.dmi b/GainStation13/icons/obj/dreambreaker_left.dmi
new file mode 100644
index 0000000000000000000000000000000000000000..b0081b3296786adb3e4bb71b771bc0170a115323
GIT binary patch
literal 446
zcmV;v0YUzWP)V=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+
z(=$pSoZ^zil2jm5DWxbiF*gZFWTzG>adD<(78Qf^a&e{=CFZ7r*oIun3a)-GVABC1
z=p6GlB95p4007oWL_t(YiRF|r4#F@DMI8!JN7@qv!2y6HaDq&zBTED)K#W;>ZnjPLjV8(
literal 0
HcmV?d00001
diff --git a/GainStation13/icons/obj/dreambreaker_right.dmi b/GainStation13/icons/obj/dreambreaker_right.dmi
new file mode 100644
index 0000000000000000000000000000000000000000..5be5a6a8ed57662a4c3e63916a08deee864d12fd
GIT binary patch
literal 440
zcmV;p0Z0CcP)GeAR0004WQchCV=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+
z(=$pSoZ^zil2jm5DWxbiF*gZFWTzG>adD<(78Qf^a&e{=CFZ7r*oIun3a)-GVABC1
z=p6GlB95p4007WQL_t(YiQSYj4#F@DMU$e?wUi4Kl>=0qpyC9b(lrYbW0xXMz`0>b
ziRh1i5QPCxe#uh?$F@?7#D<;jpin;30~G2dg(DR9zZ6yl6m*j=!25TENa*TQ!E`?B
zuwYL-;JJyP|7&Q%vr5h?
zTN74UBXfe#%FKmuRY2y#mM|AyH^FQ(aG{c!3ucsA^=p~W&WWsSZw84UaUsl`jtW^T
ib3)S