diff --git a/code/__DEFINES/economy.dm b/code/__DEFINES/economy.dm index 24fd0bfd800..470d6199f75 100644 --- a/code/__DEFINES/economy.dm +++ b/code/__DEFINES/economy.dm @@ -10,7 +10,7 @@ #define PAYCHECK_HARD 100 #define PAYCHECK_COMMAND 200 -#define STATION_TARGET_INCREMENT 150 +#define STATION_TARGET_BUFFER 40 #define MAX_GRANT_CIV 2500 #define MAX_GRANT_ENG 3000 diff --git a/code/controllers/subsystem/economy.dm b/code/controllers/subsystem/economy.dm index 69f9ff6608c..142b011333d 100644 --- a/code/controllers/subsystem/economy.dm +++ b/code/controllers/subsystem/economy.dm @@ -51,10 +51,15 @@ SUBSYSTEM_DEF(economy) var/station_total = 0 /// A var that tracks how much money is expected to be on station at a given time. If less than station_total prices go up in vendors. var/station_target = 1 + /// A passively increasing buffer to help alliviate inflation later into the shift, but to a lesser degree. + var/station_target_buffer = 0 /// A var that displays the result of inflation_value for easier debugging and tracking. var/inflation_value = 1 + /// How many civilain bounties have been completed so far this shift? Affects civilian budget payout values. + var/civ_bounty_tracker = 0 /// Contains the message to send to newscasters about price inflation and earnings, updated on price_update() var/earning_report + var/market_crashing = FALSE /datum/controller/subsystem/economy/Initialize(timeofday) var/budget_to_hand_out = round(budget_pool / department_accounts.len) @@ -63,19 +68,24 @@ SUBSYSTEM_DEF(economy) return ..() /datum/controller/subsystem/economy/fire(resumed = 0) + var/temporary_total = 0 eng_payout() // Payout based on nothing. What will replace it? Surplus power, powered APC's, air alarms? Who knows. sci_payout() // Payout based on slimes. secmedsrv_payout() // Payout based on crew safety, health, and mood. - civ_payout() // Payout based on ??? Profit + civ_payout() // Payout based on Effort and market ebb/flow. car_payout() // Cargo's natural gain in the cash moneys. station_total = 0 - for(var/A in bank_accounts) - var/datum/bank_account/B = A - B.payday(1) - if(!istype(B, /datum/bank_account/department)) - station_total += B.account_balance - station_target += (STATION_TARGET_INCREMENT - generated_accounts.len) //More generous the less crew there are. - price_update() + station_target_buffer += STATION_TARGET_BUFFER + for(var/account in bank_accounts) + var/datum/bank_account/bank_account = account + bank_account.payday(1) + if(bank_account && bank_account.account_job) + temporary_total += (bank_account.account_job.paycheck * STARTING_PAYCHECKS) + if(!istype(bank_account, /datum/bank_account/department)) + station_total += bank_account.account_balance + station_target = max(round(temporary_total / max(bank_accounts.len * 2, 1)) + station_target_buffer, 1) + if(!market_crashing) + price_update() /datum/controller/subsystem/economy/proc/get_dep_account(dep_id) for(var/datum/bank_account/department/D in generated_accounts) @@ -145,7 +155,7 @@ SUBSYSTEM_DEF(economy) D.adjust_money(min(science_bounty, MAX_GRANT_SCI)) /datum/controller/subsystem/economy/proc/civ_payout() - var/civ_cash = (rand(1,5) * 500) + var/civ_cash = ((rand(1,5) + civ_bounty_tracker) * 500) var/datum/bank_account/D = get_dep_account(ACCOUNT_CIV) if(D) D.adjust_money(min(civ_cash, MAX_GRANT_CIV)) @@ -163,18 +173,18 @@ SUBSYSTEM_DEF(economy) if(!is_station_level(V.z)) continue V.reset_prices(V.product_records, V.coin_records) - earning_report = "Sector Economic Report
Sector price inflation is currently at [SSeconomy.inflation_value()*100]%.
The station budget is currently [station_total] Credits, and the station's targeted allowance is at [station_target] Credits.
That's all from the Nanotrasen Economist Division." - GLOB.news_network.SubmitArticle(earning_report, "Station Earnings Report", "Station Announcements", null) + earning_report = "Sector Economic Report
Sector vendor prices is currently at [SSeconomy.inflation_value()*100]%.
The station spending power is currently [station_total] Credits, and the crew's targeted allowance is at [station_target] Credits.
That's all from the Nanotrasen Economist Division." + GLOB.news_network.SubmitArticle(earning_report, "Station Earnings Report", "Station Announcements", null, update_alert = FALSE) /** - * Proc that returns a value meant to undercut the value of civilian bounties, based on how much money exists on the station. + * Proc that returns a value meant to shift inflation values in vendors, based on how much money exists on the station. * * If crew are somehow aquiring far too much money, this value will dynamically cause vendables across the station to skyrocket in price until some money is spent. + * Additionally, civilain bounties will cost less, and cargo goodies will increase in price as well. + * The goal here is that if you want to spend money, you'll have to get it, and the most efficient method is typically from other players. **/ /datum/controller/subsystem/economy/proc/inflation_value() - if(station_total > station_target) - var/holder = station_total - station_target - holder = clamp(round((holder / max(station_target,1) + 1),0.1),1,5) - inflation_value = holder - return holder - return 1 + if(!bank_accounts.len) + return 1 + inflation_value = max(round(((station_total / bank_accounts.len) / station_target), 0.1), 1.0) + return inflation_value diff --git a/code/game/machinery/civilian_bounties.dm b/code/game/machinery/civilian_bounties.dm index 520bffb8de8..6666058adb3 100644 --- a/code/game/machinery/civilian_bounties.dm +++ b/code/game/machinery/civilian_bounties.dm @@ -103,6 +103,7 @@ inserted_scan_id.registered_account.transfer_money(dept_account, curr_bounty.reward) status_report += "Bounty Completed! [curr_bounty.reward] credits have been paid out. " inserted_scan_id.registered_account.reset_bounty() + SSeconomy.civ_bounty_tracker++ pad.visible_message("[pad] activates!") flick(pad.sending_state,pad) pad.icon_state = pad.idle_state diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index 800878aab48..cff766b7cb3 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -118,7 +118,7 @@ GLOBAL_LIST_EMPTY(allCasters) newChannel.is_admin_channel = adminChannel network_channels += newChannel -/datum/newscaster/feed_network/proc/SubmitArticle(msg, author, channel_name, datum/picture/picture, adminMessage = 0, allow_comments = 1) +/datum/newscaster/feed_network/proc/SubmitArticle(msg, author, channel_name, datum/picture/picture, adminMessage = 0, allow_comments = 1, update_alert = TRUE) var/datum/newscaster/feed_message/newMsg = new /datum/newscaster/feed_message newMsg.author = author newMsg.body = msg @@ -134,7 +134,7 @@ GLOBAL_LIST_EMPTY(allCasters) FC.messages += newMsg break for(var/obj/machinery/newscaster/NEWSCASTER in GLOB.allCasters) - NEWSCASTER.newsAlert(channel_name) + NEWSCASTER.newsAlert(channel_name, update_alert) lastAction ++ newMsg.creationTime = lastAction @@ -840,14 +840,16 @@ GLOBAL_LIST_EMPTY(allCasters) alert = FALSE update_icon() -/obj/machinery/newscaster/proc/newsAlert(channel) +/obj/machinery/newscaster/proc/newsAlert(channel, update_alert = TRUE) if(channel) - say("Breaking news from [channel]!") + if(update_alert) + say("Breaking news from [channel]!") + playsound(loc, 'sound/machines/twobeep_high.ogg', 75, TRUE) alert = TRUE update_icon() addtimer(CALLBACK(src,.proc/remove_alert),alert_delay,TIMER_UNIQUE|TIMER_OVERRIDE) - playsound(loc, 'sound/machines/twobeep_high.ogg', 75, TRUE) - else + + else if(!channel && update_alert) say("Attention! Wanted issue distributed!") playsound(loc, 'sound/machines/warning-buzzer.ogg', 75, TRUE) diff --git a/code/game/objects/items/crab17.dm b/code/game/objects/items/crab17.dm index aac3b5446cd..ea601b0be24 100644 --- a/code/game/objects/items/crab17.dm +++ b/code/game/objects/items/crab17.dm @@ -86,6 +86,7 @@ add_overlay("legs_retracted") addtimer(CALLBACK(src, .proc/startUp), 50) QDEL_IN(src, 8 MINUTES) //Self-destruct after 8 min + SSeconomy.market_crashing = TRUE /obj/structure/checkoutmachine/proc/startUp() //very VERY snowflake code that adds a neat animation when the pod lands. @@ -156,6 +157,7 @@ STOP_PROCESSING(SSfastprocess, src) priority_announce("The credit deposit machine at [get_area(src)] has been destroyed. Station funds have stopped draining!", sender_override = "CRAB-17 Protocol") explosion(src, 0,0,1, flame_range = 2) + SSeconomy.market_crashing = FALSE return ..() /obj/structure/checkoutmachine/proc/start_dumping() diff --git a/code/modules/cargo/bounties/medical.dm b/code/modules/cargo/bounties/medical.dm index 3f737448a5b..ceb18dd5814 100644 --- a/code/modules/cargo/bounties/medical.dm +++ b/code/modules/cargo/bounties/medical.dm @@ -1,35 +1,39 @@ /datum/bounty/item/medical/heart name = "Heart" - description = "Commander Johnson is in critical condition after suffering yet another heart attack. Doctors say he needs a new heart fast. Ship one, pronto!" + description = "Commander Johnson is in critical condition after suffering yet another heart attack. Doctors say he needs a new heart fast. Ship one, pronto! We'll take a better cybernetic one, if need be." reward = 3000 - wanted_types = list(/obj/item/organ/heart) + wanted_types = list(/obj/item/organ/heart, /obj/item/organ/heart/cybernetic/tier2, /obj/item/organ/heart/cybernetic/tier3) + exclude_types = list(/obj/item/organ/heart/cybernetic)//Excluding tier 1s, no cheesing. /datum/bounty/item/medical/lung name = "Lungs" - description = "A recent explosion at Central Command has left multiple staff with punctured lungs. Ship spare lungs to be rewarded." + description = "A recent explosion at Central Command has left multiple staff with punctured lungs. Ship spare lungs to be rewarded. We'll take a better cybernetic one, if need be." reward = 10000 required_count = 3 - wanted_types = list(/obj/item/organ/lungs) + wanted_types = list(/obj/item/organ/lungs, /obj/item/organ/lungs/cybernetic/tier2, /obj/item/organ/lungs/cybernetic/tier3) + exclude_types = list(/obj/item/organ/lungs/cybernetic)//As above, for all printable organs. /datum/bounty/item/medical/appendix name = "Appendix" - description = "Chef Gibb of Central Command wants to prepare a meal using a very special delicacy: an appendix. If you ship one, he'll pay." + description = "Chef Gibb of Central Command wants to prepare a meal using a very special delicacy: an appendix. If you ship one, he'll pay. We'll take a better cybernetic one, if need be." reward = 5000 //there are no synthetic appendixes wanted_types = list(/obj/item/organ/appendix) /datum/bounty/item/medical/ears name = "Ears" - description = "Multiple staff at Station 12 have been left deaf due to unauthorized clowning. Ship them new ears." + description = "Multiple staff at Station 12 have been left deaf due to unauthorized clowning. Ship them new ears. " reward = 10000 required_count = 3 - wanted_types = list(/obj/item/organ/ears) + wanted_types = list(/obj/item/organ/ears, /obj/item/organ/ears/cybernetic/upgraded) + exclude_types = list(/obj/item/organ/ears/cybernetic) /datum/bounty/item/medical/liver name = "Livers" description = "Multiple high-ranking CentCom diplomats have been hospitalized with liver failure after a recent meeting with Third Soviet Union ambassadors. Help us out, will you?" reward = 10000 required_count = 3 - wanted_types = list(/obj/item/organ/liver) + wanted_types = list(/obj/item/organ/liver, /obj/item/organ/liver/cybernetic/tier2, /obj/item/organ/liver/cybernetic/tier3) + exclude_types = list(/obj/item/organ/liver/cybernetic) /datum/bounty/item/medical/eye name = "Organic Eyes" @@ -69,3 +73,15 @@ 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/medical/surgerycomp + name = "Surgery Computer" + description = "After another freak bombing incident at our annual cheesefest at centcom, we have a massive stack of injured crew on our end. Please send us a fresh surgery computer, if at all possible." + reward = 6000 + wanted_types = list(/obj/machinery/computer/operating) + +/datum/bounty/item/medical/surgerytable + name = "Operating Table" + description = "After a recent influx of infected crew members recently, we've seen that masks just aren't cutting it alone. Silver Operating tables might just do the trick though, send us one to use." + reward = 3000 + wanted_types = list(/obj/structure/table/optable) diff --git a/code/modules/cargo/bounty.dm b/code/modules/cargo/bounty.dm index 214e875d2ca..a883d68f865 100644 --- a/code/modules/cargo/bounty.dm +++ b/code/modules/cargo/bounty.dm @@ -86,7 +86,7 @@ GLOBAL_LIST_EMPTY(bounties_list) if(guided) bounty_num = guided else - bounty_num = rand(1,13) + bounty_num = rand(1,12) switch(bounty_num) if(1) var/subtype = pick(subtypesof(/datum/bounty/item/assistant)) diff --git a/code/modules/events/market_crash.dm b/code/modules/events/market_crash.dm index 18548e27504..a2e763ea8b2 100644 --- a/code/modules/events/market_crash.dm +++ b/code/modules/events/market_crash.dm @@ -25,19 +25,20 @@ var/reason = pick(poss_reasons) priority_announce("Due to [reason], prices for on-station vendors will be increased for a short period.", "Nanotrasen Accounting Division") -///This does not work and I could use some help morking this one out further. /datum/round_event/market_crash/start() . = ..() var/num_accounts = 0 for(var/A in SSeconomy.bank_accounts) num_accounts += 1 market_dip = rand(1000,10000) * num_accounts - SSeconomy.station_target -= market_dip - SSeconomy.station_target = max(SSeconomy.station_target, 1) + SSeconomy.station_target = max(SSeconomy.station_target - market_dip, 1) SSeconomy.price_update() + SSeconomy.market_crashing = TRUE /datum/round_event/market_crash/end() . = ..() SSeconomy.station_target += market_dip + SSeconomy.market_crashing = FALSE SSeconomy.price_update() priority_announce("Prices for on-station vendors have now stabilized.", "Nanotrasen Accounting Division") + diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm index fa4c2f20f77..1e7f110cf7b 100644 --- a/code/modules/vending/_vending.dm +++ b/code/modules/vending/_vending.dm @@ -318,8 +318,8 @@ GLOBAL_LIST_EMPTY(vending_products) if(!start_empty) R.amount = amount R.max_amount = amount - R.custom_price = initial(temp.custom_price) * SSeconomy.inflation_value() - R.custom_premium_price = initial(temp.custom_premium_price) * SSeconomy.inflation_value() + R.custom_price = round(initial(temp.custom_price) * SSeconomy.inflation_value()) + R.custom_premium_price = round(initial(temp.custom_premium_price) * SSeconomy.inflation_value()) R.age_restricted = initial(temp.age_restricted) recordlist += R