mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-25 00:22:39 +00:00
Goliaths, Legions, Watchers, and (as of recently) Bileworms all drop something vaguely useful when they die. Brimdemons and Lobstrosities do not. This PR aims to fix that, so that there's at least some vague benefit to hunting them. In this case it takes the form of organs you get when you butcher them, similar to the regenerative core from Legions. As they're similar to the regenerative core, I modified the regenerative core to extend from a new common "monster core" typepath which these two new organs also extend. Like the regenerative core, both of these items do something when used and something slightly different if you go to the effort of having someone implant them into your body. They also decay over time, and you can use stabilising serum to prevent this from happening. https://user-images.githubusercontent.com/7483112/195967746-55a7d04d-224e-412d-aedc-3a0ec754db3d.mp4 The Rush Gland from the Lobstrosity lets you do a little impression of their charging attack, making you run very fast for a handful of seconds and ignoring slowdown effects. Unlike a lobstrosity you aren't actually built to do this so if you run into a mob you will fall over, and if you are doing this on the space station running into any dense object will also make you fall over (it shouldn't make you _too_ much of a pain for security to catch). The idea here is that you use this to save time running back and forth from the mining base. The Brimdust Sac from the Brimdemon covers you in exploding dust. The next three times you take Brute damage some of the dust will explode, dealing damage equal to an unupgraded PKA shot to anything near you (but not you). If you do this in a space station not only is the damage proportionally lower (still matching the PKA), but it _does_ effect you and also it sets you on fire. You can remove the buff by showering it off. The idea here is that you use this for minor revenge damage on enemies whose attacks you don't manage to dodge. https://user-images.githubusercontent.com/7483112/195967811-0b362ba9-2da0-42ac-bd55-3809473cbc74.mp4 If you implant the Rush Gland then you can use it once every 3 minutes without consuming it, and the buff lasts very slightly longer. It will automatically trigger itself if your health gets low, which might be good (helps you escape a rough situation) or bad (didn't want to use it yet). https://user-images.githubusercontent.com/7483112/195967888-f63f7cbd-60cd-4309-8004-203afc5b2153.mp4 If you implant the Brimdust Sac then you can use it once every 3 minutes to shake off cloud of dust which gives the buff to everyone nearby, if you want to kit out your miner squad. The dust cloud also makes you cough if you stand in it, and it's opaque. If you catch fire with this organ inside you and aren't in mining atmosphere then it will explode inside of your abdomen, which should probably be avoided, resultingly it is very risky to use this on the space station.
297 lines
14 KiB
Plaintext
297 lines
14 KiB
Plaintext
/**********************Mining Equipment Vendor**************************/
|
|
|
|
/obj/machinery/mineral/equipment_vendor
|
|
name = "mining equipment vendor"
|
|
desc = "An equipment vendor for miners, points collected at an ore redemption machine can be spent here."
|
|
icon = 'icons/obj/machines/mining_machines.dmi'
|
|
icon_state = "mining"
|
|
density = TRUE
|
|
circuit = /obj/item/circuitboard/machine/mining_equipment_vendor
|
|
var/icon_deny = "mining-deny"
|
|
var/obj/item/card/id/inserted_id
|
|
var/list/prize_list = list( //if you add something to this, please, for the love of god, sort it by price/type. use tabs and not spaces.
|
|
new /datum/data/mining_equipment("1 Marker Beacon", /obj/item/stack/marker_beacon, 10),
|
|
new /datum/data/mining_equipment("10 Marker Beacons", /obj/item/stack/marker_beacon/ten, 100),
|
|
new /datum/data/mining_equipment("30 Marker Beacons", /obj/item/stack/marker_beacon/thirty, 300),
|
|
new /datum/data/mining_equipment("Skeleton Key", /obj/item/skeleton_key, 777),
|
|
new /datum/data/mining_equipment("Whiskey", /obj/item/reagent_containers/cup/glass/bottle/whiskey, 100),
|
|
new /datum/data/mining_equipment("Absinthe", /obj/item/reagent_containers/cup/glass/bottle/absinthe/premium, 100),
|
|
new /datum/data/mining_equipment("Bubblegum Gum Packet", /obj/item/storage/box/gum/bubblegum, 100),
|
|
new /datum/data/mining_equipment("Cigar", /obj/item/clothing/mask/cigarette/cigar/havana, 150),
|
|
new /datum/data/mining_equipment("Soap", /obj/item/soap/nanotrasen, 200),
|
|
new /datum/data/mining_equipment("Laser Pointer", /obj/item/laser_pointer, 300),
|
|
new /datum/data/mining_equipment("Alien Toy", /obj/item/clothing/mask/facehugger/toy, 300),
|
|
new /datum/data/mining_equipment("Stabilizing Serum", /obj/item/mining_stabilizer, 400),
|
|
new /datum/data/mining_equipment("Fulton Beacon", /obj/item/fulton_core, 400),
|
|
new /datum/data/mining_equipment("Shelter Capsule", /obj/item/survivalcapsule, 400),
|
|
new /datum/data/mining_equipment("GAR Meson Scanners", /obj/item/clothing/glasses/meson/gar, 500),
|
|
new /datum/data/mining_equipment("Explorer's Webbing", /obj/item/storage/belt/mining, 500),
|
|
new /datum/data/mining_equipment("Point Transfer Card", /obj/item/card/mining_point_card, 500),
|
|
new /datum/data/mining_equipment("Survival Medipen", /obj/item/reagent_containers/hypospray/medipen/survival, 500),
|
|
new /datum/data/mining_equipment("Brute Medkit", /obj/item/storage/medkit/brute, 600),
|
|
new /datum/data/mining_equipment("Tracking Implant Kit", /obj/item/storage/box/minertracker, 600),
|
|
new /datum/data/mining_equipment("Jaunter", /obj/item/wormhole_jaunter, 750),
|
|
new /datum/data/mining_equipment("Kinetic Crusher", /obj/item/kinetic_crusher, 750),
|
|
new /datum/data/mining_equipment("Kinetic Accelerator", /obj/item/gun/energy/recharge/kinetic_accelerator, 750),
|
|
new /datum/data/mining_equipment("Advanced Scanner", /obj/item/t_scanner/adv_mining_scanner, 800),
|
|
new /datum/data/mining_equipment("Resonator", /obj/item/resonator, 800),
|
|
new /datum/data/mining_equipment("Luxury Medipen", /obj/item/reagent_containers/hypospray/medipen/survival/luxury, 1000),
|
|
new /datum/data/mining_equipment("Fulton Pack", /obj/item/extraction_pack, 1000),
|
|
new /datum/data/mining_equipment("Lazarus Injector", /obj/item/lazarus_injector, 1000),
|
|
new /datum/data/mining_equipment("Silver Pickaxe", /obj/item/pickaxe/silver, 1000),
|
|
new /datum/data/mining_equipment("Mining Conscription Kit", /obj/item/storage/backpack/duffelbag/mining_conscript, 1500),
|
|
new /datum/data/mining_equipment("Space Cash", /obj/item/stack/spacecash/c1000, 2000),
|
|
new /datum/data/mining_equipment("Diamond Pickaxe", /obj/item/pickaxe/diamond, 2000),
|
|
new /datum/data/mining_equipment("Kheiral Cuffs", /obj/item/kheiral_cuffs, 2000),
|
|
new /datum/data/mining_equipment("Super Resonator", /obj/item/resonator/upgraded, 2500),
|
|
new /datum/data/mining_equipment("Jump Boots", /obj/item/clothing/shoes/bhop, 2500),
|
|
new /datum/data/mining_equipment("Ice Hiking Boots", /obj/item/clothing/shoes/winterboots/ice_boots, 2500),
|
|
new /datum/data/mining_equipment("Mining MODsuit", /obj/item/mod/control/pre_equipped/mining, 3000),
|
|
new /datum/data/mining_equipment("Luxury Shelter Capsule", /obj/item/survivalcapsule/luxury, 3000),
|
|
new /datum/data/mining_equipment("Luxury Bar Capsule", /obj/item/survivalcapsule/luxuryelite, 10000),
|
|
new /datum/data/mining_equipment("Nanotrasen Minebot", /mob/living/simple_animal/hostile/mining_drone, 800),
|
|
new /datum/data/mining_equipment("Minebot Melee Upgrade", /obj/item/mine_bot_upgrade, 400),
|
|
new /datum/data/mining_equipment("Minebot Armor Upgrade", /obj/item/mine_bot_upgrade/health, 400),
|
|
new /datum/data/mining_equipment("Minebot Cooldown Upgrade", /obj/item/borg/upgrade/modkit/cooldown/minebot, 600),
|
|
new /datum/data/mining_equipment("Minebot AI Upgrade", /obj/item/slimepotion/slime/sentience/mining, 1000),
|
|
new /datum/data/mining_equipment("KA Minebot Passthrough", /obj/item/borg/upgrade/modkit/minebot_passthrough, 100),
|
|
new /datum/data/mining_equipment("KA White Tracer Rounds", /obj/item/borg/upgrade/modkit/tracer, 100),
|
|
new /datum/data/mining_equipment("KA Adjustable Tracer Rounds", /obj/item/borg/upgrade/modkit/tracer/adjustable, 150),
|
|
new /datum/data/mining_equipment("KA Super Chassis", /obj/item/borg/upgrade/modkit/chassis_mod, 250),
|
|
new /datum/data/mining_equipment("KA Hyper Chassis", /obj/item/borg/upgrade/modkit/chassis_mod/orange, 300),
|
|
new /datum/data/mining_equipment("KA Range Increase", /obj/item/borg/upgrade/modkit/range, 1000),
|
|
new /datum/data/mining_equipment("KA Damage Increase", /obj/item/borg/upgrade/modkit/damage, 1000),
|
|
new /datum/data/mining_equipment("KA Cooldown Decrease", /obj/item/borg/upgrade/modkit/cooldown, 1000),
|
|
new /datum/data/mining_equipment("KA AoE Damage", /obj/item/borg/upgrade/modkit/aoe/mobs, 2000)
|
|
)
|
|
|
|
/datum/data/mining_equipment
|
|
var/equipment_name = "generic"
|
|
var/equipment_path = null
|
|
var/cost = 0
|
|
|
|
/datum/data/mining_equipment/New(name, path, cost)
|
|
src.equipment_name = name
|
|
src.equipment_path = path
|
|
src.cost = cost
|
|
|
|
/obj/machinery/mineral/equipment_vendor/Initialize(mapload)
|
|
. = ..()
|
|
build_inventory()
|
|
|
|
/obj/machinery/mineral/equipment_vendor/proc/build_inventory()
|
|
for(var/p in prize_list)
|
|
var/datum/data/mining_equipment/M = p
|
|
GLOB.vending_products[M.equipment_path] = 1
|
|
|
|
/obj/machinery/mineral/equipment_vendor/update_icon_state()
|
|
icon_state = "[initial(icon_state)][powered() ? null : "-off"]"
|
|
return ..()
|
|
|
|
/obj/machinery/mineral/equipment_vendor/ui_assets(mob/user)
|
|
return list(
|
|
get_asset_datum(/datum/asset/spritesheet/vending),
|
|
)
|
|
|
|
/obj/machinery/mineral/equipment_vendor/ui_interact(mob/user, datum/tgui/ui)
|
|
ui = SStgui.try_update_ui(user, src, ui)
|
|
if(!ui)
|
|
ui = new(user, src, "MiningVendor", name)
|
|
ui.open()
|
|
|
|
/obj/machinery/mineral/equipment_vendor/ui_static_data(mob/user)
|
|
. = list()
|
|
.["product_records"] = list()
|
|
for(var/datum/data/mining_equipment/prize in prize_list)
|
|
var/list/product_data = list(
|
|
path = replacetext(replacetext("[prize.equipment_path]", "/obj/item/", ""), "/", "-"),
|
|
name = prize.equipment_name,
|
|
price = prize.cost,
|
|
ref = REF(prize)
|
|
)
|
|
.["product_records"] += list(product_data)
|
|
|
|
/obj/machinery/mineral/equipment_vendor/ui_data(mob/user)
|
|
. = list()
|
|
var/obj/item/card/id/C
|
|
if(isliving(user))
|
|
var/mob/living/L = user
|
|
C = L.get_idcard(TRUE)
|
|
if(C)
|
|
.["user"] = list()
|
|
.["user"]["points"] = C.mining_points
|
|
if(C.registered_account)
|
|
.["user"]["name"] = C.registered_account.account_holder
|
|
if(C.registered_account.account_job)
|
|
.["user"]["job"] = C.registered_account.account_job.title
|
|
else
|
|
.["user"]["job"] = "No Job"
|
|
|
|
/obj/machinery/mineral/equipment_vendor/ui_act(action, params)
|
|
. = ..()
|
|
if(.)
|
|
return
|
|
|
|
switch(action)
|
|
if("purchase")
|
|
var/obj/item/card/id/I
|
|
if(isliving(usr))
|
|
var/mob/living/L = usr
|
|
I = L.get_idcard(TRUE)
|
|
if(!istype(I))
|
|
to_chat(usr, span_alert("Error: An ID is required!"))
|
|
flick(icon_deny, src)
|
|
return
|
|
var/datum/data/mining_equipment/prize = locate(params["ref"]) in prize_list
|
|
if(!prize || !(prize in prize_list))
|
|
to_chat(usr, span_alert("Error: Invalid choice!"))
|
|
flick(icon_deny, src)
|
|
return
|
|
if(prize.cost > I.mining_points)
|
|
to_chat(usr, span_alert("Error: Insufficient points for [prize.equipment_name] on [I]!"))
|
|
flick(icon_deny, src)
|
|
return
|
|
I.mining_points -= prize.cost
|
|
to_chat(usr, span_notice("[src] clanks to life briefly before vending [prize.equipment_name]!"))
|
|
new prize.equipment_path(loc)
|
|
SSblackbox.record_feedback("nested tally", "mining_equipment_bought", 1, list("[type]", "[prize.equipment_path]"))
|
|
. = TRUE
|
|
|
|
/obj/machinery/mineral/equipment_vendor/attackby(obj/item/I, mob/user, params)
|
|
if(istype(I, /obj/item/mining_voucher))
|
|
redeem_voucher(I, user)
|
|
return
|
|
if(default_deconstruction_screwdriver(user, "mining-open", "mining", I))
|
|
return
|
|
if(default_deconstruction_crowbar(I))
|
|
return
|
|
return ..()
|
|
|
|
/**
|
|
* Allows user to redeem a mining voucher for one set of a mining equipment
|
|
*
|
|
* * Arguments:
|
|
* * voucher The mining voucher that is being used to redeem the mining equipment
|
|
* * redeemer The mob that is redeeming the mining equipment
|
|
*/
|
|
/obj/machinery/mineral/equipment_vendor/proc/redeem_voucher(obj/item/mining_voucher/voucher, mob/redeemer)
|
|
var/static/list/set_types
|
|
if(!set_types)
|
|
set_types = list()
|
|
for(var/datum/voucher_set/static_set as anything in subtypesof(/datum/voucher_set))
|
|
set_types[initial(static_set.name)] = new static_set
|
|
|
|
var/list/items = list()
|
|
for(var/set_name in set_types)
|
|
var/datum/voucher_set/current_set = set_types[set_name]
|
|
var/datum/radial_menu_choice/option = new
|
|
option.image = image(icon = current_set.icon, icon_state = current_set.icon_state)
|
|
option.info = span_boldnotice(current_set.description)
|
|
items[set_name] = option
|
|
|
|
var/selection = show_radial_menu(redeemer, src, items, custom_check = CALLBACK(src, .proc/check_menu, voucher, redeemer), radius = 38, require_near = TRUE, tooltips = TRUE)
|
|
if(!selection)
|
|
return
|
|
|
|
var/datum/voucher_set/chosen_set = set_types[selection]
|
|
for(var/item in chosen_set.set_items)
|
|
new item(drop_location())
|
|
|
|
SSblackbox.record_feedback("tally", "mining_voucher_redeemed", 1, selection)
|
|
qdel(voucher)
|
|
|
|
/**
|
|
* Checks if we are allowed to interact with a radial menu
|
|
*
|
|
* * Arguments:
|
|
* * voucher The mining voucher that is being used to redeem a mining equipment
|
|
* * redeemer The living mob interacting with the menu
|
|
*/
|
|
/obj/machinery/mineral/equipment_vendor/proc/check_menu(obj/item/mining_voucher/voucher, mob/living/redeemer)
|
|
if(!istype(redeemer))
|
|
return FALSE
|
|
if(redeemer.incapacitated())
|
|
return FALSE
|
|
if(QDELETED(voucher))
|
|
return FALSE
|
|
if(!redeemer.is_holding(voucher))
|
|
return FALSE
|
|
return TRUE
|
|
|
|
/obj/machinery/mineral/equipment_vendor/ex_act(severity, target)
|
|
do_sparks(5, TRUE, src)
|
|
if(severity > EXPLODE_LIGHT && prob(17 * severity))
|
|
qdel(src)
|
|
|
|
/****************Golem Point Vendor**************************/
|
|
|
|
/obj/machinery/mineral/equipment_vendor/golem
|
|
name = "golem ship equipment vendor"
|
|
circuit = /obj/item/circuitboard/machine/mining_equipment_vendor/golem
|
|
|
|
/obj/machinery/mineral/equipment_vendor/golem/Initialize(mapload)
|
|
desc += "\nIt seems a few selections have been added."
|
|
prize_list += list(
|
|
new /datum/data/mining_equipment("Extra Id", /obj/item/card/id/advanced/mining, 250),
|
|
new /datum/data/mining_equipment("Science Goggles", /obj/item/clothing/glasses/science, 250),
|
|
new /datum/data/mining_equipment("Monkey Cube", /obj/item/food/monkeycube, 300),
|
|
new /datum/data/mining_equipment("Toolbelt", /obj/item/storage/belt/utility, 350),
|
|
new /datum/data/mining_equipment("Royal Cape of the Liberator", /obj/item/bedsheet/rd/royal_cape, 500),
|
|
new /datum/data/mining_equipment("Grey Slime Extract", /obj/item/slime_extract/grey, 1000),
|
|
new /datum/data/mining_equipment("Modification Kit", /obj/item/borg/upgrade/modkit/trigger_guard, 1700),
|
|
new /datum/data/mining_equipment("The Liberator's Legacy", /obj/item/storage/box/rndboards, 2000)
|
|
)
|
|
return ..()
|
|
|
|
/**********************Mining Equipment Vendor Items**************************/
|
|
|
|
/**********************Mining Equipment Voucher**********************/
|
|
|
|
/obj/item/mining_voucher
|
|
name = "mining voucher"
|
|
desc = "A token to redeem a piece of equipment. Use it on a mining equipment vendor."
|
|
icon = 'icons/obj/mining.dmi'
|
|
icon_state = "mining_voucher"
|
|
w_class = WEIGHT_CLASS_TINY
|
|
|
|
/**********************Mining Point Card**********************/
|
|
|
|
/obj/item/card/mining_point_card
|
|
name = "mining points card"
|
|
desc = "A small card preloaded with mining points. Swipe your ID card over it to transfer the points, then discard."
|
|
icon_state = "data_1"
|
|
var/points = 500
|
|
|
|
/obj/item/card/mining_point_card/attackby(obj/item/I, mob/user, params)
|
|
if(isidcard(I))
|
|
if(points)
|
|
var/obj/item/card/id/C = I
|
|
C.mining_points += points
|
|
to_chat(user, span_info("You transfer [points] points to [C]."))
|
|
points = 0
|
|
else
|
|
to_chat(user, span_alert("There's no points left on [src]."))
|
|
..()
|
|
|
|
/obj/item/card/mining_point_card/examine(mob/user)
|
|
. = ..()
|
|
. += span_alert("There's [points] point\s on the card.")
|
|
|
|
/obj/item/storage/backpack/duffelbag/mining_conscript
|
|
name = "mining conscription kit"
|
|
desc = "A kit containing everything a crewmember needs to support a shaft miner in the field."
|
|
icon_state = "duffel-explorer"
|
|
inhand_icon_state = "duffel-explorer"
|
|
|
|
/obj/item/storage/backpack/duffelbag/mining_conscript/PopulateContents()
|
|
new /obj/item/clothing/glasses/meson(src)
|
|
new /obj/item/t_scanner/adv_mining_scanner/lesser(src)
|
|
new /obj/item/storage/bag/ore(src)
|
|
new /obj/item/clothing/suit/hooded/explorer(src)
|
|
new /obj/item/encryptionkey/headset_mining(src)
|
|
new /obj/item/clothing/mask/gas/explorer(src)
|
|
new /obj/item/card/id/advanced/mining(src)
|
|
new /obj/item/gun/energy/recharge/kinetic_accelerator(src)
|
|
new /obj/item/knife/combat/survival(src)
|
|
new /obj/item/flashlight/seclite(src)
|