mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-26 00:51:23 +00:00
* Makes condiments their own subtype, fixes geese, prepares for merging * Fixes geese checking drink type instead of edible foodtype to eat gross food. * Renames foodtype var on drinks to drink_types to prevent above from happening again because it KEEPS HAPPENING. DRINKS AREN'T FOOD! * Makes Condiments their own subtype of reagent_containers because they don't make any use of being a subtype of food, at all. * Starts moving things from food to /food/drink subtype in preparation for merging /food/drink with /drink * fully removes Food subtype * /reagent_containers/drinks are now /reagent_containers/cup - This is so it's no longer confused with eachother. * /food/drinks is now /reagent_containers/cup/drinks, so we can keep their special abilities. * Fixes a LOT of errors with food, which are STILL checking the reagent_containers, despite ACTUAL food being refactored away from it a long time ago. This doesn't compile yet, but I do want to make sure my progress is well tracked. * remove copypaste code, changes soda cans * Removes most copy paste code between the two drinks, moving most stuff to parent whenever needed. * Made soda cans their own subtype since they didn't share anything with glass bottles anyways. * Fixes more problems with food/drinks, especially with geese. Geese really were just broken this whole time and no one said a word... * Removes a snowflake signal, now that both drink types share a common one. * Adds everything to the .dme Currently my goal is to get this all compiling, then remove isGlass var by making glass be all glass ones only. * Moves all icons into a single drinks dmi I'm not that great at icon stuff, hopefully I didn't forget/break anything. * Turns juices into their own subtype This allows us to let them check for type in molotov, to both get rid of a use of isGlass, and so non-glass non-cartons don't show up as 'carton'. * fixes compile issues, adds updatepaths * a better updatepaths * updates the damn maps now * properly names the updatepath * how did that get there * i suck at handling merge conflicts * how am i this bad * code improvement and soda fix * more fixes * Don't be a timer Ports from old food bottles to trans the reagents, rather than add a timer to. * Merge conflicts and fixes bottle smashing * Bottle smashing is now consistently functional regardless of how much liquid they have in them, when before it would spill first, then smash on the second hit. * runs updatepaths again
192 lines
7.1 KiB
Plaintext
192 lines
7.1 KiB
Plaintext
/*
|
|
CONTAINS:
|
|
RSF
|
|
|
|
*/
|
|
///Extracts the related object from an associated list of objects and values, or lists and objects.
|
|
#define OBJECT_OR_LIST_ELEMENT(from, input) (islist(input) ? from[input] : input)
|
|
/obj/item/rsf
|
|
name = "\improper Rapid-Service-Fabricator"
|
|
desc = "A device used to rapidly deploy service items."
|
|
icon = 'icons/obj/tools.dmi'
|
|
icon_state = "rsf"
|
|
inhand_icon_state = "rsf"
|
|
base_icon_state = "rsf"
|
|
///The icon state to revert to when the tool is empty
|
|
var/spent_icon_state = "rsf_empty"
|
|
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
|
|
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
|
|
opacity = FALSE
|
|
density = FALSE
|
|
anchored = FALSE
|
|
item_flags = NOBLUDGEON
|
|
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0)
|
|
///The current matter count
|
|
var/matter = 0
|
|
///The max amount of matter in the device
|
|
var/max_matter = 30
|
|
///The type of the object we are going to dispense
|
|
var/to_dispense
|
|
///The cost of the object we are going to dispense
|
|
var/dispense_cost = 0
|
|
w_class = WEIGHT_CLASS_NORMAL
|
|
///An associated list of atoms and charge costs. This can contain a separate list, as long as it's associated item is an object
|
|
var/list/cost_by_item = list(/obj/item/reagent_containers/cup/glass/drinkingglass = 20,
|
|
/obj/item/paper = 10,
|
|
/obj/item/storage/dice = 200,
|
|
/obj/item/pen = 50,
|
|
/obj/item/clothing/mask/cigarette = 10,
|
|
)
|
|
///An associated list of fuel and it's value
|
|
var/list/matter_by_item = list(/obj/item/rcd_ammo = 10,)
|
|
///A list of surfaces that we are allowed to place things on.
|
|
var/list/allowed_surfaces = list(/turf/open/floor, /obj/structure/table)
|
|
///The unit of mesure of the matter, for use in text
|
|
var/discriptor = "fabrication-units"
|
|
///The verb that describes what we're doing, for use in text
|
|
var/action_type = "Dispensing"
|
|
///Holds a copy of world.time from the last time the synth was used.
|
|
var/cooldown = 0
|
|
///How long should the minimum period between this RSF's item dispensings be?
|
|
var/cooldowndelay = 0 SECONDS
|
|
|
|
/obj/item/rsf/Initialize(mapload)
|
|
. = ..()
|
|
to_dispense = cost_by_item[1]
|
|
dispense_cost = cost_by_item[to_dispense]
|
|
|
|
/obj/item/rsf/examine(mob/user)
|
|
. = ..()
|
|
. += span_notice("It currently holds [matter]/[max_matter] [discriptor].")
|
|
|
|
/obj/item/rsf/cyborg
|
|
matter = 30
|
|
|
|
/obj/item/rsf/attackby(obj/item/W, mob/user, params)
|
|
if(is_type_in_list(W,matter_by_item))//If the thing we got hit by is in our matter list
|
|
var/tempMatter = matter_by_item[W.type] + matter
|
|
if(tempMatter > max_matter)
|
|
to_chat(user, span_warning("\The [src] can't hold any more [discriptor]!"))
|
|
return
|
|
if(isstack(W))
|
|
var/obj/item/stack/stack = W
|
|
stack.use(1)
|
|
else
|
|
qdel(W)
|
|
matter = tempMatter //We add its value
|
|
playsound(src.loc, 'sound/machines/click.ogg', 10, TRUE)
|
|
to_chat(user, span_notice("\The [src] now holds [matter]/[max_matter] [discriptor]."))
|
|
icon_state = base_icon_state//and set the icon state to the base state
|
|
else
|
|
return ..()
|
|
|
|
/obj/item/rsf/attack_self(mob/user)
|
|
playsound(src.loc, 'sound/effects/pop.ogg', 50, FALSE)
|
|
var/target = cost_by_item
|
|
var/cost = 0
|
|
//Warning, prepare for bodgecode
|
|
while(islist(target))//While target is a list we continue the loop
|
|
var/picked = show_radial_menu(user, src, formRadial(target), custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE)
|
|
if(!check_menu(user) || picked == null)
|
|
return
|
|
for(var/emem in target)//Back through target agian
|
|
var/atom/test = OBJECT_OR_LIST_ELEMENT(target, emem)
|
|
if(picked == initial(test.name))//We try and find the entry that matches the radial selection
|
|
cost = target[emem]//We cash the cost
|
|
target = emem
|
|
break
|
|
//If we found a list we start it all again, this time looking through its contents.
|
|
//This allows for sublists
|
|
to_dispense = target
|
|
dispense_cost = cost
|
|
// Change mode
|
|
|
|
///Forms a radial menu based off an object in a list, or a list's associated object
|
|
/obj/item/rsf/proc/formRadial(from)
|
|
var/list/radial_list = list()
|
|
for(var/meme in from)//We iterate through all of targets entrys
|
|
var/atom/temp = OBJECT_OR_LIST_ELEMENT(from, meme)
|
|
//We then add their data into the radial menu
|
|
radial_list[initial(temp.name)] = image(icon = initial(temp.icon), icon_state = initial(temp.icon_state))
|
|
return radial_list
|
|
|
|
/obj/item/rsf/proc/check_menu(mob/user)
|
|
if(user.incapacitated() || !user.Adjacent(src))
|
|
return FALSE
|
|
return TRUE
|
|
|
|
/obj/item/rsf/afterattack(atom/A, mob/user, proximity)
|
|
if(cooldown > world.time)
|
|
return
|
|
. = ..()
|
|
if(!proximity || !is_allowed(A))
|
|
return
|
|
if(use_matter(dispense_cost, user))//If we can charge that amount of charge, we do so and return true
|
|
playsound(loc, 'sound/machines/click.ogg', 10, TRUE)
|
|
var/atom/meme = new to_dispense(get_turf(A))
|
|
to_chat(user, span_notice("[action_type] [meme.name]..."))
|
|
cooldown = world.time + cooldowndelay
|
|
|
|
///A helper proc. checks to see if we can afford the amount of charge that is passed, and if we can docs the charge from our base, and returns TRUE. If we can't we return FALSE
|
|
/obj/item/rsf/proc/use_matter(charge, mob/user)
|
|
if(iscyborg(user))
|
|
var/mob/living/silicon/robot/R = user
|
|
var/end_charge = R.cell.charge - charge
|
|
if(end_charge < 0)
|
|
to_chat(user, span_warning("You do not have enough power to use [src]."))
|
|
icon_state = spent_icon_state
|
|
return FALSE
|
|
R.cell.charge = end_charge
|
|
return TRUE
|
|
else
|
|
if(matter - 1 < 0)
|
|
to_chat(user, span_warning("\The [src] doesn't have enough [discriptor] left."))
|
|
icon_state = spent_icon_state
|
|
return FALSE
|
|
matter--
|
|
to_chat(user, span_notice("\The [src] now holds [matter]/[max_matter] [discriptor]."))
|
|
return TRUE
|
|
|
|
///Helper proc that iterates through all the things we are allowed to spawn on, and sees if the passed atom is one of them
|
|
/obj/item/rsf/proc/is_allowed(atom/to_check)
|
|
for(var/sort in allowed_surfaces)
|
|
if(istype(to_check, sort))
|
|
return TRUE
|
|
return FALSE
|
|
|
|
/obj/item/rsf/cookiesynth
|
|
name = "Cookie Synthesizer"
|
|
desc = "A self-recharging device used to rapidly deploy cookies."
|
|
icon_state = "rcd"
|
|
base_icon_state = "rcd"
|
|
spent_icon_state = "rcd"
|
|
max_matter = 10
|
|
cost_by_item = list(/obj/item/food/cookie = 100)
|
|
dispense_cost = 100
|
|
discriptor = "cookie-units"
|
|
action_type = "Fabricates"
|
|
cooldowndelay = 10 SECONDS
|
|
///Tracks whether or not the cookiesynth is about to print a poisoned cookie
|
|
var/toxin = FALSE //This might be better suited to some initialize fuckery, but I don't have a good "poisoned" sprite
|
|
|
|
/obj/item/rsf/cookiesynth/emag_act(mob/user)
|
|
obj_flags ^= EMAGGED
|
|
if(obj_flags & EMAGGED)
|
|
to_chat(user, span_warning("You short out [src]'s reagent safety checker!"))
|
|
else
|
|
to_chat(user, span_warning("You reset [src]'s reagent safety checker!"))
|
|
|
|
/obj/item/rsf/cookiesynth/attack_self(mob/user)
|
|
var/mob/living/silicon/robot/P = null
|
|
if(iscyborg(user))
|
|
P = user
|
|
if(((obj_flags & EMAGGED) || (P?.emagged)) && !toxin)
|
|
toxin = TRUE
|
|
to_dispense = /obj/item/food/cookie/sleepy
|
|
to_chat(user, span_alert("Cookie Synthesizer hacked."))
|
|
else
|
|
toxin = FALSE
|
|
to_dispense = /obj/item/food/cookie
|
|
to_chat(user, span_notice("Cookie Synthesizer reset."))
|
|
|