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"