whole lotta stuff

This commit is contained in:
Metis
2024-09-12 23:53:35 -04:00
parent f268e5655f
commit 8fd779ef02
232 changed files with 8793 additions and 0 deletions
@@ -0,0 +1,34 @@
/obj/item/bluespace_belt
name = "bluespace belt"
desc = "A belt made using bluespace technology. The power of space and time, used to hide the fact you are fat."
icon = 'GainStation13/icons/obj/clothing/bluespace_belt.dmi'
icon_state = "bluespace_belt"
item_state = "bluespace_belt"
slot_flags = ITEM_SLOT_BELT
equip_sound = 'sound/items/equip/toolbelt_equip.ogg'
drop_sound = 'sound/items/handling/toolbelt_drop.ogg'
pickup_sound = 'sound/items/handling/toolbelt_pickup.ogg'
/obj/item/bluespace_belt/equipped(mob/user, slot)
..()
if(!iscarbon(user))
return
var/mob/living/carbon/U = user
if(slot == SLOT_BELT)
to_chat(U, "<span class='notice'>You put the belt around your waist and your mass begins to shrink...</span>")
U.hider_add(src)
else
to_chat(user, "<span class='notice'>The belt is opened, letting your mass flow out!</span>")
U.hider_remove(src)
/obj/item/bluespace_belt/dropped(mob/user)
..()
if(!iscarbon(user))
return
var/mob/living/carbon/U = user
to_chat(U, "<span class='warning'>The belt is opened, letting your mass flow out!</span>")
U.hider_remove(src)
/obj/item/bluespace_belt/proc/fat_hide(var/mob/living/carbon/user)
return -(user.fatness_real - 1)
+30
View File
@@ -0,0 +1,30 @@
/obj/item/integrated_circuit/input/fat_scanner
name = "integrated body fat analyzer"
desc = "A very small version of the common medical analyser adjusted to scan a target's weight."
icon_state = "medscan"
complexity = 4
inputs = list("target" = IC_PINTYPE_REF)
outputs = list(
"weight (pounds)" = IC_PINTYPE_NUMBER,
"weight (BFI)" = IC_PINTYPE_NUMBER
)
activators = list("scan" = IC_PINTYPE_PULSE_IN, "on scanned" = IC_PINTYPE_PULSE_OUT)
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
power_draw_per_use = 40
/obj/item/integrated_circuit/input/fat_scanner/do_work()
var/mob/living/carbon/fatty = get_pin_data_as_type(IC_INPUT, 1, /mob/living)
if(!istype(fatty)) //Invalid input
return
if(!fatty.Adjacent(get_turf(src))) // Like normal analysers, it can't be used at range.
return
var/weight_in_pounds = fatty.calculate_weight_in_pounds()
var/weight_in_fatness = fatty.fatness
set_pin_data(IC_OUTPUT, 1, weight_in_pounds)
set_pin_data(IC_OUTPUT, 2, weight_in_fatness)
push_data()
activate_pin(2)
+93
View File
@@ -0,0 +1,93 @@
/obj/item/nullrod/attack(mob/target, mob/living/user)
. = ..()
if(iscarbon(target))
var/mob/living/carbon/T = target
for(var/hider in T.fat_hiders)
if(isitem(hider))
var/obj/item/O = 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
for(var/hider in T.fat_hiders)
if(isitem(hider))
var/obj/item/O = 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)
. = ..()
for(var/hider in M.fat_hiders)
if(isitem(hider))
var/obj/item/O = 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(mapload)
. = ..()
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("<span class='warning'>[usr] slides forward!</span>")
user.resting = FALSE
else
to_chat(user, "<span class='warning'>Something prevents you from sliding forward!</span>")
else
to_chat(user, "<span class='warning'>You fall down when attempting to slide!</span>")
/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"
+171
View File
@@ -0,0 +1,171 @@
/////GS13 - miscellanous items. If it's a small item, a container or something
/////then it should land here, instead of making a seperate .dm file
//fatoray research scraps (maintloot)
/obj/item/trash/fatoray_scrap1
name = "raygun scraps"
icon = 'GainStation13/icons/obj/fatoray.dmi'
icon_state = "fatoray_scrap1"
desc = "Small parts that seemingly once belonged to some sort of a raygun."
/obj/item/trash/fatoray_scrap2
name = "raygun scraps"
icon = 'GainStation13/icons/obj/fatoray.dmi'
icon_state = "fatoray_scrap2"
desc = "Small parts that seemingly once belonged to some sort of a raygun."
// GS13 fatty liquid beakers defs, for admin stuff and mapping junk
/obj/item/reagent_containers/glass/beaker/lipoifier
list_reagents = list(/datum/reagent/consumable/lipoifier = 50)
/obj/item/reagent_containers/glass/beaker/cornoil
list_reagents = list(/datum/reagent/consumable/cornoil = 50)
/obj/item/reagent_containers/glass/beaker/blueberry_juice
list_reagents = list(/datum/reagent/blueberry_juice = 50)
/obj/item/reagent_containers/glass/beaker/fizulphite
list_reagents = list(/datum/reagent/consumable/fizulphite = 50)
/obj/item/reagent_containers/glass/beaker/extilphite
list_reagents = list(/datum/reagent/consumable/extilphite = 50)
/obj/item/reagent_containers/glass/beaker/calorite_blessing
list_reagents = list(/datum/reagent/consumable/caloriteblessing = 50)
/obj/item/reagent_containers/glass/beaker/flatulose
list_reagents = list(/datum/reagent/consumable/flatulose = 50)
//blueberry gum snack
/obj/item/reagent_containers/food/snacks/blueberry_gum
name = "blueberry gum"
icon = 'GainStation13/icons/obj/gum.dmi'
icon_state = "gum_wrapped"
desc = "Doesn't cause anything more than some discoloration... probably."
trash = /obj/item/trash/blueberry_gum
list_reagents = list(/datum/reagent/blueberry_juice = 50)
bitesize = 5
filling_color = "#001aff"
tastes = list("blueberry gum" = 1)
foodtype = FRUIT
price = 5
//blueberry gum trash
/obj/item/trash/blueberry_gum
name = "chewed gum"
icon = 'GainStation13/icons/obj/gum.dmi'
icon_state = "gum_chewed"
// nutriment pump turbo
/obj/item/autosurgeon/nutripump_turbo
desc = "A single use autosurgeon that contains a turbo version of the nutriment pump. A screwdriver can be used to remove it, but implants can't be placed back in."
uses = 1
starting_organ = /obj/item/organ/cyberimp/chest/nutriment/turbo
/obj/item/autosurgeon/fat_mobility
desc = "A single use autosurgeon that contains a mobility nanite core. A screwdriver can be used to remove it, but implants can't be placed back in."
uses = 1
starting_organ = /obj/item/organ/cyberimp/chest/mobility
//fast food restaurant - closed / open signs
/obj/item/holosign_creator/restaurant
name = "Holosign Projector - Restaurant Adverts"
desc = "A holo-sign maker, used for placing signs that advertises the local fast food restaurant."
icon = 'GainStation13/icons/obj/holosign.dmi'
icon_state = "holo_fastfood"
holosign_type = /obj/structure/holosign/restaurant
creation_time = 0
max_signs = 6
/obj/item/holosign_creator/closed
name = "Holosign Projector - Closing Sign"
desc = "A holo-sign maker, used for placing signs that inform people of a location being closed off."
icon = 'GainStation13/icons/obj/holosign.dmi'
icon_state = "holo_closed"
holosign_type = /obj/structure/holosign/barrier/closed
creation_time = 0
max_signs = 6
//holosigns used by the holosign creators
/obj/structure/holosign/restaurant
name = "The Restaurant is OPEN! Come visit!"
desc = "A holographic projector that displays a sign advertising the nearby Fast Food Restaurant."
icon = 'GainStation13/icons/obj/holosign.dmi'
icon_state = "holosign_ad"
/obj/structure/holosign/barrier/closed
name = "This Location is Closed!"
desc = "A short holographic barrier used to close off areas. Can be passed by walking."
icon = 'GainStation13/icons/obj/holosign.dmi'
icon_state = "holosign_closed"
//ID for fastfood wagies so they can use the tele
/obj/item/card/id/silver/restaurant
name = "silver identification card"
desc = "A silver ID, given to the GATO's fast food restaurant workers. Doesn't grant much besides teleporter access."
access = list(ACCESS_MAINT_TUNNELS, ACCESS_TELEPORTER)
//gato decal, should be moved elsewhere tbh
/obj/effect/decal/big_gato //96x96 px sprite
name = "GATO"
desc = "Your employer! Probably."
icon = 'GainStation13/icons/turf/96x96.dmi'
icon_state = "gato"
layer = ABOVE_OPEN_TURF_LAYER
pixel_x = -32
pixel_y = -32
/obj/effect/decal/medium_gato //64x64 px sprite
name = "GATO"
desc = "Your employer! Probably."
icon = 'GainStation13/icons/turf/64x64.dmi'
icon_state = "gato"
layer = ABOVE_OPEN_TURF_LAYER
pixel_y = -16
pixel_x = -16
//collar voice modulators, based on cow/pig masks
/obj/item/clothing/mask/pig/gag //this one only lets you say "oink" and similar
name = "Voice modulator - pig"
desc = "A small gag, used to silence people in a rather 'original' way."
icon_state = "ballgag"
item_state = "ballgag"
flags_inv = HIDEFACE
clothing_flags = VOICEBOX_TOGGLABLE
w_class = WEIGHT_CLASS_SMALL
modifies_speech = TRUE
/obj/item/clothing/mask/cowmask/gag //this one only lets you say "moo" and similar
name = "Voice modulator - cow"
desc = "A small gag, used to silence people in a rather 'original' way."
icon = 'icons/obj/clothing/masks.dmi'
icon_state = "ballgag"
item_state = "ballgag"
flags_inv = HIDEFACE
/obj/item/service_sign
name = "service sign"
desc = "A sign that reads 'closed'"
icon = 'GainStation13/icons/obj/service_sign.dmi'
icon_state = "sign_closed"
/obj/item/service_sign/attack_self()
if(icon_state == "sign_closed")
icon_state = "sign_open"
desc = "A sign that reads 'open'"
else
icon_state = "sign_closed"
desc = "A sign that reads 'closed'"
/obj/item/trash/odd_disk
name = "odd disk"
icon = 'icons/obj/module.dmi'
icon_state = "datadisk0"
desc = "A dusty disk, desconstruction will be needed to recover data."
@@ -0,0 +1,47 @@
/obj/item/clothing/accessory/pride_pin
name = "pride pin"
desc = "A pride pin."
icon_state = "pride"
item_color = "pride"
/obj/item/clothing/accessory/pride_pin/bi
name = "bisexual pride pin"
desc = "A bisexual pride pin."
icon_state = "pride_bi"
item_color = "pride_bi"
/obj/item/clothing/accessory/pride_pin/trans
name = "transgender pride pin"
desc = "A transgender pride pin."
icon_state = "pride_trans"
item_color = "pride_trans"
/obj/item/clothing/accessory/pride_pin/ace
name = "asexual pride pin"
desc = "A asexual pride pin."
icon_state = "pride_ace"
item_color = "pride_ace"
/obj/item/clothing/accessory/pride_pin/enby
name = "non-binary pride pin"
desc = "A non-binary pride pin."
icon_state = "pride_enby"
item_color = "pride_enby"
/obj/item/clothing/accessory/pride_pin/pan
name = "pansexual pride pin"
desc = "A pansexual pride pin."
icon_state = "pride_pan"
item_color = "pride_pan"
/obj/item/clothing/accessory/pride_pin/lesbian
name = "lesbian pride pin"
desc = "A lesbian pride pin."
icon_state = "pride_lesbian"
item_color = "pride_lesbian"
/obj/item/clothing/accessory/pride_pin/intersex
name = "intersex pride pin"
desc = "A intersex pride pin."
icon_state = "pride_intersex"
item_color = "pride_intersex"
@@ -0,0 +1,79 @@
/obj/item/assembly/infra/fat
name = "fatness infrared emitter"
desc = "Emits a visible or invisible beam and is triggered when the beam is interrupted. This one checks if the person tripping it is above or below a certain level of fatness."
var/fatness_to_trigger = 0
var/trigger_below = FALSE
/obj/item/assembly/infra/fat/examine(mob/user)
. = ..()
. += "<span class='notice'>The infrared trigger is set to trigger when the target is [trigger_below?"above":"below"] being [get_fatness_level_name(fatness_to_trigger)].</span>"
/obj/item/assembly/infra/fat/ui_interact(mob/user)//TODO: change this this to the wire control panel
if(!is_secured(user))
return
user.set_machine(src)
var/dat = "<TT><B>Fatness Infrared Laser</B></TT>"
dat += "<BR><B>Status</B>: [on ? "<A href='?src=[REF(src)];state=0'>On</A>" : "<A href='?src=[REF(src)];state=1'>Off</A>"]"
dat += "<BR><B>Visibility</B>: [visible ? "<A href='?src=[REF(src)];visible=0'>Visible</A>" : "<A href='?src=[REF(src)];visible=1'>Invisible</A>"]"
dat += "<BR><B>Fatness level to trigger:</B><A href='?src=[REF(src)];fatness_to_trigger=1'>[get_fatness_level_name(fatness_to_trigger)]</A>"
dat += "<BR><B>Trigger above or below the target fatness level:</B><A href='?src=[REF(src)];trigger_below=1'>[trigger_below ? "Below" : "Above"]</A>"
dat += "<BR><BR><A href='?src=[REF(src)];refresh=1'>Refresh</A>"
dat += "<BR><BR><A href='?src=[REF(src)];close=1'>Close</A>"
user << browse(dat, "window=infra")
onclose(user, "infra")
return
/obj/item/assembly/infra/fat/Topic(href, href_list)
..()
if(href_list["trigger_below"])
trigger_below = !(trigger_below)
update_icon()
refreshBeam()
if(href_list["fatness_to_trigger"])
var/fatness_type = input(usr,
"What level of fatness do you wish to alert above/under at?",
src, "None") as null|anything in list(
"None", "Fat", "Fatter", "Very Fat", "Obese", "Morbidly Obese", "Extremely Obese", "Barely Mobile", "Immobile", "Blob")
if(!fatness_type)
return
var/fatness_amount = 0
switch(fatness_type)
if("Fat")
fatness_amount = FATNESS_LEVEL_FAT
if("Fatter")
fatness_amount = FATNESS_LEVEL_FATTER
if("Very Fat")
fatness_amount = FATNESS_LEVEL_VERYFAT
if("Obese")
fatness_amount = FATNESS_LEVEL_OBESE
if("Morbidly Obese")
fatness_amount = FATNESS_LEVEL_MORBIDLY_OBESE
if("Extremely Obese")
fatness_amount = FATNESS_LEVEL_EXTREMELY_OBESE
if("Barely Mobile")
fatness_amount = FATNESS_LEVEL_BARELYMOBILE
if("Immobile")
fatness_amount = FATNESS_LEVEL_IMMOBILE
if("Blob")
fatness_amount = FATNESS_LEVEL_BLOB
fatness_to_trigger = fatness_amount
update_icon()
refreshBeam()
/obj/item/assembly/infra/fat/trigger_beam(atom/movable/AM, turf/location)
var/mob/living/carbon/crossed_fatty = AM
if(!istype(crossed_fatty))
return FALSE
if(trigger_below && (crossed_fatty.fatness >= fatness_to_trigger))
return FALSE
if(!trigger_below && (crossed_fatty.fatness < fatness_to_trigger))
return FALSE
return ..() // I love using inheritence so much.
@@ -0,0 +1,37 @@
/obj/machinery/door
var/fatness_to_check = 0
var/check_fatness = FALSE
var/check_fatness_below = FALSE
/obj/machinery/door/proc/change_fatness_to_check(mob/user)
var/fatness_type = input(usr,
"What level of fatness do you wish to alert above/under at?",
src, "None") as null|anything in list(
"None", "Fat", "Fatter", "Very Fat", "Obese", "Morbidly Obese", "Extremely Obese", "Barely Mobile", "Immobile", "Blob")
if(!fatness_type)
return FALSE
var/fatness_amount = 0
switch(fatness_type)
if("Fat")
fatness_amount = FATNESS_LEVEL_FAT
if("Fatter")
fatness_amount = FATNESS_LEVEL_FATTER
if("Very Fat")
fatness_amount = FATNESS_LEVEL_VERYFAT
if("Obese")
fatness_amount = FATNESS_LEVEL_OBESE
if("Morbidly Obese")
fatness_amount = FATNESS_LEVEL_MORBIDLY_OBESE
if("Extremely Obese")
fatness_amount = FATNESS_LEVEL_EXTREMELY_OBESE
if("Barely Mobile")
fatness_amount = FATNESS_LEVEL_BARELYMOBILE
if("Immobile")
fatness_amount = FATNESS_LEVEL_IMMOBILE
if("Blob")
fatness_amount = FATNESS_LEVEL_BLOB
fatness_to_check = fatness_amount
return TRUE
@@ -0,0 +1,18 @@
/obj/structure/mineral_door/calorite //GS13
name = "calorite door"
icon = 'GainStation13/icons/obj/structure/calorite_door.dmi'
icon_state = "calorite"
sheetType = /obj/item/stack/sheet/mineral/calorite
max_integrity = 200
light_range = 1
// Sets it open by default
state = TRUE
density = FALSE
// If you ever want to make any door like this, just simply add the component like this :3
/obj/structure/mineral_door/calorite/Initialize(mapload)
. = ..()
AddComponent(/datum/component/fattening_door)
update_icon() // Updates the sprite when spawned in cause it's closed by default.
@@ -0,0 +1,9 @@
/obj/structure/tree/candylight //GS13
name = "Peppermint Light"
desc = "A light source that's made out of a peppermint tree."
icon = 'GainStation13/icons/obj/gslight.dmi'
icon_state = "candylight"
max_integrity = 500
light_color = "#a5cfc5" //testing out my copy cat skills. -Metussi
light_range = 3
anchored = 1
@@ -0,0 +1,43 @@
/obj/structure/cursedfatfountain
name = "Strange fountain"
desc = "An odd fountain, sparking with foreign magic."
icon = 'GainStation13/icons/obj/cursed_fountain.dmi'
icon_state = "full"
anchored = TRUE
density = TRUE
var/curse_given = 0
/mob/living
var/cursed_fat = 0 //decides whether the user is cursed at all (also makes for a fun admin switch)
var/fattening_steps_left = 0 //decides on the lenght of the curse
/obj/structure/cursedfatfountain/attack_hand(mob/living/user)
. = ..()
if(.)
return
if(curse_given == 1)
to_chat(user, "<span class='notice'>The fountain has dried up.</span>")
icon_state = "empty"
return
if (ishuman(user) && user.has_dna())
user.cursed_fat = 1
user.fattening_steps_left += 2000
icon_state = "empty"
to_chat(user, "<span class='notice'>The glittering orange liquid disappears instantly as you touch it. You feel a strange, warm sensation inside, growing stronger the more you move...</span>")
curse_given = 1
// /obj/structure/cursedfatfountain/update_icon()
// if(last_process + time_between_uses > world.time)
// icon_state = "full"
// else
// icon_state = "empty"
/mob/living/carbon/Move(NewLoc, direct)
. = ..()
if(cursed_fat == 1)
fattening_steps_left -= 1
adjust_fatness(20, FATTENING_TYPE_MAGIC)
if(fattening_steps_left <= 0)
cursed_fat = 0
@@ -0,0 +1,6 @@
/obj/structure/statue/fatso
name = "statue of a forgotten god"
desc = "A statue of a long forgotten god, at least on earth."
icon = 'GainStation13/icons/obj/structure/statues.dmi'
icon_state = "fattha_statue"
anchored = TRUE
+81
View File
@@ -0,0 +1,81 @@
/obj/structure/scale
name = "weighing scale"
desc = "You can weigh yourself with this."
icon = 'GainStation13/icons/obj/scale.dmi'
icon_state = "scale"
anchored = TRUE
resistance_flags = NONE
max_integrity = 250
integrity_failure = 25
var/buildstacktype = /obj/item/stack/sheet/metal
var/buildstackamount = 3
layer = OBJ_LAYER
//stores the weight of the last person to step on in Lbs
var/lastreading = 0
//the conversion ratio for how much a point of fatness weighs on a 6' person
var/fatnessToWeight = 0.25
/obj/structure/scale/deconstruct()
// If we have materials, and don't have the NOCONSTRUCT flag
if(buildstacktype && (!(flags_1 & NODECONSTRUCT_1)))
new buildstacktype(loc,buildstackamount)
..()
/obj/structure/scale/attackby(obj/item/W, mob/user, params)
if(W.tool_behaviour == TOOL_WRENCH && !(flags_1&NODECONSTRUCT_1))
W.play_tool_sound(src)
deconstruct()
else if(istype(W, /obj/item/assembly/shock_kit))
if(!user.temporarilyRemoveItemFromInventory(W))
return
var/obj/item/assembly/shock_kit/SK = W
var/obj/structure/chair/e_chair/E = new /obj/structure/chair/e_chair(src.loc)
playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1)
E.setDir(dir)
E.part = SK
SK.forceMove(E)
SK.master = E
qdel(src)
else
return ..()
/obj/structure/scale/examine(mob/user)
. = ..()
. += "Its last reading was: [src.lastreading]Lbs"
. += "<span class='notice'>It's held together by a couple of <b>bolts</b>.</span>"
/obj/structure/scale/proc/weighEffect(mob/living/carbon/human/fatty)
to_chat(fatty, "<span class='notice'>You weigh yourself.</span>")
to_chat(fatty, "<span class='notice'>The numbers on the screen tick up and eventually settle on:</span>")
//The appearance of the numbers changes with the fat level of the character
if (HAS_TRAIT(fatty, TRAIT_BLOB))
to_chat(fatty, "<span class='userdanger'><span class='big'>[round(src.lastreading/2000, 0.01)]TONS!!!</span></span>")
else if (HAS_TRAIT(fatty, TRAIT_IMMOBILE))
to_chat(fatty, "<span class='boldannounce'>[src.lastreading]Lbs!</span>")
else if(HAS_TRAIT(fatty, TRAIT_OBESE) || HAS_TRAIT(fatty, TRAIT_MORBIDLYOBESE))
to_chat(fatty, "<span class='alert'>[src.lastreading]Lbs!</span>")
else
to_chat(fatty, "<span class='notice'>[src.lastreading]Lbs.</span>")
visible_message("<span class='notice'>The numbers on the screen read out: [fatty] has a BFI of [fatty.fatness].</span>")
/obj/structure/scale/Crossed(AM as mob|obj)
if(isturf(loc))
//need to be sure the thing that just crossed the scale is human
if(ishuman(AM))
var/mob/living/carbon/human/HM = AM
if(!(HM.movement_type & FLYING))
weighperson(HM)
/obj/structure/scale/proc/weighperson(mob/living/carbon/human/fatty)
src.lastreading = fatty.calculate_weight_in_pounds()
weighEffect(fatty)
visible_message("<span class='notice'>[fatty] weighs themselves.</span>")
visible_message("<span class='notice'>The numbers on the screen settle on: [src.lastreading]Lbs.</span>")
visible_message("<span class='notice'>The numbers on the screen read out: [fatty] has a BFI of [fatty.fatness].</span>")
/mob/living/carbon/proc/calculate_weight_in_pounds()
return round((140 + (fatness*FATNESS_TO_WEIGHT_RATIO))*(size_multiplier**2)*((dna.features["taur"] != "None") ? 2.5: 1))
@@ -0,0 +1,171 @@
/////GS13 - rayguns for metabolism and breasts/ass manipulation
//this is pretty wonky code, but ig it works
/obj/item/gun/energy/laser/alter_ray
name = "alter-ray"
icon = 'icons/obj/guns/energy.dmi'
icon_state = "lasernew"
desc = "This weapon is capable of altering one's body capabilities."
item_state = null
selfcharge = EGUN_SELFCHARGE
charge_delay = 5
ammo_x_offset = 2
clumsy_check = 1
/obj/item/gun/energy/laser/alter_ray/gainrate
name = "AL-T-Ray: Metabolism"
desc = "This weapon is capable of altering one's body capabilities. This model appears to be capable of altering one's weight gain and loss rate by 10%."
ammo_type = list(/obj/item/ammo_casing/energy/laser/gainrate_decrease, /obj/item/ammo_casing/energy/laser/gainrate_increase, /obj/item/ammo_casing/energy/laser/lossrate_decrease, /obj/item/ammo_casing/energy/laser/lossrate_increase)
// /obj/item/gun/energy/laser/alter_ray/assbreasts //genius name, I know
// name = "AL-T-Ray: Voluptousness"
// desc = "This weapon is capable of altering one's body capabilities. This model appears to be capable of altering the size's of one's breasts or buttocks."
// ammo_type = list(/obj/item/ammo_casing/energy/laser/shrinkray, /obj/item/ammo_casing/energy/laser/growthray)
/obj/item/projectile/alter_ray
name = "sizeray beam"
icon_state = "omnilaser"
hitsound = null
damage = 0
damage_type = STAMINA
flag = "laser"
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
ricochets_max = 50
ricochet_chance = 80
is_reflectable = TRUE
var/ratechange_amount = 0.1
//projectile biz
/obj/item/projectile/alter_ray/gainrate_decrease
icon_state="bluelaser"
/obj/item/projectile/alter_ray/gainrate_increase
icon_state="laser"
/obj/item/projectile/alter_ray/lossrate_decrease
icon_state="bluelaser"
/obj/item/projectile/alter_ray/lossrate_increase
icon_state="laser"
// /obj/item/projectile/alter_ray/breast_decrease
// icon_state="bluelaser"
// /obj/item/projectile/alter_ray/breast_increase
// icon_state="laser"
// /obj/item/projectile/alter_ray/butt_decrease
// icon_state="bluelaser"
// /obj/item/projectile/alter_ray/butt_increase
// icon_state="laser"
//laser hitting / changing code
//wg rate increase
/obj/item/projectile/alter_ray/gainrate_increase/on_hit(atom/target, blocked)
. = ..()
var/mob/living/carbon/gainer = target
if(iscarbon(gainer))
if(gainer.weight_gain_rate <= 3)
gainer.weight_gain_rate += ratechange_amount
return TRUE
return FALSE
return FALSE
//wg rate decrease
/obj/item/projectile/alter_ray/gainrate_decrease/on_hit(atom/target, blocked)
. = ..()
var/mob/living/carbon/gainer = target
if(iscarbon(gainer))
if(gainer.weight_gain_rate >= 0.11)
gainer.weight_gain_rate -= ratechange_amount
return TRUE
if(gainer.weight_gain_rate <= 0.1)
return FALSE
return FALSE
//wl rate increase
/obj/item/projectile/alter_ray/lossrate_increase/on_hit(atom/target, blocked)
. = ..()
var/mob/living/carbon/gainer = target
if(iscarbon(gainer))
if(gainer.weight_loss_rate <= 3)
gainer.weight_loss_rate += ratechange_amount
return TRUE
return FALSE
return FALSE
//wl rate decrease
/obj/item/projectile/alter_ray/lossrate_decrease/on_hit(atom/target, blocked)
. = ..()
var/mob/living/carbon/gainer = target
if(iscarbon(gainer))
if(gainer.weight_loss_rate >= 0.11)
gainer.weight_loss_rate -= ratechange_amount
return TRUE
if(gainer.weight_loss_rate <= 0.1)
return FALSE
return FALSE
//ammo casings - these are needed to allow guns to switch between firing modes
/obj/item/ammo_casing/energy/laser/gainrate_increase
projectile_type = /obj/item/projectile/alter_ray/gainrate_increase
select_name = "Weight Gain Increase"
/obj/item/ammo_casing/energy/laser/gainrate_decrease
projectile_type = /obj/item/projectile/alter_ray/gainrate_decrease
select_name = "Weight Gain Decrease"
/obj/item/ammo_casing/energy/laser/lossrate_increase
projectile_type = /obj/item/projectile/alter_ray/lossrate_increase
select_name = "Weight Loss Increase"
/obj/item/ammo_casing/energy/laser/lossrate_decrease
projectile_type = /obj/item/projectile/alter_ray/lossrate_decrease
select_name = "Weight Loss Decrease"
//ALTRay for making someone gain from weight loss
/obj/item/gun/energy/laser/alter_ray/noloss
name = "AL-T-Ray: Reverser"
desc = "This weapon is capable of altering one's body capabilities. This one reverse's ones body functions, to make it so weight loss results in weight gain."
ammo_type = list(/obj/item/ammo_casing/energy/laser/lossrate_reverse)
/obj/item/ammo_casing/energy/laser/lossrate_reverse
projectile_type = /obj/item/projectile/alter_ray/lossrate_reverse
select_name = "Weight Loss Reverse"
/obj/item/projectile/alter_ray/lossrate_reverse
ratechange_amount = -2
icon_state="laser"
/obj/item/projectile/alter_ray/lossrate_reverse/on_hit(atom/target, blocked)
. = ..()
var/mob/living/carbon/gainer = target
if(iscarbon(gainer))
gainer.weight_loss_rate = ratechange_amount
return TRUE
+126
View File
@@ -0,0 +1,126 @@
/obj/item/gun/fatbeam // GS13
name = "Fatbeam Gun"
desc = "Apparently used to treat malnourished patients from a safe distance... But we all know what it will truly be used for."
icon = 'icons/obj/fatbeam.dmi'
icon_state = "fatbeam"
item_state = "fatbeam"
w_class = WEIGHT_CLASS_NORMAL
var/mob/living/current_target
var/last_check = 0
var/check_delay = 10 //Check los as often as possible, max resolution is SSobj tick though
var/max_range = 8
var/active = 0
var/datum/beam/current_beam = null
var/mounted = 0 //Denotes if this is a handheld or mounted version
weapon_weight = WEAPON_MEDIUM
/obj/item/gun/fatbeam/Initialize(mapload)
. = ..()
START_PROCESSING(SSobj, src)
/obj/item/gun/fatbeam/Destroy(mob/user)
STOP_PROCESSING(SSobj, src)
LoseTarget()
return ..()
/obj/item/gun/fatbeam/dropped(mob/user)
..()
LoseTarget()
/obj/item/gun/fatbeam/equipped(mob/user)
..()
LoseTarget()
/obj/item/gun/fatbeam/proc/LoseTarget()
if(active)
qdel(current_beam)
current_beam = null
active = 0
on_beam_release(current_target)
current_target = null
/obj/item/gun/fatbeam/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0)
if(isliving(user))
add_fingerprint(user)
if(current_target)
LoseTarget()
if(!isliving(target))
return
current_target = target
active = TRUE
current_beam = new(user,current_target,time=6000,beam_icon_state="fatbeam",btype=/obj/effect/ebeam/medical)
INVOKE_ASYNC(current_beam, TYPE_PROC_REF(/datum/beam,Start))
SSblackbox.record_feedback("tally", "gun_fired", 1, type)
/obj/item/gun/fatbeam/process()
var/source = loc
if(!mounted && !isliving(source))
LoseTarget()
return
if(!current_target)
LoseTarget()
return
if(world.time <= last_check+check_delay)
return
last_check = world.time
if(get_dist(source, current_target)>max_range || !los_check(source, current_target))
LoseTarget()
if(isliving(source))
to_chat(source, "<span class='warning'>You lose control of the beam!</span>")
return
if(current_target)
on_beam_tick(current_target)
/obj/item/gun/fatbeam/proc/los_check(atom/movable/user, mob/target)
var/turf/user_turf = user.loc
if(mounted)
user_turf = get_turf(user)
else if(!istype(user_turf))
return FALSE
var/obj/dummy = new(user_turf)
dummy.pass_flags |= PASSTABLE|PASSGLASS|PASSGRILLE //Grille/Glass so it can be used through common windows
for(var/turf/turf in getline(user_turf,target))
if(mounted && turf == user_turf)
continue //Mechs are dense and thus fail the check
if(turf.density)
qdel(dummy)
return FALSE
for(var/atom/movable/AM in turf)
if(!AM.CanPass(dummy,turf,1))
qdel(dummy)
return FALSE
for(var/obj/effect/ebeam/medical/B in turf)// Don't cross the str-beams!
if(B.owner.origin != current_beam.origin)
explosion(B.loc,0,1,3,4)
qdel(dummy)
return FALSE
qdel(dummy)
return TRUE
/obj/item/gun/fatbeam/proc/on_beam_hit(var/mob/living/target)
return
/obj/item/gun/fatbeam/proc/on_beam_tick(var/mob/living/target)
if(target.health != target.maxHealth)
new /obj/effect/temp_visual/heal(get_turf(target), "#fabb62")
if(target?.client?.prefs?.weight_gain_weapons)
target.nutrition += 50
return
/obj/item/gun/fatbeam/proc/on_beam_release(var/mob/living/target)
return
/obj/effect/ebeam/medical
name = "fattening beam"
+142
View File
@@ -0,0 +1,142 @@
/////GS13 - fattening rayguns and ranged weapons
///The base fatoray
/obj/item/gun/energy/fatoray
name = "Fatoray"
desc = "An energy gun that fattens up anyone it hits."
icon = 'GainStation13/icons/obj/fatoray.dmi'
lefthand_file = 'GainStation13/icons/obj/guns_lefthand.dmi'
righthand_file = 'GainStation13/icons/obj/guns_righthand.dmi'
icon_state = "fatoray"
item_state = "fatoray"
pin = /obj/item/firing_pin
fire_sound = 'sound/weapons/plasma_cutter.ogg'
ammo_type = list(/obj/item/ammo_casing/energy/fattening)
/obj/item/ammo_casing/energy/fattening
name = "fattening weapon lens"
select_name = "fatten"
projectile_type = /obj/item/projectile/beam/fattening
///The base projectile used by the fatoray
/obj/item/projectile/beam/fattening
name = "fat energy"
icon = 'GainStation13/icons/obj/fatoray.dmi'
icon_state = "ray"
ricochets_max = 50
ricochet_chance = 80
hitsound = 'sound/weapons/sear.ogg'
hitsound_wall = 'sound/weapons/effects/searwall.ogg'
damage = 0
eyeblur = 0
damage_type = BURN
flag = "energy"
light_range = 2
light_color = LIGHT_COLOR_ORANGE
///How much fat is added to the target mob?
var/fat_added = 100
////// Fatoray - cannon variant, strong but can be charged
/obj/item/gun/energy/fatoray/cannon
name = "Fatoray Cannon"
desc = "An energy gun that fattens up anyone it hits. This version functions as a glass cannon of some sorts. It cannot be recharged."
icon = 'GainStation13/icons/obj/fatoray.dmi'
icon_state = "fatoray_cannon"
recoil = 3
can_charge = 0
slowdown = 1
pin = /obj/item/firing_pin
// charge_sections = 3
weapon_weight = WEAPON_HEAVY
ammo_type = list(/obj/item/ammo_casing/energy/fattening/cannon)
/obj/item/ammo_casing/energy/fattening/cannon
name = "one-shot fattening weapon lens"
select_name = "fatten"
e_cost = 100
projectile_type = /obj/item/projectile/beam/fattening/cannon
/obj/item/projectile/beam/fattening/cannon
name = "fat energy"
icon = 'GainStation13/icons/obj/fatoray.dmi'
icon_state = "cannon_ray"
///How much fat is added to the target mob?
fat_added = 1000
////////////////////////////////////////////////////////////////////
////////FATORAYS THAT CAN BE MADE BY LATHES OR RESEARCHED///////////
////////////////////////////////////////////////////////////////////
///Weaker version of fatoray
/obj/item/gun/energy/fatoray/weak
name = "Basic Fatoray"
desc = "An energy gun that fattens up anyone it hits. This version is considerably weaker than its original counterpart, the technology behind it seemingly still not perfected."
icon = 'GainStation13/icons/obj/fatoray.dmi'
icon_state = "fatoray_weak"
pin = /obj/item/firing_pin
ammo_type = list(/obj/item/ammo_casing/energy/fattening/weak)
/obj/item/ammo_casing/energy/fattening/weak
name = "budget fattening weapon lens"
select_name = "fatten"
projectile_type = /obj/item/projectile/beam/fattening/weak
///The base projectile used by the fatoray
/obj/item/projectile/beam/fattening/weak
name = "fat energy"
icon = 'GainStation13/icons/obj/fatoray.dmi'
icon_state = "ray"
///How much fat is added to the target mob?
fat_added = 50
///////////////////////////////////////////////////
///Single shot glass cannon fatoray
/obj/item/gun/energy/fatoray/cannon_weak
name = "Basic Fatoray Cannon"
desc = "An energy gun that fattens up anyone it hits. This version functions as a glass cannon of some sorts. It cannot be recharged."
icon = 'GainStation13/icons/obj/fatoray.dmi'
icon_state = "fatoray_cannon_weak"
can_charge = 0
recoil = 3
slowdown = 1
pin = /obj/item/firing_pin
// charge_sections = 3
weapon_weight = WEAPON_HEAVY
ammo_type = list(/obj/item/ammo_casing/energy/fattening/cannon_weak)
/obj/item/ammo_casing/energy/fattening/cannon_weak
name = "one-shot fattening weapon lens"
select_name = "fatten"
e_cost = 300
projectile_type = /obj/item/projectile/beam/fattening/cannon_weak
/obj/item/projectile/beam/fattening/cannon_weak
name = "fat energy"
icon = 'GainStation13/icons/obj/fatoray.dmi'
icon_state = "cannon_ray"
///How much fat is added to the target mob?
fat_added = 500
///////////////////////////////////////
//////PROJECTILE MECHANICS/////////////
///////////////////////////////////////
/obj/item/projectile/beam/fattening/on_hit(atom/target, blocked)
. = ..()
var/mob/living/carbon/gainer = target
if(!iscarbon(gainer))
return FALSE
if(!gainer.adjust_fatness(fat_added, FATTENING_TYPE_WEAPON))
return FALSE
return TRUE
@@ -0,0 +1,25 @@
/obj/item/gun/energy/kinetic_accelerator/crossbow/feeder
name = "feeder's mini energy crossbow"
desc = "a modified version of the standard mini energy crossbow, designed to fatten up a target while incapacitating them."
icon_state = "crossbow_halloween"
item_state = "crossbow"
ammo_type = list(/obj/item/ammo_casing/energy/bolt/fattening)
/obj/item/ammo_casing/energy/bolt/fattening
projectile_type = /obj/item/projectile/energy/bolt/fattening
/obj/item/projectile/energy/bolt/fattening
damage = 0
/obj/item/projectile/energy/bolt/fattening/Initialize(mapload)
. = ..()
/obj/item/projectile/energy/bolt/fattening/on_hit(atom/target, blocked)
. = ..()
var/mob/living/carbon/target_mob = target
if(!istype(target_mob) || (blocked == 100))
return
target_mob.reagents.add_reagent(/datum/reagent/consumable/lipoifier, 2)