Files
ec22fccc6a TGUI Faction Select (#21737)
## Description
Hello! First PR here so I figured I'd do a big one ~~and stress out the
maintainers as quickly as possible~~. :)

While going through the process of creating a character the 'faction
select' UI stuck out to me as *functional*, but difficult to parse
visually and pretty dated looking by modern SS13 standards. (Not too
bad, but you know what I mean)
The new version is realistically *bit* too flashy for what it is (a
single-use interface hidden away in the character creation menu), but it
was very good practise for me to get back into DM/TGUI programming so it
works out either way.

I'm very happy to implement any feedback or suggested changes that could
help improve it.

## Actual Description
This PR replaces the old HTML 'faction select' interface with a new TGUI
one, and also cleans up and fixes some adjacent code I bumped into while
working on it.

A couple of notes about the current version:
* The 'Citizenship Check' line is currently non-functional and will
always show a checkmark. I know a lot of the corporations have specific
backgrounds/origins they won't hire people from, but I wasn't sure where
exactly that's enforced in code, if at all.
(I noticed `/datum/faction` has a `blacklisted_citizenship_types`
variable, but it's currently unused.)
* De-adminning or changing species doesn't immediately update the UI to
reflect the changes, you have to click on something new to trigger an
update manually. This doesn't have any actual consequences since I made
sure to sanitise everything, but it is a visual thing.

## Screenshots

<details><summary><b>Collapsed so it doesn't take up so much
room:</b></summary>

### Before
<img width="752" height="482" alt="xziPCYXbkn"
src="https://github.com/user-attachments/assets/334e0609-c2e3-4a33-92ad-15120b78ab35"
/>

### After
<img width="900" height="645" alt="NT"
src="https://github.com/user-attachments/assets/476702c7-c83c-4fee-a2cd-34d912468903"
/>

### Unathi attempting to join Zeng-Hu (Button disabled)
<img width="900" height="645" alt="Unathi fail"
src="https://github.com/user-attachments/assets/c5a256c1-5531-4cbe-8198-27411c1aab9a"
/>

### Faction Pages
<details><summary><b>Stellar Corporate Conglomerate</b></summary>
<img width="900" height="645" alt="SCC"
src="https://github.com/user-attachments/assets/6e8bdb64-a220-41d4-a503-1268f9f93a30"
/>

</details>
<details><summary><b>Nanotrasen</b></summary>
<img width="900" height="645" alt="NT"
src="https://github.com/user-attachments/assets/1ff107b5-7b3e-40e2-8f86-390ce29e165b"
/>

</details>
<details><summary><b>Hephaestus Industries</b></summary>
<img width="900" height="645" alt="HI"
src="https://github.com/user-attachments/assets/6fc23159-990d-4de2-9745-827e11ca0442"
/>

</details>
<details><summary><b>Idris Incorporated</b></summary>
<img width="900" height="645" alt="II"
src="https://github.com/user-attachments/assets/366a9824-81f1-4dd1-b385-4fa3968e39e0"
/>

</details>
<details><summary><b>Orion Express</b></summary>
<img width="900" height="645" alt="OE"
src="https://github.com/user-attachments/assets/5588f0fe-d6c3-44b4-8297-cca4ed991bd8"
/>

</details>
<details><summary><b>Private Military Contracting Group</b></summary>
<img width="900" height="645" alt="PMCG"
src="https://github.com/user-attachments/assets/a3dc6540-bfde-4fb2-939d-11e066b1e316"
/>

</details>
<details><summary><b>Zavodskoi Interstellar</b></summary>
<img width="900" height="645" alt="ZI"
src="https://github.com/user-attachments/assets/a8c2c33d-7138-4164-a9f1-6a2dc3eb3e61"
/>

</details>
<details><summary><b>Zeng-Hu Pharmaceuticals</b></summary>
<img width="900" height="645" alt="ZHP"
src="https://github.com/user-attachments/assets/4535ba80-efcb-4e50-9396-299bc16db2b5"
/>

</details>
<details><summary><b>Independent</b></summary>
<img width="900" height="645" alt="Independent"
src="https://github.com/user-attachments/assets/dcf7b46c-edce-4104-a4f5-000479a9f963"
/>

</details>
<hr>
</details>

## Changelog
- rscadd: "Revamped the 'Faction Select' UI in the occupation menu of
character setup."
- bugfix: "Fixed changing species in character setup not resetting your
faction if it became invalid."
  - Not player-facing:
- Fixed the TGUI dev server not working by bumping up the 'source-map'
version. You still have to manually refresh the interface with Ctrl+R or
Ctrl+F5 but it actually links now.
- Added a `wiki_page` variable to each faction to allow for it to be
manually set rather than being exclusively based on the name. (Mostly
just futureproofing)
- Added some line breaks to the faction descriptions to make them more
easily readable.

---------

Signed-off-by: SabreML <57483089+SabreML@users.noreply.github.com>
Co-authored-by: VMSolidus <evilexecutive@gmail.com>
2026-01-26 23:39:22 +00:00

292 lines
11 KiB
Plaintext

/datum/faction/pmc
name = "Private Military Contracting Group"
description = {"
The Private Military Contracting Group is a coalition of security and medical contractors;
borne from the necessity of protecting the Stellar Corporate Conglomerate and its holdings.<br>
Following the ever-growing corporate empire, mercenaries and contractors from all across the spur are deployed accordingly;
from mere office buildings to outposts in the Corporate Reconstruction Zone.<br><br>
Unlike the other members of the Corporate Conglomerate, the Private Military Contracting Group has few employees of its own.
Only some liaisons and bureaucrats work behind the scenes to hire and manage the contractors;
the rest of its members are part of several organizations contracted to supply the PMCG.
"}
departments = list(DEPARTMENT_MEDICAL, DEPARTMENT_SECURITY)
title_suffix = "PMCG"
wiki_page = "Private_Military_Contracting_Group"
allowed_role_types = PMC_ROLES
allowed_species_types = list(
/datum/species/human,
/datum/species/skrell,
/datum/species/tajaran,
/datum/species/unathi,
/datum/species/bug = TRUE,
/datum/species/bug/type_b = TRUE,
/datum/species/bug/type_b/type_bb = TRUE,
/datum/species/machine
)
job_species_blacklist = list(
"Corporate Liaison" = list(
SPECIES_DIONA,
SPECIES_DIONA_COEUS,
SPECIES_VAURCA_WORKER,
SPECIES_VAURCA_WARRIOR,
SPECIES_VAURCA_ATTENDANT
)
)
titles_to_loadout = list(
"Security Officer" = /obj/outfit/job/officer/pmc,
"Warden" = /obj/outfit/job/warden/pmc,
"Security Cadet" = /obj/outfit/job/intern_sec/officer/pmc,
"Investigator Intern" = /obj/outfit/job/intern_sec/forensics/pmc,
"Investigator" =/obj/outfit/job/forensics/pmc,
"Physician" = /obj/outfit/job/doctor/pmc,
"Surgeon" = /obj/outfit/job/doctor/surgeon/pmc,
"Pharmacist" = /obj/outfit/job/pharmacist/pmc,
"Psychiatrist" = /obj/outfit/job/psychiatrist/pmc,
"Psychologist" = /obj/outfit/job/psychiatrist/pmc,
"Paramedic" = /obj/outfit/job/med_tech/pmc,
"Medical Intern" = /obj/outfit/job/intern_med/pmc,
"Corporate Reporter" = /obj/outfit/job/journalist/pmc,
"Corporate Liaison" = /obj/outfit/job/representative/pmc,
"Corporate Aide" = /obj/outfit/job/corporate_aide/pmc,
"Assistant" = /obj/outfit/job/assistant/pmc,
"Medical Orderly" = /obj/outfit/job/assistant/med_assistant/pmc,
"Off-Duty Crew Member" = /obj/outfit/job/visitor/pmc,
"Security Personnel" = /obj/outfit/job/officer/event/pmc,
"Medical Personnel" = /obj/outfit/job/med_tech/event/pmc
)
/obj/outfit/job/officer/pmc
name = "Security Officer - PMC"
uniform = /obj/item/clothing/under/rank/security/pmc
id = /obj/item/card/id/pmc
backpack_faction = /obj/item/storage/backpack/pmcg
satchel_faction = /obj/item/storage/backpack/satchel/pmcg
dufflebag_faction = /obj/item/storage/backpack/duffel/pmcg
messengerbag_faction = /obj/item/storage/backpack/messenger/pmcg
/obj/outfit/job/warden/pmc
name = "Warden - PMC"
head = /obj/item/clothing/head/warden/pmc
uniform = /obj/item/clothing/under/rank/warden/pmc
suit = /obj/item/clothing/suit/storage/toggle/warden/pmc
id = /obj/item/card/id/pmc
glasses = /obj/item/clothing/glasses/sunglasses/sechud/aviator/pmc
backpack_faction = /obj/item/storage/backpack/pmcg
satchel_faction = /obj/item/storage/backpack/satchel/pmcg
dufflebag_faction = /obj/item/storage/backpack/duffel/pmcg
messengerbag_faction = /obj/item/storage/backpack/messenger/pmcg
/obj/outfit/job/intern_sec/officer/pmc
name = "Security Cadet - PMC"
uniform = /obj/item/clothing/under/rank/cadet/pmc
id = /obj/item/card/id/pmc
backpack_faction = /obj/item/storage/backpack/pmcg
satchel_faction = /obj/item/storage/backpack/satchel/pmcg
dufflebag_faction = /obj/item/storage/backpack/duffel/pmcg
messengerbag_faction = /obj/item/storage/backpack/messenger/pmcg
/obj/outfit/job/intern_sec/forensics/pmc
name = "Investigator Intern - PMC"
uniform = /obj/item/clothing/under/rank/cadet/pmc
id = /obj/item/card/id/pmc
backpack_faction = /obj/item/storage/backpack/pmcg
satchel_faction = /obj/item/storage/backpack/satchel/pmcg
dufflebag_faction = /obj/item/storage/backpack/duffel/pmcg
messengerbag_faction = /obj/item/storage/backpack/messenger/pmcg
/obj/outfit/job/forensics/pmc
name = "Investigator - PMC"
uniform = /obj/item/clothing/under/det/pmc
suit = /obj/item/clothing/suit/storage/security/investigator/pmc
id = /obj/item/card/id/pmc
backpack_faction = /obj/item/storage/backpack/pmcg
satchel_faction = /obj/item/storage/backpack/satchel/pmcg
dufflebag_faction = /obj/item/storage/backpack/duffel/pmcg
messengerbag_faction = /obj/item/storage/backpack/messenger/pmcg
/obj/outfit/job/doctor/pmc
name = "Physician - PMC"
uniform = /obj/item/clothing/under/rank/medical/pmc
suit = /obj/item/clothing/suit/storage/toggle/labcoat/pmc
id = /obj/item/card/id/pmc
shoes = /obj/item/clothing/shoes/sneakers/medsci/pmc
backpack_faction = /obj/item/storage/backpack/pmcg
satchel_faction = /obj/item/storage/backpack/satchel/pmcg
dufflebag_faction = /obj/item/storage/backpack/duffel/pmcg
messengerbag_faction = /obj/item/storage/backpack/messenger/pmcg
/obj/outfit/job/doctor/surgeon/pmc
name = "Surgeon - PMC"
uniform = /obj/item/clothing/under/rank/medical/surgeon/pmc
suit = /obj/item/clothing/suit/storage/surgical_gown/pmc/alt
id = /obj/item/card/id/pmc
shoes = /obj/item/clothing/shoes/sneakers/medsci/pmc
backpack_faction = /obj/item/storage/backpack/pmcg
satchel_faction = /obj/item/storage/backpack/satchel/pmcg
dufflebag_faction = /obj/item/storage/backpack/duffel/pmcg
messengerbag_faction = /obj/item/storage/backpack/messenger/pmcg
/obj/outfit/job/doctor/surgeon/pmc/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
if(!isskrell(H))
H.equip_to_slot_or_del(new /obj/item/clothing/head/surgery/pmc(H), slot_head)
/obj/outfit/job/pharmacist/pmc
name = "Pharmacist - PMC"
uniform = /obj/item/clothing/under/rank/medical/pharmacist/pmc
suit = /obj/item/clothing/suit/storage/toggle/labcoat/pmc
id = /obj/item/card/id/pmc
shoes = /obj/item/clothing/shoes/sneakers/medsci/pmc
backpack_faction = /obj/item/storage/backpack/pmcg
satchel_faction = /obj/item/storage/backpack/satchel/pmcg
dufflebag_faction = /obj/item/storage/backpack/duffel/pmcg
messengerbag_faction = /obj/item/storage/backpack/messenger/pmcg
/obj/outfit/job/psychiatrist/pmc
name = "Psychiatrist - PMC"
uniform = /obj/item/clothing/under/rank/medical/psych/pmc
id = /obj/item/card/id/pmc
shoes = /obj/item/clothing/shoes/sneakers/medsci/pmc
backpack_faction = /obj/item/storage/backpack/pmcg
satchel_faction = /obj/item/storage/backpack/satchel/pmcg
dufflebag_faction = /obj/item/storage/backpack/duffel/pmcg
messengerbag_faction = /obj/item/storage/backpack/messenger/pmcg
/obj/outfit/job/med_tech/pmc
name = "Paramedic - PMC"
head = /obj/item/clothing/head/softcap/pmc
uniform = /obj/item/clothing/under/rank/medical/paramedic/pmc
suit = /obj/item/clothing/suit/storage/toggle/para_jacket/pmc
id = /obj/item/card/id/pmc
backpack_faction = /obj/item/storage/backpack/pmcg
satchel_faction = /obj/item/storage/backpack/satchel/pmcg
dufflebag_faction = /obj/item/storage/backpack/duffel/pmcg
messengerbag_faction = /obj/item/storage/backpack/messenger/pmcg
/obj/outfit/job/intern_med/pmc
name = "Medical Intern - PMC"
uniform = /obj/item/clothing/under/rank/medical/intern/pmc
id = /obj/item/card/id/pmc
shoes = /obj/item/clothing/shoes/sneakers/medsci/pmc
backpack_faction = /obj/item/storage/backpack/pmcg
satchel_faction = /obj/item/storage/backpack/satchel/pmcg
dufflebag_faction = /obj/item/storage/backpack/duffel/pmcg
messengerbag_faction = /obj/item/storage/backpack/messenger/pmcg
/obj/outfit/job/representative/pmc
name = "PMC Corporate Liaison"
head = /obj/item/clothing/head/beret/corporate/pmc
uniform = /obj/item/clothing/under/rank/liaison/pmc
suit = /obj/item/clothing/suit/storage/liaison/pmc
id = /obj/item/card/id/pmc
accessory = /obj/item/clothing/accessory/tie/corporate/pmc
suit_accessory = /obj/item/clothing/accessory/pin/corporate/pmc
backpack_faction = /obj/item/storage/backpack/pmcg
satchel_faction = /obj/item/storage/backpack/satchel/pmcg
dufflebag_faction = /obj/item/storage/backpack/duffel/pmcg
messengerbag_faction = /obj/item/storage/backpack/messenger/pmcg
/obj/outfit/job/corporate_aide/pmc
name = "PMC Corporate Aide"
id = /obj/item/card/id/pmc
head = /obj/item/clothing/head/beret/corporate/pmc
suit = /obj/item/clothing/suit/storage/toggle/corp/pmc
backpack_faction = /obj/item/storage/backpack/pmcg
satchel_faction = /obj/item/storage/backpack/satchel/pmcg
dufflebag_faction = /obj/item/storage/backpack/duffel/pmcg
messengerbag_faction = /obj/item/storage/backpack/messenger/pmcg
/obj/outfit/job/journalist/pmc
name = "Corporate Reporter - PMC"
uniform = /obj/item/clothing/under/librarian/pmc
id = /obj/item/card/id/pmc
backpack_faction = /obj/item/storage/backpack/pmcg
satchel_faction = /obj/item/storage/backpack/satchel/pmcg
dufflebag_faction = /obj/item/storage/backpack/duffel/pmcg
messengerbag_faction = /obj/item/storage/backpack/messenger/pmcg
/obj/outfit/job/assistant/pmc
name = "Assistant - PMC"
id = /obj/item/card/id/pmc
backpack_faction = /obj/item/storage/backpack/pmcg
satchel_faction = /obj/item/storage/backpack/satchel/pmcg
dufflebag_faction = /obj/item/storage/backpack/duffel/pmcg
messengerbag_faction = /obj/item/storage/backpack/messenger/pmcg
/obj/outfit/job/assistant/med_assistant/pmc
name = "Medical Orderly - PMC"
id = /obj/item/card/id/pmc
backpack_faction = /obj/item/storage/backpack/pmcg
satchel_faction = /obj/item/storage/backpack/satchel/pmcg
dufflebag_faction = /obj/item/storage/backpack/duffel/pmcg
messengerbag_faction = /obj/item/storage/backpack/messenger/pmcg
/obj/outfit/job/visitor/pmc
name = "Off-Duty Crew Member - PMC"
id = /obj/item/card/id/pmc
backpack_faction = /obj/item/storage/backpack/pmcg
satchel_faction = /obj/item/storage/backpack/satchel/pmcg
dufflebag_faction = /obj/item/storage/backpack/duffel/pmcg
messengerbag_faction = /obj/item/storage/backpack/messenger/pmcg
/obj/outfit/job/officer/event/pmc
name = "Security Personnel - PMC"
uniform = /obj/item/clothing/under/rank/security/pmc
id = /obj/item/card/id/pmc
backpack_faction = /obj/item/storage/backpack/pmcg
satchel_faction = /obj/item/storage/backpack/satchel/pmcg
dufflebag_faction = /obj/item/storage/backpack/duffel/pmcg
messengerbag_faction = /obj/item/storage/backpack/messenger/pmcg
/obj/outfit/job/med_tech/event/pmc
name = "Medical Personnel - PMC"
head = /obj/item/clothing/head/softcap/pmc
uniform = /obj/item/clothing/under/rank/medical/paramedic/pmc
suit = /obj/item/clothing/suit/storage/toggle/para_jacket/pmc
id = /obj/item/card/id/pmc
backpack_faction = /obj/item/storage/backpack/pmcg
satchel_faction = /obj/item/storage/backpack/satchel/pmcg
dufflebag_faction = /obj/item/storage/backpack/duffel/pmcg
messengerbag_faction = /obj/item/storage/backpack/messenger/pmcg