Merge remote-tracking branch 'upstream/master'

This commit is contained in:
Mosley
2024-11-21 22:44:41 -05:00
26 changed files with 522 additions and 237 deletions

14
.vscode/launch.json vendored
View File

@@ -7,6 +7,13 @@
"name": "Launch DreamSeeker", "name": "Launch DreamSeeker",
"preLaunchTask": "Build All", "preLaunchTask": "Build All",
"dmb": "${workspaceFolder}/${command:CurrentDMB}" "dmb": "${workspaceFolder}/${command:CurrentDMB}"
},
{
"type": "byond",
"request": "launch",
"name": "Launch DreamSeeker (TRACY)",
"preLaunchTask": "Build All (TRACY)",
"dmb": "${workspaceFolder}/${command:CurrentDMB}"
}, },
{ {
"type": "byond", "type": "byond",
@@ -45,6 +52,13 @@
"preLaunchTask": "Build All (LOWMEMORYMODE)", "preLaunchTask": "Build All (LOWMEMORYMODE)",
"dmb": "${workspaceFolder}/${command:CurrentDMB}", "dmb": "${workspaceFolder}/${command:CurrentDMB}",
"dreamDaemon": true "dreamDaemon": true
},
{
"type": "byond",
"request": "launch",
"name": "Launch DreamSeeker (LOWMEMORYMODE + TRACY)",
"preLaunchTask": "Build All (LOWMEMORYMODE TRACY)",
"dmb": "${workspaceFolder}/${command:CurrentDMB}"
} }
] ]
} }

51
.vscode/tasks.json vendored
View File

@@ -24,6 +24,31 @@
"dependsOn": "dm: reparse", "dependsOn": "dm: reparse",
"label": "Build All" "label": "Build All"
}, },
{
"type": "process",
"command": "tools/build/build",
"windows": {
"command": ".\\tools\\build\\build.bat"
},
"options": {
"env": {
"DM_EXE": "${config:dreammaker.byondPath}"
}
},
"problemMatcher": [
"$dreammaker",
"$tsc",
"$eslint-stylish"
],
"group": {
"kind": "build"
},
"dependsOn": "dm: reparse",
"args": [
"-DUSE_BYOND_TRACY"
],
"label": "Build All (TRACY)"
},
{ {
"type": "process", "type": "process",
"command": "tools/build/build", "command": "tools/build/build",
@@ -74,6 +99,32 @@
], ],
"label": "Build All (LOWMEMORYMODE)" "label": "Build All (LOWMEMORYMODE)"
}, },
{
"type": "process",
"command": "tools/build/build",
"windows": {
"command": ".\\tools\\build\\build.bat"
},
"options": {
"env": {
"DM_EXE": "${config:dreammaker.byondPath}"
}
},
"problemMatcher": [
"$dreammaker",
"$tsc",
"$eslint-stylish"
],
"group": {
"kind": "build"
},
"dependsOn": "dm: reparse",
"args": [
"-DLOWMEMORYMODE",
"-DUSE_BYOND_TRACY"
],
"label": "Build All (LOWMEMORYMODE TRACY)"
},
{ {
"type": "dreammaker", "type": "dreammaker",
"dme": "tgstation.dme", "dme": "tgstation.dme",

View File

@@ -588,13 +588,11 @@
if((character.mind.assigned_role == "Cyborg") || (character.mind.assigned_role == character.mind.special_role) || (character.mind.assigned_role == "Stowaway")) if((character.mind.assigned_role == "Cyborg") || (character.mind.assigned_role == character.mind.special_role) || (character.mind.assigned_role == "Stowaway"))
return return
//Skyrat changes
var/displayed_rank = rank var/displayed_rank = rank
if(character.client && character.client.prefs && character.client.prefs.alt_titles_preferences[rank]) if(character.client && character.client.prefs && character.client?.prefs?.alt_titles_preferences[rank])
displayed_rank = character.client.prefs.alt_titles_preferences[rank] displayed_rank = character.client?.prefs?.alt_titles_preferences[rank]
var/obj/machinery/announcement_system/announcer = pick(GLOB.announcement_systems) var/obj/machinery/announcement_system/announcer = pick(GLOB.announcement_systems)
announcer.announce("ARRIVAL", character.real_name, displayed_rank, list()) //make the list empty to make it announce it in common announcer.announce("ARRIVAL", character.real_name, displayed_rank, list()) //make the list empty to make it announce it in common
//End of skyrat changes
/proc/lavaland_equipment_pressure_check(turf/T) /proc/lavaland_equipment_pressure_check(turf/T)
. = FALSE . = FALSE

View File

@@ -50,6 +50,10 @@
//#define UNIT_TESTS //If this is uncommented, we do a single run though of the game setup and tear down process with unit tests in between //#define UNIT_TESTS //If this is uncommented, we do a single run though of the game setup and tear down process with unit tests in between
// If this is uncommented, will attempt to load and initialize prof.dll/libprof.so.
// We do not ship byond-tracy. Build it yourself here: https://github.com/mafemergency/byond-tracy/
//#define USE_BYOND_TRACY
#ifndef PRELOAD_RSC //set to: #ifndef PRELOAD_RSC //set to:
#define PRELOAD_RSC 2 // 0 to allow using external resources or on-demand behaviour; #define PRELOAD_RSC 2 // 0 to allow using external resources or on-demand behaviour;
#endif // 1 to use the default behaviour; #endif // 1 to use the default behaviour;

View File

@@ -292,7 +292,8 @@ GLOBAL_REAL(Master, /datum/controller/master) = new
SS.state = SS_IDLE SS.state = SS_IDLE
if (SS.flags & SS_TICKER) if (SS.flags & SS_TICKER)
tickersubsystems += SS tickersubsystems += SS
timer += world.tick_lag * rand(1, 5) // Timer subsystems aren't allowed to bunch up, so we offset them a bit
timer += world.tick_lag * rand(0, 1)
SS.next_fire = timer SS.next_fire = timer
continue continue
@@ -371,14 +372,16 @@ GLOBAL_REAL(Master, /datum/controller/master) = new
var/checking_runlevel = current_runlevel var/checking_runlevel = current_runlevel
if(cached_runlevel != checking_runlevel) if(cached_runlevel != checking_runlevel)
//resechedule subsystems //resechedule subsystems
var/list/old_subsystems = current_runlevel_subsystems
cached_runlevel = checking_runlevel cached_runlevel = checking_runlevel
current_runlevel_subsystems = runlevel_sorted_subsystems[cached_runlevel] current_runlevel_subsystems = runlevel_sorted_subsystems[cached_runlevel]
var/stagger = world.time
for(var/I in current_runlevel_subsystems) //now we'll go through all the subsystems we want to offset and give them a next_fire
var/datum/controller/subsystem/SS = I for(var/datum/controller/subsystem/SS as anything in current_runlevel_subsystems)
if(SS.next_fire <= world.time) //we only want to offset it if it's new and also behind
stagger += world.tick_lag * rand(1, 5) if(SS.next_fire > world.time || (SS in old_subsystems))
SS.next_fire = stagger continue
SS.next_fire = world.time + world.tick_lag * rand(0, DS2TICKS(min(SS.wait, 2 SECONDS)))
subsystems_to_check = current_runlevel_subsystems subsystems_to_check = current_runlevel_subsystems
else else

View File

@@ -477,12 +477,10 @@ SUBSYSTEM_DEF(job)
else else
handle_auto_deadmin_roles(M.client, rank) handle_auto_deadmin_roles(M.client, rank)
//Skyrat changes
var/display_rank = rank var/display_rank = rank
if(M.client && M.client.prefs && M.client.prefs.alt_titles_preferences[rank]) if(M.client && M.client.prefs && M.client?.prefs?.alt_titles_preferences[rank])
display_rank = M.client.prefs.alt_titles_preferences[rank] display_rank = M.client?.prefs?.alt_titles_preferences[rank]
//End of skyrat changes to_chat(M, "<b>You are the [display_rank].</b>")
to_chat(M, "<b>You are the [display_rank].</b>") //Skyrat change
if(job) if(job)
to_chat(M, "<b>As the [display_rank] you answer directly to [job.supervisors]. Special circumstances may change this.</b>") //Skyrat change to_chat(M, "<b>As the [display_rank] you answer directly to [job.supervisors]. Special circumstances may change this.</b>") //Skyrat change
job.radio_help_message(M) job.radio_help_message(M)

View File

@@ -1,3 +1,5 @@
#define MAX_STACK_PICKUP 30
/datum/component/storage/concrete/rped /datum/component/storage/concrete/rped
collection_mode = COLLECT_EVERYTHING collection_mode = COLLECT_EVERYTHING
allow_quick_gather = TRUE allow_quick_gather = TRUE
@@ -9,13 +11,61 @@
max_items = 100 max_items = 100
display_numerical_stacking = TRUE display_numerical_stacking = TRUE
var/static/list/allowed_material_types = list(
/obj/item/stack/sheet/glass,
/obj/item/stack/sheet/plasteel,
/obj/item/stack/cable_coil,
)
var/static/list/allowed_bluespace_types = list(
/obj/item/stack/ore/bluespace_crystal,
/obj/item/stack/sheet/bluespace_crystal,
)
/datum/component/storage/concrete/rped/can_be_inserted(obj/item/I, stop_messages, mob/M) /datum/component/storage/concrete/rped/can_be_inserted(obj/item/I, stop_messages, mob/M)
. = ..() . = ..()
if(!I.get_part_rating()) if(!.)
if (!stop_messages) return .
to_chat(M, "<span class='warning'>[parent] only accepts machine parts!</span>")
//we check how much of glass,plasteel & cable the user can insert
if(isstack(I))
//user tried to insert invalid stacktype
if(!is_type_in_list(I, allowed_material_types) && !is_type_in_list(I, allowed_bluespace_types))
return FALSE return FALSE
var/obj/item/stack/the_stack = I
var/present_amount = 0
//we try to count & limit how much the user can insert of each type to prevent them from using it as an normal storage medium
for(var/obj/item/stack/stack_content in parent)
//is user trying to insert any of these listed bluespace stuff
if(is_type_in_list(I, allowed_bluespace_types))
//if yes count total bluespace stuff is the RPED and then compare the total amount to the value the user is trying to insert
if(is_type_in_list(stack_content, allowed_bluespace_types))
present_amount += stack_content.amount
//count other normal stack stuff
else if(istype(I,stack_content.type))
present_amount = stack_content.amount
break
//no more storage for this specific stack type
if(MAX_STACK_PICKUP - present_amount == 0)
return FALSE
//we want the user to insert the exact stack amount which is available so we dont have to bother subtracting & leaving left overs for the user
var/available = MAX_STACK_PICKUP-present_amount
if(available - the_stack.amount < 0)
return FALSE
else if(istype(I, /obj/item/circuitboard/machine) || istype(I, /obj/item/circuitboard/computer))
return TRUE
//check normal insertion of other stock parts
else if(!I.get_part_rating())
return FALSE
return .
/datum/component/storage/concrete/rped/quick_empty(mob/M) /datum/component/storage/concrete/rped/quick_empty(mob/M)
var/atom/A = parent var/atom/A = parent
if(!M.canUseStorage() || !A.Adjacent(M) || M.incapacitated()) if(!M.canUseStorage() || !A.Adjacent(M) || M.incapacitated())
@@ -52,13 +102,60 @@
max_items = 350 max_items = 350
display_numerical_stacking = TRUE display_numerical_stacking = TRUE
var/static/list/allowed_material_types = list(
/obj/item/stack/sheet/glass,
/obj/item/stack/sheet/plasteel,
/obj/item/stack/cable_coil,
)
var/static/list/allowed_bluespace_types = list(
/obj/item/stack/ore/bluespace_crystal,
/obj/item/stack/sheet/bluespace_crystal,
)
/datum/component/storage/concrete/bluespace/rped/can_be_inserted(obj/item/I, stop_messages, mob/M) /datum/component/storage/concrete/bluespace/rped/can_be_inserted(obj/item/I, stop_messages, mob/M)
. = ..() . = ..()
if(!I.get_part_rating()) if(!.)
if (!stop_messages) return .
to_chat(M, "<span class='warning'>[parent] only accepts machine parts!</span>")
//we check how much of glass,plasteel & cable the user can insert
if(isstack(I))
//user tried to insert invalid stacktype
if(!is_type_in_list(I, allowed_material_types) && !is_type_in_list(I, allowed_bluespace_types))
return FALSE return FALSE
var/obj/item/stack/the_stack = I
var/present_amount = 0
//we try to count & limit how much the user can insert of each type to prevent them from using it as an normal storage medium
for(var/obj/item/stack/stack_content in parent)
//is user trying to insert any of these listed bluespace stuff
if(is_type_in_list(I, allowed_bluespace_types))
//if yes count total bluespace stuff is the RPED and then compare the total amount to the value the user is trying to insert
if(is_type_in_list(stack_content, allowed_bluespace_types))
present_amount += stack_content.amount
//count other normal stack stuff
else if(istype(I,stack_content.type))
present_amount = stack_content.amount
break
//no more storage for this specific stack type
if(MAX_STACK_PICKUP - present_amount == 0)
return FALSE
//we want the user to insert the exact stack amount which is available so we dont have to bother subtracting & leaving left overs for the user
var/available = MAX_STACK_PICKUP-present_amount
if(available - the_stack.amount < 0)
return FALSE
else if(istype(I, /obj/item/circuitboard/machine) || istype(I, /obj/item/circuitboard/computer))
return TRUE
//check normal insertion of other stock parts
else if(!I.get_part_rating())
return FALSE
return .
/datum/component/storage/concrete/bluespace/rped/quick_empty(mob/M) /datum/component/storage/concrete/bluespace/rped/quick_empty(mob/M)
var/atom/A = parent var/atom/A = parent
@@ -85,3 +182,5 @@
stoplag(1) stoplag(1)
progress.end_progress() progress.end_progress()
A.do_squish(0.8, 1.2) A.do_squish(0.8, 1.2)
#undef MAX_STACK_PICKUP

View File

@@ -142,16 +142,18 @@
var/static/list/show_directions = list(SOUTH, WEST) var/static/list/show_directions = list(SOUTH, WEST)
if(H.mind && (H.mind.assigned_role != H.mind.special_role) && (H.mind.assigned_role != "Stowaway")) if(H.mind && (H.mind.assigned_role != H.mind.special_role) && (H.mind.assigned_role != "Stowaway"))
var/assignment var/assignment
var/displayed_rank
if(H.mind.assigned_role) if(H.mind.assigned_role)
assignment = H.mind.assigned_role assignment = H.mind.assigned_role
else if(H.job) else if(H.job)
assignment = H.job assignment = H.job
else else
assignment = "Unassigned" assignment = "Unassigned"
//Skyrat changes
if(C && C.prefs && C.prefs.alt_titles_preferences[assignment]) if(C && C.prefs && C.prefs.alt_titles_preferences[assignment])
assignment = C.prefs.alt_titles_preferences[assignment] assignment = C.prefs.alt_titles_preferences[assignment]
//End of skyrat changes
if(assignment)
displayed_rank = C.prefs.alt_titles_preferences[assignment]
var/static/record_id_num = 1001 var/static/record_id_num = 1001
var/id = num2hex(record_id_num++,6) var/id = num2hex(record_id_num++,6)
@@ -174,7 +176,7 @@
var/datum/data/record/G = new() var/datum/data/record/G = new()
G.fields["id"] = id G.fields["id"] = id
G.fields["name"] = H.real_name G.fields["name"] = H.real_name
G.fields["rank"] = assignment G.fields["rank"] = displayed_rank
G.fields["age"] = H.age G.fields["age"] = H.age
G.fields["species"] = H.dna.species.name G.fields["species"] = H.dna.species.name
G.fields["fingerprint"] = md5(H.dna.uni_identity) G.fields["fingerprint"] = md5(H.dna.uni_identity)
@@ -221,7 +223,7 @@
var/datum/data/record/L = new() var/datum/data/record/L = new()
L.fields["id"] = md5("[H.real_name][H.mind.assigned_role]") //surely this should just be id, like the others? L.fields["id"] = md5("[H.real_name][H.mind.assigned_role]") //surely this should just be id, like the others?
L.fields["name"] = H.real_name L.fields["name"] = H.real_name
L.fields["rank"] = H.mind.assigned_role L.fields["rank"] = displayed_rank
L.fields["age"] = H.age L.fields["age"] = H.age
if(H.gender == MALE) if(H.gender == MALE)
G.fields["gender"] = "Male" G.fields["gender"] = "Male"

View File

@@ -63,12 +63,13 @@
//msg = "<b>[user]</b> " + msg //SKYRAT CHANGE //msg = "<b>[user]</b> " + msg //SKYRAT CHANGE
var/dchatmsg = "<span class='emote'><b>[user]</b> [msg]</span>" //SKYRAT CHANGE var/dchatmsg = "<span class='emote'><b>[user]</b> [msg]</span>" //SKYRAT CHANGE
if(user.client)
for(var/mob/M in GLOB.dead_mob_list) for(var/mob/M in GLOB.dead_mob_list)
if(!M.client || isnewplayer(M)) if(!M.client || isnewplayer(M))
continue continue
var/T = get_turf(user) var/T = get_turf(user)
if(M.stat == DEAD && M.client && (M.client.prefs && (M.client.prefs.chat_toggles & CHAT_GHOSTSIGHT)) && !(M in viewers(T, null)) && (user.client)) //SKYRAT CHANGE - only user controlled mobs show their emotes to all-seeing ghosts, to reduce chat spam if(M.stat == DEAD && M.client && (M.client.prefs.chat_toggles & CHAT_GHOSTSIGHT) && !(M in viewers(T, null)))
M.show_message(dchatmsg) //SKYRAT CHANGE M.show_message(dchatmsg)
if(emote_type == EMOTE_AUDIBLE) if(emote_type == EMOTE_AUDIBLE)
user.audible_message(dchatmsg, runechat_popup = chat_popup, rune_msg = msg) user.audible_message(dchatmsg, runechat_popup = chat_popup, rune_msg = msg)

View File

@@ -17,9 +17,9 @@ GLOBAL_LIST_EMPTY(announcement_systems)
circuit = /obj/item/circuitboard/machine/announcement_system circuit = /obj/item/circuitboard/machine/announcement_system
var/obj/item/radio/headset/radio var/obj/item/radio/headset/radio
var/arrival = "%PERSON has signed up as %RANK" var/arrival = "%PERSON has signed up as %DISP_RANK (%RANK)"
var/arrivalToggle = TRUE var/arrivalToggle = TRUE
var/newhead = "%PERSON, %RANK, is the department head." var/newhead = "%PERSON, %DISP_RANK (%RANK), is the department head."
var/newheadToggle = TRUE var/newheadToggle = TRUE
var/cryostorage = "%PERSON, %RANK, has been moved into cryogenic storage." // this shouldnt be changed var/cryostorage = "%PERSON, %RANK, has been moved into cryogenic storage." // this shouldnt be changed
var/cryostorage_tele = "%PERSON, %RANK, has been teleported to CentCom." // you saying it hat man. var/cryostorage_tele = "%PERSON, %RANK, has been teleported to CentCom." // you saying it hat man.
@@ -71,12 +71,13 @@ GLOBAL_LIST_EMPTY(announcement_systems)
else else
return ..() return ..()
/obj/machinery/announcement_system/proc/CompileText(str, user, rank) //replaces user-given variables with actual thingies. /obj/machinery/announcement_system/proc/CompileText(str, user, rank, displayed_rank) //replaces user-given variables with actual thingies.
str = replacetext(str, "%PERSON", "[user]") str = replacetext(str, "%PERSON", "[user]")
str = replacetext(str, "%RANK", "[rank]") str = replacetext(str, "%RANK", "[rank]")
str = replacetext(str, "%DISP_RANK", "[displayed_rank]")
return str return str
/obj/machinery/announcement_system/proc/announce(message_type, user, rank, list/channels) /obj/machinery/announcement_system/proc/announce(message_type, user, rank, displayed_rank, list/channels)
if(!is_operational()) if(!is_operational())
return return
@@ -87,13 +88,13 @@ GLOBAL_LIST_EMPTY(announcement_systems)
rank = "Unknown" rank = "Unknown"
if(message_type == "ARRIVAL" && arrivalToggle) if(message_type == "ARRIVAL" && arrivalToggle)
message = CompileText(arrival, user, rank) message = CompileText(arrival, user, rank, displayed_rank)
else if(message_type == "NEWHEAD" && newheadToggle) else if(message_type == "NEWHEAD" && newheadToggle)
message = CompileText(newhead, user, rank) message = CompileText(newhead, user, rank, displayed_rank)
else if(message_type == "CRYOSTORAGE") else if(message_type == "CRYOSTORAGE")
message = CompileText(cryostorage, user, rank) message = CompileText(cryostorage, user, rank, displayed_rank)
else if(message_type == "CRYOSTORAGE_TELE") else if(message_type == "CRYOSTORAGE_TELE")
message = CompileText(cryostorage_tele, user, rank) message = CompileText(cryostorage_tele, user, rank, displayed_rank)
else if(message_type == "ARRIVALS_BROKEN") else if(message_type == "ARRIVALS_BROKEN")
message = "The arrivals shuttle has been damaged. Docking for repairs..." message = "The arrivals shuttle has been damaged. Docking for repairs..."

View File

@@ -13,6 +13,12 @@ GLOBAL_LIST(topic_status_cache)
if (dll) if (dll)
LIBCALL(dll, "auxtools_init")() LIBCALL(dll, "auxtools_init")()
enable_debugging() enable_debugging()
#ifdef USE_BYOND_TRACY
#warn USE_BYOND_TRACY is enabled
init_byond_tracy()
#endif
world.Profile(PROFILE_START) world.Profile(PROFILE_START)
log_world("World loaded at [TIME_STAMP("hh:mm:ss", FALSE)]!") log_world("World loaded at [TIME_STAMP("hh:mm:ss", FALSE)]!")
@@ -378,19 +384,18 @@ GLOBAL_LIST(topic_status_cache)
/world/proc/on_tickrate_change() /world/proc/on_tickrate_change()
SStimer?.reset_buckets() SStimer?.reset_buckets()
#ifdef TRACY_PROFILING /world/proc/init_byond_tracy()
/proc/prof_init() var/library
var/lib
switch(world.system_type) switch (system_type)
if(MS_WINDOWS) lib = "prof.dll" if (MS_WINDOWS)
if(UNIX) lib = "libprof.so" library = "prof.dll"
else CRASH("unsupported platform") if (UNIX)
library = "libprof.so"
else
CRASH("Unsupported platform: [system_type]")
var/init = LIBCALL(lib, "init")() var/init_result = call_ext(library, "init")("block")
if("0" != init) CRASH("[lib] init error: [init]") if (init_result != "0")
CRASH("Error initializing byond-tracy: [init_result]")
/world/New()
prof_init()
. = ..()
#endif

View File

@@ -8,6 +8,7 @@
category = EVENT_CATEGORY_ENTITIES category = EVENT_CATEGORY_ENTITIES
description = "Spawns a slaughter demon, to hunt by travelling through pools of blood." description = "Spawns a slaughter demon, to hunt by travelling through pools of blood."
/*
/datum/round_event_control/slaughter/canSpawnEvent() /datum/round_event_control/slaughter/canSpawnEvent()
weight = initial(src.weight) weight = initial(src.weight)
var/list/allowed_turf_typecache = typecacheof(/turf/open) - typecacheof(/turf/open/space) var/list/allowed_turf_typecache = typecacheof(/turf/open) - typecacheof(/turf/open/space)
@@ -24,6 +25,7 @@
weight += 0.03 weight += 0.03
CHECK_TICK CHECK_TICK
return ..() return ..()
*/
/datum/round_event/ghost_role/slaughter /datum/round_event/ghost_role/slaughter
minimum_required = 1 minimum_required = 1

View File

@@ -107,6 +107,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/pda_style = MONO var/pda_style = MONO
var/pda_color = "#808000" var/pda_color = "#808000"
var/pda_skin = PDA_SKIN_ALT var/pda_skin = PDA_SKIN_ALT
var/list/alt_titles_preferences = list()
// Added by SPLURT (Custom Blood Color) // Added by SPLURT (Custom Blood Color)
var/custom_blood_color = FALSE var/custom_blood_color = FALSE
@@ -132,7 +133,6 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/view_pixelshift = FALSE var/view_pixelshift = FALSE
var/enable_personal_chat_color = FALSE var/enable_personal_chat_color = FALSE
var/personal_chat_color = "#ffffff" var/personal_chat_color = "#ffffff"
var/list/alt_titles_preferences = list()
var/lust_tolerance = 100 var/lust_tolerance = 100
var/sexual_potency = 15 var/sexual_potency = 15
//Sandstorm CHANGES END //Sandstorm CHANGES END
@@ -1810,11 +1810,9 @@ GLOBAL_LIST_EMPTY(preferences_datums)
HTML += "<tr bgcolor='[job.selection_color]'><td width='60%' align='right'>" HTML += "<tr bgcolor='[job.selection_color]'><td width='60%' align='right'>"
var/rank = job.title var/rank = job.title
//Skyrat changes
var/displayed_rank = rank var/displayed_rank = rank
if(job.alt_titles.len && (rank in alt_titles_preferences)) if(job.alt_titles.len && (rank in alt_titles_preferences))
displayed_rank = alt_titles_preferences[rank] displayed_rank = alt_titles_preferences[rank]
//End of skyrat changes
lastJob = job lastJob = job
if(jobban_isbanned(user, rank)) if(jobban_isbanned(user, rank))
HTML += "<font color=red>[rank]</font></td><td><a href='?_src_=prefs;bancheck=[rank]'> BANNED</a></td></tr>" HTML += "<font color=red>[rank]</font></td><td><a href='?_src_=prefs;bancheck=[rank]'> BANNED</a></td></tr>"
@@ -1836,16 +1834,15 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if((job_preferences["[SSjob.overflow_role]"] == JP_LOW) && (rank != SSjob.overflow_role) && !jobban_isbanned(user, SSjob.overflow_role)) if((job_preferences["[SSjob.overflow_role]"] == JP_LOW) && (rank != SSjob.overflow_role) && !jobban_isbanned(user, SSjob.overflow_role))
HTML += "<font color=orange>[rank]</font></td><td></td></tr>" HTML += "<font color=orange>[rank]</font></td><td></td></tr>"
continue continue
//Skyrat changes
var/rank_title_line = "[displayed_rank]" var/rank_title_line = "[displayed_rank]"
if((rank in GLOB.command_positions) || (rank == "AI"))//Bold head jobs if((rank in GLOB.command_positions) || (rank == "AI"))//Bold head jobs
rank_title_line = "<b>[rank_title_line]</b>" rank_title_line = "<b>[rank_title_line]</b>"
if(job.alt_titles.len) if(job.alt_titles.len)
rank_title_line = "<a href='?_src_=prefs;preference=job;task=alt_title;job_title=[job.title]'>[rank_title_line]</a>" rank_title_line = "<a href='?_src_=prefs;preference=job;task=alt_title;job_title=[job.title]'>[rank_title_line]</a>"
else else
rank_title_line = "<span class='dark'>[rank_title_line]</span>" //Make it dark if we're not adding a button for alt titles rank_title_line = "<span class='dark'>[rank_title_line]</span>" //Make it dark if we're not adding a button for alt titles
HTML += rank_title_line HTML += rank_title_line
//End of skyrat changes
HTML += "</td><td width='40%'>" HTML += "</td><td width='40%'>"
@@ -2099,7 +2096,6 @@ GLOBAL_LIST_EMPTY(preferences_datums)
SetChoices(user) SetChoices(user)
if("setJobLevel") if("setJobLevel")
UpdateJobPreference(user, href_list["text"], text2num(href_list["level"])) UpdateJobPreference(user, href_list["text"], text2num(href_list["level"]))
//SKYRAT CHANGES
if("alt_title") if("alt_title")
var/job_title = href_list["job_title"] var/job_title = href_list["job_title"]
var/titles_list = list(job_title) var/titles_list = list(job_title)
@@ -2115,7 +2111,6 @@ GLOBAL_LIST_EMPTY(preferences_datums)
else else
alt_titles_preferences[job_title] = chosen_title alt_titles_preferences[job_title] = chosen_title
SetChoices(user) SetChoices(user)
//END OF SKYRAT CHANGES
else else
SetChoices(user) SetChoices(user)
return TRUE return TRUE

View File

@@ -1121,6 +1121,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
if(json_from_file) if(json_from_file)
belly_prefs = json_from_file["belly_prefs"] belly_prefs = json_from_file["belly_prefs"]
S["alt_titles_preferences"] >> alt_titles_preferences
//gear loadout //gear loadout
if(istext(S["loadout"])) if(istext(S["loadout"]))
loadout_data = safe_json_decode(S["loadout"]) loadout_data = safe_json_decode(S["loadout"])
@@ -1389,6 +1390,13 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
loadout_slot = sanitize_num_clamp(loadout_slot, 1, MAXIMUM_LOADOUT_SAVES, 1, TRUE) loadout_slot = sanitize_num_clamp(loadout_slot, 1, MAXIMUM_LOADOUT_SAVES, 1, TRUE)
alt_titles_preferences = SANITIZE_LIST(alt_titles_preferences)
if(SSjob)
for(var/datum/job/job in SSjob.occupations)
if(alt_titles_preferences[job.title])
if(!(alt_titles_preferences[job.title] in job.alt_titles))
alt_titles_preferences.Remove(job.title)
cit_character_pref_load(S) cit_character_pref_load(S)
splurt_character_pref_load(S) splurt_character_pref_load(S)
@@ -1553,6 +1561,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
WRITE_FILE(S["feature_neckfire"], features["neckfire"]) WRITE_FILE(S["feature_neckfire"], features["neckfire"])
WRITE_FILE(S["feature_neckfire_color"], features["neckfire_color"]) WRITE_FILE(S["feature_neckfire_color"], features["neckfire_color"])
WRITE_FILE(S["alt_titles_preferences"], alt_titles_preferences)
WRITE_FILE(S["feature_ooc_notes"], features["ooc_notes"]) WRITE_FILE(S["feature_ooc_notes"], features["ooc_notes"])
WRITE_FILE(S["feature_color_scheme"], features["color_scheme"]) WRITE_FILE(S["feature_color_scheme"], features["color_scheme"])

View File

@@ -0,0 +1,99 @@
//This file also determines the order for the choose your occupation chances screen.
//Engineering
/datum/job/chief_engineer
alt_titles = list("Head Engineer", "Construction Coordinator", "Project Manager", "Power Plant Director")
/datum/job/engineer
alt_titles = list("Maintenance Technician", "Engine Technician", "Electrician", "Structural Engineer", "Mechanic", "Station Architect", "Nuclear Plant Operator")
/datum/job/atmos
alt_titles = list("Firefighter", "Life Support Specialist", "Disposals Technician")
//Service
/datum/job/assistant
alt_titles = list("Civilian", "Morale Officer", "Off-Duty", "Visitor", "Businessman", "Trader", "Entertainer", "Tourist")
/datum/job/cook
alt_titles = list("Culinary Artist", "Butcher", "Chef de partie", "Poissonier", "Baker", "Taste Tester")
/datum/job/hydro
alt_titles = list("Gardener", "Herbalist", "Botanical Researcher", "Hydroponicist", "Farmer", "Beekeeper", "Vintner")
/datum/job/curator
alt_titles = list("Journalist", "Librarian", "Keeper")
/datum/job/chaplain
alt_titles = list("Priest", "Priestess", "Prior", "Monk", "Nun", "Counselor")
/datum/job/janitor
alt_titles = list("Custodian", "Sanitation Technician", "Maid", "Trash Can", "Disposal Unit")
/datum/job/lawyer
alt_titles = list("Human Resources Agent", "Internal Affairs Agent", "Attorney")
/datum/job/clown
alt_titles = list("Jester", "Comedian")
/datum/job/mime
alt_titles = list("Performer", "Pantomime", "Mimic")
/datum/job/bartender
alt_titles = list("Mixologist", "Sommelier", "Bar Owner", "Barmaid", "Expediter")
//Science
/datum/job/rd
alt_titles = list("Research Manager", "Science Administrator")
/datum/job/scientist
alt_titles = list("Circuitry Designer", "Xenobiologist", "Xenobotanist", "Xenoarcheologist", "Chemical Researcher", "Researcher", "Pyrotechnician")
/datum/job/roboticist
alt_titles = list("Biomechanical Engineer", "Mechatronic Engineer", "Mechanic")
//Medical
/datum/job/cmo
alt_titles = list("Medical Director", "Medical Administrator")
/datum/job/doctor
alt_titles = list("Nurse", "Surgeon", "Physician", "Paramedic", "Trophologist", "Nutritionist", "Therapist", "Psychiatrist")
/datum/job/chemist
alt_titles = list("Pharmacist", "Pharmacologist")
/datum/job/virologist
alt_titles = list("Microbiologist", "Biochemist", "Pathologist")
/datum/job/geneticist
alt_titles = list("Gene Therapist", "Genetics Researcher")
//Security
/datum/job/hos
alt_titles = list("Chief of Security", "Security Commander", "Sheriff")
/datum/job/warden
alt_titles = list("Prison Chief", "Armory Manager", "Prison Administrator", "Brig Superintendent")
/datum/job/officer
alt_titles = list("Security Agent", "Probation Officer", "Security Peacekeeper", "Security Guard", "Guardsman", "Security Cadet")
/datum/job/detective
alt_titles = list("Forensics Technician", "Private Investigator", "Gumshoe")
//Supply
/datum/job/qm
alt_titles = list("Supply Chief")
/datum/job/cargo_tech
alt_titles = list("Mail Man", "Mail Woman", "Mailroom Technician", "Deliveries Officer", "Logistics Technician")
/datum/job/mining
alt_titles = list("Exotic Ore Miner", "Fauna Hunter", "Explorer", "Digger") //Just because you're a hunter does not excuse you from rock collecting!!!!!!!!!!!!
//Command
/datum/job/captain
alt_titles = list("Station Director", "Station Commander", "Station Overseer", "Stationmaster", "Commissar")
/datum/job/hop
alt_titles = list("Personnel Manager", "Staff Administrator", "Records Administrator")

View File

@@ -63,6 +63,9 @@
var/list/mind_traits // Traits added to the mind of the mob assigned this job var/list/mind_traits // Traits added to the mind of the mob assigned this job
var/list/blacklisted_quirks //list of quirk typepaths blacklisted. var/list/blacklisted_quirks //list of quirk typepaths blacklisted.
/// What alternate titles does this job currently have?
var/list/alt_titles = list()
/// Should this job be allowed to be picked for the bureaucratic error event? /// Should this job be allowed to be picked for the bureaucratic error event?
var/allow_bureaucratic_error = TRUE var/allow_bureaucratic_error = TRUE
@@ -211,7 +214,7 @@
/datum/job/proc/announce_head(var/mob/living/carbon/human/H, var/channels) //tells the given channel that the given mob is the new department head. See communications.dm for valid channels. /datum/job/proc/announce_head(var/mob/living/carbon/human/H, var/channels) //tells the given channel that the given mob is the new department head. See communications.dm for valid channels.
if(H && GLOB.announcement_systems.len) if(H && GLOB.announcement_systems.len)
//timer because these should come after the captain announcement //timer because these should come after the captain announcement
SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(_addtimer), CALLBACK(pick(GLOB.announcement_systems), TYPE_PROC_REF(/obj/machinery/announcement_system, announce), "NEWHEAD", H.real_name, H.job, channels), 1)) SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(_addtimer), CALLBACK(pick(GLOB.announcement_systems), TYPE_PROC_REF(/obj/machinery/announcement_system, announce), "NEWHEAD", H.real_name, H.job, H.client?.prefs.alt_titles_preferences[H.job], channels), 1))
//If the configuration option is set to require players to be logged as old enough to play certain jobs, then this proc checks that they are, otherwise it just returns 1 //If the configuration option is set to require players to be logged as old enough to play certain jobs, then this proc checks that they are, otherwise it just returns 1
/datum/job/proc/player_old_enough(client/C) /datum/job/proc/player_old_enough(client/C)
@@ -313,14 +316,13 @@
C.access = J.get_access() C.access = J.get_access()
shuffle_inplace(C.access) // Shuffle access list to make NTNet passkeys less predictable shuffle_inplace(C.access) // Shuffle access list to make NTNet passkeys less predictable
C.registered_name = H.real_name C.registered_name = H.real_name
//Skyrat change
if(preference_source && preference_source.prefs && preference_source.prefs.alt_titles_preferences[J.title])
C.assignment = preference_source.prefs.alt_titles_preferences[J.title]
else
C.assignment = J.title C.assignment = J.title
//End of skyrat change if(preference_source && preference_source.prefs && preference_source.prefs.alt_titles_preferences[J.title])
C.update_label(C.registered_name, preference_source.prefs.alt_titles_preferences[J.title])
else
C.update_label() C.update_label()
if(J.title != "Stowaway")
if(J.title != "Stowaway") //SPLURT EDIT
for(var/A in SSeconomy.bank_accounts) for(var/A in SSeconomy.bank_accounts)
var/datum/bank_account/B = A var/datum/bank_account/B = A
if(B.account_id == H.account_id) if(B.account_id == H.account_id)
@@ -332,12 +334,10 @@
var/obj/item/pda/PDA = H.get_item_by_slot(pda_slot) var/obj/item/pda/PDA = H.get_item_by_slot(pda_slot)
if(istype(PDA)) if(istype(PDA))
PDA.owner = H.real_name PDA.owner = H.real_name
//Skyrat change
if(preference_source && preference_source.prefs && preference_source.prefs.alt_titles_preferences[J.title]) if(preference_source && preference_source.prefs && preference_source.prefs.alt_titles_preferences[J.title])
PDA.ownjob = preference_source.prefs.alt_titles_preferences[J.title] PDA.ownjob = preference_source.prefs.alt_titles_preferences[J.title]
else else
PDA.ownjob = J.title PDA.ownjob = J.title
//End of skyrat change
PDA.update_label() PDA.update_label()
if(preference_source && !PDA.equipped) //PDA's screen color, font style and look depend on client preferences. if(preference_source && !PDA.equipped) //PDA's screen color, font style and look depend on client preferences.
PDA.update_style(preference_source) PDA.update_style(preference_source)

View File

@@ -50,7 +50,10 @@
/datum/job/captain/announce(mob/living/carbon/human/H) /datum/job/captain/announce(mob/living/carbon/human/H)
..() ..()
SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(minor_announce), "Captain [H.nameless ? "" : "[H.real_name] "]on deck!")) var/displayed_rank = H.client?.prefs?.alt_titles_preferences[title]
if(!displayed_rank) //Default to Captain
displayed_rank = "Captain"
SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(minor_announce), "[displayed_rank] [H.nameless ? "" : "[H.real_name] "]on deck!"))
/datum/outfit/job/captain /datum/outfit/job/captain
name = "Captain" name = "Captain"

View File

@@ -610,15 +610,14 @@
var/command_bold = "" var/command_bold = ""
if(job in GLOB.command_positions) if(job in GLOB.command_positions)
command_bold = " command" command_bold = " command"
//Sandstorm changes
var/jobline = "[job_datum.title]"
if(job_datum in SSjob.prioritized_jobs) if(job_datum in SSjob.prioritized_jobs)
jobline = "<span class='priority'>[jobline]</span>" dept_dat += "<a class='job[command_bold]' style='display:block;width:170px' href='byond://?src=[REF(src)];SelectedJob=[job_datum.title]'><span class='priority'>[job_datum.title] ([num_positions_current]/[num_positions_total])</span>"
if(client && client.prefs && client.prefs.alt_titles_preferences[job_datum.title]) else
jobline = "[jobline]<br><span style='color:#BBBBBB; font-style: italic;'>(as [client.prefs.alt_titles_preferences[job_datum.title]])</span>" dept_dat += "<a class='job[command_bold]' style='display:block;width:170px' href='byond://?src=[REF(src)];SelectedJob=[job_datum.title]'>[job_datum.title] ([num_positions_current]/[num_positions_total])"
jobline = "<a class='job[command_bold]' style='display:block;width:170px' href='byond://?src=[REF(src)];SelectedJob=[job_datum.title]'>[jobline] ([num_positions_current]/[num_positions_total])</a>" if(client && client.prefs && client?.prefs?.alt_titles_preferences[job_datum.title])
dept_dat += jobline dept_dat += "<br><span style='color:#BBBBBB; font-style: italic;'>as [client?.prefs?.alt_titles_preferences[job_datum.title]]</span>"
//End of Sandstorm changes dept_dat += "</a>"
if(!dept_dat.len) if(!dept_dat.len)
dept_dat += "<span class='nopositions'>No positions open.</span>" dept_dat += "<span class='nopositions'>No positions open.</span>"
dat += jointext(dept_dat, "") dat += jointext(dept_dat, "")

View File

@@ -12,3 +12,6 @@
LeDrascol: LeDrascol:
- code_imp: Modular quirks are now in separate files - code_imp: Modular quirks are now in separate files
- code_imp: Modularized edits to upstream quirks - code_imp: Modularized edits to upstream quirks
2024-11-20:
Arrhythmia_V:
- rscadd: Blade tail now available in character creator (Ported from VOREstation)

View File

@@ -20,14 +20,6 @@
S["lust_tolerance"] >> lust_tolerance S["lust_tolerance"] >> lust_tolerance
S["sexual_potency"] >> sexual_potency S["sexual_potency"] >> sexual_potency
S["alt_titles_preferences"] >> alt_titles_preferences
alt_titles_preferences = SANITIZE_LIST(alt_titles_preferences)
if(SSjob)
for(var/datum/job/job in sort_list(SSjob.occupations, GLOBAL_PROC_REF(cmp_job_display_asc)))
if(alt_titles_preferences[job.title])
if(!(alt_titles_preferences[job.title] in job.alt_titles))
alt_titles_preferences.Remove(job.title)
erppref = sanitize_inlist(S["erp_pref"], GLOB.lewd_prefs_choices, "Ask") erppref = sanitize_inlist(S["erp_pref"], GLOB.lewd_prefs_choices, "Ask")
nonconpref = sanitize_inlist(S["noncon_pref"], GLOB.lewd_prefs_choices, "Ask") nonconpref = sanitize_inlist(S["noncon_pref"], GLOB.lewd_prefs_choices, "Ask")
vorepref = sanitize_inlist(S["vore_pref"], GLOB.lewd_prefs_choices, "Ask") vorepref = sanitize_inlist(S["vore_pref"], GLOB.lewd_prefs_choices, "Ask")
@@ -79,7 +71,6 @@
WRITE_FILE(S["extreme_harm"], extremeharm) WRITE_FILE(S["extreme_harm"], extremeharm)
WRITE_FILE(S["enable_personal_chat_color"], enable_personal_chat_color) WRITE_FILE(S["enable_personal_chat_color"], enable_personal_chat_color)
WRITE_FILE(S["personal_chat_color"], personal_chat_color) WRITE_FILE(S["personal_chat_color"], personal_chat_color)
WRITE_FILE(S["alt_titles_preferences"], alt_titles_preferences)
WRITE_FILE(S["lust_tolerance"], lust_tolerance) WRITE_FILE(S["lust_tolerance"], lust_tolerance)
WRITE_FILE(S["sexual_potency"], sexual_potency) WRITE_FILE(S["sexual_potency"], sexual_potency)
WRITE_FILE(S["silicon_lawset"], silicon_lawset) WRITE_FILE(S["silicon_lawset"], silicon_lawset)

View File

@@ -1,2 +0,0 @@
/datum/job
var/list/alt_titles = list()

View File

@@ -1,207 +1,204 @@
// Great, since upstream got titles, we gotta do this differently.
// If you downstream, got conflicts from this, good, it means
// you'll know that you need to make changes as well
// Although, why are you modifying it here, go be doing shit modularly
//Command //Command
/datum/job/captain /datum/job/captain/New()
alt_titles = list( alt_titles += list(
"Colony Overseer", "Colony Overseer",
"Senator", "Senator",
"Consul" "Consul"
) )
return ..()
/datum/job/chief_engineer /datum/job/chief_engineer/New()
alt_titles = list( alt_titles += list(
"Senior Engineer" "Senior Engineer"
) )
return ..()
/datum/job/hop /datum/job/hop/New()
alt_titles = list( alt_titles += list(
"Crew Resource Officer", "Crew Resource Officer",
"Executive Officer" "Executive Officer"
) )
return ..()
/datum/job/hos /datum/job/hos/New()
alt_titles = list( alt_titles += list(
"Chief of Security",
"Sheriff",
"Praetor", "Praetor",
"Tarkhan" //If this reference is an issue I will remove it "Tarkhan"
) )
return ..()
/datum/job/qm /datum/job/qm/New()
alt_titles = list( alt_titles += list(
"Resource Manager", "Resource Manager",
"Logistics Supervisor" "Logistics Supervisor"
) )
return ..()
/datum/job/rd /datum/job/rd/New()
alt_titles = list( alt_titles += list(
"Chief Science Officer", "Chief Science Officer",
"Research Overseer" "Research Overseer"
) )
return ..()
//Engineering // Re-enable once we have our unique again
/datum/job/atmos /*
alt_titles = list( /datum/job/atmos/New()
"Firefighter", alt_titles += list(
"Life Support Specialist"
) )
return ..()
/datum/job/engineer /datum/job/engineer/New()
alt_titles = list( alt_titles += list(
"Maintenance Technician",
"Engine Technician",
"Electrician"
) )
return ..()
*/
//Service /datum/job/assistant/New()
/datum/job/assistant alt_titles += list(
alt_titles = list(
"Civilian",
"Visitor",
"Businessman",
"Trader",
"Entertainer",
"Intern", "Intern",
"Off-Duty Civilian"
) )
return ..()
/datum/job/bartender /datum/job/bartender/New()
alt_titles = list( alt_titles += list(
"Barista" "Barista"
) )
return ..()
/datum/job/chaplain /datum/job/chaplain/New()
alt_titles = list( alt_titles += list(
"Priest",
"Cult Leader", "Cult Leader",
"Pope", "Pope",
"Bishop", // How about you actually say something about it instead of crying on a downstream's comments i won't read. "Bishop",
"Pontiff" "Pontiff"
) )
return ..()
/datum/job/clown //The most useless role in the game, delet this /datum/job/clown/New()
alt_titles = list( alt_titles += list(
"Entertainer" "Entertainer"
) )
return ..()
/datum/job/cook /datum/job/cook/New()
alt_titles = list( alt_titles += list(
"Culinary Artist",
"Butcher",
"Chef", "Chef",
"Nutritionist" "Nutritionist"
) )
return ..()
/datum/job/curator /*
alt_titles = list( /datum/job/curator/New()
"Journalist", alt_titles += list(
"Librarian"
) )
return ..()
*/
/datum/job/hydro /datum/job/hydro/New()
alt_titles = list( alt_titles += list(
"Gardener",
"Herbalist",
"Botanical Researcher",
"Florist" "Florist"
) )
return ..()
/datum/job/janitor /*
alt_titles = list( /datum/job/janitor/New()
"Custodian", alt_titles += list(
"Sanitation Technician",
"Maid"
) )
return ..()
/datum/job/lawyer /datum/job/lawyer/New()
alt_titles = list( alt_titles += list(
"Human Resources Agent",
"Internal Affairs Agent"
) )
return ..()
/datum/job/mime /datum/job/mime/New()
alt_titles = list( alt_titles += list(
"Performer"
) )
return ..()
*/
//Science /datum/job/roboticist/New()
/datum/job/roboticist alt_titles += list(
alt_titles = list(
"Biomechanical Engineer",
"Mechatronic Engineer",
"Mechanic",
"Robotics Operator", "Robotics Operator",
"MODsuit Engineer" "MODsuit Engineer"
) )
return ..()
/datum/job/scientist /*
alt_titles = list( /datum/job/scientist/New()
"Circuitry Designer", alt_titles += list(
"Xenobiologist",
"Xenobotanist",
"Chemical Researcher"
) )
return ..()
//Medical /datum/job/chemist/New()
/datum/job/chemist alt_titles += list(
alt_titles = list(
"Pharmacist",
"Pharmacologist"
) )
return ..()
*/
/datum/job/doctor /datum/job/doctor/New()
alt_titles = list( alt_titles += list(
"Nurse",
"Surgeon",
"Medical Secretary", "Medical Secretary",
"Emergency Physician", "Emergency Physician",
"Field Surgeon" "Field Surgeon"
) )
return ..()
/datum/job/geneticist /datum/job/geneticist/New()
alt_titles = list( alt_titles += list(
"Genetic Therapist",
"Bioengineer" "Bioengineer"
) )
return ..()
/datum/job/paramedic /datum/job/paramedic/New()
alt_titles = list( alt_titles += list(
"Emergency Medical Technician", "Emergency Medical Technician",
"Advanced Emergency Medical Technician" "Advanced Emergency Medical Technician"
) )
return ..()
/datum/job/virologist /*
alt_titles = list( /datum/job/virologist/New()
"Pathologist" alt_titles += list(
) )
return ..()
//Security /datum/job/detective/New()
/datum/job/detective alt_titles += list(
alt_titles = list(
"Forensics Technician",
"Private Investigator"
) )
return ..()
*/
/datum/job/officer /datum/job/officer/New()
alt_titles = list( alt_titles += list(
"Security Cadet",
"Security Guard",
"Peacekeeper", "Peacekeeper",
"Enforcer" "Enforcer"
) )
return ..()
/datum/job/warden /datum/job/warden/New()
alt_titles = list( alt_titles += list(
"Brig Chief" "Brig Chief"
) )
return ..()
//Cargo /datum/job/cargo_tech/New()
alt_titles += list(
/datum/job/cargo_tech
alt_titles = list(
"Shipping Specialist", "Shipping Specialist",
"Delivery Manager" "Delivery Manager"
) )
return ..()
/datum/job/mining /*
alt_titles = list( /datum/job/mining/New()
alt_titles += list(
"Explorer" "Explorer"
) )
return ..()
*/

View File

@@ -51,3 +51,15 @@
icon = 'modular_sand/icons/mob/mam_tails.dmi' icon = 'modular_sand/icons/mob/mam_tails.dmi'
color_src = MATRIXED color_src = MATRIXED
matrixed_sections = MATRIX_RED_GREEN matrixed_sections = MATRIX_RED_GREEN
/datum/sprite_accessory/tails/mam_tails/blade //Ported from Vorestation
name = "Blade"
icon_state = "blade"
icon = 'modular_sand/icons/mob/mam_tails.dmi'
color_src = MUTCOLORS
/datum/sprite_accessory/tails_animated/mam_tails_animated/blade //Ported from Vorestation
name = "Blade"
icon_state = "blade"
icon = 'modular_sand/icons/mob/mam_tails.dmi'
color_src = MUTCOLORS

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

BIN
prof.dll Normal file

Binary file not shown.

View File

@@ -2562,6 +2562,7 @@
#include "code\modules\jobs\access.dm" #include "code\modules\jobs\access.dm"
#include "code\modules\jobs\job_exp.dm" #include "code\modules\jobs\job_exp.dm"
#include "code\modules\jobs\job_report.dm" #include "code\modules\jobs\job_report.dm"
#include "code\modules\jobs\job_titles.dm"
#include "code\modules\jobs\jobs.dm" #include "code\modules\jobs\jobs.dm"
#include "code\modules\jobs\job_types\_job.dm" #include "code\modules\jobs\job_types\_job.dm"
#include "code\modules\jobs\job_types\ai.dm" #include "code\modules\jobs\job_types\ai.dm"
@@ -4302,7 +4303,6 @@
#include "modular_sand\code\modules\integrated_electronics\subtypes\input.dm" #include "modular_sand\code\modules\integrated_electronics\subtypes\input.dm"
#include "modular_sand\code\modules\integrated_electronics\subtypes\manipulation.dm" #include "modular_sand\code\modules\integrated_electronics\subtypes\manipulation.dm"
#include "modular_sand\code\modules\integrated_electronics\subtypes\output.dm" #include "modular_sand\code\modules\integrated_electronics\subtypes\output.dm"
#include "modular_sand\code\modules\jobs\job_types\_job.dm"
#include "modular_sand\code\modules\jobs\job_types\_job_alt_titles.dm" #include "modular_sand\code\modules\jobs\job_types\_job_alt_titles.dm"
#include "modular_sand\code\modules\jobs\job_types\ai.dm" #include "modular_sand\code\modules\jobs\job_types\ai.dm"
#include "modular_sand\code\modules\jobs\job_types\cyborg.dm" #include "modular_sand\code\modules\jobs\job_types\cyborg.dm"