diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 81d6166a3f6..5cb1e4ae138 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -95,7 +95,8 @@ #define INIT_ORDER_OVERLAY -6 #define INIT_ORDER_XKEYSCORE -10 #define INIT_ORDER_TICKETS -11 -#define INIT_ORDER_LIGHTING -21 +#define INIT_ORDER_LIGHTING -20 +#define INIT_ORDER_CAPITALISM -21 #define INIT_ORDER_SHUTTLE -22 #define INIT_ORDER_CARGO_QUESTS -23 #define INIT_ORDER_NIGHTSHIFT -24 diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index dbb924a56b4..f8907ab3667 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -320,7 +320,7 @@ EQUIPMENT("Luxury Shelter Capsule", /obj/item/survivalcapsule/luxury, 5000), EQUIPMENT("Luxury Elite Bar Capsule", /obj/item/survivalcapsule/luxuryelite, 10000), EQUIPMENT("Soap", /obj/item/soap/nanotrasen, 400), - EQUIPMENT("Space Cash", /obj/item/stack/spacecash/c1000, 2500), + EQUIPMENT("Space Cash", /obj/item/stack/spacecash/magic_linked, 2500), EQUIPMENT("Whiskey", /obj/item/reagent_containers/food/drinks/bottle/whiskey, 500), EQUIPMENT("HRD-MDE Project Box", /obj/item/storage/box/hardmode_box, 2500), ) diff --git a/code/controllers/subsystem/capitalism.dm b/code/controllers/subsystem/capitalism.dm new file mode 100644 index 00000000000..b1a7dd0c942 --- /dev/null +++ b/code/controllers/subsystem/capitalism.dm @@ -0,0 +1,160 @@ +#define FREQUENCY_SALARY 5 MINUTES +#define EXTRA_MONEY 10000 +SUBSYSTEM_DEF(capitalism) + name = "Capitalism" + ss_id = "capitalism_subsystem" + init_order = INIT_ORDER_CAPITALISM + offline_implications = "Выплаты зарплат приостановлены, по идее выплаты за задания карго не сломаются. Награда за цель не выплачивается. Немедленных действий не требуется." + runlevels = RUNLEVEL_GAME + wait = FREQUENCY_SALARY + flags = SS_BACKGROUND + + //This separation is necessary for tests and in general so that it is pleasant + var/datum/money_account/base_account = null //the account that receives money for orders and vending machines + var/datum/money_account/payment_account = null //The account from which the salary is deducted badguy + + //Attention. Statistics for greentext + //And why did I make tabs?... + var/total_salary_payment = 0 //How much money was spent on salaries + var/total_station_bounty = 0 //How much money did the money from the cargo bring to the station account + var/total_cargo_bounty = 0 //How much money was credited to the cargo account from the tasks + var/total_personal_bounty = 0 //How much money was distributed to the beggars + var/income_vedromat = 0 //Income from vending machines + var/default_counter = 0 //The counter for the number of defaults, I definitely won't make a joke + + var/list/complited_goals = list() //It is necessary not to pay again for the goal, gagaga + var/default_status = FALSE //TRUE if the default is in effect at the station, you can do it in the future, for example, as a cargo modifier + +/datum/controller/subsystem/capitalism/Initialize() + accounts_init() + salary_account_init() + return SS_INIT_SUCCESS + +/datum/controller/subsystem/capitalism/fire() + + //if(default_counter > 300) + // GLOB.priority_announcement.Announce("Станция признана убыточным объектом. Хорошего дня.", "Расторжение контрактов.", 'sound/AI/commandreport.ogg') + // set_security_level(SEC_LEVEL_EPSILON) + + //If there is enough money to pay salaries at least twice before the default is lifted + if(default_status && (payment_account.money > (potential_salary_payments() + EXTRA_MONEY))) + default_status = FALSE + default_annonce() + payment_process() //Pay the beggars immediately after the announcement + else if(!payment_process() && !default_status) + default_status = TRUE + default_annonce() + + var/total_station_goal_bounty = 0 + var/s_ex_personal_bounry = list() //Extended staff rewards + //personal_reward + for(var/datum/station_goal/goal in SSticker.mode.station_goals) + if(!goal) + continue + if(goal.check_completion() && !(goal in complited_goals)) + total_station_goal_bounty += goal.station_bounty + for(var/prom in goal.personal_reward) + if(s_ex_personal_bounry?[prom]) + s_ex_personal_bounry[prom] += goal.personal_reward[prom] + else + s_ex_personal_bounry[prom] = goal.personal_reward[prom] + complited_goals += goal + + if(total_station_goal_bounty) + base_account.credit(total_station_goal_bounty, "Начисление награды за выполнение цели.", "Отдел развития Нанотрейзен", base_account.owner_name) + smart_job_payment(s_ex_personal_bounry) + +//status - TRUE/FALSE +/datum/controller/subsystem/capitalism/proc/default_annonce() + if(default_status) + GLOB.priority_announcement.Announce("Внимание на счёте станции зафиксировано отсутствие финансов. Выплаты заработных плат заморожены. Командному составу необходимо немедленно решить возникший кризис", "Дефолт станции", 'sound/AI/commandreport.ogg') + else + GLOB.priority_announcement.Announce("Внимание на счёте станции достаточно средств для выплат. Выплаты заработных плат возобновлены.", "Возобновление выплат", 'sound/AI/commandreport.ogg') + +/datum/controller/subsystem/capitalism/proc/potential_salary_payments() + var/total_salary = 0 + for(var/datum/money_account/account in GLOB.all_money_accounts) + if(account.salary_payment_active && account.linked_job.salary && !account.suspended) + total_salary += account.linked_job.salary + return total_salary + +/datum/controller/subsystem/capitalism/proc/accounts_init() + if(!GLOB.CC_account) + create_CC_account() + + if(!GLOB.station_account) + create_station_account() + + if(GLOB.department_accounts.len == 0) + for(var/department in GLOB.station_departments) + create_department_account(department) + +/datum/controller/subsystem/capitalism/proc/salary_account_init() + base_account = GLOB.station_account //The account that the bounty goes to, the money for the goal and the money from the machines. + payment_account = GLOB.CC_account //GLOB.CC_account //This is the account from which money is debited for salary. Made for catsmile tests + + if(!GLOB.vendor_account) + GLOB.vendor_account = base_account //:catsmile: + +/datum/controller/subsystem/capitalism/proc/payment_process() + . = TRUE + for(var/datum/money_account/account in GLOB.all_money_accounts) + if(account.salary_payment_active && account.linked_job.salary && !account.suspended) + if(payment_account.charge(account.linked_job.salary, account, "Выплата зарплаты персоналу.", "Nanotrasen personal departament" , "Поступление зарплаты.", "Поступление зарплаты" ,"Biesel TCD Terminal #[rand(111,333)]")) + account.notify_pda_owner("Поступление зарплаты \"На ваш привязанный аккаунт поступило [account.linked_job.salary] кредитов\" (Невозможно Ответить)", FALSE) + total_salary_payment += account.linked_job.salary + else + return FALSE + +/datum/controller/subsystem/capitalism/proc/smart_bounty_payment(var/list/jobs_payment, var/money) + . = FALSE //If nothing is paid to anyone + var/list_payment_account = list() //which people should I pay + var/bounty = 0 //What kind of money for each person + total_personal_bounty += money + for(var/datum/money_account/account in GLOB.all_money_accounts) + if(jobs_payment.Find(account.linked_job.title) && account.salary_payment_active && !account.suspended) + list_payment_account += account + . = TRUE + + if(money == 0 || length(list_payment_account) == 0) + return FALSE + bounty = round(money / length(list_payment_account)) + for(var/datum/money_account/account in list_payment_account) + //It may be worth doing a type from the customer's company... But I'm too lazy + if(account.credit(bounty, "Начисление награды за выполнение заказа.", "Biesel TCD Terminal #[rand(111,333)]", account.owner_name)) + account.notify_pda_owner("Поступление награды \"На ваш привязанный аккаунт поступило [bounty] кредитов за помощь в выполнении заказа.\" (Невозможно Ответить)", FALSE) + return + +/datum/controller/subsystem/capitalism/proc/smart_job_payment(var/list/jobs_payment) + . = FALSE //If nothing is paid to anyone + for(var/datum/money_account/account in GLOB.all_money_accounts) + if(jobs_payment?[account.linked_job.title] && account.salary_payment_active && !account.suspended) + if(account.credit(jobs_payment[account.linked_job.title], "Начисление награды за выполнение цели.", "Biesel TCD Terminal #[rand(111,333)]", account.owner_name)) + total_personal_bounty += jobs_payment[account.linked_job.title] + account.notify_pda_owner("Поступление награды \"На ваш привязанный аккаунт поступило [jobs_payment[account.linked_job.title]] кредитов за помощь в выполнении цель станции.\" (Невозможно Ответить)", FALSE) + . = TRUE + return + +// In short, as for beggars, but for departments +/datum/controller/subsystem/capitalism/proc/smart_departament_payment(var/list/keys_departament, var/money) + . = FALSE //If nothing is paid to anyone + var/list_payment_account = list() //which people should I pay + var/bounty = 0 //What kind of money for each department + total_personal_bounty += money + var/datum/money_account/account = base_account + + for(var/key_account_departament in keys_departament) + account = GLOB.department_accounts?[key_account_departament] + if(!account) + list_payment_account += account + . = TRUE + + if(!length(list_payment_account)) + base_account.credit(bounty, "Начисление награды за выполнение заказа.", "Biesel TCD Terminal #[rand(111,333)]", account.owner_name) + return TRUE + + bounty = round(money / length(list_payment_account)) + //If it did not find that, the payment of the station (well, or what is indicated in the base_account) + for(var/datum/money_account/account_pay in list_payment_account) + account_pay.credit(bounty, "Начисление награды за выполнение заказа.", "Biesel TCD Terminal #[rand(111,333)]", account.owner_name) + return diff --git a/code/controllers/subsystem/jobs.dm b/code/controllers/subsystem/jobs.dm index eefa6194c7d..49efff4ea5b 100644 --- a/code/controllers/subsystem/jobs.dm +++ b/code/controllers/subsystem/jobs.dm @@ -636,8 +636,8 @@ SUBSYSTEM_DEF(jobs) /datum/controller/subsystem/jobs/proc/CreateMoneyAccount(mob/living/H, rank, datum/job/job) - var/money_amount = job ? rand(500, 1500) * get_job_factor(job, job.random_money_factor) : rand(500, 1500) - var/datum/money_account/M = create_account(H.real_name, money_amount, null) + var/money_amount = rand(job.min_start_money, job.max_start_money) + var/datum/money_account/M = create_account(H.real_name, money_amount, null, job, TRUE) var/remembered_info = "" remembered_info += "Номер вашего аккаунта: #[M.account_number]
" @@ -666,12 +666,6 @@ SUBSYSTEM_DEF(jobs) spawn(0) to_chat(H, "Номер вашего аккаунта: [M.account_number], ПИН вашего аккаунта: [M.remote_access_pin]") -/datum/controller/subsystem/jobs/proc/get_job_factor(datum/job/job, randomized) - if(randomized) - return job.money_factor*rand(0.25, 4) // for now only used for civillians - else - return job.money_factor - /datum/controller/subsystem/jobs/proc/format_jobs_for_id_computer(obj/item/card/id/tgtcard) var/list/jobs_to_formats = list() if(tgtcard) @@ -714,6 +708,14 @@ SUBSYSTEM_DEF(jobs) oldjobdatum.current_positions-- newjobdatum.current_positions++ +/datum/controller/subsystem/jobs/proc/account_job_transfer(name_owner, job_title, salary_capcap = TRUE) + + var/datum/money_account/account_job = get_account_with_name(name_owner) + + if(account_job) + account_job.linked_job = SSjobs.GetJob(job_title) + account_job.salary_payment_active = salary_capcap + /datum/controller/subsystem/jobs/proc/notify_dept_head(jobtitle, antext) // Used to notify the department head of jobtitle X that their employee was brigged, demoted or terminated if(!jobtitle || !antext) diff --git a/code/controllers/subsystem/non-firing/cargo_quests.dm b/code/controllers/subsystem/non-firing/cargo_quests.dm index 96c11efdfb3..663c772a1d5 100644 --- a/code/controllers/subsystem/non-firing/cargo_quests.dm +++ b/code/controllers/subsystem/non-firing/cargo_quests.dm @@ -2,6 +2,13 @@ #define NUMBER_OF_CORP_QUEST 4 #define NUMBER_OF_PLASMA_QUEST 1 +//Abandon hope, everyone who enters here + +//This place is cursed, don't try to understand it and change it. It will kill you + +//Reading the lines more and more, I realize that I shouldn't have come here. + +//THERE IS NO GOD BEYOND THAT SUBSYSTEM_DEF(cargo_quests) name = "Cargo Quests" flags = SS_NO_FIRE @@ -103,6 +110,7 @@ SUBSYSTEM_DEF(cargo_quests) /datum/controller/subsystem/cargo_quests/proc/check_delivery(obj/structure/bigDelivery/delivery) var/max_reward = 0 var/datum/cargo_quests_storage/target_storage + var/list/copmpleted_quests = list() for(var/order in quest_storages) var/datum/cargo_quests_storage/storage = order @@ -129,6 +137,7 @@ SUBSYSTEM_DEF(cargo_quests) continue if(quest.check_required_item(item)) failed_quest_length-- + copmpleted_quests += quest has_extra_item = FALSE break @@ -141,6 +150,7 @@ SUBSYSTEM_DEF(cargo_quests) for(var/datum/cargo_quest/quest in storage.current_quests) if(!quest.after_check()) + copmpleted_quests -= quest failed_quest_length++ var/reward = storage.check_quest_completion(delivery, failed_quest_length, extra_items, req_quantity) @@ -161,8 +171,14 @@ SUBSYSTEM_DEF(cargo_quests) max_reward = max_reward * 10 remove_quest(target_storage.UID(), complete = TRUE, modificators = target_storage.modificators, new_reward = max_reward) - if(target_storage.customer.send_reward(max_reward)) + if(target_storage.customer.send_reward(max_reward, copmpleted_quests)) return + + //Honestly, I don't want to do another procedure for this + if(target_storage.quest_difficulty.bounty_for_difficulty) + SScapitalism.total_station_bounty += target_storage.quest_difficulty.bounty_for_difficulty + SScapitalism.base_account.credit(target_storage.quest_difficulty.bounty_for_difficulty, "Награда за выполнение корпоративного задания.", "Biesel TCD Terminal #[rand(111,333)]", "Отдел развития Нанотрейзен") + return max_reward /datum/controller/subsystem/cargo_quests/proc/remove_bfl_quests(count) @@ -182,6 +198,9 @@ SUBSYSTEM_DEF(cargo_quests) var/max_quest_time var/for_easy_mode + //How many shekels will be given for the complexity to the base_account account + var/bounty_for_difficulty = 0 + /datum/quest_difficulty/proc/generate_timer(datum/cargo_quests_storage/q_storage) q_storage.time_start = world.time q_storage.quest_time = rand(min_quest_time, max_quest_time) MINUTES @@ -194,6 +213,7 @@ SUBSYSTEM_DEF(cargo_quests) min_quest_time = 15 max_quest_time = 25 for_easy_mode = TRUE + bounty_for_difficulty = 150 /datum/quest_difficulty/normal diff_flag = QUEST_DIFFICULTY_NORMAL @@ -201,18 +221,21 @@ SUBSYSTEM_DEF(cargo_quests) min_quest_time = 20 max_quest_time = 30 for_easy_mode = TRUE + bounty_for_difficulty = 300 /datum/quest_difficulty/hard diff_flag = QUEST_DIFFICULTY_HARD weight = 14 min_quest_time = 30 max_quest_time = 40 + bounty_for_difficulty = 500 /datum/quest_difficulty/very_hard diff_flag = QUEST_DIFFICULTY_VERY_HARD weight = 4 min_quest_time = 30 max_quest_time = 60 + bounty_for_difficulty = 1000 #undef NUMBER_OF_CC_QUEST diff --git a/code/game/gamemodes/scoreboard.dm b/code/game/gamemodes/scoreboard.dm index 4fa41cae2b4..31de44198d5 100644 --- a/code/game/gamemodes/scoreboard.dm +++ b/code/game/gamemodes/scoreboard.dm @@ -353,7 +353,14 @@ GLOBAL_VAR(scoreboard) // Variable to save the scoreboard string once it's been Прочее
Съедено еды: [score_food_eaten] [declension_ru(score_food_eaten, "укус", "укуса", "укусов")]/[declension_ru(score_food_eaten, "глоток", "глотка", "глотков")].
- Клоуна избили: [score_clown_abuse] [declension_ru(score_clown_abuse, "раз", "раза", "раз")]

"} + Клоуна избили: [score_clown_abuse] [declension_ru(score_clown_abuse, "раз", "раза", "раз")]

+ + Финансовая статистка
+ Выплачено персоналу зарплат на сумму: [SScapitalism.total_salary_payment].
+ Поступило денег с выполнения заказов карго на счет станции: [SScapitalism.total_station_bounty].
+ Поступило денег с выполнения заказов карго на счет карго: [SScapitalism.total_cargo_bounty].
+ Общая сумма наград выплаченная персоналу за помощь в выполнении заказов карго: [SScapitalism.total_personal_bounty].
+ Доход от автоматов: [SScapitalism.income_vedromat].

"} if(score_escapees) dat += "Самый богатый из эвакуировавшихся: [richest_name], [richest_job]: $[num2text(richest_cash, 50)] ([richest_key])
" diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm index d80bcfa5b23..cd6b328235e 100644 --- a/code/game/jobs/job/civilian.dm +++ b/code/game/jobs/job/civilian.dm @@ -1,3 +1,5 @@ +#define SALARY_FOR_NISHEBROD 60 + /datum/job/civilian title = JOB_TITLE_CIVILIAN flag = JOB_FLAG_CIVILIAN @@ -10,9 +12,12 @@ access = list() //See /datum/job/assistant/get_access() minimal_access = list() //See /datum/job/assistant/get_access() alt_titles = list("Tourist","Businessman","Trader","Assistant") - random_money_factor = TRUE outfit = /datum/outfit/job/assistant + salary = SALARY_FOR_NISHEBROD + min_start_money = 10 + max_start_money = 200 + /datum/job/civilian/get_access() if(CONFIG_GET(flag/assistant_maint)) return list(ACCESS_MAINT_TUNNELS) @@ -27,4 +32,4 @@ l_pocket = /obj/item/paper/deltainfo shoes = /obj/item/clothing/shoes/black - +#undef SALARY_FOR_NISHEBROD diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm index 1678e4c3d90..ec9a69f772c 100644 --- a/code/game/jobs/job/engineering.dm +++ b/code/game/jobs/job/engineering.dm @@ -21,9 +21,12 @@ min_age_allowed = 30 exp_requirements = 3000 exp_type = EXP_TYPE_ENGINEERING - money_factor = 7 outfit = /datum/outfit/job/chief_engineer + salary = 300 + min_start_money = 400 + max_start_money = 700 + /datum/outfit/job/chief_engineer name = "Chief Engineer" jobtype = /datum/job/chief_engineer @@ -64,9 +67,12 @@ minimal_player_age = 7 exp_requirements = 600 exp_type = EXP_TYPE_ENGINEERING - money_factor = 3 outfit = /datum/outfit/job/engineer + salary = 150 + min_start_money = 200 + max_start_money = 400 + /datum/outfit/job/engineer name = "Station Engineer" jobtype = /datum/job/engineer @@ -100,9 +106,12 @@ exp_max = 600 exp_type_max = EXP_TYPE_ENGINEERING is_novice = TRUE - money_factor = 2 outfit = /datum/outfit/job/engineer/trainee + salary = 150 + min_start_money = 200 + max_start_money = 400 + /datum/outfit/job/engineer/trainee name = "Trainee Engineer" jobtype = /datum/job/engineer/trainee @@ -149,9 +158,12 @@ minimal_player_age = 7 exp_requirements = 900 exp_type = EXP_TYPE_ENGINEERING - money_factor = 4 outfit = /datum/outfit/job/atmos + salary = 150 + min_start_money = 200 + max_start_money = 400 + /datum/outfit/job/atmos name = "Life Support Specialist" jobtype = /datum/job/atmos @@ -183,9 +195,12 @@ minimal_access = list(ACCESS_MAINT_TUNNELS, ACCESS_EMERGENCY_STORAGE, ACCESS_MECHANIC, ACCESS_EXTERNAL_AIRLOCKS, ACCESS_MINERAL_STOREROOM) exp_requirements = 900 exp_type = EXP_TYPE_ENGINEERING - money_factor = 3 outfit = /datum/outfit/job/mechanic + salary = 150 + min_start_money = 200 + max_start_money = 400 + /datum/outfit/job/mechanic name = "Mechanic" jobtype = /datum/job/mechanic diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm index 71c06a2c40f..81a2eec7563 100644 --- a/code/game/jobs/job/job.dm +++ b/code/game/jobs/job/job.dm @@ -66,9 +66,10 @@ var/spawn_ert = 0 var/syndicate_command = 0 - var/money_factor = 1 // multiplier of starting funds - var/random_money_factor = FALSE // is miltiplier randomized (from 4x to 0.25x for now) - + var/salary = 0 + var/min_start_money = 0 + var/max_start_money = 0 + var/outfit = null ///////////////////////////////// diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm index 12a4359c902..5c05556fc24 100644 --- a/code/game/jobs/job/medical.dm +++ b/code/game/jobs/job/medical.dm @@ -19,9 +19,12 @@ min_age_allowed = 30 exp_requirements = 3000 exp_type = EXP_TYPE_MEDICAL - money_factor = 7 outfit = /datum/outfit/job/cmo + salary = 300 + min_start_money = 400 + max_start_money = 700 + /datum/outfit/job/cmo name = JOB_TITLE_CMO jobtype = /datum/job/cmo @@ -60,9 +63,12 @@ minimal_player_age = 3 exp_requirements = 600 exp_type = EXP_TYPE_MEDICAL - money_factor = 3 outfit = /datum/outfit/job/doctor + salary = 150 + min_start_money = 200 + max_start_money = 400 + /datum/outfit/job/doctor name = JOB_TITLE_DOCTOR jobtype = /datum/job/doctor @@ -94,9 +100,12 @@ exp_max = 600 exp_type_max = EXP_TYPE_MEDICAL is_novice = TRUE - money_factor = 2 outfit = /datum/outfit/job/doctor/intern + salary = 150 + min_start_money = 200 + max_start_money = 400 + /datum/outfit/job/doctor/intern name = JOB_TITLE_INTERN jobtype = /datum/job/doctor/intern @@ -140,9 +149,12 @@ minimal_player_age = 3 exp_requirements = 180 exp_type = EXP_TYPE_CREW - money_factor = 3 outfit = /datum/outfit/job/coroner + salary = 150 + min_start_money = 200 + max_start_money = 400 + /datum/outfit/job/coroner name = "Coroner" jobtype = /datum/job/coroner @@ -204,9 +216,12 @@ minimal_player_age = 7 exp_requirements = 600 exp_type = EXP_TYPE_MEDICAL - money_factor = 4 outfit = /datum/outfit/job/chemist + salary = 150 + min_start_money = 200 + max_start_money = 400 + /datum/outfit/job/chemist name = "Chemist" jobtype = /datum/job/chemist @@ -239,9 +254,12 @@ minimal_player_age = 3 exp_requirements = 900 exp_type = EXP_TYPE_MEDICAL - money_factor = 4 outfit = /datum/outfit/job/geneticist + salary = 150 + min_start_money = 200 + max_start_money = 400 + /datum/outfit/job/geneticist name = "Geneticist" jobtype = /datum/job/geneticist @@ -275,9 +293,12 @@ minimal_player_age = 7 exp_requirements = 900 exp_type = EXP_TYPE_MEDICAL - money_factor = 4 outfit = /datum/outfit/job/virologist + salary = 150 + min_start_money = 200 + max_start_money = 400 + /datum/outfit/job/virologist name = "Virologist" jobtype = /datum/job/virologist @@ -309,9 +330,12 @@ access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_GENETICS, ACCESS_PSYCHIATRIST) minimal_access = list(ACCESS_MEDICAL, ACCESS_PSYCHIATRIST) alt_titles = list("Psychologist","Therapist") - money_factor = 3 outfit = /datum/outfit/job/psychiatrist + salary = 150 + min_start_money = 200 + max_start_money = 400 + /datum/outfit/job/psychiatrist name = "Psychiatrist" jobtype = /datum/job/psychiatrist @@ -351,9 +375,12 @@ minimal_player_age = 3 exp_requirements = 180 exp_type = EXP_TYPE_CREW - money_factor = 3 outfit = /datum/outfit/job/paramedic + salary = 150 + min_start_money = 200 + max_start_money = 400 + /datum/outfit/job/paramedic name = "Paramedic" jobtype = /datum/job/paramedic diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm index 1228c2f49d7..90f25de2c95 100644 --- a/code/game/jobs/job/science.dm +++ b/code/game/jobs/job/science.dm @@ -25,9 +25,12 @@ required_objectives = list( /datum/job_objective/further_research ) - money_factor = 8 outfit = /datum/outfit/job/rd + salary = 300 + min_start_money = 400 + max_start_money = 700 + /datum/outfit/job/rd name = "Research Director" @@ -70,9 +73,11 @@ required_objectives = list( /datum/job_objective/further_research ) - money_factor = 4 outfit = /datum/outfit/job/scientist + salary = 200 + min_start_money = 250 + max_start_money = 500 /datum/outfit/job/scientist name = "Scientist" @@ -103,9 +108,12 @@ exp_max = 600 exp_type_max = EXP_TYPE_SCIENCE is_novice = TRUE - money_factor = 2 outfit = /datum/outfit/job/scientist/student + salary = 200 + min_start_money = 250 + max_start_money = 500 + /datum/outfit/job/scientist/student name = "Student Scientist" jobtype = /datum/job/scientist/student @@ -146,10 +154,12 @@ minimal_player_age = 3 exp_requirements = 900 exp_type = EXP_TYPE_SCIENCE - - money_factor = 3 outfit = /datum/outfit/job/roboticist + salary = 200 + min_start_money = 250 + max_start_money = 500 + /datum/outfit/job/roboticist name = "Roboticist" jobtype = /datum/job/roboticist diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm index e83d11c8a29..56d0a76681b 100644 --- a/code/game/jobs/job/security.dm +++ b/code/game/jobs/job/security.dm @@ -23,9 +23,12 @@ exp_requirements = 3000 exp_type = EXP_TYPE_SECURITY disabilities_allowed = 0 - money_factor = 7 outfit = /datum/outfit/job/hos + salary = 300 + min_start_money = 400 + max_start_money = 700 + /datum/outfit/job/hos name = "Head of Security" jobtype = /datum/job/hos @@ -75,9 +78,12 @@ blocked_race_for_job = list(SPECIES_VOX) exp_requirements = 2100 exp_type = EXP_TYPE_SECURITY - money_factor = 6 outfit = /datum/outfit/job/warden + salary = 170 + min_start_money = 200 + max_start_money = 550 + /datum/outfit/job/warden name = "Warden" jobtype = /datum/job/warden @@ -106,8 +112,6 @@ dufflebag = /obj/item/storage/backpack/duffel/security box = /obj/item/storage/box/survival_security/warden - - /datum/job/detective title = JOB_TITLE_DETECTIVE flag = JOB_FLAG_DETECTIVE @@ -125,9 +129,12 @@ exp_requirements = 1200 blocked_race_for_job = list(SPECIES_VOX) exp_type = EXP_TYPE_SECURITY - money_factor = 4 outfit = /datum/outfit/job/detective + salary = 170 + min_start_money = 200 + max_start_money = 550 + /datum/outfit/job/detective name = "Detective" jobtype = /datum/job/detective @@ -186,9 +193,12 @@ blocked_race_for_job = list(SPECIES_VOX) exp_requirements = 600 exp_type = EXP_TYPE_CREW - money_factor = 3 outfit = /datum/outfit/job/officer + salary = 170 + min_start_money = 200 + max_start_money = 550 + /datum/outfit/job/officer name = "Security Officer" jobtype = /datum/job/officer @@ -251,9 +261,12 @@ blocked_race_for_job = list(SPECIES_VOX) exp_requirements = 1800 exp_type = EXP_TYPE_MEDICAL - money_factor = 4 outfit = /datum/outfit/job/brigdoc + salary = 170 + min_start_money = 200 + max_start_money = 550 + /datum/outfit/job/brigdoc name = "Brig Physician" jobtype = /datum/job/brigdoc @@ -289,9 +302,12 @@ blocked_race_for_job = list(SPECIES_VOX) exp_requirements = 1200 exp_type = EXP_TYPE_SECURITY - money_factor = 4 outfit = /datum/outfit/job/pilot + salary = 170 + min_start_money = 200 + max_start_money = 550 + /datum/outfit/job/pilot name = "Security Pod Pilot" jobtype = /datum/job/pilot diff --git a/code/game/jobs/job/supervisor.dm b/code/game/jobs/job/supervisor.dm index 59c77b5c68d..3962ccab4d5 100644 --- a/code/game/jobs/job/supervisor.dm +++ b/code/game/jobs/job/supervisor.dm @@ -18,9 +18,12 @@ GLOBAL_DATUM_INIT(captain_announcement, /datum/announcement/minor, new(do_newsca exp_requirements = 3000 exp_type = EXP_TYPE_COMMAND disabilities_allowed = 0 - money_factor = 10 outfit = /datum/outfit/job/captain + salary = 500 + min_start_money = 600 + max_start_money = 1200 + /datum/job/captain/get_access() return get_all_accesses() @@ -85,9 +88,12 @@ GLOBAL_DATUM_INIT(captain_announcement, /datum/announcement/minor, new(do_newsca ACCESS_CREMATORIUM, ACCESS_KITCHEN, ACCESS_HYDROPONICS, ACCESS_LAWYER, ACCESS_THEATRE, ACCESS_CHAPEL_OFFICE, ACCESS_LIBRARY, ACCESS_RESEARCH, ACCESS_HEADS_VAULT, ACCESS_MINING_STATION, ACCESS_CLOWN, ACCESS_MIME, ACCESS_HOP, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM) - money_factor = 9 outfit = /datum/outfit/job/hop + salary = 300 + min_start_money = 400 + max_start_money = 700 + /datum/outfit/job/hop name = "Head of Personnel" jobtype = /datum/job/hop @@ -139,9 +145,12 @@ GLOBAL_DATUM_INIT(captain_announcement, /datum/announcement/minor, new(do_newsca ACCESS_THEATRE, ACCESS_CHAPEL_OFFICE, ACCESS_LIBRARY, ACCESS_RESEARCH, ACCESS_MINING, ACCESS_HEADS_VAULT, ACCESS_MINING_STATION, ACCESS_CLOWN, ACCESS_MIME, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_WEAPONS, ACCESS_NTREP) alt_titles = list("NT Consultant","Central Command Consultant") - money_factor = 9 outfit = /datum/outfit/job/nanotrasenrep + salary = 300 + min_start_money = 400 + max_start_money = 700 + /datum/outfit/job/nanotrasenrep name = "Nanotrasen Representative" jobtype = /datum/job/nanotrasenrep @@ -158,8 +167,6 @@ GLOBAL_DATUM_INIT(captain_announcement, /datum/announcement/minor, new(do_newsca ) implants = list(/obj/item/implant/mindshield/ert) - - /datum/job/blueshield title = JOB_TITLE_BLUESHIELD flag = JOB_FLAG_BLUESHIELD @@ -185,9 +192,12 @@ GLOBAL_DATUM_INIT(captain_announcement, /datum/announcement/minor, new(do_newsca ACCESS_CLOWN, ACCESS_MIME, ACCESS_HOP, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_WEAPONS, ACCESS_BLUESHIELD) minimal_access = list(ACCESS_FORENSICS_LOCKERS, ACCESS_SEC_DOORS, ACCESS_MEDICAL, ACCESS_CONSTRUCTION, ACCESS_ENGINE, ACCESS_MAINT_TUNNELS, ACCESS_RESEARCH, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_HEADS, ACCESS_BLUESHIELD, ACCESS_WEAPONS) - money_factor = 7 outfit = /datum/outfit/job/blueshield + salary = 300 + min_start_money = 400 + max_start_money = 700 + /datum/outfit/job/blueshield name = "Blueshield" jobtype = /datum/job/blueshield @@ -240,9 +250,12 @@ GLOBAL_DATUM_INIT(captain_announcement, /datum/announcement/minor, new(do_newsca ACCESS_CLOWN, ACCESS_MIME, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MAGISTRATE) minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_MAINT_TUNNELS, ACCESS_LAWYER, ACCESS_MAGISTRATE, ACCESS_HEADS) alt_titles = list("Judge") - money_factor = 9 outfit = /datum/outfit/job/judge + salary = 170 + min_start_money = 200 + max_start_money = 550 + /datum/outfit/job/judge name = "Magistrate" jobtype = /datum/job/judge @@ -286,9 +299,12 @@ GLOBAL_DATUM_INIT(captain_announcement, /datum/announcement/minor, new(do_newsca blocked_race_for_job = list(SPECIES_VOX) exp_requirements = 3000 exp_type = EXP_TYPE_CREW - money_factor = 6 outfit = /datum/outfit/job/lawyer + salary = 170 + min_start_money = 200 + max_start_money = 550 + /datum/outfit/job/lawyer name = "Internal Affairs Agent" jobtype = /datum/job/lawyer diff --git a/code/game/jobs/job/support.dm b/code/game/jobs/job/support.dm index 970b3753a3d..7b43af99d36 100644 --- a/code/game/jobs/job/support.dm +++ b/code/game/jobs/job/support.dm @@ -15,9 +15,13 @@ exp_requirements = 3000 exp_type = EXP_TYPE_CREW alt_titles = list("Chief Supply Manager") - money_factor = 6 outfit = /datum/outfit/job/qm + //QM IS NOT THE HEAD!! + salary = 300 + min_start_money = 400 + max_start_money = 700 + /datum/outfit/job/qm name = "Quartermaster" jobtype = /datum/job/qm @@ -50,9 +54,12 @@ access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_MINT, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM) minimal_access = list(ACCESS_MAINT_TUNNELS, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_MAILSORTING, ACCESS_MINERAL_STOREROOM) alt_titles = list("Supply Manager","Loader") - money_factor = 2 outfit = /datum/outfit/job/cargo_tech + salary = 100 + min_start_money = 100 + max_start_money = 300 + /datum/outfit/job/cargo_tech name = "Cargo Technician" jobtype = /datum/job/cargo_tech @@ -78,9 +85,12 @@ access = list(ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_MINT, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM) minimal_access = list(ACCESS_MINING, ACCESS_MINT, ACCESS_MINING_STATION, ACCESS_MAILSORTING, ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM) alt_titles = list("Spelunker") - money_factor = 3 outfit = /datum/outfit/job/mining + salary = 100 + min_start_money = 100 + max_start_money = 300 + /datum/outfit/job/mining name = "Shaft Miner" jobtype = /datum/job/mining @@ -142,9 +152,12 @@ access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM) minimal_access = list(ACCESS_BAR, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM) alt_titles = list("Barman","Barkeeper","Drink Artist") - money_factor = 2 outfit = /datum/outfit/job/bartender + salary = 100 + min_start_money = 100 + max_start_money = 300 + /datum/outfit/job/bartender name = "Bartender" jobtype = /datum/job/bartender @@ -181,9 +194,12 @@ access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE) minimal_access = list(ACCESS_KITCHEN) alt_titles = list("Cook","Culinary Artist","Butcher") - money_factor = 2 outfit = /datum/outfit/job/chef + salary = 100 + min_start_money = 100 + max_start_money = 300 + /datum/outfit/job/chef name = "Chef" jobtype = /datum/job/chef @@ -232,9 +248,12 @@ alt_titles = list("Hydroponicist", "Botanical Researcher") exp_requirements = 300 exp_type = EXP_TYPE_CREW - money_factor = 2 outfit = /datum/outfit/job/hydro + salary = 100 + min_start_money = 100 + max_start_money = 300 + /datum/outfit/job/hydro name = "Botanist" jobtype = /datum/job/hydro @@ -266,9 +285,12 @@ access = list(ACCESS_CLOWN, ACCESS_THEATRE) minimal_access = list(ACCESS_CLOWN, ACCESS_THEATRE) alt_titles = list("Performance Artist","Comedian","Jester") - money_factor = 2 outfit = /datum/outfit/job/clown + salary = 100 + min_start_money = 100 + max_start_money = 300 + /datum/outfit/job/clown name = "Clown" jobtype = /datum/job/clown @@ -481,9 +503,12 @@ access = list(ACCESS_MIME, ACCESS_THEATRE) minimal_access = list(ACCESS_MIME, ACCESS_THEATRE) alt_titles = list("Panthomimist") - money_factor = 2 outfit = /datum/outfit/job/mime + salary = 100 + min_start_money = 100 + max_start_money = 300 + /datum/outfit/job/mime name = "Mime" jobtype = /datum/job/mime @@ -536,9 +561,12 @@ access = list(ACCESS_JANITOR, ACCESS_MAINT_TUNNELS) minimal_access = list(ACCESS_JANITOR, ACCESS_MAINT_TUNNELS) alt_titles = list("Custodial Technician","Sanitation Technician") - money_factor = 2 outfit = /datum/outfit/job/janitor + salary = 100 + min_start_money = 100 + max_start_money = 300 + /datum/outfit/job/janitor name = "Janitor" jobtype = /datum/job/janitor @@ -563,9 +591,12 @@ access = list(ACCESS_LIBRARY) minimal_access = list(ACCESS_LIBRARY) alt_titles = list("Journalist") - money_factor = 2 outfit = /datum/outfit/job/librarian + salary = 100 + min_start_money = 100 + max_start_money = 300 + /datum/outfit/job/librarian name = "Librarian" jobtype = /datum/job/librarian @@ -593,9 +624,12 @@ alt_titles = list("Hair Stylist","Beautician") access = list() minimal_access = list() - money_factor = 2 outfit = /datum/outfit/job/barber + salary = 100 + min_start_money = 100 + max_start_money = 300 + /datum/outfit/job/barber name = "Barber" jobtype = /datum/job/barber @@ -622,6 +656,10 @@ outfit = /datum/outfit/job/explorer hidden_from_job_prefs = TRUE + salary = 100 + min_start_money = 100 + max_start_money = 300 + /datum/outfit/job/explorer // This outfit is never used, because there are no slots for this job. // To get it, you have to go to the HOP and ask for a transfer to it. diff --git a/code/game/jobs/job/support_chaplain.dm b/code/game/jobs/job/support_chaplain.dm index ed4db93076c..58fc8953f87 100644 --- a/code/game/jobs/job/support_chaplain.dm +++ b/code/game/jobs/job/support_chaplain.dm @@ -12,8 +12,12 @@ access = list(ACCESS_MORGUE, ACCESS_CHAPEL_OFFICE, ACCESS_CREMATORIUM, ACCESS_MAINT_TUNNELS) minimal_access = list(ACCESS_MORGUE, ACCESS_CHAPEL_OFFICE, ACCESS_CREMATORIUM, ACCESS_MAINT_TUNNELS) alt_titles = list("Priest","Monk","Preacher","Reverend","Oracle","Nun","Imam","Exorcist") - money_factor = 2 outfit = /datum/outfit/job/chaplain + + //God will not give you a salary roflcat + salary = 60 + min_start_money = 10 + max_start_money = 200 /datum/outfit/job/chaplain name = "Chaplain" diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm index 78f07e7dad4..f3e83ca3077 100644 --- a/code/game/machinery/computer/card.dm +++ b/code/game/machinery/computer/card.dm @@ -529,6 +529,8 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) modify.access = access modify.rank = t1 modify.assignment = assignment + SSjobs.account_job_transfer(modify.registered_name, t1) + regenerate_id_name() return if("demote") @@ -559,6 +561,8 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) modify.access = access modify.assignment = "Demoted" modify.icon_state = "id" + + SSjobs.account_job_transfer(modify.registered_name, JOB_TITLE_CIVILIAN) regenerate_id_name() return if("terminate") @@ -583,6 +587,8 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) job.current_positions-- modify.assignment = "Terminated" modify.access = list() + + SSjobs.account_job_transfer(modify.registered_name, modify.rank, FALSE) regenerate_id_name() return if("make_job_available") // MAKE ANOTHER JOB POSITION AVAILABLE FOR LATE JOINERS diff --git a/code/game/objects/items/weapons/cash.dm b/code/game/objects/items/weapons/cash.dm index 0e3ab7cd767..e7b1c7df2f5 100644 --- a/code/game/objects/items/weapons/cash.dm +++ b/code/game/objects/items/weapons/cash.dm @@ -88,6 +88,13 @@ /obj/item/stack/spacecash/c1000000 amount = 1000000 +//A crutch for the vending machine, well, or an ingenious roflcat solution +/obj/item/stack/spacecash/magic_linked/Initialize(mapload, new_amount = 150, merge = TRUE) + . = ..() + //roflcat + if(loc) + SScapitalism.payment_account.credit(new_amount * -1, "Выдача наличности") + ///// USSP space cash /obj/item/stack/spacecash/ussp diff --git a/code/modules/economy/Accounts.dm b/code/modules/economy/Accounts.dm index 21692addc8f..a675e47bfaa 100644 --- a/code/modules/economy/Accounts.dm +++ b/code/modules/economy/Accounts.dm @@ -3,15 +3,30 @@ #define STATION_START_CASH 75000 #define STATION_SOURCE_TERMINAL "Biesel GalaxyNet Terminal #227" #define DEPARTMENT_START_CASH 5000 +#define NISHEBROD_SALARY 0 GLOBAL_VAR_INIT(num_financial_terminals, 1) GLOBAL_DATUM(station_account, /datum/money_account) GLOBAL_LIST_EMPTY(department_accounts) +GLOBAL_LIST_EMPTY(active_salary_system) GLOBAL_VAR_INIT(next_account_number, 0) GLOBAL_DATUM(centcomm_account_db, /obj/machinery/computer/account_database) // this being an object hurts me deeply on the inside GLOBAL_DATUM(vendor_account, /datum/money_account) GLOBAL_LIST_EMPTY(all_money_accounts) +GLOBAL_DATUM(CC_account, /datum/money_account) + +/proc/create_CC_account() + if(!GLOB.CC_account) + GLOB.next_account_number = rand(111111, 999999) + + GLOB.CC_account = new() + GLOB.CC_account.owner_name = "Account of the personnel department of the Central Command" + GLOB.CC_account.account_number = rand(111111, 999999) + GLOB.CC_account.remote_access_pin = rand(111111, 999999) + GLOB.CC_account.money = INFINITY + GLOB.CC_account.security_level = 2 + /proc/create_station_account() if(!GLOB.station_account) GLOB.next_account_number = rand(111111, 999999) @@ -50,13 +65,15 @@ GLOBAL_LIST_EMPTY(all_money_accounts) //the current ingame time (hh:mm:ss) can be obtained by calling: //station_time_timestamp("hh:mm:ss") -/proc/create_account(var/new_owner_name = "Default user", var/starting_funds = 0, var/obj/machinery/computer/account_database/source_db) +/proc/create_account(var/new_owner_name = "Default user", var/starting_funds = 0, var/obj/machinery/computer/account_database/source_db, var/datum/job/link_job = /datum/job ,var/salary_active = FALSE) //create a new account var/datum/money_account/M = new() M.owner_name = new_owner_name M.remote_access_pin = rand(111111, 999999) M.money = starting_funds + M.linked_job = link_job + M.salary_payment_active = salary_active //create an entry in the account transaction log for when it was created var/datum/transaction/T = new() @@ -122,9 +139,25 @@ GLOBAL_LIST_EMPTY(all_money_accounts) //1 - require manual login / account number and pin //2 - require card and manual login + var/datum/job/linked_job = /datum/job + var/salary_payment_active = FALSE + /datum/money_account/New() ..() +/datum/money_account/proc/notify_pda_owner(var/text, var/noti = FALSE) + for(var/obj/item/pda/send_pda in GLOB.PDAs) + if(owner_name == send_pda.owner) + var/datum/data/pda/app/messenger/PM = send_pda.find_program(/datum/data/pda/app/messenger) + + if(PM && PM.can_receive()) + PM.notify(text, noti) + return TRUE + + return FALSE + + return FALSE + /datum/transaction var/target_name = "" var/purpose = "" @@ -156,6 +189,11 @@ GLOBAL_LIST_EMPTY(all_money_accounts) if(D.account_number == account_number) return D +/proc/get_account_with_name(var/name_owner) + for(var/datum/money_account/D in GLOB.all_money_accounts) + if(D.owner_name == name_owner) + return D + /proc/attempt_account_access_nosec(var/attempt_account_number) for(var/datum/money_account/D in GLOB.all_money_accounts) if(D.account_number == attempt_account_number) @@ -166,3 +204,4 @@ GLOBAL_LIST_EMPTY(all_money_accounts) #undef STATION_START_CASH #undef STATION_SOURCE_TERMINAL #undef DEPARTMENT_START_CASH +#undef NISHEBROD_SALARY diff --git a/code/modules/economy/Accounts_DB.dm b/code/modules/economy/Accounts_DB.dm index 9623b112db6..0fdb5366ca3 100644 --- a/code/modules/economy/Accounts_DB.dm +++ b/code/modules/economy/Accounts_DB.dm @@ -25,16 +25,7 @@ GLOBAL_VAR(current_date_string) // If someone ever makes a map without one of these consoles, the entire eco AND date system breaks // This upsets me a lot // AA Todo: SSeconomy - if(!GLOB.station_account) - create_station_account() - - if(GLOB.department_accounts.len == 0) - for(var/department in GLOB.station_departments) - create_department_account(department) - if(!GLOB.vendor_account) - create_department_account("Vendor") - GLOB.vendor_account = GLOB.department_accounts["Vendor"] - + if(!GLOB.current_date_string) GLOB.current_date_string = "[time2text(world.timeofday, "DD Month")], [GLOB.game_year]" diff --git a/code/modules/economy/quests/_base_quests.dm b/code/modules/economy/quests/_base_quests.dm index bae0596cd74..8269de032ae 100644 --- a/code/modules/economy/quests/_base_quests.dm +++ b/code/modules/economy/quests/_base_quests.dm @@ -152,7 +152,11 @@ var/list/req_items = list() ///possible difficultly var/difficultly_flags - + + + var/cargo_quest_reward = 0 //The reward for the quest, consider the debut of the roflcat + var/list/bounty_jobs = list() //Positions that will be paid. (Noooo I won't do part of this in new) + var/linked_departament = "Cargo" //The department key is specified to take it from the global list, no, I will not upload to new, I'm afraid to break even /datum/cargo_quest/New(storage, read_datum = FALSE) if(!read_datum) diff --git a/code/modules/economy/quests/centcomm_departaments.dm b/code/modules/economy/quests/centcomm_departaments.dm index 6611f2dc281..ae3fbcc07ba 100644 --- a/code/modules/economy/quests/centcomm_departaments.dm +++ b/code/modules/economy/quests/centcomm_departaments.dm @@ -7,7 +7,14 @@ #define GROUP_MATERIALS "Raw Materials" #define GROUP_VEND "Vending" +#define PERCENTAGE_PAYMENTS_STATION 0.25 //25 percent on the account of the station +#define PERCENTAGE_PAYMENTS_CARGO 0.6 //60 percent on the cargo account +#define PERCENTAGE_PAYMENTS_PERSONAL 0.15 //15 percent on the account of the beggars + #define POINT_TO_CREDITS 10 +#define COMMERCIAL_MODIFIER 3 + +//Give up hope, hope, everyone who enters here /datum/quest_customer var/departament_name @@ -40,7 +47,7 @@ /datum/quest_customer/proc/get_difficulty() return -/datum/quest_customer/proc/send_reward(reward) +/datum/quest_customer/proc/send_reward(reward, var/list/copmpleted_quests = list()) return FALSE /datum/quest_customer/proc/special(datum/cargo_quests_storage/quest) @@ -165,13 +172,29 @@ group_name = "corporation" /datum/quest_customer/corp/change_reward(datum/cargo_quests_storage/quest) - quest.reward *= POINT_TO_CREDITS - -/datum/quest_customer/corp/send_reward(reward) - var/datum/money_account/station_money_account = GLOB.station_account - station_money_account.credit(round(reward/4), "Completed Order!", "Biesel TCD Terminal #[rand(111,333)]", "Station Account") + quest.reward *= POINT_TO_CREDITS * COMMERCIAL_MODIFIER + +/datum/quest_customer/corp/send_reward(reward, var/list/copmpleted_quests = list()) + var/list/nishebrod_jobs = list() + var/list/linked_departaments = list() //HEHE HI HA + var/personals_reward = round(reward * PERCENTAGE_PAYMENTS_PERSONAL) + for(var/datum/cargo_quest/quest in copmpleted_quests) + nishebrod_jobs |= quest.bounty_jobs + linked_departaments |= quest.linked_departament + + //If not, it pays to the account of the department + if(!SScapitalism.smart_bounty_payment(nishebrod_jobs, personals_reward)) + SScapitalism.smart_departament_payment(linked_departaments, personals_reward) + + SScapitalism.total_station_bounty += round(reward * PERCENTAGE_PAYMENTS_STATION) + var/datum/money_account/station_money_account = SScapitalism.base_account + station_money_account.credit(round(reward * PERCENTAGE_PAYMENTS_STATION), "Completed Order!", "Biesel TCD Terminal #[rand(111,333)]", "Station Account") + + + SScapitalism.total_cargo_bounty += round(reward * PERCENTAGE_PAYMENTS_CARGO) var/datum/money_account/cargo_money_account = GLOB.department_accounts["Cargo"] - cargo_money_account.credit(round(reward/4*3), "Completed Order!", "Biesel TCD Terminal #[rand(111,333)]", "Cargo Account") + cargo_money_account.credit(round(reward * PERCENTAGE_PAYMENTS_CARGO), "Completed Order!", "Biesel TCD Terminal #[rand(111,333)]", "Cargo Account") + return TRUE @@ -228,3 +251,8 @@ #undef GROUP_VEND #undef POINT_TO_CREDITS +#undef COMMERCIAL_MODIFIER + +#undef PERCENTAGE_PAYMENTS_STATION +#undef PERCENTAGE_PAYMENTS_CARGO +#undef PERCENTAGE_PAYMENTS_PERSONAL diff --git a/code/modules/economy/quests/reagents_quests.dm b/code/modules/economy/quests/reagents_quests.dm index 1f43b62b7f7..fbb0bdb7754 100644 --- a/code/modules/economy/quests/reagents_quests.dm +++ b/code/modules/economy/quests/reagents_quests.dm @@ -1,6 +1,11 @@ +//Abandon hope, everyone who enters here + +//When changing reagents, remember about the horror hidden under the hood /datum/cargo_quest/reagents quest_type_name = "Chemical" req_items = list(/obj/item/reagent_containers) + bounty_jobs = (JOB_TITLE_CHEMIST) + linked_departament = "Medical" difficultly_flags = (QUEST_DIFFICULTY_EASY|QUEST_DIFFICULTY_NORMAL) @@ -50,7 +55,8 @@ var/list/possible_reagents_list = repeated_reagents.Copy() + unique_reagents.Copy() var/our_reagent = pick(possible_reagents_list) required_reagents[our_reagent] += possible_reagents_list[our_reagent] - q_storage.reward += possible_reagents_list[our_reagent]["reward"] + cargo_quest_reward = possible_reagents_list[our_reagent]["reward"] + q_storage.reward += cargo_quest_reward update_desc(our_reagent, possible_reagents_list[our_reagent]["volume"]) if(our_reagent in unique_reagents) unique_reagents.Remove(our_reagent) @@ -77,6 +83,9 @@ /datum/cargo_quest/reagents/drinks quest_type_name = "Drink" + bounty_jobs = list(JOB_TITLE_BARTENDER) + linked_departament = "Support" + repeated_reagents = list( "b52" = list("volume" = 30,"reward" = 60), "bacchus_blessing" = list("volume" = 30,"reward" = 100), diff --git a/code/modules/economy/quests/thing_quests.dm b/code/modules/economy/quests/thing_quests.dm index 372ec210764..526449da344 100644 --- a/code/modules/economy/quests/thing_quests.dm +++ b/code/modules/economy/quests/thing_quests.dm @@ -1,3 +1,4 @@ + /datum/cargo_quest/thing quest_type_name = "generic thing" var/list/easy_items @@ -66,6 +67,19 @@ /datum/cargo_quest/thing/xenobio quest_type_name = "Xenobiological extract" + bounty_jobs = list( + JOB_TITLE_CMO, + JOB_TITLE_DOCTOR, + JOB_TITLE_GENETICIST, + JOB_TITLE_PSYCHIATRIST, + JOB_TITLE_CHEMIST, + JOB_TITLE_VIROLOGIST, + JOB_TITLE_PARAMEDIC, + JOB_TITLE_CORONER, + JOB_TITLE_INTERN + ) + linked_departament = "Science" + easy_items = list( /obj/item/slime_extract/grey = 45, /obj/item/slime_extract/orange = 90, @@ -98,6 +112,19 @@ /datum/cargo_quest/thing/organs quest_type_name = "Organ" + bounty_jobs = list( + JOB_TITLE_CMO, + JOB_TITLE_DOCTOR, + JOB_TITLE_GENETICIST, + JOB_TITLE_PSYCHIATRIST, + JOB_TITLE_CHEMIST, + JOB_TITLE_VIROLOGIST, + JOB_TITLE_PARAMEDIC, + JOB_TITLE_CORONER, + JOB_TITLE_INTERN + ) + linked_departament = "Medical" + normal_items = list( /obj/item/organ/internal/eyes/tajaran = 105, /obj/item/organ/internal/eyes/vulpkanin = 105, @@ -135,6 +162,9 @@ /datum/cargo_quest/thing/foods quest_type_name = "Food" + bounty_jobs = list(JOB_TITLE_CHEF) + linked_departament = "Support" + easy_items = list( /obj/item/reagent_containers/food/snacks/friedegg = 10, /obj/item/reagent_containers/food/snacks/tofuburger = 10, @@ -212,6 +242,9 @@ /datum/cargo_quest/thing/miner quest_type_name = "Shaft Miner Loot" + bounty_jobs = list(JOB_TITLE_MINER) + linked_departament = "Cargo" + easy_items = list( /obj/item/crusher_trophy/legion_skull = 60, /obj/item/crusher_trophy/watcher_wing = 50, @@ -244,6 +277,9 @@ /datum/cargo_quest/thing/minerals quest_type_name = "Minerals" + bounty_jobs = list(JOB_TITLE_MINER) + linked_departament = "Cargo" + var/list/required_minerals = list() unique_things = FALSE var/static/list/unique_minerals = list(/obj/item/stack/sheet/bluespace_crystal, /obj/item/stack/sheet/mineral/bananium, /obj/item/stack/sheet/mineral/tranquillite) @@ -273,8 +309,8 @@ /datum/cargo_quest/thing/minerals/add_goal(difficultly) var/list/difficult_list = generate_goal_list(difficultly) var/obj/item/generated_mineral = pick(difficult_list) - - q_storage.reward += difficult_list[generated_mineral]["reward"] + cargo_quest_reward = difficult_list[generated_mineral]["reward"] + q_storage.reward += cargo_quest_reward if(!required_minerals[generated_mineral]) required_minerals += generated_mineral required_minerals[generated_mineral] += difficult_list[generated_mineral]["amount"] @@ -328,6 +364,9 @@ /datum/cargo_quest/thing/seeds quest_type_name = "Seeds" + bounty_jobs = list(JOB_TITLE_BOTANIST) + linked_departament = "Support" + easy_items = list( /obj/item/seeds/harebell = 0, //Why? - Becouse we can /obj/item/seeds/starthistle = 0, @@ -407,6 +446,9 @@ quest_type_name = "Botany Genes on Disks" item_for_show = /obj/item/disk/plantgene req_items = list(/obj/item/disk/plantgene) + bounty_jobs = list(JOB_TITLE_BOTANIST) + linked_departament = "Support" + var/list/required_genes = list() easy_items = list( /datum/plant_gene/trait/plant_type/fungal_metabolism = 60, @@ -474,6 +516,9 @@ quest_type_name = "DNA Genes" item_for_show = /obj/item/dnainjector req_items = list(/obj/item/dnainjector) + bounty_jobs = list(JOB_TITLE_GENETICIST) + linked_departament = "Medical" + var/list/required_blocks = list() normal_items = list( "LISP" = 150, @@ -578,6 +623,8 @@ quest_type_name = "Viruses symptoms in vials (10u minimum)" item_for_show = /obj/item/reagent_containers/glass/beaker/vial req_items = list(/obj/item/reagent_containers/glass/beaker/vial) + bounty_jobs = list(JOB_TITLE_VIROLOGIST) + linked_departament = "Medical" var/list/required_symptoms = list() @@ -685,6 +732,8 @@ var/list/required_mobs = list() var/list/capsules + bounty_jobs = list(JOB_TITLE_MINER) + linked_departament = "Cargo" normal_items = list( /mob/living/simple_animal/hostile/asteroid/goliath/beast = 180, @@ -706,7 +755,8 @@ /datum/cargo_quest/thing/capsule/add_goal(difficultly) var/list/difficult_list = generate_goal_list(difficultly) var/mob/generated_mob = pick(difficult_list) - q_storage.reward += difficult_list[generated_mob] + cargo_quest_reward = difficult_list[generated_mob] + q_storage.reward += cargo_quest_reward if(unique_things) difficult_list.Remove(generated_mob) diff --git a/code/modules/economy/utils.dm b/code/modules/economy/utils.dm index 28aa126ae1b..97f52f7f116 100644 --- a/code/modules/economy/utils.dm +++ b/code/modules/economy/utils.dm @@ -72,6 +72,8 @@ "Sale of [vended_name]", customer_account.owner_name) if(customer_account.owner_name == GLOB.station_account.owner_name) add_game_logs("as silicon purchased [vended_name] in [COORD(src)]", M) + + SScapitalism.income_vedromat += price //For revenue statistics from the vending machine return TRUE /datum/money_account/proc/fmtBalance() diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm index 7d829f6a3e4..30990ecdf59 100644 --- a/code/modules/shuttle/supply.dm +++ b/code/modules/shuttle/supply.dm @@ -207,13 +207,15 @@ var/datum/tech/tech = disk.stored var/cost = tech.getCost(SSshuttle.techLevels[tech.id]) + if(tech.level >= 7) + SScapitalism.base_account.credit(7000, "Благодарность за вклад в науку.", "Nanotrasen Institute terminal#[rand(111,333)]", "Nanotrasen Institute") if(cost) SSshuttle.techLevels[tech.id] = tech.level for(var/mob/mob in GLOB.player_list) if(!mob.mind) continue for(var/datum/job_objective/further_research/objective in mob.mind.job_objectives) - objective.unit_completed(cost) + objective.unit_completed(round(cost / 3)) msg += "[tech.name] - new data.
" if(istype(MA, /obj/structure/closet/critter/mecha)) diff --git a/code/modules/station_goals/station_goal.dm b/code/modules/station_goals/station_goal.dm index f3c4c3ac37f..cfedaec5193 100644 --- a/code/modules/station_goals/station_goal.dm +++ b/code/modules/station_goals/station_goal.dm @@ -2,6 +2,7 @@ // Admin button to override with your own // Sabotage objective for tators // Multiple goals with less impact but more department focused +#define STATION_GOAL_DEFAULT_BOUNTY 30000 /datum/station_goal var/name = "Generic Goal" @@ -13,6 +14,15 @@ var/list/obj/item/paper/papers_list = list() var/list/datum/supply_packs/supply_list = list() + var/station_bounty = STATION_GOAL_DEFAULT_BOUNTY + var/list/personal_reward = list( + JOB_TITLE_ENGINEER = 1000, + JOB_TITLE_ENGINEER_TRAINEE = 1000, + JOB_TITLE_ATMOSTECH = 1000, + JOB_TITLE_MECHANIC = 1000, + JOB_TITLE_CHIEF = 1500 + ) + /datum/station_goal/proc/send_report() on_report() var/directive = "Nanotrasen Directive [pick(GLOB.phonetic_alphabet)] \Roman[rand(1,50)]" diff --git a/paradise.dme b/paradise.dme index 8388324a81f..7dbe6daca52 100644 --- a/paradise.dme +++ b/paradise.dme @@ -290,6 +290,7 @@ #include "code\controllers\subsystem\air.dm" #include "code\controllers\subsystem\ambience.dm" #include "code\controllers\subsystem\asset_loading.dm" +#include "code\controllers\subsystem\capitalism.dm" #include "code\controllers\subsystem\chat.dm" #include "code\controllers\subsystem\cleanup.dm" #include "code\controllers\subsystem\dbcore.dm"