adds public bounty consoles without inflation, also removes the mint

This commit is contained in:
shellspeed1
2022-09-17 19:27:40 -07:00
parent 8ad8c53b91
commit 3dace329be
41 changed files with 464 additions and 259 deletions

View File

@@ -54482,6 +54482,10 @@
},
/turf/open/floor/carpet/arcade,
/area/commons/arcade)
"fCV" = (
/obj/machinery/piratepad/civilian,
/turf/open/floor/plasteel,
/area/cargo/office)
"fDn" = (
/obj/structure/table,
/obj/item/trash/chips{
@@ -65860,6 +65864,12 @@
/obj/item/assembly/signaler,
/turf/open/floor/plating,
/area/maintenance/bar)
"wfZ" = (
/obj/machinery/computer/piratepad_control/civilian{
dir = 1
},
/turf/open/floor/plasteel,
/area/cargo/office)
"wgo" = (
/obj/effect/turf_decal/stripes/line{
dir = 10
@@ -90509,7 +90519,7 @@ boR
bqs
bbR
bkM
bbR
fCV
bwd
bxB
bvL
@@ -90766,7 +90776,7 @@ boT
bbR
bbR
buI
bbR
wfZ
bwd
bxD
byL

View File

@@ -52,3 +52,18 @@
#define PRICE_ABOVE_EXPENSIVE 500 // RCD, Crew pinpointer/monitor, galoshes
#define PRICE_REALLY_EXPENSIVE 700 // More premium stuff.
#define PRICE_ALMOST_ONE_GRAND 900 // $$$ Insulated gloves, backpack water-tank spray $$$
//Defines that set what kind of civilian bounties should be applied mid-round.
#define CIV_JOB_BASIC 1
#define CIV_JOB_ROBO 2
#define CIV_JOB_CHEF 3
#define CIV_JOB_SEC 4
#define CIV_JOB_DRINK 5
#define CIV_JOB_CHEM 6
#define CIV_JOB_VIRO 7
#define CIV_JOB_SCI 8
#define CIV_JOB_ENG 9
#define CIV_JOB_MINE 10
#define CIV_JOB_MED 11
#define CIV_JOB_GROW 12
#define CIV_JOB_RANDOM 13

View File

@@ -0,0 +1,225 @@
///Pad for the Civilian Bounty Control.
/obj/machinery/piratepad/civilian
name = "civilian bounty pad"
desc = "A machine designed to send civilian bounty targets to centcom."
layer = TABLE_LAYER
///Computer for assigning new civilian bounties, and sending bounties for collection.
/obj/machinery/computer/piratepad_control/civilian
name = "civilian bounty control terminal"
desc = "A console for assigning civilian bounties to inserted ID cards, and for controlling the bounty pad for export."
status_report = "Ready for delivery."
icon_screen = "civ_bounty"
icon_keyboard = "id_key"
warmup_time = 3 SECONDS
var/obj/item/card/id/inserted_scan_id
/obj/machinery/computer/piratepad_control/civilian/Initialize()
. = ..()
pad = /obj/machinery/piratepad/civilian
/obj/machinery/computer/piratepad_control/civilian/attackby(obj/item/I, mob/living/user, params)
. = ..()
if(isidcard(I))
if(id_insert(user, I, inserted_scan_id))
inserted_scan_id = I
return TRUE
/obj/machinery/computer/piratepad_control/multitool_act(mob/living/user, obj/item/multitool/I)
if(istype(I) && istype(I.buffer,/obj/machinery/piratepad/civilian))
to_chat(user, "<span class='notice'>You link [src] with [I.buffer] in [I] buffer.</span>")
pad = I.buffer
return TRUE
/obj/machinery/computer/piratepad_control/civilian/LateInitialize()
. = ..()
if(cargo_hold_id)
for(var/obj/machinery/piratepad/civilian/C in GLOB.machines)
if(C.cargo_hold_id == cargo_hold_id)
pad = C
return
else
pad = locate() in range(4,src)
/obj/machinery/computer/piratepad_control/civilian/recalc()
if(sending)
return FALSE
if(!inserted_scan_id)
status_report = "Please insert your ID first."
playsound(loc, 'sound/machines/synth_no.ogg', 30 , TRUE)
return FALSE
if(!inserted_scan_id.registered_account.civilian_bounty)
status_report = "Please accept a new civilian bounty first."
playsound(loc, 'sound/machines/synth_no.ogg', 30 , TRUE)
return FALSE
status_report = "Civilian Bounty: "
for(var/atom/movable/AM in get_turf(pad))
if(AM == pad)
continue
if(inserted_scan_id.registered_account.civilian_bounty.applies_to(AM))
status_report += "Target Applicable."
playsound(loc, 'sound/machines/synth_yes.ogg', 30 , TRUE)
return
status_report += "Not Applicable."
playsound(loc, 'sound/machines/synth_no.ogg', 30 , TRUE)
/**
* This fully rewrites base behavior in order to only check for bounty objects, and nothing else.
*/
/obj/machinery/computer/piratepad_control/civilian/send()
playsound(loc, 'sound/machines/wewewew.ogg', 70, TRUE)
if(!sending)
return
if(!inserted_scan_id)
stop_sending()
return FALSE
if(!inserted_scan_id.registered_account.civilian_bounty)
stop_sending()
return FALSE
var/datum/bounty/curr_bounty = inserted_scan_id.registered_account.civilian_bounty
var/active_stack = 0
for(var/atom/movable/AM in get_turf(pad))
if(AM == pad)
continue
if(curr_bounty.applies_to(AM))
active_stack ++
curr_bounty.ship(AM)
qdel(AM)
if(active_stack >= 1)
status_report += "Bounty Target Found x[active_stack]. "
else
status_report = "No applicable targets found. Aborting."
stop_sending()
if(curr_bounty.can_claim())
//Pay for the bounty with the ID's department funds.
inserted_scan_id.registered_account.transfer_money(SSeconomy.get_dep_account(inserted_scan_id.registered_account.account_job.paycheck_department), curr_bounty.reward)
status_report += "Bounty Completed! [curr_bounty.reward] credits have been paid out. "
inserted_scan_id.registered_account.reset_bounty()
pad.visible_message("<span class='notice'>[pad] activates!</span>")
flick(pad.sending_state,pad)
pad.icon_state = pad.idle_state
playsound(loc, 'sound/machines/synth_yes.ogg', 30 , TRUE)
sending = FALSE
/obj/machinery/computer/piratepad_control/civilian/AltClick(mob/user)
. = ..()
id_eject(user, inserted_scan_id)
/obj/machinery/computer/piratepad_control/civilian/ui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
ui = new(user, src, "CivCargoHoldTerminal", name)
ui.open()
/obj/machinery/computer/piratepad_control/civilian/ui_data(mob/user)
var/list/data = list()
data["points"] = points
data["pad"] = pad ? TRUE : FALSE
data["sending"] = sending
data["status_report"] = status_report
data["id_inserted"] = inserted_scan_id
if(inserted_scan_id && inserted_scan_id.registered_account)
data["id_bounty_info"] = inserted_scan_id.registered_account.bounty_text()
data["id_bounty_num"] = inserted_scan_id.registered_account.bounty_num()
data["id_bounty_value"] = inserted_scan_id.registered_account.bounty_value()
return data
/obj/machinery/computer/piratepad_control/civilian/ui_act(action, params)
if(..())
return
if(!pad)
return
if(!usr.canUseTopic(src, BE_CLOSE))
return
switch(action)
if("recalc")
recalc()
if("send")
start_sending()
if("stop")
stop_sending()
if("bounty")
if(!inserted_scan_id || !inserted_scan_id.registered_account)
return
var/datum/bank_account/pot_acc = inserted_scan_id.registered_account
if(pot_acc.civilian_bounty && ((world.time) < pot_acc.bounty_timer + 5 MINUTES))
var/curr_time = round(((pot_acc.bounty_timer + (5 MINUTES))-world.time)/ (1 MINUTES), 0.01)
to_chat(usr, "<span class='warning'>You already have an incomplete civilian bounty, try again in [curr_time] minutes to replace it!</span>")
return FALSE
var/datum/bounty/crumbs = random_bounty(pot_acc.account_job.bounty_types) //It's a good scene from War Dogs (2016).
/*if(SSeconomy.inflation_value() > 1) //lets try not to add inflation for right now
if(istype(crumbs, /datum/bounty/item))
var/datum/bounty/item/items = crumbs
items.required_count = max(round((items.required_count)/(SSeconomy.inflation_value()*2)), 1)
if(istype(crumbs, /datum/bounty/reagent))
var/datum/bounty/reagent/chems = crumbs
chems.required_volume = max(round((chems.required_volume)/SSeconomy.inflation_value()*2), 1)
crumbs.reward = round(crumbs.reward/(SSeconomy.inflation_value()*2))*/
pot_acc.bounty_timer = world.time
pot_acc.civilian_bounty = crumbs
if("eject")
id_eject(usr, inserted_scan_id)
. = TRUE
///Self explanitory, holds the ID card inthe console for bounty payout and manipulation.
/obj/machinery/computer/piratepad_control/civilian/proc/id_insert(mob/user, obj/item/inserting_item, obj/item/target)
var/obj/item/card/id/card_to_insert = inserting_item
var/holder_item = FALSE
if(!isidcard(card_to_insert))
card_to_insert = inserting_item.RemoveID()
holder_item = TRUE
if(!card_to_insert || !user.transferItemToLoc(card_to_insert, src))
return FALSE
if(target)
if(holder_item && inserting_item.InsertID(target))
playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE)
else
id_eject(user, target)
user.visible_message("<span class='notice'>[user] inserts \the [card_to_insert] into \the [src].</span>",
"<span class='notice'>You insert \the [card_to_insert] into \the [src].</span>")
playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE)
updateUsrDialog()
return TRUE
///Removes A stored ID card.
/obj/machinery/computer/piratepad_control/civilian/proc/id_eject(mob/user, obj/target)
if(!target)
to_chat(user, "<span class='warning'>That slot is empty!</span>")
return FALSE
else
target.forceMove(drop_location())
if(!issilicon(user) && Adjacent(user))
user.put_in_hands(target)
user.visible_message("<span class='notice'>[user] gets \the [target] from \the [src].</span>", \
"<span class='notice'>You get \the [target] from \the [src].</span>")
playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE)
inserted_scan_id = null
updateUsrDialog()
return TRUE
///Beacon to launch a new bounty setup when activated.
/obj/item/civ_bounty_beacon
name = "civilian bounty beacon"
desc = "N.T. approved civilian bounty beacon, toss it down and you will have a bounty pad and computer delivered to you."
icon = 'icons/obj/objects.dmi'
icon_state = "floor_beacon"
var/uses = 2
/obj/item/civ_bounty_beacon/attack_self()
loc.visible_message("<span class='warning'>\The [src] begins to beep loudly!</span>")
addtimer(CALLBACK(src, .proc/launch_payload), 4 SECONDS)
/obj/item/civ_bounty_beacon/proc/launch_payload()
playsound(src, "sparks", 80, TRUE)
switch(uses)
if(2)
new /obj/machinery/piratepad/civilian(drop_location())
if(1)
new /obj/machinery/computer/piratepad_control/civilian(drop_location())
qdel(src)
uses = uses - 1

View File

@@ -372,6 +372,11 @@
. += "The [D.account_holder] reports a balance of [D.account_balance] cr."
. += "<span class='info'>Alt-Click the ID to pull money from the linked account in the form of holochips.</span>"
. += "<span class='info'>You can insert credits into the linked account by pressing holochips, cash, or coins against the ID.</span>"
if(registered_account.civilian_bounty)
. += "<span class='info'><b>There is an active civilian bounty.</b>"
. += "<span class='info'><i>[registered_account.bounty_text()]</i></span>"
. += "<span class='info'>Quantity: [registered_account.bounty_num()]</span>"
. += "<span class='info'>Reward: [registered_account.bounty_value()]</span>"
if(registered_account.account_holder == user.real_name)
. += "<span class='boldnotice'>If you lose this ID card, you can reclaim your account by Alt-Clicking a blank ID card while holding it and entering your account ID number.</span>"
else

View File

@@ -348,6 +348,10 @@
name = "Snow Taxi (Computer Board)"
build_path = /obj/machinery/computer/shuttle/snow_taxi
/obj/item/circuitboard/computer/bountypad
name = "Bounty Pad (Computer Board)"
build_path = /obj/machinery/computer/piratepad_control/civilian
// /obj/item/circuitboard/computer/bountypad
// name = "Bounty Pad (Computer Board)"
// build_path = /obj/machinery/computer/piratepad_control/civilian

View File

@@ -685,15 +685,15 @@
/obj/item/stack/sheet/glass = 1,
/obj/item/vending_refill/donksoft = 1)
// /obj/item/circuitboard/machine/bountypad
// name = "Civilian Bounty Pad (Machine Board)"
// icon_state = "generic"
// build_path = /obj/machinery/piratepad/civilian
// req_components = list(
// /obj/item/stock_parts/card_reader = 1,
// /obj/item/stock_parts/scanning_module = 1,
// /obj/item/stock_parts/micro_laser = 1
// )
/obj/item/circuitboard/machine/bountypad
name = "Civilian Bounty Pad (Machine Board)"
icon_state = "generic"
build_path = /obj/machinery/piratepad/civilian
req_components = list(
/obj/item/stock_parts/scanning_module = 1,
/obj/item/stock_parts/micro_laser = 1
)
// /obj/item/circuitboard/machine/accounting
// name = "Account Registration Device (Machine Board)"

View File

@@ -101,27 +101,30 @@
required_count = 15
wanted_types = list(/obj/item/shard)
/*
/datum/bounty/item/assistant/comfy_chair
name = "Comfy Chairs"
name = "Comfortable Chairs"
description = "Commander Pat is unhappy with his chair. He claims it hurts his back. Ship some alternatives out to humor him."
reward = 900
required_count = 5
wanted_types = list(/obj/structure/chair/comfy)
*/
// /datum/bounty/item/assistant/geranium
// name = "Geraniums"
// description = "Commander Zot has the hots for Commander Zena. Send a shipment of geraniums - her favorite flower - and he'll happily reward you."
// reward = 1000
// required_count = 3
// wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/poppy/geranium)
/datum/bounty/item/assistant/geranium
name = "Geraniums"
description = "Commander Zot has the hots for Commander Zena. Send a shipment of geraniums - her favorite flower - and he'll happily reward you."
reward = 1000
required_count = 3
wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/poppy/geranium)
include_subtypes = FALSE
// /datum/bounty/item/assistant/poppy
// name = "Poppies"
// description = "Commander Zot really wants to sweep Security Officer Olivia off her feet. Send a shipment of Poppies - her favorite flower - and he'll happily reward you."
// reward = 1000
// required_count = 3
// wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/poppy)
// include_subtypes = FALSE
/datum/bounty/item/assistant/poppy
name = "Poppies"
description = "Commander Zot really wants to sweep Security Officer Olivia off her feet. Send a shipment of Poppies - her favorite flower - and he'll happily reward you."
reward = 1000
required_count = 3
wanted_types = list(/obj/item/reagent_containers/food/snacks/grown/poppy)
include_subtypes = FALSE
/datum/bounty/item/assistant/shadyjims
name = "Shady Jim's"
@@ -156,11 +159,6 @@
required_count = 3
wanted_types = list(/obj/item/reagent_containers/food/snacks/monkeycube)
*/
/datum/bounty/item/assistant/chainsaw
name = "Chainsaw"
description = "The chef at CentCom is having trouble butchering her animals. She requests one chainsaw, please."
reward = 2500
wanted_types = list(/obj/item/chainsaw)
/datum/bounty/item/assistant/ied
name = "IED"
@@ -169,30 +167,12 @@
required_count = 3
wanted_types = list(/obj/item/grenade/iedcasing)
/datum/bounty/item/assistant/bonfire
name = "Lit Bonfire"
description = "Space heaters are malfunctioning and the cargo crew of Central Command is starting to feel cold. Ship a lit bonfire to warm them up."
reward = 5000
wanted_types = list(/obj/structure/bonfire)
/datum/bounty/item/assistant/bonfire/applies_to(obj/O)
if(!..())
return FALSE
var/obj/structure/bonfire/B = O
return !!B.burning
/datum/bounty/item/assistant/corgimeat
name = "Raw Corgi Meat"
description = "The Syndicate recently stole all of CentCom's corgi meat. Ship out a replacement immediately."
reward = 3000
wanted_types = list(/obj/item/reagent_containers/food/snacks/meat/slab/corgi)
/datum/bounty/item/assistant/tail_whip
name = "Nine Tails whip"
description = "Commander Jackson is looking for a fine addition to her exotic weapons collection. She will reward you handsomely for either a Cat or Liz o' Nine Tails."
reward = 4000
wanted_types = list(/obj/item/melee/chainofcommand/tailwhip)
/datum/bounty/item/assistant/bolas
name = "Bolas"
description = "Centcom's chef has lost their mind. They're streaking naked though the halls, greased up with butter and cooking oil. Send some bola's so we can capture them."

View File

@@ -228,3 +228,14 @@
multiplier = 6
bonus_desc = "Under no circumstances mention this shipment to security."
foodtype = "\"meal\""
/datum/bounty/item/botany/bonfire
name = "Lit Bonfire"
description = "Space heaters are malfunctioning and the cargo crew of Central Command is starting to feel cold. Grow some logs and Ship a lit bonfire to warm them up."
wanted_types = list(/obj/structure/bonfire)
/datum/bounty/item/botany/bonfire/applies_to(obj/O)
if(!..())
return FALSE
var/obj/structure/bonfire/B = O
return !!B.burning

View File

@@ -137,3 +137,10 @@
reward = 2250
required_count = 3
wanted_types = list(/obj/item/reagent_containers/food/snacks/bbqribs)
/datum/bounty/item/chef/corgifarming //Butchering is a chef's job.
name = "Corgi Hides"
description = "Admiral Weinstein's space yacht needs new upholstery. A dozen Corgi furs should do just fine."
reward = 30000 //that's a lot of dead dogs
required_count = 12
wanted_types = list(/obj/item/stack/sheet/animalhide/corgi)

View File

@@ -89,3 +89,15 @@
description = "Station 24 is being overrun by hordes of angry Mothpeople. They are requesting the ultimate bug zapper."
reward = 50000 //requires 14k credits of purchases, not to mention cooperation with engineering/heads of staff to set up inside the cramped shuttle
wanted_types = list(/obj/singularity/energy_ball)
/datum/bounty/item/engineering/emitter
name = "Emitter"
description = "We think there may be a defect in your station's emitter designs, based on the sheer number of delaminations your sector seems to see. Ship us one of yours."
reward = 2500
wanted_types = list(/obj/machinery/power/emitter)
/datum/bounty/item/engineering/hydro_tray
name = "Hydroponics Tray"
description = "The lab technicians are trying to figure out how to lower the power drain of hydroponics trays, but we fried our last one. Mind building one for us?"
reward = 2000
wanted_types = list(/obj/machinery/hydroponics/constructable)

View File

@@ -125,3 +125,15 @@
reward = 2250
required_count = 5
wanted_types = list(/obj/item/defibrillator)
/datum/bounty/item/medical/chainsaw
name = "Chainsaw"
description = "A CMO at CentCom is having trouble operating on golems. She requests one chainsaw, please."
reward = 2500
wanted_types = list(/obj/item/chainsaw)
/datum/bounty/item/medical/tail_whip //Like the cat tail bounties, with more processing.
name = "Nine Tails whip"
description = "Commander Jackson is looking for a fine addition to her exotic weapons collection. She will reward you handsomely for either a Cat or Liz o' Nine Tails."
reward = 4000
wanted_types = list(/obj/item/melee/chainofcommand/tailwhip)

View File

@@ -52,3 +52,37 @@
reward = 2750
required_count = 3
wanted_types = list(/obj/item/firing_pin/test_range)
/datum/bounty/item/security/pepperspray
name = "Pepperspray"
description = "We've been having a bad run of riots on Space Station 76. We could use some new pepperspray cans."
reward = 3000
required_count = 4
wanted_types = list(/obj/item/reagent_containers/spray/pepper)
/datum/bounty/item/security/prison_clothes
name = "Prison Uniforms"
description = "Terragov has been unable to source any new prisoner uniforms, so if you have any spares, we'll take them off your hands."
reward = 2000
required_count = 4
wanted_types = list(/obj/item/clothing/under/rank/prisoner)
/datum/bounty/item/security/plates
name = "License Plates"
description = "As a result of a bad clown car crash, we could use an advance on some of your prisoner's license plates."
reward = 1000
required_count = 10
wanted_types = list(/obj/item/stack/license_plates/filled)
/datum/bounty/item/security/earmuffs
name = "Earmuffs"
description = "Central Command is getting tired of your station's messages. They've ordered that you ship some earmuffs to lessen the annoyance."
reward = 1000
wanted_types = list(/obj/item/clothing/ears/earmuffs)
/datum/bounty/item/security/handcuffs
name = "Handcuffs"
description = "A large influx of escaped convicts have arrived at Central Command. Now is the perfect time to ship out spare handcuffs (or restraints)."
reward = 1000
required_count = 5
wanted_types = list(/obj/item/restraints/handcuffs)

View File

@@ -76,8 +76,13 @@ GLOBAL_LIST_EMPTY(bounties_list)
return TRUE
// Returns a new bounty of random type, but does not add it to GLOB.bounties_list.
/proc/random_bounty()
switch(rand(1, 15))
/proc/random_bounty(var/guided = 0)
var/bounty_num
if(guided)
bounty_num = guided
else
bounty_num = rand(1,13)
switch(bounty_num)
if(1)
var/subtype = pick(subtypesof(/datum/bounty/item/assistant))
return new subtype
@@ -100,27 +105,27 @@ GLOBAL_LIST_EMPTY(bounties_list)
var/subtype = pick(subtypesof(/datum/bounty/virus))
return new subtype
if(8)
if(rand(2) == 1)
var/subtype = pick(subtypesof(/datum/bounty/item/science))
return new subtype
if(9)
var/subtype = pick(subtypesof(/datum/bounty/item/slime))
return new subtype
if(10)
if(9)
var/subtype = pick(subtypesof(/datum/bounty/item/engineering))
return new subtype
if(11)
if(10)
var/subtype = pick(subtypesof(/datum/bounty/item/mining))
return new subtype
if(12)
if(11)
var/subtype = pick(subtypesof(/datum/bounty/item/medical))
return new subtype
if(13)
if(12)
var/subtype = pick(subtypesof(/datum/bounty/item/botany))
return new subtype
if(14)
if(13)
var/subtype = pick(subtypesof(/datum/bounty/item/silly))
return new subtype
if(15)
if(14)
var/subtype = pick(subtypesof(/datum/bounty/item/gardencook))
return new subtype

View File

@@ -10,6 +10,8 @@
var/account_id
var/being_dumped = FALSE //pink levels are rising
var/withdrawDelay = 0
var/datum/bounty/civilian_bounty
var/bounty_timer = 0
/datum/bank_account/New(newname, job)
if(add_to_accounts)
@@ -100,6 +102,47 @@
if(M.can_hear())
to_chat(M, "[icon2html(icon_source, M)] <span class='notice'>[message]</span>")
/**
* Returns a string with the civilian bounty's description on it.
*/
/datum/bank_account/proc/bounty_text()
if(!civilian_bounty)
return FALSE
if(istype(civilian_bounty, /datum/bounty/item))
var/datum/bounty/item/item = civilian_bounty
return item.description
if(istype(civilian_bounty, /datum/bounty/reagent))
var/datum/bounty/reagent/chemical = civilian_bounty
return chemical.description
/**
* Returns the required item count, or required chemical units required to submit a bounty.
*/
/datum/bank_account/proc/bounty_num()
if(!civilian_bounty)
return FALSE
if(istype(civilian_bounty, /datum/bounty/item))
var/datum/bounty/item/item = civilian_bounty
return "[item.shipped_count]/[item.required_count]"
if(istype(civilian_bounty, /datum/bounty/reagent))
var/datum/bounty/reagent/chemical = civilian_bounty
return "[chemical.shipped_volume]/[chemical.required_volume] u"
/**
* Produces the value of the account's civilian bounty reward, if able.
*/
/datum/bank_account/proc/bounty_value()
if(!civilian_bounty)
return FALSE
return civilian_bounty.reward
/**
* Performs house-cleaning on variables when a civilian bounty is replaced, or, when a bounty is claimed.
*/
/datum/bank_account/proc/reset_bounty()
civilian_bounty = null
bounty_timer = 0
/datum/bank_account/department
account_holder = "Guild Credit Agency"
var/department_id = "REPLACE_ME"

View File

@@ -71,6 +71,8 @@
var/display_order = JOB_DISPLAY_ORDER_DEFAULT
var/bounty_types = CIV_JOB_BASIC
//If a job complies with dresscodes, loadout items will not be equipped instead of the job's outfit, instead placing the items into the player's backpack.
var/dresscodecompliant = TRUE
// How much threat this job is worth in dynamic. Is subtracted if the player's not an antag, added if they are.

View File

@@ -20,6 +20,7 @@
ACCESS_ENGINE_EQUIP, ACCESS_EMERGENCY_STORAGE, ACCESS_CONSTRUCTION, ACCESS_MINERAL_STOREROOM)
paycheck = PAYCHECK_MEDIUM
paycheck_department = ACCOUNT_ENG
bounty_types = CIV_JOB_ENG
starting_modifiers = list(/datum/skill_modifier/job/level/wiring, /datum/skill_modifier/job/affinity/wiring)

View File

@@ -17,6 +17,7 @@
minimal_access = list(ACCESS_BAR, ACCESS_MINERAL_STOREROOM)
paycheck = PAYCHECK_EASY
paycheck_department = ACCOUNT_SRV
bounty_types = CIV_JOB_DRINK
display_order = JOB_DISPLAY_ORDER_BARTENDER
threat = 0.5

View File

@@ -16,6 +16,7 @@
minimal_access = list(ACCESS_HYDROPONICS, ACCESS_MORGUE, ACCESS_MINERAL_STOREROOM)
paycheck = PAYCHECK_EASY
paycheck_department = ACCOUNT_SRV
bounty_types = CIV_JOB_GROW
display_order = JOB_DISPLAY_ORDER_BOTANIST
threat = 1.5 // lol powergame

View File

@@ -18,6 +18,7 @@
minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_CHEMISTRY, ACCESS_MINERAL_STOREROOM)
paycheck = PAYCHECK_MEDIUM
paycheck_department = ACCOUNT_MED
bounty_types = CIV_JOB_CHEM
display_order = JOB_DISPLAY_ORDER_CHEMIST
threat = 1.5

View File

@@ -30,6 +30,7 @@
ACCESS_CE, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM)
paycheck = PAYCHECK_COMMAND
paycheck_department = ACCOUNT_ENG
bounty_types = CIV_JOB_ENG
starting_modifiers = list(/datum/skill_modifier/job/level/wiring/expert, /datum/skill_modifier/job/affinity/wiring)

View File

@@ -28,6 +28,7 @@
ACCESS_KEYCARD_AUTH, ACCESS_SEC_DOORS, ACCESS_MAINT_TUNNELS)
paycheck = PAYCHECK_COMMAND
paycheck_department = ACCOUNT_MED
bounty_types = CIV_JOB_MED
display_order = JOB_DISPLAY_ORDER_CHIEF_MEDICAL_OFFICER
blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/insanity)

View File

@@ -17,6 +17,7 @@
minimal_access = list(ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_MINERAL_STOREROOM)
paycheck = PAYCHECK_EASY
paycheck_department = ACCOUNT_SRV
bounty_types = CIV_JOB_CHEF
display_order = JOB_DISPLAY_ORDER_COOK
threat = 0.2

View File

@@ -18,6 +18,7 @@
minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_RESEARCH, ACCESS_MINERAL_STOREROOM)
paycheck = PAYCHECK_MEDIUM
paycheck_department = ACCOUNT_MED
bounty_types = CIV_JOB_SCI
display_order = JOB_DISPLAY_ORDER_GENETICIST
threat = 1.5

View File

@@ -32,6 +32,8 @@
ACCESS_HEADS, ACCESS_HOS, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM)
paycheck = PAYCHECK_COMMAND
paycheck_department = ACCOUNT_SEC
bounty_types = CIV_JOB_SEC
display_order = JOB_DISPLAY_ORDER_HEAD_OF_SECURITY
blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/nonviolent, /datum/quirk/paraplegic, /datum/quirk/blindness, /datum/quirk/monophobia, /datum/quirk/insanity)

View File

@@ -16,6 +16,7 @@
minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CLONING, ACCESS_MINERAL_STOREROOM)
paycheck = PAYCHECK_MEDIUM
paycheck_department = ACCOUNT_MED
bounty_types = CIV_JOB_MED
display_order = JOB_DISPLAY_ORDER_MEDICAL_DOCTOR
threat = 0.5

View File

@@ -16,6 +16,7 @@
minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_CLONING, ACCESS_MINERAL_STOREROOM, ACCESS_MAINT_TUNNELS)
paycheck = PAYCHECK_MEDIUM
paycheck_department = ACCOUNT_MED
bounty_types = CIV_JOB_MED
display_order = JOB_DISPLAY_ORDER_PARAMEDIC

View File

@@ -32,6 +32,7 @@
ACCESS_TECH_STORAGE, ACCESS_MINISAT, ACCESS_MAINT_TUNNELS, ACCESS_NETWORK)
paycheck = PAYCHECK_COMMAND
paycheck_department = ACCOUNT_SCI
bounty_types = CIV_JOB_SCI
display_order = JOB_DISPLAY_ORDER_RESEARCH_DIRECTOR
starting_modifiers = list(/datum/skill_modifier/job/level/wiring)

View File

@@ -18,6 +18,7 @@
minimal_access = list(ACCESS_ROBOTICS, ACCESS_TECH_STORAGE, ACCESS_MORGUE, ACCESS_RESEARCH, ACCESS_MINERAL_STOREROOM)
paycheck = PAYCHECK_MEDIUM
paycheck_department = ACCOUNT_SCI
bounty_types = CIV_JOB_ROBO
starting_modifiers = list(/datum/skill_modifier/job/level/wiring, /datum/skill_modifier/job/affinity/wiring)

View File

@@ -18,6 +18,7 @@
minimal_access = list(ACCESS_TOX, ACCESS_TOX_STORAGE, ACCESS_RESEARCH, ACCESS_XENOBIOLOGY, ACCESS_MINERAL_STOREROOM)
paycheck = PAYCHECK_MEDIUM
paycheck_department = ACCOUNT_SCI
bounty_types = CIV_JOB_SCI
starting_modifiers = list(/datum/skill_modifier/job/level/wiring/basic)
display_order = JOB_DISPLAY_ORDER_SCIENTIST
threat = 1.2

View File

@@ -21,6 +21,7 @@
minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_ENTER_GENPOP, ACCESS_LEAVE_GENPOP, ACCESS_MINERAL_STOREROOM) // See /datum/job/officer/get_access()
paycheck = PAYCHECK_HARD
paycheck_department = ACCOUNT_SEC
bounty_types = CIV_JOB_SEC
mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM)

View File

@@ -19,6 +19,7 @@
minimal_access = list(ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MAILSORTING, ACCESS_MINERAL_STOREROOM)
paycheck = PAYCHECK_EASY ///Not necessarily easy itself, but it can be trivial to make lot of cash on this job.
paycheck_department = ACCOUNT_CAR
bounty_types = CIV_JOB_MINE
display_order = JOB_DISPLAY_ORDER_SHAFT_MINER

View File

@@ -20,6 +20,7 @@
ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CONSTRUCTION, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM)
paycheck = PAYCHECK_MEDIUM
paycheck_department = ACCOUNT_ENG
bounty_types = CIV_JOB_ENG
starting_modifiers = list(/datum/skill_modifier/job/level/wiring, /datum/skill_modifier/job/affinity/wiring)

View File

@@ -18,6 +18,7 @@
minimal_access = list(ACCESS_MEDICAL, ACCESS_VIROLOGY, ACCESS_MINERAL_STOREROOM)
paycheck = PAYCHECK_MEDIUM
paycheck_department = ACCOUNT_MED
bounty_types = CIV_JOB_VIRO
display_order = JOB_DISPLAY_ORDER_VIROLOGIST

View File

@@ -22,6 +22,7 @@
paycheck = PAYCHECK_HARD
paycheck_department = ACCOUNT_SEC
bounty_types = CIV_JOB_SEC
mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM)

View File

@@ -1,146 +0,0 @@
/**********************Mint**************************/
/obj/machinery/mineral/mint
name = "coin press"
icon = 'icons/obj/economy.dmi'
icon_state = "coinpress0"
density = TRUE
input_dir = EAST
ui_x = 300
ui_y = 250
needs_item_input = TRUE
var/obj/item/storage/bag/money/bag_to_use
var/produced_coins = 0 // how many coins the machine has made in it's last cycle
var/processing = FALSE
var/chosen = /datum/material/iron //which material will be used to make coins
/obj/machinery/mineral/mint/Initialize(mapload)
. = ..()
AddComponent(/datum/component/material_container, list(
/datum/material/iron,
/datum/material/plasma,
/datum/material/silver,
/datum/material/gold,
/datum/material/uranium,
/datum/material/titanium,
/datum/material/diamond,
/datum/material/bananium,
/datum/material/adamantine,
/datum/material/mythril,
/datum/material/plastic,
/datum/material/runite
), MINERAL_MATERIAL_AMOUNT * 75, FALSE, /obj/item/stack)
chosen = SSmaterials.GetMaterialRef(chosen)
/obj/machinery/mineral/mint/pickup_item(datum/source, atom/movable/target, atom/oldLoc)
if(QDELETED(target))
return
if(!istype(target, /obj/item/stack))
return
var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
var/obj/item/stack/S = target
if(materials.insert_item(S))
qdel(S)
/obj/machinery/mineral/mint/process()
if(processing)
var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
var/datum/material/M = chosen
if(!M)
processing = FALSE
icon_state = "coinpress0"
return
icon_state = "coinpress1"
var/coin_mat = MINERAL_MATERIAL_AMOUNT
for(var/sheets in 1 to 2)
if(materials.use_amount_mat(coin_mat, chosen))
for(var/coin_to_make in 1 to 5)
create_coins()
else
var/found_new = FALSE
for(var/datum/material/inserted_material in materials.materials)
var/amount = materials.get_material_amount(inserted_material)
if(amount)
chosen = inserted_material
found_new = TRUE
if(!found_new)
processing = FALSE
else
STOP_PROCESSING(SSmachines, src)
icon_state = "coinpress0"
/obj/machinery/mineral/mint/ui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
ui = new(user, src, "Mint", name)
ui.open()
/obj/machinery/mineral/mint/ui_data()
var/list/data = list()
data["inserted_materials"] = list()
data["chosen_material"] = null
var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
for(var/datum/material/inserted_material in materials.materials)
var/amount = materials.get_material_amount(inserted_material)
if(!amount)
continue
data["inserted_materials"] += list(list(
"material" = inserted_material.name,
"amount" = amount,
))
if(chosen == inserted_material)
data["chosen_material"] = inserted_material.name
data["produced_coins"] = produced_coins
data["processing"] = processing
return data;
/obj/machinery/mineral/mint/ui_act(action, params, datum/tgui/ui)
. = ..()
if(.)
return
if(action == "startpress")
if (!processing)
produced_coins = 0
processing = TRUE
START_PROCESSING(SSmachines, src)
return TRUE
if (action == "stoppress")
processing = FALSE
STOP_PROCESSING(SSmachines, src)
return TRUE
if (action == "changematerial")
var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
for(var/datum/material/mat in materials.materials)
if (params["material_name"] == mat.name)
chosen = mat
return TRUE
/obj/machinery/mineral/mint/proc/create_coins()
set waitfor = FALSE
var/turf/T = get_step(src,output_dir)
var/temp_list = list()
temp_list[chosen] = 400
if(T)
var/obj/item/O = new /obj/item/coin(src)
O.set_custom_materials(temp_list)
if(QDELETED(bag_to_use) || (bag_to_use.loc != T) || !SEND_SIGNAL(bag_to_use, COMSIG_TRY_STORAGE_INSERT, O, null, TRUE)) //important to send the signal so we don't overfill the bag.
bag_to_use = new(src) //make a new bag if we can't find or use the old one.
unload_mineral(bag_to_use) //just forcemove memes.
O.forceMove(bag_to_use) //don't bother sending the signal, the new bag is empty and all that.
SSblackbox.record_feedback("amount", "coins_minted", 1)
produced_coins++
CHECK_TICK

View File

@@ -41,3 +41,10 @@
build_path = /obj/item/circuitboard/computer/mining_shuttle
category = list("Computer Boards")
departmental_flags = DEPARTMENTAL_FLAG_CARGO
/datum/design/board/bountypad_control
name = "Computer Design (Civilian Bounty Pad Control)"
desc = "Allows for the construction of circuit boards used to build a new civilian bounty pad console."
id = "bounty_pad_control"
build_path = /obj/item/circuitboard/computer/bountypad
category = list("Computer Boards")

View File

@@ -40,3 +40,10 @@
build_path = /obj/item/circuitboard/machine/ore_redemption
category = list ("Misc. Machinery")
departmental_flags = DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING
/datum/design/board/bountypad
name = "Machine Design (Civilian Bounty Pad)"
desc = "The circuit board for a Civilian Bounty Pad."
id = "bounty_pad"
build_path = /obj/item/circuitboard/machine/bountypad
category = list ("Misc. Machinery")

View File

@@ -12,7 +12,7 @@
display_name = "Advanced Data Theory"
description = "Better insight into programming and data."
prereq_ids = list("datatheory")
design_ids = list("icprinter", "icupgadv", "icupgclo")
design_ids = list("icprinter", "icupgadv", "icupgclo","bounty_pad","bounty_pad_control")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000)
/////////////////////////plasma tech/////////////////////////

BIN
sound/machines/wewewew.ogg Normal file

Binary file not shown.

View File

@@ -898,6 +898,7 @@
#include "code\game\machinery\bloodbankgen.dm"
#include "code\game\machinery\buttons.dm"
#include "code\game\machinery\cell_charger.dm"
#include "code\game\machinery\civilian_bountys.dm"
#include "code\game\machinery\cloning.dm"
#include "code\game\machinery\colormate.dm"
#include "code\game\machinery\constructable_frame.dm"
@@ -2514,7 +2515,6 @@
#include "code\modules\mining\machine_vending.dm"
#include "code\modules\mining\mine_items.dm"
#include "code\modules\mining\minebot.dm"
#include "code\modules\mining\mint.dm"
#include "code\modules\mining\money_bag.dm"
#include "code\modules\mining\ores_coins.dm"
#include "code\modules\mining\point_bank.dm"

View File

@@ -1,48 +0,0 @@
/**
* THIS FILE WILL SOON BE DEPRICATED!
*/
import { useBackend } from '../backend';
import { Button, LabeledList, Section } from '../components';
import { Window } from '../layouts';
export const Mint = (props, context) => {
const { act, data } = useBackend(context);
const inserted_materials = data.inserted_materials || [];
return (
<Window>
<Window.Content>
<Section
title="Materials"
buttons={
<Button
icon={data.processing ? 'times' : 'power-off'}
content={data.processing ? 'Stop' : 'Start'}
selected={data.processing}
onClick={() => act(data.processing
? 'stoppress'
: 'startpress')} />
}>
<LabeledList>
{inserted_materials.map(material => (
<LabeledList.Item
key={material.material}
label={material.material}
buttons={(
<Button.Checkbox
checked={data.chosen_material === material.material}
onClick={() => act('changematerial', {
material_name: material.material,
})} />
)}>
{material.amount} cm³
</LabeledList.Item>
))}
</LabeledList>
</Section>
<Section>
Pressed {data.produced_coins} coins this cycle.
</Section>
</Window.Content>
</Window>
);
};