Skip to content
This repository was archived by the owner on Apr 16, 2021. It is now read-only.
2 changes: 0 additions & 2 deletions code/WorkInProgress/Railgun.dm
Original file line number Diff line number Diff line change
Expand Up @@ -404,8 +404,6 @@ proc/line_ReturnEfficDir(Angle)
ReturnedDir = WEST
return ReturnedDir



//This returns the tangent reciprocal of x, for use with East and West straights.
proc/tanR(x)
return (cos(x)/sin(x))
245 changes: 245 additions & 0 deletions code/datums/mining/cloud_storage.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,245 @@
#define ROCKBOX_STANDARD_FEE 5
var/global/rockbox_client_fee_min = 1
var/global/rockbox_client_fee_pct = 10
var/global/rockbox_premium_purchased = 0

/obj/machinery/ore_cloud_storage_container
name = "Rockbox™ Ore Cloud Storage Container"
desc = "This thing stores ore in \"the cloud\" for the station to use. Best not to think about it too hard."
icon = 'icons/obj/mining.dmi'
icon_state = "ore_storage_unit"
density = 1
anchored = 1
var/base_material_class = /obj/item/raw_material/
var/list/sell_price = list()
var/list/for_sale = list()
var/list/ores = list()
var/list/sellable_ores = list()
var/health = 100
var/broken = 0

MouseDrop_T(atom/movable/O as mob|obj, mob/user as mob)

if (!O || !user)
return

if(!istype(user,/mob/living/))
boutput(user, "<span style=\"color:red\">Only living mobs are able to use the storage container's quick-load feature.</span>")
return

if (!istype(O,/obj/))
boutput(user, "<span style=\"color:red\">You can't quick-load that.</span>")
return

if(get_dist(O,user) > 1)
boutput(user, "<span style=\"color:red\">You are too far away!</span>")
return

else if (istype(O, /obj/storage/crate/) && src.accept_loading(user,1))
if (O:welded || O:locked)
boutput(user, "<span style=\"color:red\">You cannot load from a crate that cannot open!</span>")
return

user.visible_message("<span style=\"color:blue\">[user] uses [src]'s automatic loader on [O]!</span>", "<span style=\"color:blue\">You use [src]'s automatic loader on [O].</span>")
var/amtload = 0
for (var/obj/item/M in O.contents)
if (!istype(M,src.base_material_class))
continue
src.load_item(M)
amtload++
if (amtload) boutput(user, "<span style=\"color:blue\">[amtload] materials loaded from [O]!</span>")
else boutput(user, "<span style=\"color:red\">No material loaded!</span>")

else if (istype(O, /obj/item/) && src.accept_loading(user,1))
user.visible_message("<span style=\"color:blue\">[user] begins quickly stuffing materials into [src]!</span>")
var/staystill = user.loc
for(var/obj/item/M in view(1,user))
if (!O)
continue
if (!istype(M,O.type))
continue
if (!istype(M,src.base_material_class))
continue
if (O.loc == user)
continue
if (O in user.contents)
continue
src.load_item(M)
sleep(0.5)
if (user.loc != staystill) break
boutput(user, "<span style=\"color:blue\">You finish stuffing materials into [src]!</span>")
src.update_ores()

else ..()

src.updateUsrDialog()

attackby(obj/item/W as obj, mob/user as mob)
if (istype(W, src.base_material_class) && src.accept_loading(user))
user.visible_message("<span style=\"color:blue\">[user] loads [W] into the [src].</span>", "<span style=\"color:blue\">You load [W] into the [src].</span>")
src.load_item(W,user)
src.update_ores()

else
src.health = max(src.health-W.force,0)
src.check_health()
..()

proc/check_health()
if(!src.health)
src.broken = 1
src.icon_state = "ore_storage_unit-broken"
src.update_sellable()

proc/load_item(var/obj/item/O,var/mob/living/user)
if (!O)
return
if(O.amount == 1)
O.set_loc(src)
if (user && O)
user.u_equip(O)
O.dropped()
else if(O.amount>1)
O.set_loc(src)
for(O.amount,O.amount > 0, O.amount--)
new O.type(src)
if (user && O)
user.u_equip(O)
O.dropped()
qdel(O)
else
return // uhhhhhh


proc/accept_loading(var/mob/user,var/allow_silicon = 0)
if (!user)
return 0
if (src.stat & BROKEN || src.stat & NOPOWER)
return 0
if (!istype(user, /mob/living/))
return 0
if (istype(user, /mob/living/silicon) && !allow_silicon)
return 0
var/mob/living/L = user
if (L.stat || L.transforming)
return 0
return 1

proc/update_ores()
src.ores.len = 0
for(var/obj/item/raw_material/R in src.contents)
if(!(R.material_name in ores))
ores += R.material_name
ores[R.material_name] = 1

else
ores[R.material_name]++
src.update_sellable()
return

proc/update_sellable()
src.sellable_ores.len = 0
if(src.broken)
return
for(var/ore in src.ores)
if(ore in src.for_sale)
if(for_sale[ore])
if(!(ore in sellable_ores))
sellable_ores += ore
sellable_ores[ore] = ores[ore]
else
continue
else
continue

attack_hand(var/mob/user as mob)

var/list/ores = src.ores

user.machine = src
var/dat = "<B>[src.name]</B>"

dat += "<br><HR>"

if (stat & BROKEN || stat & NOPOWER)
dat = "The screen is blank."
user << browse(dat, "window=mining_dropbox;size=400x500")
onclose(user, "mining_dropbox")
return

if(ores.len)
for(var/ore in ores)
var/sellable = 0
var/price = 0
if(src.sell_price[ore] != null)
price = sell_price[ore]
if(src.for_sale[ore] != null)
sellable = src.for_sale[ore]
dat += "<B>[ore]:</B> [ores[ore]] (<A href='?src=\ref[src];sellable=[ore]'>[sellable ? "For Sale" : "Not For Sale"]</A>) (<A href='?src=\ref[src];price=[ore]'>$[price] per ore</A>) (<A href='?src=\ref[src];eject=[ore]'>Eject</A>)<br>"
else
dat += "No ores currently loaded.<br>"

user << browse(dat, "window=mining_dropbox;size=450x500")
onclose(user, "mining_dropbox")



Topic(href, href_list)

if(stat & BROKEN || stat & NOPOWER)
return

if(usr.stat || usr.restrained())
return

if ((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(src.loc, /turf))))
usr.machine = src

if (href_list["eject"])
var/ore = href_list["eject"]
var/turf/ejectturf = get_turf(usr)

src.eject_ores(ore,ejectturf,0,0,usr)

if (href_list["price"])
var/ore = href_list["price"]
var/new_price = null
new_price = input(usr,"What price would you like to set? (Min 0)","Set Sale Price",null) as num
new_price = max(0,new_price)
if(src.sell_price[ore])
sell_price[ore] = new_price
else
sell_price += ore
sell_price[ore] = new_price

if (href_list["sellable"])
var/ore = href_list["sellable"]
if(src.for_sale[ore])
for_sale[ore] = !for_sale[ore]
else
for_sale += ore
for_sale[ore] = 1
update_sellable()

src.updateUsrDialog()
return

proc/eject_ores(var/ore, var/turf/ejectturf, var/ejectamt, var/transmit = 0, var/user as mob)
for(var/obj/item/raw_material/R in src.contents)
if (R.material_name == ore)
if (!ejectamt)
ejectamt = input(usr,"How many ores do you want to eject?","Eject Ores") as num
if ((ejectamt <= 0 || get_dist(src, user) > 1) && !transmit)
break
if (!ejectturf)
break
R.set_loc(ejectturf)
ejectamt--
if (ejectamt <= 0)
break
if(transmit)
flick("ore_storage_unit-transmit",src)
showswirl(ejectturf)
leaveresidual(ejectturf)

src.update_ores()
30 changes: 29 additions & 1 deletion code/obj/machinery/computer/QM_order.dm
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,12 @@
account = FindBankAccountByName(src.scan.registered)
if(account)
dat += "<B>Credits on Account:</B> [account.fields["current_money"]] Credits<BR><HR>"

dat += "<B>Rockbox&trade; Ore Cloud Storage Service Settings:</B><BR><small>"
dat += "<B>Rockbox&trade; Fees:</B> $[!rockbox_premium_purchased ? ROCKBOX_STANDARD_FEE : 0] per ore [!rockbox_premium_purchased ? "(Purchase our <A href='?src=\ref[src];premium_service=1'>Premium Service</A> to remove this fee!)" : ""]<BR>"
dat += "<B>Client Quartermaster Transaction Fee:</B> <A href='?src=\ref[src];fee_pct=1'>[rockbox_client_fee_pct]%</A><BR>"
dat += "<B>Client Quartermaster Transaction Fee Per Ore Minimum:</B> <A href='?src=\ref[src];fee_min=1'>$[rockbox_client_fee_min]</A><BR>"
dat += "</small><HR>"
dat += {"<A href='?src=\ref[src];viewrequests=1'>View Requests</A><BR>
<A href='?src=\ref[src];order=1'>Request Items</A><BR>
<A href='?src=\ref[src];buypoints=1'>Purchase Supply Points</A><BR>
Expand Down Expand Up @@ -212,6 +218,28 @@

else if (href_list["mainmenu"])
src.temp = null
src.add_fingerprint(usr)

else if (href_list["fee_pct"])
var/fee_pct = null
fee_pct = input(usr,"What fee percent would you like to set? (Min 0)","Fee Percent per Transaction:",null) as num
fee_pct = max(0,fee_pct)
rockbox_client_fee_pct = fee_pct

else if (href_list["fee_min"])
var/fee_min = null
fee_min = input(usr,"What fee min would you like to set? (Min 0)","Minimum Fee per Transaction in Credits:",) as num
fee_min = max(0,fee_min)
rockbox_client_fee_min = fee_min

else if (href_list["premium_service"])
var/response = ""
response = alert(usr,"Would you like to purchase the Rockbox&trade; Premium Service for 10000 Credits?",,"Yes","No")
if(response == "Yes")
if(wagesystem.shipping_budget >= 10000)
wagesystem.shipping_budget -= 10000
rockbox_premium_purchased = 1
else
boutput(usr,"<span style=\"color:blue\">Not enough money in the budget!</span>")

src.updateUsrDialog()
return
Loading