diff --git a/baystation12.dme b/baystation12.dme index df06cf606b..afcec78b11 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 cb52b2252f..2ae5d1db1e 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/defines/obj/weapon.dm b/code/defines/obj/weapon.dm index 93cd982c10..dd662e40c0 100644 --- a/code/defines/obj/weapon.dm +++ b/code/defines/obj/weapon.dm @@ -450,16 +450,6 @@ usr.client.eye = target - -/obj/item/weapon/syntiflesh - name = "syntiflesh" - desc = "Meat that appears...strange..." - icon = 'icons/obj/food.dmi' - icon_state = "meat" - flags = FPRINT | TABLEPASS | CONDUCT - w_class = 2.0 - origin_tech = "biotech=2" - /* /obj/item/weapon/cigarpacket name = "Pete's Cuban Cigars" diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm index 64408038f6..c8be3a2351 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/game/machinery/kitchen/processor.dm b/code/game/machinery/kitchen/processor.dm index 161dfc01ce..3b86ea400e 100644 --- a/code/game/machinery/kitchen/processor.dm +++ b/code/game/machinery/kitchen/processor.dm @@ -28,18 +28,6 @@ input = /obj/item/weapon/reagent_containers/food/snacks/meat output = /obj/item/weapon/reagent_containers/food/snacks/meatball - meat2 - input = /obj/item/weapon/syntiflesh - output = /obj/item/weapon/reagent_containers/food/snacks/meatball -/* - monkeymeat - input = /obj/item/weapon/reagent_containers/food/snacks/meat/monkey - output = /obj/item/weapon/reagent_containers/food/snacks/meatball - - humanmeat - input = /obj/item/weapon/reagent_containers/food/snacks/meat/human - output = /obj/item/weapon/reagent_containers/food/snacks/meatball -*/ potato input = /obj/item/weapon/reagent_containers/food/snacks/grown/potato output = /obj/item/weapon/reagent_containers/food/snacks/rawsticks diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm index 01f06f14a4..19bbcf36f4 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm @@ -71,7 +71,9 @@ "You hear metal clanking") unbuckle() src.add_fingerprint(user) - return + return 1 + + return 0 /obj/structure/stool/bed/proc/buckle_mob(mob/M as mob, mob/user as mob) if (!ticker) @@ -112,6 +114,18 @@ icon_state = "down" anchored = 0 +/obj/structure/stool/bed/roller/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(istype(W,/obj/item/roller_holder)) + if(buckled_mob) + manual_unbuckle() + else + visible_message("[user] collapses \the [src.name].") + new/obj/item/roller(get_turf(src)) + spawn(0) + del(src) + return + ..() + /obj/item/roller name = "roller bed" desc = "A collapsed roller bed that can be carried around." @@ -119,11 +133,47 @@ icon_state = "folded" w_class = 4.0 // Can't be put in backpacks. Oh well. - attack_self(mob/user) +/obj/item/roller/attack_self(mob/user) var/obj/structure/stool/bed/roller/R = new /obj/structure/stool/bed/roller(user.loc) R.add_fingerprint(user) del(src) +/obj/item/roller/attackby(obj/item/weapon/W as obj, mob/user as mob) + + if(istype(W,/obj/item/roller_holder)) + var/obj/item/roller_holder/RH = W + if(!RH.held) + user << "\blue You collect the roller bed." + src.loc = RH + RH.held = src + return + + ..() + +/obj/item/roller_holder + name = "roller bed rack" + desc = "A rack for carrying a collapsed roller bed." + icon = 'icons/obj/rollerbed.dmi' + icon_state = "folded" + var/obj/item/roller/held + +/obj/item/roller_holder/New() + ..() + held = new /obj/item/roller(src) + +/obj/item/roller_holder/attack_self(mob/user as mob) + + if(!held) + user << "\blue The rack is empty." + return + + user << "\blue You deploy the roller bed." + var/obj/structure/stool/bed/roller/R = new /obj/structure/stool/bed/roller(user.loc) + R.add_fingerprint(user) + del(held) + held = null + + /obj/structure/stool/bed/roller/Move() ..() if(buckled_mob) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index c05a0d9839..448662c451 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 0000000000..e8df54ddfd --- /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 68bb5a9e3e..ef3b8e5c03 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 5b664f21b3..539efcaacc 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 c182d82024..3e4cf1a3d1 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 57cc66865b..d8b1bdf70b 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/food/recipes_microwave.dm b/code/modules/food/recipes_microwave.dm index 0542d0b632..9518394916 100644 --- a/code/modules/food/recipes_microwave.dm +++ b/code/modules/food/recipes_microwave.dm @@ -13,7 +13,7 @@ I said no! /datum/recipe/syntitelebacon items = list( - /obj/item/weapon/syntiflesh, + /obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh, /obj/item/device/assembly/signaler ) result = /obj/item/weapon/reagent_containers/food/snacks/telebacon @@ -128,7 +128,7 @@ I said no! /datum/recipe/syntiburger items = list( /obj/item/weapon/reagent_containers/food/snacks/bun, - /obj/item/weapon/syntiflesh + /obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh ) result = /obj/item/weapon/reagent_containers/food/snacks/monkeyburger @@ -252,9 +252,9 @@ I said no! /obj/item/weapon/reagent_containers/food/snacks/dough, /obj/item/weapon/reagent_containers/food/snacks/dough, /obj/item/weapon/reagent_containers/food/snacks/dough, - /obj/item/weapon/syntiflesh, - /obj/item/weapon/syntiflesh, - /obj/item/weapon/syntiflesh, + /obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh, + /obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh, + /obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh, /obj/item/weapon/reagent_containers/food/snacks/cheesewedge, /obj/item/weapon/reagent_containers/food/snacks/cheesewedge, /obj/item/weapon/reagent_containers/food/snacks/cheesewedge, @@ -437,8 +437,8 @@ I said no! /datum/recipe/syntikabob items = list( /obj/item/stack/rods, - /obj/item/weapon/syntiflesh, - /obj/item/weapon/syntiflesh, + /obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh, + /obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh, ) result = /obj/item/weapon/reagent_containers/food/snacks/monkeykabob @@ -533,7 +533,7 @@ I said no! /datum/recipe/syntisteak reagents = list("sodiumchloride" = 1, "blackpepper" = 1) items = list( - /obj/item/weapon/syntiflesh + /obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh ) result = /obj/item/weapon/reagent_containers/food/snacks/meatsteak @@ -562,9 +562,9 @@ I said no! /datum/recipe/syntipizza items = list( /obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough, - /obj/item/weapon/syntiflesh, - /obj/item/weapon/syntiflesh, - /obj/item/weapon/syntiflesh, + /obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh, + /obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh, + /obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh, /obj/item/weapon/reagent_containers/food/snacks/cheesewedge, /obj/item/weapon/reagent_containers/food/snacks/grown/tomato, ) diff --git a/code/modules/mining/drilling/distribution.dm b/code/modules/mining/drilling/distribution.dm index 2ca9a3f685..1b4c698ea9 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 f4edb30e24..4f6368ad6f 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 c2ecf6d539..feb74deb54 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/silicon/robot/drone/drone_items.dm b/code/modules/mob/living/silicon/robot/drone/drone_items.dm index 7c2dc565a4..dfe1a9db29 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm @@ -28,6 +28,19 @@ //Item currently being held. var/obj/item/wrapped = null +/obj/item/weapon/gripper/paperwork + name = "paperwork gripper" + desc = "A simple grasping tool for clerical work." + icon = 'icons/obj/device.dmi' + icon_state = "gripper" + + can_hold = list( + /obj/item/weapon/clipboard, + /obj/item/weapon/paper, + /obj/item/weapon/paper_bundle, + /obj/item/weapon/card/id + ) + /obj/item/weapon/gripper/attack_self(mob/user as mob) if(wrapped) wrapped.attack_self(user) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 1d0dd77e28..8d1823f0c5 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -5,7 +5,7 @@ icon_state = "robot" maxHealth = 200 health = 200 - + var/sight_mode = 0 var/custom_name = "" var/custom_sprite = 0 //Due to all the sprites involved, a var for our custom borgs may be best @@ -163,7 +163,7 @@ /mob/living/silicon/robot/proc/pick_module() if(module) return - var/list/modules = list("Standard", "Engineering", "Medical", "Miner", "Janitor", "Service", "Security") + var/list/modules = list("Standard", "Engineering", "Construction", "Surgeon", "Crisis", "Miner", "Janitor", "Service", "Clerical", "Security") if(crisis && security_level == SEC_LEVEL_RED) //Leaving this in until it's balanced appropriately. src << "\red Crisis mode active. Combat module available." modules+="Combat" @@ -189,6 +189,14 @@ module_sprites["Rich"] = "maximillion" module_sprites["Default"] = "Service2" + if("Clerical") + module = new /obj/item/weapon/robot_module/clerical(src) + module_sprites["Waitress"] = "Service" + module_sprites["Kent"] = "toiletbot" + module_sprites["Bro"] = "Brobot" + module_sprites["Rich"] = "maximillion" + module_sprites["Default"] = "Service2" + if("Miner") module = new /obj/item/weapon/robot_module/miner(src) module.channels = list("Supply" = 1) @@ -198,15 +206,26 @@ module_sprites["Advanced Droid"] = "droid-miner" module_sprites["Treadhead"] = "Miner" - if("Medical") - module = new /obj/item/weapon/robot_module/medical(src) + if("Crisis") + module = new /obj/item/weapon/robot_module/crisis(src) module.channels = list("Medical" = 1) if(camera && "Robots" in camera.network) camera.network.Add("Medical") module_sprites["Basic"] = "Medbot" + module_sprites["Standard"] = "surgeon" module_sprites["Advanced Droid"] = "droid-medical" module_sprites["Needles"] = "medicalrobot" + + if("Surgeon") + module = new /obj/item/weapon/robot_module/surgeon(src) + module.channels = list("Medical" = 1) + if(camera && "Robots" in camera.network) + camera.network.Add("Medical") + + module_sprites["Basic"] = "Medbot" module_sprites["Standard"] = "surgeon" + module_sprites["Advanced Droid"] = "droid-medical" + module_sprites["Needles"] = "medicalrobot" if("Security") module = new /obj/item/weapon/robot_module/security(src) @@ -225,6 +244,15 @@ module_sprites["Antique"] = "engineerrobot" module_sprites["Landmate"] = "landmate" + if("Construction") + module = new /obj/item/weapon/robot_module/construction(src) + module.channels = list("Engineering" = 1) + if(camera && "Robots" in camera.network) + camera.network.Add("Engineering") + module_sprites["Basic"] = "Engineering" + module_sprites["Antique"] = "engineerrobot" + module_sprites["Landmate"] = "landmate" + if("Janitor") module = new /obj/item/weapon/robot_module/janitor(src) module_sprites["Basic"] = "JanBot2" @@ -238,7 +266,7 @@ //languages module.add_languages(src) - + //Custom_sprite check and entry if (custom_sprite == 1) module_sprites["Custom"] = "[src.ckey]-[modtype]" diff --git a/code/modules/mob/living/silicon/robot/robot_items.dm b/code/modules/mob/living/silicon/robot/robot_items.dm index 1c24a5e75d..931cb0556b 100644 --- a/code/modules/mob/living/silicon/robot/robot_items.dm +++ b/code/modules/mob/living/silicon/robot/robot_items.dm @@ -95,14 +95,26 @@ var/mode = 1 /obj/item/weapon/pen/robopen/attack_self(mob/user as mob) + + var/choice = input("Would you like to change colour or mode?") as null|anything in list("Colour","Mode") + if(!choice) return + playsound(src.loc, 'sound/effects/pop.ogg', 50, 0) - if (mode == 1) - mode = 2 - user << "Changed printing mode to 'Rename Paper'" - return - if (mode == 2) - mode = 1 - user << "Changed printing mode to 'Write Paper'" + + switch(choice) + + if("Colour") + var/newcolour = input("Which colour would you like to use?") as null|anything in list("black","blue","red","green","yellow") + if(newcolour) colour = newcolour + + if("Mode") + if (mode == 1) + mode = 2 + else + mode = 1 + user << "Changed printing mode to '[mode == 2 ? "Rename Paper" : "Write Paper"]'" + + return // Copied over from paper's rename verb // see code\modules\paperwork\paper.dm line 62 @@ -120,6 +132,33 @@ add_fingerprint(user) return +//TODO: Add prewritten forms to dispense when you work out a good way to store the strings. +/obj/item/weapon/form_printer + //name = "paperwork printer" + name = "paper dispenser" + icon = 'icons/obj/bureaucracy.dmi' + icon_state = "paper_bin1" + item_state = "sheet-metal" + +/obj/item/weapon/form_printer/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) + return + +/obj/item/weapon/form_printer/afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, flag, params) + + if(!target || !flag) + return + + if(istype(target,/obj/structure/table)) + deploy_paper(get_turf(target)) + +/obj/item/weapon/form_printer/attack_self(mob/user as mob) + deploy_paper(get_turf(src)) + +/obj/item/weapon/form_printer/proc/deploy_paper(var/turf/T) + T.visible_message("\blue \The [src.loc] dispenses a sheet of crisp white paper.") + new /obj/item/weapon/paper(T) + + //Personal shielding for the combat module. /obj/item/borg/combat/shield name = "personal shielding" diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 0e48a8f33e..00caecb8f0 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -9,6 +9,7 @@ var/list/modules = list() var/obj/item/emag = null var/obj/item/borg/upgrade/jetpack = null + var/list/stacktypes emp_act(severity) if(modules) @@ -31,7 +32,21 @@ /obj/item/weapon/robot_module/proc/respawn_consumable(var/mob/living/silicon/robot/R) - return + + if(!stacktypes || !stacktypes.len) return + + for(var/T in stacktypes) + var/O = locate(T) in src.modules + var/obj/item/stack/S = O + + if(!S) + src.modules -= null + S = new T(src) + src.modules += S + S.amount = 1 + + if(S && S.amount < stacktypes[T]) + S.amount++ /obj/item/weapon/robot_module/proc/rebuild()//Rebuilds the list so it's possible to add/remove items from the module var/list/temp_list = modules @@ -41,7 +56,9 @@ modules += O /obj/item/weapon/robot_module/proc/add_languages(var/mob/living/silicon/robot/R) - R.add_language("Tradeband", 0) + R.add_language("Tradeband", 1) + R.add_language("Sol Common", 1) + /obj/item/weapon/robot_module/standard name = "standard robot module" @@ -57,8 +74,49 @@ src.emag = new /obj/item/weapon/melee/energy/sword(src) return -/obj/item/weapon/robot_module/medical - name = "medical robot module" +/obj/item/weapon/robot_module/surgeon + name = "surgeon robot module" + stacktypes = list( + /obj/item/stack/medical/advanced/bruise_pack = 5, + /obj/item/stack/nanopaste = 5 + ) + + New() + src.modules += new /obj/item/device/flashlight(src) + src.modules += new /obj/item/device/flash(src) + src.modules += new /obj/item/device/healthanalyzer(src) + src.modules += new /obj/item/weapon/reagent_containers/borghypo/surgeon(src) + src.modules += new /obj/item/weapon/scalpel(src) + src.modules += new /obj/item/weapon/hemostat(src) + src.modules += new /obj/item/weapon/retractor(src) + src.modules += new /obj/item/weapon/cautery(src) + src.modules += new /obj/item/weapon/bonegel(src) + src.modules += new /obj/item/weapon/bonesetter(src) + src.modules += new /obj/item/weapon/circular_saw(src) + src.modules += new /obj/item/weapon/surgicaldrill(src) + src.modules += new /obj/item/weapon/extinguisher/mini(src) + src.modules += new /obj/item/stack/medical/advanced/bruise_pack(src) + src.modules += new /obj/item/stack/nanopaste(src) + + src.emag = new /obj/item/weapon/reagent_containers/spray(src) + + src.emag.reagents.add_reagent("pacid", 250) + src.emag.name = "Polyacid spray" + return + +/obj/item/weapon/robot_module/surgeon/respawn_consumable(var/mob/living/silicon/robot/R) + if(src.emag) + var/obj/item/weapon/reagent_containers/spray/PS = src.emag + PS.reagents.add_reagent("pacid", 2) + ..() + +/obj/item/weapon/robot_module/crisis + name = "crisis robot module" + stacktypes = list( + /obj/item/stack/medical/ointment = 5, + /obj/item/stack/medical/bruise_pack = 5, + /obj/item/stack/medical/splint = 5 + ) New() src.modules += new /obj/item/device/flashlight(src) @@ -66,40 +124,74 @@ src.modules += new /obj/item/borg/sight/hud/med(src) src.modules += new /obj/item/device/healthanalyzer(src) src.modules += new /obj/item/device/reagent_scanner/adv(src) - src.modules += new /obj/item/weapon/reagent_containers/borghypo(src) + src.modules += new /obj/item/roller_holder(src) + src.modules += new /obj/item/stack/medical/ointment(src) + src.modules += new /obj/item/stack/medical/bruise_pack(src) + src.modules += new /obj/item/stack/medical/splint(src) + src.modules += new /obj/item/weapon/reagent_containers/borghypo/crisis(src) src.modules += new /obj/item/weapon/reagent_containers/glass/beaker/large(src) src.modules += new /obj/item/weapon/reagent_containers/robodropper(src) src.modules += new /obj/item/weapon/reagent_containers/syringe(src) src.modules += new /obj/item/weapon/extinguisher/mini(src) + src.emag = new /obj/item/weapon/reagent_containers/spray(src) src.emag.reagents.add_reagent("pacid", 250) src.emag.name = "Polyacid spray" return -/obj/item/weapon/robot_module/medical/respawn_consumable(var/mob/living/silicon/robot/R) +/obj/item/weapon/robot_module/crisis/respawn_consumable(var/mob/living/silicon/robot/R) + var/obj/item/weapon/reagent_containers/syringe/S = locate() in src.modules - if(S.mode == 2)//SYRINGE_BROKEN + if(S.mode == 2) S.reagents.clear_reagents() S.mode = initial(S.mode) S.desc = initial(S.desc) S.update_icon() + if(src.emag) var/obj/item/weapon/reagent_containers/spray/PS = src.emag PS.reagents.add_reagent("pacid", 2) -/obj/item/weapon/robot_module/engineering - name = "engineering robot module" + ..() +/obj/item/weapon/robot_module/construction + name = "construction robot module" + + stacktypes = list( + /obj/item/stack/sheet/metal = 50, + /obj/item/stack/sheet/plasteel = 10, + /obj/item/stack/sheet/rglass = 50 + ) + + New() + src.modules += new /obj/item/device/flashlight(src) + src.modules += new /obj/item/device/flash(src) + src.modules += new /obj/item/borg/sight/meson(src) + src.modules += new /obj/item/weapon/extinguisher(src) + src.modules += new /obj/item/weapon/rcd/borg(src) + src.modules += new /obj/item/weapon/screwdriver(src) + src.modules += new /obj/item/weapon/wrench(src) + src.modules += new /obj/item/weapon/crowbar(src) + src.modules += new /obj/item/weapon/pickaxe/plasmacutter(src) + +/obj/item/weapon/robot_module/engineering + name = "engineering robot module" + + stacktypes = list( + /obj/item/stack/sheet/metal = 50, + /obj/item/stack/sheet/glass = 50, + /obj/item/stack/sheet/rglass = 50, + /obj/item/weapon/cable_coil = 50, + /obj/item/stack/rods = 15, + /obj/item/stack/tile/plasteel = 15 + ) New() src.modules += new /obj/item/device/flashlight(src) src.modules += new /obj/item/device/flash(src) src.modules += new /obj/item/borg/sight/meson(src) - src.emag = new /obj/item/borg/stun(src) - src.modules += new /obj/item/weapon/rcd/borg(src) src.modules += new /obj/item/weapon/extinguisher(src) -// src.modules += new /obj/item/device/flashlight(src) src.modules += new /obj/item/weapon/weldingtool/largetank(src) src.modules += new /obj/item/weapon/screwdriver(src) src.modules += new /obj/item/weapon/wrench(src) @@ -109,12 +201,20 @@ src.modules += new /obj/item/device/t_scanner(src) src.modules += new /obj/item/device/analyzer(src) src.modules += new /obj/item/taperoll/engineering(src) + src.modules += new /obj/item/weapon/gripper(src) + src.modules += new /obj/item/weapon/matter_decompiler(src) + + src.emag = new /obj/item/borg/stun(src) var/obj/item/stack/sheet/metal/cyborg/M = new /obj/item/stack/sheet/metal/cyborg(src) M.amount = 50 src.modules += M - var/obj/item/stack/sheet/rglass/cyborg/G = new /obj/item/stack/sheet/rglass/cyborg(src) + var/obj/item/stack/sheet/rglass/cyborg/R = new /obj/item/stack/sheet/rglass/cyborg(src) + R.amount = 50 + src.modules += R + + var/obj/item/stack/sheet/glass/G = new /obj/item/stack/sheet/glass(src) G.amount = 50 src.modules += G @@ -124,24 +224,6 @@ return -/obj/item/weapon/robot_module/engineering/respawn_consumable(var/mob/living/silicon/robot/R) - var/list/stacks = list ( - /obj/item/stack/sheet/metal, - /obj/item/stack/sheet/rglass, - /obj/item/weapon/cable_coil, - ) - for(var/T in stacks) - var/O = locate(T) in src.modules - if(O) - if(O:amount < 50) - O:amount++ - else - src.modules -= null - O = new T(src) - src.modules += O - O:amount = 1 - return - /obj/item/weapon/robot_module/security name = "security robot module" @@ -202,7 +284,6 @@ src.modules += new /obj/item/device/flash(src) src.modules += new /obj/item/weapon/reagent_containers/food/drinks/cans/beer(src) src.modules += new /obj/item/weapon/reagent_containers/food/condiment/enzyme(src) - src.modules += new /obj/item/weapon/pen/robopen(src) var/obj/item/weapon/rsf/M = new /obj/item/weapon/rsf(src) M.matter = 30 @@ -236,6 +317,28 @@ R.add_language("Tradeband", 1) R.add_language("Gutter", 1) +/obj/item/weapon/robot_module/clerical + name = "clerical robot module" + + New() + src.modules += new /obj/item/device/flashlight(src) + src.modules += new /obj/item/device/flash(src) + src.modules += new /obj/item/weapon/pen/robopen(src) + src.modules += new /obj/item/weapon/form_printer(src) + src.modules += new /obj/item/weapon/gripper/paperwork(src) + + src.emag = new /obj/item/weapon/stamp/denied(src) + + add_languages(var/mob/living/silicon/robot/R) + R.add_language("Sol Common", 1) + R.add_language("Sinta'unathi", 1) + R.add_language("Siik'maas", 1) + R.add_language("Siik'tajr", 0) + R.add_language("Skrellian", 1) + R.add_language("Rootspeak", 1) + R.add_language("Tradeband", 1) + R.add_language("Gutter", 1) + /obj/item/weapon/robot_module/butler/respawn_consumable(var/mob/living/silicon/robot/R) var/obj/item/weapon/reagent_containers/food/condiment/enzyme/E = locate() in src.modules E.reagents.add_reagent("enzyme", 2) @@ -250,11 +353,12 @@ src.modules += new /obj/item/device/flashlight(src) src.modules += new /obj/item/device/flash(src) src.modules += new /obj/item/borg/sight/meson(src) - src.emag = new /obj/item/borg/stun(src) + src.modules += new /obj/item/weapon/wrench(src) + src.modules += new /obj/item/weapon/screwdriver(src) src.modules += new /obj/item/weapon/storage/bag/ore(src) src.modules += new /obj/item/weapon/pickaxe/borgdrill(src) src.modules += new /obj/item/weapon/storage/bag/sheetsnatcher/borg(src) -// src.modules += new /obj/item/weapon/shovel(src) Uneeded due to buffed drill + src.emag = new /obj/item/weapon/pickaxe/plasmacutter(src) return /obj/item/weapon/robot_module/syndicate @@ -286,7 +390,7 @@ /obj/item/weapon/robot_module/drone name = "drone module" - var/list/stacktypes = list( + stacktypes = list( /obj/item/stack/sheet/wood/cyborg = 1, /obj/item/stack/sheet/mineral/plastic/cyborg = 1, /obj/item/stack/sheet/rglass/cyborg = 5, @@ -327,29 +431,17 @@ var/obj/item/weapon/reagent_containers/spray/cleaner/C = locate() in src.modules C.reagents.add_reagent("cleaner", 3) - for(var/T in stacktypes) - var/O = locate(T) in src.modules - var/obj/item/stack/sheet/S = O - - if(!S) - src.modules -= null - S = new T(src) - src.modules += S - S.amount = 1 - - if(S && S.amount < stacktypes[T]) - S.amount++ - var/obj/item/device/lightreplacer/LR = locate() in src.modules LR.Charge(R) + ..() return //checks whether this item is a module of the robot it is located in. /obj/item/proc/is_robot_module() if (!istype(src.loc, /mob/living/silicon/robot)) return 0 - + var/mob/living/silicon/robot/R = src.loc - - return (src in R.module.modules) + + return (src in R.module.modules) diff --git a/code/modules/mob/living/silicon/robot/robot_movement.dm b/code/modules/mob/living/silicon/robot/robot_movement.dm index f1a62754b4..c3b7d43c05 100644 --- a/code/modules/mob/living/silicon/robot/robot_movement.dm +++ b/code/modules/mob/living/silicon/robot/robot_movement.dm @@ -1,3 +1,8 @@ +/mob/living/silicon/robot/Process_Spaceslipping(var/prob_slip) + if(module && (istype(module,/obj/item/weapon/robot_module/construction) || istype(module,/obj/item/weapon/robot_module/drone))) + return 0 + ..(prob_slip) + /mob/living/silicon/robot/Process_Spacemove() if(module) for(var/obj/item/weapon/tank/jetpack/J in module.modules) 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 f3354ce856..0000000000 --- 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/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm index a8d88bcf20..d69773b5d4 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghydro.dm @@ -18,6 +18,12 @@ var/list/reagent_ids = list("tricordrazine", "inaprovaline", "spaceacillin") //var/list/reagent_ids = list("dexalin", "kelotane", "bicaridine", "anti_toxin", "inaprovaline", "spaceacillin") +/obj/item/weapon/reagent_containers/borghypo/surgeon + reagent_ids = list("bicaridine", "inaprovaline", "dexalin") + +/obj/item/weapon/reagent_containers/borghypo/crisis + reagent_ids = list("tricordrazine", "inaprovaline", "tramadol") + /obj/item/weapon/reagent_containers/borghypo/New() ..() for(var/R in reagent_ids) diff --git a/code/setup.dm b/code/setup.dm index a86e066576..55c1510234 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 c4453316df..feafab4983 100644 Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ diff --git a/icons/mob/roaper.dmi b/icons/mob/roaper.dmi new file mode 100644 index 0000000000..272251ec8a Binary files /dev/null and b/icons/mob/roaper.dmi differ diff --git a/icons/mob/species/tajaran/suit.dmi b/icons/mob/species/tajaran/suit.dmi index 620da66a60..d0eca318fd 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 8e5903fbc6..9b8c463bab 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 d2d32b4b1d..31be71e8e9 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 31a605f935..7506de201e 100644 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ diff --git a/maps/tgstation2.dmm b/maps/tgstation2.dmm index 8a8c3c7771..fea5f3a21e 100644 --- a/maps/tgstation2.dmm +++ b/maps/tgstation2.dmm @@ -8082,7 +8082,7 @@ "cZv" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 140; on = 1; pressure_checks = 0},/obj/machinery/camera{c_tag = "Main Computer Room"; dir = 2; network = list("Tcomsat")},/obj/structure/table,/obj/item/weapon/folder/yellow,/obj/item/weapon/folder/yellow,/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/tcommsat/computer) "cZw" = (/obj/structure/table,/obj/item/weapon/paper_bin,/obj/item/weapon/pen/blue{pixel_x = -3; pixel_y = 2},/turf/simulated/floor,/area/tcommsat/computer) "cZx" = (/obj/structure/table,/obj/item/device/flashlight/lamp,/turf/simulated/floor,/area/tcommsat/computer) -"cZy" = (/obj/item/weapon/syntiflesh{name = "Cuban Pete-Meat"},/turf/simulated/floor/engine,/area/tcommsat/computer) +"cZy" = (/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh{name = "Cuban Pete-Meat"},/turf/simulated/floor/engine,/area/tcommsat/computer) "cZz" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_x = -29; pixel_y = 0},/turf/simulated/floor,/area/tcommsat/computer) "cZA" = (/obj/structure/window/reinforced{dir = 4},/turf/space,/area/turret_protected/tcomsat) "cZB" = (/turf/simulated/shuttle/wall{dir = 1; icon_state = "swall_floor_f10"},/area/shuttle/escape/centcom) @@ -8105,7 +8105,7 @@ "cZS" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor,/area/tcommsat/computer) "cZT" = (/obj/structure/stool/bed/chair/office/dark{dir = 4},/turf/simulated/floor,/area/tcommsat/computer) "cZU" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor,/area/tdome) -"cZV" = (/obj/item/weapon/syntiflesh{name = "Cuban Pete-Meat"},/obj/item/weapon/spacecash/c1,/turf/simulated/floor/engine,/area/tcommsat/computer) +"cZV" = (/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh{name = "Cuban Pete-Meat"},/obj/item/weapon/spacecash/c1,/turf/simulated/floor/engine,/area/tcommsat/computer) "cZW" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; layer = 2.4; on = 1},/turf/simulated/floor,/area/tcommsat/computer) "cZX" = (/obj/machinery/atmospherics/pipe/manifold/visible{tag = "icon-manifold (NORTH)"; icon_state = "manifold"; dir = 1},/turf/simulated/floor,/area/tdome) "cZY" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor,/area/tcommsat/computer)