diff --git a/code/__DEFINES/jobs.dm b/code/__DEFINES/jobs.dm
index 1c7596651e..bda09a66de 100644
--- a/code/__DEFINES/jobs.dm
+++ b/code/__DEFINES/jobs.dm
@@ -1,3 +1,4 @@
+#define get_job_playtime(client, job) ((client.prefs.exp[job]) ? client.prefs.exp[job] MINUTES_TO_DECISECOND : 0)
#define JOB_AVAILABLE 0
#define JOB_UNAVAILABLE_GENERIC 1
@@ -11,10 +12,13 @@
#define JOB_UNAVAILABLE_SPECIES_LIMITED 9
#define JOB_UNAVAILABLE_CLAN 10
#define JOB_UNAVAILABLE_AGE 11
+#define JOB_UNAVAILABE_TIME_LOCK 12
#define DEFAULT_RELIGION "Christianity"
#define DEFAULT_DEITY "Space Jesus"
+// Job Display on preference
+
#define JOB_DISPLAY_ORDER_DEFAULT 0
#define JOB_DISPLAY_ORDER_CITIZEN 1
@@ -45,13 +49,141 @@
#define JOB_DISPLAY_ORDER_ARCHIVIST 26
#define JOB_DISPLAY_ORDER_GIOVANNI 27
#define JOB_DISPLAY_ORDER_POLICE_CHIEF 28
-#define JOB_DISPLAY_ORDER_POLICE 29
-#define JOB_DISPLAY_ORDER_POLICE_SERGEANT 30
+#define JOB_DISPLAY_ORDER_POLICE_SERGEANT 29
+#define JOB_DISPLAY_ORDER_POLICE 30
#define JOB_DISPLAY_ORDER_FBI 31
#define JOB_DISPLAY_ORDER_VOIVODE 32
#define JOB_DISPLAY_ORDER_BOGATYR 33
#define JOB_DISPLAY_ORDER_ZADRUGA 34
+// Job Titles
+#define JOB_LIVING_ROLES /datum/timelock/living
+
+#define JOB_CIVILIAN "Citizen"
+
+#define JOB_UNALIGNED_ROLES /datum/timelock/unaligned
+#define JOB_UNALIGNED_ROLES_LIST list(JOB_CIVILIAN)
+
+#define JOB_PRINCE "Prince"
+#define JOB_CLERK "Seneschal"
+#define JOB_SHERIFF "Sheriff"
+#define JOB_HOUND "Hound"
+
+#define JOB_CAMARILLA_AUTHORITIES_ROLES /datum/timelock/camarilla_authorities
+#define JOB_CAMARILLA_AUTHORITIES_ROLES_LIST list(JOB_SHERIFF, JOB_HOUND, JOB_CLERK, JOB_PRINCE)
+
+
+#define JOB_BRUJAH "Primogen Brujah"
+#define JOB_MALKAVIAN "Primogen Malkavian"
+#define JOB_NOSFERATU "Primogen Nosferatu"
+#define JOB_TOREADOR "Primogen Toreador"
+#define JOB_VENTRUE "Primogen Ventrue"
+
+#define JOB_CAMARILLA_COUNCIL_ROLES /datum/timelock/camarilla_council
+#define JOB_CAMARILLA_COUNCIL_ROLES_LIST list(JOB_BRUJAH, JOB_MALKAVIAN,JOB_NOSFERATU, JOB_TOREADOR, JOB_VENTRUE)
+
+
+#define JOB_PRIEST "Priest"
+
+#define JOB_CHURCH_ROLES /datum/timelock/church
+#define JOB_CHURCH_ROLES_LIST list(JOB_PRIEST)
+
+
+#define JOB_GRAVEYARD "Graveyard Keeper"
+#define JOB_STREETJAN "Street Janitor"
+#define JOB_STRIP "Stripper"
+#define JOB_TAXI "Taxi Driver"
+
+
+#define JOB_CITY_SERVICES_ROLES /datum/timelock/city_services
+#define JOB_CITY_SERVICES_ROLES_LIST list(JOB_GRAVEYARD,JOB_STREETJAN, JOB_STRIP, JOB_TAXI)
+
+
+#define JOB_CLINIC_DIRECTOR "Clinic Director"
+#define JOB_DOCTOR "Doctor"
+
+
+#define JOB_CLINIC_ROLES /datum/timelock/clinic
+#define JOB_CLINIC_ROLES_LIST list(JOB_CLINIC_DIRECTOR,JOB_DOCTOR)
+
+
+#define JOB_TRIAD_GANGSTER "Triad Soldier"
+
+#define JOB_GANG_ROLES /datum/timelock/gang
+#define JOB_GANG_ROLES_LIST list(JOB_TRIAD_GANGSTER)
+
+#define JOB_BARKEEPER "Baron"
+#define JOB_EMISSARY "Emissary"
+#define JOB_BRUISER "Bruiser"
+#define JOB_SWEEPER "Sweeper"
+
+
+#define JOB_ANARCH_ROLES /datum/timelock/anarch
+#define JOB_ANARCH_ROLES_LIST list(JOB_BARKEEPER,JOB_EMISSARY,JOB_BRUISER,JOB_SWEEPER)
+
+#define JOB_DEALER "Dealer"
+#define JOB_SUPPLY "Supply Technician"
+
+#define JOB_WAREHOUSE_ROLES /datum/timelock/warehouse
+#define JOB_WAREHOUSE_ROLES_LIST list(JOB_DEALER,JOB_SUPPLY)
+
+#define JOB_REGENT "Chantry Regent"
+#define JOB_ARCHIVIST "Chantry Archivist"
+
+#define JOB_TREMERE_ROLES /datum/timelock/tremere
+#define JOB_TREMERE_ROLES_LIST list(JOB_REGENT,JOB_ARCHIVIST)
+
+#define JOB_GIOVANNI_CAPO "Capo"
+#define JOB_GIOVANNI_SQUADRA "La Squadra"
+#define JOB_GIOVANNI_FAMIGLIA "La Famiglia"
+
+#define JOB_GIOVANNI_ROLES /datum/timelock/giovanni_family
+#define JOB_GIOVANNI_ROLES_LIST list(JOB_GIOVANNI_CAPO,JOB_GIOVANNI_SQUADRA,JOB_GIOVANNI_FAMIGLIA)
+
+#define JOB_POLICE_CHIEF "Police Chief"
+#define JOB_POLICE_SERGEANT "Police Sergeant"
+#define JOB_POLICE "Police Officer"
+#define JOB_DISPATCHER "Emergency Dispatcher"
+
+#define JOB_POLICE_ROLES /datum/timelock/police_force
+#define JOB_POLICE_ROLES_LIST list(JOB_POLICE_CHIEF,JOB_POLICE_SERGEANT,JOB_POLICE,JOB_DISPATCHER)
+
+#define JOB_FBI "Federal Investigator"
+
+#define JOB_NATIONAL_SECURITY_ROLES /datum/timelock/national_security
+#define JOB_NATIONAL_SECURITY_ROLES_LIST list(JOB_FBI)
+
+#define JOB_VOIVODE "Voivode"
+#define JOB_BOGATYR "Bogatyr"
+#define JOB_ZADRUGA "Zadruga"
+
+#define JOB_TZIMISCE_MANSION_ROLES /datum/timelock/tzimisce_mansion_v
+#define JOB_TZIMISCE_MANSION_ROLES_LIST list(JOB_VOIVODE,JOB_BOGATYR,JOB_ZADRUGA)
+
+
+
+#define TIMELOCK_JOB(role_id, hours) new/datum/timelock(role_id, hours, role_id)
+
+
+
+// Used to add a timelock to a job. Will be passed onto derivatives
+#define AddTimelock(Path, timelockList) \
+##Path/setup_requirements(list/L){\
+ L += timelockList;\
+ . = ..(L);\
+}
+
+// Used to add a timelock to a job. Will be passed onto derivates. Will not include the parent's timelocks.
+#define OverrideTimelock(Path, timelockList) \
+##Path/setup_requirements(list/L){\
+ L = timelockList;\
+ . = ..(L);\
+}
+
+
+
+
+
// #define JOB_DISPLAY_ORDER_INVESTIGATOR 25
// #define JOB_DISPLAY_ORDER_CHAPLAIN 26
/*
diff --git a/code/__DEFINES/time.dm b/code/__DEFINES/time.dm
index 6cad79b8c0..b6233828f6 100644
--- a/code/__DEFINES/time.dm
+++ b/code/__DEFINES/time.dm
@@ -45,6 +45,8 @@ When using time2text(), please use "DDD" to find the weekday. Refrain from using
#define HOURS MINUTES*60
+#define MINUTES_TO_DECISECOND *600
+
#define TICKS *world.tick_lag
#define DS2TICKS(DS) ((DS)/world.tick_lag)
diff --git a/code/__HELPERS/time.dm b/code/__HELPERS/time.dm
index d9a6b5bf90..0cb96b5c8a 100644
--- a/code/__HELPERS/time.dm
+++ b/code/__HELPERS/time.dm
@@ -27,6 +27,17 @@
else
SSticker.gametime_offset = CEILING(SSticker.gametime_offset, 3600)
+/proc/deciseconds_to_time_text(deciseconds)
+ var/total_seconds = round(deciseconds / 10)
+ var/total_minutes = total_seconds / 60
+ var/hours = total_minutes / 60
+ var/minutes = total_minutes % 60
+
+ return "[round(hours)]:[minutes < 10 ? "0[minutes]" : minutes] Hours"
+
+/proc/duration2text_custom(deciseconds)
+ return deciseconds_to_time_text(deciseconds)
+
//returns timestamp in a sql and a not-quite-compliant ISO 8601 friendly format
/proc/SQLtime(timevar)
return time2text(timevar || world.timeofday, "YYYY-MM-DD hh:mm:ss")
diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm
index bf1e4be88b..6ca6021150 100644
--- a/code/controllers/subsystem/job.dm
+++ b/code/controllers/subsystem/job.dm
@@ -99,7 +99,7 @@ SUBSYSTEM_DEF(job)
return FALSE
if(!job.player_old_enough(player.client) && !bypass)
return FALSE
- if(job.required_playtime_remaining(player.client) && !bypass)
+ if(job.can_play_role(player.client) && !bypass)
return FALSE
if((player.client.prefs.generation > job.minimal_generation) && !bypass)
return FALSE
@@ -136,9 +136,8 @@ SUBSYSTEM_DEF(job)
if(!job.player_old_enough(player.client) && !bypass)
JobDebug("FOC player not old enough, Player: [player]")
continue
- if(job.required_playtime_remaining(player.client) && !bypass)
- JobDebug("FOC player not enough xp, Player: [player]")
- continue
+ if(!job.can_play_role(player.client) && !bypass)
+ JobDebug("FOC player don't got enough hours(TIMELOCK), Player: [player], Job:[job.title]")
if((player.client.prefs.generation > job.minimal_generation) && !bypass)
JobDebug("FOC player not enough generation, Player: [player]")
continue
@@ -195,9 +194,8 @@ SUBSYSTEM_DEF(job)
JobDebug("GRJ player not old enough, Player: [player]")
continue
- if(job.required_playtime_remaining(player.client))
- JobDebug("GRJ player not enough xp, Player: [player]")
- continue
+ if(!job.can_play_role(player.client))
+ JobDebug("GRJ player not enough playtime (TIMELOCK), Player: [player], Job:[job.title]")
if(player.client.prefs.generation > job.minimal_generation)
JobDebug("GRJ player not enough generation, Player: [player]")
@@ -405,10 +403,8 @@ SUBSYSTEM_DEF(job)
JobDebug("DO player not old enough, Player: [player], Job:[job.title]")
continue
- if(job.required_playtime_remaining(player.client) && !bypass)
- JobDebug("DO player not enough xp, Player: [player], Job:[job.title]")
- continue
-
+ if(!job.can_play_role(player.client) && !bypass)
+ JobDebug("DO player not enough playtime (TIMELOCK), Player: [player], Job:[job.title]")
if((player.client.prefs.generation > job.minimal_generation) && !bypass)
JobDebug("DO player not enough generation, Player: [player]")
continue
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 1e7f63c90f..dfd3a1a7cb 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -1298,7 +1298,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
popup.open(FALSE)
onclose(user, "capturekeypress", src)
-/datum/preferences/proc/SetChoices(mob/user, limit = 17, list/splitJobs = list("Chief Engineer"), widthPerColumn = 295, height = 620)
+/datum/preferences/proc/SetChoices(mob/user, limit = 17, list/splitJobs = list("Chief Engineer"), widthPerColumn = 400, height = 700)
if(!SSjob)
return
@@ -1349,21 +1349,11 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(is_banned_from(user.ckey, rank))
HTML += "[rank]
BANNED | "
continue
- var/required_playtime_remaining = job.required_playtime_remaining(user.client)
//text (Zamenil potomu chto slishkom rezhet glaza
- if(required_playtime_remaining && !bypass)
- HTML += "[rank] \[ [get_exp_format(required_playtime_remaining)] as [job.get_exp_req_type()] \] | "
- continue
if(!job.player_old_enough(user.client) && !bypass)
var/available_in_days = job.available_in_days(user.client)
HTML += "[rank] \[IN [(available_in_days)] DAYS\] | "
continue
- if((generation > job.minimal_generation) && !bypass)
- HTML += "[rank] \[FROM [job.minimal_generation] GENERATION AND OLDER\] | "
- continue
- if((masquerade < job.minimal_masquerade) && !bypass)
- HTML += "[rank] \[[job.minimal_masquerade] MASQUERADE POINTS REQUIRED\] | "
- continue
if(!job.allowed_species.Find(pref_species.name) && !bypass)
HTML += "[rank] \[[pref_species.name] RESTRICTED\] | "
continue
@@ -1376,6 +1366,24 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(!alloww && !bypass)
HTML += "[rank] \[[clane.name] RESTRICTED\] | "
continue
+ if((generation > job.minimal_generation) && !bypass)
+ HTML += "[rank] \[FROM [job.minimal_generation] GENERATION AND OLDER\] | "
+ continue
+ if((masquerade < job.minimal_masquerade) && !bypass)
+ HTML += "[rank] \[[job.minimal_masquerade] MASQUERADE POINTS REQUIRED\] | "
+ continue
+ if(!job.can_play_role(user.client) && !bypass)
+ var/list/missing_requirements = job.get_role_requirements(user.client)
+ HTML += "[rank] \[TIMELOCKED\] | "
+
+ HTML += ""
+ for(var/r in missing_requirements)
+ var/datum/timelock/T = r
+ var/requirement_message = "Lacking : [duration2text_custom(missing_requirements[r])]"
+ HTML += "[T.name] | [requirement_message] | "
+
+ HTML += " |
"
+ continue
if((job_preferences[SSjob.overflow_role] == JP_LOW) && (rank != SSjob.overflow_role) && !is_banned_from(user.ckey, SSjob.overflow_role))
HTML += "[rank] | "
continue
@@ -1384,7 +1392,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
else
HTML += "[rank]"
- HTML += ""
+ HTML += " | "
var/prefLevelLabel = "ERROR"
var/prefLevelColor = "pink"
diff --git a/code/modules/jobs/job_exp.dm b/code/modules/jobs/job_exp.dm
index 0593b2867f..c5ffbe5e2d 100644
--- a/code/modules/jobs/job_exp.dm
+++ b/code/modules/jobs/job_exp.dm
@@ -223,3 +223,10 @@ GLOBAL_PROTECT(exp_to_update)
prefs.db_flags = 0 //This PROBABLY won't happen, but better safe than sorry.
qdel(flags_read)
return TRUE
+
+//This one is used for the timelock
+client/proc/get_time_living()
+ if(!prefs.exp || !prefs.exp[EXP_TYPE_LIVING])
+ return 0
+ var/exp_living = text2num(prefs.exp[EXP_TYPE_LIVING]) MINUTES_TO_DECISECOND
+ return exp_living
diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm
index cf526ab215..e8d3f27e30 100644
--- a/code/modules/jobs/job_types/_job.dm
+++ b/code/modules/jobs/job_types/_job.dm
@@ -91,9 +91,17 @@
var/duty
var/v_duty
+
+ var/list/minimum_playtimes
+
+ var/minimum_playtime_as_job = 1 HOURS
+
/datum/job/New()
. = ..()
var/list/jobs_changes = GetMapChanges()
+
+ minimum_playtimes = setup_requirements(list())
+
if(!jobs_changes)
return
if(isnum(jobs_changes["additional_access"]))
@@ -347,3 +355,67 @@
if(CONFIG_GET(flag/security_has_maint_access))
return list(ACCESS_MAINT_TUNNELS)
return list()
+
+/datum/timelock
+ var/name
+ var/time_required
+ var/roles
+
+/datum/timelock/New(name, time_required, list/roles)
+ . = ..()
+ if(name) src.name = name
+ if(time_required) src.time_required = time_required
+ if(roles) src.roles = roles
+
+/datum/job/proc/setup_requirements(list/L)
+ var/list/to_return = list()
+ for(var/PT in L)
+ if(ispath(PT))
+ LAZYADD(to_return, new PT(time_required = L[PT]))
+ else
+ LAZYADD(to_return, TIMELOCK_JOB(PT, L[PT]))
+
+ return to_return
+
+/datum/timelock/proc/can_play(client/C)
+ if(islist(roles))
+ var/total = 0
+ for(var/role_required in roles)
+ total += get_job_playtime(C, role_required)
+
+ return total >= time_required
+ else
+ return get_job_playtime(C, roles) >= time_required
+
+/datum/timelock/proc/get_role_requirement(client/C)
+ if(islist(roles))
+ var/total = 0
+ for(var/role_required in roles)
+ total += get_job_playtime(C, role_required)
+
+ return time_required - total
+ else
+ return time_required - get_job_playtime(C, roles)
+
+/datum/job/proc/can_play_role(client/client)
+
+
+ if(get_job_playtime(client, title) > minimum_playtime_as_job)
+ return TRUE
+
+ for(var/prereq in minimum_playtimes)
+ var/datum/timelock/T = prereq
+ if(!T.can_play(client))
+ return FALSE
+
+ return TRUE
+
+/datum/job/proc/get_role_requirements(client/C)
+ var/list/return_requirements = list()
+ for(var/prereq in minimum_playtimes)
+ var/datum/timelock/T = prereq
+ var/time_required = T.get_role_requirement(C)
+ if(time_required > 0)
+ return_requirements[T] = time_required
+
+ return return_requirements
diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm
index 8dff718a84..23903fccda 100644
--- a/code/modules/mob/dead/new_player/new_player.dm
+++ b/code/modules/mob/dead/new_player/new_player.dm
@@ -290,8 +290,8 @@
return "[jobtitle] is unavailable."
if(JOB_UNAVAILABLE_BANNED)
return "You are currently banned from [jobtitle]."
- if(JOB_UNAVAILABLE_PLAYTIME)
- return "You do not have enough relevant playtime for [jobtitle]."
+ if(JOB_UNAVAILABE_TIME_LOCK)
+ return "You do not have enough hours in some roles for [jobtitle]."
if(JOB_UNAVAILABLE_ACCOUNTAGE)
return "Your account is not old enough for [jobtitle]."
if(JOB_UNAVAILABLE_SLOTFULL)
@@ -321,8 +321,8 @@
return JOB_UNAVAILABLE_GENERIC
if(!job.player_old_enough(client) && !bypass)
return JOB_UNAVAILABLE_ACCOUNTAGE
- if(job.required_playtime_remaining(client) && !bypass)
- return JOB_UNAVAILABLE_PLAYTIME
+ if(!job.can_play_role(client) && !bypass )
+ return JOB_UNAVAILABE_TIME_LOCK
if(latejoin && !job.special_check_latejoin(client))
return JOB_UNAVAILABLE_GENERIC
if((client.prefs.generation > job.minimal_generation) && !bypass)
diff --git a/code/modules/vtmb/jobs/anarch/anarch.dm b/code/modules/vtmb/jobs/anarch/anarch.dm
new file mode 100644
index 0000000000..e069a3d7fd
--- /dev/null
+++ b/code/modules/vtmb/jobs/anarch/anarch.dm
@@ -0,0 +1,21 @@
+/datum/job/vamp/anarch
+ supervisors = "the Anarchs and the Traditions"
+ total_positions = 1
+ spawn_positions = 1
+
+/datum/timelock/anarch
+ name = "Anarch Roles"
+
+/datum/timelock/anarch/New(name, time_required, list/roles)
+ . = ..()
+ src.roles = JOB_ANARCH_ROLES_LIST
+
+
+/datum/timelock/living
+ name = "Living Roles"
+
+/datum/timelock/living/can_play(client/C)
+ return C.get_time_living() >= time_required
+
+/datum/timelock/living/get_role_requirement(client/C)
+ return time_required - C.get_time_living()
diff --git a/code/modules/vtmb/jobs/anarchs/baron.dm b/code/modules/vtmb/jobs/anarch/baron.dm
similarity index 90%
rename from code/modules/vtmb/jobs/anarchs/baron.dm
rename to code/modules/vtmb/jobs/anarch/baron.dm
index 25df239688..dd86a1bb0d 100644
--- a/code/modules/vtmb/jobs/anarchs/baron.dm
+++ b/code/modules/vtmb/jobs/anarch/baron.dm
@@ -1,6 +1,6 @@
-/datum/job/vamp/barkeeper
- title = "Baron"
+/datum/job/vamp/anarch/barkeeper
+ title = JOB_BARKEEPER
department_head = list("Justicar")
faction = "Vampire"
total_positions = 1
@@ -31,9 +31,15 @@
allowed_bloodlines = list("Daughters of Cacophony", "True Brujah", "Brujah", "Nosferatu", "Gangrel", "Toreador", "Malkavian", "Ventrue", "Lasombra", "Gargoyle", "Ministry")
experience_addition = 20
+
+AddTimelock(/datum/job/vamp/anarch/barkeeper, list(
+ JOB_ANARCH_ROLES = 15 HOURS,
+ JOB_LIVING_ROLES = 2 HOURS,
+))
+
/datum/outfit/job/barkeeper
name = "Baron"
- jobtype = /datum/job/vamp/barkeeper
+ jobtype = /datum/job/vamp/anarch/barkeeper
id = /obj/item/card/id/anarch
glasses = /obj/item/clothing/glasses/vampire/sun
diff --git a/code/modules/vtmb/jobs/anarchs/bouncer.dm b/code/modules/vtmb/jobs/anarch/bouncer.dm
similarity index 90%
rename from code/modules/vtmb/jobs/anarchs/bouncer.dm
rename to code/modules/vtmb/jobs/anarch/bouncer.dm
index 3adc068257..97c9a5490b 100644
--- a/code/modules/vtmb/jobs/anarchs/bouncer.dm
+++ b/code/modules/vtmb/jobs/anarch/bouncer.dm
@@ -1,6 +1,6 @@
-/datum/job/vamp/bruiser
- title = "Bruiser"
+/datum/job/vamp/anarch/bruiser
+ title = JOB_BRUISER
department_head = list("Baron")
faction = "Vampire"
total_positions = 7
@@ -26,9 +26,13 @@
minimal_masquerade = 2
experience_addition = 15
+AddTimelock(/datum/job/vamp/anarch/bruiser, list(
+ JOB_LIVING_ROLES = 2 HOURS,
+))
+
/datum/outfit/job/bruiser
name = "Bruiser"
- jobtype = /datum/job/vamp/bruiser
+ jobtype = /datum/job/vamp/anarch/bruiser
id = /obj/item/card/id/anarch
uniform = /obj/item/clothing/under/vampire/bouncer
diff --git a/code/modules/vtmb/jobs/anarchs/emissary.dm b/code/modules/vtmb/jobs/anarch/emissary.dm
similarity index 90%
rename from code/modules/vtmb/jobs/anarchs/emissary.dm
rename to code/modules/vtmb/jobs/anarch/emissary.dm
index fe54a2a4f1..158c2677c0 100644
--- a/code/modules/vtmb/jobs/anarchs/emissary.dm
+++ b/code/modules/vtmb/jobs/anarch/emissary.dm
@@ -1,6 +1,6 @@
-/datum/job/vamp/emissary
- title = "Emissary"
+/datum/job/vamp/anarch/emissary
+ title = JOB_EMISSARY
department_head = list("Baron")
faction = "Vampire"
total_positions = 1
@@ -26,9 +26,13 @@
minimal_masquerade = 2
experience_addition = 15
+AddTimelock(/datum/job/vamp/anarch/emissary, list(
+ JOB_LIVING_ROLES = 2 HOURS,
+))
+
/datum/outfit/job/emissary
name = "emissary"
- jobtype = /datum/job/vamp/emissary
+ jobtype = /datum/job/vamp/anarch/emissary
id = /obj/item/card/id/anarch
uniform = /obj/item/clothing/under/vampire/bouncer
diff --git a/code/modules/vtmb/jobs/anarchs/sweeper.dm b/code/modules/vtmb/jobs/anarch/sweeper.dm
similarity index 90%
rename from code/modules/vtmb/jobs/anarchs/sweeper.dm
rename to code/modules/vtmb/jobs/anarch/sweeper.dm
index a21c1da98c..850ece117e 100644
--- a/code/modules/vtmb/jobs/anarchs/sweeper.dm
+++ b/code/modules/vtmb/jobs/anarch/sweeper.dm
@@ -1,6 +1,6 @@
-/datum/job/vamp/sweeper
- title = "Sweeper"
+/datum/job/vamp/anarch/sweeper
+ title = JOB_SWEEPER
department_head = list("Baron")
faction = "Vampire"
total_positions = 3
@@ -26,9 +26,13 @@
minimal_masquerade = 2
experience_addition = 15
+AddTimelock(/datum/job/vamp/anarch/sweeper, list(
+ JOB_LIVING_ROLES = 2 HOURS,
+))
+
/datum/outfit/job/sweeper
name = "Sweeper"
- jobtype = /datum/job/vamp/sweeper
+ jobtype = /datum/job/vamp/anarch/sweeper
id = /obj/item/card/id/anarch
uniform = /obj/item/clothing/under/vampire/bouncer
diff --git a/code/modules/vtmb/jobs/caitiff.dm b/code/modules/vtmb/jobs/antags/caitiff.dm
similarity index 100%
rename from code/modules/vtmb/jobs/caitiff.dm
rename to code/modules/vtmb/jobs/antags/caitiff.dm
diff --git a/code/modules/vtmb/jobs/hunter.dm b/code/modules/vtmb/jobs/antags/hunter.dm
similarity index 100%
rename from code/modules/vtmb/jobs/hunter.dm
rename to code/modules/vtmb/jobs/antags/hunter.dm
diff --git a/code/modules/vtmb/jobs/sabbat.dm b/code/modules/vtmb/jobs/antags/sabbat.dm
similarity index 100%
rename from code/modules/vtmb/jobs/sabbat.dm
rename to code/modules/vtmb/jobs/antags/sabbat.dm
diff --git a/code/modules/vtmb/jobs/camarilla/camarilla.dm b/code/modules/vtmb/jobs/camarilla/camarilla.dm
new file mode 100644
index 0000000000..74db403b9f
--- /dev/null
+++ b/code/modules/vtmb/jobs/camarilla/camarilla.dm
@@ -0,0 +1,28 @@
+/datum/job/vamp/camarilla
+ supervisors = "the Camarilla and the Traditions"
+ total_positions = 1
+ spawn_positions = 1
+
+/datum/timelock/camarilla_authorities
+ name = "Camarilla Authorities Roles"
+
+/datum/timelock/camarilla_authorities/New(name, time_required, list/roles)
+ . = ..()
+ src.roles = JOB_CAMARILLA_AUTHORITIES_ROLES_LIST
+
+/datum/timelock/camarilla_council
+ name = "Camarilla Council Roles"
+
+/datum/timelock/camarilla_council/New(name, time_required, list/roles)
+ . = ..()
+ src.roles = JOB_CAMARILLA_COUNCIL_ROLES_LIST
+
+
+/datum/timelock/living
+ name = "Living Roles"
+
+/datum/timelock/living/can_play(client/C)
+ return C.get_time_living() >= time_required
+
+/datum/timelock/living/get_role_requirement(client/C)
+ return time_required - C.get_time_living()
diff --git a/code/modules/vtmb/jobs/hound.dm b/code/modules/vtmb/jobs/camarilla/camarilla_authorities/hound.dm
similarity index 92%
rename from code/modules/vtmb/jobs/hound.dm
rename to code/modules/vtmb/jobs/camarilla/camarilla_authorities/hound.dm
index 6e88a1d33b..9fba12018c 100644
--- a/code/modules/vtmb/jobs/hound.dm
+++ b/code/modules/vtmb/jobs/camarilla/camarilla_authorities/hound.dm
@@ -1,6 +1,6 @@
-/datum/job/vamp/hound
- title = "Hound"
+/datum/job/vamp/camarilla/hound
+ title = JOB_HOUND
auto_deadmin_role_flags = DEADMIN_POSITION_SECURITY
department_head = list("Prince")
faction = "Vampire"
@@ -31,9 +31,13 @@
experience_addition = 10
allowed_bloodlines = list("True Brujah", "Daughters of Cacophony", "Brujah", "Tremere", "Ventrue", "Nosferatu", "Gangrel", "Toreador", "Malkavian", "Banu Haqim", "Giovanni", "Ministry", "Lasombra", "Gargoyle", "Kiasyd", "Cappadocian")
+AddTimelock(/datum/job/vamp/camarilla/agent, list(
+ JOB_LIVING_ROLES = 2 HOURS,
+))
+
/datum/outfit/job/hound
name = "Hound"
- jobtype = /datum/job/vamp/hound
+ jobtype = /datum/job/vamp/camarilla/hound
ears = /obj/item/p25radio
id = /obj/item/card/id/camarilla
diff --git a/code/modules/vtmb/jobs/prince.dm b/code/modules/vtmb/jobs/camarilla/camarilla_authorities/prince.dm
similarity index 92%
rename from code/modules/vtmb/jobs/prince.dm
rename to code/modules/vtmb/jobs/camarilla/camarilla_authorities/prince.dm
index 847d1fe7e5..aad794a577 100644
--- a/code/modules/vtmb/jobs/prince.dm
+++ b/code/modules/vtmb/jobs/camarilla/camarilla_authorities/prince.dm
@@ -1,5 +1,5 @@
-/datum/job/vamp/prince
- title = "Prince"
+/datum/job/vamp/camarilla/prince
+ title = JOB_PRINCE
auto_deadmin_role_flags = DEADMIN_POSITION_HEAD|DEADMIN_POSITION_SECURITY
department_head = list("Justicar")
faction = "Vampire"
@@ -42,13 +42,19 @@
v_duty = "You are the top dog of this city. You hold Praxis over San Francisco, and your word is law. Make sure the Masquerade is upheld, and your status is respected."
experience_addition = 25
+
+AddTimelock(/datum/job/vamp/camarilla/prince, list(
+ JOB_CAMARILLA_AUTHORITIES_ROLES = 15 HOURS,
+ JOB_LIVING_ROLES = 2 HOURS,
+))
+
/datum/job/vamp/prince/announce(mob/living/carbon/human/H)
..()
SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, PROC_REF(minor_announce), "Prince [H.real_name] is in the city!"))
/datum/outfit/job/prince
name = "Prince"
- jobtype = /datum/job/vamp/prince
+ jobtype = /datum/job/vamp/camarilla/prince
ears = /obj/item/p25radio
id = /obj/item/card/id/prince
diff --git a/code/modules/vtmb/jobs/seneschal.dm b/code/modules/vtmb/jobs/camarilla/camarilla_authorities/seneschal.dm
similarity index 95%
rename from code/modules/vtmb/jobs/seneschal.dm
rename to code/modules/vtmb/jobs/camarilla/camarilla_authorities/seneschal.dm
index 323a4eae5a..5e48cdcd0f 100644
--- a/code/modules/vtmb/jobs/seneschal.dm
+++ b/code/modules/vtmb/jobs/camarilla/camarilla_authorities/seneschal.dm
@@ -1,6 +1,6 @@
-/datum/job/vamp/clerk
- title = "Seneschal"
+/datum/job/vamp/camarilla/clerk
+ title = JOB_CLERK
auto_deadmin_role_flags = DEADMIN_POSITION_HEAD
department_head = list("Prince")
head_announce = list(RADIO_CHANNEL_SUPPLY, RADIO_CHANNEL_SERVICE)
@@ -50,9 +50,14 @@
experience_addition = 15
allowed_bloodlines = list("Daughters of Cacophony", "True Brujah", "Brujah", "Tremere", "Ventrue", "Nosferatu", "Gangrel", "Toreador", "Malkavian", "Banu Haqim", "Giovanni", "Ministry", "Lasombra", "Gargoyle", "Kiasyd")
+
+AddTimelock(/datum/job/vamp/camarilla/clerk, list(
+ JOB_LIVING_ROLES = 2 HOURS,
+))
+
/datum/outfit/job/clerk
name = "Seneschal"
- jobtype = /datum/job/vamp/clerk
+ jobtype = /datum/job/vamp/camarilla/clerk
ears = /obj/item/p25radio
id = /obj/item/card/id/clerk
diff --git a/code/modules/vtmb/jobs/sheriff.dm b/code/modules/vtmb/jobs/camarilla/camarilla_authorities/sheriff.dm
similarity index 93%
rename from code/modules/vtmb/jobs/sheriff.dm
rename to code/modules/vtmb/jobs/camarilla/camarilla_authorities/sheriff.dm
index dfff822ad9..aacfb3d357 100644
--- a/code/modules/vtmb/jobs/sheriff.dm
+++ b/code/modules/vtmb/jobs/camarilla/camarilla_authorities/sheriff.dm
@@ -1,5 +1,5 @@
-/datum/job/vamp/sheriff
- title = "Sheriff"
+/datum/job/vamp/camarilla/sheriff
+ title = JOB_SHERIFF
auto_deadmin_role_flags = DEADMIN_POSITION_HEAD|DEADMIN_POSITION_SECURITY
department_head = list("Prince")
head_announce = list(RADIO_CHANNEL_SECURITY)
@@ -44,9 +44,15 @@
v_duty = "Protect the Prince and the Masquerade. You are their sword."
experience_addition = 20
+AddTimelock(/datum/job/vamp/camarilla/sheriff, list(
+ JOB_CAMARILLA_AUTHORITIES_ROLES = 5 HOURS,
+ JOB_LIVING_ROLES = 2 HOURS,
+))
+
+
/datum/outfit/job/sheriff
name = "Sheriff"
- jobtype = /datum/job/vamp/sheriff
+ jobtype = /datum/job/vamp/camarilla/sheriff
ears = /obj/item/p25radio
id = /obj/item/card/id/sheriff
diff --git a/code/modules/vtmb/jobs/primogen.dm b/code/modules/vtmb/jobs/camarilla/camarilla_primogen_council/primogen.dm
similarity index 86%
rename from code/modules/vtmb/jobs/primogen.dm
rename to code/modules/vtmb/jobs/camarilla/camarilla_primogen_council/primogen.dm
index 2098f945c1..3184ca8a3c 100644
--- a/code/modules/vtmb/jobs/primogen.dm
+++ b/code/modules/vtmb/jobs/camarilla/camarilla_primogen_council/primogen.dm
@@ -1,5 +1,5 @@
-/datum/job/vamp/primogen_malkavian
- title = "Primogen Malkavian"
+/datum/job/vamp/camarilla/primogen_malkavian
+ title = JOB_MALKAVIAN
department_head = list("Justicar")
faction = "Vampire"
total_positions = 1
@@ -26,9 +26,15 @@
my_contact_is_important = TRUE
known_contacts = list("Prince")
+AddTimelock(/datum/job/vamp/camarilla/primogen_malkavian, list(
+ JOB_CAMARILLA_AUTHORITIES_ROLES = 5 HOURS,
+ JOB_LIVING_ROLES = 2 HOURS,
+))
+
+
/datum/outfit/job/malkav
name = "Primogen Malkavian"
- jobtype = /datum/job/vamp/primogen_malkavian
+ jobtype = /datum/job/vamp/camarilla/primogen_malkavian
ears = /obj/item/p25radio
id = /obj/item/card/id/primogen
@@ -49,8 +55,8 @@
uniform = /obj/item/clothing/under/vampire/primogen_malkavian/female
shoes = /obj/item/clothing/shoes/vampire/heels
-/datum/job/vamp/primogen_nosferatu
- title = "Primogen Nosferatu"
+/datum/job/vamp/camarilla/primogen_nosferatu
+ title = JOB_NOSFERATU
department_head = list("Justicar")
faction = "Vampire"
total_positions = 1
@@ -77,9 +83,14 @@
my_contact_is_important = TRUE
known_contacts = list("Prince")
+AddTimelock(/datum/job/vamp/camarilla/primogen_nosferatu, list(
+ JOB_CAMARILLA_AUTHORITIES_ROLES = 5 HOURS,
+ JOB_LIVING_ROLES = 2 HOURS,
+))
+
/datum/outfit/job/nosferatu
name = "Primogen Nosferatu"
- jobtype = /datum/job/vamp/primogen_nosferatu
+ jobtype = /datum/job/vamp/camarilla/primogen_nosferatu
id = /obj/item/card/id/primogen
mask = /obj/item/clothing/mask/vampire/shemagh
@@ -96,8 +107,8 @@
if(H.gender == FEMALE)
shoes = /obj/item/clothing/shoes/vampire/heels
-/datum/job/vamp/primogen_ventrue
- title = "Primogen Ventrue"
+/datum/job/vamp/camarilla/primogen_ventrue
+ title = JOB_VENTRUE
department_head = list("Justicar")
faction = "Vampire"
total_positions = 1
@@ -126,7 +137,7 @@
/datum/outfit/job/ventrue
name = "Primogen Ventrue"
- jobtype = /datum/job/vamp/primogen_ventrue
+ jobtype = /datum/job/vamp/camarilla/primogen_ventrue
id = /obj/item/card/id/primogen
glasses = /obj/item/clothing/glasses/vampire/sun
@@ -142,8 +153,14 @@
if(H.gender == FEMALE)
shoes = /obj/item/clothing/shoes/vampire/heels
-/datum/job/vamp/primogen_toreador
- title = "Primogen Toreador"
+
+AddTimelock(/datum/job/vamp/camarilla/primogen_ventrue, list(
+ JOB_CAMARILLA_AUTHORITIES_ROLES = 5 HOURS,
+ JOB_LIVING_ROLES = 2 HOURS,
+))
+
+/datum/job/vamp/camarilla/primogen_toreador
+ title = JOB_TOREADOR
department_head = list("Justicar")
faction = "Vampire"
total_positions = 1
@@ -170,9 +187,14 @@
my_contact_is_important = TRUE
known_contacts = list("Prince")
+AddTimelock(/datum/job/vamp/camarilla/primogen_toreador, list(
+ JOB_CAMARILLA_AUTHORITIES_ROLES = 5 HOURS,
+ JOB_LIVING_ROLES = 2 HOURS,
+))
+
/datum/outfit/job/toreador
name = "Primogen Toreador"
- jobtype = /datum/job/vamp/primogen_toreador
+ jobtype = /datum/job/vamp/camarilla/primogen_toreador
id = /obj/item/card/id/primogen
glasses = /obj/item/clothing/glasses/vampire/sun
@@ -190,8 +212,8 @@
shoes = /obj/item/clothing/shoes/vampire/heels/red
-/datum/job/vamp/primogen_brujah
- title = "Primogen Brujah"
+/datum/job/vamp/camarilla/primogen_brujah
+ title = JOB_BRUJAH
department_head = list("Justicar")
faction = "Vampire"
total_positions = 1
@@ -218,9 +240,15 @@
my_contact_is_important = TRUE
known_contacts = list("Prince")
+
+AddTimelock(/datum/job/vamp/camarilla/primogen_brujah, list(
+ JOB_CAMARILLA_AUTHORITIES_ROLES = 5 HOURS,
+ JOB_LIVING_ROLES = 2 HOURS,
+))
+
/datum/outfit/job/brujah
name = "Primogen Brujah"
- jobtype = /datum/job/vamp/primogen_brujah
+ jobtype = /datum/job/vamp/camarilla/primogen_brujah
id = /obj/item/card/id/primogen
glasses = /obj/item/clothing/glasses/vampire/yellow
@@ -230,3 +258,4 @@
l_pocket = /obj/item/vamp/phone/brujah
r_pocket = /obj/item/cockclock
backpack_contents = list(/obj/item/vamp/keys/brujah/primogen=1, /obj/item/melee/vampirearms/eguitar=1, /obj/item/passport=1, /obj/item/flashlight=1, /obj/item/vamp/creditcard/elder=1, /obj/item/card/id/whip, /obj/item/card/id/steward, /obj/item/card/id/myrmidon)
+
diff --git a/code/modules/vtmb/jobs/church/church.dm b/code/modules/vtmb/jobs/church/church.dm
new file mode 100644
index 0000000000..ab5cf754b5
--- /dev/null
+++ b/code/modules/vtmb/jobs/church/church.dm
@@ -0,0 +1,21 @@
+/datum/job/vamp/church
+ supervisors = "God"
+ total_positions = 1
+ spawn_positions = 1
+
+/datum/timelock/church
+ name = "Church Roles"
+
+/datum/timelock/church/New(name, time_required, list/roles)
+ . = ..()
+ src.roles = JOB_CHURCH_ROLES_LIST
+
+
+/datum/timelock/living
+ name = "Living Roles"
+
+/datum/timelock/living/can_play(client/C)
+ return C.get_time_living() >= time_required
+
+/datum/timelock/living/get_role_requirement(client/C)
+ return time_required - C.get_time_living()
diff --git a/code/modules/vtmb/jobs/priest.dm b/code/modules/vtmb/jobs/church/priest.dm
similarity index 93%
rename from code/modules/vtmb/jobs/priest.dm
rename to code/modules/vtmb/jobs/church/priest.dm
index 8c6abac2a1..f1c1430a73 100644
--- a/code/modules/vtmb/jobs/priest.dm
+++ b/code/modules/vtmb/jobs/church/priest.dm
@@ -1,6 +1,6 @@
-/datum/job/vamp/priest
- title = "Priest"
+/datum/job/vamp/church/priest
+ title = JOB_PRIEST
department_head = list("Bishop")
faction = "Vampire"
total_positions = 2
@@ -25,9 +25,14 @@
minimal_masquerade = 0
my_contact_is_important = FALSE
+AddTimelock(/datum/job/vamp/church/priest, list(
+ JOB_LIVING_ROLES = 2 HOURS,
+))
+
+
/datum/outfit/job/priest
name = "Priest"
- jobtype = /datum/job/vamp/priest
+ jobtype = /datum/job/vamp/church/priest
uniform = /obj/item/clothing/under/vampire/graveyard
shoes = /obj/item/clothing/shoes/vampire/jackboots
diff --git a/code/modules/vtmb/jobs/city_services/city_services.dm b/code/modules/vtmb/jobs/city_services/city_services.dm
new file mode 100644
index 0000000000..466c6808e6
--- /dev/null
+++ b/code/modules/vtmb/jobs/city_services/city_services.dm
@@ -0,0 +1,21 @@
+/datum/job/vamp/city_services
+ supervisors = "Your Boss"
+ total_positions = 1
+ spawn_positions = 1
+
+/datum/timelock/city_services
+ name = "City Services Roles"
+
+/datum/timelock/city_services/New(name, time_required, list/roles)
+ . = ..()
+ src.roles = JOB_CITY_SERVICES_ROLES_LIST
+
+
+/datum/timelock/living
+ name = "Living Roles"
+
+/datum/timelock/living/can_play(client/C)
+ return C.get_time_living() >= time_required
+
+/datum/timelock/living/get_role_requirement(client/C)
+ return time_required - C.get_time_living()
diff --git a/code/modules/vtmb/jobs/graveyard_keeper.dm b/code/modules/vtmb/jobs/city_services/graveyard_keeper.dm
similarity index 91%
rename from code/modules/vtmb/jobs/graveyard_keeper.dm
rename to code/modules/vtmb/jobs/city_services/graveyard_keeper.dm
index 433bdfa166..fa7f08a16d 100644
--- a/code/modules/vtmb/jobs/graveyard_keeper.dm
+++ b/code/modules/vtmb/jobs/city_services/graveyard_keeper.dm
@@ -1,6 +1,6 @@
-/datum/job/vamp/graveyard
- title = "Graveyard Keeper"
+/datum/job/vamp/city_services/graveyard
+ title = JOB_GRAVEYARD
department_head = list("Seneschal")
faction = "Vampire"
total_positions = 6
@@ -26,9 +26,13 @@
allowed_species = list("Vampire", "Ghoul", "Kuei-Jin")
allowed_bloodlines = list("True Brujah", "Daughters of Cacophony", "Salubri", "Baali", "Brujah", "Tremere", "Ventrue", "Nosferatu", "Gangrel", "Toreador", "Malkavian", "Banu Haqim", "Giovanni", "Ministry", "Tzimisce", "Lasombra", "Caitiff", "Cappadocian")
+AddTimelock(/datum/job/vamp/city_services/graveyard, list(
+ JOB_LIVING_ROLES = 2 HOURS,
+))
+
/datum/outfit/job/graveyard
name = "Graveyard Keeper"
- jobtype = /datum/job/vamp/graveyard
+ jobtype = /datum/job/vamp/city_services/graveyard
id = /obj/item/card/id/graveyard
shoes = /obj/item/clothing/shoes/vampire/jackboots
diff --git a/code/modules/vtmb/jobs/janitor.dm b/code/modules/vtmb/jobs/city_services/janitor.dm
similarity index 93%
rename from code/modules/vtmb/jobs/janitor.dm
rename to code/modules/vtmb/jobs/city_services/janitor.dm
index e546ccc2c0..2859894019 100644
--- a/code/modules/vtmb/jobs/janitor.dm
+++ b/code/modules/vtmb/jobs/city_services/janitor.dm
@@ -1,6 +1,6 @@
-/datum/job/vamp/vjanitor
- title = "Street Janitor"
+/datum/job/vamp/city_services/vjanitor
+ title = JOB_STREETJAN
department_head = list("Prince")
faction = "Vampire"
total_positions = 6
@@ -27,7 +27,7 @@
/datum/outfit/job/vjanitor
name = "Street Janitor"
- jobtype = /datum/job/vamp/vjanitor
+ jobtype = /datum/job/vamp/city_services/vjanitor
id = /obj/item/card/id/cleaning
uniform = /obj/item/clothing/under/vampire/janitor
diff --git a/code/modules/vtmb/jobs/stripper.dm b/code/modules/vtmb/jobs/city_services/stripper.dm
similarity index 93%
rename from code/modules/vtmb/jobs/stripper.dm
rename to code/modules/vtmb/jobs/city_services/stripper.dm
index df8dc9ea4e..41add37aaf 100644
--- a/code/modules/vtmb/jobs/stripper.dm
+++ b/code/modules/vtmb/jobs/city_services/stripper.dm
@@ -1,6 +1,6 @@
-/datum/job/vamp/strip
- title = "Stripper"
+/datum/job/vamp/city_services/strip
+ title = JOB_STRIP
faction = "Vampire"
total_positions = 4
spawn_positions = 4
@@ -25,7 +25,7 @@
/datum/outfit/job/strip
name = "Stripper"
- jobtype = /datum/job/vamp/citizen
+ jobtype = /datum/job/vamp/city_services/strip
l_pocket = /obj/item/vamp/phone
r_pocket = /obj/item/vamp/keys/strip
id = /obj/item/cockclock
diff --git a/code/modules/vtmb/jobs/taxi.dm b/code/modules/vtmb/jobs/city_services/taxi.dm
similarity index 95%
rename from code/modules/vtmb/jobs/taxi.dm
rename to code/modules/vtmb/jobs/city_services/taxi.dm
index 48c73beaad..af84bf09f9 100644
--- a/code/modules/vtmb/jobs/taxi.dm
+++ b/code/modules/vtmb/jobs/city_services/taxi.dm
@@ -1,5 +1,5 @@
-/datum/job/vamp/taxi
- title = "Taxi Driver"
+/datum/job/vamp/city_services/taxi
+ title = JOB_TAXI
department_head = list("Justicar")
faction = "Vampire"
total_positions = 3
@@ -30,7 +30,7 @@
/datum/outfit/job/taxi
name = "Taxi Driver"
- jobtype = /datum/job/vamp/taxi
+ jobtype = /datum/job/vamp/city_services/taxi
id = /obj/item/cockclock
glasses = /obj/item/clothing/glasses/vampire/sun
diff --git a/code/modules/vtmb/jobs/clinic/clinic.dm b/code/modules/vtmb/jobs/clinic/clinic.dm
new file mode 100644
index 0000000000..f26aca18b7
--- /dev/null
+++ b/code/modules/vtmb/jobs/clinic/clinic.dm
@@ -0,0 +1,21 @@
+/datum/job/vamp/clinic
+ supervisors = "Your Boss"
+ total_positions = 1
+ spawn_positions = 1
+
+/datum/timelock/clinic
+ name = "Clinic Roles"
+
+/datum/timelock/clinic/New(name, time_required, list/roles)
+ . = ..()
+ src.roles = JOB_CLINIC_ROLES_LIST
+
+
+/datum/timelock/living
+ name = "Living Roles"
+
+/datum/timelock/living/can_play(client/C)
+ return C.get_time_living() >= time_required
+
+/datum/timelock/living/get_role_requirement(client/C)
+ return time_required - C.get_time_living()
diff --git a/code/modules/vtmb/jobs/doctor.dm b/code/modules/vtmb/jobs/clinic/doctor.dm
similarity index 91%
rename from code/modules/vtmb/jobs/doctor.dm
rename to code/modules/vtmb/jobs/clinic/doctor.dm
index e872a8f052..ed3c9adc81 100644
--- a/code/modules/vtmb/jobs/doctor.dm
+++ b/code/modules/vtmb/jobs/clinic/doctor.dm
@@ -1,6 +1,6 @@
-/datum/job/vamp/vdoctor
- title = "Doctor"
+/datum/job/vamp/clinic/vdoctor
+ title = JOB_DOCTOR
department_head = list("Clinic Director")
faction = "Vampire"
total_positions = 4
@@ -29,9 +29,13 @@
allowed_bloodlines = list("Daughters of Cacophony", "Salubri", "Baali", "Brujah", "Tremere", "Ventrue", "Nosferatu", "Gangrel", "Toreador", "Malkavian", "Banu Haqim", "Giovanni", "Ministry", "Tzimisce", "Lasombra", "Caitiff", "Kiasyd")
known_contacts = list("Clinic Director")
+AddTimelock(/datum/job/vamp/clinic/vdoctor, list(
+ JOB_LIVING_ROLES = 2 HOURS,
+))
+
/datum/outfit/job/vdoctor
name = "Doctor"
- jobtype = /datum/job/vamp/vdoctor
+ jobtype = /datum/job/vamp/clinic/vdoctor
ears = /obj/item/p25radio
id = /obj/item/card/id/clinic
@@ -54,7 +58,7 @@
icon_state = "Doctor"
-/datum/job/vamp/vdirector
+/datum/job/vamp/clinic/vdirector
title = "Clinic Director"
department_head = list("Seneschal")
faction = "Vampire"
@@ -83,9 +87,14 @@
experience_addition = 15
allowed_bloodlines = list("Daughters of Cacophony", "Salubri", "Baali", "Brujah", "Tremere", "Ventrue", "Nosferatu", "Gangrel", "Toreador", "Malkavian", "Banu Haqim", "Giovanni", "Ministry", "Tzimisce", "Lasombra", "Caitiff", "Kiasyd")
+AddTimelock(/datum/job/vamp/clinic/vdirector, list(
+ JOB_LIVING_ROLES = 2 HOURS,
+ JOB_CLINIC_ROLES = 10 HOURS,
+))
+
/datum/outfit/job/vdirector
- name = "Clinic Director"
- jobtype = /datum/job/vamp/vdirector
+ name = JOB_CLINIC_DIRECTOR
+ jobtype = /datum/job/vamp/clinic/vdirector
ears = /obj/item/p25radio
id = /obj/item/card/id/clinic/director
diff --git a/code/modules/vtmb/jobs/gangs/gangs.dm b/code/modules/vtmb/jobs/gangs/gangs.dm
new file mode 100644
index 0000000000..571a659491
--- /dev/null
+++ b/code/modules/vtmb/jobs/gangs/gangs.dm
@@ -0,0 +1,21 @@
+/datum/job/vamp/gangs
+ supervisors = "Your Gang"
+ total_positions = 1
+ spawn_positions = 1
+
+/datum/timelock/gangs
+ name = "Gangs Roles"
+
+/datum/timelock/gangs/New(name, time_required, list/roles)
+ . = ..()
+ src.roles = JOB_GANG_ROLES_LIST
+
+
+/datum/timelock/living
+ name = "Living Roles"
+
+/datum/timelock/living/can_play(client/C)
+ return C.get_time_living() >= time_required
+
+/datum/timelock/living/get_role_requirement(client/C)
+ return time_required - C.get_time_living()
diff --git a/code/modules/vtmb/jobs/triad.dm b/code/modules/vtmb/jobs/gangs/triad.dm
similarity index 90%
rename from code/modules/vtmb/jobs/triad.dm
rename to code/modules/vtmb/jobs/gangs/triad.dm
index b20d111c8a..a63aa35eb2 100644
--- a/code/modules/vtmb/jobs/triad.dm
+++ b/code/modules/vtmb/jobs/gangs/triad.dm
@@ -1,6 +1,6 @@
-/datum/job/vamp/triad_soldier
- title = "Triad Soldier"
+/datum/job/vamp/gangs/triad_soldier
+ title = JOB_TRIAD_GANGSTER
department_head = list("Triad Leadership")
faction = "Vampire"
total_positions = 8
@@ -25,6 +25,10 @@
minimal_masquerade = 0
my_contact_is_important = FALSE
+AddTimelock(/datum/job/vamp/gangs/triad_soldier, list(
+ JOB_LIVING_ROLES = 2 HOURS,
+))
+
/datum/outfit/job/triad_soldier/pre_equip(mob/living/carbon/human/H)
..()
H.grant_language(/datum/language/cantonese)
@@ -34,7 +38,7 @@
/datum/outfit/job/triad_soldier
name = "Triad Soldier"
- jobtype = /datum/job/vamp/triad_soldier
+ jobtype = /datum/job/vamp/gangs/triad_soldier
uniform = /obj/item/clothing/under/vampire/suit
shoes = /obj/item/clothing/shoes/vampire/jackboots
// suit = /obj/item/clothing/suit/vampire/vest
diff --git a/code/modules/vtmb/jobs/giovanni.dm b/code/modules/vtmb/jobs/giovanni_family/giovanni.dm
similarity index 87%
rename from code/modules/vtmb/jobs/giovanni.dm
rename to code/modules/vtmb/jobs/giovanni_family/giovanni.dm
index edde10c575..b916b288e4 100644
--- a/code/modules/vtmb/jobs/giovanni.dm
+++ b/code/modules/vtmb/jobs/giovanni_family/giovanni.dm
@@ -1,5 +1,5 @@
-/datum/job/vamp/giovannielder
- title = "Capo"
+/datum/job/vamp/giovanni_family/giovannielder
+ title = JOB_GIOVANNI_CAPO
department_head = list("Uncle Augie")
faction = "Vampire"
total_positions = 1
@@ -24,9 +24,14 @@
allowed_species = list("Vampire")
allowed_bloodlines = list("Giovanni", "Cappadocian")
+AddTimelock(/datum/job/vamp/giovanni_family/giovannielder, list(
+ JOB_GIOVANNI_ROLES = 10 HOURS,
+ JOB_LIVING_ROLES = 2 HOURS,
+))
+
/datum/outfit/job/giovannielder
name = "Capo"
- jobtype = /datum/job/vamp/giovannielder
+ jobtype = /datum/job/vamp/giovanni_family/giovannielder
id = /obj/item/cockclock
glasses = /obj/item/clothing/glasses/vampire/sun
@@ -46,8 +51,8 @@
/obj/effect/landmark/start/giovannielder
name = "Capo"
-/datum/job/vamp/giovanni
- title = "La Squadra"
+/datum/job/vamp/giovanni_family/giovanni
+ title = JOB_GIOVANNI_SQUADRA
department_head = list("Capo")
faction = "Vampire"
total_positions = 10
@@ -70,9 +75,13 @@
allowed_species = list("Vampire")
allowed_bloodlines = list("Giovanni", "Cappadocian")
+AddTimelock(/datum/job/vamp/giovanni_family/giovanni, list(
+ JOB_LIVING_ROLES = 2 HOURS,
+))
+
/datum/outfit/job/giovanni
name = "La Squadra"
- jobtype = /datum/job/vamp/giovanni
+ jobtype = /datum/job/vamp/giovanni_family/giovanni
id = /obj/item/cockclock
glasses = /obj/item/clothing/glasses/vampire/sun
@@ -92,8 +101,8 @@
/obj/effect/landmark/start/giovanni
name = "La Squadra"
-/datum/job/vamp/giovannimafia
- title = "La Famiglia"
+/datum/job/vamp/giovanni_family/giovannimafia
+ title = JOB_GIOVANNI_FAMIGLIA
department_head = list("Capo")
faction = "Vampire"
total_positions = 10
@@ -118,9 +127,13 @@
experience_addition = 10
+AddTimelock(/datum/job/vamp/giovanni_family/giovannimafia, list(
+ JOB_LIVING_ROLES = 2 HOURS,
+))
+
/datum/outfit/job/giovannimafia
name = "La Famiglia"
- jobtype = /datum/job/vamp/giovannimafia
+ jobtype = /datum/job/vamp/giovanni_family/giovannimafia
id = /obj/item/cockclock
glasses = /obj/item/clothing/glasses/vampire/sun
uniform = /obj/item/clothing/under/vampire/suit
diff --git a/code/modules/vtmb/jobs/giovanni_family/giovanni_family.dm b/code/modules/vtmb/jobs/giovanni_family/giovanni_family.dm
new file mode 100644
index 0000000000..9c214f4ac9
--- /dev/null
+++ b/code/modules/vtmb/jobs/giovanni_family/giovanni_family.dm
@@ -0,0 +1,21 @@
+/datum/job/vamp/giovanni_family
+ supervisors = "the Family and the Traditions"
+ total_positions = 1
+ spawn_positions = 1
+
+/datum/timelock/giovanni_family
+ name = "Giovanni Family Roles"
+
+/datum/timelock/giovanni_family/New(name, time_required, list/roles)
+ . = ..()
+ src.roles = JOB_GIOVANNI_ROLES_LIST
+
+
+/datum/timelock/living
+ name = "Living Roles"
+
+/datum/timelock/living/can_play(client/C)
+ return C.get_time_living() >= time_required
+
+/datum/timelock/living/get_role_requirement(client/C)
+ return time_required - C.get_time_living()
diff --git a/code/modules/vtmb/jobs/fbi.dm b/code/modules/vtmb/jobs/national_security/fbi.dm
similarity index 88%
rename from code/modules/vtmb/jobs/fbi.dm
rename to code/modules/vtmb/jobs/national_security/fbi.dm
index 41f21b6dc0..ef498b5822 100644
--- a/code/modules/vtmb/jobs/fbi.dm
+++ b/code/modules/vtmb/jobs/national_security/fbi.dm
@@ -1,6 +1,6 @@
-/datum/job/vamp/fbi
- title = "Federal Investigator"
+/datum/job/vamp/national_security/fbi
+ title = JOB_FBI
department_head = list("Federal Bureau of Investigation")
faction = "Vampire"
total_positions = 2
@@ -25,9 +25,14 @@
my_contact_is_important = FALSE
known_contacts = list("Police Chief")
+AddTimelock(/datum/job/vamp/national_security/fbi, list(
+ JOB_POLICE_ROLES = 15 HOURS,
+ JOB_LIVING_ROLES = 2 HOURS,
+))
+
/datum/outfit/job/fbi
name = "Federal Investigator"
- jobtype = /datum/job/vamp/fbi
+ jobtype = /datum/job/vamp/national_security/fbi
ears = /obj/item/p25radio/police/government
uniform = /obj/item/clothing/under/vampire/office
diff --git a/code/modules/vtmb/jobs/national_guard.dm b/code/modules/vtmb/jobs/national_security/national_guard.dm
similarity index 100%
rename from code/modules/vtmb/jobs/national_guard.dm
rename to code/modules/vtmb/jobs/national_security/national_guard.dm
diff --git a/code/modules/vtmb/jobs/national_security/national_security.dm b/code/modules/vtmb/jobs/national_security/national_security.dm
new file mode 100644
index 0000000000..ce0dbaf6b7
--- /dev/null
+++ b/code/modules/vtmb/jobs/national_security/national_security.dm
@@ -0,0 +1,21 @@
+/datum/job/vamp/national_security
+ supervisors = "Your Country and respective supervisors"
+ total_positions = 1
+ spawn_positions = 1
+
+/datum/timelock/national_security
+ name = "National Security Roles"
+
+/datum/timelock/national_security/New(name, time_required, list/roles)
+ . = ..()
+ src.roles = JOB_NATIONAL_SECURITY_ROLES_LIST
+
+
+/datum/timelock/living
+ name = "Living Roles"
+
+/datum/timelock/living/can_play(client/C)
+ return C.get_time_living() >= time_required
+
+/datum/timelock/living/get_role_requirement(client/C)
+ return time_required - C.get_time_living()
diff --git a/code/modules/vtmb/jobs/swat.dm b/code/modules/vtmb/jobs/national_security/swat.dm
similarity index 100%
rename from code/modules/vtmb/jobs/swat.dm
rename to code/modules/vtmb/jobs/national_security/swat.dm
diff --git a/code/modules/vtmb/jobs/dispatcher.dm b/code/modules/vtmb/jobs/police_force/dispatcher.dm
similarity index 82%
rename from code/modules/vtmb/jobs/dispatcher.dm
rename to code/modules/vtmb/jobs/police_force/dispatcher.dm
index b91c13acd0..e61e0da0c1 100644
--- a/code/modules/vtmb/jobs/dispatcher.dm
+++ b/code/modules/vtmb/jobs/police_force/dispatcher.dm
@@ -1,6 +1,6 @@
-/datum/job/vamp/dispatcher
- title = "Emergency Dispatcher"
+/datum/job/vamp/police_force/dispatcher
+ title = JOB_DISPATCHER
faction = "Vampire"
total_positions = 2
spawn_positions = 2
@@ -20,10 +20,12 @@
minimal_masquerade = 0
known_contacts = list("Police Chief")
-
+AddTimelock(/datum/job/vamp/police_force/dispatcher, list(
+ JOB_LIVING_ROLES = 2 HOURS,
+))
/datum/outfit/job/dispatcher
name = "Dispatcher"
- jobtype = /datum/job/vamp/dispatcher
+ jobtype = /datum/job/vamp/police_force/dispatcher
uniform = /obj/item/clothing/under/vampire/office
ears = /obj/item/p25radio/police/dispatch
shoes = /obj/item/clothing/shoes/vampire/businessblack
diff --git a/code/modules/vtmb/jobs/police.dm b/code/modules/vtmb/jobs/police_force/police.dm
similarity index 87%
rename from code/modules/vtmb/jobs/police.dm
rename to code/modules/vtmb/jobs/police_force/police.dm
index fe1f9f0013..58e9ef6fe9 100644
--- a/code/modules/vtmb/jobs/police.dm
+++ b/code/modules/vtmb/jobs/police_force/police.dm
@@ -1,6 +1,6 @@
-/datum/job/vamp/police_officer
- title = "Police Officer"
+/datum/job/vamp/police_force/police_officer
+ title = JOB_POLICE
department_head = list("Police Department")
faction = "Vampire"
total_positions = 5
@@ -25,9 +25,13 @@
my_contact_is_important = FALSE
known_contacts = list("Police Chief")
+AddTimelock(/datum/job/vamp/police_force/police_officer, list(
+ JOB_LIVING_ROLES = 2 HOURS,
+))
+
/datum/outfit/job/police_officer
name = "Police Officer"
- jobtype = /datum/job/vamp/police_officer
+ jobtype = /datum/job/vamp/police_force/police_officer
ears = /obj/item/p25radio/police
uniform = /obj/item/clothing/under/vampire/police
@@ -40,8 +44,8 @@
r_pocket = /obj/item/vamp/keys/police
backpack_contents = list(/obj/item/passport=1, /obj/item/implant/radio=1, /obj/item/vamp/creditcard=1, /obj/item/ammo_box/vampire/c9mm = 1, /obj/item/restraints/handcuffs = 1,/obj/item/melee/classic_baton/vampire = 1, /obj/item/storage/firstaid/ifak = 1)
-/datum/job/vamp/police_sergeant
- title = "Police Sergeant"
+/datum/job/vamp/police_force/police_sergeant
+ title = JOB_POLICE_SERGEANT
department_head = list("Police Department")
faction = "Vampire"
total_positions = 2
@@ -65,9 +69,14 @@
my_contact_is_important = FALSE
known_contacts = list("Police Chief")
+AddTimelock(/datum/job/vamp/police_force/police_sergeant, list(
+ JOB_POLICE_ROLES = 5 HOURS,
+ JOB_LIVING_ROLES = 2 HOURS,
+))
+
/datum/outfit/job/police_sergeant
name = "Police Sergeant"
- jobtype = /datum/job/vamp/police_sergeant
+ jobtype = /datum/job/vamp/police_force/police_sergeant
ears = /obj/item/p25radio/police/supervisor
uniform = /obj/item/clothing/under/vampire/police
@@ -80,8 +89,8 @@
r_pocket = /obj/item/vamp/keys/police/secure
backpack_contents = list(/obj/item/passport=1, /obj/item/implant/radio=1, /obj/item/vamp/creditcard=1, /obj/item/ammo_box/vampire/c9mm = 1, /obj/item/restraints/handcuffs = 1,/obj/item/melee/classic_baton/vampire = 1, /obj/item/storage/firstaid/ifak = 1)
-/datum/job/vamp/police_chief
- title = "Police Chief"
+/datum/job/vamp/police_force/police_chief
+ title = JOB_POLICE_CHIEF
department_head = list("Police Department")
faction = "Vampire"
total_positions = 1
@@ -105,9 +114,14 @@
my_contact_is_important = FALSE
// known_contacts = list("Investigator")
+AddTimelock(/datum/job/vamp/police_force/police_chief, list(
+ JOB_POLICE_ROLES = 10 HOURS,
+ JOB_LIVING_ROLES = 2 HOURS,
+))
+
/datum/outfit/job/police_chief
name = "Police Chief"
- jobtype = /datum/job/vamp/police_chief
+ jobtype = /datum/job/vamp/police_force/police_chief
ears = /obj/item/p25radio/police/command
uniform = /obj/item/clothing/under/vampire/police
diff --git a/code/modules/vtmb/jobs/police_force/police_force.dm b/code/modules/vtmb/jobs/police_force/police_force.dm
new file mode 100644
index 0000000000..c8a5826f6f
--- /dev/null
+++ b/code/modules/vtmb/jobs/police_force/police_force.dm
@@ -0,0 +1,21 @@
+/datum/job/vamp/police_force
+ supervisors = "the SFPD"
+ total_positions = 1
+ spawn_positions = 1
+
+/datum/timelock/police_force
+ name = "Police Force Roles"
+
+/datum/timelock/police_force/New(name, time_required, list/roles)
+ . = ..()
+ src.roles = JOB_POLICE_ROLES_LIST
+
+
+/datum/timelock/living
+ name = "Living Roles"
+
+/datum/timelock/living/can_play(client/C)
+ return C.get_time_living() >= time_required
+
+/datum/timelock/living/get_role_requirement(client/C)
+ return time_required - C.get_time_living()
diff --git a/code/modules/vtmb/jobs/archivist.dm b/code/modules/vtmb/jobs/tremere/archivist.dm
similarity index 90%
rename from code/modules/vtmb/jobs/archivist.dm
rename to code/modules/vtmb/jobs/tremere/archivist.dm
index 901bf286f7..c6ed5d6b57 100644
--- a/code/modules/vtmb/jobs/archivist.dm
+++ b/code/modules/vtmb/jobs/tremere/archivist.dm
@@ -1,6 +1,6 @@
-/datum/job/vamp/archivist
- title = "Chantry Archivist"
+/datum/job/vamp/tremere/archivist
+ title = JOB_ARCHIVIST
department_head = list("Prince")
faction = "Vampire"
total_positions = 4
@@ -25,9 +25,13 @@
known_contacts = list("Tremere Regent")
experience_addition = 15
+AddTimelock(/datum/job/vamp/tremere/archivist, list(
+ JOB_LIVING_ROLES = 2 HOURS,
+))
+
/datum/outfit/job/archivist
name = "Archivist"
- jobtype = /datum/job/vamp/archivist
+ jobtype = /datum/job/vamp/tremere/archivist
id = /obj/item/card/id/archive
glasses = /obj/item/clothing/glasses/vampire/perception
diff --git a/code/modules/vtmb/jobs/regent.dm b/code/modules/vtmb/jobs/tremere/regent.dm
similarity index 89%
rename from code/modules/vtmb/jobs/regent.dm
rename to code/modules/vtmb/jobs/tremere/regent.dm
index 9323e8c5a5..9b1b3209e7 100644
--- a/code/modules/vtmb/jobs/regent.dm
+++ b/code/modules/vtmb/jobs/tremere/regent.dm
@@ -1,6 +1,6 @@
-/datum/job/vamp/regent
- title = "Chantry Regent"
+/datum/job/vamp/tremere/regent
+ title = JOB_REGENT
department_head = list("Prince")
faction = "Vampire"
total_positions = 1
@@ -26,9 +26,14 @@
experience_addition = 20
known_contacts = list("Prince")
+AddTimelock(/datum/job/vamp/tremere/regent, list(
+ JOB_TREMERE_ROLES = 10 HOURS,
+ JOB_LIVING_ROLES = 2 HOURS,
+))
+
/datum/outfit/job/regent
name = "Chantry Regent"
- jobtype = /datum/job/vamp/regent
+ jobtype = /datum/job/vamp/tremere/regent
id = /obj/item/card/id/regent
glasses = /obj/item/clothing/glasses/vampire/perception
diff --git a/code/modules/vtmb/jobs/tremere/tremere.dm b/code/modules/vtmb/jobs/tremere/tremere.dm
new file mode 100644
index 0000000000..5feca1b936
--- /dev/null
+++ b/code/modules/vtmb/jobs/tremere/tremere.dm
@@ -0,0 +1,21 @@
+/datum/job/vamp/tremere
+ supervisors = "the Pyramid"
+ total_positions = 1
+ spawn_positions = 1
+
+/datum/timelock/tremere
+ name = "Tremere Roles"
+
+/datum/timelock/tremere/New(name, time_required, list/roles)
+ . = ..()
+ src.roles = JOB_TREMERE_ROLES_LIST
+
+
+/datum/timelock/living
+ name = "Living Roles"
+
+/datum/timelock/living/can_play(client/C)
+ return C.get_time_living() >= time_required
+
+/datum/timelock/living/get_role_requirement(client/C)
+ return time_required - C.get_time_living()
diff --git a/code/modules/vtmb/jobs/bogatyr.dm b/code/modules/vtmb/jobs/tzimisce_mansion/bogatyr.dm
similarity index 90%
rename from code/modules/vtmb/jobs/bogatyr.dm
rename to code/modules/vtmb/jobs/tzimisce_mansion/bogatyr.dm
index 26b1dce3a4..cb1be8e47c 100644
--- a/code/modules/vtmb/jobs/bogatyr.dm
+++ b/code/modules/vtmb/jobs/tzimisce_mansion/bogatyr.dm
@@ -1,6 +1,6 @@
-/datum/job/vamp/bogatyr
- title = "Bogatyr"
+/datum/job/vamp/tzimisce_mansion_v/bogatyr
+ title = JOB_BOGATYR
department_head = list("Voivode")
faction = "Vampire"
total_positions = 4
@@ -27,6 +27,10 @@
my_contact_is_important = TRUE
known_contacts = list("Prince", "Baron", "Sheriff")
+AddTimelock(/datum/job/vamp/tzimisce_mansion_v/bogatyr, list(
+ JOB_LIVING_ROLES = 2 HOURS,
+))
+
/datum/outfit/job/bogatyr/pre_equip(mob/living/carbon/human/H)
..()
if(H.gender == FEMALE)
@@ -36,7 +40,7 @@
/datum/outfit/job/bogatyr
name = "Bogatyr"
- jobtype = /datum/job/vamp/bogatyr
+ jobtype = /datum/job/vamp/tzimisce_mansion_v/bogatyr
id = /obj/item/card/id/bogatyr
//glasses = /obj/item/clothing/glasses/vampire/yellow
uniform = /obj/item/clothing/under/vampire/bogatyr
diff --git a/code/modules/vtmb/jobs/tzimisce_mansion/tzimisce_mansion_v.dm b/code/modules/vtmb/jobs/tzimisce_mansion/tzimisce_mansion_v.dm
new file mode 100644
index 0000000000..daa9e39c51
--- /dev/null
+++ b/code/modules/vtmb/jobs/tzimisce_mansion/tzimisce_mansion_v.dm
@@ -0,0 +1,21 @@
+/datum/job/vamp/tzimisce_mansion_v
+ supervisors = "the Laws of Hospitality"
+ total_positions = 1
+ spawn_positions = 1
+
+/datum/timelock/tzimisce_mansion_v
+ name = "Tzismice Mansion Roles"
+
+/datum/timelock/tzimisce_mansion_v/New(name, time_required, list/roles)
+ . = ..()
+ src.roles = JOB_TZIMISCE_MANSION_ROLES_LIST
+
+
+/datum/timelock/living
+ name = "Living Roles"
+
+/datum/timelock/living/can_play(client/C)
+ return C.get_time_living() >= time_required
+
+/datum/timelock/living/get_role_requirement(client/C)
+ return time_required - C.get_time_living()
diff --git a/code/modules/vtmb/jobs/voivode.dm b/code/modules/vtmb/jobs/tzimisce_mansion/voivode.dm
similarity index 87%
rename from code/modules/vtmb/jobs/voivode.dm
rename to code/modules/vtmb/jobs/tzimisce_mansion/voivode.dm
index c8a67cac84..3a6899aab4 100644
--- a/code/modules/vtmb/jobs/voivode.dm
+++ b/code/modules/vtmb/jobs/tzimisce_mansion/voivode.dm
@@ -1,5 +1,5 @@
-/datum/job/vamp/voivode
- title = "Voivode"
+/datum/job/vamp/tzimisce_mansion_v/voivode
+ title = JOB_VOIVODE
department_head = list("Eldest")
faction = "Vampire"
total_positions = 1
@@ -26,11 +26,14 @@
my_contact_is_important = TRUE
known_contacts = list("Prince", "Baron", "Sheriff")
-
+AddTimelock(/datum/job/vamp/tzimisce_mansion_v/voivode, list(
+ JOB_TZIMISCE_MANSION_ROLES = 10 HOURS,
+ JOB_LIVING_ROLES = 2 HOURS,
+))
/datum/outfit/job/voivode
name = "Voivode"
- jobtype = /datum/job/vamp/voivode
+ jobtype = /datum/job/vamp/tzimisce_mansion_v/voivode
id = /obj/item/card/id/voivode
//glasses = /obj/item/clothing/glasses/vampire/yellow
uniform = /obj/item/clothing/under/vampire/voivode
diff --git a/code/modules/vtmb/jobs/zadruga.dm b/code/modules/vtmb/jobs/tzimisce_mansion/zadruga.dm
similarity index 86%
rename from code/modules/vtmb/jobs/zadruga.dm
rename to code/modules/vtmb/jobs/tzimisce_mansion/zadruga.dm
index 33c179121e..82066abf9c 100644
--- a/code/modules/vtmb/jobs/zadruga.dm
+++ b/code/modules/vtmb/jobs/tzimisce_mansion/zadruga.dm
@@ -1,5 +1,5 @@
-/datum/job/vamp/zadruga
- title = "Zadruga"
+/datum/job/vamp/tzimisce_mansion_v/zadruga
+ title = JOB_ZADRUGA
department_head = list("Voivode")
faction = "Ghoul" //[Lucifernix] - Change this to vampire when I actually fix this.
total_positions = 2
@@ -26,12 +26,15 @@
my_contact_is_important = FALSE
known_contacts = list("Prince", "Baron", "Sheriff")
-
+AddTimelock(/datum/job/vamp/tzimisce_mansion_v/zadruga, list(
+ JOB_TZIMISCE_MANSION_ROLES = 5 HOURS,
+ JOB_LIVING_ROLES = 2 HOURS,
+))
/datum/outfit/job/zadruga
name = "zadruga"
- jobtype = /datum/job/vamp/zadruga
+ jobtype = /datum/job/vamp/tzimisce_mansion_v/zadruga
id = /obj/item/card/id/bogatyr
//glasses = /obj/item/clothing/glasses/vampire/yellow
uniform = /obj/item/clothing/under/vampire/bogatyr
diff --git a/code/modules/vtmb/jobs/citizen.dm b/code/modules/vtmb/jobs/unaligned/citizen.dm
similarity index 95%
rename from code/modules/vtmb/jobs/citizen.dm
rename to code/modules/vtmb/jobs/unaligned/citizen.dm
index d4bb74cde5..da54b7dbbc 100644
--- a/code/modules/vtmb/jobs/citizen.dm
+++ b/code/modules/vtmb/jobs/unaligned/citizen.dm
@@ -1,6 +1,6 @@
-/datum/job/vamp/citizen
- title = "Citizen"
+/datum/job/vamp/unaligned/citizen
+ title = JOB_CIVILIAN
faction = "Vampire"
total_positions = -1
spawn_positions = -1
@@ -27,7 +27,7 @@
/datum/outfit/job/citizen
name = "Citizen"
- jobtype = /datum/job/vamp/citizen
+ jobtype = /datum/job/vamp/unaligned/citizen
l_pocket = /obj/item/vamp/phone
id = /obj/item/cockclock
diff --git a/code/modules/vtmb/jobs/unaligned/unaligned.dm b/code/modules/vtmb/jobs/unaligned/unaligned.dm
new file mode 100644
index 0000000000..9bcd79fb87
--- /dev/null
+++ b/code/modules/vtmb/jobs/unaligned/unaligned.dm
@@ -0,0 +1,21 @@
+/datum/job/vamp/unaligned
+ supervisors = "Yourself"
+ total_positions = 1
+ spawn_positions = 1
+
+/datum/timelock/unaligned
+ name = "Unaligned Roles"
+
+/datum/timelock/unaligned/New(name, time_required, list/roles)
+ . = ..()
+ src.roles = JOB_UNALIGNED_ROLES_LIST
+
+
+/datum/timelock/living
+ name = "Living Roles"
+
+/datum/timelock/living/can_play(client/C)
+ return C.get_time_living() >= time_required
+
+/datum/timelock/living/get_role_requirement(client/C)
+ return time_required - C.get_time_living()
diff --git a/code/modules/vtmb/jobs/dealer.dm b/code/modules/vtmb/jobs/warehouse/dealer.dm
similarity index 91%
rename from code/modules/vtmb/jobs/dealer.dm
rename to code/modules/vtmb/jobs/warehouse/dealer.dm
index 4f66ed393e..5e5c135654 100644
--- a/code/modules/vtmb/jobs/dealer.dm
+++ b/code/modules/vtmb/jobs/warehouse/dealer.dm
@@ -1,6 +1,6 @@
-/datum/job/vamp/dealer
- title = "Dealer"
+/datum/job/vamp/warehouse/dealer
+ title = JOB_DEALER
department_head = list("Yourself")
faction = "Vampire"
total_positions = 1
@@ -32,9 +32,15 @@
allowed_species = list("Vampire", "Werewolf", "Kuei-Jin")
experience_addition = 20
+AddTimelock(/datum/job/vamp/warehouse/dealer, list(
+ JOB_WAREHOUSE_ROLES = 5 HOURS,
+ JOB_LIVING_ROLES = 2 HOURS,
+))
+
+
/datum/outfit/job/dealer
name = "Dealer"
- jobtype = /datum/job/vamp/dealer
+ jobtype = /datum/job/vamp/warehouse/dealer
id = /obj/item/card/id/dealer
uniform = /obj/item/clothing/under/vampire/suit
diff --git a/code/modules/vtmb/jobs/supply_assistant.dm b/code/modules/vtmb/jobs/warehouse/supply_assistant.dm
similarity index 91%
rename from code/modules/vtmb/jobs/supply_assistant.dm
rename to code/modules/vtmb/jobs/warehouse/supply_assistant.dm
index 59fcf9955e..f9dac220b6 100644
--- a/code/modules/vtmb/jobs/supply_assistant.dm
+++ b/code/modules/vtmb/jobs/warehouse/supply_assistant.dm
@@ -1,6 +1,6 @@
-/datum/job/vamp/supply
- title = "Supply Technician"
+/datum/job/vamp/warehouse/supply
+ title = JOB_SUPPLY
department_head = list("Dealer")
faction = "Vampire"
total_positions = 4
@@ -26,9 +26,13 @@
minimal_masquerade = 2
experience_addition = 15
+AddTimelock(/datum/job/vamp/warehouse/supply, list(
+ JOB_LIVING_ROLES = 2 HOURS,
+))
+
/datum/outfit/job/supply
name = "Supply Technician"
- jobtype = /datum/job/vamp/supply
+ jobtype = /datum/job/vamp/warehouse/supply
id = /obj/item/card/id/supplytech
uniform = /obj/item/clothing/under/vampire/supply
diff --git a/code/modules/vtmb/jobs/warehouse/warehouse.dm b/code/modules/vtmb/jobs/warehouse/warehouse.dm
new file mode 100644
index 0000000000..9cec8b4574
--- /dev/null
+++ b/code/modules/vtmb/jobs/warehouse/warehouse.dm
@@ -0,0 +1,21 @@
+/datum/job/vamp/warehouse
+ supervisors = "None. You are beholden only to yourself."
+ total_positions = 1
+ spawn_positions = 1
+
+/datum/timelock/warehouse
+ name = "Warehouse Roles"
+
+/datum/timelock/warehouse/New(name, time_required, list/roles)
+ . = ..()
+ src.roles = JOB_WAREHOUSE_ROLES_LIST
+
+
+/datum/timelock/living
+ name = "Living Roles"
+
+/datum/timelock/living/can_play(client/C)
+ return C.get_time_living() >= time_required
+
+/datum/timelock/living/get_role_requirement(client/C)
+ return time_required - C.get_time_living()
diff --git a/tgstation.dme b/tgstation.dme
index 1ae420f64f..f09bd3a52f 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -3366,40 +3366,53 @@
#include "code\modules\vtmb\gamemodes\masquerade.dm"
#include "code\modules\vtmb\gamemodes\sarcophagus.dm"
#include "code\modules\vtmb\gamemodes\subsystem.dm"
-#include "code\modules\vtmb\jobs\archivist.dm"
-#include "code\modules\vtmb\jobs\bogatyr.dm"
-#include "code\modules\vtmb\jobs\caitiff.dm"
-#include "code\modules\vtmb\jobs\citizen.dm"
-#include "code\modules\vtmb\jobs\dealer.dm"
-#include "code\modules\vtmb\jobs\dispatcher.dm"
-#include "code\modules\vtmb\jobs\doctor.dm"
-#include "code\modules\vtmb\jobs\fbi.dm"
-#include "code\modules\vtmb\jobs\giovanni.dm"
-#include "code\modules\vtmb\jobs\graveyard_keeper.dm"
-#include "code\modules\vtmb\jobs\hound.dm"
-#include "code\modules\vtmb\jobs\hunter.dm"
-#include "code\modules\vtmb\jobs\janitor.dm"
+#include "code\modules\vtmb\jobs\tremere\archivist.dm"
+#include "code\modules\vtmb\jobs\tzimisce_mansion\bogatyr.dm"
+#include "code\modules\vtmb\jobs\antags\caitiff.dm"
+#include "code\modules\vtmb\jobs\unaligned\citizen.dm"
+#include "code\modules\vtmb\jobs\warehouse\dealer.dm"
+#include "code\modules\vtmb\jobs\police_force\dispatcher.dm"
+#include "code\modules\vtmb\jobs\clinic\doctor.dm"
+#include "code\modules\vtmb\jobs\national_security\fbi.dm"
+#include "code\modules\vtmb\jobs\giovanni_family\giovanni.dm"
+#include "code\modules\vtmb\jobs\city_services\graveyard_keeper.dm"
+#include "code\modules\vtmb\jobs\antags\hunter.dm"
+#include "code\modules\vtmb\jobs\city_services\janitor.dm"
#include "code\modules\vtmb\jobs\jobs.dm"
-#include "code\modules\vtmb\jobs\national_guard.dm"
-#include "code\modules\vtmb\jobs\police.dm"
-#include "code\modules\vtmb\jobs\priest.dm"
-#include "code\modules\vtmb\jobs\primogen.dm"
-#include "code\modules\vtmb\jobs\prince.dm"
-#include "code\modules\vtmb\jobs\regent.dm"
-#include "code\modules\vtmb\jobs\sabbat.dm"
-#include "code\modules\vtmb\jobs\seneschal.dm"
-#include "code\modules\vtmb\jobs\sheriff.dm"
-#include "code\modules\vtmb\jobs\stripper.dm"
-#include "code\modules\vtmb\jobs\supply_assistant.dm"
-#include "code\modules\vtmb\jobs\swat.dm"
-#include "code\modules\vtmb\jobs\taxi.dm"
-#include "code\modules\vtmb\jobs\triad.dm"
-#include "code\modules\vtmb\jobs\voivode.dm"
-#include "code\modules\vtmb\jobs\zadruga.dm"
-#include "code\modules\vtmb\jobs\anarchs\baron.dm"
-#include "code\modules\vtmb\jobs\anarchs\bouncer.dm"
-#include "code\modules\vtmb\jobs\anarchs\emissary.dm"
-#include "code\modules\vtmb\jobs\anarchs\sweeper.dm"
+#include "code\modules\vtmb\jobs\national_security\national_guard.dm"
+#include "code\modules\vtmb\jobs\police_force\police.dm"
+#include "code\modules\vtmb\jobs\church\priest.dm"
+#include "code\modules\vtmb\jobs\camarilla\camarilla_primogen_council\primogen.dm"
+#include "code\modules\vtmb\jobs\tremere\regent.dm"
+#include "code\modules\vtmb\jobs\antags\sabbat.dm"
+#include "code\modules\vtmb\jobs\city_services\stripper.dm"
+#include "code\modules\vtmb\jobs\warehouse\supply_assistant.dm"
+#include "code\modules\vtmb\jobs\city_services\taxi.dm"
+#include "code\modules\vtmb\jobs\gangs\triad.dm"
+#include "code\modules\vtmb\jobs\tzimisce_mansion\voivode.dm"
+#include "code\modules\vtmb\jobs\tzimisce_mansion\zadruga.dm"
+#include "code\modules\vtmb\jobs\camarilla\camarilla_authorities\prince.dm"
+#include "code\modules\vtmb\jobs\camarilla\camarilla_authorities\hound.dm"
+#include "code\modules\vtmb\jobs\camarilla\camarilla_authorities\seneschal.dm"
+#include "code\modules\vtmb\jobs\camarilla\camarilla_authorities\sheriff.dm"
+#include "code\modules\vtmb\jobs\camarilla\camarilla.dm"
+#include "code\modules\vtmb\jobs\anarch\anarch.dm"
+#include "code\modules\vtmb\jobs\warehouse\warehouse.dm"
+#include "code\modules\vtmb\jobs\gangs\gangs.dm"
+#include "code\modules\vtmb\jobs\city_services\city_services.dm"
+#include "code\modules\vtmb\jobs\clinic\clinic.dm"
+#include "code\modules\vtmb\jobs\police_force\police_force.dm"
+#include "code\modules\vtmb\jobs\national_security\swat.dm"
+#include "code\modules\vtmb\jobs\church\church.dm"
+#include "code\modules\vtmb\jobs\national_security\national_security.dm"
+#include "code\modules\vtmb\jobs\giovanni_family\giovanni_family.dm"
+#include "code\modules\vtmb\jobs\unaligned\unaligned.dm"
+#include "code\modules\vtmb\jobs\tremere\tremere.dm"
+#include "code\modules\vtmb\jobs\tzimisce_mansion\tzimisce_mansion_v.dm"
+#include "code\modules\vtmb\jobs\anarch\baron.dm"
+#include "code\modules\vtmb\jobs\anarch\bouncer.dm"
+#include "code\modules\vtmb\jobs\anarch\emissary.dm"
+#include "code\modules\vtmb\jobs\anarch\sweeper.dm"
#include "code\modules\vtmb\magic\mysticism.dm"
#include "code\modules\vtmb\magic\pyramid.dm"
#include "code\modules\vtmb\npc\beastmaster.dm"
|