[MIRROR] Export scanner doesn't need to link + old bounty code is gone (#2197)

* Export scanner doesn't need to link + old bounty code is gone (#55504)

Removes the Export scanner's need to link with a console and cleans up the old bounty code

* Export scanner doesn't need to link + old bounty code is gone

Co-authored-by: spessbro <51048066+spessbro@users.noreply.github.com>
This commit is contained in:
SkyratBot
2020-12-17 08:02:12 +01:00
committed by GitHub
parent 24f91161a3
commit 6355c9917e
15 changed files with 25 additions and 233 deletions
-7
View File
@@ -24,10 +24,6 @@
wanted_types[i_type] = TRUE
wanted_types = string_assoc_list(wanted_types)
/datum/bounty/item/completion_string()
return {"[shipped_count]/[required_count]"}
/datum/bounty/item/can_claim()
return ..() && shipped_count >= required_count
@@ -46,6 +42,3 @@
shipped_count += O_is_a_stack.amount
else
shipped_count += 1
/datum/bounty/item/compatible_with(datum/other_bounty)
return type != other_bounty.type
-3
View File
@@ -10,9 +10,6 @@
M.wreckage = null // So the mech doesn't explode.
..()
/datum/bounty/item/mech/mark_high_priority(scale_reward)
return ..(max(scale_reward * 0.7, 1.2))
/datum/bounty/item/mech/ripleymk2
name = "APLU MK-II \"Ripley\""
reward = CARGO_CRATE_VALUE * 26
-18
View File
@@ -3,9 +3,6 @@
var/shipped_volume = 0
var/datum/reagent/wanted_reagent
/datum/bounty/reagent/completion_string()
return {"[round(shipped_volume)]/[required_volume] Units"}
/datum/bounty/reagent/can_claim()
return ..() && shipped_volume >= required_volume
@@ -25,12 +22,6 @@
if(shipped_volume > required_volume)
shipped_volume = required_volume
/datum/bounty/reagent/compatible_with(other_bounty)
if(!istype(other_bounty, /datum/bounty/reagent))
return TRUE
var/datum/bounty/reagent/R = other_bounty
return wanted_reagent.type != R.wanted_reagent.type
/datum/bounty/reagent/simple_drink
name = "Simple Drink"
reward = CARGO_CRATE_VALUE * 3
@@ -199,9 +190,6 @@
/// minimum volume of chemical needed, gets randomized on new()
var/wanted_vol = 30
/datum/bounty/pill/completion_string()
return {"[shipped_ammount]/[required_ammount] pills"}
/datum/bounty/pill/can_claim()
return ..() && shipped_ammount >= required_ammount
@@ -219,12 +207,6 @@
if(shipped_ammount > required_ammount)
shipped_ammount = required_ammount
/datum/bounty/pill/compatible_with(other_bounty)
if(!istype(other_bounty, /datum/bounty/pill/simple_pill))
return TRUE
var/datum/bounty/pill/simple_pill/P = other_bounty
return (wanted_reagent.type == P.wanted_reagent.type) && (wanted_vol == P.wanted_vol)
/datum/bounty/pill/simple_pill
name = "Simple Pill"
reward = CARGO_CRATE_VALUE * 20
-21
View File
@@ -32,24 +32,3 @@
reward = CARGO_CRATE_VALUE * 2
required_count = 10
wanted_types = list(/obj/item/trash)
/datum/bounty/more_bounties
name = "More Bounties"
description = "Complete enough bounties and CentCom will issue new ones!"
reward = 5 // number of bounties
var/required_bounties = 5
/datum/bounty/more_bounties/can_claim()
return ..() && completed_bounty_count() >= required_bounties
/datum/bounty/more_bounties/completion_string()
return "[min(required_bounties, completed_bounty_count())]/[required_bounties] Bounties"
/datum/bounty/more_bounties/reward_string()
return "Up to [reward] new bounties"
/datum/bounty/more_bounties/claim()
if(can_claim())
claimed = TRUE
for(var/i = 0; i < reward; ++i)
try_add_bounty(random_bounty())
-9
View File
@@ -13,9 +13,6 @@
description = "Nanotrasen is interested in a virus with a [stat_name] stat of exactly [stat_value]. Central Command will pay handsomely for such a virus."
reward += rand(0, 4) * CARGO_CRATE_VALUE
/datum/bounty/virus/completion_string()
return shipped ? "Shipped" : "Not Shipped"
/datum/bounty/virus/can_claim()
return ..() && shipped
@@ -41,12 +38,6 @@
return
shipped = TRUE
/datum/bounty/virus/compatible_with(datum/other_bounty)
if(!istype(other_bounty, /datum/bounty/virus))
return TRUE
var/datum/bounty/virus/V = other_bounty
return type != V.type || stat_value != V.stat_value
/datum/bounty/virus/proc/accepts_virus(V)
return TRUE
-115
View File
@@ -1,5 +1,3 @@
GLOBAL_LIST_EMPTY(bounties_list)
/datum/bounty
var/name
var/description
@@ -7,14 +5,6 @@ GLOBAL_LIST_EMPTY(bounties_list)
var/claimed = FALSE
var/high_priority = FALSE
/// Displayed on bounty UI screen.
/datum/bounty/proc/completion_string()
return ""
/// Displayed on bounty UI screen.
/datum/bounty/proc/reward_string()
return "[reward] Credits"
/datum/bounty/proc/can_claim()
return !claimed
@@ -34,49 +24,6 @@ GLOBAL_LIST_EMPTY(bounties_list)
/datum/bounty/proc/ship(obj/O)
return
/** When randomly generating the bounty list, duplicate bounties must be avoided.
* This proc is used to determine if two bounties are duplicates, or incompatible in general.
*/
/datum/bounty/proc/compatible_with(other_bounty)
return TRUE
/datum/bounty/proc/mark_high_priority(scale_reward = 2)
if(high_priority)
return
high_priority = TRUE
reward = round(reward * scale_reward)
/** This proc is called when the shuttle docks at CentCom.
* It handles items shipped for bounties.
*/
/proc/bounty_ship_item_and_contents(atom/movable/AM, dry_run=FALSE)
if(!GLOB.bounties_list.len)
setup_bounties()
var/list/matched_one = FALSE
for(var/thing in reverseRange(AM.GetAllContents()))
var/matched_this = FALSE
for(var/datum/bounty/B in GLOB.bounties_list)
if(B.applies_to(thing))
matched_one = TRUE
matched_this = TRUE
if(!dry_run)
B.ship(thing)
if(!dry_run && matched_this)
qdel(thing)
return matched_one
/// Returns FALSE if the bounty is incompatible with the current bounties.
/proc/try_add_bounty(datum/bounty/new_bounty)
if(!new_bounty || !new_bounty.name || !new_bounty.description)
return FALSE
for(var/i in GLOB.bounties_list)
var/datum/bounty/B = i
if(!B.compatible_with(new_bounty) || !new_bounty.compatible_with(B))
return FALSE
GLOB.bounties_list += new_bounty
return TRUE
/** Returns a new bounty of random type, but does not add it to GLOB.bounties_list.
*
* *Guided determines what specific catagory of bounty should be chosen.
@@ -130,65 +77,3 @@ GLOBAL_LIST_EMPTY(bounties_list)
var/subtype = pick(subtypesof(/datum/bounty/item/botany))
return new subtype
// Called lazily at startup to populate GLOB.bounties_list with random bounties.
/proc/setup_bounties()
var/pick // instead of creating it a bunch let's go ahead and toss it here, we know we're going to use it for dynamics and subtypes!
/********************************Subtype Gens********************************/
var/list/easy_add_list_subtypes = list(/datum/bounty/item/assistant = 2,
/datum/bounty/item/mech = 1,
/datum/bounty/item/chef = 2,
/datum/bounty/item/security = 1,
/datum/bounty/virus = 1,
/datum/bounty/item/engineering = 1,
/datum/bounty/item/mining = 2,
/datum/bounty/item/medical = 2,
/datum/bounty/item/botany = 2)
for(var/the_type in easy_add_list_subtypes)
for(var/i in 1 to easy_add_list_subtypes[the_type])
pick = pick(subtypesof(the_type))
try_add_bounty(new pick)
/********************************Strict Type Gens********************************/
var/list/easy_add_list_strict_types = list(/datum/bounty/reagent/simple_drink = 1,
/datum/bounty/reagent/complex_drink = 1,
/datum/bounty/reagent/chemical_simple = 1,
/datum/bounty/reagent/chemical_complex = 1,
/datum/bounty/pill/simple_pill = 1)
for(var/the_strict_type in easy_add_list_strict_types)
for(var/i in 1 to easy_add_list_strict_types[the_strict_type])
try_add_bounty(new the_strict_type)
/********************************Dynamic Gens********************************/
for(var/i in 0 to 1)
if(prob(50))
pick = pick(subtypesof(/datum/bounty/item/slime))
else
pick = pick(subtypesof(/datum/bounty/item/science))
try_add_bounty(new pick)
/********************************Cutoff for Non-Low Priority Bounties********************************/
var/datum/bounty/B = pick(GLOB.bounties_list)
B.mark_high_priority()
/********************************Low Priority Gens********************************/
var/list/low_priority_strict_type_list = list( /datum/bounty/item/alien_organs,
/datum/bounty/item/syndicate_documents,
/datum/bounty/item/adamantine,
/datum/bounty/item/trash,
/datum/bounty/more_bounties)
for(var/low_priority_bounty in low_priority_strict_type_list)
try_add_bounty(new low_priority_bounty)
/proc/completed_bounty_count()
var/count = 0
for(var/i in GLOB.bounties_list)
var/datum/bounty/B = i
if(B.claimed)
++count
return count
+11 -30
View File
@@ -1,6 +1,6 @@
/obj/item/export_scanner
name = "export scanner"
desc = "A device used to check objects against Nanotrasen exports and bounty database."
desc = "A device used to check objects against Nanotrasen exports database."
icon = 'icons/obj/device.dmi'
icon_state = "export_scanner"
inhand_icon_state = "radio"
@@ -8,38 +8,19 @@
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
item_flags = NOBLUDGEON
w_class = WEIGHT_CLASS_SMALL
siemens_coefficient = 1
var/obj/machinery/computer/cargo/cargo_console = null
/obj/item/export_scanner/examine(user)
. = ..()
if(!cargo_console)
. += "<span class='notice'>[src] is not currently linked to a cargo console.</span>"
/obj/item/export_scanner/afterattack(obj/O, mob/user, proximity)
. = ..()
if(!istype(O) || !proximity)
return
if(istype(O, /obj/machinery/computer/cargo))
var/obj/machinery/computer/cargo/C = O
if(!C.requestonly)
cargo_console = C
to_chat(user, "<span class='notice'>Scanner linked to [C].</span>")
else if(!istype(cargo_console))
to_chat(user, "<span class='warning'>You must link [src] to a cargo console first!</span>")
// Before you fix it:
// yes, checking manifests is a part of intended functionality.
var/datum/export_report/ex = export_item_and_contents(O, dry_run=TRUE)
var/price = 0
for(var/x in ex.total_amount)
price += ex.total_value[x]
if(price)
to_chat(user, "<span class='notice'>Scanned [O], value: <b>[price]</b> credits[O.contents.len ? " (contents included)" : ""].</span>")
else
// Before you fix it:
// yes, checking manifests is a part of intended functionality.
var/datum/export_report/ex = export_item_and_contents(O, cargo_console.get_export_categories(), dry_run=TRUE)
var/price = 0
for(var/x in ex.total_amount)
price += ex.total_value[x]
if(price)
to_chat(user, "<span class='notice'>Scanned [O], value: <b>[price]</b> credits[O.contents.len ? " (contents included)" : ""].</span>")
else
to_chat(user, "<span class='warning'>Scanned [O], no export value.</span>")
if(bounty_ship_item_and_contents(O, dry_run=TRUE))
to_chat(user, "<span class='notice'>Scanned item is eligible for one or more bounties.</span>")
to_chat(user, "<span class='warning'>Scanned [O], no export value.</span>")
+10 -13
View File
@@ -27,7 +27,7 @@ Then the player gets the profit from selling his own wasted time.
var/list/exported_atoms_ref = list() //if they're not deleted they go in here for use.
// external_report works as "transaction" object, pass same one in if you're doing more than one export in single go
/proc/export_item_and_contents(atom/movable/AM, allowed_categories = EXPORT_CARGO, apply_elastic = TRUE, delete_unsold = TRUE, dry_run=FALSE, datum/export_report/external_report)
/proc/export_item_and_contents(atom/movable/AM, apply_elastic = TRUE, delete_unsold = TRUE, dry_run=FALSE, datum/export_report/external_report)
if(!GLOB.exports_list.len)
setupExports()
@@ -50,8 +50,8 @@ Then the player gets the profit from selling his own wasted time.
for(var/datum/export/E in GLOB.exports_list)
if(!E)
continue
if(E.applies_to(thing, allowed_categories, apply_elastic))
sold = E.sell_object(thing, report, dry_run, allowed_categories , apply_elastic, profit_ratio)
if(E.applies_to(thing, apply_elastic))
sold = E.sell_object(thing, report, dry_run, apply_elastic, profit_ratio)
report.exported_atoms += " [thing.name]"
if(!QDELETED(thing))
report.exported_atoms_ref += thing
@@ -75,8 +75,7 @@ Then the player gets the profit from selling his own wasted time.
//cost includes elasticity, this does not.
var/init_cost
//All these need to be present in export call parameter for this to apply.
var/export_category = EXPORT_CARGO
/datum/export/New()
..()
@@ -96,7 +95,7 @@ Then the player gets the profit from selling his own wasted time.
cost = init_cost
// Checks the cost. 0 cost items are skipped in export.
/datum/export/proc/get_cost(obj/O, allowed_categories = NONE, apply_elastic = TRUE)
/datum/export/proc/get_cost(obj/O, apply_elastic = TRUE)
var/amount = get_amount(O)
if(apply_elastic)
if(k_elasticity!=0)
@@ -112,14 +111,12 @@ Then the player gets the profit from selling his own wasted time.
return 1
// Checks if the item is fit for export datum.
/datum/export/proc/applies_to(obj/O, allowed_categories = NONE, apply_elastic = TRUE)
if((allowed_categories & export_category) != export_category)
return FALSE
/datum/export/proc/applies_to(obj/O, apply_elastic = TRUE)
if(!is_type_in_typecache(O, export_types))
return FALSE
if(include_subtypes && is_type_in_typecache(O, exclude_types))
return FALSE
if(!get_cost(O, allowed_categories , apply_elastic))
if(!get_cost(O, apply_elastic))
return FALSE
if(O.flags_1 & HOLOGRAM_1)
return FALSE
@@ -133,9 +130,9 @@ Then the player gets the profit from selling his own wasted time.
* get_cost, get_amount and applies_to do not neccesary mean a successful sale.
*
*/
/datum/export/proc/sell_object(obj/O, datum/export_report/report, dry_run = TRUE, allowed_categories = EXPORT_CARGO , apply_elastic = TRUE)
/datum/export/proc/sell_object(obj/O, datum/export_report/report, dry_run = TRUE, apply_elastic = TRUE)
///This is the value of the object, as derived from export datums.
var/the_cost = get_cost(O, allowed_categories , apply_elastic)
var/the_cost = get_cost(O, apply_elastic)
///Quantity of the object in question.
var/amount = get_amount(O)
///Utilized in the pricetag component. Splits the object's profit when it has a pricetag by the specified amount.
@@ -144,7 +141,7 @@ Then the player gets the profit from selling his own wasted time.
if(amount <=0 || the_cost <=0)
return FALSE
if(dry_run == FALSE)
if(SEND_SIGNAL(O, COMSIG_ITEM_SOLD, item_value = get_cost(O, allowed_categories , apply_elastic)) & COMSIG_ITEM_SPLIT_VALUE)
if(SEND_SIGNAL(O, COMSIG_ITEM_SOLD, item_value = get_cost(O, apply_elastic)) & COMSIG_ITEM_SPLIT_VALUE)
profit_ratio = SEND_SIGNAL(O, COMSIG_ITEM_SPLIT_PROFIT_DRY)
the_cost = the_cost * ((100 - profit_ratio) * 0.01)
else
@@ -4,5 +4,5 @@
unit_name = "completed bounty cube"
export_types = list(/obj/item/bounty_cube)
/datum/export/bounty_box/get_cost(obj/item/bounty_cube/cube, allowed_categories, apply_elastic)
/datum/export/bounty_box/get_cost(obj/item/bounty_cube/cube, apply_elastic)
return cube.bounty_value
-1
View File
@@ -1,6 +1,5 @@
/datum/export/organ
include_subtypes = FALSE //CentCom doesn't need organs from non-humans.
export_category = EXPORT_CONTRABAND
/datum/export/organ/heart
cost = CARGO_CRATE_VALUE * 0.2 //For the man who has everything and nothing.
+1 -1
View File
@@ -14,7 +14,7 @@
return 0
return ..() * S.rarity // That's right, no bonus for potency. Send a crappy sample first to "show improvement" later.
/datum/export/seed/sell_object(obj/O, datum/export_report/report, dry_run, allowed_categories, apply_elastic)
/datum/export/seed/sell_object(obj/O, datum/export_report/report, dry_run, apply_elastic)
. = ..()
if(. && !dry_run)
var/obj/item/seeds/S = O
-3
View File
@@ -16,7 +16,6 @@
/datum/export/stack/skin/human
cost = CARGO_CRATE_VALUE * 0.5
export_category = EXPORT_CONTRABAND
unit_name = "piece"
message = "of human skin"
export_types = list(/obj/item/stack/sheet/animalhide/human)
@@ -28,13 +27,11 @@
/datum/export/stack/skin/cat
cost = CARGO_CRATE_VALUE * 0.75
export_category = EXPORT_CONTRABAND
unit_name = "cat hide"
export_types = list(/obj/item/stack/sheet/animalhide/cat)
/datum/export/stack/skin/corgi
cost = CARGO_CRATE_VALUE
export_category = EXPORT_CONTRABAND
unit_name = "corgi hide"
export_types = list(/obj/item/stack/sheet/animalhide/corgi)
+1 -1
View File
@@ -208,7 +208,7 @@
. = ..()
if(!proximity)
return
var/datum/export_report/ex = export_item_and_contents(I, allowed_categories = (ALL), dry_run=TRUE)
var/datum/export_report/ex = export_item_and_contents(I, dry_run=TRUE)
var/price = 0
for(var/x in ex.total_amount)
price += ex.total_value[x]
+1 -4
View File
@@ -328,7 +328,7 @@
for(var/atom/movable/AM in get_turf(pad))
if(AM == pad)
continue
export_item_and_contents(AM, EXPORT_PIRATE | EXPORT_CARGO | EXPORT_CONTRABAND | EXPORT_EMAG, apply_elastic = FALSE, dry_run = TRUE, external_report = ex)
export_item_and_contents(AM, apply_elastic = FALSE, dry_run = TRUE, external_report = ex)
for(var/datum/export/E in ex.total_amount)
status_report += E.total_printout(ex,notes = FALSE)
@@ -398,9 +398,6 @@
pad.icon_state = pad.idle_state
deltimer(sending_timer)
/datum/export/pirate
export_category = EXPORT_PIRATE
//Attempts to find the thing on station
/datum/export/pirate/proc/find_loot()
return
-6
View File
@@ -195,7 +195,6 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list(
setupExports()
var/msg = ""
var/matched_bounty = FALSE
var/datum/export_report/ex = new
@@ -204,17 +203,12 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list(
for(var/atom/movable/AM in shuttle_area)
if(iscameramob(AM))
continue
if(bounty_ship_item_and_contents(AM, dry_run = FALSE))
matched_bounty = TRUE
if(!AM.anchored || istype(AM, /obj/vehicle/sealed/mecha))
export_item_and_contents(AM, export_categories , dry_run = FALSE, external_report = ex)
if(ex.exported_atoms)
ex.exported_atoms += "." //ugh
if(matched_bounty)
msg += "Bounty items received. An update has been sent to all bounty consoles. "
for(var/datum/export/E in ex.total_amount)
var/export_text = E.total_printout(ex)
if(!export_text)