port of https://github.com/tgstation/tgstation/pull/49111 aka sales taggers, credit to ArcaneMusic

This commit is contained in:
shellspeed1
2022-09-18 20:55:22 -07:00
parent 3dace329be
commit b4f886d999
14 changed files with 299 additions and 5 deletions
+3 -3
View File
@@ -101,22 +101,22 @@
required_count = 15
wanted_types = list(/obj/item/shard)
/*
/datum/bounty/item/assistant/comfy_chair
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
/*
/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"
+13 -1
View File
@@ -33,6 +33,8 @@ Credit dupes that require a lot of manual work shouldn't be removed, unless they
if(!GLOB.exports_list.len)
setupExports()
var/profit_ratio = 1 //Percentage that gets sent to the seller, rest goes to cargo.
var/list/contents = AM.GetAllContents()
var/datum/export_report/report = external_report
@@ -47,7 +49,7 @@ Credit dupes that require a lot of manual work shouldn't be removed, unless they
if(!E)
continue
if(E.applies_to(thing, allowed_categories, apply_elastic))
sold = E.sell_object(thing, report, dry_run, allowed_categories , apply_elastic)
sold = E.sell_object(thing, report, dry_run, allowed_categories , apply_elastic, profit_ratio)
report.exported_atoms += " [thing.name]"
break
if(thing.reagents?.value_multiplier)
@@ -138,9 +140,19 @@ Credit dupes that require a lot of manual work shouldn't be removed, unless they
var/the_cost = get_cost(O, allowed_categories , apply_elastic)
var/amount = get_amount(O)
var/profit_ratio = 0
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)
profit_ratio = SEND_SIGNAL(O, COMSIG_ITEM_SPLIT_PROFIT)
the_cost = the_cost*((100-profit_ratio)/100)
else
profit_ratio = SEND_SIGNAL(O, COMSIG_ITEM_SPLIT_PROFIT)
the_cost = the_cost*((100-profit_ratio)/100)
report.total_value[src] += the_cost
if(istype(O, /datum/export/material))
+207
View File
@@ -7,9 +7,15 @@
mouse_drag_pointer = MOUSE_ACTIVE_POINTER
var/giftwrapped = FALSE
var/sortTag = 0
var/obj/item/barcode/sticker
/obj/structure/bigDelivery/interact(mob/user)
to_chat(user, "<span class='notice'>You start to unwrap the package...</span>")
if(!do_after(user, 15, target = user))
return
playsound(src.loc, 'sound/items/poster_ripped.ogg', 50, 1)
new /obj/effect/decal/cleanable/wrapping(get_turf(user))
unwrap_contents()
qdel(src)
/obj/structure/bigDelivery/Destroy()
@@ -18,6 +24,11 @@
AM.forceMove(T)
return ..()
/obj/structure/bigDelivery/examine(mob/user)
. = ..()
if(sticker)
. += "There's a barcode attached to the side."
/obj/structure/bigDelivery/contents_explosion(severity, target, origin)
for(var/atom/movable/AM in contents)
AM.ex_act(severity, target, origin)
@@ -53,6 +64,47 @@
icon_state = "gift[icon_state]"
else
to_chat(user, "<span class='warning'>You need more paper!</span>")
else if(istype(W, /obj/item/sales_tagger))
var/obj/item/sales_tagger/tagger = W
if(sticker)
to_chat(user, "<span class='warning'>This package already has a barcode attached!</span>")
return
if(!(tagger.payments_acc))
to_chat(user, "<span class='warning'>Swipe an ID on [tagger] first!</span>")
return
if(tagger.paper_count <= 0)
to_chat(user, "<span class='warning'>[tagger] is out of paper!</span>")
return
user.visible_message("<span class='notice'>[user] attaches a barcode to [src].</span>", "<span class='notice'>You attach a barcode to [src].</span>")
tagger.paper_count -= 1
sticker = new /obj/item/barcode(src)
sticker.payments_acc = tagger.payments_acc //new tag gets the tagger's current account.
sticker.percent_cut = tagger.percent_cut //same, but for the percentage taken.
var/list/wrap_contents = src.GetAllContents()
for(var/obj/I in wrap_contents)
I.AddComponent(/datum/component/pricetag, sticker.payments_acc, tagger.percent_cut)
var/overlaystring = "[icon_state]_tag"
if(giftwrapped)
overlaystring = copytext(overlaystring, 5)
add_overlay(overlaystring)
else if(istype(W, /obj/item/barcode))
var/obj/item/barcode/stickerA = W
if(sticker)
to_chat(user, "<span class='warning'>This package already has a barcode attached!</span>")
return
if(!(stickerA.payments_acc))
to_chat(user, "<span class='warning'>This barcode seems to be invalid. Guess it's trash now.</span>")
return
if(!user.transferItemToLoc(W, src))
to_chat(user, "<span class='warning'>For some reason, you can't attach [W]!</span>")
return
sticker = stickerA
var/overlaystring = "[icon_state]_tag"
if(giftwrapped)
overlaystring = copytext_char(overlaystring, 5) //5 == length("gift") + 1
add_overlay(overlaystring)
else
return ..()
@@ -68,11 +120,18 @@
to_chat(user, "<span class='notice'>You successfully removed [O]'s wrapping !</span>")
O.forceMove(loc)
playsound(src.loc, 'sound/items/poster_ripped.ogg', 50, 1)
new /obj/effect/decal/cleanable/wrapping(get_turf(user))
unwrap_contents()
qdel(src)
else
if(user.loc == src) //so we don't get the message if we resisted multiple times and succeeded.
to_chat(user, "<span class='warning'>You fail to remove [O]'s wrapping!</span>")
/obj/structure/bigDelivery/proc/unwrap_contents()
if(!sticker)
return
for(var/obj/I in src.GetAllContents())
SEND_SIGNAL(I, COMSIG_STRUCTURE_UNWRAPPED)
/obj/item/smallDelivery
name = "parcel"
@@ -81,17 +140,23 @@
icon_state = "deliverypackage3"
var/giftwrapped = 0
var/sortTag = 0
var/obj/item/barcode/sticker
/obj/item/smallDelivery/contents_explosion(severity, target, origin)
for(var/atom/movable/AM in contents)
AM.ex_act(severity, target, origin)
/obj/item/smallDelivery/attack_self(mob/user)
to_chat(user, "<span class='notice'>You start to unwrap the package...</span>")
if(!do_after(user, 15, target = user))
return
user.temporarilyRemoveItemFromInventory(src, TRUE)
unwrap_contents()
for(var/X in contents)
var/atom/movable/AM = X
user.put_in_hands(AM)
playsound(src.loc, 'sound/items/poster_ripped.ogg', 50, 1)
new /obj/effect/decal/cleanable/wrapping(get_turf(user))
qdel(src)
/obj/item/smallDelivery/attack_self_tk(mob/user)
@@ -106,6 +171,8 @@
var/atom/movable/AM = X
AM.forceMove(src.loc)
playsound(src.loc, 'sound/items/poster_ripped.ogg', 50, 1)
new /obj/effect/decal/cleanable/wrapping(get_turf(user))
unwrap_contents()
qdel(src)
/obj/item/smallDelivery/attackby(obj/item/W, mob/user, params)
@@ -140,6 +207,59 @@
else
to_chat(user, "<span class='warning'>You need more paper!</span>")
else if(istype(W, /obj/item/sales_tagger))
var/obj/item/sales_tagger/tagger = W
if(sticker)
to_chat(user, "<span class='warning'>This package already has a barcode attached!</span>")
return
if(!(tagger.payments_acc))
to_chat(user, "<span class='warning'>Swipe an ID on [tagger] first!</span>")
return
if(tagger.paper_count <= 0)
to_chat(user, "<span class='warning'>[tagger] is out of paper!</span>")
return
user.visible_message("<span class='notice'>[user] attaches a barcode to [src].</span>", "<span class='notice'>You attach a barcode to [src].</span>")
tagger.paper_count -= 1
sticker = new /obj/item/barcode(src)
sticker.payments_acc = tagger.payments_acc //new tag gets the tagger's current account.
sticker.percent_cut = tagger.percent_cut //as above, as before.
var/list/wrap_contents = src.GetAllContents()
for(var/obj/I in wrap_contents)
I.AddComponent(/datum/component/pricetag, sticker.payments_acc, tagger.percent_cut)
var/overlaystring = "[icon_state]_tag"
if(giftwrapped)
overlaystring = copytext(overlaystring, 5)
add_overlay(overlaystring)
else if(istype(W, /obj/item/barcode))
var/obj/item/barcode/stickerA = W
if(sticker)
to_chat(user, "<span class='warning'>This package already has a barcode attached!</span>")
return
if(!(stickerA.payments_acc))
to_chat(user, "<span class='warning'>This barcode seems to be invalid. Guess it's trash now.</span>")
return
if(!user.transferItemToLoc(W, src))
to_chat(user, "<span class='warning'>For some reason, you can't attach [W]!</span>")
return
sticker = stickerA
var/overlaystring = "[icon_state]_tag"
if(giftwrapped)
overlaystring = copytext_char(overlaystring, 5) //5 == length("gift") + 1
add_overlay(overlaystring)
/obj/item/smallDelivery/proc/unwrap_contents()
if(!sticker)
return
for(var/obj/I in src.GetAllContents())
SEND_SIGNAL(I, COMSIG_ITEM_UNWRAPPED)
/obj/item/smallDelivery/examine(mob/user)
. = ..()
if(sticker)
. += "There's a barcode attached to the side."
/obj/item/destTagger
name = "destination tagger"
@@ -194,3 +314,90 @@
var/n = text2num(href_list["nextTag"])
currTag = n
openwindow(usr)
/obj/item/sales_tagger
name = "sales tagger"
desc = "A scanner that lets you tag wrapped items for sale, splitting the profit between you and cargo. Ctrl-Click to clear the registered account."
icon = 'icons/obj/device.dmi'
icon_state = "salestagger"
item_state = "electronic"
lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
w_class = WEIGHT_CLASS_TINY
slot_flags = ITEM_SLOT_BELT
///The account which is recieving the split profits.
var/datum/bank_account/payments_acc = null
var/paper_count = 10
var/max_paper_count = 20
///Details the percentage the scanned account recieves off the final sale.
var/percent_cut = 20
/obj/item/sales_tagger/examine(mob/user)
. = ..()
. += "[src] has [paper_count]/[max_paper_count] available barcodes. Refill with paper."
. += "Profit split on sale is currently set to [percent_cut]%."
/obj/item/sales_tagger/attackby(obj/item/I, mob/living/user, params)
. = ..()
if(istype(I, /obj/item/card/id))
var/obj/item/card/id/potential_acc = I
if(potential_acc.registered_account)
payments_acc = potential_acc.registered_account
playsound(src, 'sound/machines/ping.ogg', 40, TRUE)
to_chat(user, "<span class='notice'>[src] registers the ID card. Tag a wrapped item to create a barcode.</span>")
else if(!potential_acc.registered_account)
to_chat(user, "<span class='warning'>This ID card has no account registered!</span>")
return
else if(payments_acc != potential_acc.registered_account)
to_chat(user, "<span class='notice'>ID card already registered.</span>")
if(istype(I, /obj/item/paper))
if (!(paper_count >= max_paper_count))
paper_count += 10
qdel(I)
if (paper_count >= max_paper_count)
paper_count = max_paper_count
to_chat(user, "<span class='notice'>[src]'s paper supply is now full.</span>")
return
to_chat(user, "<span class='notice'>You refill [src]'s paper supply, you have [paper_count] left.</span>")
return
else
to_chat(user, "<span class='notice'>[src]'s paper supply is full.</span>")
return
/obj/item/sales_tagger/attack_self(mob/user)
. = ..()
if(paper_count <= 0)
to_chat(user, "<span class='warning'>You're out of paper!'.</span>")
return
if(!payments_acc)
to_chat(user, "<span class='warning'>You need to swipe [src] with an ID card first.</span>")
return
paper_count -= 1
playsound(src, 'sound/machines/click.ogg', 40, TRUE)
to_chat(user, "<span class='notice'>You print a new barcode.</span>")
var/obj/item/barcode/new_barcode = new /obj/item/barcode(src)
new_barcode.payments_acc = payments_acc //The sticker gets the scanner's registered account.
user.put_in_hands(new_barcode)
/obj/item/sales_tagger/CtrlClick(mob/user)
. = ..()
payments_acc = null
to_chat(user, "<span class='notice'>You clear the registered account.</span>")
/obj/item/sales_tagger/AltClick(mob/user)
. = ..()
var/potential_cut = input("How much would you like to payout to the registered card?","Percentage Profit") as num|null
if(!potential_cut)
percent_cut = 50
percent_cut = clamp(round(potential_cut, 1), 1, 50)
to_chat(user, "<span class='notice'>[percent_cut]% profit will be recieved if a package with a barcode is sold.</span>")
/obj/item/barcode
name = "Barcode tag"
desc = "A tiny tag, associated with a crewmember's account. Attach to a wrapped item to give that account a portion of the wrapped item's profit."
icon = 'icons/obj/bureaucracy.dmi'
icon_state = "barcode"
w_class = WEIGHT_CLASS_TINY
///All values inheirited from the sales tagger it came from.
var/datum/bank_account/payments_acc = null
var/percent_cut = 5
@@ -90,3 +90,12 @@
materials = list(/datum/material/iron = 2010, /datum/material/glass = 5)
build_path = /obj/item/electronics/electrochromatic_kit
category = list("initial", "Electronics")
/datum/design/salestagger
name = "Sales Tagger"
id = "salestagger"
build_type = AUTOLATHE | PROTOLATHE
materials = list(/datum/material/iron = 700, /datum/material/glass = 200)
build_path = /obj/item/sales_tagger
category = list("initial", "Electronics")
departmental_flags = DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_SERVICE
@@ -106,4 +106,4 @@
"destructive_analyzer", "circuit_imprinter", "experimentor", "rdconsole", "bepis", "design_disk", "tech_disk", "rdserver", "rdservercontrol", "mechfab", "paystand",
"space_heater", "beaker", "large_beaker", "xlarge_beaker", "bucket", "hypovial", "large_hypovial", "syringe", "pillbottle",
"sec_shellclip", "sec_beanbag", "sec_rshot", "sec_bshot", "sec_slug", "sec_islug", "sec_dart", "sec_38", "sec_38lethal",
"rglass","plasteel","plastitanium","plasmaglass","plasmareinforcedglass","titaniumglass","plastitaniumglass")
"rglass","plasteel","plastitanium","plasmaglass","plasmareinforcedglass","titaniumglass","plastitaniumglass", "salestagger")