diff --git a/.gitignore b/.gitignore index 4996f307c517c..eb30577d12ced 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,4 @@ cfg/ baystation12.int #Ignore .DS_Store .DS_Store +maps/overmap/aphelion-1.dmm diff --git a/code/ATMOSPHERICS/components/unary/cold_sink.dm b/code/ATMOSPHERICS/components/unary/cold_sink.dm index 325381cb33486..de49772d574cb 100644 --- a/code/ATMOSPHERICS/components/unary/cold_sink.dm +++ b/code/ATMOSPHERICS/components/unary/cold_sink.dm @@ -9,10 +9,14 @@ density = 1 anchored = 1 use_power = 0 - idle_power_usage = 5 // 5 Watts for thermostat related circuitry + idle_power_usage = 5 // 5 Watts for thermostat related circuitry var/heatsink_temperature = T20C // The constant temperature reservoir into which the freezer pumps heat. Probably the hull of the station or something. var/internal_volume = 600 // L + var/heat_transfer_coeffecient = 1.0 // Coeffecient on heat exchange. It uses decimal division. + + var/max_temp + var/min_temp var/max_power_rating = 20000 // Power rating when the usage is turned up to 100 var/power_setting = 100 @@ -20,6 +24,23 @@ var/set_temperature = T20C // Thermostat var/cooling = 0 + min_temp =0 + max_temp = 600 + +/obj/machinery/atmospherics/unary/freezer/engine + name = "engine class gas cooling system" + set_temperature = 2500 + max_temp = 3000 + min_temp =240 + heat_transfer_coeffecient = 0.71 + +/obj/machinery/atmospherics/unary/freezer/cryogenics + name = "cryogenic class gas cooling system" + set_temperature = 64 + min_temp =32 + heat_transfer_coeffecient = 0.20 + max_power_rating = 30000 + /obj/machinery/atmospherics/unary/freezer/New() ..() initialize_directions = dir @@ -74,8 +95,8 @@ data["on"] = use_power ? 1 : 0 data["gasPressure"] = round(air_contents.return_pressure()) data["gasTemperature"] = round(air_contents.temperature) - data["minGasTemperature"] = 0 - data["maxGasTemperature"] = round(T20C+500) + data["minGasTemperature"] = min_temp + data["maxGasTemperature"] = max_temp data["targetGasTemperature"] = round(set_temperature) data["powerSetting"] = power_setting @@ -108,9 +129,9 @@ if(href_list["temp"]) var/amount = text2num(href_list["temp"]) if(amount > 0) - set_temperature = min(set_temperature + amount, 1000) + set_temperature = min(set_temperature + amount, max_temp) else - set_temperature = max(set_temperature + amount, 0) + set_temperature = max(set_temperature + amount, min_temp) if(href_list["setPower"]) //setting power to 0 is redundant anyways var/new_setting = between(0, text2num(href_list["setPower"]), 100) set_power_level(new_setting) @@ -135,7 +156,7 @@ var/cop = FREEZER_PERF_MULT * air_contents.temperature/heatsink_temperature //heatpump coefficient of performance from thermodynamics -> power used = heat_transfer/cop heat_transfer = min(heat_transfer, cop * power_rating) //limit heat transfer by available power - var/removed = -air_contents.add_thermal_energy(-heat_transfer) //remove the heat + var/removed = -air_contents.add_thermal_energy(-heat_transfer/heat_transfer_coeffecient) //remove the heat if(debug) visible_message("[src]: Removing [removed] W.") diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 0f70d6eb00291..cffbf73767545 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -107,6 +107,8 @@ var/list/gamemode_cache = list() var/alert_desc_blue_downto = "The immediate threat has passed. Security may no longer have weapons drawn at all times, but may continue to have them visible. Random searches are still allowed." var/alert_desc_red_upto = "There is an immediate serious threat to the station. Security may have weapons unholstered at all times. Random searches are allowed and advised." var/alert_desc_red_downto = "The self-destruct mechanism has been deactivated, there is still however an immediate serious threat to the station. Security may have weapons unholstered at all times, random searches are allowed and advised." + var/alert_desc_black_upto = "A medical emergency is present aboard the NES Aphelion. All crew are to cooperate with the Medical and Security staff. Mandatory quarantine procedures may be enacted and enforced." + var/alert_desc_black_downto = "The medical emergency has passed. All crew are to resume normal operations." var/alert_desc_delta = "The station's self-destruct mechanism has been engaged. All crew are instructed to obey all instructions given by heads of staff. Any violations of these orders can be punished by death. This is not a drill." var/forbid_singulo_possession = 0 @@ -498,6 +500,12 @@ var/list/gamemode_cache = list() if("load_jobs_from_txt") load_jobs_from_txt = 1 + if("alert_black_upto") + config.alert_desc_red_upto = value + + if("alert_black_downto") + config.alert_desc_red_downto = value + if("alert_red_upto") config.alert_desc_red_upto = value diff --git a/code/controllers/voting.dm b/code/controllers/voting.dm index 2bd56163d5523..f37b0ca0fa69a 100644 --- a/code/controllers/voting.dm +++ b/code/controllers/voting.dm @@ -224,7 +224,7 @@ datum/controller/vote question = "End the shift?" choices.Add("Initiate Crew Transfer", "Continue The Round") else - if (get_security_level() == "red" || get_security_level() == "delta") + if (get_security_level() == "red" || get_security_level() == "black" || get_security_level() == "delta") initiator_key << "The current alert status is too high to call for a crew transfer!" return 0 if(ticker.current_state <= 2) diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index e63ed6a0859f0..cc43f0ce7d490 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -92,7 +92,9 @@ var/global/list/additional_antag_types = list() new/datum/uplink_item(/obj/item/weapon/storage/box/syndie_kit/imp_freedom, 3, "Freedom Implant", "FI"), new/datum/uplink_item(/obj/item/weapon/storage/box/syndie_kit/imp_compress, 4, "Compressed Matter Implant", "CI"), new/datum/uplink_item(/obj/item/weapon/storage/box/syndie_kit/imp_explosive, 6, "Explosive Implant (DANGER!)", "EI"), - new/datum/uplink_item(/obj/item/weapon/storage/box/syndie_kit/imp_uplink, 10, "Uplink Implant (Contains 5 Telecrystals)", "UI") + new/datum/uplink_item(/obj/item/weapon/storage/box/syndie_kit/imp_uplink, 10, "Uplink Implant (Contains 5 Telecrystals)", "UI"), + new/datum/uplink_item(/obj/item/weapon/storage/box/syndie_kit/imp_amnesia, 2, "Amnesia Implant", "AMI"), + new/datum/uplink_item(/obj/item/weapon/storage/box/syndie_kit/imp_enslavement, 4, "Enslavement Implant", "ENI") ), "Medical" = list( new/datum/uplink_item(/obj/item/weapon/storage/box/sinpockets, 1, "Box of Sin-Pockets", "DP"), diff --git a/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_networking.dm b/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_networking.dm index f1bad288ad082..b38458625cc5f 100644 --- a/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_networking.dm +++ b/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_networking.dm @@ -114,13 +114,13 @@ /datum/game_mode/malfunction/verb/elite_encryption_hack() set category = "Software" set name = "Elite Encryption Hack" - set desc = "200 CPU - Allows you to hack station's ALERTCON system, changing alert level. Has high chance of failijng." + set desc = "200 CPU - Allows you to hack station's ALERTCON system, changing alert level. Has high chance of failing." var/price = 200 var/mob/living/silicon/ai/user = usr if(!ability_prechecks(user, price)) return - var/alert_target = input("Select new alert level:") in list("green", "blue", "red", "delta", "CANCEL") + var/alert_target = input("Select new alert level:") in list("green", "blue", "red", "black", "delta", "CANCEL") if(!alert_target || !ability_pay(user, price) || alert_target == "CANCEL") user << "Hack Aborted" return diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index 9a8228aaa6d6f..9f072b836ee23 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -166,7 +166,8 @@ update_flag if (src.health <= 10) var/atom/location = src.loc location.assume_air(air_contents) - + + src.release_pressure = 1000 src.destroyed = 1 playsound(src.loc, 'sound/effects/spray.ogg', 10, 1, -3) src.density = 0 @@ -181,12 +182,8 @@ update_flag return 1 /obj/machinery/portable_atmospherics/canister/process() - if (destroyed) - return - ..() - - if(valve_open) + if((valve_open) || (destroyed)) var/datum/gas_mixture/environment if(holding) environment = holding.air_contents @@ -196,6 +193,7 @@ update_flag var/env_pressure = environment.return_pressure() var/pressure_delta = release_pressure - env_pressure + if((air_contents.temperature > 0) && (pressure_delta > 0)) var/transfer_moles = calculate_transfer_moles(air_contents, environment, pressure_delta) transfer_moles = min(transfer_moles, (release_flow_rate/air_contents.volume)*air_contents.total_moles) //flow rate limit diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index b4ef029067eb8..9893ac81b8167 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -343,8 +343,15 @@ // them win or lose based on cryo is silly so we remove the objective. if(O.target == occupant.mind) if(O.owner && O.owner.current) - O.owner.current << "You get the feeling your target is no longer within your reach..." - qdel(O) + O.owner.current << "You get the feeling your target is no longer within your reach. Time for Plan B..." + O.target = null + spawn(1) //This should ideally fire after the occupant is deleted. + if(!O) return + O.find_target() + if(!(O.target)) + all_objectives -= O + O.owner.objectives -= O + del(O) //Handle job slot/tater cleanup. var/job = occupant.mind.assigned_role diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index d1e728e67679b..8fbd84808f010 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -624,7 +624,7 @@ model_text = "Engineering" req_access = list(access_construction) departments = list("Engineering","Atmos") - species = list("Human","Tajara","Skrell","Unathi") //Add Unathi when sprites exist for their suits. + species = list("Human","Tajara","Skrell","Unathi") //Add Kidan when sprites exist for their suits. /obj/machinery/suit_cycler/mining name = "Mining suit cycler" diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 1871b620684b5..e277eb0a9e8c5 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -749,12 +749,18 @@ products = list(/obj/item/weapon/reagent_containers/food/drinks/cans/cola = 10,/obj/item/weapon/reagent_containers/food/drinks/cans/space_mountain_wind = 10, /obj/item/weapon/reagent_containers/food/drinks/cans/dr_gibb = 10,/obj/item/weapon/reagent_containers/food/drinks/cans/starkist = 10, /obj/item/weapon/reagent_containers/food/drinks/cans/waterbottle = 10,/obj/item/weapon/reagent_containers/food/drinks/cans/space_up = 10, - /obj/item/weapon/reagent_containers/food/drinks/cans/iced_tea = 10, /obj/item/weapon/reagent_containers/food/drinks/cans/grape_juice = 10) + /obj/item/weapon/reagent_containers/food/drinks/cans/iced_tea = 10, /obj/item/weapon/reagent_containers/food/drinks/cans/grape_juice = 10, + /obj/item/weapon/reagent_containers/food/drinks/cans/cherrycola = 10, /obj/item/weapon/reagent_containers/food/drinks/cans/vanillacola = 10, + /obj/item/weapon/reagent_containers/food/drinks/cans/nanopop = 10, /obj/item/weapon/reagent_containers/food/drinks/cans/mintwalker = 10, + /obj/item/weapon/reagent_containers/food/drinks/cans/noblelotus = 10, /obj/item/weapon/reagent_containers/food/drinks/cans/holyslammer = 10) contraband = list(/obj/item/weapon/reagent_containers/food/drinks/cans/thirteenloko = 5, /obj/item/weapon/reagent_containers/food/snacks/liquidfood = 6) prices = list(/obj/item/weapon/reagent_containers/food/drinks/cans/cola = 1,/obj/item/weapon/reagent_containers/food/drinks/cans/space_mountain_wind = 1, /obj/item/weapon/reagent_containers/food/drinks/cans/dr_gibb = 1,/obj/item/weapon/reagent_containers/food/drinks/cans/starkist = 1, /obj/item/weapon/reagent_containers/food/drinks/cans/waterbottle = 2,/obj/item/weapon/reagent_containers/food/drinks/cans/space_up = 1, - /obj/item/weapon/reagent_containers/food/drinks/cans/iced_tea = 1,/obj/item/weapon/reagent_containers/food/drinks/cans/grape_juice = 1) + /obj/item/weapon/reagent_containers/food/drinks/cans/iced_tea = 1,/obj/item/weapon/reagent_containers/food/drinks/cans/grape_juice = 1, + /obj/item/weapon/reagent_containers/food/drinks/cans/cherrycola = 2, /obj/item/weapon/reagent_containers/food/drinks/cans/vanillacola = 2, + /obj/item/weapon/reagent_containers/food/drinks/cans/nanopop = 1, /obj/item/weapon/reagent_containers/food/drinks/cans/mintwalker = 1, + /obj/item/weapon/reagent_containers/food/drinks/cans/noblelotus = 1, /obj/item/weapon/reagent_containers/food/drinks/cans/holyslammer = 2) idle_power_usage = 211 //refrigerator - believe it or not, this is actually the average power consumption of a refrigerated vending machine according to NRCan. //This one's from bay12 @@ -1038,7 +1044,7 @@ /obj/item/clothing/under/color/white = 10, /obj/item/clothing/under/color/yellow = 10, /obj/item/clothing/under/purple = 10, /obj/item/clothing/under/aqua = 10, /obj/item/clothing/under/lightblue = 10, /obj/item/clothing/under/lightpurple = 10, /obj/item/clothing/under/lightgreen = 10, /obj/item/clothing/under/lightblue = 10, /obj/item/clothing/under/brown = 10) - contraband = list(/obj/item/clothing/under/psyche = 1) + contraband = list(/obj/item/clothing/under/rank/clown = 1) prices = list(/obj/item/clothing/under/color/black = 10, /obj/item/clothing/under/color/blackf = 10, /obj/item/clothing/under/color/blue = 10, /obj/item/clothing/under/color/green = 10, /obj/item/clothing/under/color/grey = 10, /obj/item/clothing/under/color/orange = 10, /obj/item/clothing/under/color/pink = 10, /obj/item/clothing/under/color/red = 10, @@ -1054,10 +1060,8 @@ icon_state = "shoe" products = list(/obj/item/clothing/shoes/blue = 10, /obj/item/clothing/shoes/red = 10, /obj/item/clothing/shoes/yellow = 10, /obj/item/clothing/shoes/green = 10, /obj/item/clothing/shoes/orange = 10, - /obj/item/clothing/shoes/purple = 10, /obj/item/clothing/shoes/red = 10, /obj/item/clothing/shoes/leather = 10, - /obj/item/clothing/shoes/jackboots = 10) + /obj/item/clothing/shoes/purple = 10, /obj/item/clothing/shoes/red = 10, /obj/item/clothing/shoes/leather = 10) contraband = list (/obj/item/clothing/shoes/clown_shoes = 1) prices = list (/obj/item/clothing/shoes/blue = 10, /obj/item/clothing/shoes/red = 10, /obj/item/clothing/shoes/yellow = 10, /obj/item/clothing/shoes/green = 10, /obj/item/clothing/shoes/orange = 10, - /obj/item/clothing/shoes/purple = 10, /obj/item/clothing/shoes/red = 10, /obj/item/clothing/shoes/leather = 10, - /obj/item/clothing/shoes/jackboots = 25) + /obj/item/clothing/shoes/purple = 10, /obj/item/clothing/shoes/red = 10, /obj/item/clothing/shoes/leather = 10) diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index 6465a05578565..7b77fdf39dcc4 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -346,6 +346,64 @@ the implant may become unstable and either pre-maturely inject the subject or si return 1 +/obj/item/weapon/implant/enslavement + name = "strange implant" + desc = "That's a strange implant." + + get_data() + var/dat = {" +Implant Specifications:
+Name: MK-U17R4.
+Life: Exceds Host Lifespan
+Important Notes: Personnel injected with this device often appear to develop a crippling dependency on another person.
+
+Implant Details:
+Function: Modifies thought processes to ensure a desired response.
+Special Features: Contains a small mechanism that redirects electric signals in the brain.
+Integrity: Dura-titanium hull ensures the chip will survive longer than the host."} + return dat + + + implanted(mob/M) + if(!istype(M, /mob/living/carbon/human)) return 0 + var/mob/living/carbon/human/H = M + if(H.is_loyalty_implanted(H)) + H.visible_message("[H] seems to resist the implant!", "You feel something try to invade your mind, but your loyalty implant blocks it!") + return 0 + + H << "\red You feel your mind blank, and a dark, whispering voice echos through your mind, binding you to [M.slaver]." + H << "1. You will follow any and all orders from [M.slaver] at all times." + H << "2. You will not act against [M.slaver] in any way, shape, or form." + H << "3. You will aid [M.slaver] in every way, shape, and form at all costs. Following orders takes priority over giving aid." + +/obj/item/weapon/implant/amnesia + name = "strange implant" + desc = "That's a strange implant." + + + get_data() + var/dat = {" +Implant Specifications:
+Name: Brain-Drain 3000
+Life: UNKNOWN.
+Important Notes: Personnel injected with this device experience dampening across the length of their cerebral cortex, halting specific thought processes.
+
+Implant Details:
+Function: Contains small pods of nanobots that seem to be programmed to target memory-related regions of the brain.
+Special Features: Now comes in strawberry!
+Integrity: The nanobots will cease functionality when the controller is removed."} + return dat + + + implanted(mob/M) + if(!istype(M, /mob/living/carbon/human)) return 0 + var/mob/living/carbon/human/H = M + if(H.is_loyalty_implanted(H)) + H.visible_message("[H] seems to hesitate for a moment.", "You feel odd. You can't quite tell if [M.slaver] is there any more. You are sure they are, but something is wrong.") + return 0 + + H << "Your thoughts drain away. You no longer remember anything about [M.slaver], nor can you hold on to any new memories related to them for long." + /obj/item/weapon/implant/adrenalin name = "adrenalin" desc = "Removes all stuns and knockdowns." diff --git a/code/game/objects/items/weapons/implants/implanter.dm b/code/game/objects/items/weapons/implants/implanter.dm index 23d9f38188d66..0513078b8db47 100644 --- a/code/game/objects/items/weapons/implants/implanter.dm +++ b/code/game/objects/items/weapons/implants/implanter.dm @@ -43,6 +43,7 @@ admin_attack_log(user, M, "Implanted using \the [src.name] ([src.imp.name])", "Implanted with \the [src.name] ([src.imp.name])", "used an implanter, [src.name] ([src.imp.name]), on") user.show_message("\red You implanted the implant into [M].") + M.slaver = user if(src.imp.implanted(M)) src.imp.loc = M src.imp.imp_in = M @@ -61,6 +62,23 @@ return +/obj/item/weapon/implanter/enslavement + name = "implanter-enslavement" + +/obj/item/weapon/implanter/enslavement/New() + src.imp = new /obj/item/weapon/implant/enslavement( src ) + ..() + update() + return + +/obj/item/weapon/implanter/amnesia + name = "implanter-amnesia" + +/obj/item/weapon/implanter/amnesia/New() + src.imp = new /obj/item/weapon/implant/amnesia( src ) + ..() + update() + return /obj/item/weapon/implanter/loyalty name = "implanter-loyalty" diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index d28107dd8f34d..1ad59e301ee82 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -627,3 +627,17 @@ new /obj/item/weapon/light/tube(src) for(var/i = 0; i < 7; i++) new /obj/item/weapon/light/bulb(src) + +/obj/item/weapon/storage/box/pmeson + name = "box of prescription meson scanners" + desc = "For the visually impaired engineers." + + New() + ..() + new /obj/item/clothing/glasses/meson/prescription(src) + new /obj/item/clothing/glasses/meson/prescription(src) + new /obj/item/clothing/glasses/meson/prescription(src) + new /obj/item/clothing/glasses/meson/prescription(src) + new /obj/item/clothing/glasses/meson/prescription(src) + new /obj/item/clothing/glasses/meson/prescription(src) + new /obj/item/clothing/glasses/meson/prescription(src) diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm index c23dfcdb516d2..268cd962cace0 100644 --- a/code/game/objects/items/weapons/storage/firstaid.dm +++ b/code/game/objects/items/weapons/storage/firstaid.dm @@ -290,6 +290,20 @@ new /obj/item/weapon/reagent_containers/pill/tramadol( src ) new /obj/item/weapon/reagent_containers/pill/tramadol( src ) +/obj/item/weapon/storage/pill_bottle/paracetamol + name = "bottle of paracetamol pills" + desc = "Contains pills used to relieve minor pain." + + New() + ..() + new /obj/item/weapon/reagent_containers/pill/paracetamol( src ) + new /obj/item/weapon/reagent_containers/pill/paracetamol( src ) + new /obj/item/weapon/reagent_containers/pill/paracetamol( src ) + new /obj/item/weapon/reagent_containers/pill/paracetamol( src ) + new /obj/item/weapon/reagent_containers/pill/paracetamol( src ) + new /obj/item/weapon/reagent_containers/pill/paracetamol( src ) + new /obj/item/weapon/reagent_containers/pill/paracetamol( src ) + /obj/item/weapon/storage/pill_bottle/citalopram name = "bottle of Citalopram pills" desc = "Contains pills used to stabilize a patient's mood." diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm index b33d72f6fbcd6..7979423f7b0f5 100644 --- a/code/game/objects/items/weapons/storage/uplink_kits.dm +++ b/code/game/objects/items/weapons/storage/uplink_kits.dm @@ -87,6 +87,26 @@ O.update() return +/obj/item/weapon/storage/box/syndie_kit/imp_enslavement + name = "boxed enslavement implant (with injector)" + +/obj/item/weapon/storage/box/syndie_kit/imp_enslavement/New() + ..() + var/obj/item/weapon/implanter/O = new(src) + O.imp = new /obj/item/weapon/implant/enslavement(O) + O.update() + return + +/obj/item/weapon/storage/box/syndie_kit/imp_amnesia + name = "boxed amnesia implant (with injector)" + +/obj/item/weapon/storage/box/syndie_kit/imp_amnesia/New() + ..() + var/obj/item/weapon/implanter/O = new(src) + O.imp = new /obj/item/weapon/implant/amnesia(O) + O.update() + return + /obj/item/weapon/storage/box/syndie_kit/imp_compress name = "box (C)" diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index 2a33930d56f3f..3b3fbcaa29f6c 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -201,6 +201,7 @@ new /obj/item/ammo_magazine/c45m/rubber(src) new /obj/item/weapon/gun/energy/taser(src) new /obj/item/clothing/mask/hailer(src) + new /obj/item/clothing/gloves/black(src) return diff --git a/code/game/response_team.dm b/code/game/response_team.dm index 842f60c1a7208..beba583e28ffe 100644 --- a/code/game/response_team.dm +++ b/code/game/response_team.dm @@ -42,10 +42,10 @@ client/verb/JoinResponseTeam() set name = "Join Response Team" set category = "IC" - if(!MayRespawn(1)) + if(!MayRespawn(1)) usr << "You cannot join the response team at this time." return - + if(istype(usr,/mob/dead/observer) || istype(usr,/mob/new_player)) if(!send_emergency_team) usr << "No emergency response team is currently being sent." @@ -94,6 +94,8 @@ proc/increment_ert_chance() ert_base_chance += 2 if(get_security_level() == "red") ert_base_chance += 3 + if(get_security_level() == "black") + ert_base_chance +=2 if(get_security_level() == "delta") ert_base_chance += 10 // Need those big guns sleep(600 * 3) // Minute * Number of Minutes diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 7c64ab2c91bb2..ce4a7f4c8faf4 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -811,7 +811,7 @@ var/list/admin_verbs_mentor = list( set category = "Admin" if(!check_rights(R_ADMIN)) return - var sec_level = input(usr, "It's currently code [get_security_level()].", "Select Security Level") as null|anything in (list("green","blue","red","delta")-get_security_level()) + var sec_level = input(usr, "It's currently code [get_security_level()].", "Select Security Level") as null|anything in (list("green","blue","red", "black", "delta")-get_security_level()) if(alert("Switch from code [get_security_level()] to code [sec_level]?","Change security level?","Yes","No") == "Yes") set_security_level(sec_level) log_admin("[key_name(usr)] changed the security level to code [sec_level].") diff --git a/code/modules/admin/verbs/cleartoxin.dm b/code/modules/admin/verbs/cleartoxin.dm index 3cc1eb3b175f4..4915fc3ae1913 100644 --- a/code/modules/admin/verbs/cleartoxin.dm +++ b/code/modules/admin/verbs/cleartoxin.dm @@ -23,5 +23,6 @@ for(var/turf/T in location.zone.contents) for(var/obj/fire/F in T.contents) del(F) + T.overlays = null for(var/obj/fire/FF in world) - del(FF) \ No newline at end of file + del(FF) diff --git a/code/modules/client/clothing/under/jobs/civilian.dm b/code/modules/client/clothing/under/jobs/civilian.dm new file mode 100644 index 0000000000000..86640f46897e0 --- /dev/null +++ b/code/modules/client/clothing/under/jobs/civilian.dm @@ -0,0 +1,183 @@ +//Alphabetical order of civilian jobs. + +/obj/item/clothing/under/rank/bartender + desc = "It looks like it could use some more flair." + name = "bartender's uniform" + icon_state = "ba_suit" + item_state = "ba_suit" + worn_state = "ba_suit" + + +/obj/item/clothing/under/rank/captain //Alright, technically not a 'civilian' but its better then giving a .dm file for a single define. + desc = "It's a blue jumpsuit with some gold markings denoting the rank of \"Captain\"." + name = "captain's jumpsuit" + icon_state = "captain" + item_state = "b_suit" + worn_state = "captain" + + +/obj/item/clothing/under/rank/cargo + name = "quartermaster's jumpsuit" + desc = "It's a jumpsuit worn by the quartermaster. It's specially designed to prevent back injuries caused by pushing paper." + icon_state = "qm" + item_state = "lb_suit" + worn_state = "qm" + + +/obj/item/clothing/under/rank/cargotech + name = "cargo technician's jumpsuit" + desc = "Shooooorts! They're comfy and easy to wear!" + icon_state = "cargotech" + item_state = "lb_suit" + worn_state = "cargo" + body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS + + +/obj/item/clothing/under/rank/chaplain + desc = "It's a black jumpsuit, often worn by religious folk." + name = "chaplain's jumpsuit" + icon_state = "chaplain" + item_state = "bl_suit" + worn_state = "chapblack" + + +/obj/item/clothing/under/rank/chef + desc = "It's an apron which is given only to the most hardcore chefs in space." + name = "chef's uniform" + icon_state = "chef" + item_state = "w_suit" + worn_state = "chef" + + +/obj/item/clothing/under/rank/clown + name = "clown suit" + desc = "'HONK!'" + icon_state = "clown" + item_state = "clown" + worn_state = "clown" + + +/obj/item/clothing/under/rank/head_of_personnel + desc = "It's a jumpsuit worn by someone who works in the position of \"Head of Personnel\"." + name = "head of personnel's jumpsuit" + icon_state = "hop" + item_state = "b_suit" + worn_state = "hop" + +/obj/item/clothing/under/rank/head_of_personnel_whimsy + desc = "A blue jacket and red tie, with matching red cuffs! Snazzy. Wearing this makes you feel more important than your job title does." + name = "head of personnel's suit" + icon_state = "hopwhimsy" + item_state = "b_suit" + worn_state = "hopwhimsy" + + +/obj/item/clothing/under/rank/hydroponics + desc = "It's a jumpsuit designed to protect against minor plant-related hazards." + name = "botanist's jumpsuit" + icon_state = "hydroponics" + item_state = "g_suit" + worn_state = "hydroponics" + permeability_coefficient = 0.50 + + +/obj/item/clothing/under/rank/internalaffairs + desc = "The plain, professional attire of an Internal Affairs Agent. The collar is immaculately starched." + name = "Internal Affairs uniform" + icon_state = "internalaffairs" + item_state = "ba_suit" + worn_state = "internalaffairs" + + +/obj/item/clothing/under/rank/janitor + desc = "It's the official uniform of the station's janitor. It has minor protection from biohazards." + name = "janitor's jumpsuit" + icon_state = "janitor" + worn_state = "janitor" + item_state = "janitor" + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) + + +/obj/item/clothing/under/lawyer + desc = "Slick threads." + name = "Lawyer suit" + + +/obj/item/clothing/under/lawyer/black + name = "black Lawyer suit" + icon_state = "lawyer_black" + item_state = "lawyer_black" + worn_state = "lawyer_black" + + +/obj/item/clothing/under/lawyer/female + name = "black Lawyer suit" + icon_state = "black_suit_fem" + item_state = "lawyer_black" + worn_state = "black_suit_fem" + + +/obj/item/clothing/under/lawyer/red + name = "red Lawyer suit" + icon_state = "lawyer_red" + item_state = "lawyer_red" + worn_state = "lawyer_red" + + +/obj/item/clothing/under/lawyer/blue + name = "blue Lawyer suit" + icon_state = "lawyer_blue" + item_state = "lawyer_blue" + worn_state = "lawyer_blue" + + +/obj/item/clothing/under/lawyer/bluesuit + name = "Blue Suit" + desc = "A classy suit and tie" + icon_state = "bluesuit" + item_state = "ba_suit" + worn_state = "bluesuit" + + +/obj/item/clothing/under/lawyer/purpsuit + name = "Purple Suit" + icon_state = "lawyer_purp" + item_state = "ba_suit" + worn_state = "lawyer_purp" + +/obj/item/clothing/under/lawyer/oldman + name = "Old Man's Suit" + desc = "A classic suit for the older gentleman with built in back support." + icon_state = "oldman" + item_state = "johnny" + worn_state = "oldman" + + +/obj/item/clothing/under/librarian + name = "sensible suit" + desc = "It's very... sensible." + icon_state = "red_suit" + item_state = "lawyer_red" + worn_state = "red_suit" + +/obj/item/clothing/under/mime + name = "mime's outfit" + desc = "It's not very colourful." + icon_state = "mime" + item_state = "ba_suit" + worn_state = "mime" + +/obj/item/clothing/under/rank/miner + desc = "It's a snappy jumpsuit with a sturdy set of overalls. It is very dirty." + name = "shaft miner's jumpsuit" + icon_state = "miner" + item_state = "lb_suit" + worn_state = "miner" + +/obj/item/clothing/under/rank/miner/kidaminer //Majora + desc = "This old and worn brown dress smells of various pheromones woven into the fabric with a miner's insignia on the back. It reads \"Miner Class Laborer.\" It is clear this jacket was not intended for humans due to the tight waist section." + name = "Kidan mining dress" + icon_state = "kidaminer" + item_state = "kidaminer" + worn_state = "kidaminer" //Not gonna work + body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS //Sleeveless. diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 7e69a279beace..9fcdee096ec5b 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -578,15 +578,15 @@ datum/preferences HTML += "Medical Records
" - HTML += TextPreview(med_record,40) + HTML += TextPreview(med_record,80) HTML += "

Employment Records
" - HTML += TextPreview(gen_record,40) + HTML += TextPreview(gen_record,80) HTML += "

Security Records
" - HTML += TextPreview(sec_record,40) + HTML += TextPreview(sec_record,80) HTML += "
" HTML += "\[Done\]" @@ -1281,7 +1281,7 @@ datum/preferences b_type = new_b_type if("hair") - if(species == "Human" || species == "Unathi" || species == "Tajara" || species == "Skrell") + if(species == "Human" || species == "Unathi" || species == "Tajara" || species == "Skrell" || species == "Kidan") var/new_hair = input(user, "Choose your character's hair colour:", "Character Preference", rgb(r_hair, g_hair, b_hair)) as color|null if(new_hair) r_hair = hex2num(copytext(new_hair, 2, 4)) @@ -1361,7 +1361,7 @@ datum/preferences s_tone = 35 - max(min( round(new_s_tone), 220),1) if("skin") - if(species == "Unathi" || species == "Tajara" || species == "Skrell") + if(species == "Unathi" || species == "Tajara" || species == "Skrell" || species == "Kidan") var/new_skin = input(user, "Choose your character's skin colour: ", "Character Preference", rgb(r_skin, g_skin, b_skin)) as color|null if(new_skin) r_skin = hex2num(copytext(new_skin, 2, 4)) diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index 2bf4296a2671f..ac5ec32241561 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -64,25 +64,25 @@ //This set of uniforms looks fairly fancy and is generally used for high-ranking NT personnel from what I've seen, so lets give them appropriate ranks. /obj/item/clothing/under/rank/centcom - desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Captain.\"" + desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Officer.\"" name = "\improper NanoTrasen Officer's Dress Uniform" - icon_state = "uniform_three" + icon_state = "uniform_three_item" item_state = "uniform_three_item" worn_state = "uniform_three" displays_id = 0 /obj/item/clothing/under/rank/centcom_officer - desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Admiral.\"" - name = "\improper NanoTrasen Admiral's Dress Uniform" - icon_state = "uniform_one" + desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Captain.\"" + name = "\improper NanoTrasen Captain's Dress Uniform" + icon_state = "uniform_one_item" item_state = "uniform_one_item" worn_state = "uniform_one" displays_id = 0 /obj/item/clothing/under/rank/centcom_captain - desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Admiral-Executive.\"" - name = "\improper NanoTrasen Admiral-Executive's Dress Armour" - icon_state = "uniform_two" + desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Admiral.\"" + name = "\improper NanoTrasen Admiral's Dress Armour" + icon_state = "uniform_two_item" item_state = "uniform_two_item" worn_state = "uniform_two" displays_id = 0 diff --git a/code/modules/mob/language/station.dm b/code/modules/mob/language/station.dm index 5adf080c7e645..b570fc5140bf9 100644 --- a/code/modules/mob/language/station.dm +++ b/code/modules/mob/language/station.dm @@ -14,6 +14,28 @@ new_name += " [pick(list("the Void","the Sky","Encroaching Night","Planetsong","Starsong","the Wandering Star","the Empty Day","Daybreak","Nightfall","the Rain"))]" return new_name +/datum/language/kidan + name = "Chittin" + desc = "The Kidan language." + speech_verb = "chirps and hums" + ask_verb = "chirps and hums" + exclaim_verb = "chirps" + colour = "Chittin" + key = "l" + flags = RESTRICTED + syllables = list("zz", "zzz", "mm", "ti") + +/datum/language/machine + name = "Encoded Audio Language" + desc = "A fast paced array of beeps and buzzes, mostly used by machines." + speech_verb = "beeps" + ask_verb = "beeps" + exclaim_verb = "pings" + colour = "machine" + key = "i" + flags = RESTRICTED + syllables = list("beep", "boop", "buzz","beepleep","*","!") + /datum/language/unathi name = "Sinta'unathi" desc = "The common language of Moghes, composed of sibilant hisses and rattles. Spoken natively by Unathi." diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 70646bd981798..0fa3ff264f720 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -209,6 +209,44 @@ return 1 return 0 +/mob/living/carbon/human/proc/implant_slave(mob/living/carbon/human/M, override = FALSE) // Won't override by default. + if(!config.use_loyalty_implants && !override) return // Nuh-uh. + + var/obj/item/weapon/implant/enslavement/L = new/obj/item/weapon/implant/enslavement(M) + L.imp_in = M + L.implanted = 1 + var/obj/item/organ/external/affected = M.organs_by_name["head"] + affected.implants += L + L.part = affected + L.implanted(src) + +/mob/living/carbon/human/proc/is_slave_implanted(mob/living/carbon/human/M) + for(var/L in M.contents) + if(istype(L, /obj/item/weapon/implant/enslavement)) + for(var/obj/item/organ/external/O in M.organs) + if(L in O.implants) + return 1 + return 0 + +/mob/living/carbon/human/proc/implant_amnesia(mob/living/carbon/human/M, override = FALSE) // Won't override by default. + if(!config.use_loyalty_implants && !override) return // Nuh-uh. + + var/obj/item/weapon/implant/amnesia/L = new/obj/item/weapon/implant/amnesia(M) + L.imp_in = M + L.implanted = 1 + var/obj/item/organ/external/affected = M.organs_by_name["head"] + affected.implants += L + L.part = affected + L.implanted(src) + +/mob/living/carbon/human/proc/is_amnesia_implanted(mob/living/carbon/human/M) + for(var/L in M.contents) + if(istype(L, /obj/item/weapon/implant/amnesia)) + for(var/obj/item/organ/external/O in M.organs) + if(L in O.implants) + return 1 + return 0 + /mob/living/carbon/human/restrained() if (handcuffed) return 1 diff --git a/code/modules/mob/living/carbon/human/human_species.dm b/code/modules/mob/living/carbon/human/human_species.dm index f7a644646dada..56d0b820b1794 100644 --- a/code/modules/mob/living/carbon/human/human_species.dm +++ b/code/modules/mob/living/carbon/human/human_species.dm @@ -6,6 +6,10 @@ h_style = "Skrell Male Tentacles" ..(new_loc, "Skrell") +/mob/living/carbon/human/Kidan/New(var/new_loc) + h_style = "Bald" + ..(new_loc, "Kidan") + /mob/living/carbon/human/tajaran/New(var/new_loc) h_style = "Tajaran Ears" ..(new_loc, "Tajara") diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index bfbc8a260f3fb..1c0317c9eb072 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -277,6 +277,8 @@ radiation = Clamp(radiation,0,100) if (radiation) + if(src.species.name == "Kidan") + return var/obj/item/organ/diona/nutrients/rad_organ = locate() in internal_organs if(rad_organ && !rad_organ.is_broken()) var/rads = radiation/25 diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm index d23c0836b23d5..9620caf77c923 100644 --- a/code/modules/mob/living/carbon/human/species/station/station.dm +++ b/code/modules/mob/living/carbon/human/species/station/station.dm @@ -245,7 +245,7 @@ icobase = 'icons/mob/human_races/r_machine.dmi' deform = 'icons/mob/human_races/r_machine.dmi' - language = "Tradeband" + language = "Encoded Audio Language" unarmed_types = list(/datum/unarmed_attack/punch) rarity_value = 2 @@ -275,6 +275,7 @@ has_organ = list() //TODO: Positronic brain. + /datum/species/machine/equip_survival_gear(var/mob/living/carbon/human/H) /datum/species/machine/handle_death(var/mob/living/carbon/human/H) @@ -283,3 +284,20 @@ H.h_style = "" spawn(100) if(H) H.update_hair() + +/datum/species/kidan + name = "Kidan" + name_plural = "Kidan" + icobase = 'icons/mob/human_races/r_kidan.dmi' + deform = 'icons/mob/human_races/r_def_kidan.dmi' + eyes = "kidan_eyes_s" + language = "Chittin" + unarmed_types = list(/datum/unarmed_attack/claws) + brute_mod = 0.7 + burn_mod = 1.3 + darksight = 8 + + flags = CAN_JOIN | IS_WHITELISTED | HAS_UNDERWEAR | HAS_LIPS | HAS_SKIN_COLOR + + blood_color = "#328332" + flesh_color = "#8C4600" \ No newline at end of file diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 574af8bf3d5c9..84be61a2e3762 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -143,6 +143,8 @@ var/list/ai_verbs_default = list( add_language("Skrellian", 0) add_language("Tradeband", 1) add_language("Gutter", 0) + add_language("Chittin", 0) + add_language("Encoded Audio Language", 0) if(!safety)//Only used by AIize() to successfully spawn an AI. if (!B)//If there is no player/brain inside. diff --git a/code/modules/mob/living/silicon/pai/software_modules.dm b/code/modules/mob/living/silicon/pai/software_modules.dm index f7434ebe9150c..b4904cfc97ecb 100644 --- a/code/modules/mob/living/silicon/pai/software_modules.dm +++ b/code/modules/mob/living/silicon/pai/software_modules.dm @@ -471,10 +471,14 @@ user.add_language("Sinta'unathi") user.add_language("Siik'tajr") user.add_language("Skrellian") + user.add_language("Chittin") + user.add_language("Encoded Audio Language") else user.remove_language("Sinta'unathi") user.remove_language("Siik'tajr") user.remove_language("Skrellian") + user.remove_language("Chittin") + user.remove_language("Encoded Audio Language") is_active(mob/living/silicon/pai/user) return user.translator_on diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 8f90747a02d5d..320af63152b6f 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -725,6 +725,7 @@ var/global/list/robot_modules = list( /obj/item/weapon/robot_module/drone/construction/New() ..() + src.modules += new /obj/item/weapon/gripper/no_use/loader(src) src.modules += new /obj/item/weapon/rcd/borg(src) /obj/item/weapon/robot_module/drone/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm index 322d08dc9ff34..34ae26c1c3066 100644 --- a/code/modules/mob/living/simple_animal/friendly/corgi.dm +++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm @@ -24,6 +24,236 @@ var/obj/item/inventory_back var/facehugger +/mob/living/simple_animal/corgi/Life() + ..() + regenerate_icons() + +/mob/living/simple_animal/corgi/show_inv(mob/user as mob) + user.set_machine(src) + if(user.stat) return + + var/dat = "
Inventory of [name]

" + if(inventory_head) + dat += "
Head: [inventory_head] (Remove)" + else + dat += "
Head: Nothing" + if(inventory_back) + dat += "
Back: [inventory_back] (Remove)" + else + dat += "
Back: Nothing" + + user << browse(dat, text("window=mob[];size=325x500", name)) + onclose(user, "mob[real_name]") + return + +/mob/living/simple_animal/corgi/attackby(var/obj/item/O as obj, var/mob/user as mob) + if(inventory_head && inventory_back) + //helmet and armor = 100% protection + if( istype(inventory_head,/obj/item/clothing/head/helmet) && istype(inventory_back,/obj/item/clothing/suit/armor) ) + if( O.force ) + usr << "\red This animal is wearing too much armor. You can't cause /him any damage." + for (var/mob/M in viewers(src, null)) + M.show_message("\red \b [user] hits [src] with the [O], however [src] is too armored.") + else + usr << "\red This animal is wearing too much armor. You can't reach its skin." + for (var/mob/M in viewers(src, null)) + M.show_message("\red [user] gently taps [src] with the [O]. ") + if(prob(15)) + visible_emote("looks at [user] with [pick("an amused","an annoyed","a confused","a resentful", "a happy", "an excited")] expression on \his face") + return + ..() + +/mob/living/simple_animal/corgi/Topic(href, href_list) + if(usr.stat) return + + //Removing from inventory + if(href_list["remove_inv"]) + if(!Adjacent(usr) || !(ishuman(usr) || isrobot(usr))) + return + var/remove_from = href_list["remove_inv"] + switch(remove_from) + if("head") + if(inventory_head) + name = real_name + desc = initial(desc) + speak = list("YAP", "Woof!", "Bark!", "AUUUUUU") + speak_emote = list("barks", "woofs") + emote_hear = list("barks", "woofs", "yaps","pants") + emote_see = list("shakes its head", "shivers") + desc = "It's a corgi." + inventory_head.loc = src.loc + inventory_head = null + else + usr << "\red There is nothing to remove from its [remove_from]." + return + if("back") + if(inventory_back) + inventory_back.loc = src.loc + inventory_back = null + else + usr << "\red There is nothing to remove from its [remove_from]." + return + + //show_inv(usr) //Commented out because changing Ian's name and then calling up his inventory opens a new inventory...which is annoying. + + //Adding things to inventory + else if(href_list["add_inv"]) + if(!Adjacent(usr) || !(ishuman(usr) || isrobot(usr))) + return + var/add_to = href_list["add_inv"] + if(!usr.get_active_hand()) + usr << "\red You have nothing in your hand to put on its [add_to]." + return + switch(add_to) + if("head") + if(inventory_head) + usr << "\red It's is already wearing something." + return + else + place_on_head(usr.get_active_hand()) + + var/obj/item/item_to_add = usr.get_active_hand() + if(!item_to_add) + return + + //Corgis are supposed to be simpler, so only a select few objects can actually be put + //to be compatible with them. The objects are below. + //Many hats added, Some will probably be removed, just want to see which ones are popular. + + var/list/allowed_types = list( + /obj/item/clothing/head/helmet, + /obj/item/clothing/glasses/sunglasses, + /obj/item/clothing/head/caphat, + /obj/item/clothing/head/collectable/captain, + /obj/item/clothing/head/that, + /obj/item/clothing/head/that, + /obj/item/clothing/head/kitty, + /obj/item/clothing/head/collectable/kitty, + /obj/item/clothing/head/rabbitears, + /obj/item/clothing/head/collectable/rabbitears, + /obj/item/clothing/head/beret, + /obj/item/clothing/head/collectable/beret, + /obj/item/clothing/head/det_hat, + /obj/item/clothing/head/nursehat, + /obj/item/clothing/head/pirate, + /obj/item/clothing/head/collectable/pirate, + /obj/item/clothing/head/ushanka, + /obj/item/clothing/head/chefhat, + /obj/item/clothing/head/collectable/chef, + /obj/item/clothing/head/collectable/police, + /obj/item/clothing/head/wizard/fake, + /obj/item/clothing/head/wizard, + /obj/item/clothing/head/collectable/wizard, + /obj/item/clothing/head/hardhat, + /obj/item/clothing/head/collectable/hardhat, + /obj/item/clothing/head/hardhat/white, + /obj/item/weapon/bedsheet, + /obj/item/clothing/head/helmet/space/santahat, + /obj/item/clothing/head/collectable/paper, + /obj/item/clothing/head/soft + ) + + if( ! ( item_to_add.type in allowed_types ) ) + usr << "\red It doesn't seem too keen on wearing that item." + return + + usr.drop_item() + + place_on_head(item_to_add) + + if("back") + if(inventory_back) + usr << "\red It's already wearing something." + return + else + var/obj/item/item_to_add = usr.get_active_hand() + if(!item_to_add) + return + + //Corgis are supposed to be simpler, so only a select few objects can actually be put + //to be compatible with them. The objects are below. + + var/list/allowed_types = list( + /obj/item/clothing/suit/armor/vest, + /obj/item/device/radio + ) + + if( ! ( item_to_add.type in allowed_types ) ) + usr << "\red This object won't fit." + return + + usr.drop_item() + item_to_add.loc = src + src.inventory_back = item_to_add + regenerate_icons() + + //show_inv(usr) //Commented out because changing Ian's name and then calling up his inventory opens a new inventory...which is annoying. + else + ..() + +/mob/living/simple_animal/corgi/proc/place_on_head(obj/item/item_to_add) + item_to_add.loc = src + src.inventory_head = item_to_add + regenerate_icons() + + //Various hats and items (worn on his head) change Ian's behaviour. His attributes are reset when a HAT is removed. + switch(inventory_head && inventory_head.type) + if(/obj/item/clothing/head/caphat, /obj/item/clothing/head/collectable/captain) + name = "Captain [real_name]" + desc = "Probably better than the last captain." + if(/obj/item/clothing/head/kitty, /obj/item/clothing/head/collectable/kitty) + name = "Runtime" + emote_see = list("coughs up a furball", "stretches") + emote_hear = list("purrs") + speak = list("Purrr", "Meow!", "MAOOOOOW!", "HISSSSS", "MEEEEEEW") + desc = "It's a cute little kitty-cat! ... wait ... what the hell?" + if(/obj/item/clothing/head/rabbitears, /obj/item/clothing/head/collectable/rabbitears) + name = "Hoppy" + emote_see = list("twitches its nose", "hops around a bit") + desc = "This is hoppy. It's a corgi-...urmm... bunny rabbit" + if(/obj/item/clothing/head/beret, /obj/item/clothing/head/collectable/beret) + name = "Yann" + desc = "Mon dieu! C'est un chien!" + speak = list("le woof!", "le bark!", "JAPPE!!") + emote_see = list("cowers in fear", "surrenders", "plays dead","looks as though there is a wall in front of him") + if(/obj/item/clothing/head/det_hat) + name = "Detective [real_name]" + desc = "[name] sees through your lies..." + emote_see = list("investigates the area","sniffs around for clues","searches for scooby snacks") + if(/obj/item/clothing/head/nursehat) + name = "Nurse [real_name]" + desc = "[name] needs 100cc of beef jerky...STAT!" + if(/obj/item/clothing/head/pirate, /obj/item/clothing/head/collectable/pirate) + name = "[pick("Ol'","Scurvy","Black","Rum","Gammy","Bloody","Gangrene","Death","Long-John")] [pick("kibble","leg","beard","tooth","poop-deck","Threepwood","Le Chuck","corsair","Silver","Crusoe")]" + desc = "Yaarghh!! Thar' be a scurvy dog!" + emote_see = list("hunts for treasure","stares coldly...","gnashes his tiny corgi teeth") + emote_hear = list("growls ferociously", "snarls") + speak = list("Arrrrgh!!","Grrrrrr!") + if(/obj/item/clothing/head/ushanka) + name = "[pick("Comrade","Commissar","Glorious Leader")] [real_name]" + desc = "A follower of Karl Barx." + emote_see = list("contemplates the failings of the capitalist economic model", "ponders the pros and cons of vangaurdism") + if(/obj/item/clothing/head/collectable/police) + name = "Officer [real_name]" + emote_see = list("drools","looks for donuts") + desc = "Stop right there criminal scum!" + if(/obj/item/clothing/head/wizard/fake, /obj/item/clothing/head/wizard, /obj/item/clothing/head/collectable/wizard) + name = "Grandwizard [real_name]" + speak = list("YAP", "Woof!", "Bark!", "AUUUUUU", "EI NATH!") + if(/obj/item/weapon/bedsheet) + name = "\improper Ghost" + speak = list("WoooOOOooo~","AUUUUUUUUUUUUUUUUUU") + emote_see = list("stumbles around", "shivers") + emote_hear = list("howls","groans") + desc = "Spooky!" + if(/obj/item/clothing/head/helmet/space/santahat) + name = "Rudolph the Red-Nosed Corgi" + emote_hear = list("barks christmas songs", "yaps") + desc = "He has a very shiny nose." + if(/obj/item/clothing/head/soft) + name = "Corgi Tech [real_name]" + desc = "The reason your yellow gloves have chew-marks." + //IAN! SQUEEEEEEEEE~ /mob/living/simple_animal/corgi/Ian name = "Ian" diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 89a4957e3fb87..c6fb8f6081f29 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -95,7 +95,7 @@ var/list/speak_emote = list("says") // Verbs used when speaking. Defaults to 'say' if speak_emote is null. var/emote_type = 1 // Define emote default type, 1 for seen emotes, 2 for heard emotes var/facing_dir = null // Used for the ancient art of moonwalking. - + var/slaver = null var/name_archive //For admin things like possession var/timeofdeath = 0.0//Living diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index 9cbf970b5dbc4..9c3228dea71c0 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -123,7 +123,7 @@ if(href_list["amount"]) var/id = href_list["add"] - var/amount = isgoodnumber(text2num(href_list["amount"])) + var/amount = text2num(href_list["amount"]) R.trans_id_to(src, id, amount) else if (href_list["addcustom"]) @@ -137,7 +137,7 @@ if(href_list["amount"]) var/id = href_list["remove"] - var/amount = isgoodnumber(text2num(href_list["amount"])) + var/amount = text2num(href_list["amount"]) if(mode) reagents.trans_id_to(beaker, id, amount) else @@ -165,23 +165,12 @@ icon_state = "mixer0" else if (href_list["createpill"] || href_list["createpill_multiple"]) var/count = 1 - - if(reagents.total_volume/count < 1) //Sanity checking. - return - - if (href_list["createpill_multiple"]) - count = Clamp(isgoodnumber(input("Select the number of pills to make.", 10, pillamount) as num),1,max_pill_count) - - if(reagents.total_volume/count < 1) //Sanity checking. - return - + if (href_list["createpill_multiple"]) count = isgoodnumber(input("Select the number of pills to make.", 10, pillamount) as num) + if (count > 15) count = 15 //Pevent people from creating huge stacks of pills easily. Maybe move the number to defines? + if (count <= 0) return var/amount_per_pill = reagents.total_volume/count if (amount_per_pill > 60) amount_per_pill = 60 - - var/name = sanitizeSafe(input(usr,"Name:","Name your pill!","[reagents.get_master_reagent_name()] ([amount_per_pill] units)"), MAX_NAME_LEN) - - if(reagents.total_volume/count < 1) //Sanity checking. - return + var/name = reject_bad_text(input(usr,"Name:","Name your pill!","[reagents.get_master_reagent_name()] ([amount_per_pill] units)")) while (count--) var/obj/item/weapon/reagent_containers/pill/P = new/obj/item/weapon/reagent_containers/pill(src.loc) if(!name) name = reagents.get_master_reagent_name() diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm index fdbac0339e297..94d5a3208460f 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm @@ -1932,3 +1932,77 @@ glass_name = "glass of special blend whiskey" glass_desc = "Just when you thought regular station whiskey was good... This silky, amber goodness has to come along and ruin everything." glass_center_of_mass = list("x"=16, "y"=12) + +/////Drink Expansion///// + +/datum/reagent/drink/cherrycola + name = "Cherry Space Cola" + id = "cherrycola" + description = "The only variation of space cola anyone likes." + color = "#102000" + adj_drowsy = -6 + adj_temp = -5 + + glass_icon_state = "glass_brown" + glass_name = "glass of Cherry Space Cola" + glass_desc = "The only variation of space cola anyone likes." + +/datum/reagent/drink/vanillacola + name = "Vanilla Space Cola" + id = "vanillacola" + description = "Tastes like vanilla ice cream filtered through a Space Cola factory workers socks." + color = "#102000" + adj_drowsy = -6 + adj_temp = -5 + + glass_icon_state = "glass_brown" + glass_name = "glass of Vanilla Space Cola" + glass_desc = "Tastes like vanilla ice cream filtered through a Space Cola factory workers socks." + +/datum/reagent/drink/nanopop + name = "Nanopop" + id = "nanopop" + description = "NanoTrasen's attempt to break through into the cola market." + color = "#102000" + adj_drowsy = -6 + adj_temp = -5 + + glass_icon_state = "glass_brown" + glass_name = "glass of Nanopop" + glass_desc = "NanoTrasen's attempt to break through into the cola market" + +/datum/reagent/drink/mintwalker + name = "Mint Walker" + id = "mintwalker" + description = "Walk the path of freshness." + color = "#102000" + adj_drowsy = -6 + adj_temp = -5 + + glass_icon_state = "glass_green" + glass_name = "glass of Mint Walker" + glass_desc = "Walk the path of freshness." + +/datum/reagent/drink/noblelotus + name = "Noble Lotus" + id = "noblelotus" + description = "You'd rate this a Tenno out of Ten." + color = "#102000" + adj_drowsy = -6 + adj_temp = -5 + + glass_icon_state = "glass_clear" + glass_name = "glass of Noble Lotus" + glass_desc = "You'd rate this a Tenno out of Ten." + +/datum/reagent/drink/holyslammer + name = "Holy Slammer" + id = "holyslammer" + description = "Reverend Barkley invites you to slam." + color = "#102000" + adj_drowsy = -6 + adj_temp = -5 + + glass_icon_state = "glass_clear" + glass_name = "glass of Holy Slammer" + glass_desc = "Reverend Barkley invites you to slam." diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index df024794b7d49..f2f00cb0ba0fa 100644 --- a/code/modules/reagents/Chemistry-Recipes.dm +++ b/code/modules/reagents/Chemistry-Recipes.dm @@ -976,7 +976,7 @@ P.loc = get_turf(holder.my_atom) ..() -//Gold - removed +//Gold - removed // Re-Added and changed /datum/chemical_reaction/slime/crit name = "Slime Crit" id = "m_tele" @@ -984,7 +984,15 @@ required_reagents = list("phoron" = 1) result_amount = 1 required = /obj/item/slime_extract/gold - mix_message = "The slime core fizzles disappointingly." + +/datum/chemical_reaction/slime/gold/on_reaction(var/datum/reagents/holder) + var/obj/item/stack/material/gold/M = new /obj/item/stack/material/gold + M.amount = 3 + M.loc = get_turf(holder.my_atom) + var/obj/item/stack/material/silver/P = new /obj/item/stack/material/silver + P.amount = 2 + P.loc = get_turf(holder.my_atom) + ..() //Silver /datum/chemical_reaction/slime/bork diff --git a/code/modules/reagents/reagent_containers/food/cans.dm b/code/modules/reagents/reagent_containers/food/cans.dm index 8155207b7e41f..9e336ca3841f7 100644 --- a/code/modules/reagents/reagent_containers/food/cans.dm +++ b/code/modules/reagents/reagent_containers/food/cans.dm @@ -163,3 +163,59 @@ New() ..() reagents.add_reagent("sodawater", 50) + +/////////////Cans Expansion////////////// + +/obj/item/weapon/reagent_containers/food/drinks/cans/cherrycola + name = "Cherry Space Cola" + desc = "The only variation of space cola anyone likes." + icon_state = "cherrycola" + center_of_mass = list("x"=16, "y"=10) + New() + ..() + reagents.add_reagent("cherrycola", 30) + +/obj/item/weapon/reagent_containers/food/drinks/cans/vanillacola + name = "Vanilla Space Cola" + desc = "Tastes like vanilla ice cream filtered through a Space Cola factory workers socks" + icon_state = "vanillacola" + center_of_mass = list("x"=16, "y"=10) + New() + ..() + reagents.add_reagent("vanillacola", 30) + +/obj/item/weapon/reagent_containers/food/drinks/cans/nanopop + name = "Nanopop" + desc = "NanoTrasen's attempt to break through into the cola market." + icon_state = "nanopop" + center_of_mass = list("x"=16, "y"=10) + New() + ..() + reagents.add_reagent("nanopop", 30) + +/obj/item/weapon/reagent_containers/food/drinks/cans/mintwalker + name = "Mint Walker" + desc = "Walk the path of freshness." + icon_state = "mintwalker" + center_of_mass = list("x"=16, "y"=10) + New() + ..() + reagents.add_reagent("mintwalker", 30) + +/obj/item/weapon/reagent_containers/food/drinks/cans/noblelotus + name = "Noble Lotus" + desc = "You'd rate this a Tenno out of Ten." + icon_state = "noblelotus" + center_of_mass = list("x"=16, "y"=10) + New() + ..() + reagents.add_reagent("noblelotus", 30) + +/obj/item/weapon/reagent_containers/food/drinks/cans/holyslammer + name = "Holy Slammer" + desc = "Reverend Barkley invites you to slam." + icon_state = "holyslammer" + center_of_mass = list("x"=16, "y"=10) + New() + ..() + reagents.add_reagent("holyslammer", 30) \ No newline at end of file diff --git a/code/modules/security levels/keycard authentication.dm b/code/modules/security levels/keycard authentication.dm index 1fd84a13ade07..6325c7a5c9bff 100644 --- a/code/modules/security levels/keycard authentication.dm +++ b/code/modules/security levels/keycard authentication.dm @@ -65,6 +65,7 @@ if(screen == 1) dat += "Select an event to trigger: