diff --git a/baystation12.dme b/baystation12.dme index df06cf606bc..afcec78b11e 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -746,6 +746,7 @@ #include "code\modules\client\client defines.dm" #include "code\modules\client\client procs.dm" #include "code\modules\client\preferences.dm" +#include "code\modules\client\preferences_gear.dm" #include "code\modules\client\preferences_savefile.dm" #include "code\modules\client\preferences_spawnpoints.dm" #include "code\modules\client\preferences_toggles.dm" diff --git a/code/controllers/master_controller.dm b/code/controllers/master_controller.dm index cb52b2252fa..2ae5d1db1e8 100644 --- a/code/controllers/master_controller.dm +++ b/code/controllers/master_controller.dm @@ -79,13 +79,6 @@ datum/controller/game_controller/proc/setup() for(var/i=0, iGenerating resource distribution map." + var/datum/ore_distribution/O = new() + O.populate_distribution_map() + + //Set up spawn points. + populate_spawn_points() + + //Set up gear list. + populate_gear_list() + world << "\red \b Initializations complete." sleep(-1) diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm index 64408038f6e..c8be3a2351a 100644 --- a/code/game/jobs/job_controller.dm +++ b/code/game/jobs/job_controller.dm @@ -346,9 +346,42 @@ var/global/datum/controller/occupations/job_master proc/EquipRank(var/mob/living/carbon/human/H, var/rank, var/joined_late = 0) + if(!H) return 0 + var/datum/job/job = GetJob(rank) + var/list/spawn_in_storage = list() + if(job) + + //Equip custom gear loadout. + if(H.client.prefs.gear && H.client.prefs.gear.len) + + for(var/thing in H.client.prefs.gear) + var/datum/gear/G = gear_datums[thing] + if(G) + var/permitted + if(G.allowed_roles) + for(var/job_name in G.allowed_roles) + if(job.title == job_name) + permitted = 1 + else + permitted = 1 + + if(G.whitelisted && !is_alien_whitelisted(H, G.whitelisted)) + permitted = 0 + + if(!permitted) + H << "\red Your current job or whitelist status does not permit you to spawn with [thing]!" + continue + + if(G.slot) + H.equip_to_slot_or_del(new G.path(H), G.slot) + else + spawn_in_storage += thing + + + //Equip job items. job.equip(H) else H << "Your job is [rank] and the game just can't handle it! Please report this bug to an administrator." @@ -428,17 +461,28 @@ var/global/datum/controller/occupations/job_master new /obj/item/weapon/storage/box/survival(BPK) H.equip_to_slot_or_del(BPK, slot_back,1) + //Deferred item spawning. + var/obj/item/weapon/storage/B = locate(/obj/item/weapon/storage/backpack) in H.contents + + if(isnull(B) || istype(B)) + B = locate(/obj/item/weapon/storage/box) in H.contents + + if(!isnull(B)) + for(var/thing in spawn_in_storage) + var/datum/gear/G = gear_datums[thing] + new G.path(B) + //TODO: Generalize this by-species if(H.species) if(H.species.name == "Tajaran" || H.species.name == "Unathi") H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(H),slot_shoes,1) else if(H.species.name == "Vox") - H.equip_to_slot_or_del(new /obj/item/clothing/mask/breath(src), slot_wear_mask) + H.equip_to_slot_or_del(new /obj/item/clothing/mask/breath(H), slot_wear_mask) if(!H.r_hand) - H.equip_to_slot_or_del(new /obj/item/weapon/tank/nitrogen(src), slot_r_hand) + H.equip_to_slot_or_del(new /obj/item/weapon/tank/nitrogen(H), slot_r_hand) H.internal = H.r_hand else if (!H.l_hand) - H.equip_to_slot_or_del(new /obj/item/weapon/tank/nitrogen(src), slot_l_hand) + H.equip_to_slot_or_del(new /obj/item/weapon/tank/nitrogen(H), slot_l_hand) H.internal = H.l_hand H.internals.icon_state = "internal1" diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index c05a0d98390..448662c4516 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -73,8 +73,9 @@ datum/preferences var/r_eyes = 0 //Eye color var/g_eyes = 0 //Eye color var/b_eyes = 0 //Eye color - var/species = "Human" + var/species = "Human" //Species datum to use. var/language = "None" //Secondary language + var/list/gear //Custom/fluff item loadout. //Mob preview var/icon/preview_icon = null @@ -104,7 +105,6 @@ datum/preferences // maps each organ to either null(intact), "cyborg" or "amputated" // will probably not be able to do this for head and torso ;) var/list/organ_data = list() - var/list/player_alt_titles = new() // the default name of a job like "Medical Doctor" var/flavor_text = "" @@ -132,6 +132,8 @@ datum/preferences gender = pick(MALE, FEMALE) real_name = random_name(gender) + gear = list() + /datum/preferences proc/ZeroSkills(var/forced = 0) for(var/V in SKILLS) for(var/datum/skill/S in SKILLS[V]) @@ -264,7 +266,27 @@ datum/preferences if(config.allow_Metadata) dat += "OOC Notes: Edit
" - dat += "
Occupation Choices
" + dat += "
Custom Loadout: " + var/total_cost = 0 + + if(isnull(gear) || !islist(gear)) gear = list() + + if(gear && gear.len) + dat += "
" + for(var/gear_name in gear) + if(gear_datums[gear_name]) + var/datum/gear/G = gear_datums[gear_name] + total_cost += G.cost + dat += "[gear_name] \[remove\]
" + + dat += "Used: [total_cost] points." + else + dat += "none." + + if(total_cost < MAX_GEAR_COST) + dat += " \[add\]" + + dat += "

Occupation Choices
" dat += "\tSet Preferences
" dat += "
Body " @@ -835,6 +857,48 @@ datum/preferences ShowChoices(user) return 1 + else if (href_list["preference"] == "loadout") + + if(href_list["task"] == "input") + + var/list/valid_gear_choices = list() + + for(var/gear_name in gear_datums) + var/datum/gear/G = gear_datums[gear_name] + if(G.whitelisted && !is_alien_whitelisted(user, G.whitelisted)) + continue + valid_gear_choices += gear_name + + var/choice = input(user, "Select gear to add: ") as null|anything in valid_gear_choices + + if(choice && gear_datums[choice]) + + var/total_cost = 0 + + if(isnull(gear) || !islist(gear)) gear = list() + + if(gear && gear.len) + for(var/gear_name in gear) + if(gear_datums[gear_name]) + var/datum/gear/G = gear_datums[gear_name] + total_cost += G.cost + + var/datum/gear/C = gear_datums[choice] + total_cost += C.cost + if(C && total_cost <= MAX_GEAR_COST) + gear += choice + user << "\blue Added [choice] for [C.cost] points ([MAX_GEAR_COST - total_cost] points remaining)." + else + user << "\red That item will exceed the maximum loadout cost of [MAX_GEAR_COST] points." + + else if(href_list["task"] == "remove") + var/to_remove = href_list["gear"] + if(!to_remove) return + for(var/gear_name in gear) + if(gear_name == to_remove) + gear -= gear_name + break + switch(href_list["task"]) if("random") switch(href_list["preference"]) @@ -962,14 +1026,14 @@ datum/preferences var/datum/language/lang = all_languages[L] if((!(lang.flags & RESTRICTED)) && (is_alien_whitelisted(user, L)||(!( lang.flags & WHITELISTED ))||(S && (L in S.secondary_langs)))) new_languages += lang - + //Apparently there's some PHP script that needs to be updated in order to give people whitelist languages. //This workaround should be removed once that has been properly updated if (lang.name == "Siik'maas") new_languages |= all_languages["Siik'tajr"] if (lang.name == "Siik'tajr") new_languages |= all_languages["Siik'maas"] - + languages_available = 1 if(!(languages_available)) diff --git a/code/modules/client/preferences_gear.dm b/code/modules/client/preferences_gear.dm new file mode 100644 index 00000000000..e8df54ddfd8 --- /dev/null +++ b/code/modules/client/preferences_gear.dm @@ -0,0 +1,404 @@ +var/global/list/gear_datums = list() + +proc/populate_gear_list() + for(var/type in typesof(/datum/gear)-/datum/gear) + var/datum/gear/G = new type() + gear_datums[G.display_name] = G + +/datum/gear + var/display_name //Name/index. + var/path //Path to item. + var/cost //Number of points used. + var/slot //Slot to equip to. + var/list/allowed_roles //Roles that can spawn with this item. + var/whitelisted //Term to check the whitelist for.. + +//Standard gear datums. + +/datum/gear/cards + display_name = "deck of cards" + path = /obj/item/weapon/deck + cost = 2 + +/datum/gear/dice + display_name = "d20" + path = /obj/item/weapon/dice/d20 + cost = 1 + +/datum/gear/comb + display_name = "purple comb" + path = /obj/item/weapon/fluff/cado_keppel_1 + cost = 1 + +/datum/gear/tie_horrible + display_name = "horrible tie" + path = /obj/item/clothing/tie/horrible + cost = 2 + +/datum/gear/tie_blue + display_name = "blue tie" + path = /obj/item/clothing/tie/blue + cost = 2 + +/datum/gear/tie_red + display_name = "red tie" + path = /obj/item/clothing/tie/red + cost = 2 + +/datum/gear/hairflower + display_name = "hair flower pin" + path = /obj/item/clothing/head/hairflower + cost = 2 + slot = slot_head + +/datum/gear/bandana + display_name = "pirate bandana" + path = /obj/item/clothing/head/bandana + cost = 3 + slot = slot_head + +/datum/gear/overalls + display_name = "overalls" + path = /obj/item/clothing/suit/apron/overalls + cost = 2 + slot = slot_wear_suit + +/datum/gear/wcoat + display_name = "waistcoat" + path = /obj/item/clothing/suit/wcoat + cost = 2 + slot = slot_wear_suit + +/datum/gear/prescription + display_name = "prescription sunglasses" + path = /obj/item/clothing/glasses/sunglasses/prescription + cost = 3 + slot = slot_glasses + +/datum/gear/eyepatch + display_name = "eyepatch" + path = /obj/item/clothing/glasses/eyepatch + cost = 3 + slot = slot_glasses + +/datum/gear/flatcap + display_name = "flat cap" + path = /obj/item/clothing/head/flatcap + cost = 2 + slot = slot_head + +/datum/gear/labcoat + display_name = "labcoat" + path = /obj/item/clothing/suit/storage/labcoat + cost = 3 + slot = slot_wear_suit + +/datum/gear/sandal + display_name = "sandals" + path = /obj/item/clothing/shoes/sandal + cost = 1 + slot = slot_shoes + +/datum/gear/leather + display_name = "leather shoes" + path = /obj/item/clothing/shoes/leather + cost = 2 + slot = slot_shoes + +/datum/gear/dress_shoes + display_name = "dress shoes" + path = /obj/item/clothing/shoes/centcom + cost = 2 + slot = slot_shoes + +/datum/gear/black_gloves + display_name = "black gloves" + path = /obj/item/clothing/gloves/black + cost = 1 + slot = slot_gloves + +/datum/gear/red_gloves + display_name = "red gloves" + path = /obj/item/clothing/gloves/red + cost = 1 + slot = slot_gloves + +/datum/gear/blue_gloves + display_name = "blue gloves" + path = /obj/item/clothing/gloves/blue + cost = 1 + slot = slot_gloves + +/datum/gear/orange_gloves + display_name = "orange gloves" + path = /obj/item/clothing/gloves/orange + cost = 1 + slot = slot_gloves + +/datum/gear/purple_gloves + display_name = "purple gloves" + path = /obj/item/clothing/gloves/purple + cost = 1 + slot = slot_gloves + +/datum/gear/brown_gloves + display_name = "brown gloves" + path = /obj/item/clothing/gloves/brown + cost = 1 + slot = slot_gloves + +/datum/gear/green_gloves + display_name = "green gloves" + path = /obj/item/clothing/gloves/green + cost = 2 + slot = slot_gloves + +/datum/gear/white_gloves + display_name = "white gloves" + path = /obj/item/clothing/gloves/white + cost = 2 + slot = slot_gloves + +/datum/gear/black_shoes + display_name = "black shoes" + path = /obj/item/clothing/shoes/black + cost = 2 + slot = slot_shoes + +/datum/gear/blue_shoes + display_name = "blue shoes" + path = /obj/item/clothing/shoes/blue + cost = 2 + slot = slot_shoes + +/datum/gear/brown_shoes + display_name = "brown shoes" + path = /obj/item/clothing/shoes/brown + cost = 2 + slot = slot_shoes + +/datum/gear/green_shoes + display_name = "green shoes" + path = /obj/item/clothing/shoes/green + cost = 2 + slot = slot_shoes + +/datum/gear/orange_shoes + display_name = "orange shoes" + path = /obj/item/clothing/shoes/orange + cost = 2 + slot = slot_shoes + +/datum/gear/purple_shoes + display_name = "purple shoes" + path = /obj/item/clothing/shoes/purple + cost = 2 + slot = slot_shoes + +/datum/gear/red_shoes + display_name = "red shoes" + path = /obj/item/clothing/shoes/red + cost = 2 + slot = slot_shoes + +/datum/gear/white_shoes + display_name = "white shoes" + path = /obj/item/clothing/shoes/white + cost = 2 + slot = slot_shoes + +/datum/gear/yellow_shoes + display_name = "yellow shoes" + path = /obj/item/clothing/shoes/yellow + cost = 2 + slot = slot_shoes + +/datum/gear/jackboots + display_name = "jackboots" + path = /obj/item/clothing/shoes/jackboots + cost = 3 + slot = slot_shoes + +/datum/gear/webbing + display_name = "webbing" + path = /obj/item/clothing/tie/storage/webbing + cost = 1 + +/datum/gear/armband + display_name = "red armband" + path = /obj/item/clothing/tie/armband + cost = 1 + +/datum/gear/armband_cargo + display_name = "cargo armband" + path = /obj/item/clothing/tie/armband/cargo + cost = 1 + +/datum/gear/armband_engineering + display_name = "engineering armband" + path = /obj/item/clothing/tie/armband/engine + cost = 1 + +/datum/gear/armband_science + display_name = "science armband" + path = /obj/item/clothing/tie/armband/science + cost = 1 + +/datum/gear/armband_hydroponics + display_name = "hydroponics armband" + path = /obj/item/clothing/tie/armband/hydro + cost = 1 + +/datum/gear/armband_medical + display_name = "medical armband" + path = /obj/item/clothing/tie/armband/med + cost = 1 + +/datum/gear/armband_emt + display_name = "EMT armband" + path = /obj/item/clothing/tie/armband/medgreen + cost = 1 + +/datum/gear/skirt_blue + display_name = "blue plaid skirt" + path = /obj/item/clothing/under/dress/plaid_blue + slot = slot_w_uniform + cost = 3 + +/datum/gear/skirt_red + display_name = "red plaid skirt" + path = /obj/item/clothing/under/dress/plaid_red + slot = slot_w_uniform + cost = 3 + +/datum/gear/skirt_purple + display_name = "purple plaid skirt" + path = /obj/item/clothing/under/dress/plaid_purple + slot = slot_w_uniform + cost = 3 + +/datum/gear/skirt_black + display_name = "black skirt" + path = /obj/item/clothing/under/blackskirt + slot = slot_w_uniform + cost = 3 + +/datum/gear/sundress + display_name = "sundress" + path = /obj/item/clothing/under/sundress + slot = slot_w_uniform + cost = 3 + +/datum/gear/uniform_captain + display_name = "captain's dress uniform" + path = /obj/item/clothing/under/dress/dress_cap + slot = slot_w_uniform + cost = 3 + allowed_roles = list("Captain") + +/datum/gear/uniform_hop + display_name = "HoP dress uniform" + path = /obj/item/clothing/under/dress/dress_hop + slot = slot_w_uniform + cost = 3 + allowed_roles = list("Head of Personnel") + +/datum/gear/uniform_hr + display_name = "HR director uniform" + path = /obj/item/clothing/under/dress/dress_hr + slot = slot_w_uniform + cost = 3 + allowed_roles = list("Head of Personnel") + +/datum/gear/kilt + display_name = "kilt" + path = /obj/item/clothing/under/kilt + slot = slot_w_uniform + cost = 3 + +/datum/gear/exec_suit + display_name = "executive suit" + path = /obj/item/clothing/under/suit_jacket/really_black + slot = slot_w_uniform + cost = 3 + +//Security +/datum/gear/security + display_name = "Security HUD" + path = /obj/item/clothing/glasses/hud/security + cost = 3 + slot = slot_glasses + allowed_roles = list("Security Officer","Head of Security","Warden") + +/datum/gear/black_vest + display_name = "black webbing vest" + path = /obj/item/clothing/tie/storage/black_vest + cost = 3 + allowed_roles = list("Security Officer","Head of Security","Warden") + +/datum/gear/armpit + display_name = "shoulder holster" + path = /obj/item/clothing/tie/holster/armpit + cost = 3 + allowed_roles = list("Captain", "Head of Personnel", "Security Officer", "Head of Security") + +/datum/gear/sec_beret + display_name = "security beret" + path = /obj/item/clothing/head/beret/sec + cost = 1 + slot = slot_head + allowed_roles = list("Security Officer","Head of Security","Warden") + +//Engineering +/datum/gear/eng_beret + display_name = "engineering beret" + path = /obj/item/clothing/head/beret/eng + cost = 1 + slot = slot_head + allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer") + +/datum/gear/brown_vest + display_name = "brown webbing vest" + path = /obj/item/clothing/tie/storage/brown_vest + cost = 3 + allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer") + +/datum/gear/engineer_bandana + display_name = "engineering bandana" + path = /obj/item/clothing/head/helmet/greenbandana/fluff/taryn_kifer_1 + cost = 2 + allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer") + +//Science +/datum/gear/scanning_goggles + display_name = "scanning goggles" + path = /obj/item/clothing/glasses/fluff/uzenwa_sissra_1 + cost = 2 + allowed_roles = list("Roboticist", "Scientist", "Research Director") + +//Species-specific gear datums. +/datum/gear/zhan_furs + display_name = "Zhan-Khazan furs" + path = /obj/item/clothing/suit/tajaran/furs + cost = 3 + whitelisted = "Tajaran" + +/datum/gear/zhan_scarf + display_name = "Zhan-Khazan headscarf" + path = /obj/item/clothing/head/tajaran/scarf + cost = 2 + whitelisted = "Tajaran" + +/datum/gear/unathi_robe + display_name = "roughspun robe" + path = /obj/item/clothing/suit/unathi/robe + cost = 3 + slot = slot_wear_suit + whitelisted = "Unathi" + +/datum/gear/unathi_mantle + display_name = "hide mantle" + path = /obj/item/clothing/suit/unathi/mantle + cost = 2 + slot = slot_wear_suit + whitelisted = "Unathi" diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 68bb5a9e3eb..ef3b8e5c035 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -155,6 +155,7 @@ S["skills"] >> skills S["skill_specialization"] >> skill_specialization S["organ_data"] >> organ_data + S["gear"] >> gear S["nanotrasen_relation"] >> nanotrasen_relation //S["skin_style"] >> skin_style @@ -211,6 +212,7 @@ if(isnull(disabilities)) disabilities = 0 if(!player_alt_titles) player_alt_titles = new() if(!organ_data) src.organ_data = list() + if(!gear) src.gear = list() //if(!skin_style) skin_style = "Default" return 1 @@ -248,6 +250,7 @@ S["undershirt"] << undershirt S["backbag"] << backbag S["b_type"] << b_type + S["spawnpoint"] << spawnpoint //Jobs S["alternate_option"] << alternate_option @@ -273,6 +276,7 @@ S["skills"] << skills S["skill_specialization"] << skill_specialization S["organ_data"] << organ_data + S["gear"] << gear S["nanotrasen_relation"] << nanotrasen_relation //S["skin_style"] << skin_style diff --git a/code/modules/clothing/suits/alien.dm b/code/modules/clothing/suits/alien.dm index 5b664f21b35..539efcaacc9 100644 --- a/code/modules/clothing/suits/alien.dm +++ b/code/modules/clothing/suits/alien.dm @@ -12,4 +12,18 @@ desc = "A rather grisly selection of cured hides and skin, sewn together to form a ragged mantle." icon_state = "mantle-unathi" item_state = "mantle-unathi" - body_parts_covered = UPPER_TORSO \ No newline at end of file + body_parts_covered = UPPER_TORSO + +//Taj clothing. + +/obj/item/clothing/suit/tajaran/furs + name = "heavy furs" + desc = "A traditional Zhan-Khazan garment." + icon_state = "zhan_furs" + item_state = "zhan_furs" + body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS + +/obj/item/clothing/head/tajaran/scarf + name = "headscarf" + desc = "A scarf of coarse fabric. Seems to have ear-holes." + icon_state = "zhan_scarf" \ No newline at end of file diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index c182d820246..3e4cf1a3d1b 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -294,13 +294,13 @@ /obj/item/clothing/under/dress/dress_cap - name = "captain dress uniform" + name = "captain's dress uniform" desc = "Feminine fashion for the style concious captain." icon_state = "dress_cap" item_color = "dress_cap" /obj/item/clothing/under/dress/dress_hop - name = "head of personal dress uniform" + name = "head of personnel dress uniform" desc = "Feminine fashion for the style concious HoP." icon_state = "dress_hop" item_color = "dress_hop" diff --git a/code/modules/clothing/under/ties.dm b/code/modules/clothing/under/ties.dm index 57cc66865b1..d8b1bdf70b0 100644 --- a/code/modules/clothing/under/ties.dm +++ b/code/modules/clothing/under/ties.dm @@ -22,7 +22,7 @@ has_suit = S loc = has_suit has_suit.overlays += inv_overlay - + user << "You attach [src] to [has_suit]." src.add_fingerprint(user) @@ -157,38 +157,38 @@ item_color = "red" /obj/item/clothing/tie/armband/cargo - name = "cargo bay guard armband" - desc = "An armband, worn by the station's security forces to display which department they're assigned to. This one is brown." + name = "cargo armband" + desc = "An armband, worn by the crew to display which department they're assigned to. This one is brown." icon_state = "cargo" item_color = "cargo" /obj/item/clothing/tie/armband/engine - name = "engineering guard armband" - desc = "An armband, worn by the station's security forces to display which department they're assigned to. This one is orange with a reflective strip!" + name = "engineering armband" + desc = "An armband, worn by the crew to display which department they're assigned to. This one is orange with a reflective strip!" icon_state = "engie" item_color = "engie" /obj/item/clothing/tie/armband/science - name = "science guard armband" - desc = "An armband, worn by the station's security forces to display which department they're assigned to. This one is purple." + name = "science armband" + desc = "An armband, worn by the crew to display which department they're assigned to. This one is purple." icon_state = "rnd" item_color = "rnd" /obj/item/clothing/tie/armband/hydro - name = "hydroponics guard armband" - desc = "An armband, worn by the station's security forces to display which department they're assigned to. This one is green and blue." + name = "hydroponics armband" + desc = "An armband, worn by the crew to display which department they're assigned to. This one is green and blue." icon_state = "hydro" item_color = "hydro" /obj/item/clothing/tie/armband/med - name = "medical guard armband" - desc = "An armband, worn by the station's security forces to display which department they're assigned to. This one is white." + name = "medical armband" + desc = "An armband, worn by the crew to display which department they're assigned to. This one is white." icon_state = "med" item_color = "med" /obj/item/clothing/tie/armband/medgreen - name = "medical guard armband" - desc = "An armband, worn by the station's security forces to display which department they're assigned to. This one is white and green." + name = "EMT armband" + desc = "An armband, worn by the crew to display which department they're assigned to. This one is white and green." icon_state = "medgreen" item_color = "medgreen" @@ -208,16 +208,16 @@ if(holstered) user << "\red There is already a [holstered] holstered here!" return - + if (!istype(I, /obj/item/weapon/gun)) user << "\red Only guns can be holstered!" return - + var/obj/item/weapon/gun/W = I if (!can_holster(W)) user << "\red This [W] won't fit in the [src]!" return - + holstered = W user.drop_from_inventory(holstered) holstered.loc = src @@ -227,7 +227,7 @@ /obj/item/clothing/tie/holster/proc/unholster(mob/user as mob) if(!holstered) return - + if(istype(user.get_active_hand(),/obj) && istype(user.get_inactive_hand(),/obj)) user << "\red You need an empty hand to draw the [holstered]!" else @@ -246,7 +246,7 @@ if (holstered) unholster(user) return - + ..(user) /obj/item/clothing/tie/holster/attackby(obj/item/W as obj, mob/user as mob) @@ -280,7 +280,7 @@ set src in usr if(!istype(usr, /mob/living)) return if(usr.stat) return - + var/obj/item/clothing/tie/holster/H = null if (istype(src, /obj/item/clothing/tie/holster)) H = src @@ -288,7 +288,7 @@ var/obj/item/clothing/under/S = src if (S.hastie) H = S.hastie - + if (!H) usr << "/red Something is very wrong." @@ -330,14 +330,14 @@ if (has_suit) //if we are part of a suit hold.open(user) return - + if (hold.handle_attack_hand(user)) //otherwise interact as a regular storage item ..(user) /obj/item/clothing/tie/storage/MouseDrop(obj/over_object as obj) if (has_suit) return - + if (hold.handle_mousedrop(usr, over_object)) ..(over_object) @@ -471,6 +471,6 @@ "/obj/item/weapon/kitchen/utensil/pknife",\ "/obj/item/weapon/kitchenknife",\ "/obj/item/weapon/kitchenknife/ritual") - + new /obj/item/weapon/hatchet/unathiknife(hold) new /obj/item/weapon/hatchet/unathiknife(hold) diff --git a/code/modules/mining/drilling/distribution.dm b/code/modules/mining/drilling/distribution.dm index 2ca9a3f685c..1b4c698ea9b 100644 --- a/code/modules/mining/drilling/distribution.dm +++ b/code/modules/mining/drilling/distribution.dm @@ -75,9 +75,6 @@ Deep minerals: //Halfassed diamond-square algorithm with some fuckery since it's a single dimension array. /datum/ore_distribution/proc/populate_distribution_map() - //Announce it! - world << "Generating resource distribution map." - //Seed beginning values. var/x = 1 var/y = 1 diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index f4edb30e240..4f6368ad6fa 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1458,3 +1458,39 @@ M.apply_damage(50,BRUTE) if(M.stat == 2) M.gib() + +/mob/living/carbon/human/proc/commune() + set category = "IC" + set name = "Commune with creature" + set desc = "Send a telepathic message to an unlucky recipient." + + var/list/targets = list() + var/target = null + var/text = null + + targets += getmobs() //Fill list, prompt user with list + target = input("Select a creature!", "Speak to creature", null, null) as null|anything in targets + + if(!target) return + + text = input("What would you like to say?", "Speak to creature", null, null) + + text = trim(copytext(sanitize(text), 1, MAX_MESSAGE_LEN)) + + if(!text) return + + var/mob/M = targets[target] + + if(istype(M, /mob/dead/observer) || M.stat == DEAD) + src << "Not even a [src.species.name] can speak to the dead." + return + + log_say("[key_name(src)] communed to [key_name(M)]: [text]") + + M << "\blue Like lead slabs crashing into the ocean, alien thoughts drop into your mind: [text]" + if(istype(M,/mob/living/carbon/human)) + var/mob/living/carbon/human/H = M + if(H.species.name == src.species.name) + return + H << "\red Your nose begins to bleed..." + H.drip(1) diff --git a/code/modules/mob/living/carbon/species.dm b/code/modules/mob/living/carbon/species.dm index c2ecf6d539d..feb74deb548 100644 --- a/code/modules/mob/living/carbon/species.dm +++ b/code/modules/mob/living/carbon/species.dm @@ -215,6 +215,7 @@ /datum/species/vox/armalis/handle_post_spawn(var/mob/living/carbon/human/H) H.verbs += /mob/living/carbon/human/proc/gut + H.verbs += /mob/living/carbon/human/proc/commune ..() /datum/species/vox/armalis diff --git a/code/modules/mob/living/simple_animal/vox.dm b/code/modules/mob/living/simple_animal/vox.dm deleted file mode 100644 index f3354ce8561..00000000000 --- a/code/modules/mob/living/simple_animal/vox.dm +++ /dev/null @@ -1,160 +0,0 @@ -/mob/living/simple_animal/vox/armalis/ - - name = "serpentine alien" - real_name = "serpentine alien" - desc = "A one-eyed, serpentine creature, half-machine, easily nine feet from tail to beak!" - icon = 'icons/mob/vox.dmi' - icon_state = "armalis" - icon_living = "armalis" - maxHealth = 500 - health = 500 - response_harm = "slashes at the" - harm_intent_damage = 0 - melee_damage_lower = 30 - melee_damage_upper = 40 - attacktext = "slammed its enormous claws into" - speed = -1 - wall_smash = 1 - attack_sound = 'sound/weapons/bladeslice.ogg' - status_flags = 0 - universal_speak = 1 - - var/armour = null - var/amp = null - var/quills = 3 - -/mob/living/simple_animal/vox/armalis/Die() - - living_mob_list -= src - dead_mob_list += src - stat = DEAD - visible_message("\red [src] shudders violently and explodes!","\red You feel your body rupture!") - explosion(get_turf(loc), -1, -1, 3, 5) - src.gib() - return - -/mob/living/simple_animal/vox/armalis/attackby(var/obj/item/O as obj, var/mob/user as mob) - if(O.force) - if(O.force >= 25) - var/damage = O.force - if (O.damtype == HALLOSS) - damage = 0 - health -= damage - for(var/mob/M in viewers(src, null)) - if ((M.client && !( M.blinded ))) - M.show_message("\red \b [src] has been attacked with the [O] by [user]. ") - else - for(var/mob/M in viewers(src, null)) - if ((M.client && !( M.blinded ))) - M.show_message("\red \b The [O] bounces harmlessly off of [src]. ") - else - usr << "\red This weapon is ineffective, it does no damage." - for(var/mob/M in viewers(src, null)) - if ((M.client && !( M.blinded ))) - M.show_message("\red [user] gently taps [src] with the [O]. ") - -/mob/living/simple_animal/vox/armalis/verb/fire_quill(mob/target as mob in oview()) - - set name = "Fire quill" - set desc = "Fires a viciously pointed quill at a high speed." - set category = "Alien" - - if(quills<=0) - return - - src << "\red You launch a razor-sharp quill at [target]!" - for(var/mob/O in oviewers()) - if ((O.client && !( O.blinded ))) - O << "\red [src] launches a razor-sharp quill at [target]!" - - var/obj/item/weapon/arrow/quill/Q = new(loc) - Q.fingerprintslast = src.ckey - Q.throw_at(target,10,30) - quills-- - - spawn(100) - src << "\red You feel a fresh quill slide into place." - quills++ - -/mob/living/simple_animal/vox/armalis/verb/message_mob() - set category = "Alien" - set name = "Commune with creature" - set desc = "Send a telepathic message to an unlucky recipient." - - var/list/targets = list() - var/target = null - var/text = null - - targets += getmobs() //Fill list, prompt user with list - target = input("Select a creature!", "Speak to creature", null, null) as null|anything in targets - text = input("What would you like to say?", "Speak to creature", null, null) - - if (!target || !text) - return - - var/mob/M = targets[target] - - if(istype(M, /mob/dead/observer) || M.stat == DEAD) - src << "Not even the armalis can speak to the dead." - return - - M << "\blue Like lead slabs crashing into the ocean, alien thoughts drop into your mind: [text]" - if(istype(M,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = M - if(H.species.name == "Vox") - return - H << "\red Your nose begins to bleed..." - H.drip(1) - -/mob/living/simple_animal/vox/armalis/verb/shriek() - set category = "Alien" - set name = "Shriek" - set desc = "Give voice to a psychic shriek." - -/mob/living/simple_animal/vox/armalis/attackby(var/obj/item/O as obj, var/mob/user as mob) - if(istype(O,/obj/item/vox/armalis_armour)) - user.drop_item() - armour = O - speed = 1 - maxHealth += 200 - health += 200 - O.loc = src - visible_message("\blue [src] is quickly outfitted in [O] by [user].","\blue You quickly outfit [src] in [O].") - regenerate_icons() - return - if(istype(O,/obj/item/vox/armalis_amp)) - user.drop_item() - amp = O - O.loc = src - visible_message("\blue [src] is quickly outfitted in [O] by [user].","\blue You quickly outfit [src] in [O].") - regenerate_icons() - return - return ..() - -/mob/living/simple_animal/vox/armalis/regenerate_icons() - - overlays = list() - if(armour) - var/icon/armour = image('icons/mob/vox.dmi',"armour") - speed = 1 - overlays += armour - if(amp) - var/icon/amp = image('icons/mob/vox.dmi',"amplifier") - overlays += amp - return - -/obj/item/vox/armalis_armour - - name = "strange armour" - desc = "Hulking reinforced armour for something huge." - icon = 'icons/obj/clothing/suits.dmi' - icon_state = "armalis_armour" - item_state = "armalis_armour" - -/obj/item/vox/armalis_amp - - name = "strange lenses" - desc = "A series of metallic lenses and chains." - icon = 'icons/obj/clothing/hats.dmi' - icon_state = "amp" - item_state = "amp" \ No newline at end of file diff --git a/code/setup.dm b/code/setup.dm index a86e0665765..55c15102348 100644 --- a/code/setup.dm +++ b/code/setup.dm @@ -811,4 +811,6 @@ var/list/RESTRICTED_CAMERA_NETWORKS = list( //Those networks can only be accesse #define IS_DIONA 1 #define IS_VOX 2 #define IS_SKRELL 3 -#define IS_UNATHI 4 \ No newline at end of file +#define IS_UNATHI 4 + +#define MAX_GEAR_COST 5 //Used in chargen for loadout limit. \ No newline at end of file diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index c4453316df9..feafab49836 100644 Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ diff --git a/icons/mob/species/tajaran/suit.dmi b/icons/mob/species/tajaran/suit.dmi index 620da66a60c..d0eca318fd2 100644 Binary files a/icons/mob/species/tajaran/suit.dmi and b/icons/mob/species/tajaran/suit.dmi differ diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index 8e5903fbc67..9b8c463bab0 100644 Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index d2d32b4b1d1..31be71e8e9e 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index 31a605f9352..7506de201e0 100644 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ