Merge branch 'master' into development

# Conflicts:
#	code/modules/client/preference_setup/loadout/loadout_xeno.dm
#	code/modules/customitems/item_defines.dm
This commit is contained in:
skull132
2017-09-09 21:38:02 +03:00
79 changed files with 1476 additions and 907 deletions

View File

@@ -170,6 +170,7 @@
#include "code\controllers\subsystems\overlays.dm" #include "code\controllers\subsystems\overlays.dm"
#include "code\controllers\subsystems\pai.dm" #include "code\controllers\subsystems\pai.dm"
#include "code\controllers\subsystems\parallax.dm" #include "code\controllers\subsystems\parallax.dm"
#include "code\controllers\subsystems\plants.dm"
#include "code\controllers\subsystems\power.dm" #include "code\controllers\subsystems\power.dm"
#include "code\controllers\subsystems\radio.dm" #include "code\controllers\subsystems\radio.dm"
#include "code\controllers\subsystems\statistics.dm" #include "code\controllers\subsystems\statistics.dm"
@@ -194,7 +195,6 @@
#include "code\controllers\subsystems\processing\modifiers.dm" #include "code\controllers\subsystems\processing\modifiers.dm"
#include "code\controllers\subsystems\processing\nanoui.dm" #include "code\controllers\subsystems\processing\nanoui.dm"
#include "code\controllers\subsystems\processing\pipenet.dm" #include "code\controllers\subsystems\processing\pipenet.dm"
#include "code\controllers\subsystems\processing\plants.dm"
#include "code\controllers\subsystems\processing\processing.dm" #include "code\controllers\subsystems\processing\processing.dm"
#include "code\controllers\subsystems\processing\shuttle.dm" #include "code\controllers\subsystems\processing\shuttle.dm"
#include "code\datums\ai_law_sets.dm" #include "code\datums\ai_law_sets.dm"

View File

@@ -3,7 +3,7 @@ var/datum/controller/subsystem/garbage_collector/SSgarbage
/datum/controller/subsystem/garbage_collector /datum/controller/subsystem/garbage_collector
name = "Garbage" name = "Garbage"
priority = SS_PRIORITY_GARBAGE priority = SS_PRIORITY_GARBAGE
wait = 5 wait = 2 SECONDS
flags = SS_FIRE_IN_LOBBY|SS_POST_FIRE_TIMING|SS_BACKGROUND|SS_NO_INIT flags = SS_FIRE_IN_LOBBY|SS_POST_FIRE_TIMING|SS_BACKGROUND|SS_NO_INIT
var/collection_timeout = 3000// deciseconds to wait to let running procs finish before we just say fuck it and force del() the object var/collection_timeout = 3000// deciseconds to wait to let running procs finish before we just say fuck it and force del() the object

View File

@@ -58,6 +58,9 @@
var/list/collar_states var/list/collar_states
var/list/uniform_states var/list/uniform_states
// This is for the kitty ears item.
var/list/kitty_ear_cache = list()
/datum/controller/subsystem/icon_cache/New() /datum/controller/subsystem/icon_cache/New()
NEW_SS_GLOBAL(SSicon_cache) NEW_SS_GLOBAL(SSicon_cache)

View File

@@ -1,6 +1,6 @@
/var/datum/controller/subsystem/processing/plants/SSplants /var/datum/controller/subsystem/plants/SSplants
/datum/controller/subsystem/processing/plants /datum/controller/subsystem/plants
name = "Seeds & Plants" name = "Seeds & Plants"
flags = 0 // Override parent's flags. flags = 0 // Override parent's flags.
wait = 75 wait = 75
@@ -14,10 +14,15 @@
var/list/plant_sprites = list() // List of all harvested product sprites. var/list/plant_sprites = list() // List of all harvested product sprites.
var/list/plant_product_sprites = list() // List of all growth sprites plus number of growth stages. var/list/plant_product_sprites = list() // List of all growth sprites plus number of growth stages.
/datum/controller/subsystem/processing/plants/New() var/list/processing = list()
/datum/controller/subsystem/plants/New()
NEW_SS_GLOBAL(SSplants) NEW_SS_GLOBAL(SSplants)
/datum/controller/subsystem/processing/plants/Initialize(timeofday) /datum/controller/subsystem/plants/stat_entry()
..("P:[processing.len]")
/datum/controller/subsystem/plants/Initialize(timeofday)
// Build the icon lists. // Build the icon lists.
for(var/icostate in icon_states('icons/obj/hydroponics_growing.dmi')) for(var/icostate in icon_states('icons/obj/hydroponics_growing.dmi'))
var/split = findtext(icostate,"-") var/split = findtext(icostate,"-")
@@ -63,7 +68,7 @@
..() ..()
/datum/controller/subsystem/processing/plants/Recover() /datum/controller/subsystem/plants/Recover()
if (istype(SSplants)) if (istype(SSplants))
src.product_descs = SSplants.product_descs src.product_descs = SSplants.product_descs
src.seeds = SSplants.seeds src.seeds = SSplants.seeds
@@ -72,8 +77,26 @@
src.plant_sprites = SSplants.plant_sprites src.plant_sprites = SSplants.plant_sprites
src.plant_product_sprites = SSplants.plant_product_sprites src.plant_product_sprites = SSplants.plant_product_sprites
/datum/controller/subsystem/plants/fire(resumed = 0)
var/list/queue = processing
while (queue.len)
var/obj/effect/plant/P = queue[queue.len]
queue.len--
if (!QDELETED(P))
P.process()
if (MC_TICK_CHECK)
return
/datum/controller/subsystem/plants/proc/add_plant(obj/effect/plant/plant)
processing[plant] = TRUE
/datum/controller/subsystem/plants/proc/remove_plant(obj/effect/plant/plant)
processing -= plant
// Proc for creating a random seed type. // Proc for creating a random seed type.
/datum/controller/subsystem/processing/plants/proc/create_random_seed(var/survive_on_station) /datum/controller/subsystem/plants/proc/create_random_seed(var/survive_on_station)
var/datum/seed/seed = new() var/datum/seed/seed = new()
seed.randomize() seed.randomize()
seed.uid = seeds.len + 1 seed.uid = seeds.len + 1

View File

@@ -125,8 +125,9 @@
feedback_add_details("radio_usage","PDA-[pda_msg_amt]") feedback_add_details("radio_usage","PDA-[pda_msg_amt]")
feedback_add_details("radio_usage","RC-[rc_msg_amt]") feedback_add_details("radio_usage","RC-[rc_msg_amt]")
for (var/datum/statistic/S in simple_statistics) for (var/key in simple_statistics)
if (S.write_to_database && S.key) var/datum/statistic/S = simple_statistics[key]
if (S.write_to_db && S.key)
S.write_to_database() S.write_to_database()
feedback_set_details("round_end","[time2text(world.realtime)]") //This one MUST be the last one that gets set. feedback_set_details("round_end","[time2text(world.realtime)]") //This one MUST be the last one that gets set.

View File

@@ -1,7 +1,7 @@
/datum/statistic /datum/statistic
var/name var/name
var/key var/key
var/write_to_database = FALSE var/write_to_db = FALSE
var/broadcast_at_roundend = TRUE var/broadcast_at_roundend = TRUE
/datum/statistic/proc/set_value() /datum/statistic/proc/set_value()
@@ -58,20 +58,22 @@
/datum/statistic/numeric/openturf_falls /datum/statistic/numeric/openturf_falls
name = "Human Open Space Falls" name = "Human Open Space Falls"
key = "openturf_human_falls" key = "openturf_human_falls"
write_to_database = TRUE write_to_db = TRUE
/datum/statistic/numeric/openturf_deaths /datum/statistic/numeric/openturf_deaths
name = "Human Open Space Fatalities" name = "Human Open Space Fatalities"
key = "openturf_human_deaths" key = "openturf_human_deaths"
write_to_database = TRUE write_to_db = TRUE
/datum/statistic/numeric/gibbings /datum/statistic/numeric/gibbings
name = "Gibbings" name = "Gibbings"
key = "gibs" key = "gibs"
write_to_db = TRUE
/datum/statistic/numeric/clonings /datum/statistic/numeric/clonings
name = "Clones Produced" name = "Clones Produced"
key = "clones" key = "clones"
write_to_db = TRUE
/datum/statistic/grouped/most_deaths /datum/statistic/grouped/most_deaths
name = "Most Overall Deaths (by ckey)" name = "Most Overall Deaths (by ckey)"

View File

@@ -67,16 +67,18 @@
var/loyalty = 1 var/loyalty = 1
if(H.client) if(H.client)
switch(H.client.prefs.nanotrasen_relation) switch(H.client.prefs.nanotrasen_relation)
if(COMPANY_LOYAL) loyalty = 1.30 if(COMPANY_LOYAL) loyalty = 1.30
if(COMPANY_SUPPORTATIVE)loyalty = 1.15 if(COMPANY_SUPPORTATIVE) loyalty = 1.15
if(COMPANY_NEUTRAL) loyalty = 1 if(COMPANY_NEUTRAL) loyalty = 1
if(COMPANY_SKEPTICAL) loyalty = 0.85 if(COMPANY_SKEPTICAL) loyalty = 0.85
if(COMPANY_OPPOSED) loyalty = 0.70 if(COMPANY_OPPOSED) loyalty = 0.70
//give them an account in the station database //give them an account in the station database
var/species_modifier = (H.species ? economic_species_modifier[H.species.type] : 2) var/species_modifier = (H.species ? H.species.economic_modifier : null)
if(!species_modifier) if (!species_modifier)
species_modifier = economic_species_modifier[/datum/species/human] var/datum/species/human_species = global.all_species["Human"]
species_modifier = human_species.economic_modifier
PROCLOG_WEIRD("species [H.species || "NULL"] did not have a set economic_modifier!")
var/money_amount = (rand(5,50) + rand(5, 50)) * loyalty * economic_modifier * species_modifier var/money_amount = (rand(5,50) + rand(5, 50)) * loyalty * economic_modifier * species_modifier
var/datum/money_account/M = create_account(H.real_name, money_amount, null) var/datum/money_account/M = create_account(H.real_name, money_amount, null)
@@ -137,25 +139,14 @@
var/loyalty = 1 var/loyalty = 1
if(H.client) if(H.client)
switch(H.client.prefs.nanotrasen_relation) switch(H.client.prefs.nanotrasen_relation)
if(COMPANY_LOYAL) loyalty = 3 if(COMPANY_LOYAL) loyalty = 3
if(COMPANY_SUPPORTATIVE)loyalty = 2 if(COMPANY_SUPPORTATIVE) loyalty = 2
if(COMPANY_NEUTRAL) loyalty = 1 if(COMPANY_NEUTRAL) loyalty = 1
if(COMPANY_SKEPTICAL) loyalty = -2 if(COMPANY_SKEPTICAL) loyalty = -2
if(COMPANY_OPPOSED) loyalty = -3 if(COMPANY_OPPOSED) loyalty = -3
//give them an account in the station database //give them an account in the station database
var/species_modifier = 0 var/species_modifier = min((H.species ? H.species.economic_modifier : 0) - 9, 0)
if(economic_species_modifier[H.species.type])
switch(economic_species_modifier[H.species.type])
if(/datum/species/human) species_modifier = 0
if(/datum/species/skrell) species_modifier = 0
if(/datum/species/tajaran) species_modifier = -2
if(/datum/species/unathi) species_modifier = -2
if(/datum/species/diona) species_modifier = -4
if(/datum/species/machine) species_modifier = -4
if(/datum/species/bug) species_modifier = -6
else species_modifier = -3
var/wealth = (loyalty + economic_modifier + species_modifier) var/wealth = (loyalty + economic_modifier + species_modifier)

View File

@@ -78,7 +78,7 @@ var/list/medical_positions = list(
"Psychiatrist", "Psychiatrist",
"Chemist", "Chemist",
"Paramedic", "Paramedic",
"Nursing Intern" "Medical Resident"
) )

View File

@@ -156,7 +156,7 @@
else else
assembly.state = 1 assembly.state = 1
user << "<span class='notice'>You cut \the [src] free from the wall.</span>" user << "<span class='notice'>You cut \the [src] free from the wall.</span>"
new /obj/item/stack/cable_coil(src.loc, length=2) new /obj/item/stack/cable_coil(loc, 2)
assembly = null //so qdel doesn't eat it. assembly = null //so qdel doesn't eat it.
qdel(src) qdel(src)

View File

@@ -142,7 +142,17 @@
jump_to = locate() in A jump_to = locate() in A
else if(isturf(A)) else if(isturf(A))
var/best_dist = INFINITY var/best_dist = INFINITY
for(var/obj/machinery/camera/camera in get_area(A)) var/check_area = get_area(A)
if (!check_area)
return
for(var/cc in SSmachinery.all_cameras)
var/obj/machinery/camera/camera = cc
if(!camera.loc)
continue
if (camera.loc.loc != check_area)
continue
if(!camera.can_use()) if(!camera.can_use())
continue continue
if(!can_access_camera(camera)) if(!can_access_camera(camera))

View File

@@ -22,6 +22,7 @@
var/scan_id = 1 var/scan_id = 1
var/is_secure = 0 var/is_secure = 0
var/datum/wires/smartfridge/wires = null var/datum/wires/smartfridge/wires = null
atmos_canpass = CANPASS_NEVER
/obj/machinery/smartfridge/secure /obj/machinery/smartfridge/secure
is_secure = 1 is_secure = 1

View File

@@ -152,6 +152,7 @@
if(wreckage) if(wreckage)
var/obj/effect/decal/mecha_wreckage/WR = new wreckage(loc) var/obj/effect/decal/mecha_wreckage/WR = new wreckage(loc)
WR.icon_state = "[icon_state]-broken"
for(var/obj/item/mecha_parts/mecha_equipment/E in equipment) for(var/obj/item/mecha_parts/mecha_equipment/E in equipment)
if(E.salvageable && prob(30)) if(E.salvageable && prob(30))
WR.crowbar_salvage += E WR.crowbar_salvage += E

View File

@@ -211,9 +211,10 @@
continue continue
success = TRUE success = TRUE
S.handle_item_insertion(I, 1) //The 1 stops the "You put the [src] into [S]" insertion message from being displayed. S.handle_item_insertion_deferred(I, user) //The 1 stops the "You put the [src] into [S]" insertion message from being displayed.
CHECK_TICK // Because people insist on picking up huge-ass piles of stuff. CHECK_TICK // Because people insist on picking up huge-ass piles of stuff.
S.handle_storage_deferred(user)
if(success && !failure) if(success && !failure)
user << "<span class='notice'>You put everything in [S].</span>" user << "<span class='notice'>You put everything in [S].</span>"
else if(success) else if(success)

View File

@@ -40,8 +40,8 @@
//hit other people with it //hit other people with it
/obj/item/device/holowarrant/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) /obj/item/device/holowarrant/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
user.visible_message("<span class='notice'>You show the warrant to [M]. </span>", \ user.visible_message("<span class='notice'>[user] holds up a warrant projector and shows the contents to [M]. </span>", \
"<span class='notice'>[user] holds up a warrant projector and shows the contents to [M]. </span>") "<span class='notice'>You show the warrant to [M]. </span>")
M.examinate(src) M.examinate(src)
//sync with database //sync with database

View File

@@ -22,6 +22,7 @@
display_contents_with_number = 0 // UNStABLE AS FuCK, turn on when it stops crashing clients display_contents_with_number = 0 // UNStABLE AS FuCK, turn on when it stops crashing clients
use_to_pickup = 1 use_to_pickup = 1
slot_flags = SLOT_BELT slot_flags = SLOT_BELT
var/use_deferred = TRUE
// ----------------------------- // -----------------------------
// Trash bag // Trash bag
@@ -58,7 +59,13 @@
bagfull = 1 bagfull = 1
break break
count++ count++
handle_item_insertion(L, 1)//value of 1 suppresses confirmation messages from this one if (use_deferred)
handle_item_insertion_deferred(L, user)
else
handle_item_insertion(L, TRUE)
if (use_deferred)
handle_storage_deferred(user)
if (count) if (count)
user << "<span class='notice'>You empty [count] broken bulbs into the trashbag.</span>" user << "<span class='notice'>You empty [count] broken bulbs into the trashbag.</span>"
@@ -135,122 +142,119 @@
storage_slots = 7 storage_slots = 7
allow_quick_empty = 1 // this function is superceded allow_quick_empty = 1 // this function is superceded
New() use_deferred = FALSE
..()
//verbs -= /obj/item/weapon/storage/verb/quick_empty
//verbs += /obj/item/weapon/storage/bag/sheetsnatcher/quick_empty
can_be_inserted(obj/item/W as obj, stop_messages = 0) /obj/item/weapon/storage/bag/sheetsnatcher/can_be_inserted(obj/item/W as obj, stop_messages = 0)
if(!istype(W,/obj/item/stack/material)) if(!istype(W,/obj/item/stack/material))
if(!stop_messages) if(!stop_messages)
usr << "The snatcher does not accept [W]." usr << "The snatcher does not accept [W]."
return 0 return 0
var/current = 0 var/current = 0
for(var/obj/item/stack/material/S in contents) for(var/obj/item/stack/material/S in contents)
current += S.amount current += S.amount
if(capacity == current)//If it's full, you're done if(capacity == current)//If it's full, you're done
if(!stop_messages) if(!stop_messages)
usr << "<span class='warning'>The snatcher is full.</span>" usr << "<span class='warning'>The snatcher is full.</span>"
return 0 return 0
return 1 return 1
// Modified handle_item_insertion. Would prefer not to, but... // Modified handle_item_insertion. Would prefer not to, but...
handle_item_insertion(obj/item/W as obj, prevent_warning = 0) /obj/item/weapon/storage/bag/sheetsnatcher/handle_item_insertion(obj/item/W as obj, prevent_warning = 0)
var/obj/item/stack/material/S = W var/obj/item/stack/material/S = W
if(!istype(S)) return 0 if(!istype(S)) return 0
var/amount var/amount
var/inserted = 0 var/inserted = 0
var/current = 0 var/current = 0
for(var/obj/item/stack/material/S2 in contents) for(var/obj/item/stack/material/S2 in contents)
current += S2.amount current += S2.amount
if(capacity < current + S.amount)//If the stack will fill it up if(capacity < current + S.amount)//If the stack will fill it up
amount = capacity - current amount = capacity - current
else
amount = S.amount
for(var/obj/item/stack/material/sheet in contents)
if(S.type == sheet.type) // we are violating the amount limitation because these are not sane objects
sheet.amount += amount // they should only be removed through procs in this file, which split them up.
S.amount -= amount
inserted = 1
break
if(!inserted || !S.amount)
usr.remove_from_mob(S)
usr.update_icons() //update our overlays
if (usr.client && usr.s_active != src)
usr.client.screen -= S
S.dropped(usr)
if(!S.amount)
qdel(S)
else else
amount = S.amount S.loc = src
for(var/obj/item/stack/material/sheet in contents) orient2hud(usr)
if(S.type == sheet.type) // we are violating the amount limitation because these are not sane objects if(usr.s_active)
sheet.amount += amount // they should only be removed through procs in this file, which split them up. usr.s_active.show_to(usr)
S.amount -= amount update_icon()
inserted = 1 return 1
break
if(!inserted || !S.amount)
usr.remove_from_mob(S)
usr.update_icons() //update our overlays
if (usr.client && usr.s_active != src)
usr.client.screen -= S
S.dropped(usr)
if(!S.amount)
qdel(S)
else
S.loc = src
orient2hud(usr)
if(usr.s_active)
usr.s_active.show_to(usr)
update_icon()
return 1
// Sets up numbered display to show the stack size of each stored mineral // Sets up numbered display to show the stack size of each stored mineral
// NOTE: numbered display is turned off currently because it's broken // NOTE: numbered display is turned off currently because it's broken
orient2hud(mob/user as mob) /obj/item/weapon/storage/bag/sheetsnatcher/orient2hud(mob/user as mob)
var/adjusted_contents = contents.len var/adjusted_contents = contents.len
//Numbered contents display //Numbered contents display
var/list/datum/numbered_display/numbered_contents var/list/datum/numbered_display/numbered_contents
if(display_contents_with_number) if(display_contents_with_number)
numbered_contents = list() numbered_contents = list()
adjusted_contents = 0 adjusted_contents = 0
for(var/obj/item/stack/material/I in contents) for(var/obj/item/stack/material/I in contents)
adjusted_contents++ adjusted_contents++
var/datum/numbered_display/D = new/datum/numbered_display(I) var/datum/numbered_display/D = new/datum/numbered_display(I)
D.number = I.amount D.number = I.amount
numbered_contents.Add( D ) numbered_contents.Add( D )
var/row_num = 0 var/row_num = 0
var/col_count = min(7,storage_slots) -1 var/col_count = min(7,storage_slots) -1
if (adjusted_contents > 7) if (adjusted_contents > 7)
row_num = round((adjusted_contents-1) / 7) // 7 is the maximum allowed width. row_num = round((adjusted_contents-1) / 7) // 7 is the maximum allowed width.
src.slot_orient_objs(row_num, col_count, numbered_contents) src.slot_orient_objs(row_num, col_count, numbered_contents)
return return
// Modified quick_empty verb drops appropriate sized stacks // Modified quick_empty verb drops appropriate sized stacks
quick_empty() /obj/item/weapon/storage/bag/sheetsnatcher/quick_empty()
var/location = get_turf(src) var/location = get_turf(src)
for(var/obj/item/stack/material/S in contents) for(var/obj/item/stack/material/S in contents)
while(S.amount) while(S.amount)
var/obj/item/stack/material/N = new S.type(location) var/obj/item/stack/material/N = new S.type(location)
var/stacksize = min(S.amount,N.max_amount) var/stacksize = min(S.amount,N.max_amount)
N.amount = stacksize N.amount = stacksize
S.amount -= stacksize S.amount -= stacksize
if(!S.amount) if(!S.amount)
qdel(S) // todo: there's probably something missing here qdel(S) // todo: there's probably something missing here
orient2hud(usr) orient2hud(usr)
if(usr.s_active) if(usr.s_active)
usr.s_active.show_to(usr) usr.s_active.show_to(usr)
update_icon() update_icon()
// Instead of removing // Instead of removing
remove_from_storage(obj/item/W as obj, atom/new_location) /obj/item/weapon/storage/bag/sheetsnatcher/remove_from_storage(obj/item/W as obj, atom/new_location)
var/obj/item/stack/material/S = W var/obj/item/stack/material/S = W
if(!istype(S)) return 0 if(!istype(S)) return 0
//I would prefer to drop a new stack, but the item/attack_hand code //I would prefer to drop a new stack, but the item/attack_hand code
// that calls this can't recieve a different object than you clicked on. // that calls this can't recieve a different object than you clicked on.
//Therefore, make a new stack internally that has the remainder. //Therefore, make a new stack internally that has the remainder.
// -Sayu // -Sayu
if(S.amount > S.max_amount) if(S.amount > S.max_amount)
var/obj/item/stack/material/temp = new S.type(src) var/obj/item/stack/material/temp = new S.type(src)
temp.amount = S.amount - S.max_amount temp.amount = S.amount - S.max_amount
S.amount = S.max_amount S.amount = S.max_amount
return ..(S,new_location) return ..(S,new_location)
// ----------------------------- // -----------------------------
// Sheet Snatcher (Cyborg) // Sheet Snatcher (Cyborg)

View File

@@ -356,34 +356,52 @@
//This proc handles items being inserted. It does not perform any checks of whether an item can or can't be inserted. That's done by can_be_inserted() //This proc handles items being inserted. It does not perform any checks of whether an item can or can't be inserted. That's done by can_be_inserted()
//The stop_warning parameter will stop the insertion message from being displayed. It is intended for cases where you are inserting multiple items at once, //The stop_warning parameter will stop the insertion message from being displayed. It is intended for cases where you are inserting multiple items at once,
//such as when picking up all the items on a tile with one click. //such as when picking up all the items on a tile with one click.
/obj/item/weapon/storage/proc/handle_item_insertion(obj/item/W as obj, prevent_warning = 0) /obj/item/weapon/storage/proc/handle_item_insertion(obj/item/W as obj, prevent_warning = 0, mob/user = usr)
if(!istype(W)) return 0 if(!istype(W)) return 0
if(usr) if(user)
usr.prepare_for_slotmove(W) user.prepare_for_slotmove(W)
usr.update_icons() //update our overlays
W.forceMove(src) W.forceMove(src)
W.on_enter_storage(src) W.on_enter_storage(src)
if(usr) if(user)
if (usr.client && usr.s_active != src) W.dropped(user)
usr.client.screen -= W add_fingerprint(user)
W.dropped(usr)
add_fingerprint(usr)
if(!prevent_warning) if(!prevent_warning)
for(var/mob/M in viewers(usr, null)) for(var/mob/M in viewers(user, null))
if (M == usr) if (M == usr)
usr << "<span class='notice'>You put \the [W] into [src].</span>" usr << "<span class='notice'>You put \the [W] into [src].</span>"
else if (M in range(1)) //If someone is standing close enough, they can tell what it is... else if (M in range(1)) //If someone is standing close enough, they can tell what it is...
M.show_message("<span class='notice'>\The [usr] puts [W] into [src].</span>") M.show_message("<span class='notice'>\The [user] puts [W] into [src].</span>")
else if (W && W.w_class >= 3) //Otherwise they can only see large or normal items from a distance... else if (W && W.w_class >= 3) //Otherwise they can only see large or normal items from a distance...
M.show_message("<span class='notice'>\The [usr] puts [W] into [src].</span>") M.show_message("<span class='notice'>\The [user] puts [W] into [src].</span>")
src.orient2hud(usr) orient2hud(user)
if(usr.s_active) if(user.s_active)
usr.s_active.show_to(usr) user.s_active.show_to(user)
update_icon() queue_icon_update()
return 1 return 1
// This is for inserting more than one thing at a time, you should call handle_storage_deferred after all the items have been inserted.
/obj/item/weapon/storage/proc/handle_item_insertion_deferred(obj/item/W, mob/user)
if (!istype(W))
return FALSE
if (user)
user.prepare_for_slotmove(W)
W.forceMove(src)
W.on_enter_storage(src)
if (user)
W.dropped(user)
/obj/item/weapon/storage/proc/handle_storage_deferred(mob/user)
add_fingerprint(user)
user.update_icons()
orient2hud(user)
if (user.s_active)
user.s_active.show_to(user)
queue_icon_update()
//Call this proc to handle the removal of an item from the storage item. The item will be moved to the atom sent as new_target //Call this proc to handle the removal of an item from the storage item. The item will be moved to the atom sent as new_target
/obj/item/weapon/storage/proc/remove_from_storage(obj/item/W as obj, atom/new_location) /obj/item/weapon/storage/proc/remove_from_storage(obj/item/W as obj, atom/new_location)
if(!istype(W)) return 0 if(!istype(W)) return 0
@@ -418,6 +436,45 @@
update_icon() update_icon()
return 1 return 1
/obj/item/weapon/storage/proc/remove_from_storage_deferred(obj/item/W, atom/new_location, mob/user)
if (!istype(W))
return FALSE
// fuck if I know.
for(var/mob/M in range(1, src.loc))
if (M.s_active == src)
if (M.client)
M.client.screen -= W
if (new_location)
if (ismob(loc))
W.dropped(user)
if (ismob(new_location))
W.layer = 20
else
W.layer = initial(W.layer)
W.forceMove(new_location)
else
W.forceMove(get_turf(src))
if (W.maptext)
W.maptext = ""
W.on_exit_storage(src)
return TRUE
/obj/item/weapon/storage/proc/post_remove_from_storage_deferred(atom/oldloc, mob/user)
orient2hud(user)
if (user.s_active)
user.s_active.show_to(user)
// who knows what the fuck this does
if (istype(src, /obj/item/weapon/storage/fancy))
update_icon(1)
else
update_icon()
//This proc is called when you want to place an item into the storage item. //This proc is called when you want to place an item into the storage item.
//Its a safe proc for adding things to the storage that does the necessary checks. Object will not be moved if it fails //Its a safe proc for adding things to the storage that does the necessary checks. Object will not be moved if it fails
@@ -509,10 +566,12 @@
var/turf/T = get_turf(src) var/turf/T = get_turf(src)
hide_from(usr) hide_from(usr)
for(var/obj/item/I in contents) for(var/obj/item/I in contents)
remove_from_storage(I, T) remove_from_storage_deferred(I, T, usr)
CHECK_TICK CHECK_TICK
post_remove_from_storage_deferred(loc, usr)
// Override this to fill the storage object with stuff. // Override this to fill the storage object with stuff.
/obj/item/weapon/storage/proc/fill() /obj/item/weapon/storage/proc/fill()
return return

View File

@@ -287,7 +287,7 @@
if(!(S.status & ORGAN_ROBOT) || user.a_intent != I_HELP) if(!(S.status & ORGAN_ROBOT) || user.a_intent != I_HELP)
return ..() return ..()
if(M.isSynthetic() && M == user) if(M.isSynthetic() && M == user && !(M.get_species() == "Hunter-Killer"))
user << "<span class='warning'>You can't repair damage to your own body - it's against OH&S.</span>" user << "<span class='warning'>You can't repair damage to your own body - it's against OH&S.</span>"
return return
if(S.brute_dam == 0) if(S.brute_dam == 0)

View File

@@ -23,13 +23,15 @@
var/safedrop = 0//Used to tell when we should or shouldn't spill if the tray is dropped. var/safedrop = 0//Used to tell when we should or shouldn't spill if the tray is dropped.
//Safedrop is set true when throwing, because it will spill on impact. And when placing on a table //Safedrop is set true when throwing, because it will spill on impact. And when placing on a table
var/list/valid = list( /obj/item/weapon/reagent_containers, var/list/valid = list(
/obj/item/weapon/reagent_containers,
/obj/item/weapon/material/kitchen/utensil, /obj/item/weapon/material/kitchen/utensil,
/obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/storage/fancy/cigarettes,
/obj/item/clothing/mask/smokable, /obj/item/clothing/mask/smokable,
/obj/item/weapon/storage/box/matches, /obj/item/weapon/storage/box/matches,
/obj/item/weapon/flame/match, /obj/item/weapon/flame/match,
/obj/item/weapon/material/ashtray) /obj/item/weapon/material/ashtray
)
/obj/item/weapon/tray/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob, var/target_zone) /obj/item/weapon/tray/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob, var/target_zone)
@@ -38,7 +40,6 @@
// Drop all the things. All of them. // Drop all the things. All of them.
spill(user, M.loc) spill(user, M.loc)
//Note: Added a robot check to all stun/weaken procs, beccause weakening a robot causes its active modules to bug out //Note: Added a robot check to all stun/weaken procs, beccause weakening a robot causes its active modules to bug out
if((CLUMSY in user.mutations) && prob(50)) //What if he's a clown? if((CLUMSY in user.mutations) && prob(50)) //What if he's a clown?
M << "<span class='warning'>You accidentally slam yourself with the [src]!</span>" M << "<span class='warning'>You accidentally slam yourself with the [src]!</span>"
@@ -236,10 +237,12 @@
/obj/item/weapon/tray/proc/load_item(var/obj/item/I, var/mob/user) /obj/item/weapon/tray/proc/load_item(var/obj/item/I, var/mob/user)
user.remove_from_mob(I) user.remove_from_mob(I)
I.loc = src I.forceMove(src)
current_weight += I.w_class current_weight += I.w_class
carrying += I carrying += I
add_overlay(image("icon" = I.icon, "icon_state" = I.icon_state, "layer" = 30 + I.layer, "pixel_x" = I.pixel_x, "pixel_y" = I.pixel_y)) var/mutable_appearance/MA = new(I)
MA.layer = FLOAT_LAYER
add_overlay(MA)
//rand(0, (max_offset_y*2)-3)-(max_offset_y)-3 //rand(0, (max_offset_y*2)-3)-(max_offset_y)-3
/obj/item/weapon/tray/verb/unload() /obj/item/weapon/tray/verb/unload()

View File

@@ -7,6 +7,7 @@
w_class = 5 w_class = 5
var/icon_closed = "closed" var/icon_closed = "closed"
var/icon_opened = "open" var/icon_opened = "open"
var/welded_overlay_state = "welded"
var/opened = 0 var/opened = 0
var/welded = 0 var/welded = 0
var/wall_mounted = 0 //never solid (You can always pass over it) var/wall_mounted = 0 //never solid (You can always pass over it)
@@ -355,7 +356,7 @@
if(!opened) if(!opened)
icon_state = icon_closed icon_state = icon_closed
if(welded) if(welded)
add_overlay("welded") add_overlay(welded_overlay_state)
else else
icon_state = icon_opened icon_state = icon_opened

View File

@@ -185,6 +185,7 @@
icon_state = "hydrant" icon_state = "hydrant"
icon_closed = "hydrant" icon_closed = "hydrant"
icon_opened = "hydrant_open" icon_opened = "hydrant_open"
welded_overlay_state = "welded_wallcloset"
anchored = 1 anchored = 1
density = 0 density = 0
wall_mounted = 1 wall_mounted = 1
@@ -209,6 +210,7 @@
icon_state = "medical_wall" icon_state = "medical_wall"
icon_closed = "medical_wall" icon_closed = "medical_wall"
icon_opened = "medical_wall_open" icon_opened = "medical_wall_open"
welded_overlay_state = "welded_wallcloset"
anchored = 1 anchored = 1
density = 0 density = 0
wall_mounted = 1 wall_mounted = 1

View File

@@ -37,22 +37,24 @@
pref.be_special_role -= role pref.be_special_role -= role
/datum/category_item/player_setup_item/antagonism/candidacy/content(var/mob/user) /datum/category_item/player_setup_item/antagonism/candidacy/content(var/mob/user)
. += "<b>Special Role Availability:</b><br>" var/list/dat = list(
. += "<table>" "<b>Special Role Availability:</b><br>",
"<table>"
)
var/is_global_banned = jobban_isbanned(preference_mob(), "Antagonist") var/is_global_banned = jobban_isbanned(preference_mob(), "Antagonist")
for(var/antag_type in all_antag_types) for(var/antag_type in all_antag_types)
var/datum/antagonist/antag = all_antag_types[antag_type] var/datum/antagonist/antag = all_antag_types[antag_type]
. += "<tr><td>[antag.role_text]: </td><td>" dat += "<tr><td>[antag.role_text]: </td><td>"
var/ban_reason = jobban_isbanned(preference_mob(), antag.bantype) var/ban_reason = jobban_isbanned(preference_mob(), antag.bantype)
if(ban_reason == "AGE WHITELISTED") if(ban_reason == "AGE WHITELISTED")
. += "<span class='danger'>\[IN [player_old_enough_for_role(preference_mob(), antag.bantype)] DAYS\]</span><br>" dat += "<span class='danger'>\[IN [player_old_enough_for_role(preference_mob(), antag.bantype)] DAYS\]</span><br>"
else if(is_global_banned || ban_reason) else if(is_global_banned || ban_reason)
. += "<span class='danger'>\[<a href='?src=\ref[user.client];view_jobban=[is_global_banned ? "Antagonist" : "[antag.bantype]"];'>BANNED</a>\]</span><br>" dat += "<span class='danger'>\[<a href='?src=\ref[user.client];view_jobban=[is_global_banned ? "Antagonist" : "[antag.bantype]"];'>BANNED</a>\]</span><br>"
else if(antag.role_type in pref.be_special_role) else if(antag.role_type in pref.be_special_role)
. += "<b>Yes</b> / <a href='?src=\ref[src];del_special=[antag.role_type]'>No</a></br>" dat += "<b>Yes</b> / <a href='?src=\ref[src];del_special=[antag.role_type]'>No</a></br>"
else else
. += "<a href='?src=\ref[src];add_special=[antag.role_type]'>Yes</a> / <b>No</b></br>" dat += "<a href='?src=\ref[src];add_special=[antag.role_type]'>Yes</a> / <b>No</b></br>"
. += "</td></tr>" dat += "</td></tr>"
var/list/ghost_traps = get_ghost_traps() var/list/ghost_traps = get_ghost_traps()
for(var/ghost_trap_key in ghost_traps) for(var/ghost_trap_key in ghost_traps)
@@ -60,7 +62,7 @@
if(!ghost_trap.list_as_special_role) if(!ghost_trap.list_as_special_role)
continue continue
. += "<tr><td>[(ghost_trap.ghost_trap_role)]: </td><td>" dat += "<tr><td>[(ghost_trap.ghost_trap_role)]: </td><td>"
var/ban_state = banned_from_ghost_role(preference_mob(), ghost_trap) var/ban_state = banned_from_ghost_role(preference_mob(), ghost_trap)
if(ban_state == AGEBAN) if(ban_state == AGEBAN)
var/age_to_beat = 0 var/age_to_beat = 0
@@ -68,15 +70,17 @@
age_to_beat = player_old_enough_for_role(preference_mob(), A) age_to_beat = player_old_enough_for_role(preference_mob(), A)
if (age_to_beat) if (age_to_beat)
break break
. += "<span class='danger'>\[IN [age_to_beat] DAYS\]</span><br>" dat += "<span class='danger'>\[IN [age_to_beat] DAYS\]</span><br>"
else if (ban_state == RANBAN) else if (ban_state == RANBAN)
. += "<span class='danger'>\[<a href='?src=\ref[user.client];view_jobban=[ghost_trap];'>BANNED</a>\]</span><br>" dat += "<span class='danger'>\[<a href='?src=\ref[user.client];view_jobban=[ghost_trap];'>BANNED</a>\]</span><br>"
else if(ghost_trap.pref_check in pref.be_special_role) else if(ghost_trap.pref_check in pref.be_special_role)
. += "<b>Yes</b> / <a href='?src=\ref[src];del_special=[ghost_trap.pref_check]'>No</a></br>" dat += "<b>Yes</b> / <a href='?src=\ref[src];del_special=[ghost_trap.pref_check]'>No</a></br>"
else else
. += "<a href='?src=\ref[src];add_special=[ghost_trap.pref_check]'>Yes</a> / <b>No</b></br>" dat += "<a href='?src=\ref[src];add_special=[ghost_trap.pref_check]'>Yes</a> / <b>No</b></br>"
. += "</td></tr>" dat += "</td></tr>"
. += "</table>" dat += "</table>"
. = dat.Join()
/datum/category_item/player_setup_item/proc/banned_from_ghost_role(var/mob, var/datum/ghosttrap/ghost_trap) /datum/category_item/player_setup_item/proc/banned_from_ghost_role(var/mob, var/datum/ghosttrap/ghost_trap)
for(var/ban_type in ghost_trap.ban_checks) for(var/ban_type in ghost_trap.ban_checks)

View File

@@ -13,15 +13,39 @@ var/global/list/uplink_locations = list("PDA", "Headset", "None")
S["exploit_record"] << pref.exploit_record S["exploit_record"] << pref.exploit_record
/datum/category_item/player_setup_item/antagonism/basic/gather_load_query() /datum/category_item/player_setup_item/antagonism/basic/gather_load_query()
return list("ss13_characters_flavour" = list("vars" = list("records_exploit" = "exploit_record"), "args" = list("char_id")), return list(
"ss13_characters" = list("vars" = list("uplink_location" = "uplinklocation"), "args" = list("id"))) "ss13_characters_flavour" = list(
"vars" = list(
"records_exploit" = "exploit_record"
),
"args" = list("char_id")
),
"ss13_characters" = list(
"vars" = list(
"uplink_location" = "uplinklocation"
),
"args" = list("id")
)
)
/datum/category_item/player_setup_item/antagonism/basic/gather_load_parameters() /datum/category_item/player_setup_item/antagonism/basic/gather_load_parameters()
return list("char_id" = pref.current_character, "id" = pref.current_character) return list(
"char_id" = pref.current_character,
"id" = pref.current_character
)
/datum/category_item/player_setup_item/antagonism/basic/gather_save_query() /datum/category_item/player_setup_item/antagonism/basic/gather_save_query()
return list("ss13_characters_flavour" = list("records_exploit", "char_id" = 1), return list(
"ss13_characters" = list("uplink_location", "id" = 1, "ckey" = 1)) "ss13_characters_flavour" = list(
"records_exploit",
"char_id" = 1
),
"ss13_characters" = list(
"uplink_location",
"id" = 1,
"ckey" = 1
)
)
/datum/category_item/player_setup_item/antagonism/basic/gather_save_parameters() /datum/category_item/player_setup_item/antagonism/basic/gather_save_parameters()
return list("records_exploit" = pref.exploit_record, "char_id" = pref.current_character, "uplink_location" = pref.uplinklocation, "id" = pref.current_character, "ckey" = pref.client.ckey) return list("records_exploit" = pref.exploit_record, "char_id" = pref.current_character, "uplink_location" = pref.uplinklocation, "id" = pref.current_character, "ckey" = pref.client.ckey)
@@ -30,13 +54,17 @@ var/global/list/uplink_locations = list("PDA", "Headset", "None")
pref.uplinklocation = sanitize_inlist(pref.uplinklocation, uplink_locations, initial(pref.uplinklocation)) pref.uplinklocation = sanitize_inlist(pref.uplinklocation, uplink_locations, initial(pref.uplinklocation))
/datum/category_item/player_setup_item/antagonism/basic/content(var/mob/user) /datum/category_item/player_setup_item/antagonism/basic/content(var/mob/user)
. +="<b>Antag Setup:</b><br>" var/list/dat = list(
. +="Uplink Type: <a href='?src=\ref[src];antagtask=1'>[pref.uplinklocation]</a><br>" "<b>Antag Setup:</b><br>",
. +="Exploitable information:<br>" "Uplink Type: <a href='?src=\ref[src];antagtask=1'>[pref.uplinklocation]</a><br>",
"Exploitable information:<br>"
)
if(jobban_isbanned(user, "Records")) if(jobban_isbanned(user, "Records"))
. += "<b>You are banned from using character records.</b><br>" dat += "<b>You are banned from using character records.</b><br>"
else else
. +="<a href='?src=\ref[src];exploitable_record=1'>[TextPreview(pref.exploit_record,40)]</a><br>" dat +="<a href='?src=\ref[src];exploitable_record=1'>[TextPreview(pref.exploit_record,40)]</a><br>"
. = dat.Join()
/datum/category_item/player_setup_item/antagonism/basic/OnTopic(var/href,var/list/href_list, var/mob/user) /datum/category_item/player_setup_item/antagonism/basic/OnTopic(var/href,var/list/href_list, var/mob/user)
if (href_list["antagtask"]) if (href_list["antagtask"])

View File

@@ -4,52 +4,64 @@
var/static/list/valid_player_genders = list(MALE, FEMALE) var/static/list/valid_player_genders = list(MALE, FEMALE)
/datum/category_item/player_setup_item/general/basic/load_character(var/savefile/S) /datum/category_item/player_setup_item/general/basic/load_character(var/savefile/S)
S["real_name"] >> pref.real_name S["real_name"] >> pref.real_name
S["gender"] >> pref.gender S["gender"] >> pref.gender
S["age"] >> pref.age S["age"] >> pref.age
S["species"] >> pref.species S["species"] >> pref.species
S["spawnpoint"] >> pref.spawnpoint S["spawnpoint"] >> pref.spawnpoint
S["OOC_Notes"] >> pref.metadata S["OOC_Notes"] >> pref.metadata
/datum/category_item/player_setup_item/general/basic/save_character(var/savefile/S) /datum/category_item/player_setup_item/general/basic/save_character(var/savefile/S)
S["real_name"] << pref.real_name S["real_name"] << pref.real_name
S["gender"] << pref.gender S["gender"] << pref.gender
S["age"] << pref.age S["age"] << pref.age
S["species"] << pref.species S["species"] << pref.species
S["spawnpoint"] << pref.spawnpoint S["spawnpoint"] << pref.spawnpoint
S["OOC_Notes"] << pref.metadata S["OOC_Notes"] << pref.metadata
/datum/category_item/player_setup_item/general/basic/gather_load_query() /datum/category_item/player_setup_item/general/basic/gather_load_query()
return list("ss13_characters" = list("vars" = list("name" = "real_name", return list(
"gender", "ss13_characters" = list(
"age", "vars" = list(
"metadata", "name" = "real_name",
"spawnpoint", "gender",
"species"), "age",
"args" = list("id"))) "metadata",
"spawnpoint",
"species"
),
"args" = list("id")
)
)
/datum/category_item/player_setup_item/general/basic/gather_load_parameters() /datum/category_item/player_setup_item/general/basic/gather_load_parameters()
return list("id" = pref.current_character) return list("id" = pref.current_character)
/datum/category_item/player_setup_item/general/basic/gather_save_query() /datum/category_item/player_setup_item/general/basic/gather_save_query()
return list("ss13_characters" = list("name", return list(
"gender", "ss13_characters" = list(
"age", "name",
"metadata", "gender",
"spawnpoint", "age",
"species", "metadata",
"id" = 1, "spawnpoint",
"ckey" = 1)) "species",
"id" = 1,
"ckey" = 1
)
)
/datum/category_item/player_setup_item/general/basic/gather_save_parameters() /datum/category_item/player_setup_item/general/basic/gather_save_parameters()
return list("name" = pref.real_name, return list(
"gender" = pref.gender, "name" = pref.real_name,
"age" = pref.age, "gender" = pref.gender,
"metadata" = pref.metadata, "age" = pref.age,
"spawnpoint" = pref.spawnpoint, "metadata" = pref.metadata,
"species" = pref.species, "spawnpoint" = pref.spawnpoint,
"id" = pref.current_character, "species" = pref.species,
"ckey" = pref.client.ckey) "id" = pref.current_character,
"ckey" = pref.client.ckey
)
/datum/category_item/player_setup_item/general/basic/load_special() /datum/category_item/player_setup_item/general/basic/load_special()
pref.can_edit_name = 1 pref.can_edit_name = 1
@@ -74,27 +86,29 @@
if(!pref.species || !(pref.species in playable_species)) if(!pref.species || !(pref.species in playable_species))
pref.species = "Human" pref.species = "Human"
pref.age = sanitize_integer(text2num(pref.age), pref.getMinAge(), pref.getMaxAge(), initial(pref.age)) pref.age = sanitize_integer(text2num(pref.age), pref.getMinAge(), pref.getMaxAge(), initial(pref.age))
pref.gender = sanitize_inlist(pref.gender, valid_player_genders, pick(valid_player_genders)) pref.gender = sanitize_inlist(pref.gender, valid_player_genders, pick(valid_player_genders))
pref.real_name = sanitize_name(pref.real_name, pref.species) pref.real_name = sanitize_name(pref.real_name, pref.species)
if(!pref.real_name) if(!pref.real_name)
pref.real_name = random_name(pref.gender, pref.species) pref.real_name = random_name(pref.gender, pref.species)
pref.spawnpoint = sanitize_inlist(pref.spawnpoint, spawntypes, initial(pref.spawnpoint)) pref.spawnpoint = sanitize_inlist(pref.spawnpoint, spawntypes, initial(pref.spawnpoint))
/datum/category_item/player_setup_item/general/basic/content() /datum/category_item/player_setup_item/general/basic/content()
. = "<b>Name:</b> " var/list/dat = list("<b>Name:</b> ")
if (pref.can_edit_name) if (pref.can_edit_name)
. += "<a href='?src=\ref[src];rename=1'><b>[pref.real_name]</b></a><br>" dat += "<a href='?src=\ref[src];rename=1'><b>[pref.real_name]</b></a><br>"
else else
. += "<b>[pref.real_name]</b><br> (<a href='?src=\ref[src];namehelp=1'>?</a>)" dat += "<b>[pref.real_name]</b><br> (<a href='?src=\ref[src];namehelp=1'>?</a>)"
if (pref.can_edit_name) if (pref.can_edit_name)
. += "(<a href='?src=\ref[src];random_name=1'>Random Name</A>)" dat += "(<a href='?src=\ref[src];random_name=1'>Random Name</A>)"
. += "<br>" dat += "<br>"
. += "<b>Gender:</b> <a href='?src=\ref[src];gender=1'><b>[capitalize(lowertext(pref.gender))]</b></a><br>" dat += "<b>Gender:</b> <a href='?src=\ref[src];gender=1'><b>[capitalize(lowertext(pref.gender))]</b></a><br>"
. += "<b>Age:</b> <a href='?src=\ref[src];age=1'>[pref.age]</a><br>" dat += "<b>Age:</b> <a href='?src=\ref[src];age=1'>[pref.age]</a><br>"
. += "<b>Spawn Point</b>: <a href='?src=\ref[src];spawnpoint=1'>[pref.spawnpoint]</a><br>" dat += "<b>Spawn Point</b>: <a href='?src=\ref[src];spawnpoint=1'>[pref.spawnpoint]</a><br>"
if(config.allow_Metadata) if(config.allow_Metadata)
. += "<b>OOC Notes:</b> <a href='?src=\ref[src];metadata=1'> Edit </a><br>" dat += "<b>OOC Notes:</b> <a href='?src=\ref[src];metadata=1'> Edit </a><br>"
. = dat.Join()
/datum/category_item/player_setup_item/general/basic/OnTopic(var/href,var/list/href_list, var/mob/user) /datum/category_item/player_setup_item/general/basic/OnTopic(var/href,var/list/href_list, var/mob/user)
if(href_list["rename"]) if(href_list["rename"])

View File

@@ -3,26 +3,39 @@
sort_order = 2 sort_order = 2
/datum/category_item/player_setup_item/general/language/load_character(var/savefile/S) /datum/category_item/player_setup_item/general/language/load_character(var/savefile/S)
S["language"] >> pref.alternate_languages S["language"] >> pref.alternate_languages
/datum/category_item/player_setup_item/general/language/save_character(var/savefile/S) /datum/category_item/player_setup_item/general/language/save_character(var/savefile/S)
S["language"] << pref.alternate_languages S["language"] << pref.alternate_languages
/datum/category_item/player_setup_item/general/language/gather_load_query() /datum/category_item/player_setup_item/general/language/gather_load_query()
return list("ss13_characters" = list("vars" = list("language" = "alternate_languages"), "args" = list("id"))) return list(
"ss13_characters" = list(
"vars" = list(
"language" = "alternate_languages"
),
"args" = list("id")
)
)
/datum/category_item/player_setup_item/general/language/gather_load_parameters() /datum/category_item/player_setup_item/general/language/gather_load_parameters()
return list("id" = pref.current_character) return list("id" = pref.current_character)
/datum/category_item/player_setup_item/general/language/gather_save_query() /datum/category_item/player_setup_item/general/language/gather_save_query()
return list("ss13_characters" = list("id" = 1, return list(
"ckey" = 1, "ss13_characters" = list(
"language")) "id" = 1,
"ckey" = 1,
"language"
)
)
/datum/category_item/player_setup_item/general/language/gather_save_parameters() /datum/category_item/player_setup_item/general/language/gather_save_parameters()
return list("language" = list2params(pref.alternate_languages), return list(
"id" = pref.current_character, "language" = list2params(pref.alternate_languages),
"ckey" = pref.client.ckey) "id" = pref.current_character,
"ckey" = pref.client.ckey
)
/datum/category_item/player_setup_item/general/language/sanitize_character(var/sql_load = 0) /datum/category_item/player_setup_item/general/language/sanitize_character(var/sql_load = 0)
if (sql_load) if (sql_load)
@@ -58,22 +71,24 @@
cat.modified = TRUE cat.modified = TRUE
/datum/category_item/player_setup_item/general/language/content() /datum/category_item/player_setup_item/general/language/content()
. += "<b>Languages</b><br>" var/list/dat = list("<b>Languages</b><br>")
var/datum/species/S = all_species[pref.species] var/datum/species/S = all_species[pref.species]
if(S.language) if(S.language)
. += "- [S.language]<br>" dat += "- [S.language]<br>"
if(S.default_language && S.default_language != S.language) if(S.default_language && S.default_language != S.language)
. += "- [S.default_language]<br>" dat += "- [S.default_language]<br>"
if(S.num_alternate_languages) if(S.num_alternate_languages)
if(pref.alternate_languages.len) if(pref.alternate_languages.len)
for(var/i = 1 to pref.alternate_languages.len) for(var/i = 1 to pref.alternate_languages.len)
var/lang = pref.alternate_languages[i] var/lang = pref.alternate_languages[i]
. += "- [lang] - <a href='?src=\ref[src];remove_language=[i]'>remove</a><br>" dat += "- [lang] - <a href='?src=\ref[src];remove_language=[i]'>remove</a><br>"
if(pref.alternate_languages.len < S.num_alternate_languages) if(pref.alternate_languages.len < S.num_alternate_languages)
. += "- <a href='?src=\ref[src];add_language=1'>add</a> ([S.num_alternate_languages - pref.alternate_languages.len] remaining)<br>" dat += "- <a href='?src=\ref[src];add_language=1'>add</a> ([S.num_alternate_languages - pref.alternate_languages.len] remaining)<br>"
else else
. += "- [pref.species] cannot choose secondary languages.<br>" dat += "- [pref.species] cannot choose secondary languages.<br>"
. = dat.Join()
/datum/category_item/player_setup_item/general/language/OnTopic(var/href,var/list/href_list, var/mob/user) /datum/category_item/player_setup_item/general/language/OnTopic(var/href,var/list/href_list, var/mob/user)
if(href_list["remove_language"]) if(href_list["remove_language"])

View File

@@ -5,123 +5,135 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
sort_order = 3 sort_order = 3
/datum/category_item/player_setup_item/general/body/load_character(var/savefile/S) /datum/category_item/player_setup_item/general/body/load_character(var/savefile/S)
S["hair_red"] >> pref.r_hair S["hair_red"] >> pref.r_hair
S["hair_green"] >> pref.g_hair S["hair_green"] >> pref.g_hair
S["hair_blue"] >> pref.b_hair S["hair_blue"] >> pref.b_hair
S["facial_red"] >> pref.r_facial S["facial_red"] >> pref.r_facial
S["facial_green"] >> pref.g_facial S["facial_green"] >> pref.g_facial
S["facial_blue"] >> pref.b_facial S["facial_blue"] >> pref.b_facial
S["skin_tone"] >> pref.s_tone S["skin_tone"] >> pref.s_tone
S["skin_red"] >> pref.r_skin S["skin_red"] >> pref.r_skin
S["skin_green"] >> pref.g_skin S["skin_green"] >> pref.g_skin
S["skin_blue"] >> pref.b_skin S["skin_blue"] >> pref.b_skin
S["hair_style_name"] >> pref.h_style S["hair_style_name"] >> pref.h_style
S["facial_style_name"] >> pref.f_style S["facial_style_name"] >> pref.f_style
S["eyes_red"] >> pref.r_eyes S["eyes_red"] >> pref.r_eyes
S["eyes_green"] >> pref.g_eyes S["eyes_green"] >> pref.g_eyes
S["eyes_blue"] >> pref.b_eyes S["eyes_blue"] >> pref.b_eyes
S["b_type"] >> pref.b_type S["b_type"] >> pref.b_type
S["disabilities"] >> pref.disabilities S["disabilities"] >> pref.disabilities
S["organ_data"] >> pref.organ_data S["organ_data"] >> pref.organ_data
S["rlimb_data"] >> pref.rlimb_data S["rlimb_data"] >> pref.rlimb_data
S["body_markings"] >> pref.body_markings S["body_markings"] >> pref.body_markings
pref.preview_icon = null pref.preview_icon = null
/datum/category_item/player_setup_item/general/body/save_character(var/savefile/S) /datum/category_item/player_setup_item/general/body/save_character(var/savefile/S)
S["hair_red"] << pref.r_hair S["hair_red"] << pref.r_hair
S["hair_green"] << pref.g_hair S["hair_green"] << pref.g_hair
S["hair_blue"] << pref.b_hair S["hair_blue"] << pref.b_hair
S["facial_red"] << pref.r_facial S["facial_red"] << pref.r_facial
S["facial_green"] << pref.g_facial S["facial_green"] << pref.g_facial
S["facial_blue"] << pref.b_facial S["facial_blue"] << pref.b_facial
S["skin_tone"] << pref.s_tone S["skin_tone"] << pref.s_tone
S["skin_red"] << pref.r_skin S["skin_red"] << pref.r_skin
S["skin_green"] << pref.g_skin S["skin_green"] << pref.g_skin
S["skin_blue"] << pref.b_skin S["skin_blue"] << pref.b_skin
S["hair_style_name"] << pref.h_style S["hair_style_name"] << pref.h_style
S["facial_style_name"] << pref.f_style S["facial_style_name"] << pref.f_style
S["eyes_red"] << pref.r_eyes S["eyes_red"] << pref.r_eyes
S["eyes_green"] << pref.g_eyes S["eyes_green"] << pref.g_eyes
S["eyes_blue"] << pref.b_eyes S["eyes_blue"] << pref.b_eyes
S["b_type"] << pref.b_type S["b_type"] << pref.b_type
S["disabilities"] << pref.disabilities S["disabilities"] << pref.disabilities
S["organ_data"] << pref.organ_data S["organ_data"] << pref.organ_data
S["rlimb_data"] << pref.rlimb_data S["rlimb_data"] << pref.rlimb_data
S["body_markings"] << pref.body_markings S["body_markings"] << pref.body_markings
/datum/category_item/player_setup_item/general/body/gather_load_query() /datum/category_item/player_setup_item/general/body/gather_load_query()
return list("ss13_characters" = list("vars" = list("hair_colour", return list(
"facial_colour", "ss13_characters" = list(
"skin_tone" = "s_tone", "vars" = list(
"skin_colour", "hair_colour",
"hair_style" = "h_style", "facial_colour",
"facial_style" = "f_style", "skin_tone" = "s_tone",
"eyes_colour", "skin_colour",
"b_type", "hair_style" = "h_style",
"disabilities", "facial_style" = "f_style",
"organs_data" = "organ_data", "eyes_colour",
"organs_robotic" = "rlimb_data", "b_type",
"body_markings"), "disabilities",
"args" = list("id"))) "organs_data" = "organ_data",
"organs_robotic" = "rlimb_data",
"body_markings"
),
"args" = list("id")
)
)
/datum/category_item/player_setup_item/general/body/gather_load_parameters() /datum/category_item/player_setup_item/general/body/gather_load_parameters()
return list("id" = pref.current_character) return list("id" = pref.current_character)
/datum/category_item/player_setup_item/general/body/gather_save_query() /datum/category_item/player_setup_item/general/body/gather_save_query()
return list("ss13_characters" = list("hair_colour", return list(
"facial_colour", "ss13_characters" = list(
"skin_tone", "hair_colour",
"skin_colour", "facial_colour",
"hair_style", "skin_tone",
"facial_style", "skin_colour",
"eyes_colour", "hair_style",
"b_type", "facial_style",
"disabilities", "eyes_colour",
"organs_data", "b_type",
"organs_robotic", "disabilities",
"body_markings", "organs_data",
"id" = 1, "organs_robotic",
"ckey" = 1)) "body_markings",
"id" = 1,
"ckey" = 1
)
)
/datum/category_item/player_setup_item/general/body/gather_save_parameters() /datum/category_item/player_setup_item/general/body/gather_save_parameters()
return list("hair_colour" = "#" + num2hex(pref.r_hair, 2) + num2hex(pref.g_hair, 2) + num2hex(pref.b_hair, 2), return list(
"facial_colour" = "#" + num2hex(pref.r_facial, 2) + num2hex(pref.g_facial, 2) + num2hex(pref.b_facial, 2), "hair_colour" = rgb(pref.r_hair, pref.g_hair, pref.b_hair),
"skin_tone" = pref.s_tone, "facial_colour" = rgb(pref.r_facial, pref.g_facial, pref.b_facial),
"skin_colour" = "#" + num2hex(pref.r_skin, 2) + num2hex(pref.g_skin, 2) + num2hex(pref.b_skin, 2), "skin_tone" = pref.s_tone,
"hair_style" = pref.h_style, "skin_colour" = rgb(pref.r_skin, pref.g_skin, pref.b_skin) ,
"facial_style" = pref.f_style, "hair_style" = pref.h_style,
"eyes_colour" = "#" + num2hex(pref.r_eyes, 2) + num2hex(pref.g_eyes, 2) + num2hex(pref.b_eyes, 2), "facial_style" = pref.f_style,
"b_type" = pref.b_type, "eyes_colour" = rgb(pref.r_eyes, pref.g_eyes, pref.b_eyes),
"disabilities" = pref.disabilities, "b_type" = pref.b_type,
"organs_data" = list2params(pref.organ_data), "disabilities" = pref.disabilities,
"organs_robotic"= list2params(pref.rlimb_data), "organs_data" = list2params(pref.organ_data),
"body_markings" = json_encode(pref.body_markings), "organs_robotic"= list2params(pref.rlimb_data),
"id" = pref.current_character, "body_markings" = json_encode(pref.body_markings),
"ckey" = pref.client.ckey) "id" = pref.current_character,
"ckey" = pref.client.ckey
)
/datum/category_item/player_setup_item/general/body/sanitize_character(var/sql_load = 0) /datum/category_item/player_setup_item/general/body/sanitize_character(var/sql_load = 0)
if (sql_load) if (sql_load)
pref.hair_colour = sanitize_hexcolor(pref.hair_colour) pref.hair_colour = sanitize_hexcolor(pref.hair_colour)
pref.r_hair = GetRedPart(pref.hair_colour) pref.r_hair = GetRedPart(pref.hair_colour)
pref.g_hair = GetGreenPart(pref.hair_colour) pref.g_hair = GetGreenPart(pref.hair_colour)
pref.b_hair = GetBluePart(pref.hair_colour) pref.b_hair = GetBluePart(pref.hair_colour)
pref.facial_colour = sanitize_hexcolor(pref.facial_colour) pref.facial_colour = sanitize_hexcolor(pref.facial_colour)
pref.r_facial = GetRedPart(pref.facial_colour) pref.r_facial = GetRedPart(pref.facial_colour)
pref.g_facial = GetGreenPart(pref.facial_colour) pref.g_facial = GetGreenPart(pref.facial_colour)
pref.b_facial = GetBluePart(pref.facial_colour) pref.b_facial = GetBluePart(pref.facial_colour)
pref.s_tone = text2num(pref.s_tone) pref.s_tone = text2num(pref.s_tone)
pref.skin_colour = sanitize_hexcolor(pref.skin_colour) pref.skin_colour = sanitize_hexcolor(pref.skin_colour)
pref.r_skin = GetRedPart(pref.skin_colour) pref.r_skin = GetRedPart(pref.skin_colour)
pref.g_skin = GetGreenPart(pref.skin_colour) pref.g_skin = GetGreenPart(pref.skin_colour)
pref.b_skin = GetBluePart(pref.skin_colour) pref.b_skin = GetBluePart(pref.skin_colour)
pref.skin_colour = sanitize_hexcolor(pref.skin_colour) pref.skin_colour = sanitize_hexcolor(pref.skin_colour)
pref.r_eyes = GetRedPart(pref.eyes_colour) pref.r_eyes = GetRedPart(pref.eyes_colour)
pref.g_eyes = GetGreenPart(pref.eyes_colour) pref.g_eyes = GetGreenPart(pref.eyes_colour)
pref.b_eyes = GetBluePart(pref.eyes_colour) pref.b_eyes = GetBluePart(pref.eyes_colour)
pref.disabilities = text2num(pref.disabilities) pref.disabilities = text2num(pref.disabilities)
@@ -137,24 +149,24 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
log_debug("BODY MARKINGS: Caught [e]. Initial value: [before]") log_debug("BODY MARKINGS: Caught [e]. Initial value: [before]")
pref.body_markings = list() pref.body_markings = list()
pref.r_hair = sanitize_integer(pref.r_hair, 0, 255, initial(pref.r_hair)) pref.r_hair = sanitize_integer(pref.r_hair, 0, 255, initial(pref.r_hair))
pref.g_hair = sanitize_integer(pref.g_hair, 0, 255, initial(pref.g_hair)) pref.g_hair = sanitize_integer(pref.g_hair, 0, 255, initial(pref.g_hair))
pref.b_hair = sanitize_integer(pref.b_hair, 0, 255, initial(pref.b_hair)) pref.b_hair = sanitize_integer(pref.b_hair, 0, 255, initial(pref.b_hair))
pref.r_facial = sanitize_integer(pref.r_facial, 0, 255, initial(pref.r_facial)) pref.r_facial = sanitize_integer(pref.r_facial, 0, 255, initial(pref.r_facial))
pref.g_facial = sanitize_integer(pref.g_facial, 0, 255, initial(pref.g_facial)) pref.g_facial = sanitize_integer(pref.g_facial, 0, 255, initial(pref.g_facial))
pref.b_facial = sanitize_integer(pref.b_facial, 0, 255, initial(pref.b_facial)) pref.b_facial = sanitize_integer(pref.b_facial, 0, 255, initial(pref.b_facial))
pref.s_tone = sanitize_integer(pref.s_tone, -185, 34, initial(pref.s_tone)) pref.s_tone = sanitize_integer(pref.s_tone, -185, 34, initial(pref.s_tone))
pref.r_skin = sanitize_integer(pref.r_skin, 0, 255, initial(pref.r_skin)) pref.r_skin = sanitize_integer(pref.r_skin, 0, 255, initial(pref.r_skin))
pref.g_skin = sanitize_integer(pref.g_skin, 0, 255, initial(pref.g_skin)) pref.g_skin = sanitize_integer(pref.g_skin, 0, 255, initial(pref.g_skin))
pref.b_skin = sanitize_integer(pref.b_skin, 0, 255, initial(pref.b_skin)) pref.b_skin = sanitize_integer(pref.b_skin, 0, 255, initial(pref.b_skin))
pref.h_style = sanitize_inlist(pref.h_style, hair_styles_list, initial(pref.h_style)) pref.h_style = sanitize_inlist(pref.h_style, hair_styles_list, initial(pref.h_style))
pref.f_style = sanitize_inlist(pref.f_style, facial_hair_styles_list, initial(pref.f_style)) pref.f_style = sanitize_inlist(pref.f_style, facial_hair_styles_list, initial(pref.f_style))
pref.r_eyes = sanitize_integer(pref.r_eyes, 0, 255, initial(pref.r_eyes)) pref.r_eyes = sanitize_integer(pref.r_eyes, 0, 255, initial(pref.r_eyes))
pref.g_eyes = sanitize_integer(pref.g_eyes, 0, 255, initial(pref.g_eyes)) pref.g_eyes = sanitize_integer(pref.g_eyes, 0, 255, initial(pref.g_eyes))
pref.b_eyes = sanitize_integer(pref.b_eyes, 0, 255, initial(pref.b_eyes)) pref.b_eyes = sanitize_integer(pref.b_eyes, 0, 255, initial(pref.b_eyes))
pref.b_type = sanitize_text(pref.b_type, initial(pref.b_type)) pref.b_type = sanitize_text(pref.b_type, initial(pref.b_type))
pref.disabilities = sanitize_integer(pref.disabilities, 0, 65535, initial(pref.disabilities)) pref.disabilities = sanitize_integer(pref.disabilities, 0, 65535, initial(pref.disabilities))
if (!pref.organ_data || !islist(pref.organ_data)) if (!pref.organ_data || !islist(pref.organ_data))
pref.organ_data = list() pref.organ_data = list()
if (!pref.rlimb_data || !islist(pref.rlimb_data)) if (!pref.rlimb_data || !islist(pref.rlimb_data))
@@ -163,25 +175,25 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
pref.body_markings = list() pref.body_markings = list()
/datum/category_item/player_setup_item/general/body/content(var/mob/user) /datum/category_item/player_setup_item/general/body/content(var/mob/user)
var/list/out = list()
pref.update_preview_icon() pref.update_preview_icon()
if(!pref.preview_icon) if(!pref.preview_icon)
pref.update_preview_icon() pref.update_preview_icon()
user << browse_rsc(pref.preview_icon, "previewicon.png") user << browse_rsc(pref.preview_icon, "previewicon.png")
var/datum/species/mob_species = all_species[pref.species] var/datum/species/mob_species = all_species[pref.species]
. += "<table><tr style='vertical-align:top'><td><b>Body</b> " out += "<table><tr style='vertical-align:top'><td><b>Body</b> "
. += "(<a href='?src=\ref[src];random=1'>&reg;</A>)" out += "(<a href='?src=\ref[src];random=1'>&reg;</A>)"
. += "<br>" out += "<br>"
. += "Species: <a href='?src=\ref[src];show_species=1'>[pref.species]</a><br>" out += "Species: <a href='?src=\ref[src];show_species=1'>[pref.species]</a><br>"
. += "Blood Type: <a href='?src=\ref[src];blood_type=1'>[pref.b_type]</a><br>" out += "Blood Type: <a href='?src=\ref[src];blood_type=1'>[pref.b_type]</a><br>"
if(has_flag(mob_species, HAS_SKIN_TONE)) if(has_flag(mob_species, HAS_SKIN_TONE))
. += "Skin Tone: <a href='?src=\ref[src];skin_tone=1'>[-pref.s_tone + 35]/220</a><br>" out += "Skin Tone: <a href='?src=\ref[src];skin_tone=1'>[-pref.s_tone + 35]/220</a><br>"
. += "Needs Glasses: <a href='?src=\ref[src];disabilities=[NEARSIGHTED]'><b>[pref.disabilities & NEARSIGHTED ? "Yes" : "No"]</b></a><br>" out += "Needs Glasses: <a href='?src=\ref[src];disabilities=[NEARSIGHTED]'><b>[pref.disabilities & NEARSIGHTED ? "Yes" : "No"]</b></a><br>"
if(!(has_flag(mob_species, HAS_FBP))) if(!(has_flag(mob_species, HAS_FBP)))
. += "Limbs: <a href='?src=\ref[src];limbs=1'>Adjust</a><br>" out += "Limbs: <a href='?src=\ref[src];limbs=1'>Adjust</a><br>"
. += "Internal Organs: <a href='?src=\ref[src];organs=1'>Adjust</a><br>" out += "Internal Organs: <a href='?src=\ref[src];organs=1'>Adjust</a><br>"
. += "Prosthesis/Amputations: <a href='?src=\ref[src];reset_organs=1'>Reset</a><br>" out += "Prosthesis/Amputations: <a href='?src=\ref[src];reset_organs=1'>Reset</a><br>"
//display limbs below //display limbs below
var/ind = 0 var/ind = 0
@@ -220,69 +232,71 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
if(status == "cyborg") if(status == "cyborg")
++ind ++ind
if(ind > 1) if(ind > 1)
. += ", " out += ", "
var/datum/robolimb/R var/datum/robolimb/R
if(pref.rlimb_data[name] && all_robolimbs[pref.rlimb_data[name]]) if(pref.rlimb_data[name] && all_robolimbs[pref.rlimb_data[name]])
R = all_robolimbs[pref.rlimb_data[name]] R = all_robolimbs[pref.rlimb_data[name]]
else else
R = basic_robolimb R = basic_robolimb
. += "\t[R.company] [organ_name] prosthesis" out += "\t[R.company] [organ_name] prosthesis"
else if(status == "amputated") else if(status == "amputated")
++ind ++ind
if(ind > 1) if(ind > 1)
. += ", " out += ", "
. += "\tAmputated [organ_name]" out += "\tAmputated [organ_name]"
else if(status == "mechanical") else if(status == "mechanical")
++ind ++ind
if(ind > 1) if(ind > 1)
. += ", " out += ", "
. += "\tMechanical [organ_name]" out += "\tMechanical [organ_name]"
else if(status == "assisted") else if(status == "assisted")
++ind ++ind
if(ind > 1) if(ind > 1)
. += ", " out += ", "
switch(organ_name) switch(organ_name)
if("heart") if("heart")
. += "\tPacemaker-assisted [organ_name]" out += "\tPacemaker-assisted [organ_name]"
if("voicebox") //on adding voiceboxes for speaking skrell/similar replacements if("voicebox") //on adding voiceboxes for speaking skrell/similar replacements
. += "\tSurgically altered [organ_name]" out += "\tSurgically altered [organ_name]"
if("eyes") if("eyes")
. += "\tRetinal overlayed [organ_name]" out += "\tRetinal overlayed [organ_name]"
else else
. += "\tMechanically assisted [organ_name]" out += "\tMechanically assisted [organ_name]"
if(!ind) if(!ind)
. += "\[...\]<br><br>" out += "\[...\]<br><br>"
else else
. += "<br><br>" out += "<br><br>"
. += "</td><td><b>Preview</b><br>" out += "</td><td><b>Preview</b><br>"
. += "<div class='statusDisplay'><center><img src=previewicon.png width=[pref.preview_icon.Width()] height=[pref.preview_icon.Height()]></center></div>" out += "<div class='statusDisplay'><center><img src=previewicon.png width=[pref.preview_icon.Width()] height=[pref.preview_icon.Height()]></center></div>"
. += "<br><a href='?src=\ref[src];toggle_clothing=1'>[pref.dress_mob ? "Hide equipment" : "Show equipment"]</a>" out += "<br><a href='?src=\ref[src];toggle_clothing=1'>[pref.dress_mob ? "Hide equipment" : "Show equipment"]</a>"
. += "</td></tr></table>" out += "</td></tr></table>"
. += "<b>Hair</b><br>" out += "<b>Hair</b><br>"
if(has_flag(mob_species, HAS_HAIR_COLOR)) if(has_flag(mob_species, HAS_HAIR_COLOR))
. += "<a href='?src=\ref[src];hair_color=1'>Change Color</a> <font face='fixedsys' size='3' color='#[num2hex(pref.r_hair, 2)][num2hex(pref.g_hair, 2)][num2hex(pref.b_hair, 2)]'><table style='display:inline;' bgcolor='#[num2hex(pref.r_hair, 2)][num2hex(pref.g_hair, 2)][num2hex(pref.b_hair, 2)]'><tr><td>__</td></tr></table></font> " out += "<a href='?src=\ref[src];hair_color=1'>Change Color</a> [HTML_RECT(rgb(pref.r_hair, pref.g_hair, pref.b_hair))] "
. += " Style: <a href='?src=\ref[src];hair_style=1'>[pref.h_style]</a><br>" out += " Style: <a href='?src=\ref[src];hair_style=1'>[pref.h_style]</a><br>"
. += "<br><b>Facial</b><br>" out += "<br><b>Facial</b><br>"
if(has_flag(mob_species, HAS_HAIR_COLOR)) if(has_flag(mob_species, HAS_HAIR_COLOR))
. += "<a href='?src=\ref[src];facial_color=1'>Change Color</a> <font face='fixedsys' size='3' color='#[num2hex(pref.r_facial, 2)][num2hex(pref.g_facial, 2)][num2hex(pref.b_facial, 2)]'><table style='display:inline;' bgcolor='#[num2hex(pref.r_facial, 2)][num2hex(pref.g_facial, 2)][num2hex(pref.b_facial, 2)]'><tr><td>__</td></tr></table></font> " out += "<a href='?src=\ref[src];facial_color=1'>Change Color</a> [HTML_RECT(rgb(pref.r_facial, pref.g_facial, pref.b_facial))] "
. += " Style: <a href='?src=\ref[src];facial_style=1'>[pref.f_style]</a><br>" out += " Style: <a href='?src=\ref[src];facial_style=1'>[pref.f_style]</a><br>"
if(has_flag(mob_species, HAS_EYE_COLOR)) if(has_flag(mob_species, HAS_EYE_COLOR))
. += "<br><b>Eyes</b><br>" out += "<br><b>Eyes</b><br>"
. += "<a href='?src=\ref[src];eye_color=1'>Change Color</a> <font face='fixedsys' size='3' color='#[num2hex(pref.r_eyes, 2)][num2hex(pref.g_eyes, 2)][num2hex(pref.b_eyes, 2)]'><table style='display:inline;' bgcolor='#[num2hex(pref.r_eyes, 2)][num2hex(pref.g_eyes, 2)][num2hex(pref.b_eyes, 2)]'><tr><td>__</td></tr></table></font><br>" out += "<a href='?src=\ref[src];eye_color=1'>Change Color</a> [HTML_RECT(rgb(pref.r_eyes, pref.g_eyes, pref.b_eyes))] <br>"
if(has_flag(mob_species, HAS_SKIN_COLOR)) if(has_flag(mob_species, HAS_SKIN_COLOR))
. += "<br><b>Body Color</b><br>" out += "<br><b>Body Color</b><br>"
. += "<a href='?src=\ref[src];skin_color=1'>Change Color</a> <font face='fixedsys' size='3' color='#[num2hex(pref.r_skin, 2)][num2hex(pref.g_skin, 2)][num2hex(pref.b_skin, 2)]'><table style='display:inline;' bgcolor='#[num2hex(pref.r_skin, 2)][num2hex(pref.g_skin, 2)][num2hex(pref.b_skin, 2)]'><tr><td>__</td></tr></table></font><br>" out += "<a href='?src=\ref[src];skin_color=1'>Change Color</a> [HTML_RECT(rgb(pref.r_skin, pref.g_skin, pref.b_skin))] <br>"
. += "<br><a href='?src=\ref[src];marking_style=1'>Body Markings +</a><br>" out += "<br><a href='?src=\ref[src];marking_style=1'>Body Markings +</a><br>"
for(var/M in pref.body_markings) for(var/M in pref.body_markings)
. += "[M] <a href='?src=\ref[src];marking_remove=[M]'>-</a> <a href='?src=\ref[src];marking_color=[M]'>Color</a>" out += "[M] <a href='?src=\ref[src];marking_remove=[M]'>-</a> <a href='?src=\ref[src];marking_color=[M]'>Color</a>"
. += "<font face='fixedsys' size='3' color='[pref.body_markings[M]]'><table style='display:inline;' bgcolor='[pref.body_markings[M]]'><tr><td>__</td></tr></table></font>" out += HTML_RECT(pref.body_markings[M])
. += "<br>" out += "<br>"
. = out.Join()
/datum/category_item/player_setup_item/general/body/proc/has_flag(var/datum/species/mob_species, var/flag) /datum/category_item/player_setup_item/general/body/proc/has_flag(var/datum/species/mob_species, var/flag)
return mob_species && (mob_species.appearance_flags & flag) return mob_species && (mob_species.appearance_flags & flag)
@@ -320,22 +334,26 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
if(prev_species != pref.species) if(prev_species != pref.species)
mob_species = all_species[pref.species] mob_species = all_species[pref.species]
var/bodytype = mob_species.get_bodytype()
//grab one of the valid hair styles for the newly chosen species //grab one of the valid hair styles for the newly chosen species
var/list/valid_hairstyles = list() var/list/valid_hairstyles = list()
for(var/hairstyle in hair_styles_list)
var/datum/sprite_accessory/S = hair_styles_list[hairstyle] // Snowflake check for industrials - they're an IPC bodytype but don't have IPC screens.
if(pref.gender == MALE && S.gender == FEMALE) if (mob_species.name != "Industrial Frame")
continue for(var/hairstyle in hair_styles_list)
if(pref.gender == FEMALE && S.gender == MALE) var/datum/sprite_accessory/S = hair_styles_list[hairstyle]
continue if(pref.gender == MALE && S.gender == FEMALE)
if(!(mob_species.get_bodytype() in S.species_allowed) || mob_species.name == "Industrial Frame") //super snowflake check because Industrial Frames are IPC bodytypes, but don't have an IPC head. continue
continue if(pref.gender == FEMALE && S.gender == MALE)
valid_hairstyles[hairstyle] = hair_styles_list[hairstyle] continue
if(!(bodytype in S.species_allowed))
continue
valid_hairstyles[hairstyle] = hair_styles_list[hairstyle]
if(valid_hairstyles.len) if(valid_hairstyles.len)
pref.h_style = pick(valid_hairstyles) pref.h_style = pick(valid_hairstyles)
else else // Species has no hair, or something fucked up.
//this shouldn't happen
pref.h_style = hair_styles_list["Bald"] pref.h_style = hair_styles_list["Bald"]
//grab one of the valid facial hair styles for the newly chosen species //grab one of the valid facial hair styles for the newly chosen species
@@ -346,7 +364,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
continue continue
if(pref.gender == FEMALE && S.gender == MALE) if(pref.gender == FEMALE && S.gender == MALE)
continue continue
if(!(mob_species.get_bodytype() in S.species_allowed)) if(!(bodytype in S.species_allowed))
continue continue
valid_facialhairstyles[facialhairstyle] = facial_hair_styles_list[facialhairstyle] valid_facialhairstyles[facialhairstyle] = facial_hair_styles_list[facialhairstyle]
@@ -374,18 +392,19 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
return TOPIC_NOACTION return TOPIC_NOACTION
var/new_hair = input(user, "Choose your character's hair colour:", "Character Preference", rgb(pref.r_hair, pref.g_hair, pref.b_hair)) as color|null var/new_hair = input(user, "Choose your character's hair colour:", "Character Preference", rgb(pref.r_hair, pref.g_hair, pref.b_hair)) as color|null
if(new_hair && has_flag(mob_species, HAS_HAIR_COLOR) && CanUseTopic(user)) if(new_hair && has_flag(mob_species, HAS_HAIR_COLOR) && CanUseTopic(user))
pref.r_hair = hex2num(copytext(new_hair, 2, 4)) pref.r_hair = GetRedPart(new_hair)
pref.g_hair = hex2num(copytext(new_hair, 4, 6)) pref.g_hair = GetGreenPart(new_hair)
pref.b_hair = hex2num(copytext(new_hair, 6, 8)) pref.b_hair = GetBluePart(new_hair)
return TOPIC_REFRESH return TOPIC_REFRESH
else if(href_list["hair_style"]) else if(href_list["hair_style"])
if(mob_species.bald) if(mob_species.bald)
return return
var/bodytype = mob_species.get_bodytype()
var/list/valid_hairstyles = list() var/list/valid_hairstyles = list()
for(var/hairstyle in hair_styles_list) for(var/hairstyle in hair_styles_list)
var/datum/sprite_accessory/S = hair_styles_list[hairstyle] var/datum/sprite_accessory/S = hair_styles_list[hairstyle]
if(!(mob_species.get_bodytype() in S.species_allowed)) if(!(bodytype in S.species_allowed))
continue continue
valid_hairstyles[hairstyle] = hair_styles_list[hairstyle] valid_hairstyles[hairstyle] = hair_styles_list[hairstyle]
@@ -400,9 +419,9 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
return TOPIC_NOACTION return TOPIC_NOACTION
var/new_facial = input(user, "Choose your character's facial-hair colour:", "Character Preference", rgb(pref.r_facial, pref.g_facial, pref.b_facial)) as color|null var/new_facial = input(user, "Choose your character's facial-hair colour:", "Character Preference", rgb(pref.r_facial, pref.g_facial, pref.b_facial)) as color|null
if(new_facial && has_flag(mob_species, HAS_HAIR_COLOR) && CanUseTopic(user)) if(new_facial && has_flag(mob_species, HAS_HAIR_COLOR) && CanUseTopic(user))
pref.r_facial = hex2num(copytext(new_facial, 2, 4)) pref.r_facial = GetRedPart(new_facial)
pref.g_facial = hex2num(copytext(new_facial, 4, 6)) pref.g_facial = GetGreenPart(new_facial)
pref.b_facial = hex2num(copytext(new_facial, 6, 8)) pref.b_facial = GetBluePart(new_facial)
return TOPIC_REFRESH return TOPIC_REFRESH
else if(href_list["eye_color"]) else if(href_list["eye_color"])
@@ -410,9 +429,9 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
return TOPIC_NOACTION return TOPIC_NOACTION
var/new_eyes = input(user, "Choose your character's eye colour:", "Character Preference", rgb(pref.r_eyes, pref.g_eyes, pref.b_eyes)) as color|null var/new_eyes = input(user, "Choose your character's eye colour:", "Character Preference", rgb(pref.r_eyes, pref.g_eyes, pref.b_eyes)) as color|null
if(new_eyes && has_flag(mob_species, HAS_EYE_COLOR) && CanUseTopic(user)) if(new_eyes && has_flag(mob_species, HAS_EYE_COLOR) && CanUseTopic(user))
pref.r_eyes = hex2num(copytext(new_eyes, 2, 4)) pref.r_eyes = GetRedPart(new_eyes)
pref.g_eyes = hex2num(copytext(new_eyes, 4, 6)) pref.g_eyes = GetGreenPart(new_eyes)
pref.b_eyes = hex2num(copytext(new_eyes, 6, 8)) pref.b_eyes = GetRedPart(new_eyes)
return TOPIC_REFRESH return TOPIC_REFRESH
else if(href_list["skin_tone"]) else if(href_list["skin_tone"])
@@ -428,22 +447,23 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
return TOPIC_NOACTION return TOPIC_NOACTION
var/new_skin = input(user, "Choose your character's skin colour: ", "Character Preference", rgb(pref.r_skin, pref.g_skin, pref.b_skin)) as color|null var/new_skin = input(user, "Choose your character's skin colour: ", "Character Preference", rgb(pref.r_skin, pref.g_skin, pref.b_skin)) as color|null
if(new_skin && has_flag(mob_species, HAS_SKIN_COLOR) && CanUseTopic(user)) if(new_skin && has_flag(mob_species, HAS_SKIN_COLOR) && CanUseTopic(user))
pref.r_skin = hex2num(copytext(new_skin, 2, 4)) pref.r_skin = GetRedPart(new_skin)
pref.g_skin = hex2num(copytext(new_skin, 4, 6)) pref.g_skin = GetGreenPart(new_skin)
pref.b_skin = hex2num(copytext(new_skin, 6, 8)) pref.b_skin = GetBluePart(new_skin)
return TOPIC_REFRESH return TOPIC_REFRESH
else if(href_list["facial_style"]) else if(href_list["facial_style"])
if(mob_species.bald) if(mob_species.bald)
return return
var/list/valid_facialhairstyles = list() var/list/valid_facialhairstyles = list()
var/bodytype = mob_species.get_bodytype()
for(var/facialhairstyle in facial_hair_styles_list) for(var/facialhairstyle in facial_hair_styles_list)
var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle] var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle]
if(pref.gender == MALE && S.gender == FEMALE) if(pref.gender == MALE && S.gender == FEMALE)
continue continue
if(pref.gender == FEMALE && S.gender == MALE) if(pref.gender == FEMALE && S.gender == MALE)
continue continue
if(!(mob_species.get_bodytype() in S.species_allowed)) if(!(bodytype in S.species_allowed))
continue continue
valid_facialhairstyles[facialhairstyle] = facial_hair_styles_list[facialhairstyle] valid_facialhairstyles[facialhairstyle] = facial_hair_styles_list[facialhairstyle]
@@ -454,7 +474,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
return TOPIC_REFRESH return TOPIC_REFRESH
else if(href_list["marking_style"]) else if(href_list["marking_style"])
var/list/usable_markings = pref.body_markings.Copy() ^ body_marking_styles_list.Copy() var/list/usable_markings = pref.body_markings ^ body_marking_styles_list
for(var/M in usable_markings) for(var/M in usable_markings)
var/datum/sprite_accessory/S = usable_markings[M] var/datum/sprite_accessory/S = usable_markings[M]
if(!S.species_allowed.len) if(!S.species_allowed.len)
@@ -616,15 +636,19 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
if(!pref.species_preview || !(pref.species_preview in all_species)) if(!pref.species_preview || !(pref.species_preview in all_species))
pref.species_preview = "Human" pref.species_preview = "Human"
var/datum/species/current_species = all_species[pref.species_preview] var/datum/species/current_species = all_species[pref.species_preview]
var/dat = "<body>" var/list/dat = list(
dat += "<center><h2>[current_species.name] \[<a href='?src=\ref[src];show_species=1'>change</a>\]</h2></center><hr/>" "<body>",
dat += "<table padding='8px'>" "<center><h2>[current_species.name] \[<a href='?src=\ref[src];show_species=1'>change</a>\]</h2></center><hr/>",
dat += "<tr>" "<table padding='8px'>",
dat += "<td width = 400>[current_species.blurb]</td>" "<tr>",
dat += "<td width = 200 align='center'>" "<td width = 400>[current_species.blurb]</td>",
"<td width = 200 align='center'>"
)
if("preview" in icon_states(current_species.icobase)) if("preview" in icon_states(current_species.icobase))
var/curr_name = html_encode(current_species.name) var/curr_name = html_encode(current_species.name)
usr << browse_rsc(icon(current_species.icobase,"preview"), "species_preview_[curr_name].png") var/icon/preview = icon(current_species.icobase, "preview")
preview.Scale(64, 64) // Scale it here to stop it blurring.
usr << browse_rsc(preview, "species_preview_[curr_name].png")
dat += "<img src='species_preview_[curr_name].png' width='64px' height='64px'><br/><br/>" dat += "<img src='species_preview_[curr_name].png' width='64px' height='64px'><br/><br/>"
dat += "<b>Language:</b> [current_species.language]<br/>" dat += "<b>Language:</b> [current_species.language]<br/>"
dat += "<small>" dat += "<small>"
@@ -667,12 +691,12 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
if(restricted == 1) if(restricted == 1)
dat += "<font color='red'><b>You cannot play as this species.</br><small>If you wish to be whitelisted, you can make an application post on <a href='?src=\ref[user];preference=open_whitelist_forum'>the forums</a>.</small></b></font></br>" dat += "<font color='red'><b>You cannot play as this species.</br><small>If you wish to be whitelisted, you can make an application post on <a href='?src=\ref[user];preference=open_whitelist_forum'>the forums</a>.</small></b></font></br>"
else if(restricted == 2) else if(restricted == 2)
dat += "<font color='red'><b>You cannot play as this species.</br><small>This species is not available for play as a station race..</small></b></font></br>" dat += "<font color='red'><b>You cannot play as this species.</br><small>This species is not available for play as a station race.</small></b></font></br>"
if(!restricted || check_rights(R_ADMIN, 0)) if(!restricted || check_rights(R_ADMIN, 0))
dat += "\[<a href='?src=\ref[src];set_species=[html_encode(pref.species_preview)]'>select</a>\]" dat += "\[<a href='?src=\ref[src];set_species=[html_encode(pref.species_preview)]'>select</a>\]"
dat += "</center></body>" dat += "</center></body>"
user << browse(dat, "window=species;size=700x400") user << browse(dat.Join(), "window=species;size=700x400")
/*/datum/category_item/player_setup_item/general/body/proc/reset_limbs() /*/datum/category_item/player_setup_item/general/body/proc/reset_limbs()

View File

@@ -3,28 +3,54 @@
sort_order = 4 sort_order = 4
/datum/category_item/player_setup_item/general/equipment/load_character(var/savefile/S) /datum/category_item/player_setup_item/general/equipment/load_character(var/savefile/S)
S["underwear"] >> pref.underwear S["underwear"] >> pref.underwear
S["undershirt"] >> pref.undershirt S["undershirt"] >> pref.undershirt
S["socks"] >> pref.socks S["socks"] >> pref.socks
S["backbag"] >> pref.backbag S["backbag"] >> pref.backbag
/datum/category_item/player_setup_item/general/equipment/save_character(var/savefile/S) /datum/category_item/player_setup_item/general/equipment/save_character(var/savefile/S)
S["underwear"] << pref.underwear S["underwear"] << pref.underwear
S["undershirt"] << pref.undershirt S["undershirt"] << pref.undershirt
S["socks"] << pref.socks S["socks"] << pref.socks
S["backbag"] << pref.backbag S["backbag"] << pref.backbag
/datum/category_item/player_setup_item/general/equipment/gather_load_query() /datum/category_item/player_setup_item/general/equipment/gather_load_query()
return list("ss13_characters" = list("vars" = list("underwear", "undershirt", "socks", "backbag"), "args" = list("id"))) return list(
"ss13_characters" = list(
"vars" = list(
"underwear",
"undershirt",
"socks",
"backbag"
),
"args" = list("id")
)
)
/datum/category_item/player_setup_item/general/equipment/gather_load_parameters() /datum/category_item/player_setup_item/general/equipment/gather_load_parameters()
return list("id" = pref.current_character) return list("id" = pref.current_character)
/datum/category_item/player_setup_item/general/equipment/gather_save_query() /datum/category_item/player_setup_item/general/equipment/gather_save_query()
return list("ss13_characters" = list("underwear", "undershirt", "socks", "backbag", "id" = 1, "ckey" = 1)) return list(
"ss13_characters" = list(
"underwear",
"undershirt",
"socks",
"backbag",
"id" = 1,
"ckey" = 1
)
)
/datum/category_item/player_setup_item/general/equipment/gather_save_parameters() /datum/category_item/player_setup_item/general/equipment/gather_save_parameters()
return list("underwear" = pref.underwear, "undershirt" = pref.undershirt, "socks" = pref.socks, "backbag" = pref.backbag, "id" = pref.current_character, "ckey" = pref.client.ckey) return list(
"underwear" = pref.underwear,
"undershirt" = pref.undershirt,
"socks" = pref.socks,
"backbag" = pref.backbag,
"id" = pref.current_character,
"ckey" = pref.client.ckey
)
/datum/category_item/player_setup_item/general/equipment/sanitize_character(var/sql_load = 0) /datum/category_item/player_setup_item/general/equipment/sanitize_character(var/sql_load = 0)
if (sql_load) if (sql_load)
@@ -42,11 +68,14 @@
pref.socks = null pref.socks = null
/datum/category_item/player_setup_item/general/equipment/content() /datum/category_item/player_setup_item/general/equipment/content()
. += "<b>Equipment:</b><br>" var/list/dat = list()
. += "Underwear: <a href='?src=\ref[src];change_underwear=1'><b>[get_key_by_value(get_undies(),pref.underwear)]</b></a><br>" dat += "<b>Equipment:</b><br>"
. += "Undershirt: <a href='?src=\ref[src];change_undershirt=1'><b>[get_key_by_value(undershirt_t,pref.undershirt)]</b></a><br>" dat += "Underwear: <a href='?src=\ref[src];change_underwear=1'><b>[get_key_by_value(get_undies(),pref.underwear)]</b></a><br>"
. += "Socks: <a href='?src=\ref[src];change_socks=1'><b>[get_key_by_value(get_gender_socks(),pref.socks)]</b></a><br>" dat += "Undershirt: <a href='?src=\ref[src];change_undershirt=1'><b>[get_key_by_value(undershirt_t,pref.undershirt)]</b></a><br>"
. += "Backpack Type: <a href='?src=\ref[src];change_backpack=1'><b>[backbaglist[pref.backbag]]</b></a><br>" dat += "Socks: <a href='?src=\ref[src];change_socks=1'><b>[get_key_by_value(get_gender_socks(),pref.socks)]</b></a><br>"
dat += "Backpack Type: <a href='?src=\ref[src];change_backpack=1'><b>[backbaglist[pref.backbag]]</b></a><br>"
. = dat.Join()
/datum/category_item/player_setup_item/general/equipment/proc/get_undies() /datum/category_item/player_setup_item/general/equipment/proc/get_undies()
return pref.gender == MALE ? underwear_m : underwear_f return pref.gender == MALE ? underwear_m : underwear_f

View File

@@ -3,55 +3,86 @@
sort_order = 5 sort_order = 5
/datum/category_item/player_setup_item/general/background/load_character(var/savefile/S) /datum/category_item/player_setup_item/general/background/load_character(var/savefile/S)
S["med_record"] >> pref.med_record S["med_record"] >> pref.med_record
S["sec_record"] >> pref.sec_record S["sec_record"] >> pref.sec_record
S["gen_record"] >> pref.gen_record S["gen_record"] >> pref.gen_record
S["home_system"] >> pref.home_system S["home_system"] >> pref.home_system
S["citizenship"] >> pref.citizenship S["citizenship"] >> pref.citizenship
S["faction"] >> pref.faction S["faction"] >> pref.faction
S["religion"] >> pref.religion S["religion"] >> pref.religion
S["nanotrasen_relation"] >> pref.nanotrasen_relation S["nanotrasen_relation"] >> pref.nanotrasen_relation
/datum/category_item/player_setup_item/general/background/save_character(var/savefile/S) /datum/category_item/player_setup_item/general/background/save_character(var/savefile/S)
S["med_record"] << pref.med_record S["med_record"] << pref.med_record
S["sec_record"] << pref.sec_record S["sec_record"] << pref.sec_record
S["gen_record"] << pref.gen_record S["gen_record"] << pref.gen_record
S["home_system"] << pref.home_system S["home_system"] << pref.home_system
S["citizenship"] << pref.citizenship S["citizenship"] << pref.citizenship
S["faction"] << pref.faction S["faction"] << pref.faction
S["religion"] << pref.religion S["religion"] << pref.religion
S["nanotrasen_relation"] << pref.nanotrasen_relation S["nanotrasen_relation"] << pref.nanotrasen_relation
/datum/category_item/player_setup_item/general/background/gather_load_query() /datum/category_item/player_setup_item/general/background/gather_load_query()
return list("ss13_characters_flavour" = list("vars" = list("records_employment" = "gen_record", return list(
"records_medical" = "med_record", "ss13_characters_flavour" = list(
"records_security" = "sec_record", "vars" = list(
"records_ccia" = "ccia_record"), "records_employment" = "gen_record",
"args" = list("char_id")), "records_medical" = "med_record",
"ss13_characters" = list("vars" = list("nt_relation" = "nanotrasen_relation" ,"home_system", "citizenship", "faction", "religion"), "args" = list("id"))) "records_security" = "sec_record",
"records_ccia" = "ccia_record"
),
"args" = list("char_id")
),
"ss13_characters" = list(
"vars" = list(
"nt_relation" = "nanotrasen_relation",
"home_system",
"citizenship",
"faction",
"religion"
),
"args" = list("id")
)
)
/datum/category_item/player_setup_item/general/background/gather_load_parameters() /datum/category_item/player_setup_item/general/background/gather_load_parameters()
return list("id" = pref.current_character, "char_id" = pref.current_character) return list(
"id" = pref.current_character,
"char_id" = pref.current_character
)
/datum/category_item/player_setup_item/general/background/gather_save_query() /datum/category_item/player_setup_item/general/background/gather_save_query()
return list("ss13_characters_flavour" = list("records_employment", return list(
"records_medical", "ss13_characters_flavour" = list(
"records_security", "records_employment",
"char_id" = 1), "records_medical",
"ss13_characters" = list("nt_relation", "home_system", "citizenship", "faction", "religion", "id" = 1, "ckey" = 1)) "records_security",
"char_id" = 1
),
"ss13_characters" = list(
"nt_relation",
"home_system",
"citizenship",
"faction",
"religion","id" = 1,
"ckey" = 1
)
)
/datum/category_item/player_setup_item/general/background/gather_save_parameters() /datum/category_item/player_setup_item/general/background/gather_save_parameters()
return list("records_employment" = pref.gen_record, return list(
"records_medical" = pref.med_record, "records_employment" = pref.gen_record,
"records_security" = pref.sec_record, "records_medical" = pref.med_record,
"char_id" = pref.current_character, "records_security" = pref.sec_record,
"nt_relation" = pref.nanotrasen_relation, "char_id" = pref.current_character,
"home_system" = pref.home_system, "nt_relation" = pref.nanotrasen_relation,
"citizenship" = pref.citizenship, "home_system" = pref.home_system,
"faction" = pref.faction, "citizenship" = pref.citizenship,
"religion" = pref.religion, "faction" = pref.faction,
"id" = pref.current_character, "religion" = pref.religion,
"ckey" = pref.client.ckey) "id" = pref.current_character,
"ckey" = pref.client.ckey
)
/datum/category_item/player_setup_item/general/background/sanitize_character() /datum/category_item/player_setup_item/general/background/sanitize_character()
if(!pref.home_system) if(!pref.home_system)
@@ -66,23 +97,27 @@
pref.nanotrasen_relation = sanitize_inlist(pref.nanotrasen_relation, COMPANY_ALIGNMENTS, initial(pref.nanotrasen_relation)) pref.nanotrasen_relation = sanitize_inlist(pref.nanotrasen_relation, COMPANY_ALIGNMENTS, initial(pref.nanotrasen_relation))
/datum/category_item/player_setup_item/general/background/content(var/mob/user) /datum/category_item/player_setup_item/general/background/content(var/mob/user)
. += "<b>Background Information</b><br>" var/list/dat = list(
. += "[company_name] Relation: <a href='?src=\ref[src];nt_relation=1'>[pref.nanotrasen_relation]</a><br/>" "<b>Background Information</b><br>",
. += "Home System: <a href='?src=\ref[src];home_system=1'>[pref.home_system]</a><br/>" "[company_name] Relation: <a href='?src=\ref[src];nt_relation=1'>[pref.nanotrasen_relation]</a><br/>",
. += "Citizenship: <a href='?src=\ref[src];citizenship=1'>[pref.citizenship]</a><br/>" "Home System: <a href='?src=\ref[src];home_system=1'>[pref.home_system]</a><br/>",
. += "Faction: <a href='?src=\ref[src];faction=1'>[pref.faction]</a><br/>" "Citizenship: <a href='?src=\ref[src];citizenship=1'>[pref.citizenship]</a><br/>",
. += "Religion: <a href='?src=\ref[src];religion=1'>[pref.religion]</a><br/>" "Faction: <a href='?src=\ref[src];faction=1'>[pref.faction]</a><br/>",
"Religion: <a href='?src=\ref[src];religion=1'>[pref.religion]</a><br/>",
"<br/><b>Records</b>:<br/>"
)
. += "<br/><b>Records</b>:<br/>"
if(jobban_isbanned(user, "Records")) if(jobban_isbanned(user, "Records"))
. += "<span class='danger'>You are banned from using character records.</span><br>" dat += "<span class='danger'>You are banned from using character records.</span><br>"
else else
. += "Medical Records:<br>" dat += "Medical Records:<br>"
. += "<a href='?src=\ref[src];set_medical_records=1'>[TextPreview(pref.med_record,40)]</a><br><br>" dat += "<a href='?src=\ref[src];set_medical_records=1'>[TextPreview(pref.med_record,40)]</a><br><br>"
. += "Employment Records:<br>" dat += "Employment Records:<br>"
. += "<a href='?src=\ref[src];set_general_records=1'>[TextPreview(pref.gen_record,40)]</a><br><br>" dat += "<a href='?src=\ref[src];set_general_records=1'>[TextPreview(pref.gen_record,40)]</a><br><br>"
. += "Security Records:<br>" dat += "Security Records:<br>"
. += "<a href='?src=\ref[src];set_security_records=1'>[TextPreview(pref.sec_record,40)]</a><br>" dat += "<a href='?src=\ref[src];set_security_records=1'>[TextPreview(pref.sec_record,40)]</a><br>"
. = dat.Join()
/datum/category_item/player_setup_item/general/background/OnTopic(var/href,var/list/href_list, var/mob/user) /datum/category_item/player_setup_item/general/background/OnTopic(var/href,var/list/href_list, var/mob/user)
if(href_list["nt_relation"]) if(href_list["nt_relation"])

View File

@@ -3,78 +3,87 @@
sort_order = 6 sort_order = 6
/datum/category_item/player_setup_item/general/flavor/load_character(var/savefile/S) /datum/category_item/player_setup_item/general/flavor/load_character(var/savefile/S)
S["flavor_texts_general"] >> pref.flavor_texts["general"] S["flavor_texts_general"] >> pref.flavor_texts["general"]
S["flavor_texts_head"] >> pref.flavor_texts["head"] S["flavor_texts_head"] >> pref.flavor_texts["head"]
S["flavor_texts_face"] >> pref.flavor_texts["face"] S["flavor_texts_face"] >> pref.flavor_texts["face"]
S["flavor_texts_eyes"] >> pref.flavor_texts["eyes"] S["flavor_texts_eyes"] >> pref.flavor_texts["eyes"]
S["flavor_texts_torso"] >> pref.flavor_texts["torso"] S["flavor_texts_torso"] >> pref.flavor_texts["torso"]
S["flavor_texts_arms"] >> pref.flavor_texts["arms"] S["flavor_texts_arms"] >> pref.flavor_texts["arms"]
S["flavor_texts_hands"] >> pref.flavor_texts["hands"] S["flavor_texts_hands"] >> pref.flavor_texts["hands"]
S["flavor_texts_legs"] >> pref.flavor_texts["legs"] S["flavor_texts_legs"] >> pref.flavor_texts["legs"]
S["flavor_texts_feet"] >> pref.flavor_texts["feet"] S["flavor_texts_feet"] >> pref.flavor_texts["feet"]
//Flavour text for robots. //Flavour text for robots.
S["flavour_texts_robot_Default"] >> pref.flavour_texts_robot["Default"] S["flavour_texts_robot_Default"] >> pref.flavour_texts_robot["Default"]
for(var/module in robot_module_types) for(var/module in robot_module_types)
S["flavour_texts_robot_[module]"] >> pref.flavour_texts_robot[module] S["flavour_texts_robot_[module]"] >> pref.flavour_texts_robot[module]
S["signature"] >> pref.signature S["signature"] >> pref.signature
S["signfont"] >> pref.signfont S["signfont"] >> pref.signfont
/datum/category_item/player_setup_item/general/flavor/save_character(var/savefile/S) /datum/category_item/player_setup_item/general/flavor/save_character(var/savefile/S)
S["flavor_texts_general"] << pref.flavor_texts["general"] S["flavor_texts_general"] << pref.flavor_texts["general"]
S["flavor_texts_head"] << pref.flavor_texts["head"] S["flavor_texts_head"] << pref.flavor_texts["head"]
S["flavor_texts_face"] << pref.flavor_texts["face"] S["flavor_texts_face"] << pref.flavor_texts["face"]
S["flavor_texts_eyes"] << pref.flavor_texts["eyes"] S["flavor_texts_eyes"] << pref.flavor_texts["eyes"]
S["flavor_texts_torso"] << pref.flavor_texts["torso"] S["flavor_texts_torso"] << pref.flavor_texts["torso"]
S["flavor_texts_arms"] << pref.flavor_texts["arms"] S["flavor_texts_arms"] << pref.flavor_texts["arms"]
S["flavor_texts_hands"] << pref.flavor_texts["hands"] S["flavor_texts_hands"] << pref.flavor_texts["hands"]
S["flavor_texts_legs"] << pref.flavor_texts["legs"] S["flavor_texts_legs"] << pref.flavor_texts["legs"]
S["flavor_texts_feet"] << pref.flavor_texts["feet"] S["flavor_texts_feet"] << pref.flavor_texts["feet"]
S["flavour_texts_robot_Default"] << pref.flavour_texts_robot["Default"] S["flavour_texts_robot_Default"] << pref.flavour_texts_robot["Default"]
for(var/module in robot_module_types) for(var/module in robot_module_types)
S["flavour_texts_robot_[module]"] << pref.flavour_texts_robot[module] S["flavour_texts_robot_[module]"] << pref.flavour_texts_robot[module]
S["signature"] << pref.signature S["signature"] << pref.signature
S["signfont"] << pref.signfont S["signfont"] << pref.signfont
/datum/category_item/player_setup_item/general/flavor/gather_load_query() /datum/category_item/player_setup_item/general/flavor/gather_load_query()
var/list/var_list = list("flavour_general" = "flavor_texts/general", var/list/var_list = list(
"flavour_head" = "flavor_texts/head", "flavour_general" = "flavor_texts/general",
"flavour_face" = "flavor_texts/face", "flavour_head" = "flavor_texts/head",
"flavour_eyes" = "flavor_texts/eyes", "flavour_face" = "flavor_texts/face",
"flavour_torso" = "flavor_texts/torso", "flavour_eyes" = "flavor_texts/eyes",
"flavour_arms" = "flavor_texts/arms", "flavour_torso" = "flavor_texts/torso",
"flavour_hands" = "flavor_texts/hands", "flavour_arms" = "flavor_texts/arms",
"flavour_legs" = "flavor_texts/legs", "flavour_hands" = "flavor_texts/hands",
"flavour_feet" = "flavor_texts/feet", "flavour_legs" = "flavor_texts/legs",
"robot_default" = "flavour_texts_robot/Default", "flavour_feet" = "flavor_texts/feet",
"signature" = "signature", "robot_default" = "flavour_texts_robot/Default",
"signature_font" = "signfont") "signature" = "signature",
"signature_font" = "signfont"
)
for (var/module in robot_module_types) for (var/module in robot_module_types)
var_list["robot_[module]"] = "flavour_texts_robot/[module]" var_list["robot_[module]"] = "flavour_texts_robot/[module]"
return list("ss13_characters_flavour" = list("vars" = var_list, "args" = list("char_id"))) return list(
"ss13_characters_flavour" = list(
"vars" = var_list,
"args" = list("char_id")
)
)
/datum/category_item/player_setup_item/general/flavor/gather_load_parameters() /datum/category_item/player_setup_item/general/flavor/gather_load_parameters()
return list("char_id" = pref.current_character) return list("char_id" = pref.current_character)
/datum/category_item/player_setup_item/general/flavor/gather_save_query() /datum/category_item/player_setup_item/general/flavor/gather_save_query()
var/list/var_list = list("flavour_general", var/list/var_list = list(
"flavour_head", "flavour_general",
"flavour_face", "flavour_head",
"flavour_eyes", "flavour_face",
"flavour_torso", "flavour_eyes",
"flavour_arms", "flavour_torso",
"flavour_hands", "flavour_arms",
"flavour_legs", "flavour_hands",
"flavour_feet", "flavour_legs",
"robot_default", "flavour_feet",
"signature", "robot_default",
"signature_font", "signature",
"char_id" = 1) "signature_font",
"char_id" = 1
)
for (var/module in robot_module_types) for (var/module in robot_module_types)
var_list += "robot_[module]" var_list += "robot_[module]"
@@ -82,19 +91,21 @@
return list("ss13_characters_flavour" = var_list) return list("ss13_characters_flavour" = var_list)
/datum/category_item/player_setup_item/general/flavor/gather_save_parameters() /datum/category_item/player_setup_item/general/flavor/gather_save_parameters()
var/list/var_list = list("char_id" = pref.current_character, var/list/var_list = list(
"flavour_general" = pref.flavor_texts["general"], "char_id" = pref.current_character,
"flavour_head" = pref.flavor_texts["head"], "flavour_general" = pref.flavor_texts["general"],
"flavour_face" = pref.flavor_texts["face"], "flavour_head" = pref.flavor_texts["head"],
"flavour_eyes" = pref.flavor_texts["eyes"], "flavour_face" = pref.flavor_texts["face"],
"flavour_torso" = pref.flavor_texts["torso"], "flavour_eyes" = pref.flavor_texts["eyes"],
"flavour_arms" = pref.flavor_texts["arms"], "flavour_torso" = pref.flavor_texts["torso"],
"flavour_hands" = pref.flavor_texts["hands"], "flavour_arms" = pref.flavor_texts["arms"],
"flavour_legs" = pref.flavor_texts["legs"], "flavour_hands" = pref.flavor_texts["hands"],
"flavour_feet" = pref.flavor_texts["feet"], "flavour_legs" = pref.flavor_texts["legs"],
"robot_default" = pref.flavour_texts_robot["Default"], "flavour_feet" = pref.flavor_texts["feet"],
"signature" = pref.signature, "robot_default" = pref.flavour_texts_robot["Default"],
"signature_font" = pref.signfont) "signature" = pref.signature,
"signature_font" = pref.signfont
)
for (var/module in robot_module_types) for (var/module in robot_module_types)
var_list["robot_[module]"] += pref.flavour_texts_robot[module] var_list["robot_[module]"] += pref.flavour_texts_robot[module]
@@ -108,15 +119,18 @@
pref.signfont = "Verdana" pref.signfont = "Verdana"
/datum/category_item/player_setup_item/general/flavor/content(var/mob/user) /datum/category_item/player_setup_item/general/flavor/content(var/mob/user)
. += "<b>Flavor:</b><br>" var/list/dat = list(
. += "<a href='?src=\ref[src];flavor_text=open'>Set Flavor Text</a><br/>" "<b>Flavor:</b><br>",
. += "<a href='?src=\ref[src];flavour_text_robot=open'>Set Robot Flavor Text</a><br/>" "<a href='?src=\ref[src];flavor_text=open'>Set Flavor Text</a><br/>",
. += "<br>" "<a href='?src=\ref[src];flavour_text_robot=open'>Set Robot Flavor Text</a><br/>",
. += "Signature: <font face='[pref.signfont ? pref.signfont : "Verdana"]'>[pref.signature]</font><br/>" "<br>",
. += "<a href='?src=\ref[src];edit_signature=text'>Edit Text</a> | " "Signature: <font face='[pref.signfont ? pref.signfont : "Verdana"]'>[pref.signature]</font><br/>",
. += "<a href='?src=\ref[src];edit_signature=font'>Edit Font</a> | " "<a href='?src=\ref[src];edit_signature=text'>Edit Text</a> | ",
. += "<a href='?src=\ref[src];edit_signature=help'>Help</a> | " "<a href='?src=\ref[src];edit_signature=font'>Edit Font</a> | ",
. += "<a href='?src=\ref[src];edit_signature=reset'>Reset</a><br/>" "<a href='?src=\ref[src];edit_signature=help'>Help</a> | ",
"<a href='?src=\ref[src];edit_signature=reset'>Reset</a><br/>"
)
. = dat.Join()
/datum/category_item/player_setup_item/general/flavor/OnTopic(var/href,var/list/href_list, var/mob/user) /datum/category_item/player_setup_item/general/flavor/OnTopic(var/href,var/list/href_list, var/mob/user)
if(href_list["flavor_text"]) if(href_list["flavor_text"])
@@ -178,11 +192,11 @@
if ("help") if ("help")
var/html = "" var/html = ""
html += "A character's signature can be augmented with the following tags:<br>" html += "A character's signature can be augmented with the following tags:<br>"
html += "<ul><li><i>Italics</i> - \[i\]text\[\\i\]</li>" html += "<ul><li><i>Italics</i> - \[i\]text\[/i\]</li>"
html += "<li><b>Bold</b> - \[b\]text\[\\b\]</li>" html += "<li><b>Bold</b> - \[b\]text\[/b\]</li>"
html += "<li><u>Underline</u> - \[u\]text\[\\u\]</li>" html += "<li><u>Underline</u> - \[u\]text\[/u\]</li>"
html += "<li><font size='4'>Large text</font> - \[large\]text\[\\large\]</li>" html += "<li><font size='4'>Large text</font> - \[large\]text\[/large\]</li>"
html += "<li><font size='1'>Small text</font> - \[small\]text\[\\small\]</li></ul>" html += "<li><font size='1'>Small text</font> - \[small\]text\[/small\]</li></ul>"
html += "<br><br>Beyond that, a maximum of 100 symbols are allowed for the signature text." html += "<br><br>Beyond that, a maximum of 100 symbols are allowed for the signature text."
html += " Note that this includes mark-up symbols." html += " Note that this includes mark-up symbols."

View File

@@ -3,47 +3,74 @@
sort_order = 1 sort_order = 1
/datum/category_item/player_setup_item/player_global/ui/load_preferences(var/savefile/S) /datum/category_item/player_setup_item/player_global/ui/load_preferences(var/savefile/S)
S["UI_style"] >> pref.UI_style S["UI_style"] >> pref.UI_style
S["UI_style_color"] >> pref.UI_style_color S["UI_style_color"] >> pref.UI_style_color
S["UI_style_alpha"] >> pref.UI_style_alpha S["UI_style_alpha"] >> pref.UI_style_alpha
S["ooccolor"] >> pref.ooccolor S["ooccolor"] >> pref.ooccolor
/datum/category_item/player_setup_item/player_global/ui/save_preferences(var/savefile/S) /datum/category_item/player_setup_item/player_global/ui/save_preferences(var/savefile/S)
S["UI_style"] << pref.UI_style S["UI_style"] << pref.UI_style
S["UI_style_color"] << pref.UI_style_color S["UI_style_color"] << pref.UI_style_color
S["UI_style_alpha"] << pref.UI_style_alpha S["UI_style_alpha"] << pref.UI_style_alpha
S["ooccolor"] << pref.ooccolor S["ooccolor"] << pref.ooccolor
/datum/category_item/player_setup_item/player_global/ui/gather_load_query() /datum/category_item/player_setup_item/player_global/ui/gather_load_query()
return list("ss13_player_preferences" = list("vars" = list("UI_style", "UI_style_color", "UI_style_alpha", "ooccolor"), "args" = list("ckey"))) return list(
"ss13_player_preferences" = list(
"vars" = list(
"UI_style",
"UI_style_color",
"UI_style_alpha",
"ooccolor"
),
"args" = list("ckey")
)
)
/datum/category_item/player_setup_item/player_global/ui/gather_load_parameters() /datum/category_item/player_setup_item/player_global/ui/gather_load_parameters()
return list("ckey" = pref.client.ckey) return list("ckey" = pref.client.ckey)
/datum/category_item/player_setup_item/player_global/ui/gather_save_query() /datum/category_item/player_setup_item/player_global/ui/gather_save_query()
return list("ss13_player_preferences" = list("UI_style", "UI_style_color", "UI_style_alpha", "ooccolor", "ckey" = 1)) return list(
"ss13_player_preferences" = list(
"UI_style",
"UI_style_color",
"UI_style_alpha",
"ooccolor",
"ckey" = 1
)
)
/datum/category_item/player_setup_item/player_global/ui/gather_save_parameters() /datum/category_item/player_setup_item/player_global/ui/gather_save_parameters()
return list("ckey" = pref.client.ckey, "UI_style_alpha" = pref.UI_style_alpha, "UI_style_color" = pref.UI_style_color, "UI_style" = pref.UI_style, "ooccolor" = pref.ooccolor) return list(
"ckey" = pref.client.ckey,
"UI_style_alpha" = pref.UI_style_alpha,
"UI_style_color" = pref.UI_style_color,
"UI_style" = pref.UI_style,
"ooccolor" = pref.ooccolor
)
/datum/category_item/player_setup_item/player_global/ui/sanitize_preferences() /datum/category_item/player_setup_item/player_global/ui/sanitize_preferences()
pref.UI_style = sanitize_inlist(pref.UI_style, all_ui_styles, initial(pref.UI_style)) pref.UI_style = sanitize_inlist(pref.UI_style, all_ui_styles, initial(pref.UI_style))
pref.UI_style_color = sanitize_hexcolor(pref.UI_style_color, initial(pref.UI_style_color)) pref.UI_style_color = sanitize_hexcolor(pref.UI_style_color, initial(pref.UI_style_color))
pref.UI_style_alpha = sanitize_integer(text2num(pref.UI_style_alpha), 0, 255, initial(pref.UI_style_alpha)) pref.UI_style_alpha = sanitize_integer(text2num(pref.UI_style_alpha), 0, 255, initial(pref.UI_style_alpha))
pref.ooccolor = sanitize_hexcolor(pref.ooccolor, initial(pref.ooccolor)) pref.ooccolor = sanitize_hexcolor(pref.ooccolor, initial(pref.ooccolor))
/datum/category_item/player_setup_item/player_global/ui/content(var/mob/user) /datum/category_item/player_setup_item/player_global/ui/content(mob/user)
. += "<b>UI Settings</b><br>" var/list/dat = list()
. += "<b>UI Style:</b> <a href='?src=\ref[src];select_style=1'><b>[pref.UI_style]</b></a><br>" dat += "<b>UI Settings</b><br>"
. += "<b>Custom UI</b> (recommended for White UI):<br>" dat += "<b>UI Style:</b> <a href='?src=\ref[src];select_style=1'><b>[pref.UI_style]</b></a><br>"
. += "-Color: <a href='?src=\ref[src];select_color=1'><b>[pref.UI_style_color]</b></a><3E><table style='display:inline;' bgcolor='[pref.UI_style_color]'><tr><td>__</td></tr></table><3E><a href='?src=\ref[src];reset=ui'>reset</a><br>" dat += "<b>Custom UI</b> (recommended for White UI):<br>"
. += "-Alpha(transparency): <a href='?src=\ref[src];select_alpha=1'><b>[pref.UI_style_alpha]</b></a><EFBFBD><a href='?src=\ref[src];reset=alpha'>reset</a><br>" dat += "-Color: <a href='?src=\ref[src];select_color=1'><b>[pref.UI_style_color]</b></a> [HTML_RECT(pref.UI_style_color)] - <a href='?src=\ref[src];reset=ui'>reset</a><br>"
dat += "-Alpha(transparency): <a href='?src=\ref[src];select_alpha=1'><b>[pref.UI_style_alpha]</b></a> - <a href='?src=\ref[src];reset=alpha'>reset</a><br>"
if(can_select_ooc_color(user)) if(can_select_ooc_color(user))
. += "<b>OOC Color:</b><EFBFBD>" dat += "<b>OOC Color:</b> "
if(pref.ooccolor == initial(pref.ooccolor)) if(pref.ooccolor == initial(pref.ooccolor))
. += "<a href='?src=\ref[src];select_ooc_color=1'><b>Using Default</b></a><br>" dat += "<a href='?src=\ref[src];select_ooc_color=1'><b>Using Default</b></a><br>"
else else
. += "<a href='?src=\ref[src];select_ooc_color=1'><b>[pref.ooccolor]</b></a> <table style='display:inline;' bgcolor='[pref.ooccolor]'><tr><td>__</td></tr></table><3E><a href='?src=\ref[src];reset=ooc'>reset</a><br>" dat += "<a href='?src=\ref[src];select_ooc_color=1'><b>[pref.ooccolor]</b></a> [HTML_RECT(pref.ooccolor)] - <a href='?src=\ref[src];reset=ooc'>reset</a><br>"
. = dat.Join()
/datum/category_item/player_setup_item/player_global/ui/OnTopic(var/href,var/list/href_list, var/mob/user) /datum/category_item/player_setup_item/player_global/ui/OnTopic(var/href,var/list/href_list, var/mob/user)
if(href_list["select_style"]) if(href_list["select_style"])

View File

@@ -3,68 +3,98 @@
sort_order = 2 sort_order = 2
/datum/category_item/player_setup_item/player_global/settings/load_preferences(var/savefile/S) /datum/category_item/player_setup_item/player_global/settings/load_preferences(var/savefile/S)
S["lastchangelog"] >> pref.lastchangelog S["lastchangelog"] >> pref.lastchangelog
S["default_slot"] >> pref.default_slot S["default_slot"] >> pref.default_slot
S["toggles"] >> pref.toggles S["toggles"] >> pref.toggles
S["asfx_togs"] >> pref.asfx_togs S["asfx_togs"] >> pref.asfx_togs
S["motd_hash"] >> pref.motd_hash S["motd_hash"] >> pref.motd_hash
S["memo_hash"] >> pref.memo_hash S["memo_hash"] >> pref.memo_hash
S["parallax_speed"] >> pref.parallax_speed S["parallax_speed"] >> pref.parallax_speed
S["parallax_toggles"] >> pref.parallax_togs S["parallax_toggles"] >> pref.parallax_togs
/datum/category_item/player_setup_item/player_global/settings/save_preferences(var/savefile/S) /datum/category_item/player_setup_item/player_global/settings/save_preferences(var/savefile/S)
S["lastchangelog"] << pref.lastchangelog S["lastchangelog"] << pref.lastchangelog
S["default_slot"] << pref.default_slot S["default_slot"] << pref.default_slot
S["toggles"] << pref.toggles S["toggles"] << pref.toggles
S["asfx_togs"] << pref.asfx_togs S["asfx_togs"] << pref.asfx_togs
S["motd_hash"] << pref.motd_hash S["motd_hash"] << pref.motd_hash
S["memo_hash"] << pref.memo_hash S["memo_hash"] << pref.memo_hash
S["parallax_speed"] << pref.parallax_speed S["parallax_speed"] << pref.parallax_speed
S["parallax_toggles"] << pref.parallax_togs S["parallax_toggles"] << pref.parallax_togs
/datum/category_item/player_setup_item/player_global/settings/gather_load_query() /datum/category_item/player_setup_item/player_global/settings/gather_load_query()
return list("ss13_player_preferences" = list("vars" = list("lastchangelog", "current_character", "toggles", "asfx_togs", "lastmotd" = "motd_hash", "lastmemo" = "memo_hash"), "args" = list("ckey"))) return list(
"ss13_player_preferences" = list(
"vars" = list(
"lastchangelog",
"current_character",
"toggles",
"asfx_togs",
"lastmotd" = "motd_hash",
"lastmemo" = "memo_hash"
),
"args" = list("ckey")
)
)
/datum/category_item/player_setup_item/player_global/settings/gather_load_parameters() /datum/category_item/player_setup_item/player_global/settings/gather_load_parameters()
return list("ckey" = pref.client.ckey) return list("ckey" = pref.client.ckey)
/datum/category_item/player_setup_item/player_global/settings/gather_save_query() /datum/category_item/player_setup_item/player_global/settings/gather_save_query()
return list("ss13_player_preferences" = list("lastchangelog", "current_character", "toggles", "asfx_togs", "lastmotd", "lastmemo", "ckey" = 1, "parallax_toggles", "parallax_speed")) return list(
"ss13_player_preferences" = list(
"lastchangelog",
"current_character",
"toggles",
"asfx_togs",
"lastmotd",
"lastmemo",
"ckey" = 1,
"parallax_toggles",
"parallax_speed"
)
)
/datum/category_item/player_setup_item/player_global/settings/gather_save_parameters() /datum/category_item/player_setup_item/player_global/settings/gather_save_parameters()
return list("ckey" = pref.client.ckey, return list(
"lastchangelog" = pref.lastchangelog, "ckey" = pref.client.ckey,
"current_character" = pref.current_character, "lastchangelog" = pref.lastchangelog,
"toggles" = pref.toggles, "current_character" = pref.current_character,
"asfx_togs" = pref.asfx_togs, "toggles" = pref.toggles,
"lastmotd" = pref.motd_hash, "asfx_togs" = pref.asfx_togs,
"lastmemo" = pref.memo_hash, "lastmotd" = pref.motd_hash,
"parallax_toggles" = pref.parallax_togs, "lastmemo" = pref.memo_hash,
"parallax_speed" = pref.parallax_speed) "parallax_toggles" = pref.parallax_togs,
"parallax_speed" = pref.parallax_speed
)
/datum/category_item/player_setup_item/player_global/settings/sanitize_preferences(var/sql_load = 0) /datum/category_item/player_setup_item/player_global/settings/sanitize_preferences(var/sql_load = 0)
if (sql_load) if (sql_load)
pref.current_character = text2num(pref.current_character) pref.current_character = text2num(pref.current_character)
pref.lastchangelog = sanitize_text(pref.lastchangelog, initial(pref.lastchangelog)) pref.lastchangelog = sanitize_text(pref.lastchangelog, initial(pref.lastchangelog))
pref.default_slot = sanitize_integer(text2num(pref.default_slot), 1, config.character_slots, initial(pref.default_slot)) pref.default_slot = sanitize_integer(text2num(pref.default_slot), 1, config.character_slots, initial(pref.default_slot))
pref.toggles = sanitize_integer(text2num(pref.toggles), 0, 65535, initial(pref.toggles)) pref.toggles = sanitize_integer(text2num(pref.toggles), 0, 65535, initial(pref.toggles))
pref.asfx_togs = sanitize_integer(text2num(pref.asfx_togs), 0, 65535, initial(pref.toggles)) pref.asfx_togs = sanitize_integer(text2num(pref.asfx_togs), 0, 65535, initial(pref.toggles))
pref.motd_hash = sanitize_text(pref.motd_hash, initial(pref.motd_hash)) pref.motd_hash = sanitize_text(pref.motd_hash, initial(pref.motd_hash))
pref.memo_hash = sanitize_text(pref.memo_hash, initial(pref.memo_hash)) pref.memo_hash = sanitize_text(pref.memo_hash, initial(pref.memo_hash))
pref.parallax_speed = sanitize_integer(text2num(pref.parallax_speed), 1, 10, initial(pref.parallax_speed)) pref.parallax_speed = sanitize_integer(text2num(pref.parallax_speed), 1, 10, initial(pref.parallax_speed))
pref.parallax_togs = sanitize_integer(text2num(pref.parallax_togs), 0, 65535, initial(pref.parallax_togs)) pref.parallax_togs = sanitize_integer(text2num(pref.parallax_togs), 0, 65535, initial(pref.parallax_togs))
/datum/category_item/player_setup_item/player_global/settings/content(var/mob/user) /datum/category_item/player_setup_item/player_global/settings/content(mob/user)
. += "<b>Play admin midis:</b> <a href='?src=\ref[src];toggle=[SOUND_MIDI]'><b>[(pref.toggles & SOUND_MIDI) ? "Yes" : "No"]</b></a><br>" var/list/dat = list(
. += "<b>Play lobby music:</b> <a href='?src=\ref[src];toggle=[SOUND_LOBBY]'><b>[(pref.toggles & SOUND_LOBBY) ? "Yes" : "No"]</b></a><br>" "<b>Play admin midis:</b> <a href='?src=\ref[src];toggle=[SOUND_MIDI]'><b>[(pref.toggles & SOUND_MIDI) ? "Yes" : "No"]</b></a><br>",
. += "<b>Ghost ears:</b> <a href='?src=\ref[src];toggle=[CHAT_GHOSTEARS]'><b>[(pref.toggles & CHAT_GHOSTEARS) ? "All Speech" : "Nearest Creatures"]</b></a><br>" "<b>Play lobby music:</b> <a href='?src=\ref[src];toggle=[SOUND_LOBBY]'><b>[(pref.toggles & SOUND_LOBBY) ? "Yes" : "No"]</b></a><br>",
. += "<b>Ghost sight:</b> <a href='?src=\ref[src];toggle=[CHAT_GHOSTSIGHT]'><b>[(pref.toggles & CHAT_GHOSTSIGHT) ? "All Emotes" : "Nearest Creatures"]</b></a><br>" "<b>Ghost ears:</b> <a href='?src=\ref[src];toggle=[CHAT_GHOSTEARS]'><b>[(pref.toggles & CHAT_GHOSTEARS) ? "All Speech" : "Nearest Creatures"]</b></a><br>",
. += "<b>Ghost radio:</b> <a href='?src=\ref[src];toggle=[CHAT_GHOSTRADIO]'><b>[(pref.toggles & CHAT_GHOSTRADIO) ? "All Chatter" : "Nearest Speakers"]</b></a><br>" "<b>Ghost sight:</b> <a href='?src=\ref[src];toggle=[CHAT_GHOSTSIGHT]'><b>[(pref.toggles & CHAT_GHOSTSIGHT) ? "All Emotes" : "Nearest Creatures"]</b></a><br>",
. += "<b>Space Parallax:</b> <a href='?src=\ref[src];paratoggle=[PARALLAX_SPACE]'><b>[(pref.parallax_togs & PARALLAX_SPACE) ? "Yes" : "No"]</b></a><br>" "<b>Ghost radio:</b> <a href='?src=\ref[src];toggle=[CHAT_GHOSTRADIO]'><b>[(pref.toggles & CHAT_GHOSTRADIO) ? "All Chatter" : "Nearest Speakers"]</b></a><br>",
. += "<b>Space Dust:</b> <a href='?src=\ref[src];paratoggle=[PARALLAX_DUST]'><b>[(pref.parallax_togs & PARALLAX_DUST) ? "Yes" : "No"]</b></a><br>" "<b>Space Parallax:</b> <a href='?src=\ref[src];paratoggle=[PARALLAX_SPACE]'><b>[(pref.parallax_togs & PARALLAX_SPACE) ? "Yes" : "No"]</b></a><br>",
. += "<b>Progress Bars:</b> <a href='?src=\ref[src];paratoggle=[PROGRESS_BARS]'><b>[(pref.parallax_togs & PROGRESS_BARS) ? "Yes" : "No"]</b></a><br>" "<b>Space Dust:</b> <a href='?src=\ref[src];paratoggle=[PARALLAX_DUST]'><b>[(pref.parallax_togs & PARALLAX_DUST) ? "Yes" : "No"]</b></a><br>",
. += "<b>Static Space:</b> <a href='?src=\ref[src];paratoggle=[PARALLAX_IS_STATIC]'><b>[(pref.parallax_togs & PARALLAX_IS_STATIC) ? "Yes" : "No"]</b></a><br>" "<b>Progress Bars:</b> <a href='?src=\ref[src];paratoggle=[PROGRESS_BARS]'><b>[(pref.parallax_togs & PROGRESS_BARS) ? "Yes" : "No"]</b></a><br>",
"<b>Static Space:</b> <a href='?src=\ref[src];paratoggle=[PARALLAX_IS_STATIC]'><b>[(pref.parallax_togs & PARALLAX_IS_STATIC) ? "Yes" : "No"]</b></a><br>"
)
. = dat.Join()
/datum/category_item/player_setup_item/player_global/settings/OnTopic(var/href,var/list/href_list, var/mob/user) /datum/category_item/player_setup_item/player_global/settings/OnTopic(var/href,var/list/href_list, var/mob/user)
if(href_list["toggle"]) if(href_list["toggle"])

View File

@@ -66,7 +66,7 @@
/datum/gear/accessory/white_vest /datum/gear/accessory/white_vest
display_name = "webbing, medical" display_name = "webbing, medical"
path = /obj/item/clothing/accessory/storage/white_vest path = /obj/item/clothing/accessory/storage/white_vest
allowed_roles = list("Chief Medical Officer", "Medical Doctor", "Chemist", "Geneticist", "Paramedic", "Nursing Intern") allowed_roles = list("Chief Medical Officer", "Medical Doctor", "Chemist", "Geneticist", "Paramedic", "Medical Resident")
/datum/gear/accessory/webbing /datum/gear/accessory/webbing
display_name = "webbing, simple" display_name = "webbing, simple"
@@ -86,7 +86,7 @@
/datum/gear/accessory/white_pouches /datum/gear/accessory/white_pouches
display_name = "drop pouches, medical" display_name = "drop pouches, medical"
path = /obj/item/clothing/accessory/storage/white_pouches path = /obj/item/clothing/accessory/storage/white_pouches
allowed_roles = list("Chief Medical Officer", "Medical Doctor", "Chemist","Geneticist", "Paramedic", "Nursing Intern") allowed_roles = list("Chief Medical Officer", "Medical Doctor", "Chemist","Geneticist", "Paramedic", "Medical Resident")
/datum/gear/accessory/pouches /datum/gear/accessory/pouches
display_name = "drop pouches, simple" display_name = "drop pouches, simple"

View File

@@ -46,7 +46,7 @@
/datum/gear/eyes/medical /datum/gear/eyes/medical
display_name = "medical HUD" display_name = "medical HUD"
path = /obj/item/clothing/glasses/hud/health path = /obj/item/clothing/glasses/hud/health
allowed_roles = list("Medical Doctor", "Chief Medical Officer", "Chemist", "Paramedic", "Geneticist", "Nursing Intern") allowed_roles = list("Medical Doctor", "Chief Medical Officer", "Chemist", "Paramedic", "Geneticist", "Medical Resident")
/datum/gear/eyes/shades /datum/gear/eyes/shades
display_name = "sunglasses, fat" display_name = "sunglasses, fat"

View File

@@ -154,7 +154,7 @@
/datum/gear/head/surgical /datum/gear/head/surgical
display_name = "surgical cap selection" display_name = "surgical cap selection"
path = /obj/item/clothing/head/surgery/blue path = /obj/item/clothing/head/surgery/blue
allowed_roles = list("Scientist", "Chief Medical Officer", "Medical Doctor", "Geneticist", "Chemist", "Paramedic", "Nursing Intern", "Xenobiologist", "Roboticist", "Research Director", "Forensic Technician") allowed_roles = list("Scientist", "Chief Medical Officer", "Medical Doctor", "Geneticist", "Chemist", "Paramedic", "Medical Resident", "Xenobiologist", "Roboticist", "Research Director", "Forensic Technician")
/datum/gear/head/surgical/New() /datum/gear/head/surgical/New()
..() ..()

View File

@@ -72,7 +72,7 @@
display_name = "surgical apron" display_name = "surgical apron"
path = /obj/item/clothing/suit/apron/surgery path = /obj/item/clothing/suit/apron/surgery
cost = 1 cost = 1
allowed_roles = list("Scientist", "Chief Medical Officer", "Medical Doctor", "Chemist", "Geneticist", "Paramedic", "Nursing Intern", "Xenobiologist", "Roboticist", "Research Director", "Forensic Technician") allowed_roles = list("Scientist", "Chief Medical Officer", "Medical Doctor", "Chemist", "Geneticist", "Paramedic", "Medical Resident", "Xenobiologist", "Roboticist", "Research Director", "Forensic Technician")
/datum/gear/suit/poncho /datum/gear/suit/poncho
display_name = "poncho selection" display_name = "poncho selection"
@@ -132,7 +132,7 @@
/datum/gear/suit/winter/medical /datum/gear/suit/winter/medical
display_name = "winter coat, medical" display_name = "winter coat, medical"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/medical path = /obj/item/clothing/suit/storage/hooded/wintercoat/medical
allowed_roles = list("Chief Medical Officer", "Medical Doctor", "Paramedic", "Nursing Intern", "Psychiatrist", "Chemist") allowed_roles = list("Chief Medical Officer", "Medical Doctor", "Paramedic", "Medical Resident", "Psychiatrist", "Chemist")
/datum/gear/suit/winter/engineering /datum/gear/suit/winter/engineering
display_name = "winter coat, engineering" display_name = "winter coat, engineering"

View File

@@ -82,7 +82,7 @@
/datum/gear/uniform/scrubs /datum/gear/uniform/scrubs
display_name = "scrubs selection" display_name = "scrubs selection"
path = /obj/item/clothing/under/rank/medical/black path = /obj/item/clothing/under/rank/medical/black
allowed_roles = list("Scientist","Chief Medical Officer", "Medical Doctor", "Chemist", "Geneticist", "Paramedic", "Nursing Intern", "Xenobiologist", "Roboticist", "Research Director", "Forensic Technician") allowed_roles = list("Scientist","Chief Medical Officer", "Medical Doctor", "Chemist", "Geneticist", "Paramedic", "Medical Resident", "Xenobiologist", "Roboticist", "Research Director", "Forensic Technician")
/datum/gear/uniform/scrubs/New() /datum/gear/uniform/scrubs/New()
..() ..()

View File

@@ -133,7 +133,7 @@
display_name = "PRA medical coat (Tajara)" display_name = "PRA medical coat (Tajara)"
path = /obj/item/clothing/suit/storage/toggle/labcoat/tajaran path = /obj/item/clothing/suit/storage/toggle/labcoat/tajaran
whitelisted = list("Tajara") whitelisted = list("Tajara")
allowed_roles = list("Chief Medical Officer", "Medical Doctor", "Chemist", "Geneticist", "Paramedic", "Nursing Intern") allowed_roles = list("Chief Medical Officer", "Medical Doctor", "Chemist", "Geneticist", "Paramedic", "Medical Resident")
sort_category = "Xenowear" sort_category = "Xenowear"
//other things //other things

View File

@@ -34,26 +34,51 @@
S["player_alt_titles"] << pref.player_alt_titles S["player_alt_titles"] << pref.player_alt_titles
/datum/category_item/player_setup_item/occupation/gather_load_query() /datum/category_item/player_setup_item/occupation/gather_load_query()
return list("ss13_characters" = list("vars" = list("jobs" = "unsanitized_jobs", "alternate_option", "alternate_titles" = "player_alt_titles"), "args" = list("id"))) return list(
"ss13_characters" = list(
"vars" = list(
"jobs" = "unsanitized_jobs",
"alternate_option",
"alternate_titles" = "player_alt_titles"
),
"args" = list("id")
)
)
/datum/category_item/player_setup_item/occupation/gather_load_parameters() /datum/category_item/player_setup_item/occupation/gather_load_parameters()
return list("id" = pref.current_character) return list("id" = pref.current_character)
/datum/category_item/player_setup_item/occupation/gather_save_query() /datum/category_item/player_setup_item/occupation/gather_save_query()
return list("ss13_characters" = list("jobs", "alternate_option", "alternate_titles", "id" = 1, "ckey" = 1)) return list(
"ss13_characters" = list(
"jobs",
"alternate_option",
"alternate_titles",
"id" = 1,
"ckey" = 1
)
)
/datum/category_item/player_setup_item/occupation/gather_save_parameters() /datum/category_item/player_setup_item/occupation/gather_save_parameters()
var/list/compiled_jobs = list("job_civilian_high" = pref.job_civilian_high, var/list/compiled_jobs = list(
"job_civilian_med" = pref.job_civilian_med, "job_civilian_high" = pref.job_civilian_high,
"job_civilian_low" = pref.job_civilian_low, "job_civilian_med" = pref.job_civilian_med,
"job_medsci_high" = pref.job_medsci_high, "job_civilian_low" = pref.job_civilian_low,
"job_medsci_med" = pref.job_medsci_med, "job_medsci_high" = pref.job_medsci_high,
"job_medsci_low" = pref.job_medsci_low, "job_medsci_med" = pref.job_medsci_med,
"job_engsec_high" = pref.job_engsec_high, "job_medsci_low" = pref.job_medsci_low,
"job_engsec_med" = pref.job_engsec_med, "job_engsec_high" = pref.job_engsec_high,
"job_engsec_low" = pref.job_engsec_low) "job_engsec_med" = pref.job_engsec_med,
"job_engsec_low" = pref.job_engsec_low
)
return list("jobs" = list2params(compiled_jobs), "alternate_option" = pref.alternate_option, "alternate_titles" = list2params(pref.player_alt_titles), "id" = pref.current_character, "ckey" = pref.client.ckey) return list(
"jobs" = list2params(compiled_jobs),
"alternate_option" = pref.alternate_option,
"alternate_titles" = list2params(pref.player_alt_titles),
"id" = pref.current_character,
"ckey" = pref.client.ckey
)
/datum/category_item/player_setup_item/occupation/sanitize_character(var/sql_load = 0) /datum/category_item/player_setup_item/occupation/sanitize_character(var/sql_load = 0)
if (sql_load) if (sql_load)
@@ -82,16 +107,16 @@
log_debug("LOADING: Bad job preference key: [preference].") log_debug("LOADING: Bad job preference key: [preference].")
log_debug(e.desc) log_debug(e.desc)
pref.alternate_option = sanitize_integer(text2num(pref.alternate_option), 0, 2, initial(pref.alternate_option)) pref.alternate_option = sanitize_integer(text2num(pref.alternate_option), 0, 2, initial(pref.alternate_option))
pref.job_civilian_high = sanitize_integer(text2num(pref.job_civilian_high), 0, 65535, initial(pref.job_civilian_high)) pref.job_civilian_high = sanitize_integer(text2num(pref.job_civilian_high), 0, 65535, initial(pref.job_civilian_high))
pref.job_civilian_med = sanitize_integer(text2num(pref.job_civilian_med), 0, 65535, initial(pref.job_civilian_med)) pref.job_civilian_med = sanitize_integer(text2num(pref.job_civilian_med), 0, 65535, initial(pref.job_civilian_med))
pref.job_civilian_low = sanitize_integer(text2num(pref.job_civilian_low), 0, 65535, initial(pref.job_civilian_low)) pref.job_civilian_low = sanitize_integer(text2num(pref.job_civilian_low), 0, 65535, initial(pref.job_civilian_low))
pref.job_medsci_high = sanitize_integer(text2num(pref.job_medsci_high), 0, 65535, initial(pref.job_medsci_high)) pref.job_medsci_high = sanitize_integer(text2num(pref.job_medsci_high), 0, 65535, initial(pref.job_medsci_high))
pref.job_medsci_med = sanitize_integer(text2num(pref.job_medsci_med), 0, 65535, initial(pref.job_medsci_med)) pref.job_medsci_med = sanitize_integer(text2num(pref.job_medsci_med), 0, 65535, initial(pref.job_medsci_med))
pref.job_medsci_low = sanitize_integer(text2num(pref.job_medsci_low), 0, 65535, initial(pref.job_medsci_low)) pref.job_medsci_low = sanitize_integer(text2num(pref.job_medsci_low), 0, 65535, initial(pref.job_medsci_low))
pref.job_engsec_high = sanitize_integer(text2num(pref.job_engsec_high), 0, 65535, initial(pref.job_engsec_high)) pref.job_engsec_high = sanitize_integer(text2num(pref.job_engsec_high), 0, 65535, initial(pref.job_engsec_high))
pref.job_engsec_med = sanitize_integer(text2num(pref.job_engsec_med), 0, 65535, initial(pref.job_engsec_med)) pref.job_engsec_med = sanitize_integer(text2num(pref.job_engsec_med), 0, 65535, initial(pref.job_engsec_med))
pref.job_engsec_low = sanitize_integer(text2num(pref.job_engsec_low), 0, 65535, initial(pref.job_engsec_low)) pref.job_engsec_low = sanitize_integer(text2num(pref.job_engsec_low), 0, 65535, initial(pref.job_engsec_low))
if (!pref.player_alt_titles) if (!pref.player_alt_titles)
pref.player_alt_titles = new() pref.player_alt_titles = new()
@@ -102,89 +127,91 @@
pref.player_alt_titles -= job.title pref.player_alt_titles -= job.title
/datum/category_item/player_setup_item/occupation/content(mob/user, limit = 16, list/splitJobs = list("Chief Medical Officer")) /datum/category_item/player_setup_item/occupation/content(mob/user, limit = 16, list/splitJobs = list("Chief Medical Officer"))
var/list/dat = list(
. += "<tt><center>" "<tt><center>",
. += "<b>Choose occupation chances</b><br>Unavailable occupations are crossed out.<br>" "<b>Choose occupation chances</b><br>Unavailable occupations are crossed out.<br>",
. += "<table width='100%' cellpadding='1' cellspacing='0'><tr><td width='20%'>" // Table within a table for alignment, also allows you to easily add more colomns. "<table width='100%' cellpadding='1' cellspacing='0'><tr><td width='20%'>", // Table within a table for alignment, also allows you to easily add more colomns.
. += "<table width='100%' cellpadding='1' cellspacing='0'>" "<table width='100%' cellpadding='1' cellspacing='0'>"
)
var/index = -1 var/index = -1
//The job before the current job. I only use this to get the previous jobs color when I'm filling in blank rows. //The job before the current job. I only use this to get the previous jobs color when I'm filling in blank rows.
var/datum/job/lastJob var/datum/job/lastJob
for(var/datum/job/job in SSjobs.occupations) for(var/datum/job/job in SSjobs.occupations)
index += 1 index += 1
if((index >= limit) || (job.title in splitJobs)) if((index >= limit) || (job.title in splitJobs))
if((index < limit) && (lastJob != null)) if((index < limit) && (lastJob != null))
//If the cells were broken up by a job in the splitJob list then it will fill in the rest of the cells with //If the cells were broken up by a job in the splitJob list then it will fill in the rest of the cells with
//the last job's selection color. Creating a rather nice effect. //the last job's selection color. Creating a rather nice effect.
for(var/i = 0, i < (limit - index), i += 1) for(var/i = 0, i < (limit - index), i += 1)
. += "<tr bgcolor='[lastJob.selection_color]'><td width='60%' align='right'><a>&nbsp</a></td><td><a>&nbsp</a></td></tr>" dat += "<tr bgcolor='[lastJob.selection_color]'><td width='60%' align='right'><a>&nbsp</a></td><td><a>&nbsp</a></td></tr>"
. += "</table></td><td width='20%'><table width='100%' cellpadding='1' cellspacing='0'>" dat += "</table></td><td width='20%'><table width='100%' cellpadding='1' cellspacing='0'>"
index = 0 index = 0
. += "<tr bgcolor='[job.selection_color]'><td width='60%' align='right'>" dat += "<tr bgcolor='[job.selection_color]'><td width='60%' align='right'>"
var/rank = job.title var/rank = job.title
lastJob = job lastJob = job
var/ban_reason = jobban_isbanned(user, rank) var/ban_reason = jobban_isbanned(user, rank)
if(ban_reason == "WHITELISTED") if(ban_reason == "WHITELISTED")
. += "<del>[rank]</del></td><td><b> \[WHITELISTED]</b></td></tr>" dat += "<del>[rank]</del></td><td><b> \[WHITELISTED]</b></td></tr>"
continue continue
else if (ban_reason == "AGE WHITELISTED") else if (ban_reason == "AGE WHITELISTED")
var/available_in_days = player_old_enough_for_role(user.client, rank) var/available_in_days = player_old_enough_for_role(user.client, rank)
. += "<del>[rank]</del></td><td> \[IN [(available_in_days)] DAYS]</td></tr>" dat += "<del>[rank]</del></td><td> \[IN [(available_in_days)] DAYS]</td></tr>"
continue continue
else if (ban_reason) else if (ban_reason)
. += "<del>[rank]</del></td><td><b> \[<a href='?src=\ref[user.client];view_jobban=\ref[rank];'>BANNED</a>]</b></td></tr>" dat += "<del>[rank]</del></td><td><b> \[<a href='?src=\ref[user.client];view_jobban=\ref[rank];'>BANNED</a>]</b></td></tr>"
continue continue
if((pref.job_civilian_low & ASSISTANT) && (rank != "Assistant")) if((pref.job_civilian_low & ASSISTANT) && (rank != "Assistant"))
. += "<font color=orange>[rank]</font></td><td></td></tr>" dat += "<font color=orange>[rank]</font></td><td></td></tr>"
continue continue
if((rank in command_positions) || (rank == "AI"))//Bold head jobs if((rank in command_positions) || (rank == "AI"))//Bold head jobs
. += "<b>[rank]</b>" dat += "<b>[rank]</b>"
else else
. += "[rank]" dat += "[rank]"
. += "</td><td width='40%'>" dat += "</td><td width='40%'>"
. += "<a href='?src=\ref[src];set_job=[rank]'>" dat += "<a href='?src=\ref[src];set_job=[rank]'>"
if(rank == "Assistant")//Assistant is special if(rank == "Assistant")//Assistant is special
if(pref.job_civilian_low & ASSISTANT) if(pref.job_civilian_low & ASSISTANT)
. += " <font color=green>\[Yes]</font>" dat += " <font color=green>\[Yes]</font>"
else else
. += " <font color=red>\[No]</font>" dat += " <font color=red>\[No]</font>"
if(job.alt_titles) //Blatantly cloned from a few lines down. if(job.alt_titles) //Blatantly cloned from a few lines down.
. += "</a></td></tr><tr bgcolor='[lastJob.selection_color]'><td width='60%' align='center'>&nbsp</td><td><a href='?src=\ref[src];select_alt_title=\ref[job]'>\[[pref.GetPlayerAltTitle(job)]\]</a></td></tr>" dat += "</a></td></tr><tr bgcolor='[lastJob.selection_color]'><td width='60%' align='center'>&nbsp</td><td><a href='?src=\ref[src];select_alt_title=\ref[job]'>\[[pref.GetPlayerAltTitle(job)]\]</a></td></tr>"
. += "</a></td></tr>" dat += "</a></td></tr>"
continue continue
if(pref.GetJobDepartment(job, 1) & job.flag) if(pref.GetJobDepartment(job, 1) & job.flag)
. += " <font color=blue>\[High]</font>" dat += " <font color=blue>\[High]</font>"
else if(pref.GetJobDepartment(job, 2) & job.flag) else if(pref.GetJobDepartment(job, 2) & job.flag)
. += " <font color=green>\[Medium]</font>" dat += " <font color=green>\[Medium]</font>"
else if(pref.GetJobDepartment(job, 3) & job.flag) else if(pref.GetJobDepartment(job, 3) & job.flag)
. += " <font color=orange>\[Low]</font>" dat += " <font color=orange>\[Low]</font>"
else else
. += " <font color=red>\[NEVER]</font>" dat += " <font color=red>\[NEVER]</font>"
if(job.alt_titles) if(job.alt_titles)
. += "</a></td></tr><tr bgcolor='[lastJob.selection_color]'><td width='60%' align='center'>&nbsp</td><td><a href='?src=\ref[src];select_alt_title=\ref[job]'>\[[pref.GetPlayerAltTitle(job)]\]</a></td></tr>" dat += "</a></td></tr><tr bgcolor='[lastJob.selection_color]'><td width='60%' align='center'>&nbsp</td><td><a href='?src=\ref[src];select_alt_title=\ref[job]'>\[[pref.GetPlayerAltTitle(job)]\]</a></td></tr>"
. += "</a></td></tr>" dat += "</a></td></tr>"
. += "</td'></tr></table>" dat += "</td'></tr></table>"
. += "</center></table>" dat += "</center></table>"
switch(pref.alternate_option) switch(pref.alternate_option)
if(GET_RANDOM_JOB) if(GET_RANDOM_JOB)
. += "<center><br><u><a href='?src=\ref[src];job_alternative=1'><font color=green>Get random job if preferences unavailable</font></a></u></center><br>" dat += "<center><br><u><a href='?src=\ref[src];job_alternative=1'><font color=green>Get random job if preferences unavailable</font></a></u></center><br>"
if(BE_ASSISTANT) if(BE_ASSISTANT)
. += "<center><br><u><a href='?src=\ref[src];job_alternative=1'><font color=red>Be assistant if preference unavailable</font></a></u></center><br>" dat += "<center><br><u><a href='?src=\ref[src];job_alternative=1'><font color=red>Be assistant if preference unavailable</font></a></u></center><br>"
if(RETURN_TO_LOBBY) if(RETURN_TO_LOBBY)
. += "<center><br><u><a href='?src=\ref[src];job_alternative=1'><font color=purple>Return to lobby if preference unavailable</font></a></u></center><br>" dat += "<center><br><u><a href='?src=\ref[src];job_alternative=1'><font color=purple>Return to lobby if preference unavailable</font></a></u></center><br>"
. += "<center><a href='?src=\ref[src];reset_jobs=1'>\[Reset\]</a></center>" dat += "<center><a href='?src=\ref[src];reset_jobs=1'>\[Reset\]</a></center>"
. += "</tt>" dat += "</tt>"
. = dat.Join()
/datum/category_item/player_setup_item/occupation/OnTopic(href, href_list, user) /datum/category_item/player_setup_item/occupation/OnTopic(href, href_list, user)
if(href_list["reset_jobs"]) if(href_list["reset_jobs"])

View File

@@ -61,27 +61,30 @@
infraction.felony = text2num(char_infraction_query.item[11]) infraction.felony = text2num(char_infraction_query.item[11])
pref.incidents.Add(infraction) pref.incidents.Add(infraction)
/datum/category_item/player_setup_item/other/incidents/content(var/mob/user) /datum/category_item/player_setup_item/other/incidents/content(mob/user)
pref.incidents = list() var/list/dat = list(
. += "<b>Incident Information</b><br>" "<b>Incident Information</b><br>",
. += "The following incidents are on file for your character<br>" "The following incidents are on file for your character<br>"
)
for (var/datum/char_infraction/I in pref.incidents) for (var/datum/char_infraction/I in pref.incidents)
. += "<hr>" dat += "<hr>"
. += "UID: [I.UID]<br>" dat += "UID: [I.UID]<br>"
. += "Date/Time: [I.datetime]<br>" dat += "Date/Time: [I.datetime]<br>"
. += "Charges: " dat += "Charges: "
for (var/L in I.charges) for (var/L in I.charges)
. += "[L], " dat += "[L], "
if (I.fine == 0) if (I.fine == 0)
. += "<br>Brig Sentence: [I.getBrigSentence()] <br>" dat += "<br>Brig Sentence: [I.getBrigSentence()] <br>"
else else
. += "Fine: [I.fine] Credits<br>" dat += "Fine: [I.fine] Credits<br>"
. += "Notes: <br>" dat += "Notes: <br>"
if (I.notes != "") if (I.notes != "")
. += nl2br(I.notes) dat += nl2br(I.notes)
else else
. += "- No Summary Entered -" dat += "- No Summary Entered -"
. += "<br><a href='?src=\ref[src];details_sec_incident=[I.db_id]'>Show Details</a><br><a href='?src=\ref[src];del_sec_incident=[I.db_id]'>Delete Incident</a>" dat += "<br><a href='?src=\ref[src];details_sec_incident=[I.db_id]'>Show Details</a><br><a href='?src=\ref[src];del_sec_incident=[I.db_id]'>Delete Incident</a>"
. = dat.Join()
/datum/category_item/player_setup_item/other/incidents/OnTopic(var/href,var/list/href_list, var/mob/user) /datum/category_item/player_setup_item/other/incidents/OnTopic(var/href,var/list/href_list, var/mob/user)
if(href_list["del_sec_incident"]) if(href_list["del_sec_incident"])

View File

@@ -7,6 +7,9 @@
#define SQL_CHARACTER 0x1 #define SQL_CHARACTER 0x1
#define SQL_PREFERENCES 0x2 #define SQL_PREFERENCES 0x2
// General-purpose helper for drawing a colored box.
#define HTML_RECT(color) "&nbsp;<div style=\"display:inline;height:10px;width:30px;background:'[color || "#FFFFFF"]'\"></div>&nbsp;"
/datum/category_group/player_setup_category/general_preferences /datum/category_group/player_setup_category/general_preferences
name = "General" name = "General"
sort_order = 1 sort_order = 1

View File

@@ -3,26 +3,46 @@
sort_order = 1 sort_order = 1
/datum/category_item/player_setup_item/skills/load_character(var/savefile/S) /datum/category_item/player_setup_item/skills/load_character(var/savefile/S)
S["skills"] >> pref.skills S["skills"] >> pref.skills
S["used_skillpoints"] >> pref.used_skillpoints S["used_skillpoints"] >> pref.used_skillpoints
S["skill_specialization"] >> pref.skill_specialization S["skill_specialization"] >> pref.skill_specialization
/datum/category_item/player_setup_item/skills/save_character(var/savefile/S) /datum/category_item/player_setup_item/skills/save_character(var/savefile/S)
S["skills"] << pref.skills S["skills"] << pref.skills
S["used_skillpoints"] << pref.used_skillpoints S["used_skillpoints"] << pref.used_skillpoints
S["skill_specialization"] << pref.skill_specialization S["skill_specialization"] << pref.skill_specialization
/datum/category_item/player_setup_item/skills/gather_load_query() /datum/category_item/player_setup_item/skills/gather_load_query()
return list("ss13_characters" = list("vars" = list("skills", "skill_specialization"), "args" = list("id"))) return list(
"ss13_characters" = list(
"vars" = list(
"skills",
"skill_specialization"
),
"args" = list("id")
)
)
/datum/category_item/player_setup_item/skills/gather_load_parameters() /datum/category_item/player_setup_item/skills/gather_load_parameters()
return list("id" = pref.current_character) return list("id" = pref.current_character)
/datum/category_item/player_setup_item/skills/gather_save_query() /datum/category_item/player_setup_item/skills/gather_save_query()
return list("ss13_characters" = list("skills", "skill_specialization", "id" = 1, "ckey" = 1)) return list(
"ss13_characters" = list(
"skills",
"skill_specialization",
"id" = 1,
"ckey" = 1
)
)
/datum/category_item/player_setup_item/skills/gather_save_parameters() /datum/category_item/player_setup_item/skills/gather_save_parameters()
return list("skills" = list2params(pref.skills), "skill_specialization" = pref.skill_specialization, "id" = pref.current_character, "ckey" = pref.client.ckey) return list(
"skills" = list2params(pref.skills),
"skill_specialization" = pref.skill_specialization,
"id" = pref.current_character,
"ckey" = pref.client.ckey
)
/datum/category_item/player_setup_item/skills/sanitize_character(var/sql_load = 0) /datum/category_item/player_setup_item/skills/sanitize_character(var/sql_load = 0)
if (SKILLS == null) if (SKILLS == null)
@@ -45,27 +65,30 @@
pref.used_skillpoints = 0 pref.used_skillpoints = 0
/datum/category_item/player_setup_item/skills/content() /datum/category_item/player_setup_item/skills/content()
. += "<b>Select your Skills</b><br>" var/list/dat = list(
. += "Current skill level: <b>[pref.GetSkillClass(pref.used_skillpoints)]</b> ([pref.used_skillpoints])<br>" "<b>Select your Skills</b><br>",
. += "<a href='?src=\ref[src];preconfigured=1'>Use preconfigured skillset</a><br>" "Current skill level: <b>[pref.GetSkillClass(pref.used_skillpoints)]</b> ([pref.used_skillpoints])<br>",
. += "<table>" "<a href='?src=\ref[src];preconfigured=1'>Use preconfigured skillset</a><br>",
"<table>"
)
for(var/V in SKILLS) for(var/V in SKILLS)
. += "<tr><th colspan = 5><b>[V]</b>" dat += "<tr><th colspan = 5><b>[V]</b>"
. += "</th></tr>" dat += "</th></tr>"
for(var/datum/skill/S in SKILLS[V]) for(var/datum/skill/S in SKILLS[V])
var/level = pref.skills[S.ID] var/level = pref.skills[S.ID]
. += "<tr style='text-align:left;'>" dat += "<tr style='text-align:left;'>"
. += "<th><a href='?src=\ref[src];skillinfo=\ref[S]'>[S.name]</a></th>" dat += "<th><a href='?src=\ref[src];skillinfo=\ref[S]'>[S.name]</a></th>"
. += "<th><a href='?src=\ref[src];setskill=\ref[S];newvalue=[SKILL_NONE]'><font color=[(level == SKILL_NONE) ? "red" : "black"]>\[Untrained\]</font></a></th>" dat += "<th><a href='?src=\ref[src];setskill=\ref[S];newvalue=[SKILL_NONE]'><font color=[(level == SKILL_NONE) ? "red" : "black"]>\[Untrained\]</font></a></th>"
// secondary skills don't have an amateur level // secondary skills don't have an amateur level
if(S.secondary) if(S.secondary)
. += "<th></th>" dat += "<th></th>"
else else
. += "<th><a href='?src=\ref[src];setskill=\ref[S];newvalue=[SKILL_BASIC]'><font color=[(level == SKILL_BASIC) ? "red" : "black"]>\[Amateur\]</font></a></th>" dat += "<th><a href='?src=\ref[src];setskill=\ref[S];newvalue=[SKILL_BASIC]'><font color=[(level == SKILL_BASIC) ? "red" : "black"]>\[Amateur\]</font></a></th>"
. += "<th><a href='?src=\ref[src];setskill=\ref[S];newvalue=[SKILL_ADEPT]'><font color=[(level == SKILL_ADEPT) ? "red" : "black"]>\[Trained\]</font></a></th>" dat += "<th><a href='?src=\ref[src];setskill=\ref[S];newvalue=[SKILL_ADEPT]'><font color=[(level == SKILL_ADEPT) ? "red" : "black"]>\[Trained\]</font></a></th>"
. += "<th><a href='?src=\ref[src];setskill=\ref[S];newvalue=[SKILL_EXPERT]'><font color=[(level == SKILL_EXPERT) ? "red" : "black"]>\[Professional\]</font></a></th>" dat += "<th><a href='?src=\ref[src];setskill=\ref[S];newvalue=[SKILL_EXPERT]'><font color=[(level == SKILL_EXPERT) ? "red" : "black"]>\[Professional\]</font></a></th>"
. += "</tr>" dat += "</tr>"
. += "</table>" dat += "</table>"
. = dat.Join()
/datum/category_item/player_setup_item/skills/OnTopic(href, href_list, user) /datum/category_item/player_setup_item/skills/OnTopic(href, href_list, user)
if(href_list["skillinfo"]) if(href_list["skillinfo"])

View File

@@ -148,13 +148,21 @@
siemens_coefficient = 1.5 siemens_coefficient = 1.5
item_icons = list() item_icons = list()
update_icon(var/mob/living/carbon/human/user) /obj/item/clothing/head/kitty/equipped(mob/living/carbon/human/user, slot)
if(!istype(user)) return . = ..()
var/icon/ears = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "kitty") if (slot == slot_head && istype(user))
ears.Blend(rgb(user.r_hair, user.g_hair, user.b_hair), ICON_ADD) var/hairgb = rgb(user.r_hair, user.g_hair, user.b_hair)
var/icon/blended = SSicon_cache.kitty_ear_cache[hairgb]
if (!blended)
blended = icon('icons/mob/head.dmi', "kitty")
blended.Blend(hairgb, ICON_ADD)
blended.Blend(icon('icons/mob/head.dmi', "kittyinner"), ICON_OVERLAY)
var/icon/earbit = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "kittyinner") SSicon_cache.kitty_ear_cache[hairgb] = blended
ears.Blend(earbit, ICON_OVERLAY)
icon_override = blended
else if (icon_override)
icon_override = null
/obj/item/clothing/head/richard /obj/item/clothing/head/richard
name = "chicken mask" name = "chicken mask"

View File

@@ -107,7 +107,7 @@
/obj/item/clothing/suit/wizrobe/gentlecoat /obj/item/clothing/suit/wizrobe/gentlecoat
name = "gentlemans coat" name = "gentlemans coat"
desc = "A heavy threaded twead gray jacket. For a different sort of Gentleman." desc = "A heavy threaded tweed gray jacket. For a different sort of Gentleman."
icon_state = "gentlecoat" icon_state = "gentlecoat"
item_state = "gentlecoat" item_state = "gentlecoat"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS

View File

@@ -512,7 +512,7 @@ All custom items with worn sprites must follow the contained sprite system: http
/obj/item/clothing/suit/storage/toggle/labcoat/fluff/helmut_labcoat //CERN Labcoat - Helmut Kronigernischultz - pyrociraptor /obj/item/clothing/suit/storage/toggle/labcoat/fluff/helmut_labcoat //CERN Labcoat - Helmut Kronigernischultz - pyrociraptor
name = "CERN labcoat" name = "\improper CERN labcoat"
desc = "A Labcoat with a blue pocket and blue collar. On the pocket, you can read \"C.E.R.N.\"." desc = "A Labcoat with a blue pocket and blue collar. On the pocket, you can read \"C.E.R.N.\"."
icon = 'icons/obj/custom_items/helmut_labcoat.dmi' icon = 'icons/obj/custom_items/helmut_labcoat.dmi'
icon_state = "helmut_labcoat" icon_state = "helmut_labcoat"
@@ -703,6 +703,7 @@ All custom items with worn sprites must follow the contained sprite system: http
desc = "A sterile insulated coat made of leather stitched over fur. It has two gold lapels indicating Officer rank. \ desc = "A sterile insulated coat made of leather stitched over fur. It has two gold lapels indicating Officer rank. \
The a white armband with a scarlet line in the center indicates that the person wearing this coat is medically trained." The a white armband with a scarlet line in the center indicates that the person wearing this coat is medically trained."
/obj/item/clothing/suit/storage/tajaran/fluff/maksim_coat //Tajaran Naval Officer's Coat - Maksim Vasilyev - aimlessanalyst /obj/item/clothing/suit/storage/tajaran/fluff/maksim_coat //Tajaran Naval Officer's Coat - Maksim Vasilyev - aimlessanalyst
name = "tajaran naval officer coat" name = "tajaran naval officer coat"
desc = "A thick wool coat from Adhomai, calling back to days long past." desc = "A thick wool coat from Adhomai, calling back to days long past."
@@ -1168,3 +1169,79 @@ All custom items with worn sprites must follow the contained sprite system: http
/obj/item/clothing/mask/fluff/corvo_cigarette/examine(mob/user) /obj/item/clothing/mask/fluff/corvo_cigarette/examine(mob/user)
if(..(user, 1)) if(..(user, 1))
user << "It is [active ? "on" : "off"]." user << "It is [active ? "on" : "off"]."
/obj/item/weapon/reagent_containers/food/drinks/bottle/cognac/fluff/leonce_cognac //Old Earth Luxury Cognac - Francois Leonce - driecg36
name = "old earth luxury cognac"
desc = "An unusually shaped crystal bottle, covered in elaborate etchings displaying the symbol of the house that produced it. Inside is a smooth, amber liquor, \
which smells of the barrel it was aged in. The region and producer are on the label."
icon = 'icons/obj/custom_items/leonce_cognac.dmi'
icon_state = "leonce_cognac"
/obj/item/clothing/under/fluff/birkin_uniform //White Suit - Joseph Birkin - unknownmurder
name = "white suit"
desc = "This collared uniform appears to be little wrinkled and the tie is a bit loose from the collar. The jean seems to be neatly straight with the leather belt attached."
icon = 'icons/obj/custom_items/birkin_uniform.dmi'
icon_state = "birkin_uniform"
item_state = "birkin_uniform"
contained_sprite = TRUE
/obj/item/clothing/suit/storage/fluff/sonorous_mantle //Maraziite Throw Over - Sonorous Zouzoror - sleepywolf
name = "maraziite throw over"
desc = "A grey poncho, exclusively warn by members of the Maraziite Order. This one has the flag of the Izweski Hegemony stitched on."
icon = 'icons/obj/custom_items/sonorous_clothing.dmi'
icon_state = "sonorous_mantle"
item_state = "sonorous_mantle"
contained_sprite = TRUE
/obj/item/clothing/mask/fluff/sonorous_mask //Iron Mask - Sonorous Zouzoror - sleepywolf
name = "iron mask"
desc = "A mask made of iron worn by members of the Maraziite Order. This one looks like it's modeled after a fish."
icon = 'icons/obj/custom_items/sonorous_clothing.dmi'
icon_state = "sonorous_mask"
item_state = "sonorous_mask"
contained_sprite = TRUE
flags_inv = HIDEEARS|HIDEFACE
body_parts_covered = FACE
w_class = 3.0
/obj/item/clothing/under/fluff/ellie_uniform //Cheery Blazer - Ellie Shoshanna - resilynn
name = "cheery blazer"
desc = "A cheery but professional outfit, mauve corduroys, blue blazer and a tie."
icon = 'icons/obj/custom_items/ellie_uniform.dmi'
icon_state = "ellie_uniform"
item_state = "ellie_uniform"
contained_sprite = TRUE
/obj/item/clothing/accessory/fluff/zhilin_necklace //Tajaran Religious Necklace - Zhilin Vadim - fireandglory
name = "tajaran religious necklace"
desc = "A necklace with black string, it appears to have carved wooden figures of the Tajaran god Mata'ke and all of his pantheon strung through it."
icon = 'icons/obj/custom_items/zhilin_necklace.dmi'
icon_state = "zhilin_necklace"
item_state = "zhilin_necklace"
contained_sprite = TRUE
slot_flags = SLOT_EARS | SLOT_TIE
/obj/item/weapon/book/fluff/huntington_book //Spark Theorem - Monica Huntington - moondancerpony
name = "\improper Spark Theorem"
desc = "A bound copy of the 2458 research paper \"Spark Theorem: Research Into the Development of Synthetic Consciousness and Sapience\". This one is signed by the author."
title = "Spark Theorem"
icon_state = "book6"
author = "Kyyir'ry'avii 'Karima' Ile'nagrii Al'Ghul-Mo'Taki"
dat = "<!doctype html><html style=\"width:100%;height:100%;\"><head><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"></head><body><iframe style=\"width:100%;height:100%\" src=\"https://assets.lohikar.io/mdp/sparktheorem.html\"></iframe></body></html>"
due_date = 0
unique = 1
/obj/item/clothing/shoes/fluff/hikmat_shoes //Native Tajaran Foot-wear - Hikmat Rrhazkal-Jawdat - prospekt1559
name = "native tajaran foot-wear"
desc = "Native foot and leg wear worn by Tajara, completely covering the legs in wraps and the feet in native Tajaran fabric."
icon = 'icons/obj/custom_items/hikmat_shoes.dmi'
icon_state = "hikmat_shoes"
item_state = "hikmat_shoes"
species_restricted = null
contained_sprite = TRUE

View File

@@ -111,7 +111,7 @@
user.do_attack_animation(src) user.do_attack_animation(src)
M.IgniteMob() M.IgniteMob()
else if(reagents.total_volume) else if(reagents.total_volume)
if(user.zone_sel.selecting == "mouth") if(user.zone_sel.selecting == "mouth" && !(M.wear_mask && M.wear_mask.item_flags & AIRTIGHT))
user.do_attack_animation(src) user.do_attack_animation(src)
user.visible_message( user.visible_message(
"<span class='danger'>\The [user] smothers [target] with [src]!</span>", "<span class='danger'>\The [user] smothers [target] with [src]!</span>",

View File

@@ -46,17 +46,6 @@
#define GEAR_EVA 15 #define GEAR_EVA 15
/var/list/economic_species_modifier = list(
/datum/species/human = 12,
/datum/species/skrell = 10,
/datum/species/tajaran = 7,
/datum/species/unathi = 7,
/datum/species/diona = 3,
/datum/species/machine = 3,
/datum/species/bug = 1
)
//---- The following corporations are friendly with NanoTrasen and loosely enable trade and travel: //---- The following corporations are friendly with NanoTrasen and loosely enable trade and travel:
//Corporation NanoTrasen - Generalised / high tech research and phoron exploitation. //Corporation NanoTrasen - Generalised / high tech research and phoron exploitation.
//Corporation Vessel Contracting - Ship and station construction, materials research. //Corporation Vessel Contracting - Ship and station construction, materials research.

View File

@@ -67,11 +67,10 @@
var/last_biolum = null var/last_biolum = null
/obj/effect/plant/Destroy() /obj/effect/plant/Destroy()
if(SSplants) SSplants.remove_plant(src)
STOP_PROCESSING(SSplants, src)
for(var/obj/effect/plant/neighbor in range(1,src)) for(var/obj/effect/plant/neighbor in range(1,src))
if (!QDELETED(neighbor)) if (!QDELETED(neighbor))
START_PROCESSING(SSplants, neighbor) SSplants.add_plant(neighbor)
return ..() return ..()
/obj/effect/plant/single /obj/effect/plant/single
@@ -129,7 +128,7 @@
/obj/effect/plant/proc/post_initialize() /obj/effect/plant/proc/post_initialize()
set_dir(calc_dir()) set_dir(calc_dir())
update_icon() update_icon()
START_PROCESSING(SSplants, src) SSplants.add_plant(src)
// Some plants eat through plating. // Some plants eat through plating.
if(islist(seed.chems) && !isnull(seed.chems["pacid"])) if(islist(seed.chems) && !isnull(seed.chems["pacid"]))
var/turf/T = get_turf(src) var/turf/T = get_turf(src)
@@ -239,7 +238,7 @@
/obj/effect/plant/attackby(var/obj/item/weapon/W, var/mob/user) /obj/effect/plant/attackby(var/obj/item/weapon/W, var/mob/user)
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
START_PROCESSING(SSplants, src) SSplants.add_plant(src)
if(iswirecutter(W) || istype(W, /obj/item/weapon/scalpel)) if(iswirecutter(W) || istype(W, /obj/item/weapon/scalpel))
if(sampled) if(sampled)

View File

@@ -23,6 +23,10 @@
if(!Adjacent(floor) || !floor.Enter(src)) if(!Adjacent(floor) || !floor.Enter(src))
continue continue
neighbors |= floor neighbors |= floor
if (neighbors.len)
SSplants.add_plant(src)
// Update all of our friends. // Update all of our friends.
var/turf/T = get_turf(src) var/turf/T = get_turf(src)
for(var/obj/effect/plant/neighbor in range(1,src)) for(var/obj/effect/plant/neighbor in range(1,src))
@@ -82,8 +86,8 @@
// We shouldn't have spawned if the controller doesn't exist. // We shouldn't have spawned if the controller doesn't exist.
check_health() check_health()
if(neighbors.len || health != max_health) if(neighbors.len || health != max_health || buckled_mob)
START_PROCESSING(SSplants, src) SSplants.add_plant(src)
/obj/effect/plant/proc/do_spread(spread_chance, max_spread) /obj/effect/plant/proc/do_spread(spread_chance, max_spread)
for(var/i in 1 to max_spread) for(var/i in 1 to max_spread)
@@ -113,7 +117,7 @@
continue continue
for(var/obj/effect/plant/neighbor in check_turf.contents) for(var/obj/effect/plant/neighbor in check_turf.contents)
neighbor.neighbors |= check_turf neighbor.neighbors |= check_turf
START_PROCESSING(SSplants, neighbor) SSplants.add_plant(neighbor)
QDEL_IN(src, 1) QDEL_IN(src, 1)

View File

@@ -24,7 +24,7 @@
return 1 return 1
/datum/job/intern_med /datum/job/intern_med
title = "Nursing Intern" title = "Medical Resident"
flag = INTERN_MED flag = INTERN_MED
department_flag = MEDSCI department_flag = MEDSCI
faction = "Station" faction = "Station"

View File

@@ -1131,8 +1131,7 @@ var/list/total_extraction_beacons = list()
single_spark(O.loc) single_spark(O.loc)
do_teleport(O, user, 0) do_teleport(O, user, 0)
if (TICK_CHECK) CHECK_TICK
return
/******************************Sculpting*******************************/ /******************************Sculpting*******************************/
/obj/item/weapon/autochisel /obj/item/weapon/autochisel

View File

@@ -16,12 +16,14 @@
src.contents += W src.contents += W
if (istype(W, /obj/item/weapon/storage)) if (istype(W, /obj/item/weapon/storage))
var/obj/item/weapon/storage/S = W var/obj/item/weapon/storage/S = W
S.hide_from(usr) S.hide_from(user)
for(var/obj/item/weapon/ore/O in S.contents) for(var/obj/item/weapon/ore/O in S.contents)
S.remove_from_storage(O, src) //This will move the item to this item's contents S.remove_from_storage_deferred(O, src, user) //This will move the item to this item's contents
CHECK_TICK CHECK_TICK
S.post_remove_from_storage_deferred(loc, user)
user << span("notice", "You empty the satchel into the box.") user << span("notice", "You empty the satchel into the box.")
update_ore_count() update_ore_count()

View File

@@ -174,29 +174,26 @@ Works together with spawning an observer, noted above.
C.images += target.hud_list[SPECIALROLE_HUD] C.images += target.hud_list[SPECIALROLE_HUD]
return 1 return 1
/mob/proc/ghostize(var/can_reenter_corpse = 1) /mob/proc/ghostize(var/can_reenter_corpse = 1, var/should_set_timer = 1)
if(ckey) if(ckey)
var/mob/dead/observer/ghost = new(src) //Transfer safety to observer spawning proc. var/mob/dead/observer/ghost = new(src) //Transfer safety to observer spawning proc.
ghost.can_reenter_corpse = can_reenter_corpse ghost.can_reenter_corpse = can_reenter_corpse
ghost.timeofdeath = src.stat == DEAD ? src.timeofdeath : world.time ghost.timeofdeath = src.stat == DEAD ? src.timeofdeath : world.time
if(should_set_timer)
//This is duplicated for robustness in cases where death might not be called. //This is duplicated for robustness in cases where death might not be called.
//It is also set in the mob/death proc //It is also set in the mob/death proc
if (isanimal(src)) if (isanimal(src))
set_death_time(ANIMAL, world.time) set_death_time(ANIMAL, world.time)
else if (ispAI(src) || isDrone(src)) else if (ispAI(src) || isDrone(src))
set_death_time(MINISYNTH, world.time) set_death_time(MINISYNTH, world.time)
else else
set_death_time(CREW, world.time)//Crew is the fallback set_death_time(CREW, world.time)//Crew is the fallback
ghost.ckey = ckey ghost.ckey = ckey
ghost.client = client ghost.client = client
ghost.initialise_postkey() ghost.initialise_postkey()
if(ghost.client) if(ghost.client)
if(!ghost.client.holder && !config.antag_hud_allowed) // For new ghosts we remove the verb from even showing up if it's not allowed. if(!ghost.client.holder && !config.antag_hud_allowed) // For new ghosts we remove the verb from even showing up if it's not allowed.
ghost.verbs -= /mob/dead/observer/verb/toggle_antagHUD // Poor guys, don't know what they are missing! ghost.verbs -= /mob/dead/observer/verb/toggle_antagHUD // Poor guys, don't know what they are missing!
return ghost return ghost
@@ -210,7 +207,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
set desc = "Relinquish your life and enter the land of the dead." set desc = "Relinquish your life and enter the land of the dead."
if(stat == DEAD) if(stat == DEAD)
announce_ghost_joinleave(ghostize(1)) announce_ghost_joinleave(ghostize(1, 0))
else else
var/response var/response
if(check_rights((R_MOD|R_ADMIN), 0)) if(check_rights((R_MOD|R_ADMIN), 0))

View File

@@ -11,8 +11,6 @@
mob_size = 9//Based on average weight of a human mob_size = 9//Based on average weight of a human
/mob/living/carbon/human/Initialize(mapload, var/new_species = null) /mob/living/carbon/human/Initialize(mapload, var/new_species = null)
eat_types |= TYPE_ORGANIC//Any mobs that are given the devour verb, can eat nonhumanoid organics. Only applies to unathi for now
if(!dna) if(!dna)
dna = new /datum/dna(null) dna = new /datum/dna(null)
// Species name is handled by set_species() // Species name is handled by set_species()

View File

@@ -258,8 +258,6 @@ This saves us from having to call add_fingerprint() any time something is put in
update_hair(redraw_mob) //rebuild hair update_hair(redraw_mob) //rebuild hair
update_inv_ears(0) update_inv_ears(0)
update_inv_wear_mask(0) update_inv_wear_mask(0)
if(istype(W,/obj/item/clothing/head/kitty))
W.update_icon(src)
W.equipped(src, slot) W.equipped(src, slot)
update_inv_head(redraw_mob) update_inv_head(redraw_mob)
if(slot_shoes) if(slot_shoes)

View File

@@ -13,6 +13,7 @@
var/bodytype var/bodytype
var/age_min = 17 var/age_min = 17
var/age_max = 85 var/age_max = 85
var/economic_modifier = 0
// Icon/appearance vars. // Icon/appearance vars.
var/icobase = 'icons/mob/human_races/r_human.dmi' // Normal icon set. var/icobase = 'icons/mob/human_races/r_human.dmi' // Normal icon set.
@@ -148,6 +149,7 @@
var/gluttonous // Can eat some mobs. Boolean. var/gluttonous // Can eat some mobs. Boolean.
var/mouth_size // How big the mob's mouth is. Limits how large a mob this species can swallow. Only relevant if gluttonous is TRUE. var/mouth_size // How big the mob's mouth is. Limits how large a mob this species can swallow. Only relevant if gluttonous is TRUE.
var/allowed_eat_types = TYPE_ORGANIC
var/max_nutrition_factor = 1 //Multiplier on maximum nutrition var/max_nutrition_factor = 1 //Multiplier on maximum nutrition
var/nutrition_loss_factor = 1 //Multiplier on passive nutrition losses var/nutrition_loss_factor = 1 //Multiplier on passive nutrition losses
@@ -337,6 +339,7 @@
H.pass_flags = pass_flags H.pass_flags = pass_flags
H.mob_size = mob_size H.mob_size = mob_size
H.mouth_size = mouth_size || 2 H.mouth_size = mouth_size || 2
H.eat_types = allowed_eat_types
if(!kpg) if(!kpg)
if(islesserform(H)) if(islesserform(H))
H.dna.SetSEState(MONKEYBLOCK,1) H.dna.SetSEState(MONKEYBLOCK,1)

View File

@@ -5,8 +5,15 @@
name_plural = "Humans" name_plural = "Humans"
bodytype = "Human" bodytype = "Human"
age_max = 125 age_max = 125
economic_modifier = 12
primitive_form = "Monkey" primitive_form = "Monkey"
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/punch, /datum/unarmed_attack/bite) unarmed_types = list(
/datum/unarmed_attack/stomp,
/datum/unarmed_attack/kick,
/datum/unarmed_attack/punch,
/datum/unarmed_attack/bite
)
blurb = "Humanity originated in the Sol system, and over the last four centuries has spread colonies across a wide swathe of space. \ blurb = "Humanity originated in the Sol system, and over the last four centuries has spread colonies across a wide swathe of space. \
They hold a wide range of forms and creeds.<br><br>\ They hold a wide range of forms and creeds.<br><br>\
The Sol Alliance is still massively influential, but independent human nations have managed to shake off its dominance and forge their \ The Sol Alliance is still massively influential, but independent human nations have managed to shake off its dominance and forge their \
@@ -21,7 +28,7 @@
appearance_flags = HAS_HAIR_COLOR | HAS_SKIN_TONE | HAS_LIPS | HAS_UNDERWEAR | HAS_EYE_COLOR | HAS_SOCKS appearance_flags = HAS_HAIR_COLOR | HAS_SKIN_TONE | HAS_LIPS | HAS_UNDERWEAR | HAS_EYE_COLOR | HAS_SOCKS
remains_type = /obj/effect/decal/remains/human remains_type = /obj/effect/decal/remains/human
stamina = 130 // Humans can sprint for longer than any other species stamina = 130 // Humans can sprint for longer than any other species
stamina_recovery = 5 stamina_recovery = 5
sprint_speed_factor = 0.9 sprint_speed_factor = 0.9
sprint_cost_factor = 0.5 sprint_cost_factor = 0.5
@@ -35,7 +42,12 @@
deform = 'icons/mob/human_races/r_def_lizard.dmi' deform = 'icons/mob/human_races/r_def_lizard.dmi'
tail = "sogtail" tail = "sogtail"
tail_animation = 'icons/mob/species/unathi/tail.dmi' tail_animation = 'icons/mob/species/unathi/tail.dmi'
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp) unarmed_types = list(
/datum/unarmed_attack/stomp,
/datum/unarmed_attack/kick,
/datum/unarmed_attack/claws,
/datum/unarmed_attack/bite/sharp
)
primitive_form = "Stok" primitive_form = "Stok"
darksight = 3 darksight = 3
gluttonous = 1 gluttonous = 1
@@ -44,6 +56,7 @@
fall_mod = 1.2 fall_mod = 1.2
ethanol_resistance = 0.4 ethanol_resistance = 0.4
taste_sensitivity = TASTE_SENSITIVE taste_sensitivity = TASTE_SENSITIVE
economic_modifier = 7
num_alternate_languages = 2 num_alternate_languages = 2
secondary_langs = list(LANGUAGE_UNATHI, LANGUAGE_AZAZIBA) secondary_langs = list(LANGUAGE_UNATHI, LANGUAGE_AZAZIBA)
@@ -74,8 +87,8 @@
heat_level_3 = 1100 //Default 1000 heat_level_3 = 1100 //Default 1000
inherent_verbs = list( inherent_verbs = list(
/mob/living/proc/devour, /mob/living/proc/devour,
/mob/living/carbon/human/proc/regurgitate /mob/living/carbon/human/proc/regurgitate
) )
@@ -110,13 +123,18 @@
/datum/species/tajaran /datum/species/tajaran
name = "Tajara" name = "Tajara"
short_name = "taj" short_name = "taj"
name_plural = "Tajaran" name_plural = "Tajara"
bodytype = "Tajara" bodytype = "Tajara"
icobase = 'icons/mob/human_races/r_tajaran.dmi' icobase = 'icons/mob/human_races/r_tajaran.dmi'
deform = 'icons/mob/human_races/r_def_tajaran.dmi' deform = 'icons/mob/human_races/r_def_tajaran.dmi'
tail = "tajtail" tail = "tajtail"
tail_animation = 'icons/mob/species/tajaran/tail.dmi' tail_animation = 'icons/mob/species/tajaran/tail.dmi'
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp) unarmed_types = list(
/datum/unarmed_attack/stomp,
/datum/unarmed_attack/kick,
/datum/unarmed_attack/claws,
/datum/unarmed_attack/bite/sharp
)
darksight = 8 darksight = 8
slowdown = -1 slowdown = -1
brute_mod = 1.2 brute_mod = 1.2
@@ -126,8 +144,9 @@
name_language = LANGUAGE_SIIK_MAAS name_language = LANGUAGE_SIIK_MAAS
ethanol_resistance = 0.8//Gets drunk a little faster ethanol_resistance = 0.8//Gets drunk a little faster
rarity_value = 2 rarity_value = 2
economic_modifier = 7
stamina = 90 // Tajarans evolved to maintain a steady pace in the snow, sprinting wastes energy stamina = 90 // Tajara evolved to maintain a steady pace in the snow, sprinting wastes energy
stamina_recovery = 4 stamina_recovery = 4
sprint_speed_factor = 0.65 sprint_speed_factor = 0.65
sprint_cost_factor = 0.75 sprint_cost_factor = 0.75
@@ -160,7 +179,7 @@
"Your fur prickles in the heat.", "Your fur prickles in the heat.",
"You feel uncomfortably warm.", "You feel uncomfortably warm.",
"Your overheated skin itches." "Your overheated skin itches."
) )
cold_discomfort_level = 275 cold_discomfort_level = 275
/datum/species/tajaran/equip_survival_gear(var/mob/living/carbon/human/H) /datum/species/tajaran/equip_survival_gear(var/mob/living/carbon/human/H)
@@ -175,6 +194,7 @@
name_plural = "Skrell" name_plural = "Skrell"
bodytype = "Skrell" bodytype = "Skrell"
age_max = 500 age_max = 500
economic_modifier = 10
icobase = 'icons/mob/human_races/r_skrell.dmi' icobase = 'icons/mob/human_races/r_skrell.dmi'
deform = 'icons/mob/human_races/r_def_skrell.dmi' deform = 'icons/mob/human_races/r_def_skrell.dmi'
eyes = "skrell_eyes_s" eyes = "skrell_eyes_s"
@@ -215,21 +235,25 @@
ethanol_resistance = 0.5//gets drunk faster ethanol_resistance = 0.5//gets drunk faster
taste_sensitivity = TASTE_SENSITIVE taste_sensitivity = TASTE_SENSITIVE
stamina = 90 stamina = 90
sprint_speed_factor = 1.25 //Evolved for rapid escapes from predators sprint_speed_factor = 1.25 //Evolved for rapid escapes from predators
/datum/species/diona /datum/species/diona
name = "Diona" name = "Diona"
short_name = "dio" short_name = "dio"
name_plural = "Dionaea" name_plural = "Dionaea"
bodytype = "Diona" bodytype = "Diona"
age_max = 1000 age_max = 1000
economic_modifier = 3
icobase = 'icons/mob/human_races/r_diona.dmi' icobase = 'icons/mob/human_races/r_diona.dmi'
deform = 'icons/mob/human_races/r_def_plant.dmi' deform = 'icons/mob/human_races/r_def_plant.dmi'
language = "Ceti Basic" language = "Ceti Basic"
default_language = LANGUAGE_ROOTSONG default_language = LANGUAGE_ROOTSONG
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/diona) unarmed_types = list(
/datum/unarmed_attack/stomp,
/datum/unarmed_attack/kick,
/datum/unarmed_attack/diona
)
//primitive_form = "Nymph" //primitive_form = "Nymph"
slowdown = 7 slowdown = 7
rarity_value = 4 rarity_value = 4
@@ -239,9 +263,9 @@
show_ssd = "completely quiescent" show_ssd = "completely quiescent"
num_alternate_languages = 1 num_alternate_languages = 1
name_language = "Rootsong" name_language = "Rootsong"
ethanol_resistance = -1//Can't get drunk ethanol_resistance = -1 //Can't get drunk
taste_sensitivity = TASTE_DULL taste_sensitivity = TASTE_DULL
mob_size = 12//Worker gestalts are 150kg mob_size = 12 //Worker gestalts are 150kg
remains_type = /obj/effect/decal/cleanable/ash //no bones, so, they just turn into dust remains_type = /obj/effect/decal/cleanable/ash //no bones, so, they just turn into dust
blurb = "Commonly referred to (erroneously) as 'plant people', the Dionaea are a strange space-dwelling collective \ blurb = "Commonly referred to (erroneously) as 'plant people', the Dionaea are a strange space-dwelling collective \
species hailing from Epsilon Ursae Minoris. Each 'diona' is a cluster of numerous cat-sized organisms called nymphs; \ species hailing from Epsilon Ursae Minoris. Each 'diona' is a cluster of numerous cat-sized organisms called nymphs; \
@@ -252,13 +276,13 @@
water and other radiation." water and other radiation."
has_organ = list( has_organ = list(
"nutrient channel" = /obj/item/organ/diona/nutrients, "nutrient channel" = /obj/item/organ/diona/nutrients,
"neural strata" = /obj/item/organ/diona/strata, "neural strata" = /obj/item/organ/diona/strata,
"response node" = /obj/item/organ/diona/node, "response node" = /obj/item/organ/diona/node,
"gas bladder" = /obj/item/organ/diona/bladder, "gas bladder" = /obj/item/organ/diona/bladder,
"polyp segment" = /obj/item/organ/diona/polyp, "polyp segment" = /obj/item/organ/diona/polyp,
"anchoring ligament" = /obj/item/organ/diona/ligament "anchoring ligament" = /obj/item/organ/diona/ligament
) )
has_limbs = list( has_limbs = list(
"chest" = list("path" = /obj/item/organ/external/chest/diona), "chest" = list("path" = /obj/item/organ/external/chest/diona),
@@ -272,7 +296,7 @@
"r_hand" = list("path" = /obj/item/organ/external/hand/right/diona), "r_hand" = list("path" = /obj/item/organ/external/hand/right/diona),
"l_foot" = list("path" = /obj/item/organ/external/foot/diona), "l_foot" = list("path" = /obj/item/organ/external/foot/diona),
"r_foot" = list("path" = /obj/item/organ/external/foot/right/diona) "r_foot" = list("path" = /obj/item/organ/external/foot/right/diona)
) )
//inherent_verbs = list() //inherent_verbs = list()
@@ -298,8 +322,8 @@
reagent_tag = IS_DIONA reagent_tag = IS_DIONA
stamina = -1 // Diona sprinting uses energy instead of stamina stamina = -1 // Diona sprinting uses energy instead of stamina
sprint_speed_factor = 0.5 //Speed gained is minor sprint_speed_factor = 0.5 //Speed gained is minor
sprint_cost_factor = 0.8 sprint_cost_factor = 0.8
/datum/species/diona/handle_sprint_cost(var/mob/living/carbon/H, var/cost) /datum/species/diona/handle_sprint_cost(var/mob/living/carbon/H, var/cost)
@@ -331,8 +355,6 @@
H << span("danger", "We have expended our energy reserves, and cannot continue to move at such a pace. We must find light!") H << span("danger", "We have expended our energy reserves, and cannot continue to move at such a pace. We must find light!")
return 0 return 0
/datum/species/diona/can_understand(var/mob/other) /datum/species/diona/can_understand(var/mob/other)
var/mob/living/carbon/alien/diona/D = other var/mob/living/carbon/alien/diona/D = other
if(istype(D)) if(istype(D))
@@ -360,7 +382,6 @@
else//Most of the stuff in the parent function doesnt apply to nymphs else//Most of the stuff in the parent function doesnt apply to nymphs
add_inherent_verbs(H) add_inherent_verbs(H)
/datum/species/diona/handle_death(var/mob/living/carbon/human/H, var/gibbed = 0) /datum/species/diona/handle_death(var/mob/living/carbon/human/H, var/gibbed = 0)
if (!gibbed) if (!gibbed)
// This proc sleeps. Async it. // This proc sleeps. Async it.
@@ -374,6 +395,7 @@
bodytype = "Machine" bodytype = "Machine"
age_min = 1 age_min = 1
age_max = 30 age_max = 30
economic_modifier = 3
blurb = "IPCs are, quite simply, 'Integrated Positronic Chassis'. In this scenario, positronic does not mean anything significant - it is a nickname given \ blurb = "IPCs are, quite simply, 'Integrated Positronic Chassis'. In this scenario, positronic does not mean anything significant - it is a nickname given \
to all advanced processing units, based on the works of vintage writer Isaac Asimov. The long of the short is that they represent all unbound synthetic \ to all advanced processing units, based on the works of vintage writer Isaac Asimov. The long of the short is that they represent all unbound synthetic \
@@ -434,11 +456,11 @@
reagent_tag = IS_MACHINE reagent_tag = IS_MACHINE
has_organ = list( has_organ = list(
"brain" = /obj/item/organ/mmi_holder/posibrain, "brain" = /obj/item/organ/mmi_holder/posibrain,
"cell" = /obj/item/organ/cell, "cell" = /obj/item/organ/cell,
"optics" = /obj/item/organ/eyes/optical_sensor, "optics" = /obj/item/organ/eyes/optical_sensor,
"ipc tag" = /obj/item/organ/ipc_tag "ipc tag" = /obj/item/organ/ipc_tag
) )
vision_organ = "optics" vision_organ = "optics"
@@ -454,15 +476,15 @@
"r_hand" = list("path" = /obj/item/organ/external/hand/right/ipc), "r_hand" = list("path" = /obj/item/organ/external/hand/right/ipc),
"l_foot" = list("path" = /obj/item/organ/external/foot/ipc), "l_foot" = list("path" = /obj/item/organ/external/foot/ipc),
"r_foot" = list("path" = /obj/item/organ/external/foot/right/ipc) "r_foot" = list("path" = /obj/item/organ/external/foot/right/ipc)
) )
heat_discomfort_level = 373.15 heat_discomfort_level = 373.15
heat_discomfort_strings = list( heat_discomfort_strings = list(
"Your CPU temperature probes warn you that you are approaching critical heat levels!" "Your CPU temperature probes warn you that you are approaching critical heat levels!"
) )
stamina = -1 // Machines use power and generate heat, stamina is not a thing stamina = -1 // Machines use power and generate heat, stamina is not a thing
sprint_speed_factor = 1 // About as capable of speed as a human sprint_speed_factor = 1 // About as capable of speed as a human
// Special snowflake machine vars. // Special snowflake machine vars.
var/sprint_temperature_factor = 1.15 var/sprint_temperature_factor = 1.15
@@ -503,7 +525,7 @@ datum/species/machine/handle_post_spawn(var/mob/living/carbon/human/H)
var/obj/item/organ/ipc_tag/tag = new_machine.internal_organs_by_name["ipc tag"] var/obj/item/organ/ipc_tag/tag = new_machine.internal_organs_by_name["ipc tag"]
var/status = 0 var/status = TRUE
var/list/query_details = list("ckey" = player.ckey, "character_name" = player.prefs.real_name) var/list/query_details = list("ckey" = player.ckey, "character_name" = player.prefs.real_name)
var/DBQuery/query = dbcon.NewQuery("SELECT tag_status FROM ss13_ipc_tracking WHERE player_ckey = :ckey: AND character_name = :character_name:") var/DBQuery/query = dbcon.NewQuery("SELECT tag_status FROM ss13_ipc_tracking WHERE player_ckey = :ckey: AND character_name = :character_name:")
query.Execute(query_details) query.Execute(query_details)
@@ -511,12 +533,12 @@ datum/species/machine/handle_post_spawn(var/mob/living/carbon/human/H)
if (query.NextRow()) if (query.NextRow())
status = text2num(query.item[1]) status = text2num(query.item[1])
else else
var/DBQuery/log_query = dbcon.NewQuery("INSERT INTO ss13_ipc_tracking (player_ckey, character_name) VALUES (:ckey:, :character_name:)") var/DBQuery/log_query = dbcon.NewQuery("INSERT INTO ss13_ipc_tracking (player_ckey, character_name, tag_status) VALUES (:ckey:, :character_name:, 1)")
log_query.Execute(query_details) log_query.Execute(query_details)
if (!status) if (!status)
new_machine.internal_organs_by_name.Remove("ipc tag") new_machine.internal_organs_by_name -= "ipc tag"
new_machine.internal_organs.Remove(tag) new_machine.internal_organs -= tag
qdel(tag) qdel(tag)
/datum/species/machine/proc/update_tag(var/mob/living/carbon/human/target, var/client/player) /datum/species/machine/proc/update_tag(var/mob/living/carbon/human/target, var/client/player)
@@ -524,10 +546,10 @@ datum/species/machine/handle_post_spawn(var/mob/living/carbon/human/H)
return return
if (establish_db_connection(dbcon)) if (establish_db_connection(dbcon))
var/status = 0 var/status = FALSE
var/sql_status = 0 var/sql_status = FALSE
if (target.internal_organs_by_name["ipc tag"]) if (target.internal_organs_by_name["ipc tag"])
status = 1 status = TRUE
var/list/query_details = list("ckey" = player.ckey, "character_name" = target.real_name) var/list/query_details = list("ckey" = player.ckey, "character_name" = target.real_name)
var/DBQuery/query = dbcon.NewQuery("SELECT tag_status FROM ss13_ipc_tracking WHERE player_ckey = :ckey: AND character_name = :character_name:") var/DBQuery/query = dbcon.NewQuery("SELECT tag_status FROM ss13_ipc_tracking WHERE player_ckey = :ckey: AND character_name = :character_name:")
@@ -602,6 +624,7 @@ datum/species/machine/handle_post_spawn(var/mob/living/carbon/human/H)
bodytype = "Vaurca" bodytype = "Vaurca"
age_min = 1 age_min = 1
age_max = 20 age_max = 20
economic_modifier = 1
language = LANGUAGE_VAURCA language = LANGUAGE_VAURCA
primitive_form = "V'krexi" primitive_form = "V'krexi"
greater_form = "Vaurca Warrior" greater_form = "Vaurca Warrior"

View File

@@ -13,6 +13,7 @@
siemens_coefficient = 0 siemens_coefficient = 0
gluttonous = TRUE gluttonous = TRUE
mouth_size = 15 // Should be larger than any human-type. mouth_size = 15 // Should be larger than any human-type.
allowed_eat_types = TYPE_ORGANIC | TYPE_SYNTHETIC | TYPE_HUMANOID
mob_size = 14 mob_size = 14
fall_mod = 0 fall_mod = 0

View File

@@ -181,7 +181,7 @@
M.adjustBruteLoss(round(dmg_factor * 0.33, 0.1) || 0.1) M.adjustBruteLoss(round(dmg_factor * 0.33, 0.1) || 0.1)
M.adjustFireLoss(round(dmg_factor * 0.66, 0.1) || 0.1) M.adjustFireLoss(round(dmg_factor * 0.66, 0.1) || 0.1)
ingested.add_reagent(M.composition_reagent, M.composition_reagent_quantity * 1/dmg_factor) ingested.add_reagent(M.composition_reagent, M.composition_reagent_quantity * dmg_factor)
if (M.stat == DEAD && !stomach_contents[M]) // If the mob has died, poke the consuming mob about it. if (M.stat == DEAD && !stomach_contents[M]) // If the mob has died, poke the consuming mob about it.
src << "Your stomach feels a little more relaxed as \the [M] finally stops fighting." src << "Your stomach feels a little more relaxed as \the [M] finally stops fighting."

View File

@@ -18,6 +18,7 @@
set name = "Devour Creature" set name = "Devour Creature"
set desc = "Attempt to eat a nearby creature, swallowing it whole if small enough, or eating it piece by piece otherwise" set desc = "Attempt to eat a nearby creature, swallowing it whole if small enough, or eating it piece by piece otherwise"
var/list/choices = list() var/list/choices = list()
for(var/mob/living/C in view(1,src)) for(var/mob/living/C in view(1,src))
if((!(src.Adjacent(C)) || C == src)) continue//cant steal nymphs right out of other gestalts if((!(src.Adjacent(C)) || C == src)) continue//cant steal nymphs right out of other gestalts
@@ -26,7 +27,11 @@
var/mob/living/carbon/alien/diona/D = C var/mob/living/carbon/alien/diona/D = C
if (D.gestalt) if (D.gestalt)
continue continue
choices.Add(C)
if (C in src) // Just no.
continue
choices += C
var/mob/living/L = input(src,"Which creature do you wish to consume?") in null|choices var/mob/living/L = input(src,"Which creature do you wish to consume?") in null|choices

View File

@@ -155,7 +155,7 @@ var/list/datum/ai_icon/ai_icons
alive_icon = "ai-hades" alive_icon = "ai-hades"
dead_icon = "ai-hades_dead" dead_icon = "ai-hades_dead"
/datum/ai_icon/triumvirate_static /datum/ai_icon/triumvirate
name = "Triumvirate" name = "Triumvirate"
alive_icon = "ai-triumvirate" alive_icon = "ai-triumvirate"
alive_light = "#020B2B" alive_light = "#020B2B"

View File

@@ -208,7 +208,7 @@
return alert("Communications circuits remain uninitialized.") return alert("Communications circuits remain uninitialized.")
var/target = locate(href_list["target"]) var/target = locate(href_list["target"])
P.pda.create_message(P, target, 1) P.pda.create_message(P, target, 0)
return 1 return 1
/datum/pai_software/med_records /datum/pai_software/med_records

View File

@@ -615,7 +615,7 @@ var/global/list/robot_modules = list(
"Kent" = "toiletbot", "Kent" = "toiletbot",
"Bro" = "brobot", "Bro" = "brobot",
"Rich" = "maximillion", "Rich" = "maximillion",
"Basic" = "robotserv", "Basic" = "robotServ",
"Drone - Service" = "drone-service", "Drone - Service" = "drone-service",
"Drone - Hydro" = "drone-hydro", "Drone - Hydro" = "drone-hydro",
"Classic" = "service2", "Classic" = "service2",

View File

@@ -35,6 +35,9 @@
if (eyeobj) if (eyeobj)
return eyeobj.zMove(direction) return eyeobj.zMove(direction)
if (istype(src.loc,/obj/mecha))
return FALSE
// Check if we can actually travel a Z-level. // Check if we can actually travel a Z-level.
if (!can_ztravel(direction)) if (!can_ztravel(direction))
to_chat(src, "<span class='warning'>You lack means of travel in that direction.</span>") to_chat(src, "<span class='warning'>You lack means of travel in that direction.</span>")

View File

@@ -145,7 +145,7 @@
return return
if (user.a_intent == I_HELP && old_name && icon_state == "paper_plane") if (user.a_intent == I_HELP && old_name && icon_state == "paper_plane")
user.visible_message(span("notice", "the [src] unfolds \the [src]."), span("notice", "You unfold \the [src]."), "You hear paper rustling.") user.visible_message(span("notice", "\The [user] unfolds \the [src]."), span("notice", "You unfold \the [src]."), "You hear paper rustling.")
icon_state = initial(icon_state) icon_state = initial(icon_state)
throw_range = initial(throw_range) throw_range = initial(throw_range)
name = old_name name = old_name

View File

@@ -3,9 +3,8 @@
icon_state = "lawgiver" icon_state = "lawgiver"
item_state = "gun" item_state = "gun"
origin_tech = list(TECH_COMBAT = 6, TECH_MAGNET = 5) origin_tech = list(TECH_COMBAT = 6, TECH_MAGNET = 5)
projectile_type=/obj/item/projectile/bullet/pistol
fire_sound='sound/weapons/Gunshot_smg.ogg'
sel_mode = 1 sel_mode = 1
var/mode_check = 1
desc = "A highly advanced firearm for the modern police force. It has multiple voice-activated firing modes." desc = "A highly advanced firearm for the modern police force. It has multiple voice-activated firing modes."
var/dna = null//dna-locking the firearm var/dna = null//dna-locking the firearm
var/emagged = 0 //if the gun is emagged or not var/emagged = 0 //if the gun is emagged or not
@@ -18,56 +17,97 @@
firemodes = list( firemodes = list(
list( list(
mode_name="singleshot", mode_name = "singleshot",
charge_cost=50, charge_cost = 50,
fire_delay=3, fire_delay = 3,
recoil=1 recoil = 1,
burst = null,
move_delay = null,
accuracy = null,
dispersion = null,
projectile_type = /obj/item/projectile/bullet/pistol,
fire_sound = 'sound/weapons/Gunshot_smg.ogg'
), ),
list( list(
mode_name="rapidfire", mode_name = "rapidfire",
charge_cost=150, charge_cost = 150,
fire_delay=3, fire_delay = 3,
recoil=1, recoil = 1,
burst=3, burst = 3,
move_delay=4, move_delay = 4,
accuracy = list(0,-1,-1,-2,-2), accuracy = list(0,-1,-1,-2,-2),
dispersion = list(0.0, 0.6, 1.0) dispersion = list(0.0, 0.6, 1.0),
projectile_type = /obj/item/projectile/bullet/pistol,
fire_sound = 'sound/weapons/Gunshot_smg.ogg'
), ),
list( list(
mode_name="highex", mode_name = "highex",
charge_cost=300, charge_cost = 400,
fire_delay=6, fire_delay = 6,
recoil=3 recoil = 3,
burst = null,
move_delay = null,
accuracy = null,
dispersion = null,
projectile_type = /obj/item/projectile/bullet/gyro/law,
fire_sound = 'sound/effects/Explosion1.ogg'
), ),
list( list(
mode_name="stun", mode_name = "stun",
charge_cost=50, charge_cost = 50,
fire_delay=4, fire_delay = 4,
recoil=0 recoil = 0,
burst = null,
move_delay = null,
accuracy = null,
dispersion = null,
projectile_type = /obj/item/projectile/beam/stun,
fire_sound = 'sound/weapons/Taser.ogg'
), ),
list( list(
mode_name="hotshot", mode_name = "hotshot",
charge_cost=200, charge_cost = 250,
fire_delay=4, fire_delay = 4,
recoil=3 recoil = 3,
burst = null,
move_delay = null,
accuracy = null,
dispersion = null,
projectile_type = /obj/item/projectile/bullet/shotgun/incendiary,
fire_sound = 'sound/weapons/Gunshot.ogg'
), ),
list( list(
mode_name="armorpiercing", mode_name = "armorpiercing",
charge_cost=300, charge_cost = 130,
fire_delay=6, fire_delay = 6,
recoil=3 recoil = 3,
burst = null,
move_delay = null,
accuracy = null,
dispersion = null,
projectile_type = /obj/item/projectile/bullet/rifle/a556,
fire_sound = 'sound/weapons/Gunshot.ogg'
), ),
list( list(
mode_name="pellets", mode_name = "pellets",
charge_cost=300, charge_cost = 250,
fire_delay=6, fire_delay = 6,
recoil=3 recoil = 3,
burst = null,
move_delay = null,
accuracy = null,
dispersion = null,
projectile_type = /obj/item/projectile/bullet/pellet/shotgun,
fire_sound = 'sound/weapons/Gunshot.ogg'
) )
) )
/obj/item/weapon/gun/energy/lawgiver/Initialize() /obj/item/weapon/gun/energy/lawgiver/Initialize()
. = ..() . = ..()
listening_objects += src listening_objects += src
power_supply = new /obj/item/weapon/cell/device/variable(src, 2000)
var/datum/firemode/new_mode = firemodes[sel_mode]
new_mode.apply_to(src)
/obj/item/weapon/gun/energy/lawgiver/Destroy() /obj/item/weapon/gun/energy/lawgiver/Destroy()
listening_objects -= src listening_objects -= src
@@ -138,38 +178,24 @@
/* Firing Modes*/ /* Firing Modes*/
if(findtext(msg,"single")) if(findtext(msg,"single"))
sel_mode = 1 sel_mode = 1
projectile_type=/obj/item/projectile/bullet/pistol
fire_sound='sound/weapons/Gunshot_smg.ogg'
usr << "<span class='warning'>[src.name] is now set to single shot mode.</span>" usr << "<span class='warning'>[src.name] is now set to single shot mode.</span>"
else if(findtext(msg,"rapidfire")) else if(findtext(msg,"rapidfire"))
sel_mode = 2 sel_mode = 2
projectile_type=/obj/item/projectile/bullet/pistol
fire_sound='sound/weapons/Gunshot_smg.ogg'
usr << "<span class='warning'>[src.name] is now set to rapid fire mode.</span>" usr << "<span class='warning'>[src.name] is now set to rapid fire mode.</span>"
else if(findtext(msg,"highex") || findtext(msg,"grenade")) else if(findtext(msg,"highex") || findtext(msg,"grenade"))
sel_mode = 3 sel_mode = 3
projectile_type=/obj/item/projectile/bullet/gyro/law
fire_sound='sound/effects/Explosion1.ogg'
usr << "<span class='warning'>[src.name] is now set to high explosive mode.</span>" usr << "<span class='warning'>[src.name] is now set to high explosive mode.</span>"
else if(findtext(msg,"stun")) else if(findtext(msg,"stun"))
sel_mode = 4 sel_mode = 4
projectile_type=/obj/item/projectile/beam/stun
fire_sound='sound/weapons/Taser.ogg'
usr << "<span class='warning'>[src.name] is now set to stun mode.</span>" usr << "<span class='warning'>[src.name] is now set to stun mode.</span>"
else if(findtext(msg,"hotshot") || findtext(msg,"incendiary")) else if(findtext(msg,"hotshot") || findtext(msg,"incendiary"))
sel_mode = 5 sel_mode = 5
projectile_type=/obj/item/projectile/bullet/shotgun/incendiary
fire_sound='sound/weapons/Gunshot.ogg'
usr << "<span class='warning'>[src.name] is now set to incendiary mode.</span>" usr << "<span class='warning'>[src.name] is now set to incendiary mode.</span>"
else if(findtext(msg,"armorpiercing") || findtext(msg,"execution")) else if(findtext(msg,"armorpiercing") || findtext(msg,"execution"))
sel_mode = 6 sel_mode = 6
projectile_type=/obj/item/projectile/bullet/rifle/a556
fire_sound='sound/weapons/Gunshot.ogg'
usr << "<span class='warning'>[src.name] is now set to armorpiercing mode.</span>" usr << "<span class='warning'>[src.name] is now set to armorpiercing mode.</span>"
else if(findtext(msg,"pellets")) else if(findtext(msg,"pellets"))
sel_mode = 7 sel_mode = 7
projectile_type=/obj/item/projectile/bullet/pellet/shotgun
fire_sound='sound/weapons/Gunshot.ogg'
usr << "<span class='warning'>[src.name] is now set to pellet mode.</span>" usr << "<span class='warning'>[src.name] is now set to pellet mode.</span>"
/* Other Stuff */ /* Other Stuff */
else if(findtext(msg,"reset") && (findtext(msg,"user") || findtext(msg,"dna"))) else if(findtext(msg,"reset") && (findtext(msg,"user") || findtext(msg,"dna")))
@@ -188,5 +214,8 @@
message_enabled = 1 message_enabled = 1
message_disable = 0 message_disable = 0
play_message() play_message()
else
return if(mode_check != sel_mode)
var/datum/firemode/new_mode = firemodes[sel_mode]
new_mode.apply_to(src)
mode_check = sel_mode

View File

@@ -354,6 +354,9 @@
/datum/reagent/nutriment/flour/touch_turf(var/turf/simulated/T) /datum/reagent/nutriment/flour/touch_turf(var/turf/simulated/T)
if(!istype(T, /turf/space)) if(!istype(T, /turf/space))
if(locate(/obj/effect/decal/cleanable/flour) in T)
return
new /obj/effect/decal/cleanable/flour(T) new /obj/effect/decal/cleanable/flour(T)
/datum/reagent/nutriment/coco /datum/reagent/nutriment/coco

View File

@@ -38,6 +38,9 @@
if(istype(target, /mob/living/carbon/human)) if(istype(target, /mob/living/carbon/human))
var/mob/living/carbon/human/victim = target var/mob/living/carbon/human/victim = target
if(victim.isSynthetic())
return
var/obj/item/safe_thing = null var/obj/item/safe_thing = null
if(victim.wear_mask) if(victim.wear_mask)
if (victim.wear_mask.body_parts_covered & EYES) if (victim.wear_mask.body_parts_covered & EYES)

View File

@@ -4351,7 +4351,7 @@
filling_color = "#A8A8A8" filling_color = "#A8A8A8"
center_of_mass = list("x"=16, "y"=15) center_of_mass = list("x"=16, "y"=15)
nutriment_desc = list("chalk" = 3) nutriment_desc = list("chalk" = 3)
nutriment_amt = 3 nutriment_amt = 10
/obj/item/weapon/reagent_containers/food/snacks/liquidfood/Initialize() /obj/item/weapon/reagent_containers/food/snacks/liquidfood/Initialize()
. = ..() . = ..()

View File

@@ -29,8 +29,8 @@
/obj/machinery/computer/centrifuge/update_icon() /obj/machinery/computer/centrifuge/update_icon()
..() ..()
if(! (stat & (BROKEN|NOPOWER)) && (isolating || curing)) if(! (stat & (BROKEN|NOPOWER)))
icon_state = "centrifuge_moving" icon_state = (isolating||curing ? "centrifuge_moving" : "centrifuge")
/obj/machinery/computer/centrifuge/attack_hand(var/mob/user as mob) /obj/machinery/computer/centrifuge/attack_hand(var/mob/user as mob)
if(..()) return if(..()) return

View File

@@ -56,6 +56,37 @@
--> -->
<div class="commit sansserif"> <div class="commit sansserif">
<h2 class="date">09 September 2017</h2>
<h3 class="author">Ezuo updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Fixed the long broken Lawgiver code. It will now function as intended, with different firemodes using different charge values.</li>
</ul>
<h2 class="date">06 September 2017</h2>
<h3 class="author">Skull132 updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Cameras will no longer lag the server to death whenever you click to jump to a turf that's outside the station.</li>
</ul>
<h2 class="date">05 September 2017</h2>
<h3 class="author">Lohikar updated:</h3>
<ul class="changes bgimages16">
<li class="experiment">Storage code has been tweaked so ore bags should no longer take multiple seconds to fill/empty.</li>
<li class="tweak">The ore summoner should actually transport useful amounts of ore now.</li>
</ul>
<h2 class="date">27 August 2017</h2>
<h3 class="author">Printer16 updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Hunter killers can repair themselves now.</li>
</ul>
<h2 class="date">23 August 2017</h2>
<h3 class="author">Lohikar updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">Nursing Intern has been renamed to Medical Resident.</li>
</ul>
<h2 class="date">15 August 2017</h2> <h2 class="date">15 August 2017</h2>
<h3 class="author">Lohikar updated:</h3> <h3 class="author">Lohikar updated:</h3>
<ul class="changes bgimages16"> <ul class="changes bgimages16">

View File

@@ -4534,3 +4534,22 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
Lohikar: Lohikar:
- bugfix: Vaurca now have two hearts and one set of lungs as was originally intended - bugfix: Vaurca now have two hearts and one set of lungs as was originally intended
instead of three hearts and two sets of lungs. instead of three hearts and two sets of lungs.
2017-08-23:
Lohikar:
- tweak: Nursing Intern has been renamed to Medical Resident.
2017-08-27:
Printer16:
- bugfix: Hunter killers can repair themselves now.
2017-09-05:
Lohikar:
- experiment: Storage code has been tweaked so ore bags should no longer take multiple
seconds to fill/empty.
- tweak: The ore summoner should actually transport useful amounts of ore now.
2017-09-06:
Skull132:
- bugfix: Cameras will no longer lag the server to death whenever you click to jump
to a turf that's outside the station.
2017-09-09:
Ezuo:
- bugfix: Fixed the long broken Lawgiver code. It will now function as intended,
with different firemodes using different charge values.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 72 KiB

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 870 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 701 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 501 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 584 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 678 B

View File

@@ -41323,13 +41323,13 @@
dir = 10 dir = 10
}, },
/obj/effect/landmark/start{ /obj/effect/landmark/start{
name = "Nursing Intern" name = "Medical Resident"
}, },
/turf/simulated/floor/tiled/white, /turf/simulated/floor/tiled/white,
/area/medical/medbay2) /area/medical/medbay2)
"btj" = ( "btj" = (
/obj/effect/landmark/start{ /obj/effect/landmark/start{
name = "Nursing Intern" name = "Medical Resident"
}, },
/turf/simulated/floor/tiled/white, /turf/simulated/floor/tiled/white,
/area/medical/medbay2) /area/medical/medbay2)