diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 9af84740ad8..9a687fb4421 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,4 +1,4 @@ -#### Brief description of the issue +#### Brief description of the bug #### What you expected to happen diff --git a/code/ATMOSPHERICS/components/shutoff.dm b/code/ATMOSPHERICS/components/shutoff.dm new file mode 100644 index 00000000000..de69f5e395e --- /dev/null +++ b/code/ATMOSPHERICS/components/shutoff.dm @@ -0,0 +1,57 @@ +GLOBAL_LIST_EMPTY(shutoff_valves) + +/obj/machinery/atmospherics/valve/shutoff + icon = 'icons/atmos/clamp.dmi' + icon_state = "map_vclamp0" + pipe_state = "vclamp" + + name = "automatic shutoff valve" + desc = "An automatic valve with control circuitry and pipe integrity sensor, capable of automatically isolating damaged segments of the pipe network." + var/close_on_leaks = TRUE // If false it will be always open + level = 1 + +/obj/machinery/atmospherics/valve/shutoff/update_icon() + icon_state = "vclamp[open]" + +/obj/machinery/atmospherics/valve/shutoff/examine(var/mob/user) + ..() + to_chat(user, "The automatic shutoff circuit is [close_on_leaks ? "enabled" : "disabled"].") + +/obj/machinery/atmospherics/valve/shutoff/Initialize() + . = ..() + open() + GLOB.shutoff_valves += src + hide(1) + +/obj/machinery/atmospherics/valve/shutoff/Destroy() + GLOB.shutoff_valves -= src + ..() + +/obj/machinery/atmospherics/valve/shutoff/attack_ai(mob/user as mob) + return src.attack_hand(user) + +/obj/machinery/atmospherics/valve/shutoff/attack_hand(var/mob/user) + src.add_fingerprint(usr) + update_icon(1) + close_on_leaks = !close_on_leaks + to_chat(user, "You [close_on_leaks ? "enable" : "disable"] the automatic shutoff circuit.") + return TRUE + +/obj/machinery/atmospherics/valve/shutoff/process() + ..() + + if (!network_node1 || !network_node2) + if(open) + close() + return + + if (!close_on_leaks) + if (!open) + open() + return + + if (network_node1.leaks.len || network_node2.leaks.len) + if (open) + close() + else if (!open) + open() diff --git a/code/ATMOSPHERICS/components/unary/outlet_injector.dm b/code/ATMOSPHERICS/components/unary/outlet_injector.dm index ee1379ac288..5e62fe58021 100644 --- a/code/ATMOSPHERICS/components/unary/outlet_injector.dm +++ b/code/ATMOSPHERICS/components/unary/outlet_injector.dm @@ -1,4 +1,4 @@ -//Basically a one way passive valve. If the pressure inside is greater than the environment then gas will flow passively, +//Basically a one way passive valve. If the pressure inside is greater than the environment then gas will flow passively, //but it does not permit gas to flow back from the environment into the injector. Can be turned off to prevent any gas flow. //When it receives the "inject" signal, it will try to pump it's entire contents into the environment regardless of pressure, using power. @@ -13,7 +13,7 @@ use_power = 0 idle_power_usage = 150 //internal circuitry, friction losses and stuff power_rating = 15000 //15000 W ~ 20 HP - + var/injecting = 0 var/volume_rate = 50 //flow rate limit @@ -26,7 +26,7 @@ /obj/machinery/atmospherics/unary/outlet_injector/New() ..() - air_contents.volume = ATMOS_DEFAULT_VOLUME_PUMP + 500 //Give it a small reservoir for injecting. Also allows it to have a higher flow rate limit than vent pumps, to differentiate injectors a bit more. + air_contents.volume = ATMOS_DEFAULT_VOLUME_PUMP + 500 //Give it a small reservoir for injecting. Also allows it to have a higher flow rate limit than vent pumps, to differentiate injectors a bit more. /obj/machinery/atmospherics/unary/outlet_injector/Destroy() unregister_radio(src, frequency) @@ -60,21 +60,21 @@ if((stat & (NOPOWER|BROKEN)) || !use_power) return - + var/power_draw = -1 var/datum/gas_mixture/environment = loc.return_air() - + if(environment && air_contents.temperature > 0) var/transfer_moles = (volume_rate/air_contents.volume)*air_contents.total_moles //apply flow rate limit power_draw = pump_gas(src, air_contents, environment, transfer_moles, power_rating) - + if (power_draw >= 0) last_power_draw = power_draw use_power(power_draw) - + if(network) network.update = 1 - + return 1 /obj/machinery/atmospherics/unary/outlet_injector/proc/inject() @@ -84,7 +84,7 @@ var/datum/gas_mixture/environment = loc.return_air() if (!environment) return 0 - + injecting = 1 if(air_contents.temperature > 0) @@ -155,4 +155,23 @@ update_icon() /obj/machinery/atmospherics/unary/outlet_injector/hide(var/i) - update_underlays() \ No newline at end of file + update_underlays() + +/obj/machinery/atmospherics/unary/outlet_injector/attack_hand(mob/user as mob) + to_chat(user, "You toggle \the [src].") + injecting = !injecting + use_power = injecting + update_icon() + +/obj/machinery/atmospherics/unary/outlet_injector/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) + if (!W.is_wrench()) + return ..() + + playsound(src, W.usesound, 50, 1) + to_chat(user, "You begin to unfasten \the [src]...") + if (do_after(user, 40 * W.toolspeed)) + user.visible_message( \ + "\The [user] unfastens \the [src].", \ + "You have unfastened \the [src].", \ + "You hear a ratchet.") + deconstruct() diff --git a/code/ATMOSPHERICS/datum_pipe_network.dm b/code/ATMOSPHERICS/datum_pipe_network.dm index eb5e89276ef..a611e30a893 100644 --- a/code/ATMOSPHERICS/datum_pipe_network.dm +++ b/code/ATMOSPHERICS/datum_pipe_network.dm @@ -8,76 +8,83 @@ var/global/list/datum/pipe_network/pipe_networks = list() // TODO - Move into SS var/list/datum/pipeline/line_members = list() //membership roster to go through for updates and what not + var/list/leaks = list() + var/update = 1 //var/datum/gas_mixture/air_transient = null - Destroy() - STOP_PROCESSING_PIPENET(src) - for(var/datum/pipeline/line_member in line_members) - line_member.network = null - for(var/obj/machinery/atmospherics/normal_member in normal_members) - normal_member.reassign_network(src, null) - gases.Cut() // Do not qdel the gases, we don't own them - return ..() +/datum/pipe_network/Destroy() + STOP_PROCESSING_PIPENET(src) + for(var/datum/pipeline/line_member in line_members) + line_member.network = null + for(var/obj/machinery/atmospherics/normal_member in normal_members) + normal_member.reassign_network(src, null) + gases.Cut() // Do not qdel the gases, we don't own them + leaks.Cut() + return ..() - process() - //Equalize gases amongst pipe if called for - if(update) - update = 0 - reconcile_air() //equalize_gases(gases) +/datum/pipe_network/process() + //Equalize gases amongst pipe if called for + if(update) + update = 0 + reconcile_air() //equalize_gases(gases) - //Give pipelines their process call for pressure checking and what not. Have to remove pressure checks for the time being as pipes dont radiate heat - Mport - //for(var/datum/pipeline/line_member in line_members) - // line_member.process() + listclearnulls(leaks) // Let's not have forever-seals. - proc/build_network(obj/machinery/atmospherics/start_normal, obj/machinery/atmospherics/reference) - //Purpose: Generate membership roster - //Notes: Assuming that members will add themselves to appropriate roster in network_expand() + //Give pipelines their process call for pressure checking and what not. Have to remove pressure checks for the time being as pipes dont radiate heat - Mport + //for(var/datum/pipeline/line_member in line_members) + // line_member.process() - if(!start_normal) - qdel(src) - return +/datum/pipe_network/proc/build_network(obj/machinery/atmospherics/start_normal, obj/machinery/atmospherics/reference) + //Purpose: Generate membership roster + //Notes: Assuming that members will add themselves to appropriate roster in network_expand() - start_normal.network_expand(src, reference) + if(!start_normal) + qdel(src) + return - update_network_gases() + start_normal.network_expand(src, reference) - if((normal_members.len>0)||(line_members.len>0)) - START_PROCESSING_PIPENET(src) - else - qdel(src) + update_network_gases() - proc/merge(datum/pipe_network/giver) - if(giver==src) return 0 + if((normal_members.len>0)||(line_members.len>0)) + START_PROCESSING_PIPENET(src) + else + qdel(src) - normal_members |= giver.normal_members +/datum/pipe_network/proc/merge(datum/pipe_network/giver) + if(giver==src) return 0 - line_members |= giver.line_members + normal_members |= giver.normal_members - for(var/obj/machinery/atmospherics/normal_member in giver.normal_members) - normal_member.reassign_network(giver, src) + line_members |= giver.line_members - for(var/datum/pipeline/line_member in giver.line_members) - line_member.network = src + leaks |= giver.leaks - update_network_gases() - return 1 + for(var/obj/machinery/atmospherics/normal_member in giver.normal_members) + normal_member.reassign_network(giver, src) - proc/update_network_gases() - //Go through membership roster and make sure gases is up to date + for(var/datum/pipeline/line_member in giver.line_members) + line_member.network = src - gases = list() - volume = 0 + update_network_gases() + return 1 - for(var/obj/machinery/atmospherics/normal_member in normal_members) - var/result = normal_member.return_network_air(src) - if(result) gases += result +/datum/pipe_network/proc/update_network_gases() + //Go through membership roster and make sure gases is up to date - for(var/datum/pipeline/line_member in line_members) - gases += line_member.air + gases = list() + volume = 0 - for(var/datum/gas_mixture/air in gases) - volume += air.volume + for(var/obj/machinery/atmospherics/normal_member in normal_members) + var/result = normal_member.return_network_air(src) + if(result) gases += result - proc/reconcile_air() - equalize_gases(gases) + for(var/datum/pipeline/line_member in line_members) + gases += line_member.air + + for(var/datum/gas_mixture/air in gases) + volume += air.volume + +/datum/pipe_network/proc/reconcile_air() + equalize_gases(gases) diff --git a/code/ATMOSPHERICS/datum_pipeline.dm b/code/ATMOSPHERICS/datum_pipeline.dm index fc47bca9381..b53d722458b 100644 --- a/code/ATMOSPHERICS/datum_pipeline.dm +++ b/code/ATMOSPHERICS/datum_pipeline.dm @@ -1,219 +1,234 @@ -datum/pipeline +/datum/pipeline var/datum/gas_mixture/air var/list/obj/machinery/atmospherics/pipe/members var/list/obj/machinery/atmospherics/pipe/edges //Used for building networks + // Nodes that are leaking. Used for A.S. Valves. + var/list/leaks = list() + var/datum/pipe_network/network var/alert_pressure = 0 - Destroy() - QDEL_NULL(network) +/datum/pipeline/Destroy() + QDEL_NULL(network) - if(air && air.volume) - temporarily_store_air() - for(var/obj/machinery/atmospherics/pipe/P in members) - P.parent = null - members = null - edges = null - . = ..() + if(air && air.volume) + temporarily_store_air() + for(var/obj/machinery/atmospherics/pipe/P in members) + P.parent = null + members = null + edges = null + leaks = null + . = ..() - process()//This use to be called called from the pipe networks - - //Check to see if pressure is within acceptable limits - var/pressure = air.return_pressure() - if(pressure > alert_pressure) - for(var/obj/machinery/atmospherics/pipe/member in members) - if(!member.check_pressure(pressure)) - break //Only delete 1 pipe per process - - proc/temporarily_store_air() - //Update individual gas_mixtures by volume ratio +/datum/pipeline/process()//This use to be called called from the pipe networks + //Check to see if pressure is within acceptable limits + var/pressure = air.return_pressure() + if(pressure > alert_pressure) for(var/obj/machinery/atmospherics/pipe/member in members) - member.air_temporary = new - member.air_temporary.copy_from(air) - member.air_temporary.volume = member.volume - member.air_temporary.multiply(member.volume / air.volume) + if(!member.check_pressure(pressure)) + break //Only delete 1 pipe per process - proc/build_pipeline(obj/machinery/atmospherics/pipe/base) +/datum/pipeline/proc/temporarily_store_air() + //Update individual gas_mixtures by volume ratio + + for(var/obj/machinery/atmospherics/pipe/member in members) + member.air_temporary = new + member.air_temporary.copy_from(air) + member.air_temporary.volume = member.volume + member.air_temporary.multiply(member.volume / air.volume) + +/datum/pipeline/proc/build_pipeline(obj/machinery/atmospherics/pipe/base) + air = new + + var/list/possible_expansions = list(base) + members = list(base) + edges = list() + + var/volume = base.volume + base.parent = src + alert_pressure = base.alert_pressure + + if(base.air_temporary) + air = base.air_temporary + base.air_temporary = null + else air = new - var/list/possible_expansions = list(base) - members = list(base) - edges = list() + if(base.leaking) + leaks |= base - var/volume = base.volume - base.parent = src - alert_pressure = base.alert_pressure + while(possible_expansions.len>0) + for(var/obj/machinery/atmospherics/pipe/borderline in possible_expansions) - if(base.air_temporary) - air = base.air_temporary - base.air_temporary = null - else - air = new + var/list/result = borderline.pipeline_expansion() + var/edge_check = result.len - while(possible_expansions.len>0) - for(var/obj/machinery/atmospherics/pipe/borderline in possible_expansions) + if(result.len>0) + for(var/obj/machinery/atmospherics/pipe/item in result) - var/list/result = borderline.pipeline_expansion() - var/edge_check = result.len + if(item.in_stasis) + continue - if(result.len>0) - for(var/obj/machinery/atmospherics/pipe/item in result) - if(!members.Find(item)) - members += item - possible_expansions += item + if(!members.Find(item)) + members += item + possible_expansions += item - volume += item.volume - item.parent = src + volume += item.volume + item.parent = src - alert_pressure = min(alert_pressure, item.alert_pressure) + alert_pressure = min(alert_pressure, item.alert_pressure) - if(item.air_temporary) - air.merge(item.air_temporary) + if(item.air_temporary) + air.merge(item.air_temporary) - edge_check-- + if(item.leaking) + leaks |= item - if(edge_check>0) - edges += borderline + edge_check-- - possible_expansions -= borderline + if(edge_check>0) + edges += borderline - air.volume = volume + possible_expansions -= borderline - proc/network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference) + air.volume = volume - if(new_network.line_members.Find(src)) - return 0 +/datum/pipeline/proc/network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference) - new_network.line_members += src + if(new_network.line_members.Find(src)) + return 0 - network = new_network + new_network.line_members += src - for(var/obj/machinery/atmospherics/pipe/edge in edges) - for(var/obj/machinery/atmospherics/result in edge.pipeline_expansion()) - if(!istype(result,/obj/machinery/atmospherics/pipe) && (result!=reference)) - result.network_expand(new_network, edge) + network = new_network + network.leaks |= leaks - return 1 + for(var/obj/machinery/atmospherics/pipe/edge in edges) + for(var/obj/machinery/atmospherics/result in edge.pipeline_expansion()) + if(!istype(result,/obj/machinery/atmospherics/pipe) && (result!=reference)) + result.network_expand(new_network, edge) - proc/return_network(obj/machinery/atmospherics/reference) - if(!network) - network = new /datum/pipe_network() - network.build_network(src, null) - //technically passing these parameters should not be allowed - //however pipe_network.build_network(..) and pipeline.network_extend(...) - // were setup to properly handle this case + return 1 - return network +/datum/pipeline/proc/return_network(obj/machinery/atmospherics/reference) + if(!network) + network = new /datum/pipe_network() + network.build_network(src, null) + //technically passing these parameters should not be allowed + //however pipe_network.build_network(..) and pipeline.network_extend(...) + // were setup to properly handle this case - proc/mingle_with_turf(turf/simulated/target, mingle_volume) - var/datum/gas_mixture/air_sample = air.remove_ratio(mingle_volume/air.volume) - air_sample.volume = mingle_volume + return network - if(istype(target) && target.zone) - //Have to consider preservation of group statuses - var/datum/gas_mixture/turf_copy = new - var/datum/gas_mixture/turf_original = new +/datum/pipeline/proc/mingle_with_turf(turf/simulated/target, mingle_volume) + var/datum/gas_mixture/air_sample = air.remove_ratio(mingle_volume/air.volume) + air_sample.volume = mingle_volume - turf_copy.copy_from(target.zone.air) - turf_copy.volume = target.zone.air.volume //Copy a good representation of the turf from parent group - turf_original.copy_from(turf_copy) + if(istype(target) && target.zone) + //Have to consider preservation of group statuses + var/datum/gas_mixture/turf_copy = new + var/datum/gas_mixture/turf_original = new - equalize_gases(list(air_sample, turf_copy)) - air.merge(air_sample) + turf_copy.copy_from(target.zone.air) + turf_copy.volume = target.zone.air.volume //Copy a good representation of the turf from parent group + turf_original.copy_from(turf_copy) + + equalize_gases(list(air_sample, turf_copy)) + air.merge(air_sample) - target.zone.air.remove(turf_original.total_moles) - target.zone.air.merge(turf_copy) + target.zone.air.remove(turf_original.total_moles) + target.zone.air.merge(turf_copy) - else - var/datum/gas_mixture/turf_air = target.return_air() + else + var/datum/gas_mixture/turf_air = target.return_air() - equalize_gases(list(air_sample, turf_air)) - air.merge(air_sample) - //turf_air already modified by equalize_gases() + equalize_gases(list(air_sample, turf_air)) + air.merge(air_sample) + //turf_air already modified by equalize_gases() - if(network) - network.update = 1 + if(network) + network.update = 1 - proc/temperature_interact(turf/target, share_volume, thermal_conductivity) - var/total_heat_capacity = air.heat_capacity() - var/partial_heat_capacity = total_heat_capacity*(share_volume/air.volume) +/datum/pipeline/proc/temperature_interact(turf/target, share_volume, thermal_conductivity) + var/total_heat_capacity = air.heat_capacity() + var/partial_heat_capacity = total_heat_capacity*(share_volume/air.volume) - if(istype(target, /turf/simulated)) - var/turf/simulated/modeled_location = target + if(istype(target, /turf/simulated)) + var/turf/simulated/modeled_location = target - if(modeled_location.blocks_air) + if(modeled_location.blocks_air) - if((modeled_location.heat_capacity>0) && (partial_heat_capacity>0)) - var/delta_temperature = air.temperature - modeled_location.temperature - - var/heat = thermal_conductivity*delta_temperature* \ - (partial_heat_capacity*modeled_location.heat_capacity/(partial_heat_capacity+modeled_location.heat_capacity)) - - air.temperature -= heat/total_heat_capacity - modeled_location.temperature += heat/modeled_location.heat_capacity - - else - var/delta_temperature = 0 - var/sharer_heat_capacity = 0 - - if(modeled_location.zone) - delta_temperature = (air.temperature - modeled_location.zone.air.temperature) - sharer_heat_capacity = modeled_location.zone.air.heat_capacity() - else - delta_temperature = (air.temperature - modeled_location.air.temperature) - sharer_heat_capacity = modeled_location.air.heat_capacity() - - var/self_temperature_delta = 0 - var/sharer_temperature_delta = 0 - - if((sharer_heat_capacity>0) && (partial_heat_capacity>0)) - var/heat = thermal_conductivity*delta_temperature* \ - (partial_heat_capacity*sharer_heat_capacity/(partial_heat_capacity+sharer_heat_capacity)) - - self_temperature_delta = -heat/total_heat_capacity - sharer_temperature_delta = heat/sharer_heat_capacity - else - return 1 - - air.temperature += self_temperature_delta - - if(modeled_location.zone) - modeled_location.zone.air.temperature += sharer_temperature_delta/modeled_location.zone.air.group_multiplier - else - modeled_location.air.temperature += sharer_temperature_delta - - - else - if((target.heat_capacity>0) && (partial_heat_capacity>0)) - var/delta_temperature = air.temperature - target.temperature + if((modeled_location.heat_capacity>0) && (partial_heat_capacity>0)) + var/delta_temperature = air.temperature - modeled_location.temperature var/heat = thermal_conductivity*delta_temperature* \ - (partial_heat_capacity*target.heat_capacity/(partial_heat_capacity+target.heat_capacity)) + (partial_heat_capacity*modeled_location.heat_capacity/(partial_heat_capacity+modeled_location.heat_capacity)) air.temperature -= heat/total_heat_capacity - if(network) - network.update = 1 + modeled_location.temperature += heat/modeled_location.heat_capacity - //surface must be the surface area in m^2 - proc/radiate_heat_to_space(surface, thermal_conductivity) - var/gas_density = air.total_moles/air.volume - thermal_conductivity *= min(gas_density / ( RADIATOR_OPTIMUM_PRESSURE/(R_IDEAL_GAS_EQUATION*GAS_CRITICAL_TEMPERATURE) ), 1) //mult by density ratio + else + var/delta_temperature = 0 + var/sharer_heat_capacity = 0 - // We only get heat from the star on the exposed surface area. - // If the HE pipes gain more energy from AVERAGE_SOLAR_RADIATION than they can radiate, then they have a net heat increase. - var/heat_gain = AVERAGE_SOLAR_RADIATION * (RADIATOR_EXPOSED_SURFACE_AREA_RATIO * surface) * thermal_conductivity + if(modeled_location.zone) + delta_temperature = (air.temperature - modeled_location.zone.air.temperature) + sharer_heat_capacity = modeled_location.zone.air.heat_capacity() + else + delta_temperature = (air.temperature - modeled_location.air.temperature) + sharer_heat_capacity = modeled_location.air.heat_capacity() - // Previously, the temperature would enter equilibrium at 26C or 294K. - // Only would happen if both sides (all 2 square meters of surface area) were exposed to sunlight. We now assume it aligned edge on. - // It currently should stabilise at 129.6K or -143.6C - heat_gain -= surface * STEFAN_BOLTZMANN_CONSTANT * thermal_conductivity * (air.temperature - COSMIC_RADIATION_TEMPERATURE) ** 4 + var/self_temperature_delta = 0 + var/sharer_temperature_delta = 0 - air.add_thermal_energy(heat_gain) - if(network) - network.update = 1 + if((sharer_heat_capacity>0) && (partial_heat_capacity>0)) + var/heat = thermal_conductivity*delta_temperature* \ + (partial_heat_capacity*sharer_heat_capacity/(partial_heat_capacity+sharer_heat_capacity)) + + self_temperature_delta = -heat/total_heat_capacity + sharer_temperature_delta = heat/sharer_heat_capacity + else + return 1 + + air.temperature += self_temperature_delta + + if(modeled_location.zone) + modeled_location.zone.air.temperature += sharer_temperature_delta/modeled_location.zone.air.group_multiplier + else + modeled_location.air.temperature += sharer_temperature_delta + + + else + if((target.heat_capacity>0) && (partial_heat_capacity>0)) + var/delta_temperature = air.temperature - target.temperature + + var/heat = thermal_conductivity*delta_temperature* \ + (partial_heat_capacity*target.heat_capacity/(partial_heat_capacity+target.heat_capacity)) + + air.temperature -= heat/total_heat_capacity + if(network) + network.update = 1 + +//surface must be the surface area in m^2 +/datum/pipeline/proc/radiate_heat_to_space(surface, thermal_conductivity) + var/gas_density = air.total_moles/air.volume + thermal_conductivity *= min(gas_density / ( RADIATOR_OPTIMUM_PRESSURE/(R_IDEAL_GAS_EQUATION*GAS_CRITICAL_TEMPERATURE) ), 1) //mult by density ratio + + // We only get heat from the star on the exposed surface area. + // If the HE pipes gain more energy from AVERAGE_SOLAR_RADIATION than they can radiate, then they have a net heat increase. + var/heat_gain = AVERAGE_SOLAR_RADIATION * (RADIATOR_EXPOSED_SURFACE_AREA_RATIO * surface) * thermal_conductivity + + // Previously, the temperature would enter equilibrium at 26C or 294K. + // Only would happen if both sides (all 2 square meters of surface area) were exposed to sunlight. We now assume it aligned edge on. + // It currently should stabilise at 129.6K or -143.6C + heat_gain -= surface * STEFAN_BOLTZMANN_CONSTANT * thermal_conductivity * (air.temperature - COSMIC_RADIATION_TEMPERATURE) ** 4 + + air.add_thermal_energy(heat_gain) + if(network) + network.update = 1 diff --git a/code/ATMOSPHERICS/pipes/he_pipes.dm b/code/ATMOSPHERICS/pipes/he_pipes.dm index 2d77e3a4ca9..1b283e3ba4d 100644 --- a/code/ATMOSPHERICS/pipes/he_pipes.dm +++ b/code/ATMOSPHERICS/pipes/he_pipes.dm @@ -67,8 +67,22 @@ return update_icon() + handle_leaking() return +/obj/machinery/atmospherics/pipe/simple/heat_exchanging/set_leaking(var/new_leaking) // They already process, no need for manual processing toggles. + if(new_leaking && !leaking) + leaking = TRUE + if(parent) + parent.leaks |= src + if(parent.network) + parent.network.leaks |= src + else if (!new_leaking && leaking) + leaking = FALSE + if(parent) + parent.leaks -= src + if(parent.network) + parent.network.leaks -= src /obj/machinery/atmospherics/pipe/simple/heat_exchanging/process() if(!parent) @@ -180,4 +194,5 @@ return update_icon() + handle_leaking() return diff --git a/code/ATMOSPHERICS/pipes/he_pipes_vr.dm b/code/ATMOSPHERICS/pipes/he_pipes_vr.dm new file mode 100644 index 00000000000..d763f75b74c --- /dev/null +++ b/code/ATMOSPHERICS/pipes/he_pipes_vr.dm @@ -0,0 +1,2 @@ +/obj/machinery/atmospherics/pipe/simple/heat_exchanging/set_leaking(var/new_leaking) + return //Nope \ No newline at end of file diff --git a/code/ATMOSPHERICS/pipes/manifold.dm b/code/ATMOSPHERICS/pipes/manifold.dm index 524d420d392..f44bfc56866 100644 --- a/code/ATMOSPHERICS/pipes/manifold.dm +++ b/code/ATMOSPHERICS/pipes/manifold.dm @@ -68,9 +68,24 @@ node3 = null update_icon() + handle_leaking() ..() +/obj/machinery/atmospherics/pipe/manifold/handle_leaking() + if(node1 && node2 && node3) + set_leaking(FALSE) + else + set_leaking(TRUE) + +/obj/machinery/atmospherics/pipe/manifold/process() + if(!parent) + ..() + else if(leaking) + parent.mingle_with_turf(loc, volume) + else + . = PROCESS_KILL + /obj/machinery/atmospherics/pipe/manifold/change_color(var/new_color) ..() //for updating connected atmos device pipes (i.e. vents, manifolds, etc) @@ -154,6 +169,7 @@ var/turf/T = get_turf(src) if(level == 1 && !T.is_plating()) hide(1) update_icon() + handle_leaking() /obj/machinery/atmospherics/pipe/manifold/visible icon_state = "map" diff --git a/code/ATMOSPHERICS/pipes/manifold4w.dm b/code/ATMOSPHERICS/pipes/manifold4w.dm index 0cc022423b1..197c1a090b7 100644 --- a/code/ATMOSPHERICS/pipes/manifold4w.dm +++ b/code/ATMOSPHERICS/pipes/manifold4w.dm @@ -66,9 +66,24 @@ node4 = null update_icon() + handle_leaking() ..() +/obj/machinery/atmospherics/pipe/manifold4w/handle_leaking() + if(node1 && node2 && node3 && node4) + set_leaking(FALSE) + else + set_leaking(TRUE) + +/obj/machinery/atmospherics/pipe/manifold4w/process() + if(!parent) + ..() + else if(leaking) + parent.mingle_with_turf(loc, volume) + else + . = PROCESS_KILL + /obj/machinery/atmospherics/pipe/manifold4w/change_color(var/new_color) ..() //for updating connected atmos device pipes (i.e. vents, manifolds, etc) @@ -156,6 +171,7 @@ var/turf/T = get_turf(src) if(level == 1 && !T.is_plating()) hide(1) update_icon() + handle_leaking() /obj/machinery/atmospherics/pipe/manifold4w/visible icon_state = "map_4way" diff --git a/code/ATMOSPHERICS/pipes/pipe_base.dm b/code/ATMOSPHERICS/pipes/pipe_base.dm index a035857e549..d1bb92fac77 100644 --- a/code/ATMOSPHERICS/pipes/pipe_base.dm +++ b/code/ATMOSPHERICS/pipes/pipe_base.dm @@ -6,6 +6,7 @@ var/datum/gas_mixture/air_temporary // used when reconstructing a pipeline that broke var/datum/pipeline/parent var/volume = 0 + var/leaking = FALSE // Do not set directly, use set_leaking(TRUE/FALSE) layer = PIPES_LAYER use_power = 0 @@ -13,6 +14,7 @@ pipe_flags = 0 // Does not have PIPING_DEFAULT_LAYER_ONLY flag. var/alert_pressure = 80*ONE_ATMOSPHERE + var/in_stasis = FALSE //minimum pressure before check_pressure(...) should be called can_buckle = 1 @@ -30,6 +32,31 @@ /obj/machinery/atmospherics/pipe/hides_under_flooring() return level != 2 +/obj/machinery/atmospherics/pipe/proc/set_leaking(var/new_leaking) + if(new_leaking && !leaking) + if(!speed_process) + START_MACHINE_PROCESSING(src) + else + START_PROCESSING(SSfastprocess, src) + leaking = TRUE + if(parent) + parent.leaks |= src + if(parent.network) + parent.network.leaks |= src + else if (!new_leaking && leaking) + if(!speed_process) + STOP_MACHINE_PROCESSING(src) + else + STOP_PROCESSING(SSfastprocess, src) + leaking = FALSE + if(parent) + parent.leaks -= src + if(parent.network) + parent.network.leaks -= src + +/obj/machinery/atmospherics/pipe/proc/handle_leaking() // Used specifically to update leaking status on different pipes. + return + /obj/machinery/atmospherics/pipe/proc/pipeline_expansion() return null diff --git a/code/ATMOSPHERICS/pipes/pipe_base_vr.dm b/code/ATMOSPHERICS/pipes/pipe_base_vr.dm new file mode 100644 index 00000000000..d20e73ae89f --- /dev/null +++ b/code/ATMOSPHERICS/pipes/pipe_base_vr.dm @@ -0,0 +1,2 @@ +/obj/machinery/atmospherics/pipe/set_leaking(var/new_leaking) + return // N O P E \ No newline at end of file diff --git a/code/ATMOSPHERICS/pipes/simple.dm b/code/ATMOSPHERICS/pipes/simple.dm index 6aee81807e8..eb980c3b476 100644 --- a/code/ATMOSPHERICS/pipes/simple.dm +++ b/code/ATMOSPHERICS/pipes/simple.dm @@ -1,6 +1,6 @@ // // Simple Pipes - Just a tube, maybe bent -// +// /obj/machinery/atmospherics/pipe/simple icon = 'icons/atmos/pipes.dmi' icon_state = "" @@ -34,6 +34,14 @@ icon = null alpha = 255 +/obj/machinery/atmospherics/pipe/simple/process() + if(!parent) + ..() + else if(leaking) + parent.mingle_with_turf(loc, volume) + else + . = PROCESS_KILL + /obj/machinery/atmospherics/pipe/simple/check_pressure(pressure) var/datum/gas_mixture/environment = loc.return_air() @@ -147,6 +155,7 @@ var/turf/T = loc if(level == 1 && !T.is_plating()) hide(1) update_icon() + handle_leaking() /obj/machinery/atmospherics/pipe/simple/disconnect(obj/machinery/atmospherics/reference) if(reference == node1) @@ -160,9 +169,16 @@ node2 = null update_icon() + handle_leaking() return null +/obj/machinery/atmospherics/pipe/simple/handle_leaking() + if(node1 && node2) + set_leaking(FALSE) + else + set_leaking(TRUE) + /obj/machinery/atmospherics/pipe/simple/visible icon_state = "intact" level = 2 diff --git a/code/ATMOSPHERICS/pipes/universal.dm b/code/ATMOSPHERICS/pipes/universal.dm index 2d8bd09dff8..00d2746947a 100644 --- a/code/ATMOSPHERICS/pipes/universal.dm +++ b/code/ATMOSPHERICS/pipes/universal.dm @@ -48,7 +48,7 @@ construction_type = /obj/item/pipe/binary pipe_state = "universal" -/obj/machinery/atmospherics/pipe/simple/hidden/universal/update_icon(var/safety = 0) +/obj/machinery/atmospherics/pipe/simple/hidden/universal/update_icon(var/safety = 0) // Doesn't leak. It's a special pipe. if(!check_icon_cache()) return diff --git a/code/__defines/belly_modes_vr.dm b/code/__defines/belly_modes_vr.dm index c65a87d6c82..ccffcf43416 100644 --- a/code/__defines/belly_modes_vr.dm +++ b/code/__defines/belly_modes_vr.dm @@ -32,6 +32,7 @@ #define DM_FLAG_NUMBING 0x1 #define DM_FLAG_STRIPPING 0x2 #define DM_FLAG_LEAVEREMAINS 0x4 +#define DM_FLAG_THICKBELLY 0x8 //Item related modes #define IM_HOLD "Hold" diff --git a/code/__defines/damage_organs.dm b/code/__defines/damage_organs.dm index 9692409d458..c87b9942dfc 100644 --- a/code/__defines/damage_organs.dm +++ b/code/__defines/damage_organs.dm @@ -8,6 +8,7 @@ #define HALLOSS "halloss" #define ELECTROCUTE "electrocute" #define BIOACID "bioacid" +#define SEARING "searing" #define CUT "cut" #define BRUISE "bruise" diff --git a/code/__defines/misc.dm b/code/__defines/misc.dm index 2dc4afe70aa..69b91d0dc32 100644 --- a/code/__defines/misc.dm +++ b/code/__defines/misc.dm @@ -175,6 +175,7 @@ #define MAT_LEAD "lead" #define MAT_SUPERMATTER "supermatter" #define MAT_METALHYDROGEN "mhydrogen" +#define MAT_OSMIUM "osmium" #define SHARD_SHARD "shard" #define SHARD_SHRAPNEL "shrapnel" @@ -347,10 +348,12 @@ var/global/list/##LIST_NAME = list();\ #define RCD_MAX_CAPACITY 30 * RCD_SHEETS_PER_MATTER_UNIT // Radiation 'levels'. Used for the geiger counter, for visuals and sound. They are in different files so this goes here. -#define RAD_LEVEL_LOW 0.01 // Around the level at which radiation starts to become harmful -#define RAD_LEVEL_MODERATE 10 +#define RAD_LEVEL_LOW 0.5 // Around the level at which radiation starts to become harmful +#define RAD_LEVEL_MODERATE 5 #define RAD_LEVEL_HIGH 25 -#define RAD_LEVEL_VERY_HIGH 50 +#define RAD_LEVEL_VERY_HIGH 75 + +#define RADIATION_THRESHOLD_CUTOFF 0.1 // Radiation will not affect a tile when below this value. //https://secure.byond.com/docs/ref/info.html#/atom/var/mouse_opacity #define MOUSE_OPACITY_TRANSPARENT 0 diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm index 8426edcfcfe..efb94d49631 100644 --- a/code/__defines/mobs.dm +++ b/code/__defines/mobs.dm @@ -210,13 +210,17 @@ #define O_GBLADDER "gas bladder" #define O_POLYP "polyp segment" #define O_ANCHOR "anchoring ligament" +#define O_REGBRUTE "pneumoregenitor" +#define O_REGBURN "thermoregenitor" +#define O_REGOXY "respiroregenitor" +#define O_REGTOX "toxoregenitor" #define O_ACID "acid gland" #define O_EGG "egg sac" #define O_RESIN "resin spinner" #define O_AREJECT "immune hub" #define O_VENTC "morphoplastic node" #define O_VRLINK "virtual node" -#define O_ALL list(O_STANDARD, O_MOUTH, O_CELL, O_PLASMA, O_HIVE, O_NUTRIENT, O_STRATA, O_RESPONSE, O_GBLADDER, O_POLYP, O_ANCHOR, O_ACID, O_EGG, O_RESIN, O_AREJECT, O_VENTC, O_VRLINK) +#define O_ALL list(O_STANDARD, O_MOUTH, O_CELL, O_PLASMA, O_HIVE, O_NUTRIENT, O_STRATA, O_RESPONSE, O_GBLADDER, O_POLYP, O_ANCHOR, O_REGBRUTE, O_REGBURN, O_REGOXY, O_REGTOX, O_ACID, O_EGG, O_RESIN, O_AREJECT, O_VENTC, O_VRLINK) // External organs, aka limbs #define BP_L_FOOT "l_foot" diff --git a/code/__defines/sound.dm b/code/__defines/sound.dm index 0995f0e071f..d954d34b2a0 100644 --- a/code/__defines/sound.dm +++ b/code/__defines/sound.dm @@ -8,11 +8,12 @@ #define CHANNEL_AMBIENCE 1018 #define CHANNEL_BUZZ 1017 #define CHANNEL_BICYCLE 1016 +#define CHANNEL_PREYLOOP 1015 //VORESTATION ADD - Fancy Sound Loop channel //THIS SHOULD ALWAYS BE THE LOWEST ONE! //KEEP IT UPDATED -#define CHANNEL_HIGHEST_AVAILABLE 1015 +#define CHANNEL_HIGHEST_AVAILABLE 1014 //VORESTATION EDIT - Fancy Sound Loop channel from 1015 #define SOUND_MINIMUM_PRESSURE 10 #define FALLOFF_SOUNDS 0.5 diff --git a/code/__defines/species_languages_vr.dm b/code/__defines/species_languages_vr.dm index 224478646db..831df5253dd 100644 --- a/code/__defines/species_languages_vr.dm +++ b/code/__defines/species_languages_vr.dm @@ -1,3 +1,6 @@ +#define SPECIES_WHITELIST_SELECTABLE 0x20 // Can select and customize, but not join as + +#define LANGUAGE_SLAVIC "Pan-Slavic" #define LANGUAGE_BIRDSONG "Birdsong" #define LANGUAGE_SAGARU "Sagaru" #define LANGUAGE_CANILUNZT "Canilunzt" diff --git a/code/__defines/xenoarcheaology.dm b/code/__defines/xenoarcheaology.dm index 45e40cfbdeb..8a4988b78c0 100644 --- a/code/__defines/xenoarcheaology.dm +++ b/code/__defines/xenoarcheaology.dm @@ -36,7 +36,8 @@ #define ARCHAEO_ALIEN_ITEM 36 #define ARCHAEO_ALIEN_BOAT 37 #define ARCHAEO_IMPERION_CIRCUIT 38 -#define MAX_ARCHAEO 38 +#define ARCHAEO_TELECUBE 39 +#define MAX_ARCHAEO 39 #define DIGSITE_GARDEN 1 #define DIGSITE_ANIMAL 2 diff --git a/code/_global_vars/mobs.dm b/code/_global_vars/mobs.dm index 10d829904ab..7e60dc71ea2 100644 --- a/code/_global_vars/mobs.dm +++ b/code/_global_vars/mobs.dm @@ -5,3 +5,4 @@ GLOBAL_LIST_EMPTY(stealthminID) GLOBAL_LIST_EMPTY(directory) //all ckeys with associated client GLOBAL_LIST_EMPTY(clients) GLOBAL_LIST_EMPTY(players_by_zlevel) +GLOBAL_LIST_EMPTY(round_text_log) diff --git a/code/_helpers/global_lists_vr.dm b/code/_helpers/global_lists_vr.dm index 2a273eaab16..c9a64048a8b 100644 --- a/code/_helpers/global_lists_vr.dm +++ b/code/_helpers/global_lists_vr.dm @@ -11,6 +11,8 @@ var/global/list/positive_traits = list() // Positive custom species traits, inde var/global/list/traits_costs = list() // Just path = cost list, saves time in char setup var/global/list/all_traits = list() // All of 'em at once (same instances) +var/global/list/sensorpreflist = list("Off", "Binary", "Vitals", "Tracking", "No Preference") //TFF 5/8/19 - Suit Sensors global list + var/global/list/custom_species_bases = list() // Species that can be used for a Custom Species icon base //stores numeric player size options indexed by name @@ -40,40 +42,8 @@ var/global/list/item_vore_blacklist = list( /obj/item/weapon/disk/nuclear, /obj/item/clothing/suit/storage/hooded/wintercoat/roiz) -var/global/list/digestion_sounds = list( - 'sound/vore/digest1.ogg', - 'sound/vore/digest2.ogg', - 'sound/vore/digest3.ogg', - 'sound/vore/digest4.ogg', - 'sound/vore/digest5.ogg', - 'sound/vore/digest6.ogg', - 'sound/vore/digest7.ogg', - 'sound/vore/digest8.ogg', - 'sound/vore/digest9.ogg', - 'sound/vore/digest10.ogg', - 'sound/vore/digest11.ogg', - 'sound/vore/digest12.ogg') - -var/global/list/death_sounds = list( - 'sound/vore/death1.ogg', - 'sound/vore/death2.ogg', - 'sound/vore/death3.ogg', - 'sound/vore/death4.ogg', - 'sound/vore/death5.ogg', - 'sound/vore/death6.ogg', - 'sound/vore/death7.ogg', - 'sound/vore/death8.ogg', - 'sound/vore/death9.ogg', - 'sound/vore/death10.ogg') - -var/global/list/hunger_sounds = list( - 'sound/vore/growl1.ogg', - 'sound/vore/growl2.ogg', - 'sound/vore/growl3.ogg', - 'sound/vore/growl4.ogg', - 'sound/vore/growl5.ogg') - -var/global/list/vore_sounds = list( +//Classic Vore sounds +var/global/list/classic_vore_sounds = list( "Gulp" = 'sound/vore/gulp.ogg', "Insert" = 'sound/vore/insert.ogg', "Insertion1" = 'sound/vore/insertion1.ogg', @@ -84,15 +54,55 @@ var/global/list/vore_sounds = list( "Squish2" = 'sound/vore/squish2.ogg', "Squish3" = 'sound/vore/squish3.ogg', "Squish4" = 'sound/vore/squish4.ogg', - "Rustle (cloth)" = 'sound/effects/rustle5.ogg', + "Rustle (cloth)" = 'sound/effects/rustle1.ogg', + "Rustle 2 (cloth)" = 'sound/effects/rustle2.ogg', + "Rustle 3 (cloth)" = 'sound/effects/rustle3.ogg', + "Rustle 4 (cloth)" = 'sound/effects/rustle4.ogg', + "Rustle 5 (cloth)" = 'sound/effects/rustle5.ogg', "None" = null) -var/global/list/struggle_sounds = list( - "Squish1" = 'sound/vore/squish1.ogg', - "Squish2" = 'sound/vore/squish2.ogg', - "Squish3" = 'sound/vore/squish3.ogg', - "Squish4" = 'sound/vore/squish4.ogg') +var/global/list/classic_release_sounds = list( + "Rustle (cloth)" = 'sound/effects/rustle1.ogg', + "Rustle 2 (cloth)" = 'sound/effects/rustle2.ogg', + "Rustle 3 (cloth)" = 'sound/effects/rustle3.ogg', + "Rustle 4 (cloth)" = 'sound/effects/rustle4.ogg', + "Rustle 5 (cloth)" = 'sound/effects/rustle5.ogg', + "Splatter" = 'sound/effects/splat.ogg', + "None" = null + ) +//Poojy's Fancy Sounds +var/global/list/fancy_vore_sounds = list( + "Gulp" = 'sound/vore/sunesound/pred/swallow_01.ogg', + "Swallow" = 'sound/vore/sunesound/pred/swallow_02.ogg', + "Insertion1" = 'sound/vore/sunesound/pred/insertion_01.ogg', + "Insertion2" = 'sound/vore/sunesound/pred/insertion_02.ogg', + "Tauric Swallow" = 'sound/vore/sunesound/pred/taurswallow.ogg', + "Stomach Move" = 'sound/vore/sunesound/pred/stomachmove.ogg', + "Schlorp" = 'sound/vore/sunesound/pred/schlorp.ogg', + "Squish1" = 'sound/vore/sunesound/pred/squish_01.ogg', + "Squish2" = 'sound/vore/sunesound/pred/squish_02.ogg', + "Squish3" = 'sound/vore/sunesound/pred/squish_03.ogg', + "Squish4" = 'sound/vore/sunesound/pred/squish_04.ogg', + "Rustle (cloth)" = 'sound/effects/rustle1.ogg', + "Rustle 2 (cloth)" = 'sound/effects/rustle2.ogg', + "Rustle 3 (cloth)" = 'sound/effects/rustle3.ogg', + "Rustle 4 (cloth)" = 'sound/effects/rustle4.ogg', + "Rustle 5 (cloth)" = 'sound/effects/rustle5.ogg', + "None" = null + ) + +var/global/list/fancy_release_sounds = list( + "Rustle (cloth)" = 'sound/effects/rustle1.ogg', + "Rustle 2 (cloth)" = 'sound/effects/rustle2.ogg', + "Rustle 3 (cloth)" = 'sound/effects/rustle3.ogg', + "Rustle 4 (cloth)" = 'sound/effects/rustle4.ogg', + "Rustle 5 (cloth)" = 'sound/effects/rustle5.ogg', + "Stomach Move" = 'sound/vore/sunesound/pred/stomachmove.ogg', + "Pred Escape" = 'sound/vore/sunesound/pred/escape.ogg', + "Splatter" = 'sound/effects/splat.ogg', + "None" = null + ) var/global/list/global_vore_egg_types = list( "Unathi" = UNATHI_EGG, @@ -122,6 +132,7 @@ var/global/list/tf_vore_egg_types = list( var/global/list/edible_trash = list(/obj/item/broken_device, /obj/item/clothing/accessory/collar, //TFF 10/7/19 - add option to nom collars, + /obj/item/device/communicator, //TFF 19/9/19 - add option to nom communicators and commwatches, /obj/item/clothing/mask, /obj/item/clothing/glasses, /obj/item/clothing/gloves, diff --git a/code/_helpers/icons_vr.dm b/code/_helpers/icons_vr.dm index be5de68e82d..60765578e71 100644 --- a/code/_helpers/icons_vr.dm +++ b/code/_helpers/icons_vr.dm @@ -42,4 +42,18 @@ for(var/x_pixel = 1 to I.Width()) if (I.GetPixel(x_pixel, y_pixel)) return y_pixel - 1 - return null \ No newline at end of file + return null + +//Standard behaviour is to cut pixels from the main icon that are covered by pixels from the mask icon unless passed mask_ready, see below. +/proc/get_icon_difference(var/icon/main, var/icon/mask, var/mask_ready) + /*You should skip prep if the mask is already sprited properly. This significantly improves performance by eliminating most of the realtime icon work. + e.g. A 'ready' mask is a mask where the part you want cut out is missing (no pixels, 0 alpha) from the sprite, and everything else is solid white.*/ + + if(istype(main) && istype(mask)) + if(!mask_ready) //Prep the mask if we're using a regular old sprite and not a special-made mask. + mask.Blend(rgb(255,255,255), ICON_SUBTRACT) //Make all pixels on the mask as black as possible. + mask.Opaque(rgb(255,255,255)) //Make the transparent pixels (background) white. + mask.BecomeAlphaMask() //Make all the black pixels vanish (fully transparent), leaving only the white background pixels. + + main.AddAlphaMask(mask) //Make the pixels in the main icon that are in the transparent zone of the mask icon also vanish (fully transparent). + return main diff --git a/code/_helpers/logging.dm b/code/_helpers/logging.dm index c771de02ef6..51c9c015279 100644 --- a/code/_helpers/logging.dm +++ b/code/_helpers/logging.dm @@ -61,8 +61,8 @@ /proc/log_access_in(client/new_client) if (config.log_access) - var/message = "[key_name(new_client)] - IP:[new_client.address] - CID:[new_client.computer_id] - BYOND v[new_client.byond_version]" - WRITE_LOG(diary, "ACCESS IN: [message]") + var/message = "[key_name(new_client)] - IP:[new_client.address] - CID:[new_client.computer_id] - BYOND v[new_client.byond_version]" + WRITE_LOG(diary, "ACCESS IN: [message]") //VOREStation Edit /proc/log_access_out(mob/last_mob) if (config.log_access) @@ -73,26 +73,46 @@ if (config.log_say) WRITE_LOG(diary, "SAY: [speaker.simple_info_line()]: [html_decode(text)]") + //Log the message to in-game dialogue logs, as well. + if(speaker.client) + speaker.dialogue_log += "([time_stamp()]) ([speaker]/[speaker.client]) SAY: - [text]" + GLOB.round_text_log += "([time_stamp()]) ([speaker]/[speaker.client]) SAY: - [text]" + /proc/log_ooc(text, client/user) if (config.log_ooc) WRITE_LOG(diary, "OOC: [user.simple_info_line()]: [html_decode(text)]") + GLOB.round_text_log += "([time_stamp()]) ([user]) OOC: - [text]" + /proc/log_aooc(text, client/user) if (config.log_ooc) WRITE_LOG(diary, "AOOC: [user.simple_info_line()]: [html_decode(text)]") + GLOB.round_text_log += "([time_stamp()]) ([user]) AOOC: - [text]" + /proc/log_looc(text, client/user) if (config.log_ooc) WRITE_LOG(diary, "LOOC: [user.simple_info_line()]: [html_decode(text)]") + GLOB.round_text_log += "([time_stamp()]) ([user]) LOOC: - [text]" + /proc/log_whisper(text, mob/speaker) if (config.log_whisper) WRITE_LOG(diary, "WHISPER: [speaker.simple_info_line()]: [html_decode(text)]") + if(speaker.client) + speaker.dialogue_log += "([time_stamp()]) ([speaker]/[speaker.client]) SAY: - [text]" + GLOB.round_text_log += "([time_stamp()]) ([speaker]/[speaker.client]) SAY: - [text]" + + /proc/log_emote(text, mob/speaker) if (config.log_emote) WRITE_LOG(diary, "EMOTE: [speaker.simple_info_line()]: [html_decode(text)]") + if(speaker.client) + speaker.dialogue_log += "([time_stamp()]) ([speaker]/[speaker.client]) EMOTE: - [text]" + GLOB.round_text_log += "([time_stamp()]) ([speaker]/[speaker.client]) EMOTE: - [text]" + /proc/log_attack(attacker, defender, message) if (config.log_attack) WRITE_LOG(diary, "ATTACK: [attacker] against [defender]: [message]") @@ -113,6 +133,10 @@ if (config.log_say) WRITE_LOG(diary, "DEADCHAT: [speaker.simple_info_line()]: [html_decode(text)]") + speaker.dialogue_log += "([time_stamp()]) ([speaker]/[speaker.client]) DEADSAY: - [text]" + GLOB.round_text_log += "([time_stamp()]) ([src]/[speaker.client]) DEADSAY: - [text]" + + /proc/log_ghostemote(text, mob/speaker) if (config.log_emote) WRITE_LOG(diary, "DEADEMOTE: [speaker.simple_info_line()]: [html_decode(text)]") @@ -125,6 +149,10 @@ if (config.log_pda) WRITE_LOG(diary, "PDA: [speaker.simple_info_line()]: [html_decode(text)]") + speaker.dialogue_log += "([time_stamp()]) ([speaker]/[speaker.client]) MSG: - [text]" + GLOB.round_text_log += "([time_stamp()]) ([speaker]/[speaker.client]) MSG: - [text]" + + /proc/log_to_dd(text) world.log << text //this comes before the config check because it can't possibly runtime if(config.log_world_output) @@ -222,7 +250,7 @@ if(include_link && is_special_character(M) && highlight_special_characters) name = "[name]" //Orange - + . += "/([name])" return . diff --git a/code/_helpers/text.dm b/code/_helpers/text.dm index 0343fe42498..eb363c08cb3 100644 --- a/code/_helpers/text.dm +++ b/code/_helpers/text.dm @@ -84,7 +84,6 @@ // 0 .. 9 if(48 to 57) //Numbers - if(!last_char_group) continue //suppress at start of string if(!allow_numbers) continue // If allow_numbers is 0, then don't do this. output += ascii2text(ascii_char) number_of_alphanumeric++ diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 643ab6d7905..6cde2645660 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -114,6 +114,19 @@ trigger_aiming(TARGET_CAN_CLICK) return 1 + // VOREStation Addition Start: inbelly item interaction + if(isbelly(loc) && (loc == A.loc)) + if(W) + var/resolved = W.resolve_attackby(A,src) + if(!resolved && A && W) + W.afterattack(A, src, 1, params) // 1: clicking something Adjacent + else + if(ismob(A)) // No instant mob attacking + setClickCooldown(get_attack_speed()) + UnarmedAttack(A, 1) + return + // VOREStation Addition End + if(!isturf(loc)) // This is going to stop you from telekinesing from inside a closet, but I don't shed many tears for that return diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index e367769b077..3bd1a0afb2d 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -2,6 +2,9 @@ /atom/proc/attack_generic(mob/user as mob) return 0 +/atom/proc/take_damage(var/damage) + return 0 + /* Humans: Adds an exception for gloves, to allow special glove types like the ninja ones. diff --git a/code/controllers/Processes/planet.dm b/code/controllers/Processes/planet.dm deleted file mode 100644 index 18043f92702..00000000000 --- a/code/controllers/Processes/planet.dm +++ /dev/null @@ -1,96 +0,0 @@ -var/datum/controller/process/planet/planet_controller = null - -/datum/controller/process/planet - var/list/planets = list() - var/list/z_to_planet = list() - -/datum/controller/process/planet/setup() - name = "planet controller" - planet_controller = src - schedule_interval = 1 MINUTE - start_delay = 20 SECONDS - - var/list/planet_datums = typesof(/datum/planet) - /datum/planet - for(var/P in planet_datums) - var/datum/planet/NP = new P() - planets.Add(NP) - - allocateTurfs() - -/datum/controller/process/planet/proc/allocateTurfs() - for(var/turf/simulated/OT in outdoor_turfs) - for(var/datum/planet/P in planets) - if(OT.z in P.expected_z_levels) - P.planet_floors |= OT - OT.vis_contents |= P.weather_holder.visuals - break - outdoor_turfs.Cut() //Why were you in there INCORRECTLY? - - for(var/turf/unsimulated/wall/planetary/PW in planetary_walls) - for(var/datum/planet/P in planets) - if(PW.type == P.planetary_wall_type) - P.planet_walls |= PW - break - planetary_walls.Cut() - -/datum/controller/process/planet/proc/unallocateTurf(var/turf/T) - for(var/planet in planets) - var/datum/planet/P = planet - if(T.z in P.expected_z_levels) - P.planet_floors -= T - T.vis_contents -= P.weather_holder.visuals - -/datum/controller/process/planet/doWork() - if(outdoor_turfs.len || planetary_walls.len) - allocateTurfs() - - for(var/datum/planet/P in planets) - P.process(schedule_interval / 10) - SCHECK //Your process() really shouldn't take this long... - - //Sun light needs changing - if(P.needs_work & PLANET_PROCESS_SUN) - P.needs_work &= ~PLANET_PROCESS_SUN - // Remove old value from corners - var/list/sunlit_corners = P.sunlit_corners - var/old_lum_r = -P.sun["lum_r"] - var/old_lum_g = -P.sun["lum_g"] - var/old_lum_b = -P.sun["lum_b"] - if(old_lum_r || old_lum_g || old_lum_b) - for(var/C in P.sunlit_corners) - var/datum/lighting_corner/LC = C - LC.update_lumcount(old_lum_r, old_lum_g, old_lum_b) - SCHECK - sunlit_corners.Cut() - - // Calculate new values to apply - var/new_brightness = P.sun["brightness"] - var/new_color = P.sun["color"] - var/lum_r = new_brightness * GetRedPart (new_color) / 255 - var/lum_g = new_brightness * GetGreenPart(new_color) / 255 - var/lum_b = new_brightness * GetBluePart (new_color) / 255 - var/static/update_gen = -1 // Used to prevent double-processing corners. Otherwise would happen when looping over adjacent turfs. - for(var/I in P.planet_floors) - var/turf/simulated/T = I - if(!T.lighting_corners_initialised) - T.generate_missing_corners() - for(var/C in T.get_corners()) - var/datum/lighting_corner/LC = C - if(LC.update_gen != update_gen && LC.active) - sunlit_corners += LC - LC.update_gen = update_gen - LC.update_lumcount(lum_r, lum_g, lum_b) - SCHECK - update_gen-- - P.sun["lum_r"] = lum_r - P.sun["lum_g"] = lum_g - P.sun["lum_b"] = lum_b - - //Temperature needs updating - if(P.needs_work & PLANET_PROCESS_TEMP) - P.needs_work &= ~PLANET_PROCESS_TEMP - //Set new temperatures - for(var/W in P.planet_walls) - var/turf/unsimulated/wall/planetary/wall = W - wall.set_temperature(P.weather_holder.temperature) - SCHECK diff --git a/code/controllers/Processes/radiation.dm b/code/controllers/Processes/radiation.dm deleted file mode 100644 index 71d9c60233e..00000000000 --- a/code/controllers/Processes/radiation.dm +++ /dev/null @@ -1,56 +0,0 @@ -/datum/controller/process/radiation - var/repository/radiation/linked = null - -/datum/controller/process/radiation/setup() - name = "radiation controller" - schedule_interval = 20 // every 2 seconds - linked = radiation_repository - -/datum/controller/process/radiation/doWork() - sources_decay() - cache_expires() - irradiate_targets() - -// Step 1 - Sources Decay -/datum/controller/process/radiation/proc/sources_decay() - var/list/sources = linked.sources - for(var/thing in sources) - var/datum/radiation_source/S = thing - if(QDELETED(S)) - sources.Remove(S) - continue - if(S.decay) - S.update_rad_power(S.rad_power - config.radiation_decay_rate) - if(S.rad_power <= config.radiation_lower_limit) - sources.Remove(S) - SCHECK // This scheck probably just wastes resources, but better safe than sorry in this case. - -// Step 2 - Cache Expires -/datum/controller/process/radiation/proc/cache_expires() - var/list/resistance_cache = linked.resistance_cache - for(var/thing in resistance_cache) - var/turf/T = thing - if(QDELETED(T)) - resistance_cache.Remove(T) - continue - if((length(T.contents) + 1) != resistance_cache[T]) - resistance_cache.Remove(T) // If its stale REMOVE it! It will get added if its needed. - SCHECK - -// Step 3 - Registered irradiatable things are checked for radiation -/datum/controller/process/radiation/proc/irradiate_targets() - var/list/registered_listeners = living_mob_list // For now just use this. Nothing else is interested anyway. - if(length(linked.sources) > 0) - for(var/thing in registered_listeners) - var/atom/A = thing - if(QDELETED(A)) - continue - var/turf/T = get_turf(thing) - var/rads = linked.get_rads_at_turf(T) - if(rads) - A.rad_act(rads) - SCHECK - -/datum/controller/process/radiation/statProcess() - ..() - stat(null, "[linked.sources.len] sources, [linked.resistance_cache.len] cached turfs") diff --git a/code/controllers/Processes/scheduler.dm b/code/controllers/Processes/scheduler.dm deleted file mode 100644 index ac5e4696abc..00000000000 --- a/code/controllers/Processes/scheduler.dm +++ /dev/null @@ -1,169 +0,0 @@ -/var/datum/controller/process/scheduler/scheduler - -/************ -* Scheduler * -************/ -/datum/controller/process/scheduler - var/list/scheduled_tasks - -/datum/controller/process/scheduler/setup() - name = "scheduler" - schedule_interval = 1 SECOND - scheduled_tasks = list() - scheduler = src - -/datum/controller/process/scheduler/doWork() - var/world_time = world.time - for(last_object in scheduled_tasks) - var/datum/scheduled_task/scheduled_task = last_object - if(world_time < scheduled_task.trigger_time) - break // Too early for this one, and therefore too early for all remaining. - try - unschedule(scheduled_task) - scheduled_task.pre_process() - scheduled_task.process() - scheduled_task.post_process() - catch(var/exception/e) - catchException(e, last_object) - SCHECK - -// We've been restarted, probably due to having a massive list of tasks. -// Lets copy over the task list as safely as we can and try to chug thru it... -// Note: We won't be informed about tasks being destroyed, but this is the best we can do. -/datum/controller/process/scheduler/copyStateFrom(var/datum/controller/process/scheduler/target) - scheduled_tasks = list() - for(var/datum/scheduled_task/st in target.scheduled_tasks) - if(!QDELETED(st) && istype(st)) - schedule(st) - scheduler = src - -// We are being killed. Least we can do is deregister all those events we registered -/datum/controller/process/scheduler/onKill() - for(var/st in scheduled_tasks) - GLOB.destroyed_event.unregister(st, src) - -/datum/controller/process/scheduler/statProcess() - ..() - stat(null, "[scheduled_tasks.len] task\s") - -/datum/controller/process/scheduler/proc/schedule(var/datum/scheduled_task/st) - dd_insertObjectList(scheduled_tasks, st) - -/datum/controller/process/scheduler/proc/unschedule(var/datum/scheduled_task/st) - scheduled_tasks -= st - -/********** -* Helpers * -**********/ -/proc/schedule_task_in(var/in_time, var/procedure, var/list/arguments = list()) - return schedule_task(world.time + in_time, procedure, arguments) - -/proc/schedule_callback_in(var/in_time, var/datum/callback) - return schedule_callback(world.time + in_time, callback) - -/proc/schedule_task_with_source_in(var/in_time, var/source, var/procedure, var/list/arguments = list()) - return schedule_task_with_source(world.time + in_time, source, procedure, arguments) - -/proc/schedule_task(var/trigger_time, var/procedure, var/list/arguments) - var/datum/scheduled_task/st = new/datum/scheduled_task(trigger_time, procedure, arguments, /proc/destroy_scheduled_task, list()) - scheduler.schedule(st) - return st - -/proc/schedule_callback(var/trigger_time, var/datum/callback) - var/datum/scheduled_task/callback/st = new/datum/scheduled_task/callback(trigger_time, callback, /proc/destroy_scheduled_task, list()) - scheduler.schedule(st) - return st - -/proc/schedule_task_with_source(var/trigger_time, var/source, var/procedure, var/list/arguments) - var/datum/scheduled_task/st = new/datum/scheduled_task/source(trigger_time, source, procedure, arguments, /proc/destroy_scheduled_task, list()) - scheduler.schedule(st) - return st - -/proc/schedule_repeating_task(var/trigger_time, var/repeat_interval, var/procedure, var/list/arguments) - var/datum/scheduled_task/st = new/datum/scheduled_task(trigger_time, procedure, arguments, /proc/repeat_scheduled_task, list(repeat_interval)) - scheduler.schedule(st) - return st - -/proc/schedule_repeating_task_with_source(var/trigger_time, var/repeat_interval, var/source, var/procedure, var/list/arguments) - var/datum/scheduled_task/st = new/datum/scheduled_task/source(trigger_time, source, procedure, arguments, /proc/repeat_scheduled_task, list(repeat_interval)) - scheduler.schedule(st) - return st - -/************* -* Task Datum * -*************/ -/datum/scheduled_task - var/trigger_time - var/procedure - var/list/arguments - var/task_after_process - var/list/task_after_process_args - -/datum/scheduled_task/New(var/trigger_time, var/procedure, var/list/arguments, var/proc/task_after_process, var/list/task_after_process_args) - ..() - src.trigger_time = trigger_time - src.procedure = procedure - src.arguments = arguments ? arguments : list() - src.task_after_process = task_after_process ? task_after_process : /proc/destroy_scheduled_task - src.task_after_process_args = istype(task_after_process_args) ? task_after_process_args : list() - task_after_process_args += src - -/datum/scheduled_task/Destroy() - scheduler.unschedule(src) - procedure = null - arguments.Cut() - task_after_process = null - task_after_process_args.Cut() - return ..() - -/datum/scheduled_task/dd_SortValue() - return trigger_time - -/datum/scheduled_task/proc/pre_process() - task_triggered_event.raise_event(list(src)) - -/datum/scheduled_task/proc/process() - if(procedure) - call(procedure)(arglist(arguments)) - -/datum/scheduled_task/proc/post_process() - call(task_after_process)(arglist(task_after_process_args)) - -// Resets the trigger time, has no effect if the task has already triggered -/datum/scheduled_task/proc/trigger_task_in(var/trigger_in) - src.trigger_time = world.time + trigger_in - -/datum/scheduled_task/callback - var/datum/callback/callback - -/datum/scheduled_task/callback/New(var/trigger_time, var/datum/callback, var/proc/task_after_process, var/list/task_after_process_args) - src.callback = callback - ..(trigger_time = trigger_time, task_after_process = task_after_process, task_after_process_args = task_after_process_args) - -/datum/scheduled_task/callback/process() - callback.Invoke() - -/datum/scheduled_task/source - var/datum/source - -/datum/scheduled_task/source/New(var/trigger_time, var/datum/source, var/procedure, var/list/arguments, var/proc/task_after_process, var/list/task_after_process_args) - src.source = source - GLOB.destroyed_event.register(src.source, src, /datum/scheduled_task/source/proc/source_destroyed) - ..(trigger_time, procedure, arguments, task_after_process, task_after_process_args) - -/datum/scheduled_task/source/Destroy() - source = null - return ..() - -/datum/scheduled_task/source/process() - call(source, procedure)(arglist(arguments)) - -/datum/scheduled_task/source/proc/source_destroyed() - qdel(src) - -/proc/destroy_scheduled_task(var/datum/scheduled_task/st) - qdel(st) - -/proc/repeat_scheduled_task(var/trigger_delay, var/datum/scheduled_task/st) - st.trigger_time = world.time + trigger_delay - scheduler.schedule(st) diff --git a/code/controllers/subsystems/garbage.dm b/code/controllers/subsystems/garbage.dm index a741869b5b3..9938fa20eb0 100644 --- a/code/controllers/subsystems/garbage.dm +++ b/code/controllers/subsystems/garbage.dm @@ -240,9 +240,9 @@ SUBSYSTEM_DEF(garbage) time = TICK_DELTA_TO_MS(tick)/100 if (time > highest_del_time) highest_del_time = time - if (time > 10) - log_game("Error: [type]([refID]) took longer than 1 second to delete (took [time/10] seconds to delete)") - message_admins("Error: [type]([refID]) took longer than 1 second to delete (took [time/10] seconds to delete).") + if (time > 20) //VOREStation Edit + log_game("Error: [type]([refID]) took longer than 2 seconds to delete (took [time/10] seconds to delete)") //VOREStation Edit + message_admins("Error: [type]([refID]) took longer than 2 seconds to delete (took [time/10] seconds to delete).") //VOREStation Edit postpone(time) /datum/controller/subsystem/garbage/proc/HardQueue(datum/D) diff --git a/code/controllers/subsystems/radiation.dm b/code/controllers/subsystems/radiation.dm new file mode 100644 index 00000000000..babc2c7d5d4 --- /dev/null +++ b/code/controllers/subsystems/radiation.dm @@ -0,0 +1,135 @@ +SUBSYSTEM_DEF(radiation) + name = "Radiation" + wait = 2 SECONDS + flags = SS_NO_INIT + + var/list/sources = list() // all radiation source datums + var/list/sources_assoc = list() // Sources indexed by turf for de-duplication. + var/list/resistance_cache = list() // Cache of turf's radiation resistance. + + var/tmp/list/current_sources = list() + var/tmp/list/current_res_cache = list() + var/tmp/list/listeners = list() + +/datum/controller/subsystem/radiation/fire(resumed = FALSE) + if (!resumed) + current_sources = sources.Copy() + current_res_cache = resistance_cache.Copy() + listeners = living_mob_list.Copy() + + while(current_sources.len) + var/datum/radiation_source/S = current_sources[current_sources.len] + current_sources.len-- + + if(QDELETED(S)) + sources -= S + else if(S.decay) + S.update_rad_power(S.rad_power - config.radiation_decay_rate) + if (MC_TICK_CHECK) + return + + while(current_res_cache.len) + var/turf/T = current_res_cache[current_res_cache.len] + current_res_cache.len-- + + if(QDELETED(T)) + resistance_cache -= T + else if((length(T.contents) + 1) != resistance_cache[T]) + resistance_cache -= T // If its stale REMOVE it! It will get added if its needed. + if (MC_TICK_CHECK) + return + + if(!sources.len) + listeners.Cut() + + while(listeners.len) + var/atom/A = listeners[listeners.len] + listeners.len-- + + if(!QDELETED(A)) + var/turf/T = get_turf(A) + var/rads = get_rads_at_turf(T) + if(rads) + A.rad_act(rads) + if (MC_TICK_CHECK) + return + +/datum/controller/subsystem/radiation/stat_entry() + ..("S:[sources.len], RC:[resistance_cache.len]") + +// Ray trace from all active radiation sources to T and return the strongest effect. +/datum/controller/subsystem/radiation/proc/get_rads_at_turf(var/turf/T) + . = 0 + if(!istype(T)) + return + + for(var/value in sources) + var/datum/radiation_source/source = value + if(source.rad_power < .) + continue // Already being affected by a stronger source + if(source.source_turf.z != T.z) + continue // Radiation is not multi-z + if(source.respect_maint) + var/area/A = T.loc + if(A.flags & RAD_SHIELDED) + continue // In shielded area + + var/dist = get_dist(source.source_turf, T) + if(dist > source.range) + continue // Too far to possibly affect + if(source.flat) + . = max(., source.rad_power) + continue // No need to ray trace for flat field + + // Okay, now ray trace to find resistence! + var/turf/origin = source.source_turf + var/working = source.rad_power + while(origin != T) + origin = get_step_towards(origin, T) //Raytracing + if(!resistance_cache[origin]) //Only get the resistance if we don't already know it. + origin.calc_rad_resistance() + if(origin.cached_rad_resistance) + working = round((working / (origin.cached_rad_resistance * config.radiation_resistance_multiplier)), 0.1) + if((working <= .) || (working <= RADIATION_THRESHOLD_CUTOFF)) + break // Already affected by a stronger source (or its zero...) + . = max((working / (dist ** 2)), .) //Butchered version of the inverse square law. Works for this purpose + if(. <= RADIATION_THRESHOLD_CUTOFF) + . = 0 + +// Add a radiation source instance to the repository. It will override any existing source on the same turf. +/datum/controller/subsystem/radiation/proc/add_source(var/datum/radiation_source/S) + if(!isturf(S.source_turf)) + return + var/datum/radiation_source/existing = sources_assoc[S.source_turf] + if(existing) + qdel(existing) + sources += S + sources_assoc[S.source_turf] = S + +// Creates a temporary radiation source that will decay +/datum/controller/subsystem/radiation/proc/radiate(source, power) //Sends out a radiation pulse, taking walls into account + if(!(source && power)) //Sanity checking + return + var/datum/radiation_source/S = new() + S.source_turf = get_turf(source) + S.update_rad_power(power) + add_source(S) + +// Sets the radiation in a range to a constant value. +/datum/controller/subsystem/radiation/proc/flat_radiate(source, power, range, var/respect_maint = TRUE) //VOREStation edit; Respect shielded areas by default please. + if(!(source && power && range)) + return + var/datum/radiation_source/S = new() + S.flat = TRUE + S.range = range + S.respect_maint = respect_maint + S.source_turf = get_turf(source) + S.update_rad_power(power) + add_source(S) + +// Irradiates a full Z-level. Hacky way of doing it, but not too expensive. +/datum/controller/subsystem/radiation/proc/z_radiate(var/atom/source, power, var/respect_maint = TRUE) //VOREStation edit; Respect shielded areas by default please. + if(!(power && source)) + return + var/turf/epicentre = locate(round(world.maxx / 2), round(world.maxy / 2), source.z) + flat_radiate(epicentre, power, world.maxx, respect_maint) \ No newline at end of file diff --git a/code/controllers/subsystems/vote.dm b/code/controllers/subsystems/vote.dm index e7c3d5aaf9b..54fb4879851 100644 --- a/code/controllers/subsystems/vote.dm +++ b/code/controllers/subsystems/vote.dm @@ -105,7 +105,7 @@ SUBSYSTEM_DEF(vote) factor = 1.4 choices["Initiate Crew Transfer"] = round(choices["Initiate Crew Transfer"] * factor) world << "Crew Transfer Factor: [factor]" - greatest_votes = max(choices["Initiate Crew Transfer"], choices["Continue The Round"]) + greatest_votes = max(choices["Initiate Crew Transfer"], choices["Extend the Shift"]) //VOREStation Edit . = list() // Get all options with that many votes and return them in a list if(greatest_votes) @@ -220,8 +220,8 @@ SUBSYSTEM_DEF(vote) if(ticker.current_state <= GAME_STATE_SETTING_UP) initiator_key << "The crew transfer button has been disabled!" return 0 - question = "End the shift?" - choices.Add("Initiate Crew Transfer", "Continue The Round") + question = "Your PDA beeps with a message from Central. Would you like an additional hour to finish ongoing projects?" //VOREStation Edit + choices.Add("Initiate Crew Transfer", "Extend the Shift") //VOREStation Edit if(VOTE_ADD_ANTAGONIST) if(!config.allow_extra_antags || ticker.current_state >= GAME_STATE_SETTING_UP) return 0 diff --git a/code/datums/autolathe/arms_vr.dm b/code/datums/autolathe/arms_vr.dm index 72f0b9d15ab..546141457d3 100644 --- a/code/datums/autolathe/arms_vr.dm +++ b/code/datums/autolathe/arms_vr.dm @@ -32,3 +32,21 @@ name = "magazine (.44 rubber)" path =/obj/item/ammo_magazine/m44/rubber hidden = 1 + +/datum/category_item/autolathe/arms/classic_smg_9mm + name = "SMG magazine (9mm)" + path = /obj/item/ammo_magazine/m9mml + hidden = 1 +/* De-coded? +/datum/category_item/autolathe/arms/classic_smg_9mmr + name = "SMG magazine (9mm rubber)" + path = /obj/item/ammo_magazine/m9mml/rubber + +/datum/category_item/autolathe/arms/classic_smg_9mmp + name = "SMG magazine (9mm practice)" + path = /obj/item/ammo_magazine/m9mml/practice + +/datum/category_item/autolathe/arms/classic_smg_9mmf + name = "SMG magazine (9mm flash)" + path = /obj/item/ammo_magazine/m9mml/flash +*/ \ No newline at end of file diff --git a/code/datums/autolathe/engineering_vr.dm b/code/datums/autolathe/engineering_vr.dm new file mode 100644 index 00000000000..08e1cf986bf --- /dev/null +++ b/code/datums/autolathe/engineering_vr.dm @@ -0,0 +1,7 @@ +/datum/category_item/autolathe/engineering/timeclock + name = "timeclock electronics" + path =/obj/item/weapon/circuitboard/timeclock + +/datum/category_item/autolathe/engineering/id_restorer + name = "ID restoration console electronics" + path =/obj/item/weapon/circuitboard/id_restorer \ No newline at end of file diff --git a/code/datums/ghost_query.dm b/code/datums/ghost_query.dm index 2f7942a9b29..427b38f73bb 100644 --- a/code/datums/ghost_query.dm +++ b/code/datums/ghost_query.dm @@ -117,7 +117,7 @@ /datum/ghost_query/lost_drone role_name = "Lost Drone" question = "A lost drone onboard has been discovered by a crewmember and they are attempting to reactivate it. Would you like to play as the drone?" - be_special_flag = BE_AI + //be_special_flag = BE_AI //VOREStation Removal: Positronic role is never used because intended purpose is unfitting, so remove the check check_bans = list("AI", "Cyborg") cutoff_number = 1 diff --git a/code/datums/helper_datums/teleport_vr.dm b/code/datums/helper_datums/teleport_vr.dm index b3054a44c09..d8e84285358 100644 --- a/code/datums/helper_datums/teleport_vr.dm +++ b/code/datums/helper_datums/teleport_vr.dm @@ -1,5 +1,5 @@ //wrapper -/proc/do_noeffect_teleport(ateleatom, adestination, aprecision=0, afteleport=1, aeffectin=null, aeffectout=null, asoundin=null, asoundout=null, local=TRUE) +/proc/do_noeffect_teleport(ateleatom, adestination, aprecision=0, afteleport=1, aeffectin=null, aeffectout=null, asoundin=null, asoundout=null, local=FALSE) new /datum/teleport/instant/science/noeffect(arglist(args)) return diff --git a/code/datums/outfits/jobs/civilian.dm b/code/datums/outfits/jobs/civilian.dm index 8e7f72815c5..c6d6194f17b 100644 --- a/code/datums/outfits/jobs/civilian.dm +++ b/code/datums/outfits/jobs/civilian.dm @@ -44,6 +44,14 @@ name = OUTFIT_JOB_NAME("Cook") id_pda_assignment = "Cook" +// Rykka adds Server Outfit + +/decl/hierarchy/outfit/job/service/server + name = OUTFIT_JOB_NAME("Server") + uniform = /obj/item/clothing/under/waiter + +// End Outfit addition + /decl/hierarchy/outfit/job/service/gardener name = OUTFIT_JOB_NAME("Gardener") uniform = /obj/item/clothing/under/rank/hydroponics diff --git a/code/datums/outfits/military/fleet.dm b/code/datums/outfits/military/fleet.dm index cf5028978d0..915917918cf 100644 --- a/code/datums/outfits/military/fleet.dm +++ b/code/datums/outfits/military/fleet.dm @@ -1,21 +1,21 @@ /decl/hierarchy/outfit/military/fleet/pt name = OUTFIT_MILITARY("Fleet PT") - uniform = /obj/item/clothing/under/pt/fleet + uniform = /obj/item/clothing/under/solgov/pt/fleet shoes = /obj/item/clothing/shoes/black /decl/hierarchy/outfit/military/fleet/utility name = OUTFIT_MILITARY("Fleet Utility") - uniform = /obj/item/clothing/under/utility/fleet - shoes = /obj/item/clothing/shoes/boots/jackboots + uniform = /obj/item/clothing/under/solgov/utility/fleet + shoes = /obj/item/clothing/shoes/boots/duty /decl/hierarchy/outfit/military/fleet/service name = OUTFIT_MILITARY("Fleet Service") - uniform = /obj/item/clothing/under/service/fleet + uniform = /obj/item/clothing/under/solgov/service/fleet shoes = /obj/item/clothing/shoes/dress/white /decl/hierarchy/outfit/military/fleet/dress name = OUTFIT_MILITARY("Fleet Dress") - uniform = /obj/item/clothing/under/service/fleet + uniform = /obj/item/clothing/under/solgov/service/fleet shoes = /obj/item/clothing/shoes/dress/white suit = /obj/item/clothing/suit/storage/toggle/dress/fleet gloves = /obj/item/clothing/gloves/white diff --git a/code/datums/outfits/military/marines.dm b/code/datums/outfits/military/marines.dm index d818dabcaaa..719b36c6909 100644 --- a/code/datums/outfits/military/marines.dm +++ b/code/datums/outfits/military/marines.dm @@ -1,22 +1,22 @@ /decl/hierarchy/outfit/military/marine/pt name = OUTFIT_MILITARY("Marine PT") - uniform = /obj/item/clothing/under/pt/marine + uniform = /obj/item/clothing/under/solgov/pt/marine shoes = /obj/item/clothing/shoes/black /decl/hierarchy/outfit/military/marine/utility name = OUTFIT_MILITARY("Marine Utility") - uniform = /obj/item/clothing/under/utility/marine + uniform = /obj/item/clothing/under/solgov/utility/marine shoes = /obj/item/clothing/shoes/boots/jungle /decl/hierarchy/outfit/military/marine/service name = OUTFIT_MILITARY("Marine Service") - uniform = /obj/item/clothing/under/service/marine + uniform = /obj/item/clothing/under/solgov/service/marine shoes = /obj/item/clothing/shoes/dress suit = /obj/item/clothing/suit/storage/service/marine /decl/hierarchy/outfit/military/marine/dress name = OUTFIT_MILITARY("Marine Dress") - uniform = /obj/item/clothing/under/mildress/marine + uniform = /obj/item/clothing/under/solgov/mildress/marine shoes = /obj/item/clothing/shoes/dress/white suit = /obj/item/clothing/suit/dress/marine gloves = /obj/item/clothing/gloves/white diff --git a/code/datums/outfits/military/sifguard.dm b/code/datums/outfits/military/sifguard.dm index e1280f0cfed..9348224a9eb 100644 --- a/code/datums/outfits/military/sifguard.dm +++ b/code/datums/outfits/military/sifguard.dm @@ -1,22 +1,22 @@ /decl/hierarchy/outfit/military/sifguard/pt name = OUTFIT_MILITARY("SifGuard PT") - uniform = /obj/item/clothing/under/pt/sifguard + uniform = /obj/item/clothing/under/solgov/pt/sifguard shoes = /obj/item/clothing/shoes/black /decl/hierarchy/outfit/military/sifguard/utility name = OUTFIT_MILITARY("SifGuard Utility") - uniform = /obj/item/clothing/under/utility/sifguard - shoes = /obj/item/clothing/shoes/boots/jackboots + uniform = /obj/item/clothing/under/solgov/utility/sifguard + shoes = /obj/item/clothing/shoes/boots/tactical /decl/hierarchy/outfit/military/sifguard/service name = OUTFIT_MILITARY("SifGuard Service") - uniform = /obj/item/clothing/under/utility/sifguard - shoes = /obj/item/clothing/shoes/boots/jackboots + uniform = /obj/item/clothing/under/solgov/utility/sifguard + shoes = /obj/item/clothing/shoes/boots/tactical suit = /obj/item/clothing/suit/storage/service/sifguard /decl/hierarchy/outfit/military/sifguard/dress name = OUTFIT_MILITARY("SifGuard Dress") - uniform = /obj/item/clothing/under/mildress/sifguard + uniform = /obj/item/clothing/under/solgov/mildress/sifguard shoes = /obj/item/clothing/shoes/dress suit = /obj/item/clothing/suit/dress/expedition gloves = /obj/item/clothing/gloves/white diff --git a/code/datums/outfits/outfit_vr.dm b/code/datums/outfits/outfit_vr.dm index 6177836a759..27e5cde50ef 100644 --- a/code/datums/outfits/outfit_vr.dm +++ b/code/datums/outfits/outfit_vr.dm @@ -1,6 +1,6 @@ /decl/hierarchy/outfit/USDF/Marine name = "USDF marine" - uniform = /obj/item/clothing/under/utility/marine/green + uniform = /obj/item/clothing/under/solgov/utility/marine/green shoes = /obj/item/clothing/shoes/boots/jackboots gloves = /obj/item/clothing/gloves/combat l_ear = /obj/item/device/radio/headset/centcom @@ -30,7 +30,7 @@ head = /obj/item/clothing/head/dress/marine/command/admiral shoes = /obj/item/clothing/shoes/boots/jackboots l_ear = /obj/item/device/radio/headset/centcom - uniform = /obj/item/clothing/under/mildress/marine/command + uniform = /obj/item/clothing/under/solgov/mildress/marine/command back = /obj/item/weapon/storage/backpack/satchel belt = /obj/item/weapon/gun/projectile/revolver/consul l_pocket = /obj/item/ammo_magazine/s44 diff --git a/code/datums/repositories/radiation.dm b/code/datums/repositories/radiation.dm deleted file mode 100644 index 4525032e200..00000000000 --- a/code/datums/repositories/radiation.dm +++ /dev/null @@ -1,138 +0,0 @@ -var/global/repository/radiation/radiation_repository = new() - -/repository/radiation - var/list/sources = list() // all radiation source datums - var/list/sources_assoc = list() // Sources indexed by turf for de-duplication. - var/list/resistance_cache = list() // Cache of turf's radiation resistance. - -// Describes a point source of radiation. Created either in response to a pulse of radiation, or over an irradiated atom. -// Sources will decay over time, unless something is renewing their power! -/datum/radiation_source - var/turf/source_turf // Location of the radiation source. - var/rad_power // Strength of the radiation being emitted. - var/decay = TRUE // True for automatic decay. False if owner promises to handle it (i.e. supermatter) - var/respect_maint = FALSE // True for not affecting RAD_SHIELDED areas. - var/flat = FALSE // True for power falloff with distance. - var/range // Cached maximum range, used for quick checks against mobs. - -/datum/radiation_source/Destroy() - radiation_repository.sources -= src - if(radiation_repository.sources_assoc[src.source_turf] == src) - radiation_repository.sources_assoc -= src.source_turf - src.source_turf = null - . = ..() - -/datum/radiation_source/proc/update_rad_power(var/new_power = null) - if(new_power == null || new_power == rad_power) - return // No change - else if(new_power <= 0) - qdel(src) // Decayed to nothing - else - rad_power = new_power - if(!flat) - range = min(round(sqrt(rad_power / config.radiation_lower_limit)), 31) // R = rad_power / dist**2 - Solve for dist - -// Ray trace from all active radiation sources to T and return the strongest effect. -/repository/radiation/proc/get_rads_at_turf(var/turf/T) - if(!istype(T)) return 0 - - . = 0 - for(var/value in sources) - var/datum/radiation_source/source = value - if(source.rad_power < .) - continue // Already being affected by a stronger source - if(source.source_turf.z != T.z) - continue // Radiation is not multi-z - var/dist = get_dist(source.source_turf, T) - if(dist > source.range) - continue // Too far to possibly affect - if(source.respect_maint) - var/atom/A = T.loc - if(A.flags & RAD_SHIELDED) - continue // In shielded area - if(source.flat) - . = max(., source.rad_power) - continue // No need to ray trace for flat field - - // Okay, now ray trace to find resistence! - var/turf/origin = source.source_turf - var/working = source.rad_power - while(origin != T) - origin = get_step_towards(origin, T) //Raytracing - if(!(origin in resistance_cache)) //Only get the resistance if we don't already know it. - origin.calc_rad_resistance() - working = max((working - (origin.cached_rad_resistance * config.radiation_resistance_multiplier)), 0) - if(working <= .) - break // Already affected by a stronger source (or its zero...) - . = max((working * (1 / (dist ** 2))), .) //Butchered version of the inverse square law. Works for this purpose - -// Add a radiation source instance to the repository. It will override any existing source on the same turf. -/repository/radiation/proc/add_source(var/datum/radiation_source/S) - if(!isturf(S.source_turf)) - return - var/datum/radiation_source/existing = sources_assoc[S.source_turf] - if(existing) - qdel(existing) - sources += S - sources_assoc[S.source_turf] = S - -// Creates a temporary radiation source that will decay -/repository/radiation/proc/radiate(source, power) //Sends out a radiation pulse, taking walls into account - if(!(source && power)) //Sanity checking - return - var/datum/radiation_source/S = new() - S.source_turf = get_turf(source) - S.update_rad_power(power) - add_source(S) - -// Sets the radiation in a range to a constant value. -/repository/radiation/proc/flat_radiate(source, power, range, var/respect_maint = TRUE) //VOREStation edit; Respect shielded areas by default please. - if(!(source && power && range)) - return - var/datum/radiation_source/S = new() - S.flat = TRUE - S.range = range - S.respect_maint = respect_maint - S.source_turf = get_turf(source) - S.update_rad_power(power) - add_source(S) - -// Irradiates a full Z-level. Hacky way of doing it, but not too expensive. -/repository/radiation/proc/z_radiate(var/atom/source, power, var/respect_maint = TRUE) //VOREStation edit; Respect shielded areas by default please. - if(!(power && source)) - return - var/turf/epicentre = locate(round(world.maxx / 2), round(world.maxy / 2), source.z) - flat_radiate(epicentre, power, world.maxx, respect_maint) - -/turf - var/cached_rad_resistance = 0 - -/turf/proc/calc_rad_resistance() - cached_rad_resistance = 0 - for(var/obj/O in src.contents) - if(O.rad_resistance) //Override - cached_rad_resistance += O.rad_resistance - - else if(O.density) //So open doors don't get counted - var/material/M = O.get_material() - if(!M) continue - cached_rad_resistance += M.weight + M.radiation_resistance - // Looks like storing the contents length is meant to be a basic check if the cache is stale due to items enter/exiting. Better than nothing so I'm leaving it as is. ~Leshana - radiation_repository.resistance_cache[src] = (length(contents) + 1) - -/turf/simulated/wall/calc_rad_resistance() - radiation_repository.resistance_cache[src] = (length(contents) + 1) - cached_rad_resistance = (density ? material.weight + material.radiation_resistance : 0) - -/obj - var/rad_resistance = 0 // Allow overriding rad resistance - -// If people expand the system, this may be useful. Here as a placeholder until then -/atom/proc/rad_act(var/severity) - return 1 - -/mob/living/rad_act(var/severity) - if(severity && !isbelly(loc)) //eaten mobs are made immune to radiation //VOREStation Edit Start - src.apply_effect(severity, IRRADIATE, src.getarmor(null, "rad")) - for(var/atom/I in src) - I.rad_act(severity) ///VOREStation Edit End diff --git a/code/datums/supplypacks/engineering.dm b/code/datums/supplypacks/engineering.dm index e3b9a148cce..e387309da7a 100644 --- a/code/datums/supplypacks/engineering.dm +++ b/code/datums/supplypacks/engineering.dm @@ -21,6 +21,20 @@ containertype = /obj/structure/closet/crate/engineering containername = "Superconducting Magnetic Coil crate" +/datum/supply_pack/eng/smescoil/super_capacity + name = "Superconducting Capacitance Coil" + contains = list(/obj/item/weapon/smes_coil/super_capacity) + cost = 90 + containertype = /obj/structure/closet/crate/engineering + containername = "Superconducting Capacitance Coil crate" + +/datum/supply_pack/eng/smescoil/super_io + name = "Superconducting Transmission Coil" + contains = list(/obj/item/weapon/smes_coil/super_io) + cost = 90 + containertype = /obj/structure/closet/crate/engineering + containername = "Superconducting Transmission Coil crate" + /datum/supply_pack/eng/shield_capacitor name = "Shield Capacitor" contains = list(/obj/machinery/shield_capacitor) @@ -290,4 +304,4 @@ cost = 75 containername = "Tritium crate" containertype = /obj/structure/closet/crate/engineering - contains = list(/obj/fiftyspawner/tritium) \ No newline at end of file + contains = list(/obj/fiftyspawner/tritium) diff --git a/code/datums/supplypacks/hospitality_vr.dm b/code/datums/supplypacks/hospitality_vr.dm index 822773b6f9a..decb7027db1 100644 --- a/code/datums/supplypacks/hospitality_vr.dm +++ b/code/datums/supplypacks/hospitality_vr.dm @@ -1,3 +1,6 @@ +/datum/supply_pack/randomised/hospitality/pizza + cost = 50 + /datum/supply_pack/randomised/hospitality/burgers_vr num_contained = 5 contains = list( diff --git a/code/datums/supplypacks/medical.dm b/code/datums/supplypacks/medical.dm index 5596d95f038..e345b18505f 100644 --- a/code/datums/supplypacks/medical.dm +++ b/code/datums/supplypacks/medical.dm @@ -334,4 +334,18 @@ contains = list(/obj/item/device/defib_kit = 2) cost = 30 containertype = /obj/structure/closet/crate/medical - containername = "Defibrillator crate" \ No newline at end of file + containername = "Defibrillator crate" + +/datum/supply_pack/med/distillery + name = "Chemical distiller crate" + contains = list(/obj/machinery/portable_atmospherics/powered/reagent_distillery = 1) + cost = 175 + containertype = /obj/structure/largecrate + containername = "Chemical distiller crate" + +/datum/supply_pack/med/advdistillery + name = "Industrial Chemical distiller crate" + contains = list(/obj/machinery/portable_atmospherics/powered/reagent_distillery/industrial = 1) + cost = 250 + containertype = /obj/structure/largecrate + containername = "Industrial Chemical distiller crate" diff --git a/code/datums/supplypacks/medical_vr.dm b/code/datums/supplypacks/medical_vr.dm index 344e2bbdbda..0538f838679 100644 --- a/code/datums/supplypacks/medical_vr.dm +++ b/code/datums/supplypacks/medical_vr.dm @@ -1,38 +1,50 @@ -/datum/supply_pack/med/medicalbiosuits - contains = list( - /obj/item/clothing/head/bio_hood/scientist = 3, - /obj/item/clothing/suit/bio_suit/scientist = 3, - /obj/item/clothing/suit/bio_suit/virology = 3, - /obj/item/clothing/head/bio_hood/virology = 3, - /obj/item/clothing/suit/bio_suit/cmo, - /obj/item/clothing/head/bio_hood/cmo, - /obj/item/clothing/shoes/white = 7, - /obj/item/clothing/mask/gas = 7, - /obj/item/weapon/tank/oxygen = 7, - /obj/item/weapon/storage/box/masks, - /obj/item/weapon/storage/box/gloves - ) - cost = 40 - -/datum/supply_pack/med/virologybiosuits - name = "Virology biohazard gear" - contains = list( - /obj/item/clothing/suit/bio_suit/virology = 3, - /obj/item/clothing/head/bio_hood/virology = 3, - /obj/item/clothing/mask/gas = 3, - /obj/item/weapon/tank/oxygen = 3, - /obj/item/weapon/storage/box/masks, - /obj/item/weapon/storage/box/gloves - ) - cost = 40 - containertype = /obj/structure/closet/crate/secure - containername = "Virology biohazard equipment" - access = access_medical_equip - -/datum/supply_pack/med/virus - name = "Virus sample crate" - contains = list(/obj/item/weapon/virusdish/random = 4) - cost = 25 - containertype = /obj/structure/closet/crate/secure - containername = "Virus sample crate" - access = access_medical_equip \ No newline at end of file +/datum/supply_pack/med/medicalbiosuits + contains = list( + /obj/item/clothing/head/bio_hood/scientist = 3, + /obj/item/clothing/suit/bio_suit/scientist = 3, + /obj/item/clothing/suit/bio_suit/virology = 3, + /obj/item/clothing/head/bio_hood/virology = 3, + /obj/item/clothing/suit/bio_suit/cmo, + /obj/item/clothing/head/bio_hood/cmo, + /obj/item/clothing/shoes/white = 7, + /obj/item/clothing/mask/gas = 7, + /obj/item/weapon/tank/oxygen = 7, + /obj/item/weapon/storage/box/masks, + /obj/item/weapon/storage/box/gloves + ) + cost = 40 + +/datum/supply_pack/med/virologybiosuits + name = "Virology biohazard gear" + contains = list( + /obj/item/clothing/suit/bio_suit/virology = 3, + /obj/item/clothing/head/bio_hood/virology = 3, + /obj/item/clothing/mask/gas = 3, + /obj/item/weapon/tank/oxygen = 3, + /obj/item/weapon/storage/box/masks, + /obj/item/weapon/storage/box/gloves + ) + cost = 40 + containertype = /obj/structure/closet/crate/secure + containername = "Virology biohazard equipment" + access = access_medical_equip + +/datum/supply_pack/med/virus + name = "Virus sample crate" + contains = list(/obj/item/weapon/virusdish/random = 4) + cost = 25 + containertype = /obj/structure/closet/crate/secure + containername = "Virus sample crate" + access = access_medical_equip + + +/datum/supply_pack/med/bloodpack + containertype = /obj/structure/closet/crate/medical/blood + +/datum/supply_pack/med/compactdefib + name = "Compact Defibrillator crate" + contains = list(/obj/item/device/defib_kit/compact = 1) + cost = 90 + containertype = /obj/structure/closet/crate/secure + containername = "Compact Defibrillator crate" + access = access_medical_equip diff --git a/code/datums/supplypacks/misc.dm b/code/datums/supplypacks/misc.dm index b77d442e82f..bf5b8ba53b4 100644 --- a/code/datums/supplypacks/misc.dm +++ b/code/datums/supplypacks/misc.dm @@ -143,4 +143,30 @@ ) cost = 25 containertype = /obj/structure/closet/crate - containername = "Glucose Hypo Crate" \ No newline at end of file + containername = "Glucose Hypo Crate" + +/datum/supply_pack/misc/mre_rations + num_contained = 6 + name = "Emergency - MREs" + contains = list(/obj/item/weapon/storage/mre, + /obj/item/weapon/storage/mre/menu2, + /obj/item/weapon/storage/mre/menu3, + /obj/item/weapon/storage/mre/menu4, + /obj/item/weapon/storage/mre/menu5, + /obj/item/weapon/storage/mre/menu6, + /obj/item/weapon/storage/mre/menu7, + /obj/item/weapon/storage/mre/menu8, + /obj/item/weapon/storage/mre/menu9, + /obj/item/weapon/storage/mre/menu10) + cost = 50 + containertype = /obj/structure/closet/crate/freezer + containername = "ready to eat rations" + +/datum/supply_pack/misc/paste_rations + name = "Emergency - Paste" + contains = list( + /obj/item/weapon/storage/mre/menu11 = 2 + ) + cost = 25 + containertype = /obj/structure/closet/crate/freezer + containername = "emergency rations" diff --git a/code/datums/supplypacks/misc_vr.dm b/code/datums/supplypacks/misc_vr.dm index f85d7b97232..93523707b9d 100644 --- a/code/datums/supplypacks/misc_vr.dm +++ b/code/datums/supplypacks/misc_vr.dm @@ -13,24 +13,6 @@ containername = "Belt-miner gear crate" access = access_mining -/datum/supply_pack/misc/rations - name = "Emergency rations" - contains = list( - /obj/item/weapon/reagent_containers/food/snacks/liquidfood = 4, - ) - cost = 20 - containertype = /obj/structure/closet/crate/freezer - containername = "emergency rations" - -/datum/supply_pack/misc/proteinrations - name = "Emergency meat rations" - contains = list( - /obj/item/weapon/reagent_containers/food/snacks/liquidprotein = 4, - ) - cost = 30 - containertype = /obj/structure/closet/crate/freezer - containername = "emergency meat rations" - /datum/supply_pack/misc/eva_rig name = "eva hardsuit (empty)" contains = list( @@ -43,6 +25,7 @@ access_eva, access_explorer, access_pilot) + one_access = TRUE /datum/supply_pack/misc/mining_rig name = "industrial hardsuit (empty)" @@ -53,4 +36,45 @@ containertype = /obj/structure/closet/crate/secure/gear containername = "industrial hardsuit crate" access = list(access_mining, - access_eva) \ No newline at end of file + access_eva) + one_access = TRUE + +/datum/supply_pack/misc/medical_rig + name = "medical hardsuit (empty)" + contains = list( + /obj/item/weapon/rig/medical = 1 + ) + cost = 150 + containertype = /obj/structure/closet/crate/secure/gear + containername = "medical hardsuit crate" + access = access_medical + +/datum/supply_pack/misc/security_rig + name = "hazard hardsuit (empty)" + contains = list( + /obj/item/weapon/rig/hazard = 1 + ) + cost = 150 + containertype = /obj/structure/closet/crate/secure/gear + containername = "hazard hardsuit crate" + access = access_armory + +/datum/supply_pack/misc/science_rig + name = "ami hardsuit (empty)" + contains = list( + /obj/item/weapon/rig/hazmat = 1 + ) + cost = 150 + containertype = /obj/structure/closet/crate/secure/gear + containername = "ami hardsuit crate" + access = access_rd + +/datum/supply_pack/misc/ce_rig + name = "advanced voidsuit (empty)" + contains = list( + /obj/item/weapon/rig/ce = 1 + ) + cost = 150 + containertype = /obj/structure/closet/crate/secure/gear + containername = "advanced voidsuit crate" + access = access_ce diff --git a/code/datums/supplypacks/recreation.dm b/code/datums/supplypacks/recreation.dm index 9c12c17a149..357f0eaeadc 100644 --- a/code/datums/supplypacks/recreation.dm +++ b/code/datums/supplypacks/recreation.dm @@ -87,4 +87,14 @@ contains = list( /obj/item/weapon/storage/box/wormcan, /obj/item/weapon/storage/box/wormcan/deluxe + ) + +/datum/supply_pack/recreation/ltagturrets + name = "Laser Tag Turrets" + cost = 40 + containername = "laser tag turret crate" + containertype = /obj/structure/closet/crate + contains = list( + /obj/machinery/porta_turret/lasertag/blue, + /obj/machinery/porta_turret/lasertag/red ) \ No newline at end of file diff --git a/code/datums/supplypacks/security_vr.dm b/code/datums/supplypacks/security_vr.dm index 12f2fa33b3f..a00556e5287 100644 --- a/code/datums/supplypacks/security_vr.dm +++ b/code/datums/supplypacks/security_vr.dm @@ -6,6 +6,7 @@ access = list( access_security, access_xenobiology) + one_access = TRUE /datum/supply_pack/security/guardmutant name = "VARMAcorp autoNOMous security solution for hostile environments" @@ -15,6 +16,7 @@ access = list( access_security, access_xenobiology) + one_access = TRUE */ /datum/supply_pack/randomised/security/armor @@ -32,3 +34,23 @@ /obj/item/weapon/storage/box/gloves ) cost = 40 + +/datum/supply_pack/security/trackingimplant + name = "Implants - Tracking" + contains = list( + /obj/item/weapon/storage/box/trackimp = 1 + ) + cost = 25 + containertype = /obj/structure/closet/crate/secure + containername = "Tracking implants" + access = access_security + +/datum/supply_pack/security/chemicalimplant + name = "Implants - Chemical" + contains = list( + /obj/item/weapon/storage/box/chemimp = 1 + ) + cost = 25 + containertype = /obj/structure/closet/crate/secure + containername = "Chemical implants" + access = access_security diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm index 8699f11920f..482598027af 100644 --- a/code/defines/obj/weapon.dm +++ b/code/defines/obj/weapon.dm @@ -29,6 +29,7 @@ gender = PLURAL icon = 'icons/obj/items.dmi' icon_state = "soap" + flags = NOCONDUCT w_class = ITEMSIZE_SMALL slot_flags = SLOT_HOLSTER throwforce = 0 @@ -395,7 +396,7 @@ display_contents_with_number = 1 max_w_class = ITEMSIZE_NORMAL max_storage_space = 100 - + /obj/item/weapon/storage/part_replacer/adv name = "advanced rapid part exchange device" desc = "Special mechanical module made to store, sort, and apply standard machine parts. This one has a greatly upgraded storage capacity" diff --git a/code/game/antagonist/station/highlander.dm b/code/game/antagonist/station/highlander.dm index e2ec983818a..f483b1df3bd 100644 --- a/code/game/antagonist/station/highlander.dm +++ b/code/game/antagonist/station/highlander.dm @@ -47,8 +47,8 @@ var/datum/antagonist/highlander/highlanders var/obj/item/weapon/card/id/W = new(player) W.name = "[player.real_name]'s ID Card" W.icon_state = "centcom" - W.access = get_all_station_access() - W.access += get_all_centcom_access() + W.access = get_all_station_access().Copy + W.access |= get_all_centcom_access() W.assignment = "Highlander" W.registered_name = player.real_name player.equip_to_slot_or_del(W, slot_wear_id) diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index 787cc55f7b6..ac11cd2e4f0 100755 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -2737,4 +2737,4 @@ var/list/the_station_areas = list ( icon_state = "yellow" luminosity = 1 dynamic_lighting = 0 - requires_power = 0 + requires_power = 0 \ No newline at end of file diff --git a/code/game/area/Space Station 13 areas_vr.dm b/code/game/area/Space Station 13 areas_vr.dm index 396ab608215..c03489b3071 100644 --- a/code/game/area/Space Station 13 areas_vr.dm +++ b/code/game/area/Space Station 13 areas_vr.dm @@ -1,121 +1,4 @@ -/area/crew_quarters/sleep/vistor_room_1 - flags = RAD_SHIELDED | BLUE_SHIELDED - -/area/crew_quarters/sleep/vistor_room_2 - flags = RAD_SHIELDED | BLUE_SHIELDED - -/area/crew_quarters/sleep/vistor_room_3 - flags = RAD_SHIELDED | BLUE_SHIELDED - -/area/crew_quarters/sleep/vistor_room_4 - flags = RAD_SHIELDED | BLUE_SHIELDED - -/area/crew_quarters/sleep/vistor_room_5 - flags = RAD_SHIELDED | BLUE_SHIELDED - -/area/crew_quarters/sleep/vistor_room_6 - flags = RAD_SHIELDED | BLUE_SHIELDED - -/area/crew_quarters/sleep/vistor_room_7 - flags = RAD_SHIELDED | BLUE_SHIELDED - -/area/crew_quarters/sleep/vistor_room_8 - flags = RAD_SHIELDED | BLUE_SHIELDED - -/area/crew_quarters/sleep/vistor_room_9 - flags = RAD_SHIELDED | BLUE_SHIELDED - -/area/crew_quarters/sleep/vistor_room_10 - flags = RAD_SHIELDED | BLUE_SHIELDED - -/area/crew_quarters/sleep/vistor_room_11 - flags = RAD_SHIELDED | BLUE_SHIELDED - -/area/crew_quarters/sleep/vistor_room_12 - flags = RAD_SHIELDED | BLUE_SHIELDED - -/area/crew_quarters/sleep/Dorm_1 - flags = RAD_SHIELDED | BLUE_SHIELDED - -/area/crew_quarters/sleep/Dorm_2 - flags = RAD_SHIELDED | BLUE_SHIELDED - -/area/crew_quarters/sleep/Dorm_3 - flags = RAD_SHIELDED | BLUE_SHIELDED - -/area/crew_quarters/sleep/Dorm_4 - flags = RAD_SHIELDED | BLUE_SHIELDED - -/area/crew_quarters/sleep/Dorm_5 - flags = RAD_SHIELDED | BLUE_SHIELDED - -/area/crew_quarters/sleep/Dorm_6 - flags = RAD_SHIELDED | BLUE_SHIELDED - -/area/crew_quarters/sleep/Dorm_7 - flags = RAD_SHIELDED | BLUE_SHIELDED - -/area/crew_quarters/sleep/Dorm_8 - flags = RAD_SHIELDED | BLUE_SHIELDED - -/area/crew_quarters/sleep/Dorm_9 - flags = RAD_SHIELDED | BLUE_SHIELDED - -/area/crew_quarters/sleep/Dorm_10 - flags = RAD_SHIELDED | BLUE_SHIELDED - -/area/teleporter/departing - name = "\improper Long-Range Teleporter" - icon_state = "teleporter" - music = "signal" - -// Override telescience shielding on some areas -/area/security/armoury - flags = BLUE_SHIELDED - -/area/security/tactical - flags = BLUE_SHIELDED - -/area/security/nuke_storage - flags = BLUE_SHIELDED - -/area/supply - flags = BLUE_SHIELDED - -// Add rad shielding to maintenance and construction sites -/area/vacant - flags = RAD_SHIELDED - -/area/maintenance - flags = RAD_SHIELDED - -/area/rnd/research_storage //Located entirely in maint under public access, so why not that too - flags = RAD_SHIELDED - -// New shuttles -/area/shuttle/administration/transit - name = "Deep Space (AS)" - icon_state = "shuttle" - -/area/shuttle/administration/away_mission - name = "Away Mission (AS)" - icon_state = "shuttle" - -/area/shuttle/awaymission/home - name = "NSB Adephagia (AM)" - icon_state = "shuttle2" - -/area/shuttle/awaymission/warp - name = "Deep Space (AM)" - icon_state = "shuttle" - -/area/shuttle/awaymission/away - name = "Away Mission (AM)" - icon_state = "shuttle2" - -/area/shuttle/awaymission/oldengbase - name = "Old Construction Site (AM)" - icon_state = "shuttle2" +//TFF 28/8/19 - cleanup of areas placement - removes all but rogueminer_vr stuff. /area/shuttle/belter/station name = "Belter Shuttle Landed" @@ -162,140 +45,6 @@ icon_state = "red2" shuttle_area = /area/shuttle/belter/belt/zone4 -/area/medical/resleeving - name = "Resleeving Lab" - icon_state = "genetics" - -/area/bigship - name = "Bigship" - requires_power = 0 - flags = RAD_SHIELDED - sound_env = SMALL_ENCLOSED - base_turf = /turf/space - icon_state = "red2" - -/area/bigship/teleporter - name = "Bigship Teleporter Room" - -//////// Small Cruiser Areas //////// -/area/houseboat - name = "Small Cruiser" - requires_power = 0 - flags = RAD_SHIELDED - base_turf = /turf/space - icon_state = "red2" - lightswitch = TRUE - -/area/houseboat/holodeck_area - name = "Small Cruiser - Holodeck" - icon_state = "blue2" - -/area/houseboat/holodeck/off - name = "Small Cruiser Holo - Off" - icon_state = "blue2" -/area/houseboat/holodeck/beach - name = "Small Cruiser Holo - Beach" - icon_state = "blue2" -/area/houseboat/holodeck/snow - name = "Small Cruiser Holo - Snow" - icon_state = "blue2" -/area/houseboat/holodeck/desert - name = "Small Cruiser Holo - Desert" - icon_state = "blue2" -/area/houseboat/holodeck/picnic - name = "Small Cruiser Holo - Picnic" - icon_state = "blue2" -/area/houseboat/holodeck/thunderdome - name = "Small Cruiser Holo - Thunderdome" - icon_state = "blue2" -/area/houseboat/holodeck/basketball - name = "Small Cruiser Holo - Basketball" - icon_state = "blue2" -/area/houseboat/holodeck/gaming - name = "Small Cruiser Holo - Gaming Table" - icon_state = "blue2" -/area/houseboat/holodeck/space - name = "Small Cruiser Holo - Space" - icon_state = "blue2" -/area/houseboat/holodeck/bunking - name = "Small Cruiser Holo - Bunking" - icon_state = "blue2" - -/area/shuttle/cruiser/cruiser - name = "Small Cruiser Shuttle - Cruiser" - icon_state = "blue2" - base_turf = /turf/simulated/floor/tiled/techfloor -/area/shuttle/cruiser/station - name = "Small Cruiser Shuttle - Station" - icon_state = "blue2" - - -// Tether Map has this shuttle -/area/shuttle/tether/surface - name = "Tether Shuttle Landed" - icon_state = "shuttle" - base_turf = /turf/simulated/floor/reinforced - -/area/shuttle/tether/station - name = "Tether Shuttle Dock" - icon_state = "shuttle2" - -/area/shuttle/tether/transit - name = "Tether Shuttle Transit" - icon_state = "shuttle2" - -// rnd (Research and Development) -/area/rnd/research/testingrange - name = "\improper Weapons Testing Range" - icon_state = "firingrange" - -/area/rnd/research/researchdivision - name = "\improper Research Division" - icon_state = "research" - -/area/rnd/outpost - name = "\improper Research Outpost Hallway" - icon_state = "research" - -/area/rnd/outpost/airlock - name = "\improper Research Outpost Airlock" - icon_state = "green" - -/area/rnd/outpost/eva - name = "Research Outpost EVA Storage" - icon_state = "eva" - -/area/rnd/outpost/chamber - name = "\improper Research Outpost Burn Chamber" - icon_state = "engine" - -/area/rnd/outpost/atmos - name = "Research Outpost Atmospherics" - icon_state = "atmos" - -/area/rnd/outpost/storage - name = "\improper Research Outpost Gas Storage" - icon_state = "toxstorage" - -/area/rnd/outpost/mixing - name = "\improper Research Outpost Gas Mixing" - icon_state = "toxmix" - -/area/rnd/outpost/heating - name = "\improper Research Outpost Gas Heating" - icon_state = "toxmix" - -/area/rnd/outpost/testing - name = "\improper Research Outpost Testing" - icon_state = "toxtest" - -/area/maintenance/substation/outpost - name = "Research Outpost Substation" - /area/engineering/engine_gas name = "\improper Engine Gas Storage" icon_state = "engine_waste" - -/area/chapel/observation - name = "\improper Chapel Observation" - icon_state = "chapel" \ No newline at end of file diff --git a/code/game/area/areas_vr.dm b/code/game/area/areas_vr.dm new file mode 100644 index 00000000000..d422c1cd0f1 --- /dev/null +++ b/code/game/area/areas_vr.dm @@ -0,0 +1,6 @@ +/area/shuttle_arrived() + .=..() + for(var/obj/machinery/telecomms/relay/R in contents) + R.reset_z() + for(var/obj/machinery/power/apc/A in contents) + A.update_area() diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 6929943de22..631ed4df19f 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -388,7 +388,8 @@ blood_DNA = list() was_bloodied = 1 - blood_color = "#A10808" + if(!blood_color) + blood_color = "#A10808" if(istype(M)) if (!istype(M.dna, /datum/dna)) M.dna = new /datum/dna(null) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index adaabce4422..c8f0b44c3d5 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -1,6 +1,6 @@ /atom/movable layer = OBJ_LAYER - appearance_flags = TILE_BOUND|PIXEL_SCALE + appearance_flags = TILE_BOUND|PIXEL_SCALE|KEEP_TOGETHER //VOREStation Edit var/last_move = null var/anchored = 0 // var/elevation = 2 - not used anywhere diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm index c87427bc44d..24c2ed5f527 100644 --- a/code/game/gamemodes/cult/cult_structures.dm +++ b/code/game/gamemodes/cult/cult_structures.dm @@ -35,6 +35,22 @@ /obj/structure/cult/pylon/attackby(obj/item/W as obj, mob/user as mob) attackpylon(user, W.force) +/obj/structure/cult/pylon/take_damage(var/damage) + pylonhit(damage) + +/obj/structure/cult/pylon/bullet_act(var/obj/item/projectile/Proj) + pylonhit(Proj.get_structure_damage()) + +/obj/structure/cult/pylon/proc/pylonhit(var/damage) + if(!isbroken) + if(prob(1+ damage * 5)) + visible_message("The pylon shatters!") + playsound(get_turf(src), 'sound/effects/Glassbr3.ogg', 75, 1) + isbroken = 1 + density = 0 + icon_state = "pylon-broken" + set_light(0) + /obj/structure/cult/pylon/proc/attackpylon(mob/user as mob, var/damage) if(!isbroken) if(prob(1+ damage * 5)) diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm index f0aa03253f7..04d8e853633 100644 --- a/code/game/gamemodes/gameticker.dm +++ b/code/game/gamemodes/gameticker.dm @@ -126,7 +126,7 @@ var/global/datum/controller/gameticker/ticker create_characters() //Create player characters and transfer them. collect_minds() equip_characters() - data_core.manifest() + //data_core.manifest() //VOREStation Removal callHook("roundstart") @@ -280,8 +280,13 @@ var/global/datum/controller/gameticker/ticker else if(!player.mind.assigned_role) continue else - if (player.create_character()) // VOREStation Edit + //VOREStation Edit Start + var/mob/living/carbon/human/new_char = player.create_character() + if(new_char) qdel(player) + if(istype(new_char) && !(new_char.mind.assigned_role=="Cyborg")) + data_core.manifest_inject(new_char) + //VOREStation Edit End proc/collect_minds() @@ -299,7 +304,7 @@ var/global/datum/controller/gameticker/ticker if(!player_is_antag(player.mind, only_offstation_roles = 1)) job_master.EquipRank(player, player.mind.assigned_role, 0) UpdateFactionList(player) - equip_custom_items(player) + //equip_custom_items(player) //VOREStation Removal //player.apply_traits() //VOREStation Removal if(captainless) for(var/mob/M in player_list) diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm index 4380331b50d..1ac4779414d 100644 --- a/code/game/gamemodes/meteor/meteors.dm +++ b/code/game/gamemodes/meteor/meteors.dm @@ -273,7 +273,7 @@ if(explode) explosion(src.loc, devastation_range = 0, heavy_impact_range = 0, light_impact_range = 4, flash_range = 6, adminlog = 0) new /obj/effect/decal/cleanable/greenglow(get_turf(src)) - radiation_repository.radiate(src, 50) + SSradiation.radiate(src, 50) // This meteor fries toasters. /obj/effect/meteor/emp diff --git a/code/game/jobs/job/assistant.dm b/code/game/jobs/job/assistant.dm index 06c22a4c8bc..d20e3925992 100644 --- a/code/game/jobs/job/assistant.dm +++ b/code/game/jobs/job/assistant.dm @@ -1,54 +1,26 @@ -//VOREStation Edit - Basically this whole file -/datum/job/intern - title = "Intern" - flag = INTERN - department = "Civilian" - department_flag = ENGSEC // VOREStation Edit - Ran out of bits - faction = "Station" - total_positions = -1 - spawn_positions = -1 - supervisors = "the staff from the departmen you're interning in" - selection_color = "#555555" - economic_modifier = 2 - access = list() //See /datum/job/assistant/get_access() - minimal_access = list() //See /datum/job/assistant/get_access() - outfit_type = /decl/hierarchy/outfit/job/assistant/intern - alt_titles = list("Apprentice Engineer","Medical Intern","Lab Assistant","Security Cadet","Jr. Cargo Tech", "Jr. Explorer") //VOREStation Edit - timeoff_factor = 0 //VOREStation Edit - Interns, noh - -//VOREStation Add -/datum/job/intern/New() - ..() - if(config) - total_positions = config.limit_interns - spawn_positions = config.limit_interns -//VOREStation Add End - -// VOREStation Add /datum/job/assistant - title = USELESS_JOB + title = "Assistant" flag = ASSISTANT department = "Civilian" department_flag = CIVILIAN faction = "Station" total_positions = -1 spawn_positions = -1 - supervisors = "nobody! You don't work here" + supervisors = "absolutely everyone" selection_color = "#515151" economic_modifier = 1 - access = list() - minimal_access = list() + access = list() //See /datum/job/assistant/get_access() + minimal_access = list() //See /datum/job/assistant/get_access() outfit_type = /decl/hierarchy/outfit/job/assistant - timeoff_factor = 0 -/datum/job/assistant/New() - ..() - if(config) - total_positions = config.limit_visitors - spawn_positions = config.limit_visitors +/* alt_titles = list( + "Technical Assistant", + "Medical Intern", + "Research Assistant", + "Visitor" = /decl/hierarchy/outfit/job/assistant/visitor + ) */ //VOREStation Removal: no alt-titles for visitors /datum/job/assistant/get_access() if(config.assistant_maint) return list(access_maint_tunnels) else return list() -//VOREStation Add End diff --git a/code/game/jobs/job/assistant_vr.dm b/code/game/jobs/job/assistant_vr.dm new file mode 100644 index 00000000000..212ca5f847f --- /dev/null +++ b/code/game/jobs/job/assistant_vr.dm @@ -0,0 +1,42 @@ +/datum/job/intern + title = "Intern" + flag = INTERN + department = "Civilian" + department_flag = ENGSEC // Ran out of bits + faction = "Station" + total_positions = -1 + spawn_positions = -1 + supervisors = "the staff from the department you're interning in" + selection_color = "#555555" + economic_modifier = 2 + access = list() //See /datum/job/intern/get_access() + minimal_access = list() //See /datum/job/intern/get_access() + outfit_type = /decl/hierarchy/outfit/job/assistant/intern + alt_titles = list("Apprentice Engineer","Medical Intern","Lab Assistant","Security Cadet","Jr. Cargo Tech", "Jr. Explorer", "Server" = /decl/hierarchy/outfit/job/service/server) + timeoff_factor = 0 // Interns, noh + +/datum/job/intern/New() + ..() + if(config) + total_positions = config.limit_interns + spawn_positions = config.limit_interns + +/datum/job/intern/get_access() + if(config.assistant_maint) + return list(access_maint_tunnels) + else + return list() + +/datum/job/assistant // Visitor + title = USELESS_JOB + supervisors = "nobody! You don't work here" + timeoff_factor = 0 + +/datum/job/assistant/New() + ..() + if(config) + total_positions = config.limit_visitors + spawn_positions = config.limit_visitors + +/datum/job/assistant/get_access() + return list() diff --git a/code/game/jobs/job/captain.dm b/code/game/jobs/job/captain.dm index 94a32c3841b..f1e0a1b8b2a 100644 --- a/code/game/jobs/job/captain.dm +++ b/code/game/jobs/job/captain.dm @@ -31,7 +31,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) H.implant_loyalty(src) */ /datum/job/captain/get_access() - return get_all_station_access() + return get_all_station_access().Copy() /datum/job/hop title = "Head of Personnel" @@ -60,13 +60,13 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue, access_crematorium, access_kitchen, access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_hydroponics, access_lawyer, access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station, - access_hop, access_RC_announce, access_keycard_auth) //, access_gateway) //VOREStation Edit + access_hop, access_RC_announce, access_keycard_auth, access_gateway) minimal_access = list(access_security, access_sec_doors, access_brig, access_forensics_lockers, access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads, access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue, access_crematorium, access_kitchen, access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_hydroponics, access_lawyer, access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station, - access_hop, access_RC_announce, access_keycard_auth) //, access_gateway) //VOREStation Edit + access_hop, access_RC_announce, access_keycard_auth, access_gateway) /datum/job/secretary title = "Command Secretary" diff --git a/code/game/jobs/job/captain_vr.dm b/code/game/jobs/job/captain_vr.dm new file mode 100644 index 00000000000..b6c38cae15e --- /dev/null +++ b/code/game/jobs/job/captain_vr.dm @@ -0,0 +1,23 @@ +/datum/job/captain + disallow_jobhop = TRUE + +/datum/job/hop + + disallow_jobhop = TRUE + alt_titles = list("Deputy Director", "Crew Resources Officer") + + access = list(access_security, access_sec_doors, access_brig, access_forensics_lockers, + access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads, + access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue, + access_crematorium, access_kitchen, access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_hydroponics, access_lawyer, + access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station, + access_hop, access_RC_announce, access_keycard_auth) + minimal_access = list(access_security, access_sec_doors, access_brig, access_forensics_lockers, + access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads, + access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue, + access_crematorium, access_kitchen, access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_hydroponics, access_lawyer, + access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station, + access_hop, access_RC_announce, access_keycard_auth) + +/datum/job/secretary + disallow_jobhop = TRUE \ No newline at end of file diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm index 1b59d5a2a0f..d31a551726c 100644 --- a/code/game/jobs/job/civilian.dm +++ b/code/game/jobs/job/civilian.dm @@ -132,8 +132,8 @@ department = "Civilian" department_flag = CIVILIAN faction = "Station" - total_positions = 2 // VOREStation Edit. Original number is 1. - spawn_positions = 2 // VOREStation Edit. Original number is 1. + total_positions = 1 + spawn_positions = 1 supervisors = "the head of personnel" selection_color = "#515151" idtype = /obj/item/weapon/card/id/civilian/librarian diff --git a/code/game/jobs/job/civilian_vr.dm b/code/game/jobs/job/civilian_vr.dm new file mode 100644 index 00000000000..9a13c8925fb --- /dev/null +++ b/code/game/jobs/job/civilian_vr.dm @@ -0,0 +1,28 @@ +/datum/job/chef + total_positions = 2 //IT TAKES A LOT TO MAKE A STEW + spawn_positions = 2 //A PINCH OF SALT AND LAUGHTER, TOO + +/datum/job/cargo_tech + total_positions = 3 + spawn_positions = 3 + +/datum/job/mining + total_positions = 4 + spawn_positions = 4 + +/datum/job/janitor //Lots of janitor substations on station. + total_positions = 3 + spawn_positions = 3 + alt_titles = list("Custodian", "Sanitation Technician", "Maid") + +//TFF 5/9/19 - restore librarian job slot to 2 +/datum/job/librarian + total_positions = 2 + spawn_positions = 2 + alt_titles = list("Journalist", "Historian", "Writer") + +/datum/job/lawyer + disallow_jobhop = TRUE + + + diff --git a/code/game/jobs/job/engineering_vr.dm b/code/game/jobs/job/engineering_vr.dm new file mode 100644 index 00000000000..da4b94de38d --- /dev/null +++ b/code/game/jobs/job/engineering_vr.dm @@ -0,0 +1,5 @@ +/datum/job/chief_engineer + disallow_jobhop = TRUE + +/datum/job/atmos + spawn_positions = 3 \ No newline at end of file diff --git a/code/game/jobs/job/medical_vr.dm b/code/game/jobs/job/medical_vr.dm new file mode 100644 index 00000000000..bd541fb00a7 --- /dev/null +++ b/code/game/jobs/job/medical_vr.dm @@ -0,0 +1,5 @@ +/datum/job/cmo + disallow_jobhop = TRUE + +/datum/job/doctor + spawn_positions = 5 \ No newline at end of file diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm index 3a2c213884f..c65f3413b6b 100644 --- a/code/game/jobs/job/science.dm +++ b/code/game/jobs/job/science.dm @@ -15,11 +15,11 @@ access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue, access_tox_storage, access_teleporter, access_sec_doors, access_research, access_robotics, access_xenobiology, access_ai_upload, access_tech_storage, - access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_eva, access_network) //VOREStation Edit + access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_network) minimal_access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue, access_tox_storage, access_teleporter, access_sec_doors, access_research, access_robotics, access_xenobiology, access_ai_upload, access_tech_storage, - access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_eva, access_network) //VOREStation Edit + access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_network) alt_titles = list("Research Supervisor") minimum_character_age = 25 diff --git a/code/game/jobs/job/science_vr.dm b/code/game/jobs/job/science_vr.dm new file mode 100644 index 00000000000..408101842d2 --- /dev/null +++ b/code/game/jobs/job/science_vr.dm @@ -0,0 +1,14 @@ +/datum/job/rd + disallow_jobhop = TRUE + + access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue, + access_tox_storage, access_teleporter, access_sec_doors, + access_research, access_robotics, access_xenobiology, access_ai_upload, access_tech_storage, + access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_eva, access_network) + minimal_access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue, + access_tox_storage, access_teleporter, access_sec_doors, + access_research, access_robotics, access_xenobiology, access_ai_upload, access_tech_storage, + access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_eva, access_network) + +/datum/job/scientist + alt_titles = list("Xenoarcheologist", "Anomalist", "Phoron Researcher", "Circuit Designer") \ No newline at end of file diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm index 0316f824c80..6b753f519c0 100644 --- a/code/game/jobs/job/security.dm +++ b/code/game/jobs/job/security.dm @@ -14,12 +14,12 @@ economic_modifier = 10 access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers, - access_research, access_engine, access_mining, access_construction, access_mailsorting, - access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks)//VOREStation Edit + access_research, access_engine, access_mining, access_medical, access_construction, access_mailsorting, + access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks) minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers, - access_research, access_engine, access_mining, access_construction, access_mailsorting, - access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks)//VOREStation Edit + access_research, access_engine, access_mining, access_medical, access_construction, access_mailsorting, + access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks) minimum_character_age = 25 minimal_player_age = 14 diff --git a/code/game/jobs/job/security_vr.dm b/code/game/jobs/job/security_vr.dm new file mode 100644 index 00000000000..8d53dc4a1d5 --- /dev/null +++ b/code/game/jobs/job/security_vr.dm @@ -0,0 +1,11 @@ +/datum/job/hos + disallow_jobhop = TRUE + + access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, + access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers, + access_research, access_engine, access_mining, access_construction, access_mailsorting, + access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks) + minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, + access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers, + access_research, access_engine, access_mining, access_construction, access_mailsorting, + access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks) \ No newline at end of file diff --git a/code/game/jobs/job/silicon_vr.dm b/code/game/jobs/job/silicon_vr.dm new file mode 100644 index 00000000000..44cb17ec720 --- /dev/null +++ b/code/game/jobs/job/silicon_vr.dm @@ -0,0 +1,3 @@ +/datum/job/cyborg + total_positions = 4 //Along with one able to spawn later in the round. + spawn_positions = 3 //Let's have 3 able to spawn in roundstart \ No newline at end of file diff --git a/code/game/jobs/job/special.dm b/code/game/jobs/job/special_vr.dm similarity index 99% rename from code/game/jobs/job/special.dm rename to code/game/jobs/job/special_vr.dm index 7d1ccead195..fbed7452404 100644 --- a/code/game/jobs/job/special.dm +++ b/code/game/jobs/job/special_vr.dm @@ -37,8 +37,7 @@ return 1 get_access() - var/access = get_all_accesses() - return access + return get_all_accesses().Copy() /*/datum/job/centcom_visitor //For Pleasure // You mean for admin abuse... -Ace title = "CentCom Visitor" diff --git a/code/game/jobs/job/z_all_jobs_vr.dm b/code/game/jobs/job/z_all_jobs_vr.dm deleted file mode 100644 index 0e740c70922..00000000000 --- a/code/game/jobs/job/z_all_jobs_vr.dm +++ /dev/null @@ -1,77 +0,0 @@ -//Contains all modified jobs for easy access and editing. - -/datum/job/captain - disallow_jobhop = TRUE - -/datum/job/hop - disallow_jobhop = TRUE - alt_titles = list("Deputy Director", "Crew Resources Officer") - -/datum/job/hos - disallow_jobhop = TRUE - -/datum/job/chief_engineer - disallow_jobhop = TRUE - -/datum/job/cmo - disallow_jobhop = TRUE - -/datum/job/rd - disallow_jobhop = TRUE - -/datum/job/secretary - disallow_jobhop = TRUE - -/datum/job/lawyer - disallow_jobhop = TRUE - -/datum/job/doctor - total_positions = 5 - spawn_positions = 5 - -/datum/job/janitor //Lots of janitor substations on station. - total_positions = 3 - spawn_positions = 3 - alt_titles = list("Custodian", "Sanitation Technician", "Maid") - -/datum/job/librarian - alt_titles = list("Journalist", "Historian", "Writer") - -/datum/job/officer - total_positions = 4 - spawn_positions = 4 - -/datum/job/cargo_tech - total_positions = 3 - spawn_positions = 3 - -/datum/job/psychiatrist - total_positions = 1 - spawn_positions = 1 - -/datum/job/mining - total_positions = 4 - spawn_positions = 4 - -/datum/job/cyborg - total_positions = 4 //Along with one able to spawn later in the round. - spawn_positions = 3 //Let's have 3 able to spawn in roundstart - -/datum/job/bartender - total_positions = 2 - spawn_positions = 2 - -/datum/job/chef - total_positions = 2 //IT TAKES A LOT TO MAKE A STEW - spawn_positions = 2 //A PINCH OF SALT AND LAUGHTER, TOO - -/datum/job/engineer - total_positions = 5 - spawn_positions = 5 - -/datum/job/atmos - total_positions = 3 - spawn_positions = 3 - -/datum/job/scientist - alt_titles = list("Xenoarcheologist", "Anomalist", "Phoron Researcher", "Circuit Designer") diff --git a/code/game/machinery/OpTable.dm b/code/game/machinery/OpTable.dm index f7a454a7de5..889e11c4e4c 100644 --- a/code/game/machinery/OpTable.dm +++ b/code/game/machinery/OpTable.dm @@ -80,7 +80,7 @@ if(C == user) user.visible_message("[user] climbs on \the [src].","You climb on \the [src].") else - visible_message("\The [C] has been laid on \the [src] by [user].", 3) + visible_message("\The [C] has been laid on \the [src] by [user].") if(C.client) C.client.perspective = EYE_PERSPECTIVE C.client.eye = src diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index b259fe1dedc..b73b8b8415c 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -26,11 +26,12 @@ for(dir in list(NORTH, EAST, SOUTH, WEST)) // Loop through every direction sleepernew = locate(/obj/machinery/sleeper, get_step(src, dir)) // Try to find a scanner in that direction if(sleepernew) + // VOREStation Edit Start sleeper = sleepernew sleepernew.console = src - set_dir(get_dir(src, sleepernew)) - return - return + break + // VOREStation Edit End + /obj/machinery/sleep_console/attack_ai(var/mob/user) return attack_hand(user) @@ -45,7 +46,7 @@ to_chat(user, "Sleeper not found!") return - if(sleeper.panel_open) + if(panel_open) to_chat(user, "Close the maintenance panel first.") return @@ -108,6 +109,7 @@ else data["beaker"] = -1 data["filtering"] = S.filtering + data["pump"] = S.pumping var/stasis_level_name = "Error!" for(var/N in S.stasis_choices) @@ -142,6 +144,9 @@ if(href_list["sleeper_filter"]) if(S.filtering != text2num(href_list["sleeper_filter"])) S.toggle_filter() + if(href_list["pump"]) + if(S.pumping != text2num(href_list["pump"])) + S.toggle_pump() if(href_list["chemical"] && href_list["amount"]) if(S.occupant && S.occupant.stat != DEAD) if(href_list["chemical"] in S.available_chemicals) // Your hacks are bad and you should feel bad @@ -166,6 +171,7 @@ var/list/base_chemicals = list("inaprovaline" = "Inaprovaline", "paracetamol" = "Paracetamol", "anti_toxin" = "Dylovene", "dexalin" = "Dexalin") var/obj/item/weapon/reagent_containers/glass/beaker = null var/filtering = 0 + var/pumping = 0 var/obj/machinery/sleep_console/console var/stasis_level = 0 //Every 'this' life ticks are applied to the mob (when life_ticks%stasis_level == 1) var/stasis_choices = list("Complete (1%)" = 100, "Deep (10%)" = 10, "Moderate (20%)" = 5, "Light (50%)" = 2, "None (100%)" = 0) @@ -263,6 +269,13 @@ else toggle_filter() + if(pumping > 0) + if(beaker) + if(beaker.reagents.total_volume < beaker.reagents.maximum_volume) + for(var/datum/reagent/x in occupant.ingested.reagent_list) + occupant.ingested.trans_to_obj(beaker, 3) + else + toggle_pump() /obj/machinery/sleeper/update_icon() icon_state = "sleeper_[occupant ? "1" : "0"]" @@ -301,14 +314,12 @@ return if(UNCONSCIOUS) to_chat(usr, "You struggle through the haze to hit the eject button. This will take a couple of minutes...") - sleep(2 MINUTES) - if(!src || !usr || !occupant || (occupant != usr)) //Check if someone's released/replaced/bombed him already - return - go_out() + if(do_after(usr, 2 MINUTES, src)) + go_out() if(CONSCIOUS) go_out() else - if(usr.stat != 0) + if(usr.stat != CONSCIOUS) return go_out() add_fingerprint(usr) @@ -326,6 +337,9 @@ if(filtering) toggle_filter() + if(pumping) + toggle_pump() + if(stat & (BROKEN|NOPOWER)) ..(severity) return @@ -340,6 +354,12 @@ return filtering = !filtering +/obj/machinery/sleeper/proc/toggle_pump() + if(!occupant || !beaker) + pumping = 0 + return + pumping = !pumping + /obj/machinery/sleeper/proc/go_in(var/mob/M, var/mob/user) if(!M) return @@ -370,7 +390,8 @@ update_icon() /obj/machinery/sleeper/proc/go_out() - if(!occupant) + if(!occupant || occupant.loc != src) + occupant = null // JUST IN CASE return if(occupant.client) occupant.client.eye = occupant.client.mob @@ -387,6 +408,7 @@ update_use_power(1) update_icon() toggle_filter() + toggle_pump() /obj/machinery/sleeper/proc/remove_beaker() if(beaker) diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index ed238841038..484678c942b 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -448,4 +448,8 @@ update_flag ..() src.air_contents.adjust_gas("phoron", MolesForPressure()) src.update_icon() - return 1 \ No newline at end of file + return 1 + +/obj/machinery/portable_atmospherics/canister/take_damage(var/damage) + src.health -= damage + healthcheck() \ No newline at end of file diff --git a/code/game/machinery/atmoalter/clamp.dm b/code/game/machinery/atmoalter/clamp.dm new file mode 100644 index 00000000000..318145c2292 --- /dev/null +++ b/code/game/machinery/atmoalter/clamp.dm @@ -0,0 +1,154 @@ +//Good luck. --BlueNexus + +//Static version of the clamp +/obj/machinery/clamp + name = "stasis clamp" + desc = "A magnetic clamp which can halt the flow of gas in a pipe, via a localised stasis field." + description_info = "Click-dragging this to yourself while adjacent will attempt to remove it from the pipe." + icon = 'icons/atmos/clamp.dmi' + icon_state = "pclamp0" + anchored = 1.0 + var/obj/machinery/atmospherics/pipe/simple/target = null + var/open = 1 + + var/datum/pipe_network/network_node1 + var/datum/pipe_network/network_node2 + +/obj/machinery/clamp/New(loc, var/obj/machinery/atmospherics/pipe/simple/to_attach = null) + ..() + if(istype(to_attach)) + target = to_attach + else + target = locate(/obj/machinery/atmospherics/pipe/simple) in loc + if(target) + update_networks() + dir = target.dir + return 1 + +/obj/machinery/clamp/proc/update_networks() + if(!target) + return + else + var/obj/machinery/atmospherics/pipe/node1 = target.node1 + var/obj/machinery/atmospherics/pipe/node2 = target.node2 + if(istype(node1)) + var/datum/pipeline/P1 = node1.parent + network_node1 = P1.network + if(istype(node2)) + var/datum/pipeline/P2 = node2.parent + network_node2 = P2.network + +/obj/machinery/clamp/attack_hand(var/mob/user) + if(!target) + return FALSE + if(!open) + open() + else + close() + to_chat(user, "You turn [open ? "off" : "on"] \the [src]") + return TRUE + +/obj/machinery/clamp/Destroy() + if(!open) + spawn(-1) open() + . = ..() + +/obj/machinery/clamp/proc/open() + if(open || !target) + return 0 + + target.build_network() + + + if(network_node1&&network_node2) + network_node1.merge(network_node2) + network_node2 = network_node1 + + if(network_node1) + network_node1.update = 1 + else if(network_node2) + network_node2.update = 1 + + update_networks() + + open = 1 + icon_state = "pclamp0" + target.in_stasis = 0 + return 1 + +/obj/machinery/clamp/proc/close() + if(!open) + return 0 + + qdel(target.parent) + + if(network_node1) + qdel(network_node1) + if(network_node2) + qdel(network_node2) + + var/obj/machinery/atmospherics/pipe/node1 = null + var/obj/machinery/atmospherics/pipe/node2 = null + + if(target.node1) + target.node1.build_network() + node1 = target.node1 + if(target.node2) + target.node2.build_network() + node2 = target.node2 + if(istype(node1) && node1.parent) + var/datum/pipeline/P1 = node1.parent + P1.build_pipeline(node1) + qdel(P1) + if(istype(node2) && node2.parent) + var/datum/pipeline/P2 = node2.parent + P2.build_pipeline(node2) + qdel(P2) +// P1.build_network() +// P2.build_network() + + open = 0 + icon_state = "pclamp1" + target.in_stasis = 1 + + return 1 + +/obj/machinery/clamp/MouseDrop(obj/over_object as obj) + if(!usr) + return + + if(open && over_object == usr && Adjacent(usr)) + to_chat(usr, "You begin to remove \the [src]...") + if (do_after(usr, 30, src)) + to_chat(usr, "You have removed \the [src].") + var/obj/item/clamp/C = new/obj/item/clamp(src.loc) + C.forceMove(usr.loc) + if(ishuman(usr)) + usr.put_in_hands(C) + qdel(src) + return + else + to_chat(usr, "You can't remove \the [src] while it's active!") + +/obj/item/clamp + name = "stasis clamp" + desc = "A magnetic clamp which can halt the flow of gas in a pipe, via a localised stasis field." + icon = 'icons/atmos/clamp.dmi' + icon_state = "pclamp0" + origin_tech = list(TECH_ENGINEERING = 4, TECH_MAGNET = 4) + +/obj/item/clamp/afterattack(var/atom/A, mob/user as mob, proximity) + if(!proximity) + return + + if (istype(A, /obj/machinery/atmospherics/pipe/simple)) + to_chat(user, "You begin to attach \the [src] to \the [A]...") + var/C = locate(/obj/machinery/clamp) in get_turf(A) + if (do_after(user, 30, src) && !C) + if(!user.unEquip(src)) + return + to_chat(user, "You have attached \the [src] to \the [A].") + new/obj/machinery/clamp(A.loc, A) + qdel(src) + if(C) + to_chat(user, "\The [C] is already attached to the pipe at this location!") diff --git a/code/game/machinery/atmoalter/portable_atmospherics.dm b/code/game/machinery/atmoalter/portable_atmospherics.dm index 8778b4e5f3b..085c070f7d8 100644 --- a/code/game/machinery/atmoalter/portable_atmospherics.dm +++ b/code/game/machinery/atmoalter/portable_atmospherics.dm @@ -149,6 +149,8 @@ var/power_losses var/last_power_draw = 0 var/obj/item/weapon/cell/cell + var/use_cell = TRUE + var/removeable_cell = TRUE /obj/machinery/portable_atmospherics/powered/powered() if(use_power) //using area power @@ -158,7 +160,7 @@ return 0 /obj/machinery/portable_atmospherics/powered/attackby(obj/item/I, mob/user) - if(istype(I, /obj/item/weapon/cell)) + if(use_cell && istype(I, /obj/item/weapon/cell)) if(cell) to_chat(user, "There is already a power cell installed.") return @@ -173,7 +175,7 @@ power_change() return - if(I.is_screwdriver()) + if(I.is_screwdriver() && removeable_cell) if(!cell) to_chat(user, "There is no power cell installed.") return diff --git a/code/game/machinery/autolathe_vr.dm b/code/game/machinery/autolathe_vr.dm deleted file mode 100644 index 489c97f2f52..00000000000 --- a/code/game/machinery/autolathe_vr.dm +++ /dev/null @@ -1,17 +0,0 @@ -/datum/category_item/autolathe/arms/classic_smg_9mm - name = "SMG magazine (9mm)" - path = /obj/item/ammo_magazine/m9mml - hidden = 1 -/* De-coded? -/datum/category_item/autolathe/arms/classic_smg_9mmr - name = "SMG magazine (9mm rubber)" - path = /obj/item/ammo_magazine/m9mml/rubber - -/datum/category_item/autolathe/arms/classic_smg_9mmp - name = "SMG magazine (9mm practice)" - path = /obj/item/ammo_magazine/m9mml/practice - -/datum/category_item/autolathe/arms/classic_smg_9mmf - name = "SMG magazine (9mm flash)" - path = /obj/item/ammo_magazine/m9mml/flash -*/ \ No newline at end of file diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index b3d5af5f3ec..34fda2bb06f 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -113,7 +113,7 @@ triggerCameraAlarm() update_icon() update_coverage() - START_PROCESSING(SSobj, src) + START_PROCESSING(SSobj, src) /obj/machinery/camera/bullet_act(var/obj/item/projectile/P) take_damage(P.get_structure_damage()) @@ -283,7 +283,7 @@ icon_state = initial(icon_state) add_hiddenprint(user) -/obj/machinery/camera/proc/take_damage(var/force, var/message) +/obj/machinery/camera/take_damage(var/force, var/message) //prob(25) gives an average of 3-4 hits if (force >= toughness && (force > toughness*4 || prob(25))) destroy() diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm index bad819a985d..7c7f7043920 100644 --- a/code/game/machinery/cell_charger.dm +++ b/code/game/machinery/cell_charger.dm @@ -7,9 +7,19 @@ use_power = 1 idle_power_usage = 5 active_power_usage = 60000 //60 kW. (this the power drawn when charging) + var/efficiency = 60000 //will provide the modified power rate when upgraded power_channel = EQUIP var/obj/item/weapon/cell/charging = null var/chargelevel = -1 + circuit = /obj/item/weapon/circuitboard/cell_charger + +/obj/machinery/cell_charger/New() + component_parts = list() + component_parts += new /obj/item/weapon/stock_parts/capacitor(src) + component_parts += new /obj/item/stack/cable_coil(src, 5) + RefreshParts() + ..() + return /obj/machinery/cell_charger/update_icon() icon_state = "ccharger[charging ? 1 : 0]" @@ -32,9 +42,9 @@ if(!..(user, 5)) return - user << "There's [charging ? "a" : "no"] cell in the charger." + to_chat(user, "[charging ? "[charging]" : "Nothing"] is in [src].") if(charging) - user << "Current charge: [charging.charge]" + to_chat(user, "Current charge: [charging.charge] / [charging.maxcharge]") /obj/machinery/cell_charger/attackby(obj/item/weapon/W, mob/user) if(stat & BROKEN) @@ -42,56 +52,60 @@ if(istype(W, /obj/item/weapon/cell) && anchored) if(istype(W, /obj/item/weapon/cell/device)) - user << " The charger isn't fitted for that type of cell." + to_chat(user, "\The [src] isn't fitted for that type of cell.") return if(charging) - user << "There is already a cell in the charger." + to_chat(user, "There is already [charging] in [src].") return else var/area/a = loc.loc // Gets our locations location, like a dream within a dream if(!isarea(a)) return if(a.power_equip == 0) // There's no APC in this area, don't try to cheat power! - user << "The [name] blinks red as you try to insert the cell!" + to_chat(user, "\The [src] blinks red as you try to insert [W]!") return user.drop_item() W.loc = src charging = W - user.visible_message("[user] inserts a cell into the charger.", "You insert a cell into the charger.") + user.visible_message("[user] inserts [charging] into [src].", "You insert [charging] into [src].") chargelevel = -1 update_icon() else if(W.is_wrench()) if(charging) - user << "Remove the cell first!" + to_chat(user, "Remove [charging] first!") return anchored = !anchored - user << "You [anchored ? "attach" : "detach"] the cell charger [anchored ? "to" : "from"] the ground" + to_chat(user, "You [anchored ? "attach" : "detach"] [src] [anchored ? "to" : "from"] the ground") playsound(src, W.usesound, 75, 1) + else if(default_deconstruction_screwdriver(user, W)) + return + else if(default_deconstruction_crowbar(user, W)) + return + else if(default_part_replacement(user, W)) + return /obj/machinery/cell_charger/attack_hand(mob/user) + add_fingerprint(user) + if(charging) - usr.put_in_hands(charging) - charging.add_fingerprint(user) + user.put_in_hands(charging) charging.update_icon() + user.visible_message("[user] removes [charging] from [src].", "You remove [charging] from [src].") charging = null - user.visible_message("[user] removes the cell from the charger.", "You remove the cell from the charger.") chargelevel = -1 update_icon() /obj/machinery/cell_charger/attack_ai(mob/user) if(istype(user, /mob/living/silicon/robot) && Adjacent(user)) // Borgs can remove the cell if they are near enough - if(!charging) - return - - charging.loc = src.loc - charging.update_icon() - charging = null - update_icon() - user.visible_message("[user] removes the cell from the charger.", "You remove the cell from the charger.") - + if(charging) + user.visible_message("[user] removes [charging] from [src].", "You remove [charging] from [src].") + charging.loc = src.loc + charging.update_icon() + charging = null + update_icon() /obj/machinery/cell_charger/emp_act(severity) if(stat & (BROKEN|NOPOWER)) @@ -108,9 +122,15 @@ return if(charging && !charging.fully_charged()) - charging.give(active_power_usage*CELLRATE) + charging.give(efficiency*CELLRATE) update_use_power(2) update_icon() else update_use_power(1) + +/obj/machinery/cell_charger/RefreshParts() + var/E = 0 + for(var/obj/item/weapon/stock_parts/capacitor/C in component_parts) + E += C.rating + efficiency = active_power_usage * (1+ (E - 1)*0.5) \ No newline at end of file diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm index 9b1dd198d92..eb78d41e263 100644 --- a/code/game/machinery/computer/card.dm +++ b/code/game/machinery/computer/card.dm @@ -279,7 +279,7 @@ if ("terminate") if (is_authenticated()) - modify.assignment = "Terminated" + modify.assignment = "Dismissed" //VOREStation Edit: setting adjustment modify.access = list() callHook("terminate_employee", list(modify)) diff --git a/code/game/machinery/computer/shutoff_monitor.dm b/code/game/machinery/computer/shutoff_monitor.dm new file mode 100644 index 00000000000..4dd79376c92 --- /dev/null +++ b/code/game/machinery/computer/shutoff_monitor.dm @@ -0,0 +1,42 @@ +/obj/machinery/computer/shutoff_monitor + name = "automated shutoff valve monitor" + desc = "Console used to remotely monitor shutoff valves on the station." + icon_keyboard = "power_key" + icon_screen = "power:0" + light_color = "#a97faa" + circuit = /obj/item/weapon/circuitboard/shutoff_monitor + +/obj/machinery/computer/shutoff_monitor/attack_hand(var/mob/user) + ..() + ui_interact(user) + +/obj/machinery/computer/shutoff_monitor/attack_robot(var/mob/user) // Borgs and AI will want to see this too + ..() + ui_interact(user) + +/obj/machinery/computer/shutoff_monitor/attack_ai(var/mob/user) + ui_interact(user) + +/obj/machinery/computer/shutoff_monitor/ui_interact(mob/user, ui_key = "shutoff_monitor", var/datum/nanoui/ui = null, var/force_open = 1, var/key_state = null) + var/data[0] + data["valves"] = list() + for(var/obj/machinery/atmospherics/valve/shutoff/S in GLOB.shutoff_valves) + data["valves"][++data["valves"].len] = list("name" = S.name, "enable" = S.close_on_leaks, "open" = S.open, "x" = S.x, "y" = S.y, "z" = S.z) + + // update the ui if it exists, returns null if no ui is passed/found + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) + if(!ui) + // the ui does not exist, so we'll create a new() one + // for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm + ui = new(user, src, ui_key, "shutoff_monitor.tmpl", "Automated Shutoff Valve Monitor", 625, 700, state = key_state) + // when the ui is first opened this is the data it will use + ui.set_initial_data(data) + // open the new ui window + ui.open() + // auto update every 20 Master Controller tick + ui.set_auto_update(20) // Longer term to reduce the rate of data collection and processing + +/obj/machinery/computer/shutoff_monitor/update_icon() + ..() + if(!(stat & (NOPOWER|BROKEN))) + overlays += image('icons/obj/computer.dmi', "ai-fixer-empty", overlay_layer) diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index 765ced8a398..42725bbe285 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -2,52 +2,6 @@ CONTAINS: Deployable items Barricades - -for reference: - access_security = 1 - access_brig = 2 - access_armory = 3 - access_forensics_lockers= 4 - access_medical = 5 - access_morgue = 6 - access_tox = 7 - access_tox_storage = 8 - access_genetics = 9 - access_engine = 10 - access_engine_equip= 11 - access_maint_tunnels = 12 - access_external_airlocks = 13 - access_emergency_storage = 14 - access_change_ids = 15 - access_ai_upload = 16 - access_teleporter = 17 - access_eva = 18 - access_heads = 19 - access_captain = 20 - access_all_personal_lockers = 21 - access_chapel_office = 22 - access_tech_storage = 23 - access_atmospherics = 24 - access_bar = 25 - access_janitor = 26 - access_crematorium = 27 - access_kitchen = 28 - access_robotics = 29 - access_rd = 30 - access_cargo = 31 - access_construction = 32 - access_chemistry = 33 - access_cargo_bot = 34 - access_hydroponics = 35 - access_manufacturing = 36 - access_library = 37 - access_lawyer = 38 - access_virology = 39 - access_cmo = 40 - access_qm = 41 - access_court = 42 - access_clown = 43 - access_mime = 44 */ //Barricades! @@ -80,6 +34,7 @@ for reference: return material /obj/structure/barricade/attackby(obj/item/W as obj, mob/user as mob) + user.setClickCooldown(user.get_attack_speed(W)) if(istype(W, /obj/item/stack)) var/obj/item/stack/D = W if(D.get_material_name() != material.name) @@ -96,37 +51,54 @@ for reference: return return else - user.setClickCooldown(user.get_attack_speed(W)) switch(W.damtype) if("fire") health -= W.force * 1 if("brute") health -= W.force * 0.75 - else - if(health <= 0) - visible_message("The barricade is smashed apart!") - dismantle() - qdel(src) - return + if(material == (get_material_by_name(MAT_WOOD) || get_material_by_name(MAT_SIFWOOD))) + playsound(loc, 'sound/effects/woodcutting.ogg', 100, 1) + else + playsound(src, 'sound/weapons/smash.ogg', 50, 1) + CheckHealth() ..() +/obj/structure/barricade/proc/CheckHealth() + if(health <= 0) + dismantle() + return + +/obj/structure/barricade/take_damage(var/damage) + health -= damage + CheckHealth() + return + +/obj/structure/barricade/attack_generic(var/mob/user, var/damage, var/attack_verb) + visible_message("[user] [attack_verb] the [src]!") + if(material == get_material_by_name("resin")) + playsound(loc, 'sound/effects/attackblob.ogg', 100, 1) + else if(material == (get_material_by_name(MAT_WOOD) || get_material_by_name(MAT_SIFWOOD))) + playsound(loc, 'sound/effects/woodcutting.ogg', 100, 1) + else + playsound(src, 'sound/weapons/smash.ogg', 50, 1) + user.do_attack_animation(src) + health -= damage + CheckHealth() + return + /obj/structure/barricade/proc/dismantle() material.place_dismantled_product(get_turf(src)) + visible_message("\The [src] falls apart!") qdel(src) return /obj/structure/barricade/ex_act(severity) switch(severity) if(1.0) - visible_message("\The [src] is blown apart!") - qdel(src) - return + dismantle() if(2.0) health -= 25 - if(health <= 0) - visible_message("\The [src] is blown apart!") - dismantle() - return + CheckHealth() /obj/structure/barricade/CanPass(atom/movable/mover, turf/target)//So bullets will fly over and stuff. if(istype(mover) && mover.checkpass(PASSTABLE)) @@ -158,6 +130,7 @@ for reference: icon_state = "barrier[locked]" /obj/machinery/deployable/barrier/attackby(obj/item/weapon/W as obj, mob/user as mob) + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) if(istype(W, /obj/item/weapon/card/id/)) if(allowed(user)) if (emagged < 2.0) @@ -196,11 +169,28 @@ for reference: health -= W.force * 0.75 if("brute") health -= W.force * 0.5 - else - if(health <= 0) - explode() + playsound(src, 'sound/weapons/smash.ogg', 50, 1) + CheckHealth() ..() +/obj/machinery/deployable/barrier/proc/CheckHealth() + if(health <= 0) + explode() + return + +/obj/machinery/deployable/barrier/attack_generic(var/mob/user, var/damage, var/attack_verb) + visible_message("[user] [attack_verb] the [src]!") + playsound(src, 'sound/weapons/smash.ogg', 50, 1) + user.do_attack_animation(src) + health -= damage + CheckHealth() + return + +/obj/machinery/deployable/barrier/take_damage(var/damage) + health -= damage + CheckHealth() + return + /obj/machinery/deployable/barrier/ex_act(severity) switch(severity) if(1.0) @@ -208,8 +198,7 @@ for reference: return if(2.0) health -= 25 - if(health <= 0) - explode() + CheckHealth() return /obj/machinery/deployable/barrier/emp_act(severity) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index c31c8f650b9..480effcf98e 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -387,7 +387,7 @@ /obj/machinery/door/airlock/uranium/process() if(world.time > last_event+20) if(prob(50)) - radiation_repository.radiate(src, rad_power) + SSradiation.radiate(src, rad_power) last_event = world.time ..() diff --git a/code/game/machinery/doors/blast_door.dm b/code/game/machinery/doors/blast_door.dm index ea881323c8c..bf201989fea 100644 --- a/code/game/machinery/doors/blast_door.dm +++ b/code/game/machinery/doors/blast_door.dm @@ -56,7 +56,7 @@ icon_state = icon_state_closed else icon_state = icon_state_open - radiation_repository.resistance_cache.Remove(get_turf(src)) + SSradiation.resistance_cache.Remove(get_turf(src)) return // Has to be in here, comment at the top is older than the emag_act code on doors proper diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm index 0935dfa7248..7e25bb2df97 100644 --- a/code/game/machinery/doors/brigdoors.dm +++ b/code/game/machinery/doors/brigdoors.dm @@ -351,6 +351,12 @@ name = "Cell 6" id = "Cell 6" + +/obj/machinery/door_timer/tactical_pet_storage //Vorestation Addition + name = "Tactical Pet Storage" + id = "tactical_pet_storage" + desc = "Opens and Closes on a timer. This one seals away a tactical boost in morale." + #undef FONT_SIZE #undef FONT_COLOR #undef FONT_STYLE diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index d276efef354..43fb8340ef3 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -308,7 +308,7 @@ operating = -1 return 1 -/obj/machinery/door/proc/take_damage(var/damage) +/obj/machinery/door/take_damage(var/damage) var/initialhealth = src.health src.health = max(0, src.health - damage) if(src.health <= 0 && initialhealth > 0) @@ -382,7 +382,7 @@ icon_state = "door1" else icon_state = "door0" - radiation_repository.resistance_cache.Remove(get_turf(src)) + SSradiation.resistance_cache.Remove(get_turf(src)) return diff --git a/code/game/machinery/frame.dm b/code/game/machinery/frame.dm index c54734aec0d..0baa68cf223 100644 --- a/code/game/machinery/frame.dm +++ b/code/game/machinery/frame.dm @@ -90,12 +90,24 @@ circuit = /obj/item/weapon/circuitboard/recharger frame_size = 3 +/datum/frame/frame_types/cell_charger + name = "Heavy-Duty Cell Charger" + frame_class = FRAME_CLASS_MACHINE + circuit = /obj/item/weapon/circuitboard/cell_charger + frame_size = 3 + /datum/frame/frame_types/grinder name = "Grinder" frame_class = FRAME_CLASS_MACHINE circuit = /obj/item/weapon/circuitboard/grinder frame_size = 3 +/datum/frame/frame_types/reagent_distillery + name = "Distillery" + frame_class = FRAME_CLASS_MACHINE + circuit = /obj/item/weapon/circuitboard/distiller + frame_size = 4 + /datum/frame/frame_types/display name = "Display" frame_class = FRAME_CLASS_DISPLAY diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index 4251a0e6067..5d2ed9a1743 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -214,7 +214,6 @@ Class Procs: /obj/machinery/CanUseTopic(var/mob/user) if(!interact_offline && (stat & (NOPOWER | BROKEN))) return STATUS_CLOSE - return ..() /obj/machinery/CouldUseTopic(var/mob/user) @@ -458,4 +457,4 @@ Class Procs: return /datum/proc/remove_visual(mob/M) - return \ No newline at end of file + return diff --git a/code/game/machinery/pipe/pipe_recipes.dm b/code/game/machinery/pipe/pipe_recipes.dm index f0ae4830552..a54cdd4eee7 100644 --- a/code/game/machinery/pipe/pipe_recipes.dm +++ b/code/game/machinery/pipe/pipe_recipes.dm @@ -27,6 +27,7 @@ var/global/list/atmos_pipe_recipes = null new /datum/pipe_recipe/pipe("Gas Pump", /obj/machinery/atmospherics/binary/pump), new /datum/pipe_recipe/pipe("Pressure Regulator", /obj/machinery/atmospherics/binary/passive_gate), new /datum/pipe_recipe/pipe("High Power Gas Pump",/obj/machinery/atmospherics/binary/pump/high_power), + //new /datum/pipe_recipe/pipe("Automatic Shutoff Valve",/obj/machinery/atmospherics/valve/shutoff), //VOREStation Removal: Without leaks, those are just regular valves, new /datum/pipe_recipe/pipe("Scrubber", /obj/machinery/atmospherics/unary/vent_scrubber), new /datum/pipe_recipe/meter("Meter"), new /datum/pipe_recipe/pipe("Gas Filter", /obj/machinery/atmospherics/trinary/atmos_filter), diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index 31a3a74d633..9c29365ae42 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -36,83 +36,75 @@ name = "turret" catalogue_data = list(/datum/category_item/catalogue/technology/turret) icon = 'icons/obj/turrets.dmi' - icon_state = "turret_cover" - anchored = 1 + icon_state = "turret_cover_normal" + anchored = TRUE - density = 0 - use_power = 1 //this turret uses and requires power + density = FALSE + use_power = TRUE //this turret uses and requires power idle_power_usage = 50 //when inactive, this turret takes up constant 50 Equipment power active_power_usage = 300 //when active, this turret takes up constant 300 Equipment power power_channel = EQUIP //drains power from the EQUIPMENT channel req_one_access = list(access_security, access_heads) - // icon_states for turrets. - // These are for the turret covers. - var/closed_state = "turret_cover" // For when it is closed. - var/raising_state = "popup" // When turret is opening. - var/opened_state = "open" // When fully opened. - var/lowering_state = "popdown" // When closing. - var/gun_active_state = "target_prism" // The actual gun's icon_state when active. - var/gun_disabled_state = "grey_target_prism" // Gun sprite when depowered/disabled. - var/gun_destroyed_state = "destroyed_target_prism" // Turret sprite for when the turret dies. - - var/raised = 0 //if the turret cover is "open" and the turret is raised - var/raising= 0 //if the turret is currently opening or closing its cover - var/health = 80 //the turret's health - var/maxhealth = 80 //turrets maximal health. - var/auto_repair = 0 //if 1 the turret slowly repairs itself. - var/locked = 1 //if the turret's behaviour control access is locked - var/controllock = 0 //if the turret responds to control panels + var/raised = FALSE //if the turret cover is "open" and the turret is raised + var/raising= FALSE //if the turret is currently opening or closing its cover + var/health = 80 //the turret's health + var/maxhealth = 80 //turrets maximal health. + var/auto_repair = FALSE //if 1 the turret slowly repairs itself. + var/locked = TRUE //if the turret's behaviour control access is locked + var/controllock = FALSE //if the turret responds to control panels var/installation = /obj/item/weapon/gun/energy/gun //the type of weapon installed - var/gun_charge = 0 //the charge of the gun inserted - var/projectile = null //holder for bullettype - var/eprojectile = null //holder for the shot when emagged - var/reqpower = 500 //holder for power needed - var/iconholder = null //holder for the icon_state. 1 for sprite based on icon_color, null for blue. - var/icon_color = "orange" // When iconholder is set to 1, the icon_state changes based on what is in this variable. - var/egun = null //holder to handle certain guns switching bullettypes + var/gun_charge = 0 //the charge of the gun inserted + var/projectile = null //holder for bullettype + var/lethal_projectile = null //holder for the shot when emagged + var/reqpower = 500 //holder for power needed + var/turret_type = "normal" + var/icon_color = "blue" + var/lethal_icon_color = "blue" - var/last_fired = 0 //1: if the turret is cooling down from a shot, 0: turret is ready to fire + var/last_fired = FALSE //TRUE: if the turret is cooling down from a shot, FALSE: turret is ready to fire var/shot_delay = 1.5 SECONDS //1.5 seconds between each shot - var/check_arrest = 1 //checks if the perp is set to arrest - var/check_records = 1 //checks if a security record exists at all - var/check_weapons = 0 //checks if it can shoot people that have a weapon they aren't authorized to have - var/check_access = 1 //if this is active, the turret shoots everything that does not meet the access requirements - var/check_anomalies = 1 //checks if it can shoot at unidentified lifeforms (ie xenos) - var/check_synth = 0 //if active, will shoot at anything not an AI or cyborg - var/check_all = 0 //If active, will fire on anything, including synthetics. - var/ailock = 0 // AI cannot use this - var/faction = null //if set, will not fire at people in the same faction for any reason. + var/check_arrest = TRUE //checks if the perp is set to arrest + var/check_records = TRUE //checks if a security record exists at all + var/check_weapons = FALSE //checks if it can shoot people that have a weapon they aren't authorized to have + var/check_access = TRUE //if this is active, the turret shoots everything that does not meet the access requirements + var/check_anomalies = TRUE //checks if it can shoot at unidentified lifeforms (ie xenos) + var/check_synth = FALSE //if active, will shoot at anything not an AI or cyborg + var/check_all = FALSE //If active, will fire on anything, including synthetics. + var/ailock = FALSE // AI cannot use this + var/check_down = FALSE //If active, will shoot to kill when lethals are also on + var/faction = null //if set, will not fire at people in the same faction for any reason. - var/attacked = 0 //if set to 1, the turret gets pissed off and shoots at people nearby (unless they have sec access!) + var/attacked = FALSE //if set to TRUE, the turret gets pissed off and shoots at people nearby (unless they have sec access!) - var/enabled = 1 //determines if the turret is on - var/lethal = 0 //whether in lethal or stun mode - var/disabled = 0 + var/enabled = TRUE //determines if the turret is on + var/lethal = FALSE //whether in lethal or stun mode + var/disabled = FALSE - var/shot_sound //what sound should play when the turret fires - var/eshot_sound //what sound should play when the emagged turret fires + var/shot_sound //what sound should play when the turret fires + var/lethal_shot_sound //what sound should play when the emagged turret fires var/datum/effect/effect/system/spark_spread/spark_system //the spark system, used for generating... sparks? - var/wrenching = 0 + var/wrenching = FALSE var/last_target //last target fired at, prevents turrets from erratically firing at all valid targets in range var/timeout = 10 // When a turret pops up, then finds nothing to shoot at, this number decrements until 0, when it pops down. var/can_salvage = TRUE // If false, salvaging doesn't give you anything. /obj/machinery/porta_turret/crescent req_one_access = list(access_cent_specops) - enabled = 0 - ailock = 1 - check_synth = 0 - check_access = 1 - check_arrest = 1 - check_records = 1 - check_weapons = 1 - check_anomalies = 1 - check_all = 0 + enabled = FALSE + ailock = TRUE + check_synth = FALSE + check_access = TRUE + check_arrest = TRUE + check_records = TRUE + check_weapons = TRUE + check_anomalies = TRUE + check_all = FALSE + check_down = TRUE /obj/machinery/porta_turret/can_catalogue(mob/user) // Dead turrets can't be scanned. if(stat & BROKEN) @@ -121,8 +113,8 @@ return ..() /obj/machinery/porta_turret/stationary - ailock = 1 - lethal = 1 + ailock = TRUE + lethal = TRUE installation = /obj/item/weapon/gun/energy/laser /obj/machinery/porta_turret/stationary/syndie // Generic turrets for POIs that need to not shoot their buddies. @@ -155,7 +147,7 @@ name = "interior anti-boarding turret" desc = "A very tough looking turret made by alien hands." catalogue_data = list(/datum/category_item/catalogue/anomalous/precursor_a/alien_turret) - icon_state = "alien_turret_cover" + icon_state = "turret_cover_alien" req_one_access = list(access_alien) installation = /obj/item/weapon/gun/energy/alien enabled = TRUE @@ -164,19 +156,12 @@ check_all = TRUE health = 250 // Similar to the AI turrets. maxhealth = 250 - - closed_state = "alien_turret_cover" - raising_state = "alien_popup" - opened_state = "alien_open" - lowering_state = "alien_popdown" - gun_active_state = "alien_gun" - gun_disabled_state = "alien_gun_disabled" - gun_destroyed_state = "alien_gun_destroyed" + turret_type = "alien" /obj/machinery/porta_turret/alien/destroyed // Turrets that are already dead, to act as a warning of what the rest of the submap contains. name = "broken interior anti-boarding turret" desc = "A very tough looking turret made by alien hands. This one looks destroyed, thankfully." - icon_state = "alien_gun_destroyed" + icon_state = "destroyed_target_prism_alien" stat = BROKEN can_salvage = FALSE // So you need to actually kill a turret to get the alien gun. @@ -184,18 +169,11 @@ name = "industrial turret" desc = "This variant appears to be much more rugged." req_one_access = list(access_heads) + icon_state = "turret_cover_industrial" installation = /obj/item/weapon/gun/energy/phasegun health = 200 maxhealth = 200 - - icon_state = "turret_cover_industrial" - closed_state = "turret_cover_industrial" - raising_state = "popup_industrial" - opened_state = "open_industrial" - lowering_state = "popdown_industrial" - gun_active_state = "target_prism_industrial" - gun_disabled_state = "grey_target_prism_industrial" - gun_destroyed_state = "destroyed_target_prism_industrial" + turret_type = "industrial" /obj/machinery/porta_turret/industrial/bullet_act(obj/item/projectile/Proj) var/damage = round(Proj.get_structure_damage() * 1.33) @@ -205,10 +183,10 @@ if(enabled) if(!attacked && !emagged) - attacked = 1 + attacked = TRUE spawn() sleep(60) - attacked = 0 + attacked = FALSE take_damage(damage) @@ -230,6 +208,98 @@ check_all = TRUE can_salvage = FALSE // So you can't just twoshot a turret and get a fancy gun +/obj/machinery/porta_turret/lasertag + name = "lasertag turret" + turret_type = "normal" + req_one_access = list() + installation = /obj/item/weapon/gun/energy/lasertag/omni + + locked = FALSE + enabled = FALSE + anchored = FALSE + //These two are used for lasertag + check_synth = FALSE + check_weapons = FALSE + //These vars aren't used + check_access = FALSE + check_arrest = FALSE + check_records = FALSE + check_anomalies = FALSE + check_all = FALSE + check_down = FALSE + +/obj/machinery/porta_turret/lasertag/red + turret_type = "red" + installation = /obj/item/weapon/gun/energy/lasertag/red + check_weapons = TRUE // Used to target blue players + +/obj/machinery/porta_turret/lasertag/blue + turret_type = "blue" + installation = /obj/item/weapon/gun/energy/lasertag/blue + check_synth = TRUE // Used to target red players + +/obj/machinery/porta_turret/lasertag/assess_living(var/mob/living/L) + if(!ishuman(L)) + return TURRET_NOT_TARGET + + if(L.invisibility >= INVISIBILITY_LEVEL_ONE) // Cannot see him. see_invisible is a mob-var + return TURRET_NOT_TARGET + + if(get_dist(src, L) > 7) //if it's too far away, why bother? + return TURRET_NOT_TARGET + + if(!(L in check_trajectory(L, src))) //check if we have true line of sight + return TURRET_NOT_TARGET + + if(L.lying) //Don't need to stun-lock the players + return TURRET_NOT_TARGET + + if(ishuman(L)) + var/mob/living/carbon/human/M = L + if(istype(M.wear_suit, /obj/item/clothing/suit/redtag) && check_synth) // Checks if they are a red player + return TURRET_PRIORITY_TARGET + + if(istype(M.wear_suit, /obj/item/clothing/suit/bluetag) && check_weapons) // Checks if they are a blue player + return TURRET_PRIORITY_TARGET + +/obj/machinery/porta_turret/lasertag/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) + var/data[0] + data["access"] = !isLocked(user) + data["locked"] = locked + data["enabled"] = enabled + //data["is_lethal"] = 1 // VOREStation Removal of "Lethal" setting - it does nothing. Rykka did dis. + //data["lethal"] = lethal // VOREStation Removal of "Lethal" setting - it does nothing. Rykka did dis. + + if(data["access"]) + var/settings[0] + settings[++settings.len] = list("category" = "Target Red", "setting" = "check_synth", "value" = check_synth) // Could not get the UI to work with new vars specifically for lasertag turrets -Nalarac + settings[++settings.len] = list("category" = "Target Blue", "setting" = "check_weapons", "value" = check_weapons) // So I'm using these variables since they don't do anything else in this case + data["settings"] = settings + + ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) + if(!ui) + ui = new(user, src, ui_key, "turret_control.tmpl", "Turret Controls", 500, 300) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) + +/obj/machinery/porta_turret/lasertag/Topic(href, href_list) + if(..()) + return 1 + + if(href_list["command"] && href_list["value"]) + var/value = text2num(href_list["value"]) + if(href_list["command"] == "enable") + enabled = value + //else if(href_list["command"] == "lethal") // VOREStation Removal of "Lethal" setting - it does nothing. Rykka did dis. + //lethal = value // VOREStation Removal of "Lethal" setting - it does nothing. Rykka did dis. + else if(href_list["command"] == "check_synth") + check_synth = value + else if(href_list["command"] == "check_weapons") + check_weapons = value + + return 1 + /obj/machinery/porta_turret/Initialize() //Sets up a spark system spark_system = new /datum/effect/effect/system/spark_spread @@ -239,7 +309,7 @@ setup() // If turrets ever switch overlays, this will need to be cached and reapplied each time overlays_cut() is called. - var/image/turret_opened_overlay = image(icon, opened_state) + var/image/turret_opened_overlay = image(icon, "open_[turret_type]") turret_opened_overlay.layer = layer-0.1 add_overlay(turret_opened_overlay) return ..() @@ -251,99 +321,85 @@ /obj/machinery/porta_turret/update_icon() if(stat & BROKEN) // Turret is dead. - icon_state = gun_destroyed_state + icon_state = "destroyed_target_prism_[turret_type]" else if(raised || raising) // Turret is open. if(powered() && enabled) // Trying to shoot someone. - icon_state = gun_active_state + if(lethal) + icon_state = "[lethal_icon_color]_target_prism_[turret_type]" + else + icon_state = "[icon_color]_target_prism_[turret_type]" else // Disabled. - icon_state = gun_disabled_state + icon_state = "grey_target_prism_[turret_type]" else // Its closed. - icon_state = closed_state + icon_state = "turret_cover_[turret_type]" /obj/machinery/porta_turret/proc/setup() var/obj/item/weapon/gun/energy/E = installation //All energy-based weapons are applicable + var/obj/item/projectile/P = initial(E.projectile_type) //var/obj/item/ammo_casing/shottype = E.projectile_type - projectile = initial(E.projectile_type) - eprojectile = projectile - shot_sound = initial(E.fire_sound) - eshot_sound = shot_sound + projectile = P + lethal_projectile = projectile + shot_sound = initial(P.fire_sound) + lethal_shot_sound = shot_sound + + if(istype(P, /obj/item/projectile/energy)) + icon_color = "orange" + + else if(istype(P, /obj/item/projectile/beam/stun)) + icon_color = "blue" + + else if(istype(P, /obj/item/projectile/beam/lasertag)) + icon_color = "blue" + + else if(istype(P, /obj/item/projectile/beam)) + icon_color = "red" + + else + icon_color = "blue" + + lethal_icon_color = icon_color weapon_setup(installation) /obj/machinery/porta_turret/proc/weapon_setup(var/guntype) switch(guntype) - if(/obj/item/weapon/gun/energy/laser/practice) - iconholder = 1 - eprojectile = /obj/item/projectile/beam - -// if(/obj/item/weapon/gun/energy/laser/practice/sc_laser) -// iconholder = 1 -// eprojectile = /obj/item/projectile/beam - if(/obj/item/weapon/gun/energy/gun/burst) - iconholder = 1 - eprojectile = /obj/item/projectile/beam/burstlaser - eshot_sound = 'sound/weapons/Laser.ogg' - icon_color = "red" - projectile = /obj/item/projectile/beam/stun/weak - shot_sound = 'sound/weapons/Taser.ogg' + lethal_icon_color = "red" + lethal_projectile = /obj/item/projectile/beam/burstlaser + lethal_shot_sound = 'sound/weapons/Laser.ogg' shot_delay = 1 SECOND if(/obj/item/weapon/gun/energy/phasegun) - iconholder = 1 - eprojectile = /obj/item/projectile/energy/phase/heavy - eshot_sound = 'sound/weapons/gunshot_pathetic.ogg' icon_color = "orange" - projectile = /obj/item/projectile/energy/phase - shot_sound = 'sound/weapons/gunshot_pathetic.ogg' + lethal_icon_color = "orange" + lethal_projectile = /obj/item/projectile/energy/phase/heavy shot_delay = 1 SECOND - if(/obj/item/weapon/gun/energy/retro) - iconholder = 1 - -// if(/obj/item/weapon/gun/energy/retro/sc_retro) -// iconholder = 1 - - if(/obj/item/weapon/gun/energy/captain) - iconholder = 1 - - if(/obj/item/weapon/gun/energy/lasercannon) - iconholder = 1 - - if(/obj/item/weapon/gun/energy/taser) - eprojectile = /obj/item/projectile/beam - eshot_sound = 'sound/weapons/Laser.ogg' - - if(/obj/item/weapon/gun/energy/stunrevolver) - eprojectile = /obj/item/projectile/beam - eshot_sound = 'sound/weapons/Laser.ogg' - if(/obj/item/weapon/gun/energy/gun) - eprojectile = /obj/item/projectile/beam //If it has, going to kill mode - eshot_sound = 'sound/weapons/Laser.ogg' - egun = 1 + lethal_icon_color = "red" + lethal_projectile = /obj/item/projectile/beam //If it has, going to kill mode + lethal_shot_sound = 'sound/weapons/Laser.ogg' if(/obj/item/weapon/gun/energy/gun/nuclear) - eprojectile = /obj/item/projectile/beam //If it has, going to kill mode - eshot_sound = 'sound/weapons/Laser.ogg' - egun = 1 + lethal_icon_color = "red" + lethal_projectile = /obj/item/projectile/beam //If it has, going to kill mode + lethal_shot_sound = 'sound/weapons/Laser.ogg' if(/obj/item/weapon/gun/energy/xray) - eprojectile = /obj/item/projectile/beam/xray + lethal_icon_color = "green" + lethal_projectile = /obj/item/projectile/beam/xray projectile = /obj/item/projectile/beam/stun // Otherwise we fire xrays on both modes. - eshot_sound = 'sound/weapons/eluger.ogg' + lethal_shot_sound = 'sound/weapons/eluger.ogg' shot_sound = 'sound/weapons/Taser.ogg' - iconholder = 1 - icon_color = "green" /obj/machinery/porta_turret/proc/isLocked(mob/user) if(ailock && issilicon(user)) @@ -351,7 +407,7 @@ return 1 if(locked && !issilicon(user)) - to_chat(user, "Access denied.") + to_chat(user, "Controls locked.") return 1 return 0 @@ -385,6 +441,7 @@ settings[++settings.len] = list("category" = "Check Access Authorization", "setting" = "check_access", "value" = check_access) settings[++settings.len] = list("category" = "Check misc. Lifeforms", "setting" = "check_anomalies", "value" = check_anomalies) settings[++settings.len] = list("category" = "Neutralize All Entities", "setting" = "check_all", "value" = check_all) + settings[++settings.len] = list("category" = "Neutralize Downed Entities", "setting" = "check_down", "value" = check_down) data["settings"] = settings ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) @@ -436,6 +493,8 @@ check_anomalies = value else if(href_list["command"] == "check_all") check_all = value + else if(href_list["command"] == "check_down") + check_down = value return 1 @@ -486,20 +545,20 @@ "You begin [anchored ? "un" : ""]securing the turret." \ ) - wrenching = 1 + wrenching = TRUE if(do_after(user, 50 * I.toolspeed)) //This code handles moving the turret around. After all, it's a portable turret! if(!anchored) playsound(loc, I.usesound, 100, 1) - anchored = 1 + anchored = TRUE update_icon() to_chat(user, "You secure the exterior bolts on the turret.") else if(anchored) playsound(loc, I.usesound, 100, 1) - anchored = 0 + anchored = FALSE to_chat(user, "You unsecure the exterior bolts on the turret.") update_icon() - wrenching = 0 + wrenching = FALSE else if(istype(I, /obj/item/weapon/card/id)||istype(I, /obj/item/device/pda)) //Behavior lock/unlock mangement @@ -540,15 +599,14 @@ //the turret shoot much, much faster. to_chat(user, "You short out [src]'s threat assessment circuits.") visible_message("[src] hums oddly...") - emagged = 1 - iconholder = 1 - controllock = 1 - enabled = 0 //turns off the turret temporarily + emagged = TRUE + controllock = TRUE + enabled = FALSE //turns off the turret temporarily sleep(60) //6 seconds for the traitor to gtfo of the area before the turret decides to ruin his shit - enabled = 1 //turns it back on. The cover popUp() popDown() are automatically called in process(), no need to define it here + enabled = TRUE //turns it back on. The cover popUp() popDown() are automatically called in process(), no need to define it here return 1 -/obj/machinery/porta_turret/proc/take_damage(var/force) +/obj/machinery/porta_turret/take_damage(var/force) if(!raised && !raising) force = force / 8 if(force < 5) @@ -571,7 +629,7 @@ attacked = 1 spawn() sleep(60) - attacked = 0 + attacked = FALSE ..() @@ -587,12 +645,12 @@ check_access = prob(20) // check_access is a pretty big deal, so it's least likely to get turned on check_anomalies = prob(50) if(prob(5)) - emagged = 1 + emagged = TRUE enabled=0 spawn(rand(60,600)) if(!enabled) - enabled=1 + enabled = TRUE ..() @@ -677,10 +735,10 @@ if(faction && L.faction == faction) return TURRET_NOT_TARGET - if(!emagged && issilicon(L) && check_all == 0) // Don't target silica, unless told to neutralize everything. + if(!emagged && issilicon(L) && check_all == FALSE) // Don't target silica, unless told to neutralize everything. return TURRET_NOT_TARGET - if(L.stat && !emagged) //if the perp is dead/dying, no need to bother really + if(L.stat == DEAD && !emagged) //if the perp is dead, no need to bother really return TURRET_NOT_TARGET //move onto next potential victim! if(get_dist(src, L) > 7) //if it's too far away, why bother? @@ -697,13 +755,13 @@ if(check_synth || check_all) //If it's set to attack all non-silicons or everything, target them! if(L.lying) - return lethal ? TURRET_SECONDARY_TARGET : TURRET_NOT_TARGET + return check_down ? TURRET_SECONDARY_TARGET : TURRET_NOT_TARGET return TURRET_PRIORITY_TARGET if(iscuffed(L)) // If the target is handcuffed, leave it alone return TURRET_NOT_TARGET - if(isanimal(L) || issmall(L)) // Animals are not so dangerous + if(isanimal(L)) // Animals are not so dangerous return check_anomalies ? TURRET_SECONDARY_TARGET : TURRET_NOT_TARGET if(isxenomorph(L) || isalien(L)) // Xenos are dangerous @@ -714,7 +772,7 @@ return TURRET_NOT_TARGET //if threat level < 4, keep going if(L.lying) //if the perp is lying down, it's still a target but a less-important target - return lethal ? TURRET_SECONDARY_TARGET : TURRET_NOT_TARGET + return check_down ? TURRET_SECONDARY_TARGET : TURRET_NOT_TARGET return TURRET_PRIORITY_TARGET //if the perp has passed all previous tests, congrats, it is now a "shoot-me!" nominee @@ -750,7 +808,7 @@ var/atom/flick_holder = new /atom/movable/porta_turret_cover(loc) flick_holder.layer = layer + 0.1 - flick(raising_state, flick_holder) + flick("popup_[turret_type]", flick_holder) sleep(10) qdel(flick_holder) @@ -771,7 +829,7 @@ var/atom/flick_holder = new /atom/movable/porta_turret_cover(loc) flick_holder.layer = layer + 0.1 - flick(lowering_state, flick_holder) + flick("popdown_[turret_type]", flick_holder) sleep(10) qdel(flick_holder) @@ -802,10 +860,10 @@ if(!(emagged || attacked)) //if it hasn't been emagged or attacked, it has to obey a cooldown rate if(last_fired || !raised) //prevents rapid-fire shooting, unless it's been emagged return - last_fired = 1 + last_fired = TRUE spawn() sleep(shot_delay) - last_fired = 0 + last_fired = FALSE var/turf/T = get_turf(src) var/turf/U = get_turf(target) @@ -818,8 +876,8 @@ update_icon() var/obj/item/projectile/A if(emagged || lethal) - A = new eprojectile(loc) - playsound(loc, eshot_sound, 75, 1) + A = new lethal_projectile(loc) + playsound(loc, lethal_shot_sound, 75, 1) else A = new projectile(loc) playsound(loc, shot_sound, 75, 1) @@ -840,8 +898,7 @@ //Shooting Code: A.firer = src A.old_style_target(target) - A.def_zone = def_zone - A.fire() + A.launch_projectile_from_turf(target, def_zone, src) // Reset the time needed to go back down, since we just tried to shoot at someone. timeout = 10 @@ -863,7 +920,6 @@ return enabled = TC.enabled lethal = TC.lethal - iconholder = TC.lethal check_synth = TC.check_synth check_access = TC.check_access @@ -899,7 +955,7 @@ if(I.is_wrench() && !anchored) playsound(loc, I.usesound, 100, 1) to_chat(user, "You secure the external bolts.") - anchored = 1 + anchored = TRUE build_step = 1 return @@ -924,7 +980,7 @@ else if(I.is_wrench()) playsound(loc, I.usesound, 75, 1) to_chat(user, "You unfasten the external bolts.") - anchored = 0 + anchored = FALSE build_step = 0 return @@ -1082,4 +1138,4 @@ #undef TURRET_PRIORITY_TARGET #undef TURRET_SECONDARY_TARGET -#undef TURRET_NOT_TARGET \ No newline at end of file +#undef TURRET_NOT_TARGET diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index 3205d16a619..e9997425078 100644 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -1,6 +1,7 @@ //This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 -obj/machinery/recharger +/obj/machinery/recharger name = "recharger" + desc = "A standard recharger for all devices that use power." icon = 'icons/obj/stationobjs_vr.dmi' //VOREStation Edit icon_state = "recharger0" anchored = 1 @@ -9,7 +10,7 @@ obj/machinery/recharger active_power_usage = 40000 //40 kW var/efficiency = 40000 //will provide the modified power rate when upgraded var/obj/item/charging = null - var/list/allowed_devices = list(/obj/item/weapon/gun/energy, /obj/item/weapon/melee/baton, /obj/item/modular_computer, /obj/item/weapon/computer_hardware/battery_module, /obj/item/weapon/cell, /obj/item/device/flashlight, /obj/item/device/electronic_assembly, /obj/item/weapon/weldingtool/electric, /obj/item/ammo_magazine/smart, /obj/item/device/flash, /obj/item/ammo_casing/nsfw_batt) //VOREStation Add - NSFW Batteries + var/list/allowed_devices = list(/obj/item/weapon/gun/energy, /obj/item/weapon/melee/baton, /obj/item/modular_computer, /obj/item/weapon/computer_hardware/battery_module, /obj/item/weapon/cell, /obj/item/device/flashlight, /obj/item/device/electronic_assembly, /obj/item/weapon/weldingtool/electric, /obj/item/ammo_magazine/smart, /obj/item/device/flash, /obj/item/ammo_casing/microbattery) //VOREStation Add - NSFW Batteries var/icon_state_charged = "recharger2" var/icon_state_charging = "recharger1" var/icon_state_idle = "recharger0" //also when unpowered @@ -24,10 +25,16 @@ obj/machinery/recharger ..() return -/obj/machinery/recharger/attackby(obj/item/weapon/G as obj, mob/user as mob) - if(istype(user,/mob/living/silicon)) +/obj/machinery/recharger/examine(mob/user) + if(!..(user, 5)) return + to_chat(user, "[charging ? "[charging]" : "Nothing"] is in [src].") + if(charging) + var/obj/item/weapon/cell/C = charging.get_cell() + to_chat(user, "Current charge: [C.charge] / [C.maxcharge]") + +/obj/machinery/recharger/attackby(obj/item/weapon/G as obj, mob/user as mob) var/allowed = 0 for (var/allowed_type in allowed_devices) if(istype(G, allowed_type)) allowed = 1 @@ -38,32 +45,49 @@ obj/machinery/recharger return // Checks to make sure he's not in space doing it, and that the area got proper power. if(!powered()) - to_chat(user, "The [name] blinks red as you try to insert the item!") + to_chat(user, "\The [src] blinks red as you try to insert [G]!") return if(istype(G, /obj/item/weapon/gun/energy)) var/obj/item/weapon/gun/energy/E = G if(E.self_recharge) - to_chat(user, "Your gun has no recharge port.") + to_chat(user, "\The [E] has no recharge port.") return if(istype(G, /obj/item/modular_computer)) var/obj/item/modular_computer/C = G if(!C.battery_module) - to_chat(user, "This device does not have a battery installed.") + to_chat(user, "\The [C] does not have a battery installed. ") return - else if(!G.get_cell() && !istype(G, /obj/item/ammo_casing/nsfw_batt)) //VOREStation Edit: NSFW charging - to_chat(user, "This device does not have a battery installed.") + if(istype(G, /obj/item/weapon/melee/baton)) + var/obj/item/weapon/melee/baton/B = G + if(B.use_external_power) + to_chat(user, "\The [B] has no recharge port.") + return + if(istype(G, /obj/item/device/flash)) + var/obj/item/device/flash/F = G + if(F.use_external_power) + to_chat(user, "\The [F] has no recharge port.") + return + if(istype(G, /obj/item/weapon/weldingtool/electric)) + var/obj/item/weapon/weldingtool/electric/EW = G + if(EW.use_external_power) + to_chat(user, "\The [EW] has no recharge port.") + return + else if(!G.get_cell() && !istype(G, /obj/item/ammo_casing/microbattery)) //VOREStation Edit: NSFW charging + to_chat(user, "\The [G] does not have a battery installed.") return user.drop_item() G.loc = src charging = G update_icon() + user.visible_message("[user] inserts [charging] into [src].", "You insert [charging] into [src].") + else if(portable && G.is_wrench()) if(charging) to_chat(user, "Remove [charging] first!") return anchored = !anchored - to_chat(user, "You [anchored ? "attached" : "detached"] the recharger.") + to_chat(user, "You [anchored ? "attached" : "detached"] [src].") playsound(loc, G.usesound, 75, 1) else if(default_deconstruction_screwdriver(user, G)) return @@ -73,17 +97,24 @@ obj/machinery/recharger return /obj/machinery/recharger/attack_hand(mob/user as mob) - if(istype(user,/mob/living/silicon)) - return - add_fingerprint(user) if(charging) + user.visible_message("[user] removes [charging] from [src].", "You remove [charging] from [src].") charging.update_icon() user.put_in_hands(charging) charging = null update_icon() +/obj/machinery/cell_charger/attack_ai(mob/user) + if(istype(user, /mob/living/silicon/robot) && Adjacent(user)) // Borgs can remove the cell if they are near enough + if(charging) + user.visible_message("[user] removes [charging] from [src].", "You remove [charging] from [src].") + charging.update_icon() + charging.loc = src.loc + charging = null + update_icon() + /obj/machinery/recharger/process() if(stat & (NOPOWER|BROKEN) || !anchored) update_use_power(0) @@ -126,8 +157,8 @@ obj/machinery/recharger update_use_power(1) //VOREStation Add - NSFW Batteries - else if(istype(charging, /obj/item/ammo_casing/nsfw_batt)) - var/obj/item/ammo_casing/nsfw_batt/batt = charging + else if(istype(charging, /obj/item/ammo_casing/microbattery)) + var/obj/item/ammo_casing/microbattery/batt = charging if(batt.shots_left >= initial(batt.shots_left)) icon_state = icon_state_charged update_use_power(1) @@ -164,6 +195,7 @@ obj/machinery/recharger /obj/machinery/recharger/wallcharger name = "wall recharger" + desc = "A more powerful recharger designed for energy weapons." icon = 'icons/obj/stationobjs.dmi' icon_state = "wrecharger0" plane = TURF_PLANE diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index d94ac049b9a..5a4c58b74a9 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -648,7 +648,7 @@ model_text = "Exploration" departments = list("Exploration","Old Exploration") -/obj/machinery/suit_cycler/exploreration/Initialize() +/obj/machinery/suit_cycler/exploration/Initialize() species -= SPECIES_TESHARI return ..() diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm index cd65fb9f910..8f6e8e589ea 100644 --- a/code/game/machinery/telecomms/broadcaster.dm +++ b/code/game/machinery/telecomms/broadcaster.dm @@ -22,7 +22,17 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept machinetype = 5 produces_heat = 0 delay = 7 - circuitboard = "/obj/item/weapon/circuitboard/telecomms/broadcaster" + circuit = /obj/item/weapon/circuitboard/telecomms/broadcaster + +/obj/machinery/telecomms/processor/Initialize() + . = ..() + component_parts = list() + component_parts += new /obj/item/weapon/stock_parts/subspace/sub_filter(src) + component_parts += new /obj/item/weapon/stock_parts/subspace/crystal(src) + component_parts += new /obj/item/weapon/stock_parts/manipulator(src) + component_parts += new /obj/item/weapon/stock_parts/manipulator(src) + component_parts += new /obj/item/weapon/stock_parts/micro_laser/high(src) + component_parts += new /obj/item/stack/cable_coil(src, 1) /obj/machinery/telecomms/broadcaster/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from) // Don't broadcast rejected signals diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm index 331f5644d92..d41104df251 100644 --- a/code/game/machinery/telecomms/machine_interactions.dm +++ b/code/game/machinery/telecomms/machine_interactions.dm @@ -12,7 +12,6 @@ /obj/machinery/telecomms var/temp = "" // output message - var/construct_op = 0 /obj/machinery/telecomms/attackby(obj/item/P as obj, mob/user as mob) @@ -21,7 +20,6 @@ if(istype(P, /obj/item/device/multitool)) attack_hand(user) - // REPAIRING: Use Nanopaste to repair 10-20 integrity points. if(istype(P, /obj/item/stack/nanopaste)) var/obj/item/stack/nanopaste/T = P @@ -34,75 +32,10 @@ return - switch(construct_op) - if(0) - if(P.is_screwdriver()) - to_chat(user, "You unfasten the bolts.") - playsound(src.loc, P.usesound, 50, 1) - construct_op ++ - if(1) - if(P.is_screwdriver()) - to_chat(user, "You fasten the bolts.") - playsound(src.loc, P.usesound, 50, 1) - construct_op -- - if(P.is_wrench()) - to_chat(user, "You dislodge the external plating.") - playsound(src.loc, P.usesound, 75, 1) - construct_op ++ - if(2) - if(P.is_wrench()) - to_chat(user, "You secure the external plating.") - playsound(src.loc, P.usesound, 75, 1) - construct_op -- - if(P.is_wirecutter()) - playsound(src.loc, P.usesound, 50, 1) - to_chat(user, "You remove the cables.") - construct_op ++ - var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( user.loc ) - A.amount = 5 - stat |= BROKEN // the machine's been borked! - if(3) - if(istype(P, /obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/A = P - if (A.use(5)) - to_chat(user, "You insert the cables.") - construct_op-- - stat &= ~BROKEN // the machine's not borked anymore! - else - to_chat(user, "You need five coils of wire for this.") - if(P.is_crowbar()) - to_chat(user, "You begin prying out the circuit board other components...") - playsound(src.loc, P.usesound, 50, 1) - if(do_after(user,60 * P.toolspeed)) - to_chat(user, "You finish prying out the components.") - - // Drop all the component stuff - if(contents.len > 0) - for(var/obj/x in src) - x.loc = user.loc - else - - // If the machine wasn't made during runtime, probably doesn't have components: - // manually find the components and drop them! - var/newpath = text2path(circuitboard) - var/obj/item/weapon/circuitboard/C = new newpath - for(var/I in C.req_components) - for(var/i = 1, i <= C.req_components[I], i++) - newpath = text2path(I) - var/obj/item/s = new newpath - s.loc = user.loc - if(istype(P, /obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/A = P - A.amount = 1 - - // Drop a circuit board too - C.loc = user.loc - - // Create a frame and delete the current machine - var/obj/structure/frame/F = new - F.loc = src.loc - qdel(src) - + if(default_deconstruction_screwdriver(user, P)) + return + if(default_deconstruction_crowbar(user, P)) + return /obj/machinery/telecomms/attack_ai(var/mob/user as mob) attack_hand(user) diff --git a/code/game/machinery/telecomms/presets_vr.dm b/code/game/machinery/telecomms/presets_vr.dm index 1bd6b92460d..01a07a5f5ed 100644 --- a/code/game/machinery/telecomms/presets_vr.dm +++ b/code/game/machinery/telecomms/presets_vr.dm @@ -3,3 +3,6 @@ hide = 1 produces_heat = 0 autolinkers = list("hb_relay") + +/obj/machinery/telecomms/relay/proc/reset_z() + listening_level = z diff --git a/code/game/machinery/telecomms/telecomunications.dm b/code/game/machinery/telecomms/telecomunications.dm index 50e2f504c9f..d6cefb68283 100644 --- a/code/game/machinery/telecomms/telecomunications.dm +++ b/code/game/machinery/telecomms/telecomunications.dm @@ -32,7 +32,6 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() var/produces_heat = 1 //whether the machine will produce heat when on. var/delay = 10 // how many process() ticks to delay per heat var/long_range_link = 0 // Can you link it across Z levels or on the otherside of the map? (Relay & Hub) - var/circuitboard = null // string pointing to a circuitboard type var/hide = 0 // Is it a hidden machine? var/listening_level = 0 // 0 = auto set in New() - this is the z level that the machine is listening to. @@ -256,7 +255,17 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() idle_power_usage = 600 machinetype = 1 produces_heat = 0 - circuitboard = "/obj/item/weapon/circuitboard/telecomms/receiver" + circuit = /obj/item/weapon/circuitboard/telecomms/receiver + +/obj/machinery/telecomms/receiver/Initialize() + . = ..() + component_parts = list() + component_parts += new /obj/item/weapon/stock_parts/subspace/ansible(src) + component_parts += new /obj/item/weapon/stock_parts/subspace/sub_filter(src) + component_parts += new /obj/item/weapon/stock_parts/manipulator(src) + component_parts += new /obj/item/weapon/stock_parts/manipulator(src) + component_parts += new /obj/item/weapon/stock_parts/micro_laser(src) + RefreshParts() /obj/machinery/telecomms/receiver/receive_signal(datum/signal/signal) @@ -312,7 +321,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() use_power = 1 idle_power_usage = 1600 machinetype = 7 - circuitboard = "/obj/item/weapon/circuitboard/telecomms/hub" + circuit = /obj/item/weapon/circuitboard/telecomms/hub long_range_link = 1 netspeed = 40 var/list/telecomms_map @@ -320,6 +329,13 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() /obj/machinery/telecomms/hub/Initialize() . = ..() LAZYINITLIST(telecomms_map) + component_parts = list() + component_parts += new /obj/item/weapon/stock_parts/subspace/sub_filter(src) + component_parts += new /obj/item/weapon/stock_parts/subspace/sub_filter(src) + component_parts += new /obj/item/weapon/stock_parts/manipulator(src) + component_parts += new /obj/item/weapon/stock_parts/manipulator(src) + component_parts += new /obj/item/stack/cable_coil(src, 2) + RefreshParts() /obj/machinery/telecomms/hub/process() . = ..() @@ -365,12 +381,22 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() idle_power_usage = 600 machinetype = 8 produces_heat = 0 - circuitboard = "/obj/item/weapon/circuitboard/telecomms/relay" + circuit = /obj/item/weapon/circuitboard/telecomms/relay netspeed = 5 long_range_link = 1 var/broadcasting = 1 var/receiving = 1 +/obj/machinery/telecomms/relay/Initialize() + . = ..() + component_parts = list() + component_parts += new /obj/item/weapon/stock_parts/subspace/sub_filter(src) + component_parts += new /obj/item/weapon/stock_parts/subspace/sub_filter(src) + component_parts += new /obj/item/weapon/stock_parts/manipulator(src) + component_parts += new /obj/item/weapon/stock_parts/manipulator(src) + component_parts += new /obj/item/stack/cable_coil(src, 2) + RefreshParts() + /obj/machinery/telecomms/relay/forceMove(var/newloc) . = ..(newloc) listening_level = z @@ -420,10 +446,19 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() use_power = 1 idle_power_usage = 1000 machinetype = 2 - circuitboard = "/obj/item/weapon/circuitboard/telecomms/bus" + circuit = /obj/item/weapon/circuitboard/telecomms/bus netspeed = 40 var/change_frequency = 0 +/obj/machinery/telecomms/bus/Initialize() + . = ..() + component_parts = list() + component_parts += new /obj/item/weapon/stock_parts/subspace/sub_filter(src) + component_parts += new /obj/item/weapon/stock_parts/manipulator(src) + component_parts += new /obj/item/weapon/stock_parts/manipulator(src) + component_parts += new /obj/item/stack/cable_coil(src, 1) + RefreshParts() + /obj/machinery/telecomms/bus/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from) if(is_freq_listening(signal)) @@ -473,23 +508,37 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() idle_power_usage = 600 machinetype = 3 delay = 5 - circuitboard = "/obj/item/weapon/circuitboard/telecomms/processor" + circuit = /obj/item/weapon/circuitboard/telecomms/processor var/process_mode = 1 // 1 = Uncompress Signals, 0 = Compress Signals - receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from) +/obj/machinery/telecomms/processor/Initialize() + . = ..() + component_parts = list() + component_parts += new /obj/item/weapon/stock_parts/subspace/sub_filter(src) + component_parts += new /obj/item/weapon/stock_parts/subspace/treatment(src) + component_parts += new /obj/item/weapon/stock_parts/subspace/treatment(src) + component_parts += new /obj/item/weapon/stock_parts/subspace/amplifier(src) + component_parts += new /obj/item/weapon/stock_parts/subspace/analyzer(src) + component_parts += new /obj/item/weapon/stock_parts/manipulator(src) + component_parts += new /obj/item/weapon/stock_parts/manipulator(src) + component_parts += new /obj/item/weapon/stock_parts/manipulator(src) + component_parts += new /obj/item/stack/cable_coil(src, 2) + RefreshParts() - if(is_freq_listening(signal)) +/obj/machinery/telecomms/processor/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from) - if(process_mode) - signal.data["compression"] = 0 // uncompress subspace signal - else - signal.data["compression"] = 100 // even more compressed signal + if(is_freq_listening(signal)) - if(istype(machine_from, /obj/machinery/telecomms/bus)) - relay_direct_information(signal, machine_from) // send the signal back to the machine - else // no bus detected - send the signal to servers instead - signal.data["slow"] += rand(5, 10) // slow the signal down - relay_information(signal, "/obj/machinery/telecomms/server") + if(process_mode) + signal.data["compression"] = 0 // uncompress subspace signal + else + signal.data["compression"] = 100 // even more compressed signal + + if(istype(machine_from, /obj/machinery/telecomms/bus)) + relay_direct_information(signal, machine_from) // send the signal back to the machine + else // no bus detected - send the signal to servers instead + signal.data["slow"] += rand(5, 10) // slow the signal down + relay_information(signal, "/obj/machinery/telecomms/server") /* @@ -510,7 +559,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() use_power = 1 idle_power_usage = 300 machinetype = 4 - circuitboard = "/obj/item/weapon/circuitboard/telecomms/server" + circuit = /obj/item/weapon/circuitboard/telecomms/server var/list/log_entries = list() var/list/stored_names = list() var/list/TrafficActions = list() @@ -534,6 +583,15 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() Compiler.Holder = src server_radio = new() +/obj/machinery/telecomms/server/Initialize() + . = ..() + component_parts = list() + component_parts += new /obj/item/weapon/stock_parts/subspace/sub_filter(src) + component_parts += new /obj/item/weapon/stock_parts/manipulator(src) + component_parts += new /obj/item/weapon/stock_parts/manipulator(src) + component_parts += new /obj/item/stack/cable_coil(src, 1) + RefreshParts() + /obj/machinery/telecomms/server/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from) if(signal.data["message"]) diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 43911b54d87..663230b11ff 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -1153,7 +1153,7 @@ /obj/item/toy/plushie/tabby_cat = 50) /obj/machinery/vending/fishing - name = "loot trawler" + name = "Loot Trawler" desc = "A special vendor for fishing equipment." product_ads = "Tired of trawling across the ocean floor? Get our loot!;Chum and rods.;Don't get baited into fishing without us!;Baby is your star-sign pisces? We'd make a perfect match.;Do not fear, plenty to catch around here.;Don't get reeled in helplessly, get your own rod today!" icon_state = "fishvendor" diff --git a/code/game/machinery/vending_vr.dm b/code/game/machinery/vending_vr.dm index 19a24e669ee..0bf7b947146 100644 --- a/code/game/machinery/vending_vr.dm +++ b/code/game/machinery/vending_vr.dm @@ -131,3 +131,18 @@ products += list(/obj/item/weapon/reagent_containers/food/snacks/liquidprotein = 8) prices += list(/obj/item/weapon/reagent_containers/food/snacks/liquidprotein = 10) ..() + +/obj/machinery/vending/blood + name = "Blood-Onator" + desc = "Freezer-vendor for storage and quick dispensing of blood packs" + product_ads = "The true life juice!;Vampire's choice!;Home-grown blood only!;Donate today, be saved tomorrow!;Approved by Zeng-Hu Pharmaceuticals Incorporated!; Curse you, Vey-Med artificial blood!" + icon_state = "blood" + idle_power_usage = 211 + req_access = list(access_medical) + products = list(/obj/item/weapon/reagent_containers/blood/prelabeled/APlus = 3,/obj/item/weapon/reagent_containers/blood/prelabeled/AMinus = 3, + /obj/item/weapon/reagent_containers/blood/prelabeled/BPlus = 3,/obj/item/weapon/reagent_containers/blood/prelabeled/BMinus = 3, + /obj/item/weapon/reagent_containers/blood/prelabeled/OPlus = 2,/obj/item/weapon/reagent_containers/blood/prelabeled/OMinus = 5, + /obj/item/weapon/reagent_containers/blood/empty = 5) + contraband = list(/obj/item/weapon/reagent_containers/glass/bottle/stoxin = 2) + req_log_access = access_cmo + has_logs = 1 \ No newline at end of file diff --git a/code/game/mecha/combat/combat.dm b/code/game/mecha/combat/combat.dm index a3532a1b329..b58956579ac 100644 --- a/code/game/mecha/combat/combat.dm +++ b/code/game/mecha/combat/combat.dm @@ -2,7 +2,7 @@ force = 30 var/melee_cooldown = 10 var/melee_can_hit = 1 - var/list/destroyable_obj = list(/obj/mecha, /obj/structure/window, /obj/structure/grille, /turf/simulated/wall, /obj/structure/girder) + //var/list/destroyable_obj = list(/obj/mecha, /obj/structure/window, /obj/structure/grille, /turf/simulated/wall, /obj/structure/girder) internal_damage_threshold = 50 maint_access = 0 //add_req_access = 0 @@ -26,14 +26,15 @@ return */ -/obj/mecha/combat/melee_action(target as obj|mob|turf) +/obj/mecha/combat/melee_action(atom/T) if(internal_damage&MECHA_INT_CONTROL_LOST) - target = safepick(oview(1,src)) - if(!melee_can_hit || !istype(target, /atom)) return - if(istype(target, /mob/living)) - var/mob/living/M = target + T = safepick(oview(1,src)) + if(!melee_can_hit) + return + if(istype(T, /mob/living)) + var/mob/living/M = T if(src.occupant.a_intent == I_HURT || istype(src.occupant, /mob/living/carbon/brain)) //Brains cannot change intents; Exo-piloting brains lack any form of physical feedback for control, limiting the ability to 'play nice'. - playsound(src, 'sound/weapons/punch4.ogg', 50, 1) + playsound(src, 'sound/weapons/heavysmash.ogg', 50, 1) if(damtype == "brute") step_away(M,src,15) /* @@ -44,8 +45,8 @@ melee_can_hit = 1 return */ - if(istype(target, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = target + if(ishuman(T)) + var/mob/living/carbon/human/H = T // if (M.health <= 0) return var/obj/item/organ/external/temp = H.get_organ(pick(BP_TORSO, BP_TORSO, BP_TORSO, BP_HEAD)) @@ -86,12 +87,12 @@ else return M.updatehealth() - src.occupant_message("You hit [target].") - src.visible_message("[src.name] hits [target].") + src.occupant_message("You hit [T].") + src.visible_message("[src.name] hits [T].") else step_away(M,src) - src.occupant_message("You push [target] out of the way.") - src.visible_message("[src] pushes [target] out of the way.") + src.occupant_message("You push [T] out of the way.") + src.visible_message("[src] pushes [T] out of the way.") melee_can_hit = 0 if(do_after(melee_cooldown)) @@ -99,27 +100,23 @@ return else - if(damtype == "brute") - for(var/target_type in src.destroyable_obj) - if(istype(target, target_type) && hascall(target, "attackby")) - src.occupant_message("You hit [target].") - src.visible_message("[src.name] hits [target]") - if(!istype(target, /turf/simulated/wall) && !istype(target, /obj/structure/girder)) - target:attackby(src,src.occupant) - else if(prob(5)) - target:dismantle_wall(1) - src.occupant_message("You smash through the wall.") - src.visible_message("[src.name] smashes through the wall") - playsound(src, 'sound/weapons/smash.ogg', 50, 1) - else if(istype(target, /turf/simulated/wall)) - target:take_damage(force) - else if(istype(target, /obj/structure/girder)) - target:take_damage(force * 3) //Girders have 200 health by default. Steel, non-reinforced walls take four punches, girders take (with this value-mod) two, girders took five without. - melee_can_hit = 0 + if(istype(T, /obj/machinery/disposal)) // Stops mechs from climbing into disposals + return + if(src.occupant.a_intent == I_HURT || istype(src.occupant, /mob/living/carbon/brain)) // Don't smash unless we mean it + if(damtype == "brute") + src.occupant_message("You hit [T].") + src.visible_message("[src.name] hits [T]") + playsound(src, 'sound/weapons/heavysmash.ogg', 50, 1) - if(do_after(melee_cooldown)) - melee_can_hit = 1 - break + if(istype(T, /obj/structure/girder)) + T:take_damage(force * 3) //Girders have 200 health by default. Steel, non-reinforced walls take four punches, girders take (with this value-mod) two, girders took five without. + else + T:take_damage(force) + + melee_can_hit = 0 + + if(do_after(melee_cooldown)) + melee_can_hit = 1 return /* diff --git a/code/game/mecha/combat/phazon.dm b/code/game/mecha/combat/phazon.dm index b54368a75e8..3ada4824f74 100644 --- a/code/game/mecha/combat/phazon.dm +++ b/code/game/mecha/combat/phazon.dm @@ -133,7 +133,7 @@ ..() if(phasing) phasing = FALSE - radiation_repository.radiate(get_turf(src), 30) + SSradiation.radiate(get_turf(src), 30) log_append_to_last("WARNING: BLUESPACE DRIVE INSTABILITY DETECTED. DISABLING DRIVE.",1) visible_message("The [src.name] appears to flicker, before its silhouette stabilizes!") return diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm index 27ae65ea67f..48a46fae56c 100644 --- a/code/game/mecha/equipment/mecha_equipment.dm +++ b/code/game/mecha/equipment/mecha_equipment.dm @@ -273,3 +273,6 @@ if(chassis) chassis.log_message("[src]: [message]") return + +/obj/item/mecha_parts/mecha_equipment/proc/MoveAction() //Allows mech equipment to do an action upon the mech moving + return diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm index d275c2f4a6d..b61ada6d187 100644 --- a/code/game/mecha/equipment/tools/medical_tools.dm +++ b/code/game/mecha/equipment/tools/medical_tools.dm @@ -10,7 +10,7 @@ var/mob/living/carbon/human/occupant = null var/datum/global_iterator/pr_mech_sleeper var/inject_amount = 5 - required_type = /obj/mecha/medical + required_type = list(/obj/mecha/medical) salvageable = 0 allow_duplicate = TRUE @@ -247,144 +247,6 @@ return -/obj/item/mecha_parts/mecha_equipment/tool/cable_layer - name = "Cable Layer" - icon_state = "mecha_wire" - var/datum/event/event - var/turf/old_turf - var/obj/structure/cable/last_piece - var/obj/item/stack/cable_coil/cable - var/max_cable = 1000 - required_type = /obj/mecha/working - -/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/New() - cable = new(src) - cable.amount = 0 - ..() - -/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/attach() - ..() - event = chassis.events.addEvent("onMove",src,"layCable") - return - -/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/detach() - chassis.events.clearEvent("onMove",event) - return ..() - -/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/destroy() - chassis.events.clearEvent("onMove",event) - return ..() - -/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/action(var/obj/item/stack/cable_coil/target) - if(!action_checks(target)) - return - var/result = load_cable(target) - var/message - if(isnull(result)) - message = "Unable to load [target] - no cable found." - else if(!result) - message = "Reel is full." - else - message = "[result] meters of cable successfully loaded." - send_byjax(chassis.occupant,"exosuit.browser","\ref[src]",src.get_equip_info()) - occupant_message(message) - return - -/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/Topic(href,href_list) - ..() - if(href_list["toggle"]) - set_ready_state(!equip_ready) - occupant_message("[src] [equip_ready?"dea":"a"]ctivated.") - log_message("[equip_ready?"Dea":"A"]ctivated.") - return - if(href_list["cut"]) - if(cable && cable.amount) - var/m = round(input(chassis.occupant,"Please specify the length of cable to cut","Cut cable",min(cable.amount,30)) as num, 1) - m = min(m, cable.amount) - if(m) - use_cable(m) - var/obj/item/stack/cable_coil/CC = new (get_turf(chassis)) - CC.amount = m - else - occupant_message("There's no more cable on the reel.") - return - -/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/get_equip_info() - var/output = ..() - if(output) - return "[output] \[Cable: [cable ? cable.amount : 0] m\][(cable && cable.amount) ? "- [!equip_ready?"Dea":"A"]ctivate|Cut" : null]" - return - -/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/proc/load_cable(var/obj/item/stack/cable_coil/CC) - if(istype(CC) && CC.amount) - var/cur_amount = cable? cable.amount : 0 - var/to_load = max(max_cable - cur_amount,0) - if(to_load) - to_load = min(CC.amount, to_load) - if(!cable) - cable = new(src) - cable.amount = 0 - cable.amount += to_load - CC.use(to_load) - return to_load - else - return 0 - return - -/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/proc/use_cable(amount) - if(!cable || cable.amount<1) - set_ready_state(1) - occupant_message("Cable depleted, [src] deactivated.") - log_message("Cable depleted, [src] deactivated.") - return - if(cable.amount < amount) - occupant_message("No enough cable to finish the task.") - return - cable.use(amount) - update_equip_info() - return 1 - -/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/proc/reset() - last_piece = null - -/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/proc/dismantleFloor(var/turf/new_turf) - if(istype(new_turf, /turf/simulated/floor)) - var/turf/simulated/floor/T = new_turf - if(!T.is_plating()) - T.make_plating(!(T.broken || T.burnt)) - return new_turf.is_plating() - -/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/proc/layCable(var/turf/new_turf) - if(equip_ready || !istype(new_turf) || !dismantleFloor(new_turf)) - return reset() - var/fdirn = turn(chassis.dir,180) - for(var/obj/structure/cable/LC in new_turf) // check to make sure there's not a cable there already - if(LC.d1 == fdirn || LC.d2 == fdirn) - return reset() - if(!use_cable(1)) - return reset() - var/obj/structure/cable/NC = new(new_turf) - NC.cableColor("red") - NC.d1 = 0 - NC.d2 = fdirn - NC.update_icon() - - var/datum/powernet/PN - if(last_piece && last_piece.d2 != chassis.dir) - last_piece.d1 = min(last_piece.d2, chassis.dir) - last_piece.d2 = max(last_piece.d2, chassis.dir) - last_piece.update_icon() - PN = last_piece.powernet - - if(!PN) - PN = new() - PN.add_cable(NC) - NC.mergeConnectedNetworks(NC.d2) - - //NC.mergeConnectedNetworksOnTurf() - last_piece = NC - return 1 - /obj/item/mecha_parts/mecha_equipment/tool/syringe_gun name = "syringe gun" desc = "Exosuit-mounted chem synthesizer with syringe gun. Reagents inside are held in stasis, so no reactions will occur. (Can be attached to: Medical Exosuits)" @@ -402,7 +264,7 @@ range = MELEE|RANGED equip_cooldown = 10 origin_tech = list(TECH_MATERIAL = 3, TECH_BIO = 4, TECH_MAGNET = 4, TECH_DATA = 3) - required_type = /obj/mecha/medical + required_type = list(/obj/mecha/medical) //This is a list of datums so as to allow id changes, and force compile errors if removed. var/static/list/allowed_reagents = list( @@ -711,4 +573,4 @@ for(var/reagent in S.processed_reagents) S.reagents.add_reagent(reagent,amount) S.chassis.use_power(energy_drain) - return 1 + return 1 \ No newline at end of file diff --git a/code/game/mecha/equipment/tools/medical_tools_vr.dm b/code/game/mecha/equipment/tools/medical_tools_vr.dm new file mode 100644 index 00000000000..19efa0a5fd2 --- /dev/null +++ b/code/game/mecha/equipment/tools/medical_tools_vr.dm @@ -0,0 +1,10 @@ +/obj/item/mecha_parts/mecha_equipment/weapon/energy/medigun + equip_cooldown = 6 + name = "\improper BL-3 \"Phoenix\" directed restoration system" + desc = "The BL-3 'Phoenix' is a portable medical system used to treat external injuries from afar." + icon_state = "mecha_medbeam" + energy_drain = 1000 + projectile = /obj/item/projectile/beam/medigun + fire_sound = 'sound/weapons/eluger.ogg' + equip_type = EQUIP_UTILITY + origin_tech = list(TECH_MATERIAL = 5, TECH_COMBAT = 5, TECH_BIO = 6, TECH_POWER = 6) \ No newline at end of file diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm index 0519bf2ca49..73f7356ade6 100644 --- a/code/game/mecha/equipment/tools/tools.dm +++ b/code/game/mecha/equipment/tools/tools.dm @@ -166,14 +166,7 @@ if(ore_box) for(var/obj/item/weapon/ore/ore in range(chassis,1)) if(get_dir(chassis,ore)&chassis.dir) - ore.Move(ore_box) - log_message("Drilled through [target]") - if(locate(/obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp) in chassis.equipment) - var/obj/structure/ore_box/ore_box = locate(/obj/structure/ore_box) in chassis:cargo - if(ore_box) - for(var/obj/item/weapon/ore/ore in range(chassis,1)) - if(get_dir(chassis,ore)&chassis.dir) - ore.Move(ore_box) + ore.forceMove(ore_box) else if(target.loc == C) log_message("Drilled through [target]") target.ex_act(2) @@ -219,7 +212,7 @@ if(ore_box) for(var/obj/item/weapon/ore/ore in range(chassis,1)) if(get_dir(chassis,ore)&chassis.dir) - ore.Move(ore_box) + ore.forceMove(ore_box) else if(target.loc == C) log_message("Drilled through [target]") target.ex_act(2) @@ -267,13 +260,7 @@ if(ore_box) for(var/obj/item/weapon/ore/ore in range(chassis,1)) if(get_dir(chassis,ore)&chassis.dir) - ore.Move(ore_box) - if(locate(/obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp) in chassis.equipment) - var/obj/structure/ore_box/ore_box = locate(/obj/structure/ore_box) in chassis:cargo - if(ore_box) - for(var/obj/item/weapon/ore/ore in range(chassis,1)) - if(get_dir(chassis,ore)&chassis.dir) - ore.Move(ore_box) + ore.forceMove(ore_box) else if(target.loc == C) log_message("Drilled through [target]") target.ex_act(2) @@ -328,7 +315,7 @@ equip_cooldown = 5 energy_drain = 0 range = MELEE|RANGED - required_type = /obj/mecha/working + required_type = list(/obj/mecha/working) var/spray_particles = 5 var/spray_amount = 5 //units of liquid per particle. 5 is enough to wet the floor - it's a big fire extinguisher, so should be fine var/max_water = 1000 @@ -1214,7 +1201,7 @@ /datum/global_iterator/mecha_generator/nuclear/process(var/obj/item/mecha_parts/mecha_equipment/generator/nuclear/EG) if(..()) - radiation_repository.radiate(EG, (EG.rad_per_cycle * 3)) + SSradiation.radiate(EG, (EG.rad_per_cycle * 3)) return 1 @@ -1227,7 +1214,7 @@ energy_drain = 0 var/dam_force = 0 var/obj/mecha/working/ripley/cargo_holder - required_type = /obj/mecha/working/ripley + required_type = list(/obj/mecha/working/ripley) equip_type = EQUIP_SPECIAL @@ -1528,3 +1515,154 @@ sleep(equip_cooldown) wait = 0 return 1 + +/obj/item/mecha_parts/mecha_equipment/speedboost + name = "ripley leg actuator overdrive" + desc = "System enhancements and overdrives to make a ripley's legs move faster." + icon_state = "tesla" + origin_tech = list( TECH_POWER = 5, TECH_MATERIAL = 4, TECH_ENGINEERING = 4) + required_type = list(/obj/mecha/working/ripley) + + equip_type = EQUIP_HULL + +/obj/item/mecha_parts/mecha_equipment/speedboost/attach(obj/mecha/M as obj) + ..() + if(enable_special) + chassis.step_in = (chassis.step_in-2) // Make the ripley as fast as a durand + else + chassis.step_in = (chassis.step_in+1) // Improper parts slow the mech down + return + +/obj/item/mecha_parts/mecha_equipment/speedboost/detach() + chassis.step_in = initial(chassis.step_in) + ..() + return + +/obj/item/mecha_parts/mecha_equipment/tool/cable_layer + name = "Cable Layer" + icon_state = "mecha_wire" + var/turf/old_turf + var/obj/structure/cable/last_piece + var/obj/item/stack/cable_coil/cable + var/max_cable = 1000 + required_type = list(/obj/mecha/working) + +/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/New() + cable = new(src) + cable.amount = 0 + ..() + +/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/MoveAction() + layCable() + +/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/action(var/obj/item/stack/cable_coil/target) + if(!action_checks(target)) + return + var/result = load_cable(target) + var/message + if(isnull(result)) + message = "Unable to load [target] - no cable found." + else if(!result) + message = "Reel is full." + else + message = "[result] meters of cable successfully loaded." + send_byjax(chassis.occupant,"exosuit.browser","\ref[src]",src.get_equip_info()) + occupant_message(message) + return + +/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/Topic(href,href_list) + ..() + if(href_list["toggle"]) + set_ready_state(!equip_ready) + occupant_message("[src] [equip_ready?"dea":"a"]ctivated.") + log_message("[equip_ready?"Dea":"A"]ctivated.") + return + if(href_list["cut"]) + if(cable && cable.amount) + var/m = round(input(chassis.occupant,"Please specify the length of cable to cut","Cut cable",min(cable.amount,30)) as num, 1) + m = min(m, cable.amount) + if(m) + use_cable(m) + var/obj/item/stack/cable_coil/CC = new (get_turf(chassis)) + CC.amount = m + else + occupant_message("There's no more cable on the reel.") + return + +/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/get_equip_info() + var/output = ..() + if(output) + return "[output] \[Cable: [cable ? cable.amount : 0] m\][(cable && cable.amount) ? "- [!equip_ready?"Dea":"A"]ctivate|Cut" : null]" + return + +/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/proc/load_cable(var/obj/item/stack/cable_coil/CC) + if(istype(CC) && CC.amount) + var/cur_amount = cable? cable.amount : 0 + var/to_load = max(max_cable - cur_amount,0) + if(to_load) + to_load = min(CC.amount, to_load) + if(!cable) + cable = new(src) + cable.amount = 0 + cable.amount += to_load + CC.use(to_load) + return to_load + else + return 0 + return + +/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/proc/use_cable(amount) + if(!cable || cable.amount<1) + set_ready_state(1) + occupant_message("Cable depleted, [src] deactivated.") + log_message("Cable depleted, [src] deactivated.") + return + if(cable.amount < amount) + occupant_message("No enough cable to finish the task.") + return + cable.use(amount) + update_equip_info() + return 1 + +/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/proc/reset() + last_piece = null + +/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/proc/dismantleFloor(var/turf/new_turf) + new_turf = get_turf(chassis) + if(istype(new_turf, /turf/simulated/floor)) + var/turf/simulated/floor/T = new_turf + if(!T.is_plating()) + T.make_plating(!(T.broken || T.burnt)) + return new_turf.is_plating() + +/obj/item/mecha_parts/mecha_equipment/tool/cable_layer/proc/layCable(var/turf/new_turf) + new_turf = get_turf(chassis) + if(equip_ready || !istype(new_turf, /turf/simulated/floor) || !dismantleFloor(new_turf)) + return reset() + var/fdirn = turn(chassis.dir,180) + for(var/obj/structure/cable/LC in new_turf) // check to make sure there's not a cable there already + if(LC.d1 == fdirn || LC.d2 == fdirn) + return reset() + if(!use_cable(1)) + return reset() + var/obj/structure/cable/NC = new(new_turf) + NC.cableColor("red") + NC.d1 = 0 + NC.d2 = fdirn + NC.update_icon() + + var/datum/powernet/PN + if(last_piece && last_piece.d2 != chassis.dir) + last_piece.d1 = min(last_piece.d2, chassis.dir) + last_piece.d2 = max(last_piece.d2, chassis.dir) + last_piece.update_icon() + PN = last_piece.powernet + + if(!PN) + PN = new() + PN.add_cable(NC) + NC.mergeConnectedNetworks(NC.d2) + + //NC.mergeConnectedNetworksOnTurf() + last_piece = NC + return 1 \ No newline at end of file diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index b556286292a..74cdb2d368b 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -384,9 +384,16 @@ /obj/mecha/Move() . = ..() if(.) - events.fireEvent("onMove",get_turf(src)) + MoveAction() return +/obj/mecha/proc/MoveAction() //Allows mech equipment to do an action once the mech moves + if(!equipment.len) + return + + for(var/obj/item/mecha_parts/mecha_equipment/ME in equipment) + ME.MoveAction() + /obj/mecha/relaymove(mob/user,direction) if(user != src.occupant) //While not "realistic", this piece is player friendly. if(istype(user,/mob/living/carbon/brain)) @@ -535,7 +542,7 @@ //////// Health related procs //////// //////////////////////////////////////// -/obj/mecha/proc/take_damage(amount, type="brute") +/obj/mecha/take_damage(amount, type="brute") if(amount) var/damage = absorbDamage(amount,type) health -= damage @@ -621,6 +628,11 @@ /obj/mecha/bullet_act(var/obj/item/projectile/Proj) //wrapper + if(istype(Proj, /obj/item/projectile/test)) + var/obj/item/projectile/test/Test = Proj + Test.hit |= occupant // Register a hit on the occupant, for things like turrets, or in simple-mob cases stopping friendly fire in firing line mode. + return + src.log_message("Hit by projectile. Type: [Proj.name]([Proj.check_armour]).",1) call((proc_res["dynbulletdamage"]||src), "dynbulletdamage")(Proj) //calls equipment ..() diff --git a/code/game/mecha/micro/mechfab_designs_vr.dm b/code/game/mecha/micro/mechfab_designs_vr.dm index 7a86d8d9ec0..671e53b4da5 100644 --- a/code/game/mecha/micro/mechfab_designs_vr.dm +++ b/code/game/mecha/micro/mechfab_designs_vr.dm @@ -185,3 +185,11 @@ id = "weasel_head" build_path = /obj/item/mecha_parts/micro/part/weasel_head materials = list(DEFAULT_WALL_MATERIAL = 7000, "glass" = 2500) + +/datum/design/item/mecha/medigun + name = "BL-3/P directed restoration system" + desc = "A portable medical system used to treat external injuries from afar." + id = "mech_medigun" + req_tech = list(TECH_MATERIAL = 5, TECH_COMBAT = 5, TECH_BIO = 6) + materials = list(DEFAULT_WALL_MATERIAL = 8000, "gold" = 2000, "silver" = 1750, "diamond" = 1500, "phoron" = 4000) + build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/medigun \ No newline at end of file diff --git a/code/game/mecha/micro/micro_equipment.dm b/code/game/mecha/micro/micro_equipment.dm index b8e4557b476..d36f9fa0a3e 100644 --- a/code/game/mecha/micro/micro_equipment.dm +++ b/code/game/mecha/micro/micro_equipment.dm @@ -146,7 +146,7 @@ occupant_message("The ore compartment is full.") return 1 else - ore.Move(ore_box) + ore.forceMove(ore_box) else if(target.loc == C) log_message("Drilled through [target]") target.ex_act(2) diff --git a/code/game/objects/effects/alien/aliens.dm b/code/game/objects/effects/alien/aliens.dm index 44963c31d2a..0de8d332b71 100644 --- a/code/game/objects/effects/alien/aliens.dm +++ b/code/game/objects/effects/alien/aliens.dm @@ -64,6 +64,19 @@ healthcheck() return +/obj/effect/alien/resin/attack_generic(var/mob/user, var/damage, var/attack_verb) + visible_message("[user] [attack_verb] the [src]!") + playsound(loc, 'sound/effects/attackblob.ogg', 100, 1) + user.do_attack_animation(src) + health -= damage + healthcheck() + return + +/obj/effect/alien/resin/take_damage(var/damage) + health -= damage + healthcheck() + return + /obj/effect/alien/resin/ex_act(severity) switch(severity) if(1.0) @@ -246,6 +259,18 @@ Alien plants should do something if theres a lot of poison health -= damage healthcheck() +/obj/effect/alien/weeds/attack_generic(var/mob/user, var/damage, var/attack_verb) + visible_message("[user] [attack_verb] the [src]!") + user.do_attack_animation(src) + health -= damage + healthcheck() + return + +/obj/effect/alien/weeds/take_damage(var/damage) + health -= damage + healthcheck() + return + /obj/effect/alien/weeds/proc/healthcheck() if(health <= 0) qdel(src) @@ -401,6 +426,18 @@ Alien plants should do something if theres a lot of poison healthcheck() return +/obj/effect/alien/egg/attack_generic(var/mob/user, var/damage, var/attack_verb) + visible_message("[user] [attack_verb] the [src]!") + user.do_attack_animation(src) + health -= damage + healthcheck() + return + +/obj/effect/alien/egg/take_damage(var/damage) + health -= damage + healthcheck() + return + /obj/effect/alien/egg/attackby(var/obj/item/weapon/W, var/mob/user) if(health <= 0) diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index 3b1584ca194..8b8bba5a9dd 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -53,7 +53,7 @@ var/global/list/image/splatter_cache=list() blood_DNA |= B.blood_DNA.Copy() qdel(B) drytime = world.time + DRYING_TIME * (amount+1) - START_PROCESSING(SSobj, src) + START_PROCESSING(SSobj, src) /obj/effect/decal/cleanable/blood/process() if(world.time > drytime) @@ -93,7 +93,6 @@ var/global/list/image/splatter_cache=list() S.overlays += S.blood_overlay if(S.blood_overlay && S.blood_overlay.color != basecolor) S.blood_overlay.color = basecolor - S.overlays.Cut() S.overlays += S.blood_overlay S.blood_DNA |= blood_DNA.Copy() perp.update_inv_shoes() diff --git a/code/game/objects/effects/map_effects/radiation_emitter.dm b/code/game/objects/effects/map_effects/radiation_emitter.dm index 3fb31d3c5dc..8abf946556d 100644 --- a/code/game/objects/effects/map_effects/radiation_emitter.dm +++ b/code/game/objects/effects/map_effects/radiation_emitter.dm @@ -1,19 +1,19 @@ -// Constantly emites radiation from the tile it's placed on. -/obj/effect/map_effect/radiation_emitter - name = "radiation emitter" - icon_state = "radiation_emitter" - var/radiation_power = 30 // Bigger numbers means more radiation. - -/obj/effect/map_effect/radiation_emitter/Initialize() - START_PROCESSING(SSobj, src) - return ..() - -/obj/effect/map_effect/radiation_emitter/Destroy() - STOP_PROCESSING(SSobj, src) - return ..() - -/obj/effect/map_effect/radiation_emitter/process() - radiation_repository.radiate(src, radiation_power) - +// Constantly emites radiation from the tile it's placed on. +/obj/effect/map_effect/radiation_emitter + name = "radiation emitter" + icon_state = "radiation_emitter" + var/radiation_power = 30 // Bigger numbers means more radiation. + +/obj/effect/map_effect/radiation_emitter/Initialize() + START_PROCESSING(SSobj, src) + return ..() + +/obj/effect/map_effect/radiation_emitter/Destroy() + STOP_PROCESSING(SSobj, src) + return ..() + +/obj/effect/map_effect/radiation_emitter/process() + SSradiation.radiate(src, radiation_power) + /obj/effect/map_effect/radiation_emitter/strong radiation_power = 100 \ No newline at end of file diff --git a/code/game/objects/effects/step_triggers.dm b/code/game/objects/effects/step_triggers.dm index b5345cc8ebb..40c3f752e9d 100644 --- a/code/game/objects/effects/step_triggers.dm +++ b/code/game/objects/effects/step_triggers.dm @@ -6,6 +6,8 @@ invisibility = 99 // nope cant see this shit plane = ABOVE_PLANE anchored = 1 + icon = 'icons/mob/screen1.dmi' //VS Edit + icon_state = "centermarker" //VS Edit /obj/effect/step_trigger/proc/Trigger(var/atom/movable/A) return 0 diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm index 8a9220e87f2..04046985c66 100644 --- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm +++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm @@ -44,3 +44,14 @@ icon_state = "explosionfast" duration = 4 // VOREStation Add End + +//VOREStation edit: medigun +/obj/effect/temp_visual/heal + name = "healing glow" + icon_state = "heal" + duration = 15 + +/obj/effect/temp_visual/heal/Initialize(mapload) + pixel_x = rand(-12, 12) + pixel_y = rand(-9, 0) +//VOREStation edit ends \ No newline at end of file diff --git a/code/game/objects/effects/temporary_visuals/projectiles/impact.dm b/code/game/objects/effects/temporary_visuals/projectiles/impact.dm index 872c652356a..d4f65fc9d10 100644 --- a/code/game/objects/effects/temporary_visuals/projectiles/impact.dm +++ b/code/game/objects/effects/temporary_visuals/projectiles/impact.dm @@ -79,3 +79,12 @@ light_range = 4 light_power = 3 light_color = "#3300ff" + +//VOREStation edit: medigun +/obj/effect/projectile/impact/medigun + icon = 'icons/obj/projectiles_vr.dmi' + icon_state = "impact_medbeam" + light_range = 2 + light_power = 0.5 + light_color = "#80F5FF" +//VOREStation edit ends \ No newline at end of file diff --git a/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm b/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm index 42511e65774..d901aeaa612 100644 --- a/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm +++ b/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm @@ -91,3 +91,12 @@ light_range = 4 light_power = 3 light_color = "#3300ff" + +//VOREStation edit: medigun +/obj/effect/projectile/muzzle/medigun + icon = 'icons/obj/projectiles_vr.dmi' + icon_state = "muzzle_medbeam" + light_range = 2 + light_power = 0.5 + light_color = "#80F5FF" +//VOREStation edit ends \ No newline at end of file diff --git a/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm b/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm index 54fa41265fb..59d56b6c7c4 100644 --- a/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm +++ b/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm @@ -1,4 +1,12 @@ -/proc/generate_tracer_between_points(datum/point/starting, datum/point/ending, beam_type, color, qdel_in = 5, light_range = 2, light_color_override, light_intensity = 1, instance_key) //Do not pass z-crossing points as that will not be properly (and likely will never be properly until it's absolutely needed) supported! +/datum/beam_components_cache + var/list/beam_components = list() + +/datum/beam_components_cache/Destroy() + for(var/component in beam_components) + qdel(component) + return ..() + +/proc/generate_tracer_between_points(datum/point/starting, datum/point/ending, datum/beam_components_cache/beam_components, beam_type, color, qdel_in = 5, light_range = 2, light_color_override, light_intensity = 1, instance_key) //Do not pass z-crossing points as that will not be properly (and likely will never be properly until it's absolutely needed) supported! if(!istype(starting) || !istype(ending) || !ispath(beam_type)) return var/datum/point/midpoint = point_midpoint_points(starting, ending) @@ -21,10 +29,9 @@ for(var/obj/effect/projectile_lighting/PL in T) if(PL.owner == instance_key) continue tracing_line - QDEL_IN(new /obj/effect/projectile_lighting(T, light_color_override, light_range, light_intensity, instance_key), qdel_in > 0? qdel_in : 5) + beam_components.beam_components += new /obj/effect/projectile_lighting(T, light_color_override, light_range, light_intensity, instance_key) line = null - if(qdel_in) - QDEL_IN(PB, qdel_in) + beam_components.beam_components += PB /obj/effect/projectile/tracer name = "beam" @@ -107,3 +114,12 @@ light_range = 4 light_power = 3 light_color = "#3300ff" + +//VOREStation edit: medigun +/obj/effect/projectile/tracer/medigun + icon = 'icons/obj/projectiles_vr.dmi' + icon_state = "medbeam" + light_range = 2 + light_power = 0.5 + light_color = "#80F5FF" +//VOREStation edit ends \ No newline at end of file diff --git a/code/game/objects/effects/temporary_visuals/temproary_visual.dm~1fb83e6... Merge pull request #5959 from elgeonmb_suit++ b/code/game/objects/effects/temporary_visuals/temproary_visual.dm~1fb83e6... Merge pull request #5959 from elgeonmb_suit++ deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 3ba9c1bac77..b651e2bfe23 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -492,13 +492,15 @@ var/list/global/slot_flags_enumeration = list( user << "You cannot locate any eyes on [M]!" return - if(U.get_accuracy_penalty(U)) //Should only trigger if they're not aiming well - var/hit_zone = get_zone_with_miss_chance(U.zone_sel.selecting, M, U.get_accuracy_penalty(U)) - if(!hit_zone) - U.do_attack_animation(M) - playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - visible_message("[U] attempts to stab [M] in the eyes, but misses!") - return + //this should absolutely trigger even if not aim-impaired in some way + var/hit_zone = get_zone_with_miss_chance(U.zone_sel.selecting, M, U.get_accuracy_penalty(U)) + if(!hit_zone) + U.do_attack_animation(M) + playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) + //visible_message("[U] attempts to stab [M] in the eyes, but misses!") + for(var/mob/V in viewers(M)) + V.show_message("[U] attempts to stab [M] in the eyes, but misses!") + return add_attack_logs(user,M,"Attack eyes with [name]") @@ -579,10 +581,9 @@ var/list/global/slot_flags_enumeration = list( if( !blood_overlay ) generate_blood_overlay() - //apply the blood-splatter overlay if it isn't already in there - if(!blood_DNA.len) - blood_overlay.color = blood_color - overlays += blood_overlay + //Make the blood_overlay have the proper color then apply it. + blood_overlay.color = blood_color + overlays += blood_overlay //if this blood isn't already in the list, add it if(istype(M)) @@ -591,6 +592,7 @@ var/list/global/slot_flags_enumeration = list( blood_DNA[M.dna.unique_enzymes] = M.dna.b_type return 1 //we applied blood to the item + /obj/item/proc/generate_blood_overlay() if(blood_overlay) return @@ -714,7 +716,7 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. icon = 'icons/obj/device.dmi' //Worn icon generation for on-mob sprites -/obj/item/proc/make_worn_icon(var/body_type,var/slot_name,var/inhands,var/default_icon,var/default_layer) +/obj/item/proc/make_worn_icon(var/body_type,var/slot_name,var/inhands,var/default_icon,var/default_layer,var/icon/clip_mask = null) //VOREStation edit - add 'clip mask' argument. //Get the required information about the base icon var/icon/icon2use = get_worn_icon_file(body_type = body_type, slot_name = slot_name, default_icon = default_icon, inhands = inhands) var/state2use = get_worn_icon_state(slot_name = slot_name) @@ -736,6 +738,8 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. if(!inhands) apply_custom(standing_icon) //Pre-image overridable proc to customize the thing apply_addblends(icon2use,standing_icon) //Some items have ICON_ADD blend shaders + if(istype(clip_mask)) //VOREStation Edit - For taur bodies/tails clipping off parts of uniforms and suits. + standing_icon = get_icon_difference(standing_icon, clip_mask, 1) var/image/standing = image(standing_icon) standing.alpha = alpha diff --git a/code/game/objects/items/bells.dm b/code/game/objects/items/bells.dm index 43046d22b77..c7aa08a440f 100644 --- a/code/game/objects/items/bells.dm +++ b/code/game/objects/items/bells.dm @@ -10,6 +10,7 @@ attack_verb = list("annoyed") var/static/radial_examine = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_examine") var/static/radial_use = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_use") + var/static/radial_pickup = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_pickup") /obj/item/weapon/deskbell/examine(mob/user) ..() @@ -26,6 +27,7 @@ //This defines the radials and what call we're assiging to them. var/list/options = list() options["examine"] = radial_examine + options["pick up"] = radial_pickup if(!broken) options["use"] = radial_use @@ -54,6 +56,9 @@ ring(user) add_fingerprint(user) + if("pick up") + ..() + /obj/item/weapon/deskbell/proc/ring(mob/user) if(user.a_intent == "harm") playsound(user.loc, 'sound/effects/deskbell_rude.ogg', 50, 1) @@ -78,9 +83,16 @@ to_chat(user,"You are not able to ring [src].") return 0 -/obj/item/weapon/deskbell/attackby(obj/item/i, mob/user, params) - if(!istype(i)) +/obj/item/weapon/deskbell/attackby(obj/item/W, mob/user, params) + if(!istype(W)) return + if(W.is_wrench() && isturf(loc)) + if(do_after(5)) + if(!src) return + to_chat(user, "You dissasemble the desk bell") + new /obj/item/stack/material/steel(get_turf(src), 1) + qdel(src) + return if(!broken) ring(user) diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 46c425bb897..1d1d591d57c 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -1096,7 +1096,7 @@ var/global/list/obj/item/device/pda/PDAs = list() P.conversations.Add("\ref[src]") - if (prob(15)) //Give the AI a chance of intercepting the message + if (prob(5) && security_level >= SEC_LEVEL_BLUE) //Give the AI a chance of intercepting the message //VOREStation Edit: no spam interception on lower codes + lower interception chance var/who = src.owner if(prob(50)) who = P.owner diff --git a/code/game/objects/items/devices/communicator/UI.dm b/code/game/objects/items/devices/communicator/UI.dm index e37587812a0..a4859c08a56 100644 --- a/code/game/objects/items/devices/communicator/UI.dm +++ b/code/game/objects/items/devices/communicator/UI.dm @@ -116,7 +116,7 @@ data["flashlight"] = fon data["manifest"] = PDA_Manifest data["feeds"] = compile_news() - data["latest_news"] = get_recent_news() + //data["latest_news"] = get_recent_news() //VOREStation Edit, bandaid for catastrophic runtime lag in helper.dm if(cartridge) // If there's a cartridge, we need to grab the information from it data["cart_devices"] = cartridge.get_device_status() data["cart_templates"] = cartridge.ui_templates diff --git a/code/game/objects/items/devices/defib.dm b/code/game/objects/items/devices/defib.dm index 26fb1b69aa8..b66c4a37765 100644 --- a/code/game/objects/items/devices/defib.dm +++ b/code/game/objects/items/devices/defib.dm @@ -610,12 +610,12 @@ return 1 /obj/item/weapon/shockpaddles/standalone/checked_use(var/charge_amt) - radiation_repository.radiate(src, charge_amt/12) //just a little bit of radiation. It's the price you pay for being powered by magic I guess + SSradiation.radiate(src, charge_amt/12) //just a little bit of radiation. It's the price you pay for being powered by magic I guess return 1 /obj/item/weapon/shockpaddles/standalone/process() if(fail_counter > 0) - radiation_repository.radiate(src, fail_counter--) + SSradiation.radiate(src, fail_counter--) else STOP_PROCESSING(SSobj, src) diff --git a/code/game/objects/items/devices/geiger.dm b/code/game/objects/items/devices/geiger.dm index 76697ddba30..92ff449855e 100644 --- a/code/game/objects/items/devices/geiger.dm +++ b/code/game/objects/items/devices/geiger.dm @@ -28,7 +28,7 @@ /obj/item/device/geiger/proc/get_radiation() if(!scanning) return - radiation_count = radiation_repository.get_rads_at_turf(get_turf(src)) + radiation_count = SSradiation.get_rads_at_turf(get_turf(src)) update_icon() update_sound() diff --git a/code/game/objects/items/devices/radio/encryptionkey_vr.dm b/code/game/objects/items/devices/radio/encryptionkey_vr.dm index 4d2debc3414..a70ad6f7df7 100644 --- a/code/game/objects/items/devices/radio/encryptionkey_vr.dm +++ b/code/game/objects/items/devices/radio/encryptionkey_vr.dm @@ -18,3 +18,9 @@ name = "research director's encryption key" icon_state = "rd_cypherkey" channels = list("Command" = 1, "Science" = 1, "Explorer" = 1) + +/obj/item/device/encryptionkey/ert + channels = list("Response Team" = 1, "Science" = 1, "Command" = 1, "Medical" = 1, "Engineering" = 1, "Security" = 1, "Supply" = 1, "Service" = 1, "Explorer" = 1) + +/obj/item/device/encryptionkey/omni //Literally only for the admin intercoms + channels = list("Mercenary" = 1, "Raider" = 1, "Response Team" = 1, "Science" = 1, "Command" = 1, "Medical" = 1, "Engineering" = 1, "Security" = 1, "Supply" = 1, "Service" = 1, "Explorer" = 1) diff --git a/code/game/objects/items/devices/radio/headset_vr.dm b/code/game/objects/items/devices/radio/headset_vr.dm index 46d4ead3d87..d7216ed2d4d 100644 --- a/code/game/objects/items/devices/radio/headset_vr.dm +++ b/code/game/objects/items/devices/radio/headset_vr.dm @@ -3,6 +3,7 @@ desc = "The headset of the boss's boss." icon_state = "cent_headset" item_state = "headset" + centComm = 1 ks2type = /obj/item/device/encryptionkey/ert /obj/item/device/radio/headset/centcom/alt @@ -13,5 +14,6 @@ name = "\improper NT radio headset" desc = "The headset of a Nanotrasen corporate employee." icon_state = "nt_headset" + centComm = 1 ks2type = /obj/item/device/encryptionkey/ert diff --git a/code/game/objects/items/devices/radio/radio_vr.dm b/code/game/objects/items/devices/radio/radio_vr.dm index 932229d0ad3..86a16280fc9 100644 --- a/code/game/objects/items/devices/radio/radio_vr.dm +++ b/code/game/objects/items/devices/radio/radio_vr.dm @@ -99,7 +99,7 @@ if((slot_flags & SLOT_BACK) && M.get_equipped_item(slot_back) == src) return 1 - if((slot_flags & SLOT_BELT) && M.get_equipped_item(slot_belt) == src) + if((slot_flags & SLOT_BACK) && M.get_equipped_item(slot_s_store) == src) return 1 return 0 diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index ec121bfed2f..90ae753da2e 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -1,3 +1,4 @@ +#define DEFIB_TIME_LIMIT (10 MINUTES) //VOREStation addition- past this many seconds, defib is useless. /* CONTAINS: T-RAY @@ -54,6 +55,8 @@ HALOGEN COUNTER - Radcount on mobs if (!(ishuman(user) || ticker) && ticker.mode.name != "monkey") to_chat(user, "You don't have the dexterity to do this!") return + + flick("[icon_state]-scan", src) //makes it so that it plays the scan animation on a succesful scan user.visible_message("[user] has analyzed [M]'s vitals.","You have analyzed [M]'s vitals.") if (!ishuman(M) || M.isSynthetic()) @@ -81,8 +84,13 @@ HALOGEN COUNTER - Radcount on mobs dat += "\tKey: Suffocation/Toxin/Burns/Brute
" dat += "\tDamage Specifics: [OX] - [TX] - [BU] - [BR]
" dat += "Body Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)
" - if(M.tod && (M.stat == DEAD || (M.status_flags & FAKEDEATH))) - dat += "Time of Death: [M.tod]
" + //VOREStation edit/addition starts + if(M.timeofdeath && (M.stat == DEAD || (M.status_flags & FAKEDEATH))) + dat += "Time of Death: [worldtime2stationtime(M.timeofdeath)]
" + var/tdelta = round(world.time - M.timeofdeath) + if(tdelta < (DEFIB_TIME_LIMIT * 10)) + dat += "Subject died [DisplayTimeText(tdelta)] ago - resuscitation may be possible!
" + //VOREStation edit/addition ends if(istype(M, /mob/living/carbon/human) && mode == 1) var/mob/living/carbon/human/H = M var/list/damaged = H.get_damaged_organs(1,1) @@ -501,3 +509,5 @@ HALOGEN COUNTER - Radcount on mobs else to_chat(user, "No radiation detected.") return + +#undef DEFIB_TIME_LIMIT //VOREStation addition \ No newline at end of file diff --git a/code/game/objects/items/poi_items.dm b/code/game/objects/items/poi_items.dm index 6fd6d7debdd..c12a3a655aa 100644 --- a/code/game/objects/items/poi_items.dm +++ b/code/game/objects/items/poi_items.dm @@ -13,7 +13,7 @@ return ..() /obj/item/poi/pascalb/process() - radiation_repository.radiate(src, 5) + SSradiation.radiate(src, 5) /obj/item/poi/pascalb/Destroy() STOP_PROCESSING(SSobj, src) @@ -41,7 +41,7 @@ return ..() /obj/item/poi/brokenoldreactor/process() - radiation_repository.radiate(src, 25) + SSradiation.radiate(src, 25) /obj/item/poi/brokenoldreactor/Destroy() STOP_PROCESSING(SSobj, src) diff --git a/code/game/objects/items/robot/robot_upgrades_vr.dm b/code/game/objects/items/robot/robot_upgrades_vr.dm index a3c77099440..13f09a980d6 100644 --- a/code/game/objects/items/robot/robot_upgrades_vr.dm +++ b/code/game/objects/items/robot/robot_upgrades_vr.dm @@ -6,6 +6,7 @@ R.add_language(LANGUAGE_ECUREUILIAN, 1) R.add_language(LANGUAGE_DAEMON, 1) R.add_language(LANGUAGE_ENOCHIAN, 1) + R.add_language(LANGUAGE_SLAVIC, 1) return 1 else return 0 diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 6a51e9eb176..612a14c4d4f 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -220,6 +220,7 @@ W.heal_damage(heal_brute) playsound(src, pick(apply_sounds), 25) used = 1 //VOREStation Edit + update_icon() // VOREStation Edit - Support for stack icons affecting.update_damages() if(used == amount) if(affecting.is_bandaged()) @@ -266,6 +267,7 @@ use(1) affecting.salve() playsound(src, pick(apply_sounds), 25) + update_icon() // VOREStation Edit - Support for stack icons /obj/item/stack/medical/splint name = "medical splints" diff --git a/code/game/objects/items/stacks/medical_vr.dm b/code/game/objects/items/stacks/medical_vr.dm new file mode 100644 index 00000000000..eda72a3fce9 --- /dev/null +++ b/code/game/objects/items/stacks/medical_vr.dm @@ -0,0 +1,21 @@ +/obj/item/stack/medical/advanced + icon = 'icons/obj/stacks_vr.dmi' + +/obj/item/stack/medical/advanced/Initialize() + . = ..() + update_icon() + +/obj/item/stack/medical/advanced/update_icon() + switch(amount) + if(1 to 2) + icon_state = initial(icon_state) + if(3 to 4) + icon_state = "[initial(icon_state)]_4" + if(5 to 6) + icon_state = "[initial(icon_state)]_6" + if(7 to 8) + icon_state = "[initial(icon_state)]_8" + if(9) + icon_state = "[initial(icon_state)]_9" + else + icon_state = "[initial(icon_state)]_10" \ No newline at end of file diff --git a/code/game/objects/items/stacks/nanopaste.dm b/code/game/objects/items/stacks/nanopaste.dm index 7b156c025ff..1170fedc04f 100644 --- a/code/game/objects/items/stacks/nanopaste.dm +++ b/code/game/objects/items/stacks/nanopaste.dm @@ -29,18 +29,21 @@ if (istype(M,/mob/living/carbon/human)) //Repairing robolimbs var/mob/living/carbon/human/H = M var/obj/item/organ/external/S = H.get_organ(user.zone_sel.selecting) - + //VOREStation Edit Start if (S && (S.robotic >= ORGAN_ROBOT)) if(!S.get_damage()) - user << "Nothing to fix here." + to_chat(user, "Nothing to fix here.") + else if((S.open < 2) && (S.brute_dam + S.burn_dam >= S.min_broken_damage) && !repair_external) + to_chat(user, "The damage is too extensive for this nanite swarm to handle.") else if(can_use(1)) user.setClickCooldown(user.get_attack_speed(src)) if(S.open >= 2) if(do_after(user,5 * toolspeed)) - S.heal_damage(20, 20, robo_repair = 1) + S.heal_damage(restoration_internal, restoration_internal, robo_repair = 1) else if(do_after(user,5 * toolspeed)) - S.heal_damage(10,10, robo_repair =1) + S.heal_damage(restoration_external,restoration_external, robo_repair =1) H.updatehealth() use(1) user.visible_message("\The [user] applies some nanite paste on [user != M ? "[M]'s [S.name]" : "[S]"] with [src].",\ "You apply some nanite paste on [user == M ? "your" : "[M]'s"] [S.name].") + //VOREStation Edit End diff --git a/code/game/objects/items/stacks/nanopaste_vr.dm b/code/game/objects/items/stacks/nanopaste_vr.dm new file mode 100644 index 00000000000..cd39b61fef4 --- /dev/null +++ b/code/game/objects/items/stacks/nanopaste_vr.dm @@ -0,0 +1,13 @@ +/obj/item/stack/nanopaste + var/restoration_external = 5 + var/restoration_internal = 20 + var/repair_external = FALSE + +/obj/item/stack/nanopaste/advanced + name = "advanced nanopaste" + singular_name = "advanced nanite swarm" + desc = "A tube of paste containing swarms of repair nanites. Very effective in repairing robotic machinery. These ones are capable of restoring condition even of most thrashed robotic parts" + icon = 'icons/obj/stacks_vr.dmi' + icon_state = "adv_nanopaste" + restoration_external = 10 + repair_external = TRUE \ No newline at end of file diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index 93c70930d18..7c441e8169f 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -202,4 +202,12 @@ name = "roofing" singular_name = "roofing" desc = "A section of roofing material. You can use it to repair the ceiling, or expand it." - icon_state = "techtile_grid" \ No newline at end of file + icon_state = "techtile_grid" + +/obj/item/stack/tile/roofing/cyborg + name = "roofing synthesizer" + desc = "A device that makes roofing tiles." + uses_charge = 1 + charge_costs = list(250) + stacktype = /obj/item/stack/tile/roofing + build_type = /obj/item/stack/tile/roofing \ No newline at end of file diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm index 3d9c4ea140c..dd3ddb29caf 100644 --- a/code/game/objects/items/trash.dm +++ b/code/game/objects/items/trash.dm @@ -76,6 +76,10 @@ name = "\improper \"LiquidFood\" ration" icon_state = "liquidfood" +/obj/item/trash/liquidprotein + name = "\improper \"LiquidProtein\" ration" + icon_state = "liquidprotein" + /obj/item/trash/tastybread name = "bread tube" icon_state = "tastybread" diff --git a/code/game/objects/items/trash_vr.dm b/code/game/objects/items/trash_vr.dm index 43cadda3f70..20f7e32c4c4 100644 --- a/code/game/objects/items/trash_vr.dm +++ b/code/game/objects/items/trash_vr.dm @@ -26,11 +26,6 @@ return ..() -/obj/item/trash/liquidprotein - name = "\improper \"LiquidProtein\" ration" - icon = 'icons/obj/trash_vr.dmi' - icon_state = "liquidprotein" - /obj/item/trash/fancyplate name = "dirty fancy plate" icon = 'icons/obj/trash_vr.dmi' diff --git a/code/game/objects/items/weapons/circuitboards/computer/computer.dm b/code/game/objects/items/weapons/circuitboards/computer/computer.dm index 8bc26a13f1d..2190650d67e 100644 --- a/code/game/objects/items/weapons/circuitboards/computer/computer.dm +++ b/code/game/objects/items/weapons/circuitboards/computer/computer.dm @@ -191,3 +191,8 @@ name = T_BOARD("RCON remote control console") build_path = /obj/machinery/computer/rcon origin_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 3, TECH_POWER = 5) + +/obj/item/weapon/circuitboard/shutoff_monitor + name = T_BOARD("automatic shutoff valve monitor") + build_path = /obj/machinery/computer/shutoff_monitor + origin_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 4) \ No newline at end of file diff --git a/code/game/objects/items/weapons/circuitboards/frame.dm b/code/game/objects/items/weapons/circuitboards/frame.dm index 913506c9e65..6b59d13ea56 100644 --- a/code/game/objects/items/weapons/circuitboards/frame.dm +++ b/code/game/objects/items/weapons/circuitboards/frame.dm @@ -144,6 +144,14 @@ build_path = /obj/machinery/recharger/wallcharger board_type = new /datum/frame/frame_types/wall_charger +/obj/item/weapon/circuitboard/cell_charger + name = T_BOARD("heavy-duty cell charger") + build_path = /obj/machinery/cell_charger + board_type = new /datum/frame/frame_types/cell_charger + req_components = list( + /obj/item/weapon/stock_parts/capacitor = 1, + /obj/item/stack/cable_coil = 5) + /obj/item/weapon/circuitboard/washing name = T_BOARD("washing machine") build_path = /obj/machinery/washing_machine @@ -162,6 +170,15 @@ /obj/item/weapon/stock_parts/gear = 1, /obj/item/weapon/reagent_containers/glass/beaker/large = 1) +/obj/item/weapon/circuitboard/distiller + build_path = /obj/machinery/portable_atmospherics/powered/reagent_distillery + board_type = new /datum/frame/frame_types/reagent_distillery + req_components = list( + /obj/item/weapon/stock_parts/capacitor = 1, + /obj/item/weapon/stock_parts/micro_laser = 1, + /obj/item/weapon/stock_parts/motor = 2, + /obj/item/weapon/stock_parts/gear = 1) + /obj/item/weapon/circuitboard/teleporter_hub name = T_BOARD("teleporter hub") build_path = /obj/machinery/teleport/hub diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm index 43e7e0f90cc..d4a29d47f33 100644 --- a/code/game/objects/items/weapons/explosives.dm +++ b/code/game/objects/items/weapons/explosives.dm @@ -97,6 +97,23 @@ name = "seismic charge" desc = "Used to dig holes in specific areas without too much extra hole." - blast_heavy = 3 - blast_light = 5 - blast_flash = 8 + blast_heavy = 2 + blast_light = 4 + blast_flash = 7 + +/obj/item/weapon/plastique/seismic/attackby(var/obj/item/I, var/mob/user) + . = ..() + if(open_panel) + if(istype(I, /obj/item/weapon/stock_parts/micro_laser)) + var/obj/item/weapon/stock_parts/SP = I + var/new_blast_power = max(1, round(SP.rating / 2) + 1) + if(new_blast_power > blast_heavy) + to_chat(user, "You install \the [I] into \the [src].") + user.drop_from_inventory(I) + qdel(I) + blast_heavy = new_blast_power + blast_light = blast_heavy + round(new_blast_power * 0.5) + blast_flash = blast_light + round(new_blast_power * 0.75) + else + to_chat(user, "The [I] is not any better than the component already installed into this charge!") + return . \ No newline at end of file diff --git a/code/game/objects/items/weapons/explosives_vr.dm b/code/game/objects/items/weapons/explosives_vr.dm new file mode 100644 index 00000000000..a82ca02bbc8 --- /dev/null +++ b/code/game/objects/items/weapons/explosives_vr.dm @@ -0,0 +1,17 @@ +/obj/item/weapon/plastique/seismic/locked + desc = "Used to dig holes in specific areas without too much extra hole. Has extra mechanism that safely implodes the bomb if it is used in close proximity to the facility." + +/obj/item/weapon/plastique/seismic/locked/explode(var/location) + if(!target) + target = get_atom_on_turf(src) + if(!target) + target = src + + var/turf/T = get_turf(target) + if(T.z in using_map.map_levels) + target.visible_message("\The [src] lets out a loud beep as safeties trigger, before imploding and falling apart.") + target.overlays -= image_overlay + qdel(src) + return 0 + else + return ..() \ No newline at end of file diff --git a/code/game/objects/items/weapons/grenades/spawnergrenade_vr.dm b/code/game/objects/items/weapons/grenades/spawnergrenade_vr.dm new file mode 100644 index 00000000000..56204be9849 --- /dev/null +++ b/code/game/objects/items/weapons/grenades/spawnergrenade_vr.dm @@ -0,0 +1,30 @@ +/obj/item/weapon/grenade/spawnergrenade/manhacks/station/locked + desc = "It is set to detonate in 5 seconds. It will deploy three weaponized survey drones. This one has a safety interlock that prevents release if used while in proximity to the facility." + req_access = list(access_armory) //for toggling safety + var/locked = 1 + +/obj/item/weapon/grenade/spawnergrenade/manhacks/station/locked/detonate() + if(locked) + var/turf/T = get_turf(src) + if(T.z in using_map.map_levels) + icon_state = initial(icon_state) + active = 0 + return 0 + return ..() + +/obj/item/weapon/grenade/spawnergrenade/manhacks/station/locked/attackby(obj/item/I, mob/user) + var/obj/item/weapon/card/id/id = I.GetID() + if(istype(id)) + if(check_access(id)) + locked = !locked + to_chat(user, "You [locked ? "enable" : "disable"] the safety lock on \the [src].") + else + to_chat(user, "Access denied.") + user.visible_message("[user] swipes \the [I] against \the [src].") + else + return ..() + +/obj/item/weapon/grenade/spawnergrenade/manhacks/station/locked/emag_act(var/remaining_charges,var/mob/user) + ..() + locked = !locked + to_chat(user, "You [locked ? "enable" : "disable"] the safety lock on \the [src]!") \ No newline at end of file diff --git a/code/game/objects/items/weapons/id cards/station_ids.dm b/code/game/objects/items/weapons/id cards/station_ids.dm index c157d424925..4d37f154b36 100644 --- a/code/game/objects/items/weapons/id cards/station_ids.dm +++ b/code/game/objects/items/weapons/id cards/station_ids.dm @@ -31,6 +31,7 @@ var/dorm = 0 // determines if this ID has claimed a dorm already var/mining_points = 0 // For redeeming at mining equipment vendors + var/survey_points = 0 // For redeeming at explorer equipment vendors. /obj/item/weapon/card/id/examine(mob/user) set src in oview(1) @@ -170,7 +171,7 @@ /obj/item/weapon/card/id/synthetic/Initialize() . = ..() - access = get_all_station_access() + access_synth + access = get_all_station_access().Copy() + access_synth /obj/item/weapon/card/id/centcom name = "\improper CentCom. ID" @@ -181,7 +182,7 @@ /obj/item/weapon/card/id/centcom/Initialize() . = ..() - access = get_all_centcom_access() + access = get_all_centcom_access().Copy() /obj/item/weapon/card/id/centcom/station/Initialize() . = ..() diff --git a/code/game/objects/items/weapons/implants/implant_vr.dm b/code/game/objects/items/weapons/implants/implant_vr.dm index bec23b4c2b8..17d1d6f6d24 100644 --- a/code/game/objects/items/weapons/implants/implant_vr.dm +++ b/code/game/objects/items/weapons/implants/implant_vr.dm @@ -33,6 +33,7 @@ source.add_language(LANGUAGE_BIRDSONG) source.add_language(LANGUAGE_SAGARU) source.add_language(LANGUAGE_CANILUNZT) + source.add_language(LANGUAGE_SLAVIC) source.add_language(LANGUAGE_SOL_COMMON) //In case they're giving a xenomorph an implant or something. /obj/item/weapon/implant/vrlanguage/post_implant(mob/source) diff --git a/code/game/objects/items/weapons/manuals.dm b/code/game/objects/items/weapons/manuals.dm index 0db669545c9..4911846d65b 100644 --- a/code/game/objects/items/weapons/manuals.dm +++ b/code/game/objects/items/weapons/manuals.dm @@ -98,11 +98,11 @@

OPERATING PRINCIPLES


-
  • The supermatter crystal serves as the fundamental power source of the engine. Upon being charged, it begins to emit large amounts of heat and radiation, as well and oxygen and phoron gas. As oxygen accelerates the reaction, and phoron carries the risk of fire, these must be filtered out. NOTE: Supermatter radiation will not charge radiation collectors.
  • +
  • The supermatter crystal serves as the fundamental power source of the engine. Upon being charged, it begins to emit large amounts of heat and radiation, as well and oxygen and phoron gas. As oxygen accelerates the reaction and reacts with phoron to start a fire, it must be filtered out. It's recommended to filter out all gases besides nitrogen for standard operation.

  • -
  • Air in the reactor chamber housing the supermatter is circulated through the reactor loop, which passes through the filters and thermoelectric generators. The thermoelectric generators transfer heat from the reactor loop to the colder radiator loop, thereby generating power. Additional power is generated from internal turbines in the circulators.
  • +
  • Gas in the reactor chamber housing the supermatter is circulated through the reactor loop, which passes through the filters and thermoelectric generators. The thermoelectric generators transfer heat from the reactor loop to the colder radiator loop, thereby generating power. Additional power is generated from internal turbines in the circulators.

  • -
  • Air in the radiator loop is circulated through the radiator bank, located in space. This rapidly cools the air, preserving the temperature differential needed for power generation.
  • +
  • Gas in the radiator loop is circulated through the radiator bank, located in space. This rapidly cools the air, preserving the temperature differential needed for power generation.

  • The MK 1 Prototype Thermoelectric Supermatter Engine is designed to operate at reactor temperatures of 3000K to 4000K and generate up to 1MW of power. Beyond 1MW, the thermoelectric generators will begin to lose power through electrical discharge, reducing efficiency, but additional power generation remains feasible.

  • @@ -113,19 +113,25 @@
  • Do not allow supermatter to contact any solid object apart from specially-designed supporting pallet.
  • Do not directly view supermatter without meson goggles.
  • While handles on pallet allow moving the supermatter via pulling, pushing should not be attempted.
  • +
  • Note that prosthetics do not protect against radiation or viewing the supermatter.

  • -

    STARTUP PROCEDURE

    +

    STANDARD STARTUP PROCEDURE

      -
    1. Fill reactor loop and radiator loop with two (2) standard canisters of nitrogen gas each.
    2. -
    3. Ensure that pumps and filters are on and operating at maximum power.
    4. -
    5. Fire 8-9 pulses from emitter at supermatter crystal. Reactor blast doors must be open for this procedure.
    6. +
    7. Fill reactor loop and radiator loop with three (3) standard canisters of nitrogen gas each.
    8. +
    9. Fill the waste handling radiator loop with one (1) standard canister of carbon dioxide gas.
    10. +
    11. Enable both the high power gas pumps near the thermo-electric generators and maximize the desired output.
    12. +
    13. Enable both the omni-filters and ensure they are set to filter nitrogen back into the system.
    14. +
    15. Enable the gas pump from the filters to waste handling and maximize the desired output.
    16. +
    17. Close the monitoring room blast doors and open the reactor blast doors,
    18. +
    19. Fire 8-9 pulses from emitter at supermatter crystal. The expected power output is around a megawatt. NOTE: It will take a few minutes to heat up.
    20. +
    21. Close the reactor blast doors and keep the monitoring room blast doors closed to prevent radiation leaking.

    OPERATION AND MAINTENANCE

    1. Ensure that radiation protection and meson goggles are worn at all times while working in the engine room.
    2. Ensure that reactor and radiator loops are undamaged and unobstructed.
    3. -
    4. Ensure that phoron and oxygen gas exhaust from filters is properly contained or disposed. Do not allow exhaust pressure to exceed 4500 kPa.
    5. +
    6. Ensure that, in a standard setup, only nitrogen is being filtered back into the system. Do not allow exhaust pressure to exceed 4500 kPa.
    7. Ensure that engine room Area Power Controller (APC) and engine Superconducting Magnetic Energy Storage unit (SMES) are properly charged.
    8. Ensure that reactor temperature does not exceed 5000K. In event of reactor temperature exceeding 5000K, see EMERGENCY COOLING PROCEDURE.
    9. In event of imminent and/or unavoidable delamination, see EJECTION PROCEDURE.
    10. @@ -135,12 +141,14 @@
      1. Open Emergency Cooling Valve 1 and Emergency Cooling Valve 2.
      2. When reactor temperature returns to safe operating levels, close Emergency Cooling Valve 1 and Emergency Cooling Valve 2.
      3. +
      4. Adding additional gas to the loops can have a positive effect in reducing reactor temperature.
      5. If reactor temperature does not return to safe operating levels, see EJECTION PROCEDURE.

      EJECTION PROCEDURE

        -
      1. Press Engine Ventilatory Control button to open engine core vent to space.
      2. +
      3. Ensure the engine room has power. The blast doors and ejection platform are unresponsive without power.
      4. +
      5. Press Engine Ventilatory Control button to open engine core blast door to space.
      6. Press Emergency Core Eject button to eject supermatter crystal. NOTE: Attempting crystal ejection while engine core vent is closed will result in ejection failure.
      7. In event of ejection failure, pending
      diff --git a/code/game/objects/items/weapons/material/material_weapons.dm b/code/game/objects/items/weapons/material/material_weapons.dm index 4f08c61a4c1..a911d1e1375 100644 --- a/code/game/objects/items/weapons/material/material_weapons.dm +++ b/code/game/objects/items/weapons/material/material_weapons.dm @@ -42,6 +42,9 @@ if(!isnull(matter[material_type])) matter[material_type] *= force_divisor // May require a new var instead. + if(!(material.conductive)) + src.flags |= NOCONDUCT + /obj/item/weapon/material/get_material() return material @@ -67,7 +70,7 @@ if(applies_material_colour) color = material.icon_colour if(material.products_need_process()) - START_PROCESSING(SSobj, src) + START_PROCESSING(SSobj, src) update_force() /obj/item/weapon/material/Destroy() diff --git a/code/game/objects/items/weapons/material/shards.dm b/code/game/objects/items/weapons/material/shards.dm index ba7438a6851..937391737ac 100644 --- a/code/game/objects/items/weapons/material/shards.dm +++ b/code/game/objects/items/weapons/material/shards.dm @@ -61,6 +61,58 @@ return return ..() +/obj/item/weapon/material/shard/afterattack(var/atom/target, mob/living/carbon/human/user as mob) + var/active_hand //hand the shard is in + var/will_break + var/gloves_are_heavy = FALSE//this is a fucking mess + var/break_damage = 4 + var/light_glove_d = rand(2, 4) + var/no_glove_d = rand(4, 6) + var/list/h_gloves = list(/obj/item/clothing/gloves/captain, /obj/item/clothing/gloves/cyborg, + /obj/item/clothing/gloves/swat, /obj/item/clothing/gloves/combat, + /obj/item/clothing/gloves/botanic_leather, /obj/item/clothing/gloves/duty, + /obj/item/clothing/gloves/tactical, /obj/item/clothing/gloves/vox, + /obj/item/clothing/gloves/gauntlets) + + if(istype(user.l_hand, src)) + active_hand = BP_L_HAND + else + active_hand = BP_R_HAND + + if(prob(75)) + will_break = TRUE + else + will_break = FALSE + + if(user.gloves && (user.gloves.body_parts_covered & HANDS)) + var/obj/item/clothing/gloves/UG = user.gloves.type + for(var/I in h_gloves) + if(UG == I) + gloves_are_heavy = TRUE + if(will_break) + user.visible_message("[user] hit \the [target] with \the [src], shattering it!", "You shatter \the [src] in your hand!") + playsound(user, pick('sound/effects/Glassbr1.ogg', 'sound/effects/Glassbr2.ogg', 'sound/effects/Glassbr3.ogg'), 30, 1) + qdel(src) + + if(gloves_are_heavy == FALSE) + to_chat(user, "\The [src] partially cuts into your hand through your gloves as you hit \the [target]!") + if(will_break) + user.visible_message("[user] hit \the [target] with \the [src], shattering it!", "You shatter \the [src] in your hand!") + user.apply_damage(light_glove_d + break_damage, BRUTE, active_hand, 0 ,0, src, src.sharp, src.edge) + playsound(user, pick('sound/effects/Glassbr1.ogg', 'sound/effects/Glassbr2.ogg', 'sound/effects/Glassbr3.ogg'), 30, 1) + qdel(src) + else + user.apply_damage(light_glove_d, BRUTE, active_hand, 0 ,0, src, src.sharp, src.edge) + else + to_chat(user, "\The [src] cuts into your hand as you hit \the [target]!") + if(will_break) + user.visible_message("[user] hit \the [target] with \the [src], shattering it!", "You shatter \the [src] in your hand!") + user.apply_damage(no_glove_d + break_damage, BRUTE, active_hand, 0 ,0, src, src.sharp, src.edge) + playsound(user, pick('sound/effects/Glassbr1.ogg', 'sound/effects/Glassbr2.ogg', 'sound/effects/Glassbr3.ogg'), 30, 1) + qdel(src) + else + user.apply_damage(no_glove_d, BRUTE, active_hand, 0 ,0, src, src.sharp, src.edge) + /obj/item/weapon/material/shard/Crossed(AM as mob|obj) ..() if(isliving(AM)) diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm index f825577d6ff..d935d4eaa29 100644 --- a/code/game/objects/items/weapons/melee/energy.dm +++ b/code/game/objects/items/weapons/melee/energy.dm @@ -12,6 +12,12 @@ var/lpower = 2 var/lcolor = "#0099FF" + // If it uses energy. + var/use_cell = FALSE + var/hitcost = 120 + var/obj/item/weapon/cell/bcell = null + var/cell_type = /obj/item/weapon/cell/device + /obj/item/weapon/melee/energy/proc/activate(mob/living/user) if(active) return @@ -38,7 +44,31 @@ w_class = initial(w_class) set_light(0,0) +/obj/item/weapon/melee/energy/proc/use_charge(var/cost) + if(active) + if(bcell) + if(bcell.checked_use(cost)) + return 1 + else + return 0 + return null + +/obj/item/weapon/melee/energy/examine(mob/user) + if(!..(user, 1)) + return + + if(use_cell) + if(bcell) + to_chat(user, "The blade is [round(bcell.percent())]% charged.") + if(!bcell) + to_chat(user, "The blade does not have a power source installed.") + /obj/item/weapon/melee/energy/attack_self(mob/living/user as mob) + if(use_cell) + if((!bcell || bcell.charge < hitcost) && !active) + to_chat(user, "\The [src] does not seem to have power.") + return + var/datum/gender/TU = gender_datums[user.get_visible_gender()] if (active) if ((CLUMSY in user.mutations) && prob(50)) @@ -64,6 +94,37 @@ "\The [user] is falling on \the [src]! It looks like [TU.he] [TU.is] trying to commit suicide.")) return (BRUTELOSS|FIRELOSS) +/obj/item/weapon/melee/energy/attack(mob/M, mob/user) + if(active && use_cell) + if(!use_charge(hitcost)) + deactivate(user) + visible_message("\The [src]'s blade flickers, before deactivating.") + return ..() + +/obj/item/weapon/melee/energy/attackby(obj/item/weapon/W, mob/user) + if(use_cell) + if(istype(W, cell_type)) + if(!bcell) + user.drop_item() + W.loc = src + bcell = W + to_chat(user, "You install a cell in [src].") + update_icon() + else + to_chat(user, "[src] already has a cell.") + else if(W.is_screwdriver() && bcell) + bcell.update_icon() + bcell.forceMove(get_turf(loc)) + bcell = null + to_chat(user, "You remove the cell from \the [src].") + deactivate() + update_icon() + return + return ..() + +/obj/item/weapon/melee/energy/get_cell() + return bcell + /* * Energy Axe */ @@ -90,11 +151,13 @@ /obj/item/weapon/melee/energy/axe/activate(mob/living/user) ..() + damtype = SEARING icon_state = "axe1" to_chat(user, "\The [src] is now energised.") /obj/item/weapon/melee/energy/axe/deactivate(mob/living/user) ..() + damtype = BRUTE icon_state = initial(icon_state) to_chat(user, "\The [src] is de-energised. It's just a regular axe now.") @@ -103,6 +166,20 @@ visible_message("\The [user] swings \the [src] towards [TU.his] head! It looks like [TU.he] [TU.is] trying to commit suicide.") return (BRUTELOSS|FIRELOSS) +/obj/item/weapon/melee/energy/axe/charge + name = "charge axe" + desc = "An energised axe." + active_force = 35 + active_throwforce = 20 + force = 15 + + use_cell = TRUE + hitcost = 120 + +/obj/item/weapon/melee/energy/axe/charge/loaded/New() + ..() + bcell = new/obj/item/weapon/cell/device/weapon(src) + /* * Energy Sword */ @@ -274,64 +351,7 @@ armor_penetration = 25 projectile_parry_chance = 40 - var/hitcost = 75 - var/obj/item/weapon/cell/bcell = null - var/cell_type = /obj/item/weapon/cell/device - -/obj/item/weapon/melee/energy/sword/charge/proc/use_charge(var/cost) - if(active) - if(bcell) - if(bcell.checked_use(cost)) - return 1 - else - return 0 - return null - -/obj/item/weapon/melee/energy/sword/charge/examine(mob/user) - if(!..(user, 1)) - return - - if(bcell) - to_chat(user, "The blade is [round(bcell.percent())]% charged.") - if(!bcell) - to_chat(user, "The blade does not have a power source installed.") - -/obj/item/weapon/melee/energy/sword/charge/attack_self(mob/user as mob) - if((!bcell || bcell.charge < hitcost) && !active) - to_chat(user, "\The [src] does not seem to have power.") - return - ..() - -/obj/item/weapon/melee/energy/sword/charge/attack(mob/M, mob/user) - if(active) - if(!use_charge(hitcost)) - deactivate(user) - visible_message("\The [src]'s blade flickers, before retracting.") - return ..() - -/obj/item/weapon/melee/energy/sword/charge/attackby(obj/item/weapon/W, mob/user) - if(istype(W, cell_type)) - if(!bcell) - user.drop_item() - W.loc = src - bcell = W - to_chat(user, "You install a cell in [src].") - update_icon() - else - to_chat(user, "[src] already has a cell.") - else if(W.is_screwdriver() && bcell) - bcell.update_icon() - bcell.forceMove(get_turf(loc)) - bcell = null - to_chat(user, "You remove the cell from \the [src].") - deactivate() - update_icon() - return - else - ..() - -/obj/item/weapon/melee/energy/sword/charge/get_cell() - return bcell + hitcost = 75 /obj/item/weapon/melee/energy/sword/charge/loaded/New() ..() diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm index 0cfdd4792dd..f8669aef9d9 100644 --- a/code/game/objects/items/weapons/mop.dm +++ b/code/game/objects/items/weapons/mop.dm @@ -10,6 +10,7 @@ GLOBAL_LIST_BOILERPLATE(all_mops, /obj/item/weapon/mop) throw_speed = 5 throw_range = 10 w_class = ITEMSIZE_NORMAL + flags = NOCONDUCT attack_verb = list("mopped", "bashed", "bludgeoned", "whacked") var/mopping = 0 var/mopcount = 0 diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index 7d754d8f147..1d1934bf8a8 100644 --- a/code/game/objects/items/weapons/storage/fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy.dm @@ -67,6 +67,7 @@ item_state = "candlebox5" throwforce = 2 slot_flags = SLOT_BELT + max_storage_space = ITEMSIZE_COST_SMALL * 5 starts_with = list(/obj/item/weapon/flame/candle = 5) /obj/item/weapon/storage/fancy/whitecandle_box @@ -78,6 +79,7 @@ item_state = "whitecandlebox5" throwforce = 2 slot_flags = SLOT_BELT + max_storage_space = ITEMSIZE_COST_SMALL * 5 starts_with = list(/obj/item/weapon/flame/candle/white = 5) /obj/item/weapon/storage/fancy/blackcandle_box @@ -89,6 +91,7 @@ item_state = "blackcandlebox5" throwforce = 2 slot_flags = SLOT_BELT + max_storage_space = ITEMSIZE_COST_SMALL * 5 starts_with = list(/obj/item/weapon/flame/candle/black = 5) @@ -179,6 +182,21 @@ return ..() +/* + * Cracker Packet + */ + +/obj/item/weapon/storage/fancy/crackers + name = "\improper Getmore Crackers" + icon = 'icons/obj/food.dmi' + icon_state = "crackerbox" + icon_type = "cracker" + max_storage_space = ITEMSIZE_COST_TINY * 6 + max_w_class = ITEMSIZE_TINY + w_class = ITEMSIZE_SMALL + can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/cracker) + starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/cracker = 6) + //////////// //CIG PACK// //////////// diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm index 3555a314f7f..2fd85ec7c2e 100644 --- a/code/game/objects/items/weapons/storage/firstaid.dm +++ b/code/game/objects/items/weapons/storage/firstaid.dm @@ -156,7 +156,6 @@ /obj/item/weapon/storage/firstaid/clotting name = "clotting kit" desc = "Contains chemicals to stop bleeding." - icon_state = "clottingkit" // VOREStation edit max_storage_space = ITEMSIZE_COST_SMALL * 7 starts_with = list(/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/clotting = 8) diff --git a/code/game/objects/items/weapons/storage/firstaid_vr.dm b/code/game/objects/items/weapons/storage/firstaid_vr.dm index 6f9bf71fb46..7cc415d9384 100644 --- a/code/game/objects/items/weapons/storage/firstaid_vr.dm +++ b/code/game/objects/items/weapons/storage/firstaid_vr.dm @@ -1,64 +1,97 @@ +/obj/item/weapon/storage/firstaid/clotting + icon_state = "clottingkit" + +/obj/item/weapon/storage/firstaid/bonemed + icon_state = "pinky" + /obj/item/weapon/storage/pill_bottle/adminordrazine - name = "bottle of Adminordrazine pills" + name = "pill bottle (Adminordrazine)" desc = "It's magic. We don't have to explain it." starts_with = list(/obj/item/weapon/reagent_containers/pill/adminordrazine = 21) /obj/item/weapon/storage/pill_bottle/nutriment - name = "bottle of Food pills" + name = "pill bottle (Food)" desc = "Contains pills used to feed people." starts_with = list(/obj/item/weapon/reagent_containers/pill/nutriment = 7, /obj/item/weapon/reagent_containers/pill/protein = 7) /obj/item/weapon/storage/pill_bottle/rezadone - name = "bottle of Rezadone pills" + name = "pill bottle (Rezadone)" desc = "A powder with almost magical properties, this substance can effectively treat genetic damage in humanoids, though excessive consumption has side effects." starts_with = list(/obj/item/weapon/reagent_containers/pill/rezadone = 7) + wrapper_color = COLOR_GREEN_GRAY /obj/item/weapon/storage/pill_bottle/peridaxon - name = "bottle of Peridaxon pills" + name = "pill bottle (Peridaxon)" desc = "Used to encourage recovery of internal organs and nervous systems. Medicate cautiously." starts_with = list(/obj/item/weapon/reagent_containers/pill/peridaxon = 7) + wrapper_color = COLOR_PURPLE /obj/item/weapon/storage/pill_bottle/carthatoline - name = "bottle of Carthatoline pills" + name = "pill bottle (Carthatoline)" desc = "Carthatoline is strong evacuant used to treat severe poisoning." starts_with = list(/obj/item/weapon/reagent_containers/pill/carthatoline = 7) + wrapper_color = COLOR_GREEN_GRAY /obj/item/weapon/storage/pill_bottle/alkysine - name = "bottle of Alkysine pills" + name = "pill bottle (Alkysine)" desc = "Alkysine is a drug used to lessen the damage to neurological tissue after a catastrophic injury. Can heal brain tissue." starts_with = list(/obj/item/weapon/reagent_containers/pill/alkysine = 7) + wrapper_color = COLOR_YELLOW /obj/item/weapon/storage/pill_bottle/imidazoline - name = "bottle of Imidazoline pills" + name = "pill bottle (Imidazoline)" desc = "Heals eye damage." starts_with = list(/obj/item/weapon/reagent_containers/pill/imidazoline = 7) + wrapper_color = COLOR_PURPLE_GRAY /obj/item/weapon/storage/pill_bottle/osteodaxon - name = "bottle of Osteodaxon pills" + name = "pill bottle (Osteodaxon)" desc = "An experimental drug used to heal bone fractures." starts_with = list(/obj/item/weapon/reagent_containers/pill/osteodaxon = 7) + wrapper_color = COLOR_WHITE /obj/item/weapon/storage/pill_bottle/myelamine - name = "bottle of Myelamine pills" + name = "pill bottle (Myelamine)" desc = "Used to rapidly clot internal hemorrhages by increasing the effectiveness of platelets." starts_with = list(/obj/item/weapon/reagent_containers/pill/myelamine = 7) + wrapper_color = COLOR_PALE_PURPLE_GRAY /obj/item/weapon/storage/pill_bottle/hyronalin - name = "bottle of Hyronalin pills" + name = "pill bottle (Hyronalin)" desc = "Hyronalin is a medicinal drug used to counter the effect of radiation poisoning." starts_with = list(/obj/item/weapon/reagent_containers/pill/hyronalin = 7) + wrapper_color = COLOR_TEAL /obj/item/weapon/storage/pill_bottle/arithrazine - name = "bottle of Arithrazine pills" + name = "pill bottle (Arithrazine)" desc = "Arithrazine is an unstable medication used for the most extreme cases of radiation poisoning." starts_with = list(/obj/item/weapon/reagent_containers/pill/arithrazine = 7) + wrapper_color = COLOR_TEAL /obj/item/weapon/storage/pill_bottle/corophizine - name = "bottle of Corophizine pills" + name = "pill bottle (Corophizine)" desc = "A wide-spectrum antibiotic drug. Powerful and uncomfortable in equal doses." starts_with = list(/obj/item/weapon/reagent_containers/pill/corophizine = 7) + wrapper_color = COLOR_PALE_GREEN_GRAY /obj/item/weapon/storage/pill_bottle/healing_nanites - name = "bottle of Healing nanites capsules" + name = "pill bottle (Healing nanites)" desc = "Miniature medical robots that swiftly restore bodily damage." starts_with = list(/obj/item/weapon/reagent_containers/pill/healing_nanites = 7) + +/obj/item/weapon/storage/firstaid/insiderepair + name = "combat organ kit" + desc = "Contains advanced organ medical treatments." + icon_state = "bezerk" + item_state_slots = list(slot_r_hand_str = "firstaid-advanced", slot_l_hand_str = "firstaid-advanced") + starts_with = list( + /obj/item/weapon/storage/pill_bottle/rezadone, + /obj/item/weapon/storage/pill_bottle/peridaxon, + /obj/item/weapon/storage/pill_bottle/carthatoline, + /obj/item/weapon/storage/pill_bottle/alkysine, + /obj/item/weapon/storage/pill_bottle/imidazoline, + /obj/item/weapon/storage/pill_bottle/osteodaxon, + /obj/item/weapon/storage/pill_bottle/myelamine, + /obj/item/weapon/storage/pill_bottle/arithrazine, + /obj/item/device/healthanalyzer/advanced + ) diff --git a/code/game/objects/items/weapons/storage/mre.dm b/code/game/objects/items/weapons/storage/mre.dm new file mode 100644 index 00000000000..c3adc484e0f --- /dev/null +++ b/code/game/objects/items/weapons/storage/mre.dm @@ -0,0 +1,276 @@ +/* +MRE Stuff + */ + +/obj/item/weapon/storage/mre + name = "standard MRE" + desc = "A vacuum-sealed bag containing a day's worth of nutrients for an adult in strenuous situations. There is no visible expiration date on the package." + icon = 'icons/obj/food.dmi' + icon_state = "mre" + max_storage_space = ITEMSIZE_COST_SMALL * 6 + max_w_class = ITEMSIZE_SMALL + var/opened = FALSE + var/meal_desc = "This one is menu 1, meat pizza." + starts_with = list( + /obj/item/weapon/storage/mrebag, + /obj/item/weapon/storage/mrebag/side, + /obj/item/weapon/storage/mrebag/dessert, + /obj/item/weapon/storage/fancy/crackers, + /obj/random/mre/spread, + /obj/random/mre/drink, + /obj/random/mre/sauce, + /obj/item/weapon/material/kitchen/utensil/spoon/plastic + ) + +/obj/item/weapon/storage/mre/examine(mob/user) + . = ..() + to_chat(user, meal_desc) + +/obj/item/weapon/storage/mre/update_icon() + if(opened) + icon_state = "[initial(icon_state)][opened]" + . = ..() + +/obj/item/weapon/storage/mre/attack_self(mob/user) + open(user) + +/obj/item/weapon/storage/mre/open(mob/user) + if(!opened) + to_chat(usr, "You tear open the bag, breaking the vacuum seal.") + opened = 1 + update_icon() + . = ..() + +/obj/item/weapon/storage/mre/menu2 + meal_desc = "This one is menu 2, margherita." + starts_with = list( + /obj/item/weapon/storage/mrebag/menu2, + /obj/item/weapon/storage/mrebag/side, + /obj/item/weapon/storage/mrebag/dessert, + /obj/item/weapon/storage/fancy/crackers, + /obj/random/mre/spread, + /obj/random/mre/drink, + /obj/random/mre/sauce, + /obj/item/weapon/material/kitchen/utensil/spoon/plastic + ) + +/obj/item/weapon/storage/mre/menu3 + meal_desc = "This one is menu 3, vegetable pizza." + starts_with = list( + /obj/item/weapon/storage/mrebag/menu3, + /obj/item/weapon/storage/mrebag/side, + /obj/item/weapon/storage/mrebag/dessert, + /obj/item/weapon/storage/fancy/crackers, + /obj/random/mre/spread, + /obj/random/mre/drink, + /obj/random/mre/sauce, + /obj/item/weapon/material/kitchen/utensil/spoon/plastic + ) + +/obj/item/weapon/storage/mre/menu4 + meal_desc = "This one is menu 4, hamburger." + starts_with = list( + /obj/item/weapon/storage/mrebag/menu4, + /obj/item/weapon/storage/mrebag/side, + /obj/item/weapon/storage/mrebag/dessert, + /obj/item/weapon/storage/fancy/crackers, + /obj/random/mre/spread, + /obj/random/mre/drink, + /obj/random/mre/sauce, + /obj/item/weapon/material/kitchen/utensil/spoon/plastic + ) + +/obj/item/weapon/storage/mre/menu5 + meal_desc = "This one is menu 5, taco." + starts_with = list( + /obj/item/weapon/storage/mrebag/menu5, + /obj/item/weapon/storage/mrebag/side, + /obj/item/weapon/storage/mrebag/dessert, + /obj/item/weapon/storage/fancy/crackers, + /obj/random/mre/spread, + /obj/random/mre/drink, + /obj/random/mre/sauce, + /obj/item/weapon/material/kitchen/utensil/spoon/plastic + ) + +/obj/item/weapon/storage/mre/menu6 + meal_desc = "This one is menu 6, meatbread." + starts_with = list( + /obj/item/weapon/storage/mrebag/menu6, + /obj/item/weapon/storage/mrebag/side, + /obj/item/weapon/storage/mrebag/dessert, + /obj/item/weapon/storage/fancy/crackers, + /obj/random/mre/spread, + /obj/random/mre/drink, + /obj/random/mre/sauce, + /obj/item/weapon/material/kitchen/utensil/spoon/plastic + ) + +/obj/item/weapon/storage/mre/menu7 + meal_desc = "This one is menu 7, salad." + starts_with = list( + /obj/item/weapon/storage/mrebag/menu7, + /obj/item/weapon/storage/mrebag/side, + /obj/item/weapon/storage/mrebag/dessert, + /obj/item/weapon/storage/fancy/crackers, + /obj/random/mre/spread, + /obj/random/mre/drink, + /obj/random/mre/sauce, + /obj/item/weapon/material/kitchen/utensil/spoon/plastic + ) + +/obj/item/weapon/storage/mre/menu8 + meal_desc = " This one is menu 8, hot chili." + starts_with = list( + /obj/item/weapon/storage/mrebag/menu8, + /obj/item/weapon/storage/mrebag/side, + /obj/item/weapon/storage/mrebag/dessert, + /obj/item/weapon/storage/fancy/crackers, + /obj/random/mre/spread, + /obj/random/mre/drink, + /obj/random/mre/sauce, + /obj/item/weapon/material/kitchen/utensil/spoon/plastic + ) + +/obj/item/weapon/storage/mre/menu9 + name = "vegan MRE" + meal_desc = "This one is menu 9, boiled rice (skrell-safe)." + icon_state = "vegmre" + starts_with = list( + /obj/item/weapon/storage/mrebag/menu9, + /obj/item/weapon/storage/mrebag/side, + /obj/item/weapon/storage/mrebag/dessert/menu9, + /obj/item/weapon/storage/fancy/crackers, + /obj/random/mre/spread/vegan, + /obj/random/mre/drink, + /obj/random/mre/sauce/vegan, + /obj/item/weapon/material/kitchen/utensil/spoon/plastic + ) + +/obj/item/weapon/storage/mre/menu10 + name = "protein MRE" + meal_desc = "This one is menu 10, protein." + icon_state = "meatmre" + starts_with = list( + /obj/item/weapon/storage/mrebag/menu10, + /obj/item/weapon/storage/mrebag/menu10, + /obj/item/weapon/reagent_containers/food/snacks/candy/proteinbar, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/protein, + /obj/random/mre/sauce/sugarfree, + /obj/item/weapon/material/kitchen/utensil/spoon/plastic + ) + +/obj/item/weapon/storage/mre/menu11 + name = "emergency MRE" + meal_desc = "This one is menu 11, nutriment paste. Only for emergencies." + icon_state = "crayonmre" + starts_with = list( + /obj/item/weapon/reagent_containers/food/snacks/liquidfood, + /obj/item/weapon/reagent_containers/food/snacks/liquidfood, + /obj/item/weapon/reagent_containers/food/snacks/liquidfood, + /obj/item/weapon/reagent_containers/food/snacks/liquidfood, + /obj/item/weapon/reagent_containers/food/snacks/liquidprotein, + /obj/item/weapon/reagent_containers/food/snacks/liquidprotein, + ) + +/obj/item/weapon/storage/mre/menu12 + name = "crayon MRE" + meal_desc = "This one doesn't have a menu listing. How very odd." + icon_state = "crayonmre" + starts_with = list( + /obj/item/weapon/storage/fancy/crayons, + /obj/item/weapon/storage/mrebag/dessert/menu11, + /obj/random/mre/sauce/crayon, + /obj/random/mre/sauce/crayon, + /obj/random/mre/sauce/crayon + ) + +/obj/item/weapon/storage/mre/random + meal_desc = "The menu label is faded out." + starts_with = list( + /obj/random/mre/main, + /obj/item/weapon/storage/mrebag/side, + /obj/item/weapon/storage/mrebag/dessert, + /obj/item/weapon/storage/fancy/crackers, + /obj/random/mre/spread, + /obj/random/mre/drink, + /obj/random/mre/sauce, + /obj/item/weapon/material/kitchen/utensil/spoon/plastic + ) + +/obj/item/weapon/storage/mrebag + name = "main course" + desc = "A vacuum-sealed bag containing the MRE's main course. Self-heats when opened." + icon = 'icons/obj/food.dmi' + icon_state = "pouch_medium" + storage_slots = 1 + w_class = ITEMSIZE_SMALL + max_w_class = ITEMSIZE_SMALL + var/opened = FALSE + starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/slice/meatpizza/filled) + +/obj/item/weapon/storage/mrebag/Initialize() + . = ..() + +/obj/item/weapon/storage/mrebag/update_icon() + if(opened) + icon_state = "[initial(icon_state)][opened]" + . = ..() + +/obj/item/weapon/storage/mrebag/attack_self(mob/user) + open(user) + +/obj/item/weapon/storage/mrebag/open(mob/user) + if(!opened) + to_chat(usr, "The pouch heats up as you break the vaccum seal.") + opened = 1 + update_icon() + . = ..() + +/obj/item/weapon/storage/mrebag/menu2 + starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/slice/margherita/filled) + +/obj/item/weapon/storage/mrebag/menu3 + starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/slice/vegetablepizza/filled) + +/obj/item/weapon/storage/mrebag/menu4 + starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/monkeyburger) + +/obj/item/weapon/storage/mrebag/menu5 + starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/taco) + +/obj/item/weapon/storage/mrebag/menu6 + starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/slice/meatbread/filled) + +/obj/item/weapon/storage/mrebag/menu7 + starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/tossedsalad) + +/obj/item/weapon/storage/mrebag/menu8 + starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/hotchili) + +/obj/item/weapon/storage/mrebag/menu9 + starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/boiledrice) + +/obj/item/weapon/storage/mrebag/menu10 + starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/meatcube) + +/obj/item/weapon/storage/mrebag/side + name = "side dish" + desc = "A vacuum-sealed bag containing the MRE's side dish. Self-heats when opened." + icon_state = "pouch_small" + starts_with = list(/obj/random/mre/side) + +/obj/item/weapon/storage/mrebag/side/menu10 + starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/meatcube) + +/obj/item/weapon/storage/mrebag/dessert + name = "dessert" + desc = "A vacuum-sealed bag containing the MRE's dessert." + icon_state = "pouch_small" + starts_with = list(/obj/random/mre/dessert) + +/obj/item/weapon/storage/mrebag/dessert/menu9 + starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/plumphelmetbiscuit) + +/obj/item/weapon/storage/mrebag/dessert/menu11 + starts_with = list(/obj/item/weapon/pen/crayon/rainbow) diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm index 53c092d923d..371082f1f6b 100644 --- a/code/game/objects/items/weapons/stunbaton.dm +++ b/code/game/objects/items/weapons/stunbaton.dm @@ -9,6 +9,7 @@ sharp = 0 edge = 0 throwforce = 7 + flags = NOCONDUCT w_class = ITEMSIZE_NORMAL origin_tech = list(TECH_COMBAT = 2) attack_verb = list("beaten") @@ -18,6 +19,7 @@ var/status = 0 //whether the thing is on or not var/obj/item/weapon/cell/bcell = null var/hitcost = 240 + var/use_external_power = FALSE //only used to determine if it's a cyborg baton /obj/item/weapon/melee/baton/New() ..() @@ -108,6 +110,8 @@ user <<"The baton does not have a power source installed." /obj/item/weapon/melee/baton/attackby(obj/item/weapon/W, mob/user) + if(use_external_power) + return if(istype(W, /obj/item/weapon/cell)) if(istype(W, /obj/item/weapon/cell/device)) if(!bcell) @@ -136,6 +140,11 @@ return ..() /obj/item/weapon/melee/baton/attack_self(mob/user) + if(use_external_power) + //try to find our power cell + var/mob/living/silicon/robot/R = loc + if (istype(R)) + bcell = R.cell if(bcell && bcell.charge > hitcost) status = !status user << "[src] is now [status ? "on" : "off"]." @@ -204,16 +213,7 @@ //secborg stun baton module /obj/item/weapon/melee/baton/robot hitcost = 500 - -/obj/item/weapon/melee/baton/robot/attack_self(mob/user) - //try to find our power cell - var/mob/living/silicon/robot/R = loc - if (istype(R)) - bcell = R.cell - return ..() - -/obj/item/weapon/melee/baton/robot/attackby(obj/item/weapon/W, mob/user) - return + use_external_power = TRUE //Makeshift stun baton. Replacement for stun gloves. /obj/item/weapon/melee/baton/cattleprod @@ -274,13 +274,4 @@ // Borg version, for the lost module. /obj/item/weapon/melee/baton/shocker/robot - -/obj/item/weapon/melee/baton/shocker/robot/attack_self(mob/user) - //try to find our power cell - var/mob/living/silicon/robot/R = loc - if (istype(R)) - bcell = R.cell - return ..() - -/obj/item/weapon/melee/baton/shocker/robot/attackby(obj/item/weapon/W, mob/user) - return \ No newline at end of file + use_external_power = TRUE \ No newline at end of file diff --git a/code/game/objects/items/weapons/tools/crowbar.dm b/code/game/objects/items/weapons/tools/crowbar.dm index 73b62f07418..fab0a6fb983 100644 --- a/code/game/objects/items/weapons/tools/crowbar.dm +++ b/code/game/objects/items/weapons/tools/crowbar.dm @@ -64,7 +64,7 @@ /obj/item/weapon/tool/crowbar/hybrid/is_crowbar() if(prob(10)) var/turf/T = get_turf(src) - radiation_repository.radiate(get_turf(src), 5) + SSradiation.radiate(get_turf(src), 5) T.visible_message("\The [src] shudders!") return FALSE return TRUE diff --git a/code/game/objects/items/weapons/tools/screwdriver.dm b/code/game/objects/items/weapons/tools/screwdriver.dm index a9bdd6cee86..1969987ff96 100644 --- a/code/game/objects/items/weapons/tools/screwdriver.dm +++ b/code/game/objects/items/weapons/tools/screwdriver.dm @@ -108,7 +108,7 @@ /obj/item/weapon/tool/screwdriver/hybrid/is_screwdriver() if(prob(10)) var/turf/T = get_turf(src) - radiation_repository.radiate(get_turf(src), 5) + SSradiation.radiate(get_turf(src), 5) T.visible_message("\The [src] shudders!") return FALSE return TRUE diff --git a/code/game/objects/items/weapons/tools/weldingtool.dm b/code/game/objects/items/weapons/tools/weldingtool.dm index 3a969562f88..33c5a750786 100644 --- a/code/game/objects/items/weapons/tools/weldingtool.dm +++ b/code/game/objects/items/weapons/tools/weldingtool.dm @@ -504,6 +504,14 @@ mounted_pack.return_nozzle() to_chat(user, "\The [src] retracts to its fueltank.") +/obj/item/weapon/weldingtool/tubefed/survival + name = "tube-fed emergency welding tool" + desc = "A bulky, cooler-burning welding tool that draws from a worn welding tank." + icon_state = "tubewelder" + max_fuel = 5 + toolspeed = 1.75 + eye_safety_modifier = 2 + /* * Electric/Arc Welder */ diff --git a/code/game/objects/items/weapons/tools/wirecutters.dm b/code/game/objects/items/weapons/tools/wirecutters.dm index 181c786c4c4..4d61609db44 100644 --- a/code/game/objects/items/weapons/tools/wirecutters.dm +++ b/code/game/objects/items/weapons/tools/wirecutters.dm @@ -88,7 +88,7 @@ /obj/item/weapon/tool/wirecutters/hybrid/is_wirecutter() if(prob(10)) var/turf/T = get_turf(src) - radiation_repository.radiate(get_turf(src), 5) + SSradiation.radiate(get_turf(src), 5) T.visible_message("\The [src] shudders!") return FALSE return TRUE diff --git a/code/game/objects/items/weapons/tools/wrench.dm b/code/game/objects/items/weapons/tools/wrench.dm index 652e32cf75c..3f02a2f8b36 100644 --- a/code/game/objects/items/weapons/tools/wrench.dm +++ b/code/game/objects/items/weapons/tools/wrench.dm @@ -44,7 +44,7 @@ /obj/item/weapon/tool/wrench/hybrid/is_wrench() if(prob(10)) var/turf/T = get_turf(src) - radiation_repository.radiate(get_turf(src), 5) + SSradiation.radiate(get_turf(src), 5) T.visible_message("\The [src] shudders!") return FALSE return TRUE diff --git a/code/game/objects/items/weapons/traps.dm b/code/game/objects/items/weapons/traps.dm index 27927b81802..1e63201f4e1 100644 --- a/code/game/objects/items/weapons/traps.dm +++ b/code/game/objects/items/weapons/traps.dm @@ -11,6 +11,8 @@ origin_tech = list(TECH_MATERIAL = 1) matter = list(DEFAULT_WALL_MATERIAL = 18750) var/deployed = 0 + var/camo_net = FALSE + var/stun_length = 0.25 SECONDS /obj/item/weapon/beartrap/suicide_act(mob/user) var/datum/gender/T = gender_datums[user.get_visible_gender()] @@ -98,6 +100,7 @@ set_dir(L.dir) can_buckle = 1 buckle_mob(L) + L.Stun(stun_length) L << "The steel jaws of \the [src] bite into you, trapping you in place!" deployed = 0 can_buckle = initial(can_buckle) @@ -122,6 +125,21 @@ ..() if(!deployed) + if(camo_net) + alpha = 255 + icon_state = "beartrap0" else + if(camo_net) + alpha = 50 + icon_state = "beartrap1" + +/obj/item/weapon/beartrap/hunting + name = "hunting trap" + desc = "A mechanically activated leg trap. High-tech and reliable. Looks like it could really hurt if you set it off." + stun_length = 1 SECOND + camo_net = TRUE + color = "#C9DCE1" + + origin_tech = list(TECH_MATERIAL = 4, TECH_BLUESPACE = 3, TECH_MAGNET = 4, TECH_PHORON = 2, TECH_ARCANE = 1) diff --git a/code/game/objects/items/weapons/weldbackpack.dm b/code/game/objects/items/weapons/weldbackpack.dm index 5df0c9dbe33..4225ed810a7 100644 --- a/code/game/objects/items/weapons/weldbackpack.dm +++ b/code/game/objects/items/weapons/weldbackpack.dm @@ -7,6 +7,7 @@ w_class = ITEMSIZE_LARGE var/max_fuel = 350 var/obj/item/weapon/nozzle = null //Attached welder, or other spray device. + var/nozzle_type = /obj/item/weapon/weldingtool/tubefed var/nozzle_attached = 0 /obj/item/weapon/weldpack/Initialize() @@ -15,7 +16,7 @@ reagents = R R.my_atom = src R.add_reagent("fuel", max_fuel) - nozzle = new/obj/item/weapon/weldingtool/tubefed(src) + nozzle = new nozzle_type(src) nozzle_attached = 1 /obj/item/weapon/weldpack/Destroy() @@ -145,3 +146,14 @@ ..(user) user << text("\icon[] [] units of fuel left!", src, src.reagents.total_volume) return + +/obj/item/weapon/weldpack/survival + name = "emergency welding kit" + desc = "A heavy-duty, portable welding fluid carrier." + slot_flags = SLOT_BACK + icon = 'icons/obj/storage.dmi' + icon_state = "welderpack-e" + item_state = "welderpack" + w_class = ITEMSIZE_LARGE + max_fuel = 100 + nozzle_type = /obj/item/weapon/weldingtool/tubefed/survival diff --git a/code/game/objects/mob_spawner_vr.dm b/code/game/objects/mob_spawner_vr.dm index 0422c408f83..23ec38c907e 100644 --- a/code/game/objects/mob_spawner_vr.dm +++ b/code/game/objects/mob_spawner_vr.dm @@ -84,7 +84,7 @@ if(destructible) take_damage(Proj.get_structure_damage()) -/obj/structure/mob_spawner/proc/take_damage(var/damage) +/obj/structure/mob_spawner/take_damage(var/damage) health -= damage if(health <= 0) visible_message("\The [src] breaks apart!") diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 520d5cb58b9..c7b8c07f8db 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -55,7 +55,7 @@ CouldNotUseTopic(usr) return 1 -/obj/CanUseTopic(var/mob/user, var/datum/topic_state/state) +/obj/CanUseTopic(var/mob/user, var/datum/topic_state/state = default_state) if(user.CanUseObjTopic(src)) return ..() to_chat(user, "\icon[src]Access Denied!") @@ -173,6 +173,9 @@ */ return +/obj/proc/hear_signlang(mob/M as mob, text, verb, datum/language/speaking) // Saycode gets worse every day. + return FALSE + /obj/proc/see_emote(mob/M as mob, text, var/emote_type) return diff --git a/code/game/objects/random/mapping.dm b/code/game/objects/random/mapping.dm index eb5741c6a19..d39983af2f2 100644 --- a/code/game/objects/random/mapping.dm +++ b/code/game/objects/random/mapping.dm @@ -65,6 +65,21 @@ prob(10);/obj/effect/mine/stun, prob(10);/obj/effect/mine/incendiary,) +/obj/random/humanoidremains + name = "Random Humanoid Remains" + desc = "This is a random pile of remains." + spawn_nothing_percentage = 15 + icon = 'icons/effects/blood.dmi' + icon_state = "remains" + +/obj/random/humanoidremains/item_to_spawn() + return pick(prob(30);/obj/effect/decal/remains/human, + prob(25);/obj/effect/decal/remains/ribcage, + prob(25);/obj/effect/decal/remains/tajaran, + prob(10);/obj/effect/decal/remains/unathi, + prob(10);/obj/effect/decal/remains/posi + ) + /obj/random_multi/single_item/captains_spare_id name = "Multi Point - Captain's Spare" id = "Captain's spare id" @@ -396,5 +411,54 @@ /obj/item/clothing/mask/luchador/rudos, /obj/item/clothing/mask/luchador/tecnicos, /obj/structure/closet/crate + ), + prob(1);list( + /obj/machinery/artifact, + /obj/structure/anomaly_container + ), + prob(1);list( + /obj/random/curseditem, + /obj/random/humanoidremains, + /obj/structure/closet/crate ) ) + +/* + * Turf swappers. + */ + +/obj/random/turf + name = "random Sif turf" + desc = "This is a random Sif turf." + + spawn_nothing_percentage = 20 + + var/override_outdoors = FALSE // Do we override our chosen turf's outdoors? + var/turf_outdoors = TRUE // Will our turf be outdoors? + +/obj/random/turf/spawn_item() + var/build_path = item_to_spawn() + + var/turf/T1 = get_turf(src) + T1.ChangeTurf(build_path, 1, 1, FALSE) + + if(override_outdoors) + T1.outdoors = turf_outdoors + +/obj/random/turf/item_to_spawn() + return pick(prob(25);/turf/simulated/floor/outdoors/grass/sif, + prob(25);/turf/simulated/floor/outdoors/dirt, + prob(25);/turf/simulated/floor/outdoors/grass/sif/forest, + prob(25);/turf/simulated/floor/outdoors/rocks) + +/obj/random/turf/lava + name = "random Lava spawn" + desc = "This is a random lava spawn." + + override_outdoors = TRUE + turf_outdoors = FALSE + +/obj/random/turf/lava/item_to_spawn() + return pick(prob(5);/turf/simulated/floor/lava, + prob(3);/turf/simulated/floor/outdoors/rocks/caves, + prob(1);/turf/simulated/mineral) diff --git a/code/game/objects/random/misc.dm b/code/game/objects/random/misc.dm index 8f3a50bbed3..f9180c99f1d 100644 --- a/code/game/objects/random/misc.dm +++ b/code/game/objects/random/misc.dm @@ -529,3 +529,161 @@ /obj/random/janusmodule/item_to_spawn() return pick(subtypesof(/obj/item/weapon/circuitboard/mecha/imperion)) + +/obj/random/curseditem + name = "random cursed item" + desc = "For use in dungeons." + icon = 'icons/obj/storage.dmi' + icon_state = "red" + +/obj/random/curseditem/item_to_spawn() + var/possible_object_paths = list(/obj/item/weapon/paper/carbon/cursedform) + possible_object_paths |= subtypesof(/obj/item/clothing/head/psy_crown) + return pick(possible_object_paths) + +//Random MRE stuff + +/obj/random/mre + name = "random MRE" + desc = "This is a random single MRE." + icon = 'icons/obj/food.dmi' + icon_state = "mre" + drop_get_turf = FALSE + +/obj/random/mre/item_to_spawn() + return pick(/obj/item/weapon/storage/mre, + /obj/item/weapon/storage/mre/menu2, + /obj/item/weapon/storage/mre/menu3, + /obj/item/weapon/storage/mre/menu4, + /obj/item/weapon/storage/mre/menu5, + /obj/item/weapon/storage/mre/menu6, + /obj/item/weapon/storage/mre/menu7, + /obj/item/weapon/storage/mre/menu8, + /obj/item/weapon/storage/mre/menu9, + /obj/item/weapon/storage/mre/menu10) + + +/obj/random/mre/main + name = "random MRE main course" + desc = "This is a random main course for MREs." + icon_state = "pouch" + drop_get_turf = FALSE + +/obj/random/mre/main/item_to_spawn() + return pick(/obj/item/weapon/storage/mrebag, + /obj/item/weapon/storage/mrebag/menu2, + /obj/item/weapon/storage/mrebag/menu3, + /obj/item/weapon/storage/mrebag/menu4, + /obj/item/weapon/storage/mrebag/menu5, + /obj/item/weapon/storage/mrebag/menu6, + /obj/item/weapon/storage/mrebag/menu7, + /obj/item/weapon/storage/mrebag/menu8) + +/obj/random/mre/side + name = "random MRE side dish" + desc = "This is a random side dish for MREs." + icon_state = "pouch" + drop_get_turf = FALSE + +/obj/random/mre/side/item_to_spawn() + return pick(/obj/item/weapon/reagent_containers/food/snacks/tossedsalad, + /obj/item/weapon/reagent_containers/food/snacks/boiledrice, + /obj/item/weapon/reagent_containers/food/snacks/poppypretzel, + /obj/item/weapon/reagent_containers/food/snacks/twobread, + /obj/item/weapon/reagent_containers/food/snacks/jelliedtoast) + +/obj/random/mre/dessert + name = "random MRE dessert" + desc = "This is a random dessert for MREs." + icon_state = "pouch" + drop_get_turf = FALSE + +/obj/random/mre/dessert/item_to_spawn() + return pick(/obj/item/weapon/reagent_containers/food/snacks/candy, + /obj/item/weapon/reagent_containers/food/snacks/candy/proteinbar, + /obj/item/weapon/reagent_containers/food/snacks/donut/normal, + /obj/item/weapon/reagent_containers/food/snacks/donut/cherryjelly, + /obj/item/weapon/reagent_containers/food/snacks/chocolatebar, + /obj/item/weapon/reagent_containers/food/snacks/cookie) + +/obj/random/mre/dessert/vegan + name = "random vegan MRE dessert" + desc = "This is a random vegan dessert for MREs." + +/obj/random/mre/dessert/vegan/item_to_spawn() + return pick(/obj/item/weapon/reagent_containers/food/snacks/candy, + /obj/item/weapon/reagent_containers/food/snacks/chocolatebar, + /obj/item/weapon/reagent_containers/food/snacks/donut/cherryjelly, + /obj/item/weapon/reagent_containers/food/snacks/plumphelmetbiscuit) + +/obj/random/mre/drink + name = "random MRE drink" + desc = "This is a random drink for MREs." + icon_state = "packet" + drop_get_turf = FALSE + +/obj/random/mre/drink/item_to_spawn() + return pick(/obj/item/weapon/reagent_containers/food/condiment/small/packet/coffee, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/tea, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/cocoa, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/grape, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/orange, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/watermelon, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/apple) + +/obj/random/mre/spread + name = "random MRE spread" + desc = "This is a random spread packet for MREs." + icon_state = "packet" + drop_get_turf = FALSE + +/obj/random/mre/spread/item_to_spawn() + return pick(/obj/item/weapon/reagent_containers/food/condiment/small/packet/jelly, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/honey) + +/obj/random/mre/spread/vegan + name = "random vegan MRE spread" + desc = "This is a random vegan spread packet for MREs" + +/obj/random/mre/spread/vegan/item_to_spawn() + return pick(/obj/item/weapon/reagent_containers/food/condiment/small/packet/jelly) + +/obj/random/mre/sauce + name = "random MRE sauce" + desc = "This is a random sauce packet for MREs." + icon_state = "packet" + drop_get_turf = FALSE + +/obj/random/mre/sauce/item_to_spawn() + return pick(/obj/item/weapon/reagent_containers/food/condiment/small/packet/salt, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/pepper, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/sugar, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/capsaicin, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/ketchup, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/mayo, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/soy) + +/obj/random/mre/sauce/vegan/item_to_spawn() + return pick(/obj/item/weapon/reagent_containers/food/condiment/small/packet/salt, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/pepper, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/sugar, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/soy) + +/obj/random/mre/sauce/sugarfree/item_to_spawn() + return pick(/obj/item/weapon/reagent_containers/food/condiment/small/packet/salt, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/pepper, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/capsaicin, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/ketchup, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/mayo, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/soy) + +/obj/random/mre/sauce/crayon/item_to_spawn() + return pick(/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/generic, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/red, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/orange, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/yellow, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/green, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/blue, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/purple, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/grey, + /obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/brown) diff --git a/code/game/objects/structures/catwalk.dm b/code/game/objects/structures/catwalk.dm index 68b9ccc787d..20fd025ea96 100644 --- a/code/game/objects/structures/catwalk.dm +++ b/code/game/objects/structures/catwalk.dm @@ -98,7 +98,7 @@ return 0 return 1 -/obj/structure/catwalk/proc/take_damage(amount) +/obj/structure/catwalk/take_damage(amount) health -= amount if(health <= 0) visible_message("\The [src] breaks down!") diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 4234c993917..95d38c4473d 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -468,3 +468,10 @@ if(istype(src.loc, /obj/structure/closet)) return (loc.return_air_for_internal_lifeform(L)) return return_air() + +/obj/structure/closet/take_damage(var/damage) + if(damage < STRUCTURE_MIN_DAMAGE_THRESHOLD) + return + dump_contents() + spawn(1) qdel(src) + return 1 \ No newline at end of file diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm index 8380c059ec7..43f50a83873 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm @@ -11,6 +11,8 @@ starts_with = list( /obj/item/clothing/accessory/storage/brown_vest, /obj/item/blueprints, + ///obj/item/clamp, //VOREStation Removal: without leaks those are pointless, + ///obj/item/clamp, //VOREStation Removal: without leaks those are pointless, /obj/item/clothing/under/rank/chief_engineer, /obj/item/clothing/under/rank/chief_engineer/skirt, /obj/item/clothing/head/hardhat/white, @@ -95,6 +97,7 @@ /obj/item/clothing/glasses/meson, /obj/item/weapon/cartridge/engineering, /obj/item/taperoll/engineering, + /obj/item/clothing/head/hardhat, /obj/item/clothing/suit/storage/hooded/wintercoat/engineering, /obj/item/clothing/shoes/boots/winter/engineering, /obj/item/weapon/tank/emergency/oxygen/engi, @@ -123,8 +126,10 @@ starts_with = list( /obj/item/clothing/accessory/storage/brown_vest, /obj/item/clothing/suit/fire/firefighter, + /obj/item/clothing/head/hardhat/red, /obj/item/device/flashlight, /obj/item/weapon/extinguisher, + ///obj/item/clamp, //VOREStation Removal: without leaks those are pointless, /obj/item/device/radio/headset/headset_eng, /obj/item/device/radio/headset/headset_eng/alt, /obj/item/clothing/suit/storage/hazardvest, 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 368fbf10f4a..350e9dc5144 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -302,7 +302,7 @@ GLOBAL_LIST_BOILERPLATE(all_brig_closets, /obj/structure/closet/secure_closet/br var/id = null starts_with = list( - /obj/item/clothing/under/color/orange, + /obj/item/clothing/under/color/prison, /obj/item/clothing/shoes/orange) diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm index 9bdc9659e22..916c12f6439 100644 --- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm +++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm @@ -140,7 +140,7 @@ icon_closed = "orange" starts_with = list( - /obj/item/clothing/under/color/orange = 3, + /obj/item/clothing/under/color/prison = 3, /obj/item/clothing/shoes/orange = 3) diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index e399c04d0ba..6517dda8f8b 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -3,7 +3,7 @@ /obj/structure/closet/crate name = "crate" desc = "A rectangular steel crate." - icon = 'icons/obj/storage.dmi' + icon = 'icons/obj/storage_vr.dmi' //VOREStation edit icon_state = "crate" icon_opened = "crateopen" icon_closed = "crate" @@ -293,6 +293,9 @@ /obj/structure/closet/crate/solar name = "solar pack crate" + icon_state = "engi_crate" //VOREStation Edit + icon_opened = "engi_crateopen" //VOREStation Edit + icon_closed = "engi_crate" //VOREStation Edit starts_with = list( /obj/item/solar_assembly = 21, @@ -343,12 +346,13 @@ desc = "A crate of emergency rations." starts_with = list( - /obj/item/weapon/reagent_containers/food/snacks/liquidfood = 4) + /obj/random/mre = 6) /obj/structure/closet/crate/bin name = "large bin" desc = "A large bin." + icon = 'icons/obj/storage.dmi' //VOREStation edit icon_state = "largebin" icon_opened = "largebinopen" icon_closed = "largebin" @@ -417,6 +421,7 @@ /obj/structure/closet/crate/secure/bin name = "secure bin" desc = "A secure bin." + icon = 'icons/obj/storage.dmi' //VOREStation edit icon_state = "largebins" icon_opened = "largebinsopen" icon_closed = "largebins" @@ -429,7 +434,7 @@ /obj/structure/closet/crate/large name = "large crate" desc = "A hefty metal crate." - icon = 'icons/obj/storage.dmi' + icon = 'icons/obj/storage_vr.dmi' //VOREStation Edit icon_state = "largemetal" icon_opened = "largemetalopen" icon_closed = "largemetal" @@ -457,10 +462,10 @@ /obj/structure/closet/crate/secure/large name = "large crate" desc = "A hefty metal crate with an electronic locking system." - icon = 'icons/obj/storage.dmi' - icon_state = "largemetal" - icon_opened = "largemetalopen" - icon_closed = "largemetal" + icon = 'icons/obj/storage_vr.dmi' //VOREStation Edit + icon_state = "largemetalsecure" //VOREStation Edit + icon_opened = "largemetalsecureopen" //VOREStation Edit + icon_closed = "largemetalsecure" //VOREStation Edit redlight = "largemetalr" greenlight = "largemetalg" diff --git a/code/game/objects/structures/crates_lockers/crates_vr.dm b/code/game/objects/structures/crates_lockers/crates_vr.dm index c2a5cee915b..85eccb3d77e 100644 --- a/code/game/objects/structures/crates_lockers/crates_vr.dm +++ b/code/game/objects/structures/crates_lockers/crates_vr.dm @@ -31,4 +31,9 @@ ..() - return \ No newline at end of file + return + +/obj/structure/closet/crate/medical/blood + icon_state = "blood" + icon_opened = "bloodopen" + icon_closed = "blood" \ No newline at end of file diff --git a/code/game/objects/structures/crates_lockers/largecrate.dm b/code/game/objects/structures/crates_lockers/largecrate.dm index a7a4b778235..79bd5e2949b 100644 --- a/code/game/objects/structures/crates_lockers/largecrate.dm +++ b/code/game/objects/structures/crates_lockers/largecrate.dm @@ -1,7 +1,7 @@ /obj/structure/largecrate name = "large crate" desc = "A hefty wooden crate." - icon = 'icons/obj/storage.dmi' + icon = 'icons/obj/storage_vr.dmi' //VOREStation Edit icon_state = "densecrate" density = 1 var/list/starts_with @@ -82,10 +82,11 @@ starts_with = list(/obj/structure/vehiclecage/quadtrailer) /obj/structure/largecrate/animal - icon_state = "mulecrate" + icon_state = "lisacrate" //VOREStation Edit /obj/structure/largecrate/animal/mulebot name = "Mulebot crate" + icon_state = "mulecrate" //VOREStation Edit starts_with = list(/mob/living/bot/mulebot) /obj/structure/largecrate/animal/corgi diff --git a/code/game/objects/structures/crates_lockers/largecrate_vr.dm b/code/game/objects/structures/crates_lockers/largecrate_vr.dm index c151409e62e..6886a08a3c1 100644 --- a/code/game/objects/structures/crates_lockers/largecrate_vr.dm +++ b/code/game/objects/structures/crates_lockers/largecrate_vr.dm @@ -50,7 +50,7 @@ /mob/living/simple_mob/animal/wolf, /mob/living/simple_mob/animal/space/bear;0.5, /mob/living/simple_mob/animal/space/carp, - /mob/living/simple_mob/animal/space/mimic, + /mob/living/simple_mob/vore/aggressive/mimic, /mob/living/simple_mob/vore/aggressive/rat, /mob/living/simple_mob/vore/aggressive/rat/tame, // /mob/living/simple_mob/otie;0.5 diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm index 86a98e6a695..15bfe8ac893 100644 --- a/code/game/objects/structures/flora.dm +++ b/code/game/objects/structures/flora.dm @@ -1,14 +1,82 @@ +/obj/structure/flora + name = "flora" + desc = "A perfectly generic plant." + anchored = TRUE // Usually, plants don't move. Usually. + plane = DECAL_PLANE + layer = BELOW_MOB_LAYER + var/randomize_size = FALSE + var/max_x_scale = 1.25 + var/max_y_scale = 1.25 + var/min_x_scale = 0.9 + var/min_y_scale = 0.9 + var/harvest_tool = null // The type of item used to harvest the plant. + var/harvest_count = 0 + + var/randomize_harvest_count = TRUE + var/max_harvests = 0 + var/min_harvests = -1 + var/list/harvest_loot = null // Should be an associative list for things to spawn, and their weights. An example would be a branch from a tree. + +/obj/structure/flora/Initialize() + ..() + + if(randomize_size) + icon_scale_x = rand(min_x_scale * 100, max_x_scale * 100) / 100 + icon_scale_y = rand(min_y_scale * 100, max_y_scale * 100) / 100 + + if(prob(50)) + icon_scale_x *= -1 + update_transform() + + if(randomize_harvest_count) + max_harvests = max(0, rand(min_harvests, max_harvests)) // Incase you want to weight it more toward 'not harvestable', set min_harvests to a negative value. + +/obj/structure/flora/examine(mob/user) + . = ..(user) + if(harvest_count < max_harvests) + to_chat(user, "\The [src] seems to have something hanging from it.") + +/obj/structure/flora/attackby(var/obj/item/weapon/W, var/mob/living/user) + if(can_harvest(W)) + var/harvest_spawn = pickweight(harvest_loot) + var/atom/movable/AM = spawn_harvest(harvest_spawn, user) + + if(!AM) + to_chat(user, "You fail to harvest anything from \the [src].") + + else + to_chat(user, "You harvest \the [AM] from \the [src].") + return + + ..(W, user) + +/obj/structure/flora/proc/can_harvest(var/obj/item/I) + . = FALSE + if(harvest_tool && istype(I, harvest_tool) && harvest_loot && harvest_loot.len && harvest_count < max_harvests) + . = TRUE + return . + +/obj/structure/flora/proc/spawn_harvest(var/path = null, var/mob/user = null) + if(!ispath(path)) + return 0 + var/turf/Target = get_turf(src) + if(user) + Target = get_turf(user) + + var/atom/movable/AM = new path(Target) + + harvest_count++ + return AM //bushes /obj/structure/flora/bush name = "bush" icon = 'icons/obj/flora/snowflora.dmi' icon_state = "snowbush1" - anchored = 1 /obj/structure/flora/bush/New() ..() @@ -20,6 +88,7 @@ icon = 'icons/obj/plants.dmi' icon_state = "plant-26" + anchored = FALSE //newbushes @@ -27,7 +96,6 @@ name = "bush" icon = 'icons/obj/flora/ausflora.dmi' icon_state = "firstbush_1" - anchored = 1 /obj/structure/flora/ausbushes/New() ..() @@ -144,6 +212,7 @@ icon_state = "hangskele" desc = "It's an anatomical model of a human skeletal system made of plaster." + plane = OBJ_PLANE //potted plants credit: Flashkirby /obj/structure/flora/pottedplant @@ -152,6 +221,8 @@ icon = 'icons/obj/plants.dmi' icon_state = "plant-01" + plane = OBJ_PLANE + /obj/structure/flora/pottedplant/large name = "large potted plant" desc = "This is a large plant. Three branches support pairs of waxy leaves." @@ -348,4 +419,22 @@ /obj/structure/flora/sif/eyes/Initialize() icon_state = "[initial(icon_state)][rand(1,3)]" - . = ..() \ No newline at end of file + . = ..() + +/datum/category_item/catalogue/flora/mosstendrils + name = "Sivian Flora - Moss Stalks" + desc = "A plant native to Sif. The plant is most closely related to the common, dense moss found covering Sif's terrain. \ + It has evolved a method of camouflage utilizing white hairs on its dorsal sides to make it appear as a small mound of snow from \ + above. It has no known use, though it is a common furnishing in contemporary homes." + value = CATALOGUER_REWARD_TRIVIAL + +/obj/structure/flora/sif/tendrils + name = "stocky tendrils" + desc = "A 'plant' made up of hardened moss. It has tiny hairs that bunch together to look like snow." + icon_state = "grass" + randomize_size = TRUE + catalogue_data = list(/datum/category_item/catalogue/flora/mosstendrils) + +/obj/structure/flora/sif/tendrils/Initialize() + icon_state = "[initial(icon_state)][rand(1,3)]" + . = ..() diff --git a/code/game/objects/structures/flora/trees.dm b/code/game/objects/structures/flora/trees.dm index 03657ce45d4..c67348a94ae 100644 --- a/code/game/objects/structures/flora/trees.dm +++ b/code/game/objects/structures/flora/trees.dm @@ -14,19 +14,10 @@ var/product_amount = 10 // How much of a stack you get, if the above is defined. var/is_stump = FALSE // If true, suspends damage tracking and most other effects. var/indestructable = FALSE // If true, the tree cannot die. - var/randomize_size = FALSE // If true, the tree will choose a random scale in the X and Y directions to stretch. /obj/structure/flora/tree/Initialize() icon_state = choose_icon_state() - if(randomize_size) - icon_scale_x = rand(90, 125) / 100 - icon_scale_y = rand(90, 125) / 100 - - if(prob(50)) - icon_scale_x *= -1 - update_transform() - return ..() /obj/structure/flora/tree/update_transform() @@ -39,7 +30,17 @@ /obj/structure/flora/tree/proc/choose_icon_state() return icon_state +/obj/structure/flora/tree/can_harvest(var/obj/item/I) + . = FALSE + if(!is_stump && harvest_tool && istype(I, harvest_tool) && harvest_loot && harvest_loot.len && harvest_count < max_harvests) + . = TRUE + return . + /obj/structure/flora/tree/attackby(var/obj/item/weapon/W, var/mob/living/user) + if(can_harvest(W)) + ..(W, user) + return + if(!istype(W)) return ..() @@ -267,6 +268,14 @@ product = /obj/item/stack/material/log/sif catalogue_data = list(/datum/category_item/catalogue/flora/sif_tree) randomize_size = TRUE + + harvest_tool = /obj/item/weapon/material/knife + max_harvests = 2 + min_harvests = -4 + harvest_loot = list( + /obj/item/weapon/reagent_containers/food/snacks/siffruit = 5 + ) + var/light_shift = 0 /obj/structure/flora/tree/sif/choose_icon_state() diff --git a/code/game/objects/structures/ghost_pods/silicon_vr.dm b/code/game/objects/structures/ghost_pods/silicon_vr.dm new file mode 100644 index 00000000000..e9e707b6642 --- /dev/null +++ b/code/game/objects/structures/ghost_pods/silicon_vr.dm @@ -0,0 +1,26 @@ +/obj/structure/ghost_pod/manual/lost_drone/dogborg + +/obj/structure/ghost_pod/manual/lost_drone/dogborg/create_occupant(var/mob/M) + var/response = alert(M, "What type of lost drone are you? Do note, that dogborgs may have experienced different type of corruption ((Potential for having vore-related laws))", "Drone Type", "Regular", "Dogborg") + if(!(response == "Dogborg")) // No response somehow or Regular + return ..() + else + density = FALSE + var/mob/living/silicon/robot/stray/randomlaws/R = new(get_turf(src)) + R.adjustBruteLoss(rand(5, 30)) + R.adjustFireLoss(rand(5, 10)) + if(M.mind) + M.mind.transfer_to(R) + // Put this text here before ckey change so that their laws are shown below it, since borg login() shows it. + to_chat(M, "You are a Stray Drone, discovered inside the wreckage of your previous home. \ + Something has reactivated you, with their intentions unknown to you, and yours unknown to them. They are a foreign entity, \ + however they did free you from your pod...") + to_chat(M, "Be sure to examine your currently loaded lawset closely. Remember, your \ + definiton of 'the station' is where your pod is, and unless your laws say otherwise, the entity that released you \ + from the pod is not a crewmember.") + R.ckey = M.ckey + visible_message("As \the [src] opens, the eyes of the robot flicker as it is activated.") + R.Namepick() + log_and_message_admins("successfully opened \a [src] and got a Stray Drone.") + used = TRUE + return TRUE \ No newline at end of file diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index a24f2868da9..26487233852 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -38,7 +38,7 @@ if(!total_radiation) return - radiation_repository.radiate(src, total_radiation) + SSradiation.radiate(src, total_radiation) return total_radiation @@ -212,7 +212,7 @@ else return ..() -/obj/structure/girder/proc/take_damage(var/damage) +/obj/structure/girder/take_damage(var/damage) health -= damage if(health <= 0) dismantle() diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index c4b91fc73ab..1057a5094c3 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -281,3 +281,8 @@ return TRUE return FALSE +/obj/structure/grille/take_damage(var/damage) + health -= damage + spawn(1) healthcheck() + return 1 + diff --git a/code/game/objects/structures/handrail_vr.dm b/code/game/objects/structures/handrail_vr.dm new file mode 100644 index 00000000000..340d8dedd3d --- /dev/null +++ b/code/game/objects/structures/handrail_vr.dm @@ -0,0 +1,8 @@ +/obj/structure/handrail + name = "handrail" + icon = 'icons/obj/handrail_vr.dmi' + icon_state = "handrail" + desc = "A safety railing with buckles to secure yourself to when floor isn't stable enough." + density = 0 + anchored = 1 + can_buckle = 1 diff --git a/code/game/objects/structures/inflatable.dm b/code/game/objects/structures/inflatable.dm index 2192b5690c4..f5bebdf5294 100644 --- a/code/game/objects/structures/inflatable.dm +++ b/code/game/objects/structures/inflatable.dm @@ -137,6 +137,13 @@ user.visible_message("[user] [attack_verb] at [src]!") return 1 +/obj/structure/inflatable/take_damage(var/damage) + health -= damage + if(health <= 0) + visible_message("The [src] deflates!") + spawn(1) puncture() + return 1 + /obj/item/inflatable/door/ name = "inflatable door" desc = "A folded membrane which rapidly expands into a simple door on activation." diff --git a/code/game/objects/structures/musician.dm b/code/game/objects/structures/musician.dm index f563a380cb3..ff1826116a6 100644 --- a/code/game/objects/structures/musician.dm +++ b/code/game/objects/structures/musician.dm @@ -1,8 +1,8 @@ //This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32 #define MUSICIAN_HEARCHECK_MINDELAY 4 -#define INSTRUMENT_MAX_LINE_LENGTH 300 -#define INSTRUMENT_MAX_LINE_NUMBER 50 +#define INSTRUMENT_MAX_LINE_LENGTH 50 +#define INSTRUMENT_MAX_LINE_NUMBER 300 /datum/song var/name = "Untitled" diff --git a/code/game/objects/structures/plasticflaps.dm b/code/game/objects/structures/plasticflaps.dm index bf15ffdfd70..d655581c923 100644 --- a/code/game/objects/structures/plasticflaps.dm +++ b/code/game/objects/structures/plasticflaps.dm @@ -8,7 +8,7 @@ layer = MOB_LAYER plane = MOB_PLANE explosion_resistance = 5 - var/can_pass_lying = 1 + var/can_pass_lying = TRUE var/list/mobs_can_pass = list( /mob/living/bot, /mob/living/simple_mob/slime/xenobio, @@ -37,7 +37,7 @@ if (istype(A, /obj/structure/bed) && B.has_buckled_mobs())//if it's a bed/chair and someone is buckled, it will not pass return 0 - if(istype(A, /obj/vehicle)) //no vehicles + if(istype(A, /obj/vehicle) || istype (A, /obj/mecha)) //no vehicles return 0 var/mob/living/M = A @@ -66,4 +66,4 @@ name = "airtight plastic flaps" desc = "Heavy duty, airtight, plastic flaps. Have extra safety installed, preventing passage of living beings." can_atmos_pass = ATMOS_PASS_NO - can_pass_lying = 0 \ No newline at end of file + can_pass_lying = FALSE \ No newline at end of file diff --git a/code/game/objects/structures/props/blackbox.dm b/code/game/objects/structures/props/blackbox.dm index b6bae732f8f..a28b82349f0 100644 --- a/code/game/objects/structures/props/blackbox.dm +++ b/code/game/objects/structures/props/blackbox.dm @@ -105,4 +105,28 @@ **16/FEB/2562**
      Something chitters.
      End of transcript. - "} \ No newline at end of file + "} + +/obj/structure/prop/blackbox/xenofrigate + catalogue_data = list(/datum/category_item/catalogue/information/blackbox/xenofrigate) + +/datum/category_item/catalogue/information/blackbox/xenofrigate + name = "Black Box Data - MBT-540" + desc = {" +
      + Begin Log + @$&@$& Human ##:##:##: Attention unidentified vessel, state your designation and intent.
      + !#@$&&^ Human ##:##:##: Commander I don't think they're going to stop.
      + @$&@$& Human ##:##:##: Unidentified vessel, you have until the count of three before we engage weapon-
      + !#@$&&^ Human ##:##:##: Commander! Think about what you're-
      + A repeating clicking, before silence.
      + End of first log.
      + **
      + Begin Log
      + #!#^@$& Skrell ##:##:##: Director, I think you should see this.
      + ^@$& Skrell ##:##:##: Yes? What is it?
      + #!#^@$& Skrell ##:##:##: Another one of those ships has appeared near th-462$^ ---n colonies. I would strongly advise pursuing it.
      + ^@$& Skrell ##:##:##: A wise decision. If it is damaged like the last one, we may be able to finally see what is - What?
      + A repeating ping, before silence.
      + End of second log. + "} diff --git a/code/game/objects/structures/railing.dm b/code/game/objects/structures/railing.dm index 9d96f0cc25f..8027b5db5e8 100644 --- a/code/game/objects/structures/railing.dm +++ b/code/game/objects/structures/railing.dm @@ -52,7 +52,7 @@ if(0.5 to 1.0) to_chat(user, "It has a few scrapes and dents.") -/obj/structure/railing/proc/take_damage(amount) +/obj/structure/railing/take_damage(amount) health -= amount if(health <= 0) visible_message("\The [src] breaks down!") diff --git a/code/game/objects/structures/simple_doors.dm b/code/game/objects/structures/simple_doors.dm index 17619c3158c..60b94841eac 100644 --- a/code/game/objects/structures/simple_doors.dm +++ b/code/game/objects/structures/simple_doors.dm @@ -124,15 +124,22 @@ icon_state = material.door_icon_base /obj/structure/simple_door/attackby(obj/item/weapon/W as obj, mob/user as mob) + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) if(istype(W,/obj/item/weapon/pickaxe)) var/obj/item/weapon/pickaxe/digTool = W - user << "You start digging the [name]." + visible_message("[user] starts digging [src]!") if(do_after(user,digTool.digspeed*hardness) && src) - user << "You finished digging." + visible_message("[user] finished digging [src]!") Dismantle() else if(istype(W,/obj/item/weapon)) //not sure, can't not just weapons get passed to this proc? hardness -= W.force/10 - user << "You hit the [name] with your [W.name]!" + visible_message("[user] hits [src] with [W]!") + if(material == get_material_by_name("resin")) + playsound(loc, 'sound/effects/attackblob.ogg', 100, 1) + else if(material == (get_material_by_name(MAT_WOOD) || get_material_by_name(MAT_SIFWOOD))) + playsound(loc, 'sound/effects/woodcutting.ogg', 100, 1) + else + playsound(src, 'sound/weapons/smash.ogg', 50, 1) CheckHardness() else if(istype(W,/obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = W @@ -146,12 +153,29 @@ hardness -= Proj.force/10 CheckHardness() +/obj/structure/simple_door/take_damage(var/damage) + hardness -= damage/10 + CheckHardness() + +/obj/structure/simple_door/attack_generic(var/mob/user, var/damage, var/attack_verb) + visible_message("[user] [attack_verb] the [src]!") + if(material == get_material_by_name("resin")) + playsound(loc, 'sound/effects/attackblob.ogg', 100, 1) + else if(material == (get_material_by_name(MAT_WOOD) || get_material_by_name(MAT_SIFWOOD))) + playsound(loc, 'sound/effects/woodcutting.ogg', 100, 1) + else + playsound(src, 'sound/weapons/smash.ogg', 50, 1) + user.do_attack_animation(src) + hardness -= damage/10 + CheckHardness() + /obj/structure/simple_door/proc/CheckHardness() if(hardness <= 0) Dismantle(1) /obj/structure/simple_door/proc/Dismantle(devastated = 0) material.place_dismantled_product(get_turf(src)) + visible_message("The [src] is destroyed!") qdel(src) /obj/structure/simple_door/ex_act(severity = 1) @@ -172,7 +196,7 @@ /obj/structure/simple_door/process() if(!material.radioactivity) return - radiation_repository.radiate(src, round(material.radioactivity/3)) + SSradiation.radiate(src, round(material.radioactivity/3)) /obj/structure/simple_door/iron/New(var/newloc,var/material_name) ..(newloc, "iron") diff --git a/code/game/objects/structures/stasis_cage.dm b/code/game/objects/structures/stasis_cage.dm index 560f64251ee..f4791f37f21 100644 --- a/code/game/objects/structures/stasis_cage.dm +++ b/code/game/objects/structures/stasis_cage.dm @@ -1,7 +1,7 @@ /obj/structure/stasis_cage name = "stasis cage" desc = "A high-tech animal cage, designed to keep contained fauna docile and safe." - icon = 'icons/obj/storage.dmi' + icon = 'icons/obj/storage_vr.dmi' //VOREStation Edit icon_state = "critteropen" density = 1 @@ -64,4 +64,4 @@ usr.visible_message("[usr] has stuffed \the [src] into \the [over_object].", "You have stuffed \the [src] into \the [over_object].") over_object.contain(src) else - return ..() \ No newline at end of file + return ..() diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs_vr.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs_vr.dm new file mode 100644 index 00000000000..e82ef467bb0 --- /dev/null +++ b/code/game/objects/structures/stool_bed_chair_nest/chairs_vr.dm @@ -0,0 +1,20 @@ +/obj/structure/bed/chair/sofa + name = "sofa" + desc = "A padded, comfy sofa. Great for lazing on." + base_icon = "sofamiddle" + +/obj/structure/bed/chair/sofa/left + base_icon = "sofaend_left" + +/obj/structure/bed/chair/sofa/right + base_icon = "sofaend_right" + +/obj/structure/bed/chair/sofa/corner + base_icon = "sofacorner" + +/obj/structure/bed/chair/sofa/corner/update_layer() + if(src.dir == NORTH || src.dir == WEST) + plane = MOB_PLANE + layer = MOB_LAYER + 0.1 + else + reset_plane_and_layer() \ No newline at end of file diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index cc3bcf16481..b2867d5eadb 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -47,7 +47,7 @@ else to_chat(user, "There is a thick layer of silicate covering it.") -/obj/structure/window/proc/take_damage(var/damage = 0, var/sound_effect = 1) +/obj/structure/window/take_damage(var/damage = 0, var/sound_effect = 1) var/initialhealth = health if(silicate) diff --git a/code/game/sound.dm b/code/game/sound.dm index b1f0c32f66c..cd3b140bd9f 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -137,6 +137,46 @@ if ("button") soundin = pick('sound/machines/button1.ogg','sound/machines/button2.ogg','sound/machines/button3.ogg','sound/machines/button4.ogg') if ("switch") soundin = pick('sound/machines/switch1.ogg','sound/machines/switch2.ogg','sound/machines/switch3.ogg','sound/machines/switch4.ogg') if ("casing_sound") soundin = pick('sound/weapons/casingfall1.ogg','sound/weapons/casingfall2.ogg','sound/weapons/casingfall3.ogg') + //VORESTATION EDIT - vore sounds for better performance + if ("hunger_sounds") soundin = pick('sound/vore/growl1.ogg','sound/vore/growl2.ogg','sound/vore/growl3.ogg','sound/vore/growl4.ogg','sound/vore/growl5.ogg') + + if("classic_digestion_sounds") soundin = pick( + 'sound/vore/digest1.ogg','sound/vore/digest2.ogg','sound/vore/digest3.ogg','sound/vore/digest4.ogg', + 'sound/vore/digest5.ogg','sound/vore/digest6.ogg','sound/vore/digest7.ogg','sound/vore/digest8.ogg', + 'sound/vore/digest9.ogg','sound/vore/digest10.ogg','sound/vore/digest11.ogg','sound/vore/digest12.ogg') + if("classic_death_sounds") soundin = pick( + 'sound/vore/death1.ogg','sound/vore/death2.ogg','sound/vore/death3.ogg','sound/vore/death4.ogg','sound/vore/death5.ogg', + 'sound/vore/death6.ogg','sound/vore/death7.ogg','sound/vore/death8.ogg','sound/vore/death9.ogg','sound/vore/death10.ogg') + if("classic_struggle_sounds") soundin = pick('sound/vore/squish1.ogg','sound/vore/squish2.ogg','sound/vore/squish3.ogg','sound/vore/squish4.ogg') + + if("fancy_prey_struggle") soundin = pick( + 'sound/vore/sunesound/prey/struggle_01.ogg','sound/vore/sunesound/prey/struggle_02.ogg','sound/vore/sunesound/prey/struggle_03.ogg', + 'sound/vore/sunesound/prey/struggle_04.ogg','sound/vore/sunesound/prey/struggle_05.ogg') + if("fancy_digest_pred") soundin = pick( + 'sound/vore/sunesound/pred/digest_01.ogg','sound/vore/sunesound/pred/digest_02.ogg','sound/vore/sunesound/pred/digest_03.ogg', + 'sound/vore/sunesound/pred/digest_04.ogg','sound/vore/sunesound/pred/digest_05.ogg','sound/vore/sunesound/pred/digest_06.ogg', + 'sound/vore/sunesound/pred/digest_07.ogg','sound/vore/sunesound/pred/digest_08.ogg','sound/vore/sunesound/pred/digest_09.ogg', + 'sound/vore/sunesound/pred/digest_10.ogg','sound/vore/sunesound/pred/digest_11.ogg','sound/vore/sunesound/pred/digest_12.ogg', + 'sound/vore/sunesound/pred/digest_13.ogg','sound/vore/sunesound/pred/digest_14.ogg','sound/vore/sunesound/pred/digest_15.ogg', + 'sound/vore/sunesound/pred/digest_16.ogg','sound/vore/sunesound/pred/digest_17.ogg','sound/vore/sunesound/pred/digest_18.ogg') + if("fancy_death_pred") soundin = pick( + 'sound/vore/sunesound/pred/death_01.ogg','sound/vore/sunesound/pred/death_02.ogg','sound/vore/sunesound/pred/death_03.ogg', + 'sound/vore/sunesound/pred/death_04.ogg','sound/vore/sunesound/pred/death_05.ogg','sound/vore/sunesound/pred/death_06.ogg', + 'sound/vore/sunesound/pred/death_07.ogg','sound/vore/sunesound/pred/death_08.ogg','sound/vore/sunesound/pred/death_09.ogg', + 'sound/vore/sunesound/pred/death_10.ogg') + if("fancy_digest_prey") soundin = pick( + 'sound/vore/sunesound/prey/digest_01.ogg','sound/vore/sunesound/prey/digest_02.ogg','sound/vore/sunesound/prey/digest_03.ogg', + 'sound/vore/sunesound/prey/digest_04.ogg','sound/vore/sunesound/prey/digest_05.ogg','sound/vore/sunesound/prey/digest_06.ogg', + 'sound/vore/sunesound/prey/digest_07.ogg','sound/vore/sunesound/prey/digest_08.ogg','sound/vore/sunesound/prey/digest_09.ogg', + 'sound/vore/sunesound/prey/digest_10.ogg','sound/vore/sunesound/prey/digest_11.ogg','sound/vore/sunesound/prey/digest_12.ogg', + 'sound/vore/sunesound/prey/digest_13.ogg','sound/vore/sunesound/prey/digest_14.ogg','sound/vore/sunesound/prey/digest_15.ogg', + 'sound/vore/sunesound/prey/digest_16.ogg','sound/vore/sunesound/prey/digest_17.ogg','sound/vore/sunesound/prey/digest_18.ogg') + if("fancy_death_prey") soundin = pick( + 'sound/vore/sunesound/prey/death_01.ogg','sound/vore/sunesound/prey/death_02.ogg','sound/vore/sunesound/prey/death_03.ogg', + 'sound/vore/sunesound/prey/death_04.ogg','sound/vore/sunesound/prey/death_05.ogg','sound/vore/sunesound/prey/death_06.ogg', + 'sound/vore/sunesound/prey/death_07.ogg','sound/vore/sunesound/prey/death_08.ogg','sound/vore/sunesound/prey/death_09.ogg', + 'sound/vore/sunesound/prey/death_10.ogg') + //END VORESTATION EDIT return soundin //Are these even used? diff --git a/code/game/turfs/flooring/flooring_decals.dm b/code/game/turfs/flooring/flooring_decals.dm index f69d676ccd1..d6e36b30e29 100644 --- a/code/game/turfs/flooring/flooring_decals.dm +++ b/code/game/turfs/flooring/flooring_decals.dm @@ -469,8 +469,8 @@ var/list/floor_decals = list() /obj/effect/floor_decal/corner/grey/bordercorner icon_state = "bordercolorcorner" -/obj/effect/floor_decal/corner/grey/bordercorner - icon_state = "bordercolorcorner" +/obj/effect/floor_decal/corner/grey/bordercorner2 + icon_state = "bordercolorcorner2" /obj/effect/floor_decal/corner/grey/borderfull icon_state = "bordercolorfull" diff --git a/code/game/turfs/flooring/shuttle_vr.dm b/code/game/turfs/flooring/shuttle_vr.dm index 0b80dc72117..65b586b9317 100644 --- a/code/game/turfs/flooring/shuttle_vr.dm +++ b/code/game/turfs/flooring/shuttle_vr.dm @@ -13,3 +13,28 @@ oxygen = 0 nitrogen = 0 temperature = TCMB + +/turf/simulated/shuttle/floor/yellow/airless + oxygen = 0 + nitrogen = 0 + temperature = TCMB + +/turf/simulated/shuttle/floor/purple/airless + oxygen = 0 + nitrogen = 0 + temperature = TCMB + +/turf/simulated/shuttle/floor/red/airless + oxygen = 0 + nitrogen = 0 + temperature = TCMB + +/turf/simulated/shuttle/floor/darkred/airless + oxygen = 0 + nitrogen = 0 + temperature = TCMB + +/turf/simulated/shuttle/floor/black/airless + oxygen = 0 + nitrogen = 0 + temperature = TCMB diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm index 1c74b467e22..6bf7cf38b4b 100644 --- a/code/game/turfs/simulated.dm +++ b/code/game/turfs/simulated.dm @@ -13,6 +13,8 @@ var/to_be_destroyed = 0 //Used for fire, if a melting temperature was reached, it will be destroyed var/max_fire_temperature_sustained = 0 //The max temperature of the fire which it was subjected to var/can_dirty = TRUE // If false, tile never gets dirty + var/can_start_dirty = TRUE // If false, cannot start dirty roundstart + var/dirty_prob = 2 // Chance of being dirty roundstart var/dirt = 0 // This is not great. diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index 606c0b2bb91..31bfd62684d 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -43,9 +43,10 @@ set_flooring(get_flooring_data(floortype)) else footstep_sounds = base_footstep_sounds - if(can_dirty) - if(prob(2)) - new /obj/effect/decal/cleanable/dirt(src) //5% chance to start with dirt on a floor tile- give the janitor something to do + if(can_dirty && can_start_dirty) + if(prob(dirty_prob)) + dirt += rand(50,100) + update_dirt() //5% chance to start with dirt on a floor tile- give the janitor something to do /turf/simulated/floor/proc/set_flooring(var/decl/flooring/newflooring) make_plating(defer_icon_update = 1) diff --git a/code/game/turfs/simulated/outdoors/grass.dm b/code/game/turfs/simulated/outdoors/grass.dm index 72b2ee7e57a..e557fb16da0 100644 --- a/code/game/turfs/simulated/outdoors/grass.dm +++ b/code/game/turfs/simulated/outdoors/grass.dm @@ -33,7 +33,8 @@ var/list/grass_types = list( var/tree_chance = 2 grass_types = list( - /obj/structure/flora/sif/eyes + /obj/structure/flora/sif/eyes = 1, + /obj/structure/flora/sif/tendrils = 10 ) catalogue_data = list(/datum/category_item/catalogue/flora/sif_grass) @@ -50,7 +51,7 @@ var/list/grass_types = list( //edge_blending_priority++ if(grass_chance && prob(grass_chance) && !check_density()) - var/grass_type = pick(grass_types) + var/grass_type = pickweight(grass_types) new grass_type(src) . = ..() diff --git a/code/game/turfs/simulated/outdoors/snow.dm b/code/game/turfs/simulated/outdoors/snow.dm index 0f9be4ddbfd..cccc028fa30 100644 --- a/code/game/turfs/simulated/outdoors/snow.dm +++ b/code/game/turfs/simulated/outdoors/snow.dm @@ -58,3 +58,10 @@ to_chat(M, "You slide across the ice!") M.SetStunned(1) step(M,M.dir) + +// Ice that is used for, say, areas floating on water or similar. +/turf/simulated/floor/outdoors/shelfice + name = "ice" + icon_state = "ice" + desc = "Looks slippery." + movement_cost = 4 diff --git a/code/game/turfs/simulated/wall_attacks.dm b/code/game/turfs/simulated/wall_attacks.dm index bd6adfe32f4..8599def4a55 100644 --- a/code/game/turfs/simulated/wall_attacks.dm +++ b/code/game/turfs/simulated/wall_attacks.dm @@ -7,7 +7,7 @@ if(can_open == WALL_OPENING) return - radiation_repository.resistance_cache.Remove(src) + SSradiation.resistance_cache.Remove(src) if(density) can_open = WALL_OPENING diff --git a/code/game/turfs/simulated/wall_icon.dm b/code/game/turfs/simulated/wall_icon.dm index b8a0980de41..f277ea79f56 100644 --- a/code/game/turfs/simulated/wall_icon.dm +++ b/code/game/turfs/simulated/wall_icon.dm @@ -26,7 +26,7 @@ else if(material.opacity < 0.5 && opacity) set_light(0) - radiation_repository.resistance_cache.Remove(src) + SSradiation.resistance_cache.Remove(src) update_connections(1) update_icon() diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index cb1a0f631af..bf5f711b206 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -153,7 +153,7 @@ visible_message("\The [src] spontaneously combusts!.") //!!OH SHIT!! return -/turf/simulated/wall/proc/take_damage(dam) +/turf/simulated/wall/take_damage(dam) if(dam) damage = max(0, damage + dam) update_damage() @@ -274,7 +274,7 @@ if(!total_radiation) return - radiation_repository.radiate(src, total_radiation) + SSradiation.radiate(src, total_radiation) return total_radiation /turf/simulated/wall/proc/burn(temperature) diff --git a/code/game/turfs/simulated_vr.dm b/code/game/turfs/simulated_vr.dm new file mode 100644 index 00000000000..6c7325305fe --- /dev/null +++ b/code/game/turfs/simulated_vr.dm @@ -0,0 +1,5 @@ +/turf/simulated + can_start_dirty = FALSE // We have enough premapped dirt where needed + +/turf/simulated/floor/plating + can_start_dirty = TRUE // But let maints and decrepit areas have some randomness \ No newline at end of file diff --git a/code/game/turfs/unsimulated/planetary_vr.dm b/code/game/turfs/unsimulated/planetary_vr.dm new file mode 100644 index 00000000000..5cf174cf3d6 --- /dev/null +++ b/code/game/turfs/unsimulated/planetary_vr.dm @@ -0,0 +1,30 @@ +//Atmosphere properties +#define VIRGO3B_ONE_ATMOSPHERE 82.4 //kPa +#define VIRGO3B_AVG_TEMP 234 //kelvin + +#define VIRGO3B_PER_N2 0.16 //percent +#define VIRGO3B_PER_O2 0.00 +#define VIRGO3B_PER_N2O 0.00 //Currently no capacity to 'start' a turf with this. See turf.dm +#define VIRGO3B_PER_CO2 0.12 +#define VIRGO3B_PER_PHORON 0.72 + +//Math only beyond this point +#define VIRGO3B_MOL_PER_TURF (VIRGO3B_ONE_ATMOSPHERE*CELL_VOLUME/(VIRGO3B_AVG_TEMP*R_IDEAL_GAS_EQUATION)) +#define VIRGO3B_MOL_N2 (VIRGO3B_MOL_PER_TURF * VIRGO3B_PER_N2) +#define VIRGO3B_MOL_O2 (VIRGO3B_MOL_PER_TURF * VIRGO3B_PER_O2) +#define VIRGO3B_MOL_N2O (VIRGO3B_MOL_PER_TURF * VIRGO3B_PER_N2O) +#define VIRGO3B_MOL_CO2 (VIRGO3B_MOL_PER_TURF * VIRGO3B_PER_CO2) +#define VIRGO3B_MOL_PHORON (VIRGO3B_MOL_PER_TURF * VIRGO3B_PER_PHORON) + +//Turfmakers +#define VIRGO3B_SET_ATMOS nitrogen=VIRGO3B_MOL_N2;oxygen=VIRGO3B_MOL_O2;carbon_dioxide=VIRGO3B_MOL_CO2;phoron=VIRGO3B_MOL_PHORON;temperature=VIRGO3B_AVG_TEMP +#define VIRGO3B_TURF_CREATE(x) x/virgo3b/nitrogen=VIRGO3B_MOL_N2;x/virgo3b/oxygen=VIRGO3B_MOL_O2;x/virgo3b/carbon_dioxide=VIRGO3B_MOL_CO2;x/virgo3b/phoron=VIRGO3B_MOL_PHORON;x/virgo3b/temperature=VIRGO3B_AVG_TEMP;x/virgo3b/outdoors=TRUE;x/virgo3b/update_graphic(list/graphic_add = null, list/graphic_remove = null) return 0 +#define VIRGO3B_TURF_CREATE_UN(x) x/virgo3b/nitrogen=VIRGO3B_MOL_N2;x/virgo3b/oxygen=VIRGO3B_MOL_O2;x/virgo3b/carbon_dioxide=VIRGO3B_MOL_CO2;x/virgo3b/phoron=VIRGO3B_MOL_PHORON;x/virgo3b/temperature=VIRGO3B_AVG_TEMP + +// This is a wall you surround the area of your "planet" with, that makes the atmosphere inside stay within bounds, even if canisters +// are opened or other strange things occur. +/turf/unsimulated/wall/planetary/virgo3b + name = "facility wall" + desc = "An eight-meter tall carbyne wall. For when the wildlife on your planet is mostly militant megacorps." + alpha = 0xFF + VIRGO3B_SET_ATMOS diff --git a/code/game/turfs/unsimulated/sky_vr.dm b/code/game/turfs/unsimulated/sky_vr.dm index 8ba1cf0cb57..c71fa6470a7 100644 --- a/code/game/turfs/unsimulated/sky_vr.dm +++ b/code/game/turfs/unsimulated/sky_vr.dm @@ -1,67 +1,73 @@ -/////////////////// -// Generic skyfall turf -// Really only works well if the map doesn't have 'indoor' areas otherwise they can fall into one. -// TODO: Fix that. -/turf/unsimulated/floor/sky - name = "the sky" - desc = "It's the sky! Be careful!" - icon = 'icons/turf/floors.dmi' - icon_state = "sky_slow" - dir = SOUTH - initialized = FALSE - var/does_skyfall = TRUE - var/list/skyfall_levels - -/turf/unsimulated/floor/sky/Initialize() - . = ..() - if(does_skyfall && !LAZYLEN(skyfall_levels)) - error("[x],[y],[z], [get_area(src)] doesn't have skyfall_levels defined! Can't skyfall!") - if(locate(/turf/simulated) in orange(src,1)) - set_light(2, 2, color) - -/turf/unsimulated/floor/sky/Entered(atom/movable/AM,atom/oldloc) - . = ..() - if(!does_skyfall) - return //We don't do that - if(isobserver(AM)) - return //Don't ghostport, very annoying - if(AM.throwing) - return //Being thrown over, not fallen yet - - var/mob/living/L - if(isliving(AM)) - L = AM - if(L.is_floating) - return //Flyers/nograv can ignore it - - do_fall(AM) - -/turf/unsimulated/floor/sky/hitby(var/atom/movable/AM, var/speed) - . = ..() - - if(!does_skyfall) - return //We don't do that - - do_fall(AM) - -/turf/unsimulated/floor/sky/proc/do_fall(atom/movable/AM) - //Bye - var/attempts = 100 - var/turf/simulated/T - while(attempts && !T) - var/turf/simulated/candidate = locate(rand(5,world.maxx-5),rand(5,world.maxy-5),pick(skyfall_levels)) - if(candidate.density) - attempts-- - continue - - T = candidate - break - - if(!T) - return - - AM.forceMove(T) - if(isliving(AM)) - var/mob/living/L = AM - message_admins("\The [AM] fell out of the sky.") - L.fall_impact(T, 42, 90, FALSE, TRUE) //You will not be defibbed from this. +/////////////////// +// Generic skyfall turf +// Really only works well if the map doesn't have 'indoor' areas otherwise they can fall into one. +// TODO: Fix that. +/turf/unsimulated/floor/sky + name = "the sky" + desc = "It's the sky! Be careful!" + icon = 'icons/turf/floors.dmi' + icon_state = "sky_slow" + dir = SOUTH + initialized = FALSE + var/does_skyfall = TRUE + var/list/skyfall_levels + +/turf/unsimulated/floor/sky/Initialize() + . = ..() + if(does_skyfall && !LAZYLEN(skyfall_levels)) + error("[x],[y],[z], [get_area(src)] doesn't have skyfall_levels defined! Can't skyfall!") + if(locate(/turf/simulated) in orange(src,1)) + set_light(2, 2, color) + +/turf/unsimulated/floor/sky/Entered(atom/movable/AM,atom/oldloc) + . = ..() + if(!does_skyfall) + return //We don't do that + if(isobserver(AM)) + return //Don't ghostport, very annoying + if(AM.throwing) + return //Being thrown over, not fallen yet + if(!(AM.can_fall())) + return // Phased shifted kin should not fall + if(istype(AM, /obj/item/projectile)) + return // pewpew should not fall out of the sky. pew. + if(istype(AM, /obj/effect/projectile)) + return // ...neither should the effects be falling + + var/mob/living/L + if(isliving(AM)) + L = AM + if(L.is_floating) + return //Flyers/nograv can ignore it + + do_fall(AM) + +/turf/unsimulated/floor/sky/hitby(var/atom/movable/AM, var/speed) + . = ..() + + if(!does_skyfall) + return //We don't do that + + do_fall(AM) + +/turf/unsimulated/floor/sky/proc/do_fall(atom/movable/AM) + //Bye + var/attempts = 100 + var/turf/simulated/T + while(attempts && !T) + var/turf/simulated/candidate = locate(rand(5,world.maxx-5),rand(5,world.maxy-5),pick(skyfall_levels)) + if(candidate.density) + attempts-- + continue + + T = candidate + break + + if(!T) + return + + AM.forceMove(T) + if(isliving(AM)) + var/mob/living/L = AM + message_admins("\The [AM] fell out of the sky.") + L.fall_impact(T, 42, 90, FALSE, TRUE) //You will not be defibbed from this. diff --git a/code/game/turfs/unsimulated/walls.dm b/code/game/turfs/unsimulated/walls.dm index 12d4d3fadc3..6f13cdb54b4 100644 --- a/code/game/turfs/unsimulated/walls.dm +++ b/code/game/turfs/unsimulated/walls.dm @@ -4,6 +4,7 @@ icon_state = "riveted" opacity = 1 density = 1 + blocks_air = TRUE /turf/unsimulated/wall/fakeglass name = "window" diff --git a/code/global.dm b/code/global.dm index a1ecb08cff5..e9bcbb49f49 100644 --- a/code/global.dm +++ b/code/global.dm @@ -53,7 +53,7 @@ var/list/lastsignalers = list() // Keeps last 100 signals here in format: "[src] var/list/lawchanges = list() // Stores who uploaded laws to which silicon-based lifeform, and what the law was. var/list/reg_dna = list() -var/mouse_respawn_time = 5 // Amount of time that must pass between a player dying as a mouse and repawning as a mouse. In minutes. +var/mouse_respawn_time = 2.5 // Amount of time that must pass between a player dying as a mouse and repawning as a mouse. In minutes. Vorestation Edit - Changed to 2.5 minutes, half of 5, in accordance with mouse nerfs and realignment. var/list/monkeystart = list() var/list/wizardstart = list() diff --git a/code/global_vr.dm b/code/global_vr.dm index 9506dd62d35..0f3212ff7aa 100644 --- a/code/global_vr.dm +++ b/code/global_vr.dm @@ -6,6 +6,12 @@ robot_module_types += "Pupdozer" return 1 +var/list/shell_module_types = list( + "Standard", "Service", "Clerical" +) + +var/list/eventdestinations = list() // List of scatter landmarks for VOREStation event portals + var/global/list/acceptable_fruit_types= list( "ambrosia", "apple", @@ -13,22 +19,35 @@ var/global/list/acceptable_fruit_types= list( "berries", "cabbage", "carrot", + "celery", "cherry", "chili", + "cocoa", + "corn", + "durian", "eggplant", "grapes", "greengrapes", + "harebells", + "lavender", "lemon", + "lettuce", "lime", "onion", "orange", "peanut", + "poppies", "potato", "pumpkin", "rice", + "rose", + "rhubarb", "soybean", + "spineapple", "sugarcane", + "sunflowers", "tomato", + "vanilla", "watermelon", "wheat", "whitebeet") \ No newline at end of file diff --git a/code/modules/admin/admin_attack_log.dm b/code/modules/admin/admin_attack_log.dm index f04bdf3b618..c1f5c67464b 100644 --- a/code/modules/admin/admin_attack_log.dm +++ b/code/modules/admin/admin_attack_log.dm @@ -1,6 +1,7 @@ /mob/var/lastattacker = null /mob/var/lastattacked = null /mob/var/attack_log = list( ) +/mob/var/dialogue_log = list( ) proc/log_and_message_admins(var/message as text, var/mob/user = usr) log_admin(user ? "[key_name(user)] [message]" : "EVENT [message]") diff --git a/code/modules/admin/admin_tools.dm b/code/modules/admin/admin_tools.dm new file mode 100644 index 00000000000..376aa2da44b --- /dev/null +++ b/code/modules/admin/admin_tools.dm @@ -0,0 +1,62 @@ +/client/proc/cmd_admin_check_player_logs(mob/living/M as mob in mob_list) + set category = "Admin" + set name = "Check Player Attack Logs" + set desc = "Check a player's attack logs." + +//Views specific attack logs belonging to one player. + var/dat = "[M]'s Attack Log:
      " + dat += "Viewing attack logs of [M] - (Played by ([key_name(M)]).
      " + if(M.mind) + dat += "Current Antag?: [(M.mind.special_role)?"Yes":"No"]
      " + dat += "
      Note: This is arranged from earliest to latest.

      " + + + if(!isemptylist(M.attack_log)) + dat += "
      " + for(var/l in M.attack_log) + dat += "[l]
      " + + dat += "
      " + + else + dat += "No attack logs found for [M]." + + var/datum/browser/popup = new(usr, "admin_attack_log", "[src]", 650, 650, src) + popup.set_content(jointext(dat,null)) + popup.open() + + onclose(usr, "admin_attack_log") + + feedback_add_details("admin_verb","PL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/client/proc/cmd_admin_check_dialogue_logs(mob/living/M as mob in mob_list) + set category = "Admin" + set name = "Check Player Dialogue Logs" + set desc = "Check a player's dialogue logs." + +//Views specific dialogue logs belonging to one player. + var/dat = "[M]'s Dialogue Log:
      " + dat += "Viewing say and emote logs of [M] - (Played by ([key_name(M)]).
      " + if(M.mind) + dat += "Current Antag?: [(M.mind.special_role)?"Yes":"No"]
      " + dat += "
      Note: This is arranged from earliest to latest.

      " + + if(!isemptylist(M.dialogue_log)) + dat += "
      " + + for(var/d in M.dialogue_log) + dat += "[d]
      " + + dat += "
      " + else + dat += "No dialogue logs found for [M]." + var/datum/browser/popup = new(usr, "admin_dialogue_log", "[src]", 650, 650, src) + popup.set_content(jointext(dat,null)) + popup.open() + + onclose(usr, "admin_dialogue_log") + + + feedback_add_details("admin_verb","PDL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + + diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 4bad67b3703..9f8e6271f33 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -38,6 +38,8 @@ var/list/admin_verbs_admin = list( /client/proc/cmd_admin_subtle_message, //send an message to somebody as a 'voice in their head', /client/proc/cmd_admin_delete, //delete an instance/object/mob/etc, /client/proc/cmd_admin_check_contents, //displays the contents of an instance, + /client/proc/cmd_admin_check_player_logs, //checks a player's attack logs, + /client/proc/cmd_admin_check_dialogue_logs, //checks a player's dialogue logs, /datum/admins/proc/access_news_network, //allows access of newscasters, /client/proc/giveruntimelog, //allows us to give access to runtime logs to somebody, /client/proc/getserverlog, //allows us to fetch server logs (diary) for other days, @@ -148,6 +150,7 @@ var/list/admin_verbs_spawn = list( /datum/admins/proc/spawn_plant, /datum/admins/proc/spawn_atom, //allows us to spawn instances, /client/proc/respawn_character, + /client/proc/spawn_character_mob, //VOREStation Add, /client/proc/virus2_editor, /client/proc/spawn_chemdisp_cartridge, /client/proc/map_template_load, @@ -266,6 +269,8 @@ var/list/admin_verbs_hideable = list( /datum/admins/proc/view_atk_log, /client/proc/cmd_admin_subtle_message, /client/proc/cmd_admin_check_contents, + /client/proc/cmd_admin_check_player_logs, + /client/proc/cmd_admin_check_dialogue_logs, /datum/admins/proc/access_news_network, /client/proc/admin_call_shuttle, /client/proc/admin_cancel_shuttle, diff --git a/code/modules/admin/secrets/admin_secrets/admin_logs.dm b/code/modules/admin/secrets/admin_secrets/admin_logs.dm index d2664f1e2be..b578eb046ff 100644 --- a/code/modules/admin/secrets/admin_secrets/admin_logs.dm +++ b/code/modules/admin/secrets/admin_secrets/admin_logs.dm @@ -10,4 +10,35 @@ dat += "
    11. [l]
    12. " if(!admin_log.len) dat += "No-one has done anything this round!" - user << browse(dat, "window=admin_log") + + var/datum/browser/popup = new(user, "adminlogs", "[src]", 550, 650, src) + popup.set_content(jointext(dat,null)) + popup.open() + + onclose(user, "adminlogs") + + +/datum/admin_secret_item/admin_secret/round_logs + name = "Round Dialogue Logs" + +/datum/admin_secret_item/admin_secret/round_logs/execute(var/mob/user) + . = ..() + if(!.) + return + var/dat = "Dialogue Log
      " + + dat += "
      " + + for(var/l in GLOB.round_text_log) + dat += "
    13. [l]
    14. " + + dat += "
      " + + if(!GLOB.round_text_log) + dat += "No-one has said anything this round! (How odd?)" + + var/datum/browser/popup = new(user, "dialoguelogs", "[src]", 550, 650, src) + popup.set_content(jointext(dat,null)) + popup.open() + + onclose(user, "dialoguelogs") diff --git a/code/modules/admin/secrets/admin_secrets/prison_warp.dm b/code/modules/admin/secrets/admin_secrets/prison_warp.dm index d0d41cea5d5..6f0732e781a 100644 --- a/code/modules/admin/secrets/admin_secrets/prison_warp.dm +++ b/code/modules/admin/secrets/admin_secrets/prison_warp.dm @@ -30,7 +30,7 @@ H.drop_from_inventory(W) //teleport person to cell H.loc = pick(prisonwarp) - H.equip_to_slot_or_del(new /obj/item/clothing/under/color/orange(H), slot_w_uniform) + H.equip_to_slot_or_del(new /obj/item/clothing/under/color/prison(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/orange(H), slot_shoes) else //teleport security person diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index fb680f74abc..ca971c9b65d 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1057,7 +1057,7 @@ M.loc = prison_cell if(istype(M, /mob/living/carbon/human)) var/mob/living/carbon/human/prisoner = M - prisoner.equip_to_slot_or_del(new /obj/item/clothing/under/color/orange(prisoner), slot_w_uniform) + prisoner.equip_to_slot_or_del(new /obj/item/clothing/under/color/prison(prisoner), slot_w_uniform) prisoner.equip_to_slot_or_del(new /obj/item/clothing/shoes/orange(prisoner), slot_shoes) M << "You have been sent to the prison station!" diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index a6e50cb1082..2b2a6672ebd 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -490,6 +490,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) if(alert(usr, "You already have a ticket open. Is this for the same issue?",,"Yes","No") != "No") if(current_ticket) current_ticket.MessageNoRecipient(msg) + to_chat(usr, "PM to-Admins: [msg]") return else to_chat(usr, "Ticket not found, creating new one...") diff --git a/code/modules/admin/verbs/adminhelp_vr.dm b/code/modules/admin/verbs/adminhelp_vr.dm index 9f3aee4a838..f2df8e4eb29 100644 --- a/code/modules/admin/verbs/adminhelp_vr.dm +++ b/code/modules/admin/verbs/adminhelp_vr.dm @@ -1,8 +1,8 @@ -/datum/admin_help/proc/send2adminchat() +/datum/admin_help/proc/send2adminchat() if(!config.chat_webhook_url) return - var/list/adm = get_admin_counts() + var/list/adm = get_admin_counts() var/list/afkmins = adm["afk"] var/list/allmins = adm["total"] @@ -14,3 +14,25 @@ query_string += "&admin_number=[allmins.len]" query_string += "&admin_number_afk=[afkmins.len]" world.Export("[config.chat_webhook_url]?[query_string]") + +/client/verb/adminspice() + set category = "Admin" + set name = "Request Spice" + set desc = "Request admins to spice round up for you" + + //handle muting and automuting + if(prefs.muted & MUTE_ADMINHELP) + to_chat(usr, "Error: You cannot request spice (muted from adminhelps).") + return + + if(alert(usr, "Are you sure you want to request the admins spice things up for you? You accept the consequences if you do.",,"No","Yes") != "No") + message_admins("[ADMIN_FULLMONTY(usr)] has requested the round be spiced up a little.") + to_chat(usr, "You have requested some more spice in your round.") + else + to_chat(usr, "Spice request cancelled.") + return + + //if they requested spice, then remove spice verb temporarily to prevent spamming + usr.verbs -= /client/verb/adminspice + spawn(6000) + usr.verbs += /client/verb/adminspice // 10 minute cool-down for spice request diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 321655bb15a..11541128c50 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -282,11 +282,11 @@ var/obj/item/device/pda/pda = H.wear_id id = pda.id id.icon_state = "gold" - id.access = get_all_accesses() + id.access = get_all_accesses().Copy() else var/obj/item/weapon/card/id/id = new/obj/item/weapon/card/id(M); id.icon_state = "gold" - id.access = get_all_accesses() + id.access = get_all_accesses().Copy() id.registered_name = H.real_name id.assignment = "Colony Director" id.name = "[id.registered_name]'s ID Card ([id.assignment])" diff --git a/code/modules/admin/verbs/lightning_strike.dm b/code/modules/admin/verbs/lightning_strike.dm index 6adb122d4a0..1981e3f0d84 100644 --- a/code/modules/admin/verbs/lightning_strike.dm +++ b/code/modules/admin/verbs/lightning_strike.dm @@ -65,7 +65,8 @@ var/sound = get_sfx("thunder") for(var/mob/M in player_list) if((P && M.z in P.expected_z_levels) || M.z == T.z) - M.playsound_local(get_turf(M), soundin = sound, vol = 70, vary = FALSE, is_global = TRUE) + if(M.is_preference_enabled(/datum/client_preference/weather_sounds)) + M.playsound_local(get_turf(M), soundin = sound, vol = 70, vary = FALSE, is_global = TRUE) if(cosmetic) // Everything beyond here involves potentially damaging things. If we don't want to do that, stop now. return diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 3475e60314b..3ffd76878eb 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -35,7 +35,7 @@ M.loc = pick(prisonwarp) if(istype(M, /mob/living/carbon/human)) var/mob/living/carbon/human/prisoner = M - prisoner.equip_to_slot_or_del(new /obj/item/clothing/under/color/orange(prisoner), slot_w_uniform) + prisoner.equip_to_slot_or_del(new /obj/item/clothing/under/color/prison(prisoner), slot_w_uniform) prisoner.equip_to_slot_or_del(new /obj/item/clothing/shoes/orange(prisoner), slot_shoes) spawn(50) M << "You have been sent to the prison station!" @@ -368,7 +368,7 @@ Traitors and the like can also be revived with the previous role mostly intact. return var/location = alert(src,"Please specify where to spawn them.", "Location", "Right Here", "Arrivals", "Cancel") - if(!location) + if(location == "Cancel" || !location) return var/announce = alert(src,"Announce as if they had just arrived?", "Announce", "Yes", "No", "Cancel") @@ -491,7 +491,7 @@ Traitors and the like can also be revived with the previous role mostly intact. if(equipment) if(charjob) job_master.EquipRank(new_character, charjob, 1) - equip_custom_items(new_character) + //equip_custom_items(new_character) //VOREStation Removal //If desired, add records. if(records) diff --git a/code/modules/admin/verbs/randomverbs_vr.dm b/code/modules/admin/verbs/randomverbs_vr.dm new file mode 100644 index 00000000000..9fee7c58d08 --- /dev/null +++ b/code/modules/admin/verbs/randomverbs_vr.dm @@ -0,0 +1,74 @@ +/client/proc/spawn_character_mob() + set category = "Special Verbs" + set name = "Spawn Character As Mob" + set desc = "Spawn a specified ckey as a chosen mob." + if(!holder) + to_chat(src, "Only administrators may use this command.") + return + + var/client/picked_client = input(src, "Who are we spawning as a mob?", "Client", "Cancel") as null|anything in GLOB.clients + if(!picked_client) + return + var/list/types = typesof(/mob/living) + var/mob_type = input(src, "Mob path to spawn as?", "Mob") as text + if(!mob_type) + return + var/list/matches = new() + for(var/path in types) + if(findtext("[path]", mob_type)) + matches += path + if(matches.len==0) + return + var/mob/living/chosen + if(matches.len==1) + chosen = matches[1] + else + chosen = input("Select a mob type", "Select Mob", matches[1]) as null|anything in matches + if(!chosen) + return + + var/char_name = alert(src, "Spawn mob with their character name?", "Mob name", "Yes", "No", "Cancel") + var/name = 0 + if(char_name == "Cancel") + return + if(char_name == "Yes") + name = 1 + var/vorgans = alert(src, "Spawn mob with their character's vore organs and prefs?", "Vore organs", "Yes", "No", "Cancel") + var/organs + if(vorgans == "Cancel") + return + if(vorgans == "Yes") + organs = 1 + if(vorgans == "No") + organs = 0 + + var/spawnloc + if(!src.mob) + to_chat(src, "Can't spawn them in unless you're in a valid spawn location!") + return + spawnloc = get_turf(src.mob) + + var/mob/living/new_mob = new chosen(spawnloc) + + if(!new_mob) + to_chat(src, "Spawning failed, try again or bully coders") + return + new_mob.ai_holder_type = /datum/ai_holder/simple_mob/inert //Dont want the mob AI to activate if the client dc's or anything + + if(name) + new_mob.real_name = picked_client.prefs.real_name + new_mob.name = picked_client.prefs.real_name + + + new_mob.key = picked_client.key //Finally put them in the mob + if(organs) + new_mob.copy_from_prefs_vr() + + log_admin("[key_name_admin(src)] has spawned [new_mob.key] as mob [new_mob.type].") + message_admins("[key_name_admin(src)] has spawned [new_mob.key] as mob [new_mob.type].", 1) + + to_chat(new_mob, "You've been spawned as a mob! Have fun.") + + feedback_add_details("admin_verb","SCAM") //heh + + return new_mob \ No newline at end of file diff --git a/code/modules/admin/verbs/smite_vr.dm b/code/modules/admin/verbs/smite_vr.dm index 0d048dde2d8..b0d4b8aa8cf 100644 --- a/code/modules/admin/verbs/smite_vr.dm +++ b/code/modules/admin/verbs/smite_vr.dm @@ -18,7 +18,6 @@ feedback_add_details("admin_verb","SMITEV") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! switch(smite_choice) - /* if(SMITE_SHADEKIN_ATTACK) var/turf/Tt = get_turf(target) //Turf for target @@ -35,22 +34,22 @@ if(!Ts) return //Didn't find shadekin spawn turf - var/mob/living/simple_mob/shadekin/red/shadekin = new(Ts) + var/mob/living/simple_mob/shadekin/red/ai/shadekin = new(Ts) //Abuse of shadekin shadekin.real_name = shadekin.name shadekin.init_vore() shadekin.ability_flags |= 0x1 - shadekin.specific_targets = TRUE //Don't attack others shadekin.phase_shift() - shadekin.target_mob = target - shadekin.stance = STANCE_ATTACK + shadekin.ai_holder.give_target(target) + shadekin.ai_holder.hostile = FALSE + shadekin.ai_holder.mauling = TRUE shadekin.Life() //Remove when done spawn(10 SECONDS) if(shadekin) - shadekin.death()*/ //VORESTATION AI TEMPORARY REMOVAL + shadekin.death() - /*if(SMITE_SHADEKIN_NOMF) + if(SMITE_SHADEKIN_NOMF) var/list/kin_types = list( "Red Eyes (Dark)" = /mob/living/simple_mob/shadekin/red/dark, "Red Eyes (Light)" = /mob/living/simple_mob/shadekin/red/white, @@ -93,7 +92,6 @@ shadekin.real_name = shadekin.name shadekin.init_vore() shadekin.can_be_drop_pred = TRUE - shadekin.ai_inactive = TRUE shadekin.dir = SOUTH shadekin.ability_flags |= 0x1 shadekin.phase_shift() //Homf @@ -119,7 +117,7 @@ target.ghostize() qdel(target) qdel(shadekin) - */ + if(SMITE_REDSPACE_ABDUCT) redspace_abduction(target, src) diff --git a/code/modules/ai/aI_holder_subtypes/slime_xenobio_ai_vr.dm b/code/modules/ai/aI_holder_subtypes/slime_xenobio_ai_vr.dm new file mode 100644 index 00000000000..c4bb314359c --- /dev/null +++ b/code/modules/ai/aI_holder_subtypes/slime_xenobio_ai_vr.dm @@ -0,0 +1,3 @@ +/datum/ai_holder/simple_mob/xenobio_slime/post_melee_attack(atom/A) + var/mob/living/simple_mob/slime/xenobio/my_slime = holder + my_slime.a_intent = I_HELP // Return back to help after attacking \ No newline at end of file diff --git a/code/modules/artifice/cursedform.dm b/code/modules/artifice/cursedform.dm new file mode 100644 index 00000000000..17f8fbf6183 --- /dev/null +++ b/code/modules/artifice/cursedform.dm @@ -0,0 +1,40 @@ +/obj/item/weapon/paper/carbon/cursedform + name = "Form - Inventory Requisition r10.7.1E" + +/obj/item/weapon/paper/carbon/cursedform/Initialize() + ..() + info = {"

      Form - Inventory Requisition r10.7.1E

      General Request Form


      General


      Name:
      Department:
      Departmental Rank:
      Organization(If not Nanotrasen):
      Date:



      Requested Item(s):
      Quantity:
      Reason for request:
      Is this replacement equipment?:
      If `Yes`; above, specify equiment and reason for replacement:


      Authorization


      Authorizing Department:
      Authorizing Dept. Head:


      Contact and Delivery


      EPv2 Address of requesting party(Do not leave blank):
      Delivery location or department:


      Nanotrasen Employee Identification Number:
      Signature of Requester and Date





      Authorizor`s Nanotrasen Employee Identification Number:
      Authorizing Signature and Date(Include authorizing department`s stamp below)




      Shipping Department Only

      (Do not write below this line)

      Nanotrasen Purchasing Approval Code:
      Nanotrasen Employee Identification Number:
      Receiving Shipping Employee:
      Signature and Date


      "} + info_links = {"

      Form - Inventory Requisition r10.7.1E

      General Request Form


      General


      Name: write
      Department: write
      Departmental Rank: write
      Organization(If not Nanotrasen): write
      Date: write



      Requested Item(s): write
      Quantity: write
      Reason for request: write
      Is this replacement equipment?: write
      If `Yes` above, specify equiment and reason for replacement: write


      Authorization


      Authorizing Department: write
      Authorizing Dept. Head: write


      Contact and Delivery


      EPv2 Address of requesting party(Do not leave blank): write
      Delivery location or department: write


      Nanotrasen Employee Identification Number: write
      Signature of Requester and Date

      write



      Authorizor`s Nanotrasen Employee Identification Number: write
      Authorizing Signature and Date(Include authorizing department`s stamp below)

      write


      Shipping Department Only

      (Do not write below this line)

      Nanotrasen Purchasing Approval Code: write
      Nanotrasen Employee Identification Number: write
      Receiving Shipping Employee: write
      Signature and Date

      write
      write"} + +/obj/item/weapon/paper/carbon/cursedform/AltClick() // No fun. + return + +/obj/item/weapon/paper/carbon/cursedform/burnpaper(obj/item/weapon/flame/P, mob/user) + var/class = "warning" + var/datum/gender/TU = gender_datums[user.get_visible_gender()] + + if(P.lit && !user.restrained()) + if(istype(P, /obj/item/weapon/flame/lighter/zippo)) + class = "rose" + + user.visible_message("[user] holds \the [P] up to \the [src], it looks like [TU.hes] trying to burn it!", \ + "You hold \the [P] up to \the [src], burning it slowly.") + + if(do_after(user, 2 SECONDS, src) && P.lit) + user.visible_message("[user] burns right through \the [src], turning it to ash. It flutters through the air before settling on the floor in a heap.", \ + "You burn right through \the [src], turning it to ash. It flutters through the air before settling on the floor in a heap.") + + if(user.get_inactive_hand() == src) + user.drop_from_inventory(src) + + new /obj/effect/decal/cleanable/ash(src.loc) + qdel(src) + + else + to_chat(user,"You must hold \the [P] steady to burn \the [src].") + + if(isliving(user)) + var/mob/living/L = user + L.visible_message("[L] convulses, the very letters of \the [src] searing themselves into their eyes!", \ + "You convulse, the very letters of \the [src] searing themselves into your eyes!") + L.add_modifier(/datum/modifier/grievous_wounds, 10 MINUTES) diff --git a/code/modules/artifice/telecube.dm b/code/modules/artifice/telecube.dm new file mode 100644 index 00000000000..bb2af4b83dd --- /dev/null +++ b/code/modules/artifice/telecube.dm @@ -0,0 +1,236 @@ +/* + * Home of the telecube. + */ + +/datum/category_item/catalogue/anomalous/precursor_a/telecube + name = "Quantomatically Entangled Digicube" + + desc = "An enigmatic cube that appears superficially similar to a Positronic Cube. \ + However, the similarities hopefully end there, as this device emits no sound during \ + operation or observation. Its alloy composition is unknown, though it is incredibly \ + dense, as it resists any and all forms of radiation.
      \ + Upon physical contact, however, the device will translocate the offending entity to a \ + matching twin cube, generating no detectable radiation. This process occurs at speeds \ + unmatched even by modern predictions of Bluespace technology, and with no visible power \ + source." + + value = CATALOGUER_REWARD_HARD + +// Standard one needs to be smacked onto another one to link together. +/obj/item/weapon/telecube + name = "locus" + desc = "A strange metallic cube that pulses silently." + description_info = "Ctrl-Clicking on this object will attempt to activate its unique ability." + icon = 'icons/obj/props/telecube.dmi' + icon_state = "cube" + w_class = ITEMSIZE_SMALL + origin_tech = list(TECH_MATERIAL = 7, TECH_POWER = 6, TECH_BLUESPACE = 7, TECH_ANOMALY = 2, TECH_PRECURSOR = 2) + + catalogue_data = list(/datum/category_item/catalogue/anomalous/precursor_a/telecube) + + slowdown = 5 + + throw_range = 2 + + var/obj/item/weapon/telecube/mate = null + + var/start_paired = FALSE + var/mirror_colors = FALSE + + var/randomize_colors = FALSE + + var/glow_color = "#FFFFFF" + var/image/glow = null + var/image/charge = null + + var/shell_color = "#FFFFFF" + var/image/shell = null + + var/cooldown_time = 30 SECONDS + var/last_teleport = 0 + +// How far the cube will search for things to teleport. 0 = only contacting objects / mobs. + var/teleport_range = 0 // For all that is holy, do not change this unless you know what you're doing. + + var/omniteleport = FALSE // Will this teleport anchored things too? + +/obj/item/weapon/telecube/Initialize() + . = ..() + START_PROCESSING(SSobj, src) + last_teleport = world.time + + glow = image(icon = icon, icon_state = "[icon_state]-ready") + glow.plane = PLANE_LIGHTING_ABOVE + charge = image(icon = icon, icon_state = "[icon_state]-charging") + charge.plane = PLANE_LIGHTING_ABOVE + shell = image(icon = icon, icon_state = "[icon_state]") + + if(teleport_range) + description_info += "
      " + description_info += "Alt-Clicking on this object will utilize its second unique ability." + + if(randomize_colors) + glow_color = rgb(rand(0, 255),rand(0, 255),rand(0, 255)) + shell_color = rgb(rand(0, 255),rand(0, 255),rand(0, 255)) + + if(start_paired) + mate = new(src.loc) + if(mirror_colors) + mate.glow_color = shell_color + mate.shell_color = glow_color + else + mate.glow_color = glow_color + mate.shell_color = shell_color + mate.pair_cube(src) + + glow.color = glow_color + charge.color = glow_color + shell.color = shell_color + + return + +/obj/item/weapon/telecube/process() + ..() + update_icon() + +/obj/item/weapon/telecube/update_icon() + . = ..() + glow.color = glow_color + charge.color = glow_color + shell.color = shell_color + + if(shell.color != initial(shell.color)) + cut_overlay(shell) + add_overlay(shell) + + if(world.time < (last_teleport + cooldown_time)) + cut_overlay(charge) + cut_overlay(glow) + add_overlay(charge) + else + cut_overlay(glow) + cut_overlay(charge) + add_overlay(glow) + +/obj/item/weapon/telecube/Destroy() + STOP_PROCESSING(SSobj, src) + if(mate) + var/turf/T = get_turf(mate) + mate.visible_message("\The [mate] collapses into itself!") + mate.mate = null + mate = null + explosion(T,1,3,7) + + ..() + +/obj/item/weapon/telecube/proc/pair_cube(var/obj/item/weapon/telecube/M) + if(mate) + return 0 + else + mate = M + update_icon() + return 1 + +/obj/item/weapon/telecube/proc/teleport_to_mate(var/atom/movable/A, var/areaporting = FALSE) + . = FALSE + + if(!A) + return . + + if(A == src || A == mate) + A.visible_message("\The [A] distorts and fades, before popping back into existence.") + return . + + var/mob/living/L = src.loc + + if(istype(L)) + L.drop_from_inventory(src) + forceMove(get_turf(src)) + + if(world.time < (last_teleport + cooldown_time)) + return . + + if((A.anchored && !omniteleport) || !mate) + A.visible_message("\The [A] distorts for a moment, before reforming in the same position.") + return . + + var/turf/TLocate = get_turf(mate) + + var/turf/T1 = get_turf(locate(TLocate.x + (A.x - x), TLocate.y + (A.y - y), TLocate.z)) + + if(T1) + A.visible_message("\The [A] fades out of existence.") + A.forceMove(T1) + . = TRUE + A.visible_message("\The [A] fades into existence.") + else + return . + + if(teleport_range && !areaporting) + for(var/atom/movable/M in orange(teleport_range, A)) + teleport_to_mate(M, TRUE) + +/obj/item/weapon/telecube/proc/swap_with_mate() + . = FALSE + + if(!mate || !teleport_range) + return . + + var/list/objects_near_me = range(teleport_range, get_turf(src)) + var/list/objects_near_mate = range(teleport_range, get_turf(mate)) + + for(var/atom/movable/M in objects_near_me) + teleport_to_mate(M, TRUE) + + for(var/atom/movable/M1 in objects_near_mate) + mate.teleport_to_mate(M1, TRUE) + + . = TRUE + return . + +/obj/item/weapon/telecube/CtrlClick(mob/user) + if(Adjacent(user)) + if(teleport_to_mate(user)) + last_teleport = world.time + return + +/obj/item/weapon/telecube/AltClick(mob/user) + if(Adjacent(user)) + if(swap_with_mate()) + last_teleport = world.time + mate.last_teleport = world.time + return + +/obj/item/weapon/telecube/Bump(atom/movable/AM) + if(teleport_to_mate(AM)) + last_teleport = world.time + . = ..() + +/obj/item/weapon/telecube/Bumped(atom/movable/M as mob|obj) + if(teleport_to_mate(M)) + last_teleport = world.time + . = ..() + +// Subtypes + +/obj/item/weapon/telecube/mated + start_paired = TRUE + +/obj/item/weapon/telecube/randomized + randomize_colors = TRUE + +/obj/item/weapon/telecube/randomized/mated + start_paired = TRUE + +/obj/item/weapon/telecube/precursor + glow_color = "#FF1D8E" + shell_color = "#2F1B26" + +/obj/item/weapon/telecube/precursor/mated + start_paired = TRUE + +/obj/item/weapon/telecube/precursor/mated/zone + teleport_range = 2 + +/obj/item/weapon/telecube/precursor/mated/mirrorcolor + mirror_colors = TRUE diff --git a/code/modules/awaymissions/zlevel.dm b/code/modules/awaymissions/zlevel.dm index 1182129cd69..bf1165d2ea0 100644 --- a/code/modules/awaymissions/zlevel.dm +++ b/code/modules/awaymissions/zlevel.dm @@ -62,4 +62,10 @@ proc/createRandomZlevel() /obj/effect/landmark/gateway_scatter/Initialize() . = ..() awaydestinations += src + +/obj/effect/landmark/event_scatter + name = "uncalibrated gateway destination" +/obj/effect/landmark/event_scatter/Initialize() + . = ..() + eventdestinations += src //VOREStation Add End diff --git a/code/modules/blob/blob.dm b/code/modules/blob/blob.dm index c9ab387753a..877c684b5ea 100644 --- a/code/modules/blob/blob.dm +++ b/code/modules/blob/blob.dm @@ -40,7 +40,7 @@ else icon_state = "blob_damaged" -/obj/effect/blob/proc/take_damage(var/damage) +/obj/effect/blob/take_damage(var/damage) // VOREStation Edit health -= damage if(health < 0) playsound(loc, 'sound/effects/splat.ogg', 50, 1) diff --git a/code/modules/blob2/overmind/types.dm b/code/modules/blob2/overmind/types.dm index 6049ccfc726..49b968cfccd 100644 --- a/code/modules/blob2/overmind/types.dm +++ b/code/modules/blob2/overmind/types.dm @@ -593,7 +593,7 @@ attack_verb = "splashes" /datum/blob_type/radioactive_ooze/on_pulse(var/obj/structure/blob/B) - radiation_repository.radiate(B, 200) + SSradiation.radiate(B, 200) /datum/blob_type/volatile_alluvium name = "volatile alluvium" diff --git a/code/modules/catalogue/cataloguer.dm b/code/modules/catalogue/cataloguer.dm index 60e86eadeee..f1c57564430 100644 --- a/code/modules/catalogue/cataloguer.dm +++ b/code/modules/catalogue/cataloguer.dm @@ -312,3 +312,15 @@ GLOBAL_LIST_EMPTY(all_cataloguers) interact(usr) // So it refreshes the window. return 1 +/obj/item/device/cataloguer/attackby(obj/item/weapon/W, mob/user) + if(istype(W, /obj/item/weapon/card/id) && !busy) + busy = TRUE + var/obj/item/weapon/card/id/ID = W + if(points_stored) + ID.survey_points += points_stored + points_stored = 0 + to_chat(user, "You swipe the id over \the [src].") + else + to_chat(user, "\The [src] has no points available.") + busy = FALSE + return ..() diff --git a/code/modules/catalogue/cataloguer_vr.dm b/code/modules/catalogue/cataloguer_vr.dm new file mode 100644 index 00000000000..d1dfac5deac --- /dev/null +++ b/code/modules/catalogue/cataloguer_vr.dm @@ -0,0 +1,56 @@ +/obj/item/device/cataloguer/compact + name = "compact cataloguer" + icon = 'icons/vore/custom_items_vr.dmi' + icon_state = "tricorder" + action_button_name = "Toggle Cataloguer" + var/deployed = TRUE + scan_range = 1 + toolspeed = 1.2 + +/obj/item/device/cataloguer/compact/update_icon() + if(busy) + icon_state = "[initial(icon_state)]_s" + else + icon_state = initial(icon_state) + +/obj/item/device/cataloguer/compact/ui_action_click() + toggle() + +/obj/item/device/cataloguer/compact/verb/toggle() + set name = "Toggle Cataloguer" + set category = "Object" + + if(busy) + to_chat(usr, span("warning", "\The [src] is currently scanning something.")) + return + deployed = !(deployed) + if(deployed) + w_class = ITEMSIZE_NORMAL + icon_state = "[initial(icon_state)]" + to_chat(usr, span("notice", "You flip open \the [src].")) + else + w_class = ITEMSIZE_SMALL + icon_state = "[initial(icon_state)]_closed" + to_chat(usr, span("notice", "You close \the [src].")) + + if (ismob(usr)) + var/mob/M = usr + M.update_action_buttons() + +/obj/item/device/cataloguer/compact/afterattack(atom/target, mob/user, proximity_flag) + if(!deployed) + to_chat(user, span("warning", "\The [src] is closed.")) + return + return ..() + +/obj/item/device/cataloguer/compact/pulse_scan(mob/user) + if(!deployed) + to_chat(user, span("warning", "\The [src] is closed.")) + return + return ..() + +/obj/item/device/cataloguer/compact/pathfinder + name = "pathfinder's cataloguer" + icon_state = "tricorder_med" + scan_range = 3 + toolspeed = 1 diff --git a/code/modules/catalogue/rewards/construction.dm b/code/modules/catalogue/rewards/construction.dm deleted file mode 100644 index 8bfca1f79d4..00000000000 --- a/code/modules/catalogue/rewards/construction.dm +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef T_BOARD -#error T_BOARD macro is not defined but we need it! -#endif - -/obj/item/weapon/circuitboard/exploration_equipment_vendor - name = T_BOARD("Exploration Equipment Vendor") - board_type = new /datum/frame/frame_types/machine - build_path = /obj/machinery/equipment_vendor/exploration - origin_tech = list(TECH_DATA = 1, TECH_ENGINEERING = 2) - req_components = list( - /obj/item/weapon/stock_parts/console_screen = 1, - /obj/item/weapon/stock_parts/matter_bin = 3) diff --git a/code/modules/catalogue/rewards/equipment_vendor.dm b/code/modules/catalogue/rewards/equipment_vendor.dm deleted file mode 100644 index d5c6574e052..00000000000 --- a/code/modules/catalogue/rewards/equipment_vendor.dm +++ /dev/null @@ -1,165 +0,0 @@ -/**********************Exploration Equipment Vendor**************************/ - -/obj/machinery/equipment_vendor/exploration - name = "exploration equipment vendor" - desc = "An equipment vendor for explorers, points collected with cataloguers can be spent here." - icon = 'icons/obj/machines/mining_machines_vr.dmi' - icon_state = "exploration" - density = TRUE - anchored = TRUE - circuit = /obj/item/weapon/circuitboard/exploration_equipment_vendor - var/icon_deny = "exploration-deny" - var/icon_vend = "exploration-vend" - var/obj/item/device/cataloguer/inserted_cataloguer - var/list/prize_list = list( - new /datum/data/exploration_equipment("1 Marker Beacon", /obj/item/stack/marker_beacon, 1), - new /datum/data/exploration_equipment("10 Marker Beacons", /obj/item/stack/marker_beacon/ten, 10), - new /datum/data/exploration_equipment("30 Marker Beacons", /obj/item/stack/marker_beacon/thirty, 30), - new /datum/data/exploration_equipment("GPS Device", /obj/item/device/gps/explorer, 10), - new /datum/data/exploration_equipment("Whiskey", /obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey, 10), - new /datum/data/exploration_equipment("Absinthe", /obj/item/weapon/reagent_containers/food/drinks/bottle/absinthe, 10), - new /datum/data/exploration_equipment("Cigar", /obj/item/clothing/mask/smokable/cigarette/cigar/havana, 15), - new /datum/data/exploration_equipment("Soap", /obj/item/weapon/soap/nanotrasen, 20), - new /datum/data/exploration_equipment("Laser Pointer", /obj/item/device/laser_pointer, 90), - new /datum/data/exploration_equipment("Plush Toy", /obj/random/plushie, 30), - new /datum/data/exploration_equipment("Shelter Capsule", /obj/item/device/survivalcapsule, 50), - new /datum/data/exploration_equipment("Point Transfer Card", /obj/item/weapon/card/exploration_point_card, 50), - new /datum/data/exploration_equipment("Survival Medipen", /obj/item/weapon/reagent_containers/hypospray/autoinjector/miner, 50), - new /datum/data/exploration_equipment("Mini-Translocator", /obj/item/device/perfect_tele/one_beacon, 120), - new /datum/data/exploration_equipment("Space Cash", /obj/item/weapon/spacecash/c100, 100), - new /datum/data/exploration_equipment("Jump Boots", /obj/item/clothing/shoes/bhop, 250), - new /datum/data/exploration_equipment("Luxury Shelter Capsule", /obj/item/device/survivalcapsule/luxury, 310) - ) - -/datum/data/exploration_equipment - var/equipment_name = "generic" - var/equipment_path = null - var/cost = 0 - -/datum/data/exploration_equipment/New(name, path, cost) - src.equipment_name = name - src.equipment_path = path - src.cost = cost - -/obj/machinery/equipment_vendor/exploration/power_change() - var/old_stat = stat - ..() - if(old_stat != stat) - update_icon() - if(inserted_cataloguer && !powered()) - visible_message("The cataloguer slot indicator light flickers on \the [src] as it spits out the device before powering down.") - inserted_cataloguer.forceMove(get_turf(src)) - -/obj/machinery/equipment_vendor/exploration/update_icon() - if(panel_open) - icon_state = "[initial(icon_state)]-open" - else if(powered()) - icon_state = initial(icon_state) - else - icon_state = "[initial(icon_state)]-off" - -/obj/machinery/equipment_vendor/exploration/attack_hand(mob/user) - if(..()) - return - interact(user) - -/obj/machinery/equipment_vendor/exploration/attack_ghost(mob/user) - interact(user) - -/obj/machinery/equipment_vendor/exploration/interact(mob/user) - user.set_machine(src) - - var/dat - dat +="
      " - if(istype(inserted_cataloguer)) - dat += "You have [inserted_cataloguer.points_stored] exploration points collected. Eject Cataloguer.
      " - else - dat += "No Cataloguer inserted. Insert Cataloguer.
      " - dat += "
      " - dat += "
      Equipment point cost list:
      " - for(var/datum/data/exploration_equipment/prize in prize_list) - dat += "" - dat += "
      [prize.equipment_name][prize.cost]Purchase
      " - var/datum/browser/popup = new(user, "miningvendor", "Exploration Equipment Vendor", 400, 600) - popup.set_content(dat) - popup.open() - -/obj/machinery/equipment_vendor/exploration/Topic(href, href_list) - if(..()) - return 1 - - if(href_list["choice"]) - if(istype(inserted_cataloguer)) - if(href_list["choice"] == "eject") - to_chat(usr, "You eject the ID from [src]'s card slot.") - usr.put_in_hands(inserted_cataloguer) - inserted_cataloguer = null - else if(href_list["choice"] == "insert") - var/obj/item/device/cataloguer/C = usr.get_active_hand() - if(istype(C) && !inserted_cataloguer && usr.unEquip(C)) - C.forceMove(src) - inserted_cataloguer = C - interact(usr) - to_chat(usr, "You insert the ID into [src]'s card slot.") - else - to_chat(usr, "No valid ID.") - flick(icon_deny, src) - - if(href_list["purchase"]) - if(istype(inserted_cataloguer)) - var/datum/data/exploration_equipment/prize = locate(href_list["purchase"]) - if (!prize || !(prize in prize_list)) - to_chat(usr, "Error: Invalid choice!") - flick(icon_deny, src) - return - if(prize.cost > inserted_cataloguer.points_stored) - to_chat(usr, "Error: Insufficent points for [prize.equipment_name]!") - flick(icon_deny, src) - else - inserted_cataloguer.points_stored -= prize.cost - to_chat(usr, "[src] clanks to life briefly before vending [prize.equipment_name]!") - flick(icon_vend, src) - new prize.equipment_path(drop_location()) - else - to_chat(usr, "Error: Please insert a valid ID!") - flick(icon_deny, src) - updateUsrDialog() - -/obj/machinery/equipment_vendor/exploration/attackby(obj/item/I, mob/user, params) - if(default_deconstruction_screwdriver(user, I)) - updateUsrDialog() - return - if(default_part_replacement(user, I)) - return - if(default_deconstruction_crowbar(user, I)) - return - if(istype(I,/obj/item/device/cataloguer)) - if(!powered()) - return - else if(!inserted_cataloguer && user.unEquip(I)) - I.forceMove(src) - inserted_cataloguer = I - interact(user) - return - ..() - -/obj/machinery/equipment_vendor/exploration/dismantle() - if(inserted_cataloguer) - inserted_cataloguer.forceMove(loc) //Prevents deconstructing the ORM from deleting whatever ID was inside it. - . = ..() - -/obj/machinery/equipment_vendor/exploration/proc/new_prize(var/name, var/path, var/cost) // Generic proc for adding new entries. Good for abusing for FUN and PROFIT. - if(!cost) - cost = 100 - if(!path) - path = /obj/item/stack/marker_beacon - if(!name) - name = "Generic Entry" - prize_list += new /datum/data/exploration_equipment(name, path, cost) - -/obj/machinery/equipment_vendor/exploration/ex_act(severity, target) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(5, 1, src) - s.start() - if(prob(50 / severity) && severity < 3) - qdel(src) diff --git a/code/modules/catalogue/rewards/exp_point_items.dm b/code/modules/catalogue/rewards/exp_point_items.dm deleted file mode 100644 index 47e066763ba..00000000000 --- a/code/modules/catalogue/rewards/exp_point_items.dm +++ /dev/null @@ -1,23 +0,0 @@ -/obj/item/weapon/card/exploration_point_card - name = "exploration point card" - desc = "A small card preloaded with exploration points. Swipe your Cataloguer over it to transfer the points, then discard." - icon_state = "data" - var/points = 50 - -/obj/item/weapon/card/exploration_point_card/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/device/cataloguer)) - if(points) - var/obj/item/device/cataloguer/C = I - C.points_stored += points - to_chat(user, "You transfer [points] points to [C].") - points = 0 - else - to_chat(user, "There's no points left on [src].") - ..() - -/obj/item/weapon/card/exploration_point_card/examine(mob/user) - ..(user) - to_chat(user, "There's [points] points on the card.") - -/obj/item/weapon/card/exploration_point_card/can_catalogue(mob/user) - return FALSE \ No newline at end of file diff --git a/code/modules/client/preference_setup/general/03_body.dm b/code/modules/client/preference_setup/general/03_body.dm index 6f35aff05f5..fe4b1a93996 100644 --- a/code/modules/client/preference_setup/general/03_body.dm +++ b/code/modules/client/preference_setup/general/03_body.dm @@ -390,7 +390,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O else return TOPIC_NOACTION - if(((!(setting_species.spawn_flags & SPECIES_CAN_JOIN)) || (!is_alien_whitelisted(preference_mob(),setting_species))) && !check_rights(R_ADMIN, 0)) + if(((!(setting_species.spawn_flags & SPECIES_CAN_JOIN)) || (!is_alien_whitelisted(preference_mob(),setting_species))) && !check_rights(R_ADMIN, 0) && !(setting_species.spawn_flags & SPECIES_WHITELIST_SELECTABLE)) //VOREStation Edit: selectability return TOPIC_NOACTION var/prev_species = pref.species @@ -818,7 +818,12 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O dat += "

      [current_species.name] \[change\]


      " dat += "" dat += "" - dat += "" + //vorestation edit begin + if(current_species.wikilink) + dat += "" + else + dat += "" + //vorestation edit end dat += "" for(var/gear_name in LC.gear) var/datum/gear/G = LC.gear[gear_name] + if(G.ckeywhitelist && !(preference_mob.ckey in G.ckeywhitelist)) //Vorestation Edit + continue //Vorestation Edit + if(G.character_name && !(preference_mob.client.prefs.real_name in G.character_name)) //Vorestation Edit + continue //Vorestation Edit var/ticked = (G.display_name in pref.gear) . += "" . += "" diff --git a/code/modules/client/preference_setup/loadout/loadout_accessories_vr.dm b/code/modules/client/preference_setup/loadout/loadout_accessories_vr.dm index 0f186f5dfca..63b32a27079 100644 --- a/code/modules/client/preference_setup/loadout/loadout_accessories_vr.dm +++ b/code/modules/client/preference_setup/loadout/loadout_accessories_vr.dm @@ -40,11 +40,11 @@ allowed_roles = list("Colony Director", "Head of Personnel", "Security Officer", "Warden", "Head of Security","Detective","Explorer","Pathfinder") /datum/gear/accessory/brown_vest - display_name = "webbing, brown" + display_name = "webbing, brown (Eng, Sec, Med, Exploration, Miner)" allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor","Chemist","Field Medic","Pathfinder","Shaft Miner") /datum/gear/accessory/black_vest - display_name = "webbing, black" + display_name = "webbing, black (Eng, Sec, Med, Exploration, Miner)" allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor","Chemist","Field Medic","Pathfinder","Shaft Miner") /datum/gear/accessory/white_vest @@ -52,11 +52,11 @@ allowed_roles = list("Paramedic","Chief Medical Officer","Medical Doctor","Chemist","Field Medic") /datum/gear/accessory/brown_drop_pouches - display_name = "drop pouches, brown" + display_name = "drop pouches, brown (Eng, Sec, Med, Exploration, Miner)" allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor","Chemist","Field Medic","Pathfinder","Shaft Miner") /datum/gear/accessory/black_drop_pouches - display_name = "drop pouches, black" + display_name = "drop pouches, black (Eng, Sec, Med, Exploration, Miner)" allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor","Chemist","Field Medic","Pathfinder","Shaft Miner") /datum/gear/accessory/white_drop_pouches @@ -75,14 +75,20 @@ description = "A small necklace device that will notify an offsite cloning facility should you expire after activating it." /datum/gear/accessory/tronket - display_name = "metal necklace" - description = "A shiny steel chain with a vague metallic object dangling off it." - path = /obj/item/clothing/accessory/tronket + display_name = "metal necklace" + description = "A shiny steel chain with a vague metallic object dangling off it." + path = /obj/item/clothing/accessory/tronket + +/datum/gear/accessory/pilotpin + display_name = "pilot qualification pin" + description = "An iron pin denoting the qualification to fly SCG spacecraft." + path = /obj/item/clothing/accessory/solgov/specialty/pilot + allowed_roles = list("Pathfinder", "Pilot", "Field Medic") /datum/gear/accessory/flops - display_name = "drop straps" - description = "Wearing suspenders over shoulders? That's been so out for centuries and you know better." - path = /obj/item/clothing/accessory/flops + display_name = "drop straps" + description = "Wearing suspenders over shoulders? That's been so out for centuries and you know better." + path = /obj/item/clothing/accessory/flops /datum/gear/accessory/flops/New() ..() diff --git a/code/modules/client/preference_setup/loadout/loadout_ears.dm b/code/modules/client/preference_setup/loadout/loadout_ears.dm index d92b2358b41..f80e60acaf2 100644 --- a/code/modules/client/preference_setup/loadout/loadout_ears.dm +++ b/code/modules/client/preference_setup/loadout/loadout_ears.dm @@ -11,4 +11,32 @@ /datum/gear/ears/circuitry display_name = "earwear, circuitry (empty)" - path = /obj/item/clothing/ears/circuitry \ No newline at end of file + path = /obj/item/clothing/ears/circuitry + + +/datum/gear/ears/earrings + display_name = "earring selection" + description = "A selection of eye-catching earrings." + path = /obj/item/clothing/ears/earring + +/datum/gear/ears/earrings/New() + ..() + var/earrings = list() + earrings["stud, pearl"] = /obj/item/clothing/ears/earring/stud + earrings["stud, glass"] = /obj/item/clothing/ears/earring/stud/glass + earrings["stud, wood"] = /obj/item/clothing/ears/earring/stud/wood + earrings["stud, iron"] = /obj/item/clothing/ears/earring/stud/iron + earrings["stud, steel"] = /obj/item/clothing/ears/earring/stud/steel + earrings["stud, silver"] = /obj/item/clothing/ears/earring/stud/silver + earrings["stud, gold"] = /obj/item/clothing/ears/earring/stud/gold + earrings["stud, platinum"] = /obj/item/clothing/ears/earring/stud/platinum + earrings["stud, diamond"] = /obj/item/clothing/ears/earring/stud/diamond + earrings["dangle, glass"] = /obj/item/clothing/ears/earring/dangle/glass + earrings["dangle, wood"] = /obj/item/clothing/ears/earring/dangle/wood + earrings["dangle, iron"] = /obj/item/clothing/ears/earring/dangle/iron + earrings["dangle, steel"] = /obj/item/clothing/ears/earring/dangle/steel + earrings["dangle, silver"] = /obj/item/clothing/ears/earring/dangle/silver + earrings["dangle, gold"] = /obj/item/clothing/ears/earring/dangle/gold + earrings["dangle, platinum"] = /obj/item/clothing/ears/earring/dangle/platinum + earrings["dangle, diamond"] = /obj/item/clothing/ears/earring/dangle/diamond + gear_tweaks += new/datum/gear_tweak/path(earrings) diff --git a/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm b/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm new file mode 100644 index 00000000000..13c81b63e1d --- /dev/null +++ b/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm @@ -0,0 +1,899 @@ +/datum/gear/fluff + path = /obj/item + sort_category = "Fluff Items" + display_name = "If this item can be chosen or seen, ping a coder immediately!" + ckeywhitelist = list("This entry should never be choosable with this variable set.") //If it does, then that means somebody fucked up the whitelist system pretty hard + character_name = list("This entry should never be choosable with this variable set.") + cost = 0 +/* +/datum/gear/fluff/testhorn + path = /obj/item/weapon/bikehorn + display_name = "Airhorn - Example Item" + description = "An example item that you probably shouldn't see!" + ckeywhitelist = list("mewchild") + allowed_roles = list("Station Engineer") +*/ + +// 0-9 CKEYS +/datum/gear/fluff/malady_crop + path = /obj/item/weapon/material/twohanded/fluff/riding_crop/malady + display_name = "Malady's Crop" + ckeywhitelist = list("1r1s") + character_name = list("Malady Blanche") + +// A CKEYS +/datum/gear/fluff/lethe_helmet + path = /obj/item/clothing/head/helmet/hos/fluff/lethe + display_name = "Lethe's Helmet" + ckeywhitelist = list("adk09") + character_name = list("Lethe") + +/datum/gear/fluff/xander_bracer + path = /obj/item/clothing/accessory/bracer/fluff/xander_sthasha + display_name = "Xander's Bracer" + ckeywhitelist = list("aegisoa") + character_name = list("Xander Bevin") + +/datum/gear/fluff/lynn_penlight + path = /obj/item/device/flashlight/pen/fluff/lynn + display_name = "Lynn's Penlight" + ckeywhitelist = list("argobargsoup") + character_name = list("Lynn Shady") + +/datum/gear/fluff/aronai_ccmeduniform + path = /obj/item/clothing/under/solgov/utility/sifguard/officer/medical + display_name = "centcom medical uniform" + description = "A medical uniform straight from Central Command." + ckeywhitelist = list("arokha") + character_name = list("Aronai Kadigan") + +/datum/gear/fluff/aronai_ccmedjacket + path = /obj/item/clothing/suit/storage/service/sifguard/medical/command + display_name = "centcom medical jacket" + description = "A medical jacket straight from Central Command." + ckeywhitelist = list("arokha") + character_name = list("Aronai Kadigan") + +// B CKEYS +/datum/gear/fluff/yuuko_kimono + path = /obj/item/clothing/under/fluff/sakura_hokkaido_kimono + display_name = "Yuuko's Kimono" + ckeywhitelist = list("benemuel") + character_name = list("Yuuko Shimmerpond") + +/datum/gear/fluff/cassandra_box + path = /obj/item/weapon/storage/box/fluff/cassandra + display_name = "Cassandra's Box" + ckeywhitelist = list("beyondmylife") + character_name = list("Cassandra Selone") + +/datum/gear/fluff/kilano_dress + path = /obj/item/clothing/under/dress/fluff/kilano + display_name = "Kilano's Dress" + ckeywhitelist = list("beyondmylife") + character_name = list("Kilano Soryu") + +/datum/gear/fluff/kilano_gloves + path = /obj/item/clothing/gloves/fluff/kilano + display_name = "Kilano's Gloves" + ckeywhitelist = list("beyondmylife") + character_name = list("Kilano Soryu") + +/datum/gear/fluff/netra_box + path = /obj/item/weapon/storage/box/fluff/kilano + display_name = "Ne'tra's Box" + ckeywhitelist = list("beyondmylife") + character_name = list("Ne'tra Ky'ram") + +/datum/gear/fluff/xin_sovietuniform + path = /obj/item/clothing/under/soviet + display_name = "Xin's Soviet Uniform" + ckeywhitelist = list("britishrabbit") + character_name = list("Xin Xiao") + description = "This soviet uniform has seen considerable use over the years, it's rather worn in some places, frayed in others and the stomach region has signs of being stretched out repeatedly." + +/datum/gear/fluff/tasald_box + path = /obj/item/weapon/storage/box/fluff/tasald + display_name = "Tasald's Box" + ckeywhitelist = list("bwoincognito") + character_name = list("Tasald Corlethian") + +/datum/gear/fluff/octavius_box + path = /obj/item/weapon/storage/box/fluff/octavious + display_name = "Octavious' Box" + ckeywhitelist = list("bwoincognito") + character_name = list("Octavious Ward") + +/datum/gear/fluff/jayda_meduniform + path = /obj/item/clothing/under/solgov/utility/sifguard/medical/fluff + display_name = "Jayda's Uniform" + ckeywhitelist = list("burritojustice") + character_name = list("Jayda Wilson") + +// C CKEYS +/datum/gear/fluff/james_disk + path = /obj/item/weapon/disk/data + display_name = "James' Disk" + ckeywhitelist = list("cockatricexl") + character_name = list("James Holder") + +/datum/gear/fluff/jasmine_implant + path = /obj/item/weapon/implanter/reagent_generator/jasmine + display_name = "Jasmine's Implant" + ckeywhitelist = list("cameron653") + character_name = list("Jasmine Lizden") + +/datum/gear/fluff/diana_robe + path = /obj/item/clothing/suit/fluff/purp_robes + display_name = "Diana's Robes" + ckeywhitelist = list("cameron653") + character_name = list("Diana Kuznetsova") + +/datum/gear/fluff/diana_tiara + path = /obj/item/clothing/head/fluff/pink_tiara + display_name = "Diana's Tiara" + ckeywhitelist = list("cameron653") + character_name = list("Diana Kuznetsova") + +/datum/gear/fluff/aika_coat + path = /obj/item/clothing/suit/fluff/blue_trimmed_coat + display_name = "Aika's Coat" + ckeywhitelist = list("chaoko99") + character_name = list("Aika Hisakawa") + +/datum/gear/fluff/sariU_disk + path = /obj/item/weapon/disk/limb/eggnerdltd + display_name = "Sari-U's Eggnerd Disk" + ckeywhitelist = list("crossexonar") + character_name = list("Sari-U") + +/datum/gear/fluff/sariE_disk + path = /obj/item/weapon/disk/limb/eggnerdltd + display_name = "Sari-E's Eggnerd Disk" + ckeywhitelist = list("crossexonar") + character_name = list("Sari-E") + +// D CKEYS +/datum/gear/fluff/dhaeleena_medal + path = /obj/item/clothing/accessory/medal/silver/security/fluff/dhael + display_name = "Dhaeleena's Medal" + ckeywhitelist = list("dhaeleena") + character_name = list("Dhaeleena M'iar") + +/datum/gear/fluff/elliot_belt + path = /obj/item/weapon/storage/belt/champion + display_name = "Elliot's Belt" + ckeywhitelist = list("dickfreedomjohnson") + character_name = list("Elliot Richards") + +/datum/gear/fluff/drake_box + path = /obj/item/weapon/storage/box/fluff/drake + display_name = "Drake's Box" + ckeywhitelist = list("drakefrostpaw") + character_name = list("Drake Frostpaw") + +/datum/gear/fluff/theseus_coin + path = /obj/item/weapon/coin/diamond + display_name = "Theseus' Diamond coin" + ckeywhitelist = list("draycu") + character_name = list("Theseus") + description = "An engraved coin made of diamond. On the side for heads is printed the year 2541, along with the letter T. On the side for tails, the letter Y can be seen." + +/datum/gear/fluff/yonra_box + path = /obj/item/weapon/storage/box/fluff/yonra + display_name = "Yonra's Box" + ckeywhitelist = list("draycu") + character_name = list("Schae Yonra") + +// E CKEYS +/datum/gear/fluff/serkii_slippers + path = /obj/item/clothing/shoes/slippers + display_name = "Serkii's Slippers" + ckeywhitelist = list("eekasqueak") + character_name = list("Serkii Miishy") + +/datum/gear/fluff/serkii_skirt + path = /obj/item/clothing/under/skirt/fluff/serkii + display_name = "Serkii's Skirt" + ckeywhitelist = list("eekasqueak") + character_name = list("Serkii Miishy") + +/datum/gear/fluff/jessie_coat + path = /obj/item/clothing/suit/storage/hooded/wintercoat/jessie + display_name = "Jessie's Coat" + ckeywhitelist = list("epiccharger") + character_name = list("Jessie Mare") + +/datum/gear/fluff/verd_medal + path = /obj/item/clothing/accessory/medal/bronze_heart + display_name = "Verd's Medal" + ckeywhitelist = list("epigraphzero") + character_name = list("Verd Woodrow") + +// F CKEYS + +// G CKEYS +/datum/gear/fluff/eldi_implant + path = /obj/item/weapon/implanter/reagent_generator/eldi + display_name = "Eldi's Implant" + ckeywhitelist = list("gowst") + character_name = list("Eldi Moljir") + +// H CKEYS +/datum/gear/fluff/lauren_medal + path = /obj/item/clothing/accessory/medal/conduct + display_name = "Lauren's Medal" + ckeywhitelist = list("heroman3003") + character_name = list("Lauren Zackson") + +/datum/gear/fluff/lauren_string + path = /obj/item/clothing/accessory/collar/fluff/goldenstring + display_name = "Lauren's String" + ckeywhitelist = list("heroman3003") + character_name = list("Lauren Zackson") + +/datum/gear/fluff/belle_sizegun + path = /obj/item/weapon/gun/energy/sizegun + display_name = "Belle's Sizegun" + ckeywhitelist = list("hottokeeki") + character_name = list("Belle Day") + +/datum/gear/fluff/belle_implant + path = /obj/item/weapon/implanter/reagent_generator/belle + display_name = "Belle's Implant" + ckeywhitelist = list("hottokeeki") + character_name = list("Belle Day") + +// I CKEYS +/datum/gear/fluff/ruda_badge + path = /obj/item/clothing/accessory/badge/holo/detective/ruda + display_name = "Ruda's Detective Badge" + ckeywhitelist = list("interrolouis") + character_name = list("Ruda Lizden") + +/datum/gear/fluff/kai_modkit + path = /obj/item/borg/upgrade/modkit/chassis_mod/kai + display_name = "Kai's Modkit" + ckeywhitelist = list("interrolouis") + character_name = list("Kai Highlands") + +/datum/gear/fluff/ivy_backpack + path = /obj/item/weapon/storage/backpack/messenger/sec/fluff/ivymoomoo + display_name = "Ivy's Backpack" + ckeywhitelist = list("ivymoomoo") + character_name = list("Ivy Baladeva") + +// J CKEYS +/datum/gear/fluff/mor_box + path = /obj/item/weapon/storage/box/fluff/morxaina + display_name = "Mor's Box" + ckeywhitelist = list("jacknoir413") + character_name = list("Mor Xaina") + +/datum/gear/fluff/areax_staff + path = /obj/item/weapon/storage/backpack/fluff/stunstaff + display_name = "Areax's Stun Staff" + ckeywhitelist = list("jacknoir413") + character_name = list("Areax Third") + allowed_roles = list("Security Officer, Warden, Head of Security") + +/datum/gear/fluff/earthen_uniform + path = /obj/item/clothing/under/fluff/earthenbreath + display_name = "Earthen's Uniform" + ckeywhitelist = list("jacobdragon") + character_name = list("Earthen Breath") + +/datum/gear/fluff/earthen_hairpin + path = /obj/item/clothing/head/fluff/hairflowerpin + display_name = "Earthen's Flower Pin" + ckeywhitelist = list("jacobdragon") + character_name = list("Earthen Breath") + +/datum/gear/fluff/cirra_box + path = /obj/item/weapon/storage/box/fluff/cirra + display_name = "Cirra's Box" + ckeywhitelist = list("jemli") + character_name = list("Cirra Mayhem") + +/datum/gear/fluff/jemli_fedora + path = /obj/item/clothing/head/fedora/fluff/jemli + display_name = "Jemli's Fedora" + ckeywhitelist = list("jemli") + character_name = list("Jemli") + +/datum/gear/fluff/jeremiah_permit + path = /obj/item/clothing/accessory/permit/gun/fluff/ace + display_name = "Ace's Gun Permit" + ckeywhitelist = list("jertheace") + character_name = list("Jeremiah Acacius") + allowed_roles = list("Colony Director", "Warden", "Head of Security") + +/datum/gear/fluff/jeremiah_gun + path = /obj/item/weapon/gun/projectile/p92x/large/preban/hp + display_name = "Ace's Gun" + ckeywhitelist = list("jertheace") + character_name = list("Jeremiah Acacius") + allowed_roles = list("Colony Director", "Warden", "Head of Security") + +/datum/gear/fluff/jeremiah_ammo + path = /obj/item/ammo_magazine/m9mm/large/preban/hp //Spare ammo + display_name = "Ace's Spare Ammo" + ckeywhitelist = list("jertheace") + character_name = list("Jeremiah Acacius") + allowed_roles = list("Colony Director", "Warden", "Head of Security") + +/datum/gear/fluff/jeremiah_holster + path = /obj/item/clothing/accessory/holster/armpit + display_name = "Ace's Holster" + ckeywhitelist = list("jertheace") + character_name = list("Jeremiah Acacius") + allowed_roles = list("Colony Director", "Warden", "Head of Security") + +/datum/gear/fluff/jeremiah_boots + path = /obj/item/clothing/shoes/boots/combat + display_name = "Ace's Boots" + ckeywhitelist = list("jertheace") + character_name = list("Jeremiah Acacius") + +/datum/gear/fluff/jeremiah_combatuniform + path = /obj/item/clothing/under/syndicate/combat + display_name = "Ace's Combat Uniform" + ckeywhitelist = list("jertheace") + character_name = list("Jeremiah Acacius") + +/datum/gear/fluff/joan_backpack + path = /obj/item/weapon/storage/backpack/dufflebag/sec/fluff/joanrisu + display_name = "Joan's backpack" + ckeywhitelist = list("joanrisu") + character_name = list("Joan Risu") + + +/datum/gear/fluff/katarina_backpack + path = /obj/item/weapon/storage/backpack/dufflebag/sec/fluff/katarina + display_name = "Katarina's Backpack" + ckeywhitelist = list("joanrisu") + character_name = list("Katarina Eine") + allowed_roles = list("Colony Director", "Warden", "Head of Security") + +/datum/gear/fluff/emoticon_box + path = /obj/item/weapon/storage/box/fluff/emoticon + display_name = "Emoticon's Box" + ckeywhitelist = list("joey4298") + character_name = list("Emoticon") + +/datum/gear/fluff/emoticon_mimeuniform + path = /obj/item/clothing/under/sexymime + display_name = "Emoticon's Mime Uniform" + ckeywhitelist = list("joey4298") + character_name = list("Emoticon") + +/datum/gear/fluff/emoticon_mimemask + path = /obj/item/clothing/mask/gas/sexymime + display_name = "Emoticon's Mime Mask" + ckeywhitelist = list("joey4298") + character_name = list("Emoticon") + +/datum/gear/fluff/harmony_medal + path = /obj/item/clothing/accessory/medal/gold/heroism + display_name = "Harmony's Heroism Medal" + ckeywhitelist = list("john.wayne9392") + character_name = list("Harmony Pretchl") + +/datum/gear/fluff/harmony_modkit + path = /obj/item/device/modkit_conversion/fluff/harmonysuit + display_name = "Harmony's Modkit" + ckeywhitelist = list("john.wayne9392") + character_name = list("Harmony Pretchl") + +/datum/gear/fluff/harmony_spacemodkit + path = /obj/item/device/modkit_conversion/fluff/harmonyspace + display_name = "Harmony's Modkit 2" + ckeywhitelist = list("john.wayne9392") + character_name = list("Harmony Pretchl") + +/datum/gear/fluff/koyo_box + path = /obj/item/weapon/storage/box/fluff/koyoakimomi + display_name = "Koyo's Box" + ckeywhitelist = list("jwguy") + character_name = list("Koyo Akimomi") + +// K CKEYS +/datum/gear/fluff/smu_medal + path = /obj/item/clothing/accessory/medal/nobel_science + display_name = "SMU's Nobel Science Award" + ckeywhitelist = list("keekenox") + character_name = list("SMU-453") + +/datum/gear/fluff/ketrai_hat + path = /obj/item/clothing/head/fluff/ketrai + display_name = "Ketrai's Hat" + ckeywhitelist = list("ketrai") + character_name = list("Ketrai") + +/datum/gear/fluff/amaya_id + path = /obj/item/weapon/card/id/fluff/amaya + display_name = "Amaya's ID" + ckeywhitelist = list("kiraalitruss") + character_name = list("Amaya Rahl") + +/datum/gear/fluff/kisuke_glasses + path = /obj/item/clothing/glasses/omnihud/kamina + display_name = "Kisuke's Kamina Glasses" + ckeywhitelist = list("kisukegema") + character_name = list("Kisuke Gema") + +/datum/gear/fluff/lassara_sheath + path = /obj/item/clothing/accessory/storage/knifeharness + display_name = "Lassara's Knife Harness" + ckeywhitelist = list("killjaden") + character_name = list("Lassara Faaira'Nrezi") + +/datum/gear/fluff/rana_medal + path = /obj/item/clothing/accessory/medal/silver/unity + display_name = "Rana's Unity Medal" + ckeywhitelist = list("kitchifox") + character_name = list("Rana Uma") + +/datum/gear/fluff/taiga_uniform + path = /obj/item/clothing/under/fluff/taiga + display_name = "Taifa's Uniform" + ckeywhitelist = list("kiwidaninja") + character_name = list("Chakat Taiga") + +/datum/gear/fluff/rischi_implant + path = /obj/item/weapon/implanter/reagent_generator/rischi + display_name = "Rischi's Implant" + ckeywhitelist = list("konabird") + character_name = list("Rischi") + +/datum/gear/fluff/ashley_medal + path = /obj/item/clothing/accessory/medal/nobel_science/fluff/ashley + display_name = "Ashley's Medal" + ckeywhitelist = list("knightfall5") + character_name = list("Ashley Kifer") + +// L CKEYS +/datum/gear/fluff/kenzie_hypospray + path = /obj/item/weapon/reagent_containers/hypospray/vial/kenzie + display_name = "Kenzie's Hypospray" + ckeywhitelist = list("lm40") + character_name = list("Kenzie Houser") + allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Psychiatrist","Paramedic", "Field Medic") + +/datum/gear/fluff/brianna_backpack + path = /obj/item/weapon/storage/backpack/messenger/black/fluff/briana + display_name = "Briana's Backpack" + ckeywhitelist = list("luminescentring") + character_name = list("Briana Moore") + +/datum/gear/fluff/savannah_implant + path = /obj/item/weapon/implanter/reagent_generator/savannah + display_name = "Savannah's Implant" + ckeywhitelist = list("lycanthorph") + character_name = list("Savannah Dixon") + +// M CKEYS +/datum/gear/fluff/phi_box + path = /obj/item/weapon/storage/box/fluff/phi + display_name = "Phi's Box" + ckeywhitelist = list("mewchild") + character_name = list("Phi Vietsi") + +/datum/gear/fluff/giliana_labcoat + path = /obj/item/clothing/suit/storage/toggle/labcoat/fluff/molenar + display_name = "Giliana's Labcoat" + ckeywhitelist = list("molenar") + character_name = list("Giliana Gamish") + +/datum/gear/fluff/myryan_belt + path = /obj/item/weapon/storage/belt/utility/fluff/vulpine + display_name = "Myryan's Belt" + ckeywhitelist = list("myryan") + character_name = list("Myryan Karnage-Cunningham") + +/datum/gear/fluff/resh_uniform + path = /obj/item/clothing/suit/security/navyhos + display_name = "Resh's HoS Uniform" + ckeywhitelist = list("mrsignmeup") + character_name = list("Reshskakskakss Seekiseekis") + allowed_roles = list("Head of Security") + +/datum/gear/fluff/daniel_medal + path = /obj/item/clothing/accessory/medal/conduct + display_name = "Daniel's Conduct Medal" + ckeywhitelist = list("mrsignmeup") + character_name = list("Daniel Fisher") + +// N CKEYS +/datum/gear/fluff/awen_hat + path = /obj/item/clothing/head/fluff/wolfgirl + display_name = "Awen's Hat" + ckeywhitelist = list("natje") + character_name = list("Awen Henry") + +/datum/gear/fluff/awen_shoes + path = /obj/item/clothing/shoes/fluff/wolfgirl + ckeywhitelist = list("natje") + character_name = list("Awen Henry") + +/datum/gear/fluff/awen_uniform + path = /obj/item/clothing/under/fluff/wolfgirl + display_name = "Awen's Uniform" + ckeywhitelist = list("natje") + character_name = list("Awen Henry") + +/datum/gear/fluff/pumila_vines + path = /obj/item/clothing/under/fluff/aluranevines + display_name = "Pumila's Vines" + ckeywhitelist = list("natje") + character_name = list("Pumila") + +/datum/gear/fluff/annie_sweater + path = /obj/item/clothing/accessory/sweater/fluff/annie + display_name = "Annie's Sweater" + ckeywhitelist = list("nepox") + character_name = list("Annie Rose") + +// O CKEYS +/datum/gear/fluff/richard_chain + path = /obj/item/weapon/melee/fluff/holochain + display_name = "Richard's Holochain" + ckeywhitelist = list("orbisa") + character_name = list("Richard D'angelo") + +// P CKEYS +/datum/gear/fluff/lily_medal + path = /obj/item/clothing/accessory/medal/silver/unity + display_name = "Lily's Unity Medal" + ckeywhitelist = list("phoaly") + character_name = list("Lily Maximus") + +/datum/gear/fluff/lucuis_battery + path = /obj/item/weapon/fluff/dragor_dot + display_name = "Lucuis' Spare Battery" + ckeywhitelist = list("pontifexminimus") + character_name = list("Lucius Null") + +/datum/gear/fluff/lucia_battery + path = /obj/item/weapon/fluff/dragor_dot + display_name = "Lucia's Spare Battery" + ckeywhitelist = list("pontifexminimus") + character_name = list("Lucia Null") + +// Q CKEYS + +// R CKEYS +/datum/gear/fluff/tiemli_weldinggoggles + path = /obj/item/clothing/glasses/welding/tiemgogs + display_name = "Tiemli's Welding Goggles" + ckeywhitelist = list("radiantaurora") + character_name = list("Tiemli Kroto") + allowed_roles = list("Roboticist") + +// S CKEYS +/datum/gear/fluff/kateryna_voidsuit + path = /obj/item/clothing/suit/space/void/engineering/kate + display_name = "Kateryna's Voidsuit" + ckeywhitelist = list("samanthafyre") + character_name = list("Kateryna Petrovitch") + allowed_roles = list("Station Engineer", "Chief Engineer", "Atmospheric Technician") + +/datum/gear/fluff/katerina_spacesuit + path = /obj/item/clothing/head/helmet/space/fluff/kate + display_name = "Kateryna's Helmet" + ckeywhitelist = list("samanthafyre") + character_name = list("Kateryna Petrovitch") + allowed_roles = list("Station Engineer", "Chief Engineer", "Atmospheric Technician") + +/datum/gear/fluff/kateryna_armorvest + path = /obj/item/clothing/suit/armor/vest/wolftaur/kate + display_name = "Kateryna's Armor Vest" + ckeywhitelist = list("samanthafyre") + character_name = list("Kateryna Petrovitch") + allowed_roles = list("Security Officer", "Warden", "Head of Security", "Colony Director", "Head of Personnel") + +/datum/gear/fluff/viktor_flask + path = /obj/item/weapon/reagent_containers/food/drinks/flask/vacuumflask/fluff/viktor + display_name = "Viktor's Flask" + ckeywhitelist = list("semaun") + character_name = list("Viktor Solothurn") + +/datum/gear/fluff/scree_modkit + path = /obj/item/device/modkit_conversion/fluff/screekit + display_name = "Scree's Modkit" + ckeywhitelist = list("scree") + character_name = list("Scree") + +/datum/gear/fluff/scree_pompom + path = /obj/item/clothing/head/fluff/pompom + display_name = "Scree's Weird PopPom thing" + ckeywhitelist = list("scree") + character_name = list("Scree") + +/datum/gear/fluff/alfonso_sunglasses + path = /obj/item/clothing/glasses/sunglasses/fluff/alfonso + display_name = "Alfonso's Sunglasses" + ckeywhitelist = list("seiga") + character_name = list("Alfonso Oak Telanor") + +/datum/gear/fluff/nthasd_modkit //Converts a Security suit's sprite + path = /obj/item/device/modkit_conversion/hasd + display_name = "NT-HASD #556's Modkit" + ckeywhitelist = list("silencedmp5a5") + character_name = list("NT-HASD #556") + allowed_roles = list("Colony Director", "Head of Personnel", "Security Officer", "Warden", "Head of Security","Detective") + +/datum/gear/fluff/tasy_clownuniform + path = /obj/item/clothing/under/sexyclown + display_name = "Tasy's Clown Uniform" + ckeywhitelist = list("silvertalismen") + character_name = list("Tasy Ruffles") + +/datum/gear/fluff/tasy_clownmask + path = /obj/item/clothing/mask/gas/sexyclown + display_name = "Tasy's Clownmask" + ckeywhitelist = list("silvertalismen") + character_name = list("Tasy Ruffles") + +/datum/gear/fluff/tasy_clownPDA + path = /obj/item/device/pda/clown + display_name = "Tasy's Clown PDA" + ckeywhitelist = list("silvertalismen") + character_name = list("Tasy Ruffles") + +/datum/gear/fluff/evian_implant + path = /obj/item/weapon/implanter/reagent_generator/evian + display_name = "Evian's Implant" + ckeywhitelist = list("silvertalismen") + character_name = list("Evian") + +/datum/gear/fluff/fortune_backpack + path = /obj/item/weapon/storage/backpack/satchel/fluff/swat43bag + display_name = "Fortune's Backpack" + ckeywhitelist = list("swat43") + character_name = list("Fortune Bloise") + +/datum/gear/fluff/alexis_cane + path = /obj/item/weapon/cane/wand + display_name = "Alexis' Cane" + ckeywhitelist = list("stobarico") + character_name = list("Alexis Bloise") + +/datum/gear/fluff/roiz_implant + path = /obj/item/weapon/implanter/reagent_generator/roiz + display_name = "Roiz's Implant" + ckeywhitelist = list("spoopylizz") + character_name = list("Roiz Lizden") + +/datum/gear/fluff/roiz_coat + path = /obj/item/clothing/suit/storage/hooded/wintercoat/roiz + display_name = "Roiz's Coat" + ckeywhitelist = list("spoopylizz") + character_name = list("Roiz Lizden") + +/datum/gear/fluff/silent_mimemask + path = /obj/item/clothing/mask/gas/sexymime + display_name = "Silent Stripe's Mime Mask" + ckeywhitelist = list("suicidalpickles") + character_name = list("Silent Stripes") + +/datum/gear/fluff/silent_mimeuniform + path = /obj/item/clothing/under/sexymime + display_name = "Silent Stripe's Mime Uniform" + ckeywhitelist = list("suicidalpickles") + character_name = list("Silent Stripes") + +// T CKEYS +/datum/gear/fluff/ascian_medal + path = /obj/item/clothing/accessory/medal/silver/unity + display_name = "Ascian's Unity Medal" + ckeywhitelist = list("tabiranth") + character_name = list("Ascian") + +/datum/gear/fluff/ascian_spiritspawner + path = /obj/item/weapon/grenade/spawnergrenade/spirit + display_name = "The Best Kitten" + ckeywhitelist = list("tabiranth") + character_name = list("Ascian") + +/datum/gear/fluff/ascian_shelterpod + path = /obj/item/device/survivalcapsule/tabiranth + display_name = "Ascian's Shelterpod" + ckeywhitelist = list("tabiranth") + character_name = list("Ascian") + +/datum/gear/fluff/lasshseeki_ealimplant + path = /obj/item/weapon/implant/language/eal + display_name = "Lasshseeki's EAL Implant" + ckeywhitelist = list("techtypes") + character_name = list("Lasshseeki Korss") + +/datum/gear/fluff/konor_medal + path = /obj/item/clothing/accessory/medal/silver/unity + display_name = "Konor's Unity Medal" + ckeywhitelist = list("tinydude16") + character_name = list("Konor Foxe") + +// U CKEYS + +// V CKEYS +/datum/gear/fluff/vakashi_permit + path = /obj/item/clothing/accessory/permit/gun/fluff/Vakashi + display_name = "Vakashi's Pepperspray Permit" + ckeywhitelist = list("vailthewolf") + character_name = list("Vakashi") + +/datum/gear/fluff/vakashi_pepperspray + path = /obj/item/weapon/reagent_containers/spray/pepper + display_name = "Vakashi's Pepperspray" + ckeywhitelist = list("vailthewolf") + character_name = list("Vakashi") + +/datum/gear/fluff/cameron_glasses + path = /obj/item/clothing/glasses/fluff/science_proper + display_name = "Cameron's Science Glasses" + ckeywhitelist = list("verkister") + character_name = list("Cameron Eggbert") + +/datum/gear/fluff/cameron_disk + path = /obj/item/weapon/disk/limb/eggnerdltd + display_name = "Cameron's Eggnerd Disk" + ckeywhitelist = list("verkister") + character_name = list("Cameron Eggbert") + +/datum/gear/fluff/opie_glasses + path = /obj/item/clothing/glasses/fluff/spiffygogs + display_name = "Opie's Goggles" + ckeywhitelist = list("verkister") + character_name = list("Opie Eggbert") + +/datum/gear/fluff/verin_hazardvest + path = /obj/item/clothing/suit/storage/hazardvest/fluff/verin + display_name = "Verin's Hazard Vest" + ckeywhitelist = list("virgo113") + character_name = list("Verin Raharra") + +/datum/gear/fluff/lucina_pda + path = /obj/item/device/pda/heads/cmo/fluff/lucinapda + display_name = "Lucina's PDA" + ckeywhitelist = list("vorrarkul") + character_name = list("Lucina Dakarim") + +/datum/gear/fluff/lucina_medal + path = /obj/item/clothing/accessory/medal/gold/fluff/lucina + display_name = "Lucina's Gold Medal" + ckeywhitelist = list("vorrarkul") + character_name = list("Lucina Dakarim") + +/datum/gear/fluff/lucina_dress + path = /obj/item/clothing/under/dress/fluff/lucinadress + display_name = "Lucina's Dress" + ckeywhitelist = list("vorrarkul") + character_name = list("Lucina Dakarim") + +/datum/gear/fluff/melanie_skeleton + path = /obj/item/clothing/under/fluff/slime_skeleton + display_name = "Melanie's Skeleton" + ckeywhitelist = list("vorrarkul") + character_name = list("Melanie Farmer") + +/datum/gear/fluff/nyssa_coat + path = /obj/item/clothing/suit/storage/hooded/wintercoat/cargo + display_name = "Nyssa's Coat" + ckeywhitelist = list("vorrarkul") + character_name = list("Nyssa Brennan") + +/datum/gear/fluff/theodora_suit + path = /obj/item/clothing/suit/chococoat + display_name = "Theodora's Coat" + ckeywhitelist = list("vorrarkul") + character_name = list("Theodora Lindt") + +/datum/gear/fluff/theodora_implant + path = /obj/item/weapon/implanter/reagent_generator/vorrarkul + display_name = "Theodora's Implant" + ckeywhitelist = list("vorrarkul") + character_name = list("Theodora Lindt") + +/datum/gear/fluff/kaitlyn_plush + path = /obj/item/toy/plushie/mouse/fluff + display_name = "Kaitlyn's Mouse Plush" + ckeywhitelist = list("vorrarkul") + character_name = list("Kaitlyn Fiasco") + +/datum/gear/fluff/keturah_maiddress + path = /obj/item/clothing/under/dress/maid/ + display_name = "Keturah's Maid Dress" + ckeywhitelist = list("viveret") + character_name = list("Keturah") + +/datum/gear/fluff/silentio_mimeuniform + path = /obj/item/clothing/under/sexymime + display_name = "Silentio's Mime Uniform" + ckeywhitelist = list("viveret") + character_name = list("Silentio") + +/datum/gear/fluff/silentio_mimemask + path = /obj/item/clothing/mask/gas/sexymime + display_name = "Silentio's Mime Mask" + ckeywhitelist = list("Viveret") + character_name = list("Silentio") + +// W CKEYS +/datum/gear/fluff/sthasha_bracer + path = /obj/item/clothing/accessory/bracer/fluff/xander_sthasha + display_name = "S'thasha's Bracer" + ckeywhitelist = list("wanderingdeviant") + character_name = list("S'thasha Tavakdavi") + +/datum/gear/fluff/silas_glasses + path = /obj/item/clothing/glasses/threedglasses + display_name = "Silas' 3-D Glasses" + ckeywhitelist = list("werebear") + character_name = list("Silas Newton") + +/datum/gear/fluff/vinjj_weldingmask + path = /obj/item/clothing/head/welding/fluff/vinjj + display_name = "Vinjj's Welding Mask" + ckeywhitelist = list("whiskyrose") + character_name = list("Vinjj") + +/datum/gear/fluff/tempest_hudglases + path = /obj/item/clothing/glasses/omnihud/med/fluff/wickedtemphud + display_name = "Tempest's Medical Hud" + ckeywhitelist = list("wickedtemp") + character_name = list("Chakat Tempest Venesare") + allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Psychiatrist","Paramedic", "Field Medic") + +/datum/gear/fluff/tempest_hypospray + path = /obj/item/weapon/reagent_containers/hypospray/vial/tempest + display_name = "Tempest's Hypospray" + ckeywhitelist = list("wickedtemp") + character_name = list("Chakat Tempest Venesare") + allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Psychiatrist","Paramedic", "Field Medic") + +/datum/gear/fluff/tempest_backpack + path = /obj/item/weapon/storage/backpack/saddlebag/tempest + display_name = "Tempest's Saddlebag" + ckeywhitelist = list("wickedtemp") + character_name = list("Chakat Tempest Venesare") + +/datum/gear/fluff/tempest_implant + path = /obj/item/weapon/implanter/reagent_generator/tempest + display_name = "Tempest's Implant" + ckeywhitelist = list("wickedtemp") + character_name = list("Chakat Tempest Venesare") + +// X CKEYS +/datum/gear/fluff/penelope_box + path = /obj/item/weapon/storage/box/fluff/penelope + display_name = "Penelope's Box" + ckeywhitelist = list("xsdew") + character_name = list("Penelope Allen") + +/datum/gear/fluff/ali_medal + path = /obj/item/clothing/accessory/medal/silver/unity + display_name = "Ali's Unity Medal" + ckeywhitelist = list("xonkon") + character_name = list("Ali") + +// Y CKEYS + +// Z CKEYS +/datum/gear/fluff/tachika_medal + path = /obj/item/clothing/accessory/medal/conduct + display_name = "Tachika's Conduct Medal" + ckeywhitelist = list("zammyman") + character_name = list("Tachika") + +/datum/gear/fluff/zaoozaoo_hat + path = /obj/item/clothing/head/fluff/zao + display_name = "Zaoozaoo's Hat" + ckeywhitelist = list("zigfe") + character_name = list("Zaoozaoo Xrimxuqmqixzix") + +/datum/gear/fluff/nehi_radio + path = /obj/item/device/radio/headset/fluff/zodiacshadow + display_name = "Nehi's Radio" + ckeywhitelist = list("zodiacshadow") + character_name = list("Nehi Maximus") diff --git a/code/modules/client/preference_setup/loadout/loadout_suit.dm b/code/modules/client/preference_setup/loadout/loadout_suit.dm index 3cb84bcb815..1802d2c0096 100644 --- a/code/modules/client/preference_setup/loadout/loadout_suit.dm +++ b/code/modules/client/preference_setup/loadout/loadout_suit.dm @@ -495,3 +495,11 @@ datum/gear/suit/duster display_name = "snowsuit, supply" path = /obj/item/clothing/suit/storage/snowsuit/cargo allowed_roles = list("Quartermaster","Shaft Miner","Cargo Technician","Head of Personnel") + +/datum/gear/suit/miscellaneous/cardigan + display_name = "cardigan" + path = /obj/item/clothing/suit/storage/toggle/cardigan + +/datum/gear/suit/miscellaneous/cardigan/New() + ..() + gear_tweaks = list(gear_tweak_free_color_choice) \ No newline at end of file diff --git a/code/modules/client/preference_setup/loadout/loadout_suit_vr.dm b/code/modules/client/preference_setup/loadout/loadout_suit_vr.dm index 719ba98a382..e7bb0493f32 100644 --- a/code/modules/client/preference_setup/loadout/loadout_suit_vr.dm +++ b/code/modules/client/preference_setup/loadout/loadout_suit_vr.dm @@ -1,9 +1,3 @@ -/datum/gear/suit/roles/poncho/cloak/research - allowed_roles = list("Research Director","Scientist", "Roboticist", "Xenobiologist", "Explorer", "Pathfinder") - -/datum/gear/suit/roles/poncho/cloak/medical - allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist", "Psychiatrist", "Field Medic") - /datum/gear/suit/wintercoat/medical allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist", "Psychiatrist", "Field Medic") diff --git a/code/modules/client/preference_setup/loadout/loadout_uniform.dm b/code/modules/client/preference_setup/loadout/loadout_uniform.dm index d3e70872c9c..7de598fc83b 100644 --- a/code/modules/client/preference_setup/loadout/loadout_uniform.dm +++ b/code/modules/client/preference_setup/loadout/loadout_uniform.dm @@ -506,3 +506,14 @@ display_name = "plain ascetic garb" path = /obj/item/clothing/under/ascetic +/datum/gear/uniform/pleated + display_name = "pleated skirt" + path = /obj/item/clothing/under/skirt/pleated + +/datum/gear/uniform/pleated/New() + ..() + gear_tweaks = list(gear_tweak_free_color_choice) + +/datum/gear/uniform/lilacdress + display_name = "lilac dress" + path = /obj/item/clothing/under/dress/lilacdress diff --git a/code/modules/client/preference_setup/loadout/loadout_uniform_vr.dm b/code/modules/client/preference_setup/loadout/loadout_uniform_vr.dm index 1508905c601..be65b874a61 100644 --- a/code/modules/client/preference_setup/loadout/loadout_uniform_vr.dm +++ b/code/modules/client/preference_setup/loadout/loadout_uniform_vr.dm @@ -3,9 +3,9 @@ path = /obj/item/clothing/under/permit //Polaris overrides -/datum/gear/uniform/pt/sifguard +/datum/gear/uniform/solgov/pt/sifguard display_name = "pt uniform, planetside sec" - path = /obj/item/clothing/under/pt/sifguard + path = /obj/item/clothing/under/solgov/pt/sifguard //KHI Uniforms /datum/gear/uniform/job_khi/cmd @@ -168,4 +168,8 @@ Swimsuits //Tron Siren outfit /datum/gear/uniform/siren display_name = "jumpsuit, Siren" - path = /obj/item/clothing/under/fluff/siren \ No newline at end of file + path = /obj/item/clothing/under/fluff/siren + +/datum/gear/uniform/suit/v_nanovest + display_name = "Varmacorp nanovest" + path = /obj/item/clothing/under/fluff/v_nanovest \ No newline at end of file diff --git a/code/modules/client/preference_setup/loadout/loadout_vr.dm b/code/modules/client/preference_setup/loadout/loadout_vr.dm new file mode 100644 index 00000000000..1f7a31311e4 --- /dev/null +++ b/code/modules/client/preference_setup/loadout/loadout_vr.dm @@ -0,0 +1,3 @@ +/datum/gear + var/list/ckeywhitelist + var/list/character_name \ No newline at end of file diff --git a/code/modules/client/preference_setup/traits/trait_defines.dm b/code/modules/client/preference_setup/traits/trait_defines.dm index aa53392f2c4..8ad3ff9253b 100644 --- a/code/modules/client/preference_setup/traits/trait_defines.dm +++ b/code/modules/client/preference_setup/traits/trait_defines.dm @@ -72,25 +72,45 @@ Regardless, you find it quite difficult to land shots where you wanted them to go." modifier_type = /datum/modifier/trait/inaccurate -/datum/trait/modifier/physical/smaller - name = "Smaller" - modifier_type = /datum/modifier/trait/smaller - mutually_exclusive = list(/datum/trait/modifier/physical/small, /datum/trait/modifier/physical/large, /datum/trait/modifier/physical/larger) +/datum/trait/modifier/physical/shorter + name = "Shorter" + modifier_type = /datum/modifier/trait/shorter + mutually_exclusive = list(/datum/trait/modifier/physical/short, /datum/trait/modifier/physical/tall, /datum/trait/modifier/physical/taller) -/datum/trait/modifier/physical/small - name = "Small" - modifier_type = /datum/modifier/trait/small - mutually_exclusive = list(/datum/trait/modifier/physical/smaller, /datum/trait/modifier/physical/large, /datum/trait/modifier/physical/larger) +/datum/trait/modifier/physical/short + name = "Short" + modifier_type = /datum/modifier/trait/short + mutually_exclusive = list(/datum/trait/modifier/physical/shorter, /datum/trait/modifier/physical/tall, /datum/trait/modifier/physical/taller) -/datum/trait/modifier/physical/large - name = "Large" - modifier_type = /datum/modifier/trait/large - mutually_exclusive = list(/datum/trait/modifier/physical/smaller, /datum/trait/modifier/physical/small, /datum/trait/modifier/physical/larger) +/datum/trait/modifier/physical/tall + name = "Tall" + modifier_type = /datum/modifier/trait/tall + mutually_exclusive = list(/datum/trait/modifier/physical/shorter, /datum/trait/modifier/physical/short, /datum/trait/modifier/physical/taller) -/datum/trait/modifier/physical/larger - name = "Larger" - modifier_type = /datum/modifier/trait/larger - mutually_exclusive = list(/datum/trait/modifier/physical/smaller, /datum/trait/modifier/physical/small, /datum/trait/modifier/physical/large) +/datum/trait/modifier/physical/taller + name = "Taller" + modifier_type = /datum/modifier/trait/taller + mutually_exclusive = list(/datum/trait/modifier/physical/shorter, /datum/trait/modifier/physical/short, /datum/trait/modifier/physical/tall) + +/datum/trait/modifier/physical/thin + name = "Thin" + modifier_type = /datum/modifier/trait/thin + mutually_exclusive = list(/datum/trait/modifier/physical/fat, /datum/trait/modifier/physical/obese, /datum/trait/modifier/physical/thinner) + +/datum/trait/modifier/physical/thinner + name = "Rail Thin" + modifier_type = /datum/modifier/trait/thinner + mutually_exclusive = list(/datum/trait/modifier/physical/fat, /datum/trait/modifier/physical/obese, /datum/trait/modifier/physical/thin) + +/datum/trait/modifier/physical/fat + name = "Broad-Shouldered" + modifier_type = /datum/modifier/trait/fat + mutually_exclusive = list(/datum/trait/modifier/physical/thin, /datum/trait/modifier/physical/obese, /datum/trait/modifier/physical/thinner) + +/datum/trait/modifier/physical/obese + name = "Heavily Built" + modifier_type = /datum/modifier/trait/obese + mutually_exclusive = list(/datum/trait/modifier/physical/fat, /datum/trait/modifier/physical/thinner, /datum/trait/modifier/physical/thin) /datum/trait/modifier/physical/colorblind_protanopia name = "Protanopia" diff --git a/code/modules/client/preference_setup/vore/02_size.dm b/code/modules/client/preference_setup/vore/02_size.dm index dcccf64ae05..2fe8b54e983 100644 --- a/code/modules/client/preference_setup/vore/02_size.dm +++ b/code/modules/client/preference_setup/vore/02_size.dm @@ -46,7 +46,6 @@ character.weight_loss = pref.weight_loss character.fuzzy = pref.fuzzy character.appearance_flags -= pref.fuzzy*PIXEL_SCALE - character.appearance_flags |= KEEP_TOGETHER character.resize(pref.size_multiplier, animate = FALSE) /datum/category_item/player_setup_item/vore/size/content(var/mob/user) diff --git a/code/modules/client/preference_setup/vore/06_vantag.dm b/code/modules/client/preference_setup/vore/06_vantag.dm index 65bc66a4955..c65c379bf23 100644 --- a/code/modules/client/preference_setup/vore/06_vantag.dm +++ b/code/modules/client/preference_setup/vore/06_vantag.dm @@ -27,7 +27,7 @@ /datum/category_item/player_setup_item/vore/vantag/content(var/mob/user) . += "
      " - . += "Event Volunteer:[pref.vantag_volunteer ? "Yes" : "No"]
      " + . += "Event Volunteer:[pref.vantag_volunteer ? "Yes" : "No"]
      " . += "Event Pref:[vantag_choices_list[pref.vantag_preference]]
      " /datum/category_item/player_setup_item/vore/vantag/OnTopic(var/href, var/list/href_list, var/mob/user) diff --git a/code/modules/client/preference_setup/vore/07_traits.dm b/code/modules/client/preference_setup/vore/07_traits.dm index fe87d35fbe5..06b748f3592 100644 --- a/code/modules/client/preference_setup/vore/07_traits.dm +++ b/code/modules/client/preference_setup/vore/07_traits.dm @@ -96,7 +96,7 @@ log_game("TRAITS [pref.client_ckey]/([character]) with: [english_traits]") //Terrible 'fake' key_name()... but they aren't in the same entity yet /datum/category_item/player_setup_item/vore/traits/content(var/mob/user) - . += "Custom Species " + . += "Custom Species Name: " . += "[pref.custom_species ? pref.custom_species : "-Input Name-"]
      " var/datum/species/selected_species = all_species[pref.species] diff --git a/code/modules/client/preference_setup/vore/09_misc.dm b/code/modules/client/preference_setup/vore/09_misc.dm index 09369d49017..2911c8a10d0 100644 --- a/code/modules/client/preference_setup/vore/09_misc.dm +++ b/code/modules/client/preference_setup/vore/09_misc.dm @@ -1,5 +1,4 @@ -/datum/preferences - var/show_in_directory = TRUE +//TFF 5/8/19 - moved /datum/preferences to preferences_vr.dm /datum/category_item/player_setup_item/vore/misc name = "Misc Settings" @@ -7,20 +6,35 @@ /datum/category_item/player_setup_item/vore/misc/load_character(var/savefile/S) S["show_in_directory"] >> pref.show_in_directory - + S["sensorpref"] >> pref.sensorpref //TFF 5/8/19 - add sensor pref setting to load after saved /datum/category_item/player_setup_item/vore/misc/save_character(var/savefile/S) S["show_in_directory"] << pref.show_in_directory + S["sensorpref"] << pref.sensorpref //TFF 5/8/19 - add sensor pref setting to be saveable + +//TFF 5/8/19 - add new datum category to allow for setting multiple settings when this is selected in the loadout. +/datum/category_item/player_setup_item/vore/misc/copy_to_mob(var/mob/living/carbon/human/character) + if(pref.sensorpref > 5 || pref.sensorpref < 1) + pref.sensorpref = 5 + character.sensorpref = pref.sensorpref /datum/category_item/player_setup_item/vore/misc/sanitize_character() pref.show_in_directory = sanitize_integer(pref.show_in_directory, 0, 1, initial(pref.show_in_directory)) + pref.sensorpref = sanitize_integer(pref.sensorpref, 1, sensorpreflist.len, initial(pref.sensorpref)) //TFF - 5/8/19 - add santisation for sensor prefs /datum/category_item/player_setup_item/vore/misc/content(var/mob/user) . += "
      " . += "Appear in Character Directory:[pref.show_in_directory ? "Yes" : "No"]
      " + . += "Suit Sensors Preference:[sensorpreflist[pref.sensorpref]]
      " //TFF 5/8/19 - Allow selection of sensor settings from off, binary, vitals, tracking, or random /datum/category_item/player_setup_item/vore/misc/OnTopic(var/href, var/list/href_list, var/mob/user) if(href_list["toggle_show_in_directory"]) pref.show_in_directory = pref.show_in_directory ? 0 : 1; return TOPIC_REFRESH + //TFF 5/8/19 - add new thing so you can choose the sensor setting your character can get. + else if(href_list["toggle_sensor_setting"]) + var/new_sensorpref = input(user, "Choose your character's sensor preferences:", "Character Preferences", sensorpreflist[pref.sensorpref]) as null|anything in sensorpreflist + if (!isnull(new_sensorpref) && CanUseTopic(user)) + pref.sensorpref = sensorpreflist.Find(new_sensorpref) + return TOPIC_REFRESH return ..(); diff --git a/code/modules/client/preferences_vr.dm b/code/modules/client/preferences_vr.dm index 23105324a52..5c8171ce27c 100644 --- a/code/modules/client/preferences_vr.dm +++ b/code/modules/client/preferences_vr.dm @@ -1 +1,36 @@ -//File isn't currently being used. +//TFF 5/8/19 - minor refactoring of this thing from 09_misc.dm to call this for preferences. +datum/preferences + var/show_in_directory = 1 //TFF 5/8/19 - show in Character Directory + var/sensorpref = 5 //TFF 5/8/19 - set character's suit sensor level + +//Why weren't these in game toggles already? +/client/verb/toggle_eating_noises() + set name = "Eating Noises" + set category = "Preferences" + set desc = "Toggles Vore Eating noises." + + var/pref_path = /datum/client_preference/eating_noises + + toggle_preference(pref_path) + + src << "You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] hear eating related vore noises." + + SScharacter_setup.queue_preferences_save(prefs) + + feedback_add_details("admin_verb","TEatNoise") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + + +/client/verb/toggle_digestion_noises() + set name = "Digestion Noises" + set category = "Preferences" + set desc = "Toggles Vore Digestion noises." + + var/pref_path = /datum/client_preference/digestion_noises + + toggle_preference(pref_path) + + src << "You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] hear digestion related vore noises." + + SScharacter_setup.queue_preferences_save(prefs) + + feedback_add_details("admin_verb","TDigestNoise") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index b5aa5d7594d..8af9f36d534 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -293,6 +293,17 @@ punch_force = initial(punch_force) wearer = null +/obj/item/clothing/gloves + var/datum/unarmed_attack/special_attack = null //do the gloves have a special unarmed attack? + var/special_attack_type = null + +/obj/item/clothing/gloves/New() + ..() + if(special_attack_type && ispath(special_attack_type)) + special_attack = new special_attack_type + + + ///////////////////////////////////////////////////////////////////// //Rings @@ -502,6 +513,7 @@ if(usr.put_in_hands(holding)) usr.visible_message("\The [usr] pulls a knife out of their boot!") holding = null + overlays -= image(icon, "[icon_state]_knife") else usr << "Your need an empty, unbroken hand to do that." holding.forceMove(src) @@ -546,14 +558,25 @@ update_icon() /obj/item/clothing/shoes/update_icon() - overlays.Cut() + overlays.Cut() //This removes all the overlays on the sprite and then goes down a checklist adding them as required. + if(blood_DNA) + add_blood() if(holding) overlays += image(icon, "[icon_state]_knife") + if(contaminated) + overlays += contamination_overlay + if(gurgled) //VOREStation Edit Start + decontaminate() + gurgle_contaminate() //VOREStation Edit End if(ismob(usr)) var/mob/M = usr M.update_inv_shoes() return ..() +/obj/item/clothing/shoes/clean_blood() + update_icon() + return ..() + /obj/item/clothing/shoes/proc/handle_movement(var/turf/walking, var/running) if(prob(1) && !recent_squish) //VOREStation edit begin recent_squish = 1 diff --git a/code/modules/clothing/clothing_vr.dm b/code/modules/clothing/clothing_vr.dm index fc2d5c48c2a..b6e387c9bf9 100644 --- a/code/modules/clothing/clothing_vr.dm +++ b/code/modules/clothing/clothing_vr.dm @@ -126,9 +126,28 @@ return ..() // Taur suits need to be shifted so its centered on their taur half. -/obj/item/clothing/suit/make_worn_icon(var/body_type,var/slot_name,var/inhands,var/default_icon,var/default_layer = 0) +/obj/item/clothing/suit/make_worn_icon(var/body_type,var/slot_name,var/inhands,var/default_icon,var/default_layer = 0,var/icon/clip_mask) var/image/standing = ..() if(taurized) //Special snowflake var on suits standing.pixel_x = -16 standing.layer = BODY_LAYER + 15 // 15 is above tail layer, so will not be covered by taurbody. return standing + +//TFF 5/8/19 - sets Vorestation /obj/item/clothing/under sensor setting default? +/obj/item/clothing/under + sensor_mode = 3 + var/sensorpref = 5 + +//TFF 5/8/19 - define numbers and specifics for suit sensor settings +/obj/item/clothing/under/New(var/mob/living/carbon/human/H) + ..() + sensorpref = isnull(H) ? 1 : (ishuman(H) ? H.sensorpref : 1) + switch(sensorpref) + if(1) sensor_mode = 0 //Sensors off + if(2) sensor_mode = 1 //Sensors on binary + if(3) sensor_mode = 2 //Sensors display vitals + if(4) sensor_mode = 3 //Sensors display vitals and enables tracking + if(5) sensor_mode = pick(0,1,2,3) //Select a random setting + else + sensor_mode = pick(0,1,2,3) + log_debug("Invalid switch for suit sensors, defaulting to random. [sensorpref] chosen") \ No newline at end of file diff --git a/code/modules/clothing/ears/earrings.dm b/code/modules/clothing/ears/earrings.dm new file mode 100644 index 00000000000..154f69f44a9 --- /dev/null +++ b/code/modules/clothing/ears/earrings.dm @@ -0,0 +1,78 @@ +//Material earrings +/obj/item/clothing/ears/earring + name = "earring" + desc = "An earring of some kind." + icon = 'icons/obj/clothing/ears.dmi' + +/obj/item/clothing/ears/earring/stud + name = "pearl stud earrings" + desc = "A pair of small stud earrings." + icon_state = "ear_stud" + color = "#eae0c8" + +/obj/item/clothing/ears/earring/stud/glass + name = "glass stud earrings" + color = "#00e1ff" + +/obj/item/clothing/ears/earring/stud/wood + name = "wood stud earrings" + color = "#824b28" + +/obj/item/clothing/ears/earring/stud/iron + name = "iron stud earrings" + color = "#5c5454" + +/obj/item/clothing/ears/earring/stud/steel + name = "steel stud earrings" + color = "#666666" + +/obj/item/clothing/ears/earring/stud/silver + name = "silver stud earrings" + color = "#d1e6e3" + +/obj/item/clothing/ears/earring/stud/gold + name = "gold stud earrings" + color = "#edd12f" + +/obj/item/clothing/ears/earring/stud/platinum + name = "platinum stud earrings" + color = "#9999ff" + +/obj/item/clothing/ears/earring/stud/diamond + name = "diamond stud earrings" + color = "#00ffe1" + +/obj/item/clothing/ears/earring/dangle + icon_state = "ear_dangle" + +/obj/item/clothing/ears/earring/dangle/glass + name = "glass dangle earrings" + color = "#00e1ff" + +/obj/item/clothing/ears/earring/dangle/wood + name = "wood dangle earrings" + color = "#824b28" + +/obj/item/clothing/ears/earring/dangle/iron + name = "iron dangle earrings" + color = "#5c5454" + +/obj/item/clothing/ears/earring/dangle/steel + name = "steel dangle earrings" + color = "#666666" + +/obj/item/clothing/ears/earring/dangle/silver + name = "silver dangle earrings" + color = "#d1e6e3" + +/obj/item/clothing/ears/earring/dangle/gold + name = "gold dangle earrings" + color = "#edd12f" + +/obj/item/clothing/ears/earring/dangle/platinum + name = "platinum dangle earrings" + color = "#9999ff" + +/obj/item/clothing/ears/earring/dangle/diamond + name = "diamond dangle earrings" + color = "#00ffe1" \ No newline at end of file diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm index a456e85939a..a030bc038c5 100644 --- a/code/modules/clothing/gloves/color.dm +++ b/code/modules/clothing/gloves/color.dm @@ -15,7 +15,7 @@ /obj/item/clothing/gloves/fyellow/Initialize() . = ..() //Picks a value between 0 and 1.25, in 5% increments // VOREStation edit - var/shock_pick = rand(0,25) // VOREStation Edit + var/shock_pick = rand(0,15) // VOREStation Edit siemens_coefficient = shock_pick * 0.05 /obj/item/clothing/gloves/black diff --git a/code/modules/clothing/gloves/gauntlets.dm b/code/modules/clothing/gloves/gauntlets.dm index b65884d3f9c..8807fb93ad5 100644 --- a/code/modules/clothing/gloves/gauntlets.dm +++ b/code/modules/clothing/gloves/gauntlets.dm @@ -18,6 +18,10 @@ var/mob/living/carbon/human/H = user if(H.gloves) gloves = H.gloves + if(!istype(gloves)) + to_chat(user, "You are unable to wear \the [src] as \the [H.gloves] are in the way.") + gloves = null + return 0 if(gloves.overgloves) to_chat(user, "You are unable to wear \the [src] as \the [H.gloves] are in the way.") gloves = null diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index f246a8563cb..dd290af26e2 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -107,7 +107,7 @@ name = "tactical light helmet" desc = "A tan helmet made from advanced ceramic with an integrated tactical flashlight." icon_state = "flexitac" - armor = list(40, bullet = 40, laser = 60, energy = 35, bomb = 30, bio = 0, rad = 0) + armor = list(melee = 40, bullet = 40, laser = 60, energy = 35, bomb = 30, bio = 0, rad = 0) siemens_coefficient = 0.6 brightness_on = 6 light_overlay = "helmet_light_dual_green" diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index b706e71e9dc..a9232aa65ce 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -219,7 +219,7 @@ /obj/item/clothing/head/psy_crown name = "broken crown" desc = "A crown-of-thorns with a missing gem." - var/tension_threshold = 150 + var/tension_threshold = 125 var/cooldown = null // world.time of when this was last triggered. var/cooldown_duration = 3 MINUTES // How long the cooldown should be. var/flavor_equip = null // Message displayed to someone who puts this on their head. Drones don't get a message. @@ -273,3 +273,17 @@ /obj/item/clothing/head/psy_crown/wrath/activate_ability(var/mob/living/wearer) ..() wearer.add_modifier(/datum/modifier/berserk, 30 SECONDS) + +/obj/item/clothing/head/psy_crown/gluttony + name = "green crown" + desc = "A crown-of-thorns set with a green gemstone that seems to glow unnaturally. It feels rather disturbing to touch." + description_info = "This has a chance to cause the wearer to become extremely durable, but hungry when in extreme danger." + icon_state = "gluttonycrown" + flavor_equip = "You feel a bit hungrier after putting on this crown." + flavor_unequip = "You feel sated after removing the crown." + flavor_drop = "You feel much more sated after letting go of the crown." + flavor_activate = "An otherworldly feeling seems to enter your mind, and it drives your mind into gluttony!" + +/obj/item/clothing/head/psy_crown/gluttony/activate_ability(var/mob/living/wearer) + ..() + wearer.add_modifier(/datum/modifier/gluttonyregeneration, 45 SECONDS) diff --git a/code/modules/clothing/spacesuits/rig/modules/combat_vr.dm b/code/modules/clothing/spacesuits/rig/modules/combat_vr.dm new file mode 100644 index 00000000000..f62c0bf4b8e --- /dev/null +++ b/code/modules/clothing/spacesuits/rig/modules/combat_vr.dm @@ -0,0 +1,12 @@ +/obj/item/rig_module/grenade_launcher/cleaner + name = "mounted cleaner-grenade launcher" + desc = "A shoulder-mounted cleaner-grenade dispenser." + + interface_name = "integrated cleaner-grenade launcher" + interface_desc = "Discharges loaded cleaner-grenades against the wearer's location." + + fire_force = 15 + + charges = list( + list("cleaner grenade", "cleaner grenade", /obj/item/weapon/grenade/chem_grenade/cleaner, 6) + ) diff --git a/code/modules/clothing/spacesuits/rig/rig_attackby.dm b/code/modules/clothing/spacesuits/rig/rig_attackby.dm index 3d5fc130047..67080dd1e04 100644 --- a/code/modules/clothing/spacesuits/rig/rig_attackby.dm +++ b/code/modules/clothing/spacesuits/rig/rig_attackby.dm @@ -105,7 +105,7 @@ else if(W.is_wrench()) if(!air_supply) - to_chat(user, "There is not tank to remove.") + to_chat(user, "There is no tank to remove.") return if(user.r_hand && user.l_hand) @@ -137,7 +137,7 @@ if("cell") if(cell) - to_chat(user, "You detatch \the [cell] from \the [src]'s battery mount.") + to_chat(user, "You detach \the [cell] from \the [src]'s battery mount.") for(var/obj/item/rig_module/module in installed_modules) module.deactivate() if(user.r_hand && user.l_hand) @@ -165,7 +165,7 @@ return var/obj/item/rig_module/removed = possible_removals[removal_choice] - to_chat(user, "You detatch \the [removed] from \the [src].") + to_chat(user, "You detach \the [removed] from \the [src].") removed.forceMove(get_turf(src)) removed.removed() installed_modules -= removed diff --git a/code/modules/clothing/spacesuits/rig/suits/ert_vr.dm b/code/modules/clothing/spacesuits/rig/suits/ert_vr.dm new file mode 100644 index 00000000000..034ea31865f --- /dev/null +++ b/code/modules/clothing/spacesuits/rig/suits/ert_vr.dm @@ -0,0 +1,13 @@ +/obj/item/weapon/rig/ert/janitor + name = "ERT-J suit control module" + desc = "A suit worn by the janitorial division of an Emergency Response Team. Has purple highlights. Armoured and space ready." + suit_type = "ERT janitor" + icon_state = "ert_janitor_rig" + + initial_modules = list( + /obj/item/rig_module/maneuvering_jets, + /obj/item/rig_module/grenade_launcher/cleaner, + ) + +/obj/item/weapon/rig/ert/assetprotection + armor = list(melee = 80, bullet = 65, laser = 50, energy = 15, bomb = 80, bio = 100, rad = 60) diff --git a/code/modules/clothing/spacesuits/rig/suits/station_vr.dm b/code/modules/clothing/spacesuits/rig/suits/station_vr.dm index 3b51d130535..2049530d026 100644 --- a/code/modules/clothing/spacesuits/rig/suits/station_vr.dm +++ b/code/modules/clothing/spacesuits/rig/suits/station_vr.dm @@ -1,13 +1,3 @@ -//Drill added for hazmat suit -/obj/item/weapon/rig/hazmat/equipped - req_access = list(access_xenoarch) - initial_modules = list( - /obj/item/rig_module/ai_container, - /obj/item/rig_module/maneuvering_jets, - /obj/item/rig_module/device/anomaly_scanner, - /obj/item/rig_module/device/drill //The suit has nothing to mine with otherwise. - ) - //Access restriction and seal delay, plus pat_module and rescue_pharm for medical suit /obj/item/weapon/rig/medical/equipped req_access = list(access_medical) @@ -21,30 +11,42 @@ ) //Armor reduction for industrial suit -/obj/item/weapon/rig/industrial +/obj/item/weapon/rig/industrial/vendor + desc = "A heavy, powerful hardsuit used by construction crews and mining corporations. This is a mass production model with reduced armor." armor = list(melee = 50, bullet = 10, laser = 20, energy = 15, bomb = 30, bio = 100, rad = 50) //Area allowing backpacks to be placed on rigsuits. /obj/item/weapon/rig/vox - allowed = list(/obj/item/weapon/gun,/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/backpack) + allowed = list(/obj/item/weapon/gun,/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/backpack,/obj/item/device/subspaceradio) /obj/item/weapon/rig/combat - allowed = list(/obj/item/weapon/gun,/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/melee/baton,/obj/item/weapon/storage/backpack) + allowed = list(/obj/item/weapon/gun,/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/melee/baton,/obj/item/weapon/storage/backpack,/obj/item/device/subspaceradio) /obj/item/weapon/rig/ert allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank, /obj/item/device/t_scanner, /obj/item/weapon/rcd, /obj/item/weapon/tool/crowbar, \ /obj/item/weapon/tool/screwdriver, /obj/item/weapon/weldingtool, /obj/item/weapon/tool/wirecutters, /obj/item/weapon/tool/wrench, /obj/item/device/multitool, \ /obj/item/device/radio, /obj/item/device/analyzer,/obj/item/weapon/storage/briefcase/inflatable, /obj/item/weapon/melee/baton, /obj/item/weapon/gun, \ - /obj/item/weapon/storage/firstaid, /obj/item/weapon/reagent_containers/hypospray, /obj/item/roller, /obj/item/weapon/storage/backpack) + /obj/item/weapon/storage/firstaid, /obj/item/weapon/reagent_containers/hypospray, /obj/item/roller, /obj/item/weapon/storage/backpack,/obj/item/device/subspaceradio) /obj/item/weapon/rig/light/ninja - allowed = list(/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/cell, /obj/item/weapon/storage/backpack) + allowed = list(/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/cell, /obj/item/weapon/storage/backpack,/obj/item/device/subspaceradio) /obj/item/weapon/rig/merc - allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword,/obj/item/weapon/handcuffs, /obj/item/weapon/storage/backpack) + allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword,/obj/item/weapon/handcuffs, /obj/item/weapon/storage/backpack,/obj/item/device/subspaceradio) /obj/item/weapon/rig/ce - allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/bag/ore,/obj/item/device/t_scanner,/obj/item/weapon/pickaxe, /obj/item/weapon/rcd,/obj/item/weapon/storage/backpack) + allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/bag/ore,/obj/item/device/t_scanner,/obj/item/weapon/pickaxe, /obj/item/weapon/rcd,/obj/item/weapon/storage/backpack,/obj/item/device/subspaceradio) /obj/item/weapon/rig/medical - allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/firstaid,/obj/item/device/healthanalyzer,/obj/item/stack/medical,/obj/item/roller,/obj/item/weapon/storage/backpack) + allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/firstaid,/obj/item/device/healthanalyzer,/obj/item/stack/medical,/obj/item/roller,/obj/item/weapon/storage/backpack,/obj/item/device/subspaceradio) /obj/item/weapon/rig/hazmat - allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/stack/flag,/obj/item/weapon/storage/excavation,/obj/item/weapon/pickaxe,/obj/item/device/healthanalyzer,/obj/item/device/measuring_tape,/obj/item/device/ano_scanner,/obj/item/device/depth_scanner,/obj/item/device/core_sampler,/obj/item/device/gps,/obj/item/device/beacon_locator,/obj/item/device/radio/beacon,/obj/item/weapon/pickaxe/hand,/obj/item/weapon/storage/bag/fossils,/obj/item/weapon/storage/backpack) + allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/stack/flag,/obj/item/weapon/storage/excavation,/obj/item/weapon/pickaxe,/obj/item/device/healthanalyzer,/obj/item/device/measuring_tape,/obj/item/device/ano_scanner,/obj/item/device/depth_scanner,/obj/item/device/core_sampler,/obj/item/device/gps,/obj/item/device/beacon_locator,/obj/item/device/radio/beacon,/obj/item/weapon/pickaxe/hand,/obj/item/weapon/storage/bag/fossils,/obj/item/weapon/storage/backpack,/obj/item/device/subspaceradio) /obj/item/weapon/rig/hazard - allowed = list(/obj/item/weapon/gun,/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/melee/baton,/obj/item/weapon/storage/backpack) + allowed = list(/obj/item/weapon/gun,/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/melee/baton,/obj/item/weapon/storage/backpack,/obj/item/device/subspaceradio) /obj/item/weapon/rig/industrial - allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/bag/ore,/obj/item/device/t_scanner,/obj/item/weapon/pickaxe, /obj/item/weapon/rcd,/obj/item/weapon/storage/backpack) + allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/bag/ore,/obj/item/device/t_scanner,/obj/item/weapon/pickaxe, /obj/item/weapon/rcd,/obj/item/weapon/storage/backpack,/obj/item/device/subspaceradio) + +/obj/item/weapon/rig/military + allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/handcuffs, \ + /obj/item/device/t_scanner, /obj/item/weapon/rcd, /obj/item/weapon/weldingtool, /obj/item/weapon/tool, /obj/item/device/multitool, \ + /obj/item/device/radio, /obj/item/device/analyzer,/obj/item/weapon/storage/briefcase/inflatable, /obj/item/weapon/melee/baton, /obj/item/weapon/gun, \ + /obj/item/weapon/storage/firstaid, /obj/item/weapon/reagent_containers/hypospray, /obj/item/roller, /obj/item/device/suit_cooling_unit, /obj/item/weapon/storage/backpack,/obj/item/device/subspaceradio) +/obj/item/weapon/rig/pmc + allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank, /obj/item/device/t_scanner, /obj/item/weapon/rcd, /obj/item/weapon/tool/crowbar, \ + /obj/item/weapon/tool/screwdriver, /obj/item/weapon/weldingtool, /obj/item/weapon/tool/wirecutters, /obj/item/weapon/tool/wrench, /obj/item/device/multitool, \ + /obj/item/device/radio, /obj/item/device/analyzer,/obj/item/weapon/storage/briefcase/inflatable, /obj/item/weapon/melee/baton, /obj/item/weapon/gun, \ + /obj/item/weapon/storage/firstaid, /obj/item/weapon/reagent_containers/hypospray, /obj/item/roller, /obj/item/weapon/storage/backpack,/obj/item/device/subspaceradio) diff --git a/code/modules/clothing/spacesuits/spacesuits.dm b/code/modules/clothing/spacesuits/spacesuits.dm index 3c10a03a8b2..300368260a1 100644 --- a/code/modules/clothing/spacesuits/spacesuits.dm +++ b/code/modules/clothing/spacesuits/spacesuits.dm @@ -30,23 +30,36 @@ brightness_on = 4 on = 0 -/obj/item/clothing/head/helmet/space/attack_self(mob/user) +/obj/item/clothing/head/helmet/space/verb/toggle_camera() + set name = "Toggle Helmet Camera" + set desc = "Turn your helmet's camera on or off." + set category = "Object" + set src in usr + if(usr.stat || usr.restrained() || usr.incapacitated()) + return - if(!camera && camera_networks) + if(camera_networks) + if(!camera) + camera = new /obj/machinery/camera(src) + camera.replace_networks(camera_networks) + camera.set_status(FALSE) //So the camera will activate in the following check. - camera = new /obj/machinery/camera(src) - camera.replace_networks(camera_networks) - camera.c_tag = user.name - user << "User scanned as [camera.c_tag]. Camera activated." - user.update_action_buttons() - return 1 + if(camera.status == TRUE) + camera.set_status(FALSE) + to_chat(usr, "Camera deactivated.") + else + camera.set_status(TRUE) + camera.c_tag = usr.name + to_chat(usr, "User scanned as [camera.c_tag]. Camera activated.") - ..() + else + to_chat(usr, "This helmet does not have a built-in camera.") + return /obj/item/clothing/head/helmet/space/examine() ..() if(camera_networks && get_dist(usr,src) <= 1) - usr << "This helmet has a built-in camera. It's [camera ? "" : "in"]active." + to_chat(usr, "This helmet has a built-in camera. It's [camera ? "" : "in"]active.") /obj/item/clothing/suit/space name = "Space suit" @@ -95,18 +108,18 @@ if(user.wear_suit == src) for(var/obj/item/organ/external/E in user.bad_external_organs) if(E.is_broken() && E.apply_splint(src)) - user << "You feel [src] constrict about your [E.name], supporting it." + to_chat(user, "You feel [src] constrict about your [E.name], supporting it.") supporting_limbs |= E else // Otherwise, remove the splints. for(var/obj/item/organ/external/E in supporting_limbs) if(E.splinted == src && E.remove_splint(src)) - user << "\The [src] stops supporting your [E.name]." + to_chat(user, "\The [src] stops supporting your [E.name].") supporting_limbs.Cut() /obj/item/clothing/suit/space/proc/handle_fracture(var/mob/living/carbon/human/user, var/obj/item/organ/external/E) if(!istype(user) || isnull(supporting_limbs)) return if(E.is_broken() && E.apply_splint(src)) - user << "You feel [src] constrict about your [E.name], supporting it." + to_chat(user, "You feel [src] constrict about your [E.name], supporting it.") supporting_limbs |= E diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 0f8b999b4cc..91f441fa373 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -323,7 +323,7 @@ obj/item/clothing/suit/kamishimo item_state_slots = list(slot_r_hand_str = "leather_jacket", slot_l_hand_str = "leather_jacket") flags_inv = HIDEHOLSTER -obj/item/clothing/suit/storage/toggle/peacoat +/obj/item/clothing/suit/storage/toggle/peacoat name = "peacoat" desc = "A well-tailored, stylish peacoat." icon_state = "peacoat" @@ -338,6 +338,14 @@ obj/item/clothing/suit/storage/toggle/peacoat blood_overlay_type = "coat" allowed = list(/obj/item/weapon/tank/emergency/oxygen, /obj/item/device/flashlight,/obj/item/weapon/gun/energy,/obj/item/weapon/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/flame/lighter) flags_inv = HIDEHOLSTER + +/obj/item/clothing/suit/storage/toggle/cardigan + name = "cardigan" + desc = "A cozy cardigan in a classic style." + icon_state = "cardigan" + addblends = "cardigan_a" + flags_inv = HIDEHOLSTER + /* * stripper */ diff --git a/code/modules/clothing/under/accessories/clothing.dm b/code/modules/clothing/under/accessories/clothing.dm index 66636aac6f7..d5991e4f100 100644 --- a/code/modules/clothing/under/accessories/clothing.dm +++ b/code/modules/clothing/under/accessories/clothing.dm @@ -349,6 +349,25 @@ desc = "A really cheesy holiday sweater, it actually kinda itches." icon_state = "turtleneck_winterred" +/obj/item/clothing/accessory/sweater/uglyxmas + name = "ugly Christmas sweater" + desc = "A gift that probably should've stayed in the back of the closet." + icon_state = "uglyxmas" + +/obj/item/clothing/accessory/sweater/flowersweater + name = "flowery sweater" + desc = "An oversized and flowery pink sweater." + icon_state = "flowersweater" + +/obj/item/clothing/accessory/sweater/redneck + name = "red turtleneck" + desc = "A comfortable turtleneck in a dark red." + icon_state = "turtleneck_red" + +//*** +// End of sweaters +//*** + /obj/item/clothing/accessory/cowledvest name = "cowled vest" desc = "A body warmer for the 26th century." diff --git a/code/modules/clothing/under/accessories/storage.dm b/code/modules/clothing/under/accessories/storage.dm index 83cf2e3049d..0c1cfee9cae 100644 --- a/code/modules/clothing/under/accessories/storage.dm +++ b/code/modules/clothing/under/accessories/storage.dm @@ -9,12 +9,15 @@ var/obj/item/weapon/storage/internal/hold w_class = ITEMSIZE_NORMAL on_rolled = list("down" = "none") + var/hide_on_roll = FALSE /obj/item/clothing/accessory/storage/New() ..() hold = new/obj/item/weapon/storage/internal(src) hold.max_storage_space = slots * 2 hold.max_w_class = ITEMSIZE_SMALL + if (!hide_on_roll) + on_rolled["down"] = icon_state /obj/item/clothing/accessory/storage/attack_hand(mob/user as mob) if (has_suit) //if we are part of a suit diff --git a/code/modules/clothing/under/accessories/torch.dm b/code/modules/clothing/under/accessories/torch.dm index c7fe8538081..7cdec72747d 100644 --- a/code/modules/clothing/under/accessories/torch.dm +++ b/code/modules/clothing/under/accessories/torch.dm @@ -310,9 +310,9 @@ department tags desc = "Insignia denoting assignment to the command department. These fit Fleet uniforms." on_rolled = list("rolled" = "dept_fleet_sleeves", "down" = "none") -/obj/item/clothing/accessory/solgov/department/command/army - icon_state = "dept_army" - desc = "Insignia denoting assignment to the command department. These fit Army uniforms." +/obj/item/clothing/accessory/solgov/department/command/marine + icon_state = "dept_marine" + desc = "Insignia denoting assignment to the command department. These fit marine uniforms." on_rolled = list("down" = "none") /obj/item/clothing/accessory/solgov/department/engineering @@ -328,9 +328,9 @@ department tags desc = "Insignia denoting assignment to the engineering department. These fit Fleet uniforms." on_rolled = list("rolled" = "dept_fleet_sleeves", "down" = "none") -/obj/item/clothing/accessory/solgov/department/engineering/army - icon_state = "dept_army" - desc = "Insignia denoting assignment to the engineering department. These fit Army uniforms." +/obj/item/clothing/accessory/solgov/department/engineering/marine + icon_state = "dept_marine" + desc = "Insignia denoting assignment to the engineering department. These fit marine uniforms." on_rolled = list("down" = "none") /obj/item/clothing/accessory/solgov/department/security @@ -346,9 +346,9 @@ department tags desc = "Insignia denoting assignment to the security department. These fit Fleet uniforms." on_rolled = list("rolled" = "dept_fleet_sleeves", "down" = "none") -/obj/item/clothing/accessory/solgov/department/security/army - icon_state = "dept_army" - desc = "Insignia denoting assignment to the security department. These fit Army uniforms." +/obj/item/clothing/accessory/solgov/department/security/marine + icon_state = "dept_marine" + desc = "Insignia denoting assignment to the security department. These fit marine uniforms." on_rolled = list("down" = "none") /obj/item/clothing/accessory/solgov/department/medical @@ -364,9 +364,9 @@ department tags desc = "Insignia denoting assignment to the medical department. These fit Fleet uniforms." on_rolled = list("rolled" = "dept_fleet_sleeves", "down" = "none") -/obj/item/clothing/accessory/solgov/department/medical/army - icon_state = "dept_army" - desc = "Insignia denoting assignment to the medical department. These fit Army uniforms." +/obj/item/clothing/accessory/solgov/department/medical/marine + icon_state = "dept_marine" + desc = "Insignia denoting assignment to the medical department. These fit marine uniforms." on_rolled = list("down" = "none") /obj/item/clothing/accessory/solgov/department/supply @@ -382,9 +382,9 @@ department tags desc = "Insignia denoting assignment to the supply department. These fit Fleet uniforms." on_rolled = list("rolled" = "dept_fleet_sleeves", "down" = "none") -/obj/item/clothing/accessory/solgov/department/supply/army - icon_state = "dept_army" - desc = "Insignia denoting assignment to the supply department. These fit Army uniforms." +/obj/item/clothing/accessory/solgov/department/supply/marine + icon_state = "dept_marine" + desc = "Insignia denoting assignment to the supply department. These fit marine uniforms." on_rolled = list("down" = "none") /obj/item/clothing/accessory/solgov/department/service @@ -400,9 +400,9 @@ department tags desc = "Insignia denoting assignment to the service department. These fit Fleet uniforms." on_rolled = list("rolled" = "dept_fleet_sleeves", "down" = "none") -/obj/item/clothing/accessory/solgov/department/service/army - icon_state = "dept_army" - desc = "Insignia denoting assignment to the service department. These fit Army uniforms." +/obj/item/clothing/accessory/solgov/department/service/marine + icon_state = "dept_marine" + desc = "Insignia denoting assignment to the service department. These fit marine uniforms." on_rolled = list("down" = "none") /obj/item/clothing/accessory/solgov/department/exploration @@ -418,9 +418,9 @@ department tags desc = "Insignia denoting assignment to the exploration department. These fit Fleet uniforms." on_rolled = list("rolled" = "dept_fleet_sleeves", "down" = "none") -/obj/item/clothing/accessory/solgov/department/exploration/army - icon_state = "dept_army" - desc = "Insignia denoting assignment to the exploration department. These fit Army uniforms." +/obj/item/clothing/accessory/solgov/department/exploration/marine + icon_state = "dept_marine" + desc = "Insignia denoting assignment to the exploration department. These fit marine uniforms." on_rolled = list("down" = "none") /obj/item/clothing/accessory/solgov/department/research @@ -611,103 +611,103 @@ ranks - fleet /************** ranks - marines **************/ -/obj/item/clothing/accessory/solgov/rank/army - name = "army ranks" +/obj/item/clothing/accessory/solgov/rank/marine + name = "marine ranks" desc = "Insignia denoting marine rank of some kind. These appear blank." - icon_state = "armyrank_enlisted" + icon_state = "marinerank_enlisted" on_rolled = list("down" = "none") -/obj/item/clothing/accessory/solgov/rank/army/enlisted +/obj/item/clothing/accessory/solgov/rank/marine/enlisted name = "ranks (E-1 private)" desc = "Insignia denoting the rank of Private." - icon_state = "armyrank_enlisted" + icon_state = "marinerank_enlisted" -/obj/item/clothing/accessory/solgov/rank/army/enlisted/e2 +/obj/item/clothing/accessory/solgov/rank/marine/enlisted/e2 name = "ranks (E-2 private second class)" desc = "Insignia denoting the rank of Private Second Class." -/obj/item/clothing/accessory/solgov/rank/army/enlisted/e3 +/obj/item/clothing/accessory/solgov/rank/marine/enlisted/e3 name = "ranks (E-3 private first class)" desc = "Insignia denoting the rank of Private First Class." -/obj/item/clothing/accessory/solgov/rank/army/enlisted/e4 +/obj/item/clothing/accessory/solgov/rank/marine/enlisted/e4 name = "ranks (E-4 corporal)" desc = "Insignia denoting the rank of Corporal." -/obj/item/clothing/accessory/solgov/rank/army/enlisted/e5 +/obj/item/clothing/accessory/solgov/rank/marine/enlisted/e5 name = "ranks (E-5 sergeant)" desc = "Insignia denoting the rank of Sergeant." -/obj/item/clothing/accessory/solgov/rank/army/enlisted/e6 +/obj/item/clothing/accessory/solgov/rank/marine/enlisted/e6 name = "ranks (E-6 staff sergeant)" desc = "Insignia denoting the rank of Staff Sergeant." -/obj/item/clothing/accessory/solgov/rank/army/enlisted/e7 +/obj/item/clothing/accessory/solgov/rank/marine/enlisted/e7 name = "ranks (E-7 sergeant first class)" desc = "Insignia denoting the rank of Sergeant First Class." -/obj/item/clothing/accessory/solgov/rank/army/enlisted/e8 +/obj/item/clothing/accessory/solgov/rank/marine/enlisted/e8 name = "ranks (E-8 master sergeant)" desc = "Insignia denoting the rank of Master Sergeant." -/obj/item/clothing/accessory/solgov/rank/army/enlisted/e8_alt +/obj/item/clothing/accessory/solgov/rank/marine/enlisted/e8_alt name = "ranks (E-8 first sergeant)" desc = "Insignia denoting the rank of First Sergeant." -/obj/item/clothing/accessory/solgov/rank/army/enlisted/e9 +/obj/item/clothing/accessory/solgov/rank/marine/enlisted/e9 name = "ranks (E-9 sergeant major)" desc = "Insignia denoting the rank of Sergeant Major." -/obj/item/clothing/accessory/solgov/rank/army/enlisted/e9_alt1 +/obj/item/clothing/accessory/solgov/rank/marine/enlisted/e9_alt1 name = "ranks (E-9 command sergeant major)" desc = "Insignia denoting the rank of Command Sergeant Major." -/obj/item/clothing/accessory/solgov/rank/army/enlisted/e9_alt2 - name = "ranks (E-9 sergeant major of the Army)" - desc = "Insignia denoting the rank of Sergeant Major of the Army." +/obj/item/clothing/accessory/solgov/rank/marine/enlisted/e9_alt2 + name = "ranks (E-9 sergeant major of the marine)" + desc = "Insignia denoting the rank of Sergeant Major of the marine." -/obj/item/clothing/accessory/solgov/rank/army/officer +/obj/item/clothing/accessory/solgov/rank/marine/officer name = "ranks (O-1 second lieutenant)" desc = "Insignia denoting the rank of Second Lieutenant." - icon_state = "armyrank_officer" + icon_state = "marinerank_officer" -/obj/item/clothing/accessory/solgov/rank/army/officer/o2 +/obj/item/clothing/accessory/solgov/rank/marine/officer/o2 name = "ranks (O-2 first lieutenant)" desc = "Insignia denoting the rank of First Lieutenant." -/obj/item/clothing/accessory/solgov/rank/army/officer/o3 +/obj/item/clothing/accessory/solgov/rank/marine/officer/o3 name = "ranks (O-3 captain)" desc = "Insignia denoting the rank of Captain." -/obj/item/clothing/accessory/solgov/rank/army/officer/o4 +/obj/item/clothing/accessory/solgov/rank/marine/officer/o4 name = "ranks (O-4 major)" desc = "Insignia denoting the rank of Major." -/obj/item/clothing/accessory/solgov/rank/army/officer/o5 +/obj/item/clothing/accessory/solgov/rank/marine/officer/o5 name = "ranks (O-5 lieutenant colonel)" desc = "Insignia denoting the rank of Lieutenant Colonel." -/obj/item/clothing/accessory/solgov/rank/army/officer/o6 +/obj/item/clothing/accessory/solgov/rank/marine/officer/o6 name = "ranks (O-6 colonel)" desc = "Insignia denoting the rank of Colonel." -/obj/item/clothing/accessory/solgov/rank/army/flag +/obj/item/clothing/accessory/solgov/rank/marine/flag name = "ranks (O-7 brigadier general)" desc = "Insignia denoting the rank of Brigadier General." - icon_state = "armyrank_command" + icon_state = "marinerank_command" -/obj/item/clothing/accessory/solgov/rank/army/flag/o8 +/obj/item/clothing/accessory/solgov/rank/marine/flag/o8 name = "ranks (O-8 major general)" desc = "Insignia denoting the rank of Major General." -/obj/item/clothing/accessory/solgov/rank/army/flag/o9 +/obj/item/clothing/accessory/solgov/rank/marine/flag/o9 name = "ranks (O-9 lieutenant general)" desc = "Insignia denoting the rank of lieutenant general." -/obj/item/clothing/accessory/solgov/rank/army/flag/o10 +/obj/item/clothing/accessory/solgov/rank/marine/flag/o10 name = "ranks (O-10 general)" desc = "Insignia denoting the rank of General." -/obj/item/clothing/accessory/solgov/rank/army/flag/o10_alt +/obj/item/clothing/accessory/solgov/rank/marine/flag/o10_alt name = "ranks (O-10 field marshal)" desc = "Insignia denoting the rank of Field Marshal." diff --git a/code/modules/clothing/under/accessories/torch_vr.dm b/code/modules/clothing/under/accessories/torch_vr.dm new file mode 100644 index 00000000000..71ce5fb45df --- /dev/null +++ b/code/modules/clothing/under/accessories/torch_vr.dm @@ -0,0 +1,23 @@ +/obj/item/clothing/accessory/solgov/department/command + desc = "Insignia denoting assignment to the command department. These fit Society of Universal Cartographers uniforms." + +/obj/item/clothing/accessory/solgov/department/engineering + desc = "Insignia denoting assignment to the engineering department. These fit Society of Universal Cartographers uniforms." + +/obj/item/clothing/accessory/solgov/department/security + desc = "Insignia denoting assignment to the security department. These fit Society of Universal Cartographers uniforms." + +/obj/item/clothing/accessory/solgov/department/medical + desc = "Insignia denoting assignment to the medical department. These fit Society of Universal Cartographers uniforms." + +/obj/item/clothing/accessory/solgov/department/supply + desc = "Insignia denoting assignment to the supply department. These fit Society of Universal Cartographers uniforms." + +/obj/item/clothing/accessory/solgov/department/exploration + desc = "Insignia denoting assignment to the exploration department. These fit Society of Universal Cartographers uniforms." + +/obj/item/clothing/accessory/solgov/department/research + desc = "Insignia denoting assignment to the research department. These fit Society of Universal Cartographers uniforms." + +/obj/item/clothing/accessory/solgov/department/service + desc = "Insignia denoting assignment to the service department. These fit Society of Universal Cartographers uniforms." \ No newline at end of file diff --git a/code/modules/clothing/under/color.dm b/code/modules/clothing/under/color.dm index cc5d7ed9171..9638a414bd9 100644 --- a/code/modules/clothing/under/color.dm +++ b/code/modules/clothing/under/color.dm @@ -30,13 +30,19 @@ icon_state = "grey" rolled_sleeves = 0 +//TFF 5/8/19 - add a non perma-set orange jumpsuit, splits prison into its own obj with override var settings. +//TFF 5/9/19 - add a different icon_state to both jumpsuits, orange and prison. Refactors orange and prison jumpsuit slightly. /obj/item/clothing/under/color/orange name = "orange jumpsuit" - desc = "It's standardized prisoner-wear. Its suit sensors are permanently set to the \"Tracking\" position." icon_state = "orange" + rolled_sleeves = 0 + +/obj/item/clothing/under/color/prison + name = "prison jumpsuit" + desc = "It's standardized prisoner-wear. Its suit sensors are permanently set to the \"Tracking\" position." + icon_state = "prison" has_sensor = 2 sensor_mode = 3 - rolled_sleeves = 0 /obj/item/clothing/under/color/pink name = "pink jumpsuit" diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index 943577663ff..c90d575b983 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -453,6 +453,10 @@ icon_state = "sari_green" item_state_slots = list(slot_r_hand_str = "dress_green", slot_l_hand_str = "dress_green") +/obj/item/clothing/under/dress/lilacdress + name = "lilac dress" + desc = "A simple black dress adorned in fake purple lilacs." + icon_state = "lilacdress" /* * wedding stuff diff --git a/code/modules/clothing/under/miscellaneous_vr.dm b/code/modules/clothing/under/miscellaneous_vr.dm index 0644eb476c0..2c48b859a20 100644 --- a/code/modules/clothing/under/miscellaneous_vr.dm +++ b/code/modules/clothing/under/miscellaneous_vr.dm @@ -105,3 +105,7 @@ H.resize(original_size) original_size = null H.visible_message("The space around [H] distorts as they return to their original size!","The space around you distorts as you return to your original size!") + +//Same as Nanotrasen Security Uniforms +/obj/item/clothing/under/ert + armor = list(melee = 5, bullet = 10, laser = 10, energy = 5, bomb = 5, bio = 0, rad = 0) \ No newline at end of file diff --git a/code/modules/clothing/under/nanotrasen_vr.dm b/code/modules/clothing/under/nanotrasen_vr.dm index aff19ec6e49..f6eeecfb43b 100644 --- a/code/modules/clothing/under/nanotrasen_vr.dm +++ b/code/modules/clothing/under/nanotrasen_vr.dm @@ -13,7 +13,7 @@ desc = "The security uniform of NanoTrasen's security. It looks sturdy and well padded" icon_state = "navyutility_sec" worn_state = "navyutility_sec" - armor = list(melee = 10, bullet = 10, laser = 10,energy = 10, bomb = 10, bio = 10, rad = 10) + armor = list(melee = 10, bullet = 5, laser = 5, energy = 5, bomb = 5, bio = 0, rad = 0) /obj/item/clothing/under/nanotrasen/security/warden name = "NanoTrasen warden uniform" @@ -37,7 +37,7 @@ slot_l_hand_str = "darkbluesoft", slot_r_hand_str = "darkbluesoft", ) - armor = list(melee = 10, bullet = 5, laser = 5,energy = 5, bomb = 5, bio = 5, rad = 0) + armor = list(melee = 10, bullet = 5, laser = 5, energy = 5, bomb = 5, bio = 0, rad = 0) /obj/item/clothing/head/beret/nanotrasen name = "NanoTrasen security beret" diff --git a/code/modules/clothing/under/shorts.dm b/code/modules/clothing/under/shorts.dm index 4ac2ad5f2e3..26a00a4a636 100644 --- a/code/modules/clothing/under/shorts.dm +++ b/code/modules/clothing/under/shorts.dm @@ -130,6 +130,12 @@ desc = "A piece of cloth wrapped around the waist." icon_state = "loincloth" +/obj/item/clothing/under/skirt/pleated + name = "pleated skirt" + desc = "A simple pleated skirt. It's like high school all over again." + icon_state = "pleated" + addblends = "pleated_a" + /obj/item/clothing/under/skirt/outfit name = "black skirt" desc = "A black skirt, very fancy!" diff --git a/code/modules/clothing/under/solgov.dm b/code/modules/clothing/under/solgov.dm index 39109c480aa..0859cdf1e4a 100644 --- a/code/modules/clothing/under/solgov.dm +++ b/code/modules/clothing/under/solgov.dm @@ -1,7 +1,18 @@ //SolGov Uniforms +//Master +/obj/item/clothing/under/solgov + name = "master solgov uniform" + desc = "You shouldn't be seeing this." + icon = 'icons/obj/clothing/uniforms_solgov.dmi' + rolled_down = 0 + rolled_sleeves = 0 + item_icons = list(slot_w_uniform_str = 'icons/mob/uniform_solgov.dmi') + armor = list(melee = 5, bullet = 0, laser = 5, energy = 5, bomb = 0, bio = 5, rad = 5) + siemens_coefficient = 0.8 + //PT -/obj/item/clothing/under/pt +/obj/item/clothing/under/solgov/pt name = "pt uniform" desc = "Shorts! Shirt! Miami! Sexy!" icon_state = "miami" @@ -10,19 +21,19 @@ siemens_coefficient = 0.9 body_parts_covered = UPPER_TORSO|LOWER_TORSO -/obj/item/clothing/under/pt/sifguard +/obj/item/clothing/under/solgov/pt/sifguard name = "\improper SifGuard pt uniform" desc = "A baggy shirt bearing the seal of the Sif Defense Force and some dorky looking blue shorts." icon_state = "expeditionpt" worn_state = "expeditionpt" -/obj/item/clothing/under/pt/fleet +/obj/item/clothing/under/solgov/pt/fleet name = "fleet pt uniform" desc = "A pair of black shorts and two tank tops, seems impractical. Looks good though." icon_state = "fleetpt" worn_state = "fleetpt" -/obj/item/clothing/under/pt/marine +/obj/item/clothing/under/solgov/pt/marine name = "marine pt uniform" desc = "Does NOT leave much to the imagination." icon_state = "marinept" @@ -53,63 +64,62 @@ worn_state = "greyutility" //Here's the real ones -/obj/item/clothing/under/utility/sifguard +/obj/item/clothing/under/solgov/utility/sifguard name = "\improper SifGuard uniform" desc = "The utility uniform of the Sif Defense Force, made from biohazard resistant material. This one has silver trim." icon_state = "blackutility_crew" worn_state = "blackutility_crew" armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 10) -/obj/item/clothing/under/utility/sifguard/medical - name = "\improper SifGuard medical uniform" - desc = "The utility uniform of the Sif Defense Force, made from biohazard resistant material. This one has silver trim and blue blazes." - icon_state = "blackutility_med" - worn_state = "blackutility_med" +/obj/item/clothing/under/solgov/utility/sifguard/command + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/command) -/obj/item/clothing/under/utility/sifguard/medical/command - name = "\improper SifGuard medical command uniform" - desc = "The utility uniform of the Sif Defense Force, made from biohazard resistant material. This one has gold trim and blue blazes." - icon_state = "blackutility_medcom" - worn_state = "blackutility_medcom" +/obj/item/clothing/under/solgov/utility/sifguard/engineering + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/engineering) -/obj/item/clothing/under/utility/sifguard/engineering - name = "\improper SifGuard engineering uniform" - desc = "The utility uniform of the Sif Defense Force, made from biohazard resistant material. This one has silver trim and organge blazes." - icon_state = "blackutility_eng" - worn_state = "blackutility_eng" +/obj/item/clothing/under/solgov/utility/sifguard/security + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/security) -/obj/item/clothing/under/utility/sifguard/engineering/command - name = "\improper SifGuard engineering command uniform" - desc = "The utility uniform of the Sif Defense Force, made from biohazard resistant material. This one has gold trim and organge blazes." - icon_state = "blackutility_engcom" - worn_state = "blackutility_engcom" +/obj/item/clothing/under/solgov/utility/sifguard/medical + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/medical) -/obj/item/clothing/under/utility/sifguard/supply - name = "\improper SifGuard supply uniform" - desc = "The utility uniform of the Sif Defense Force, made from biohazard resistant material. This one has silver trim and brown blazes." - icon_state = "blackutility_sup" - worn_state = "blackutility_sup" +/obj/item/clothing/under/solgov/utility/sifguard/supply + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/supply) -/obj/item/clothing/under/utility/sifguard/security - name = "\improper SifGuard security uniform" - desc = "The utility uniform of the Sif Defense Force, made from biohazard resistant material. This one has silver trim and red blazes." - icon_state = "blackutility_sec" - worn_state = "blackutility_sec" +/obj/item/clothing/under/solgov/utility/sifguard/exploration + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/exploration) -/obj/item/clothing/under/utility/sifguard/security/command - name = "\improper SifGuard security command uniform" - desc = "The utility uniform of the Sif Defense Force, made from biohazard resistant material. This one has gold trim and red blazes." - icon_state = "blackutility_seccom" - worn_state = "blackutility_seccom" +/obj/item/clothing/under/solgov/utility/sifguard/research + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/research) -/obj/item/clothing/under/utility/sifguard/command - name = "\improper SifGuard command uniform" - desc = "The utility uniform of the Sif Defense Force, made from biohazard resistant material. This one has gold trim and gold blazes." +/obj/item/clothing/under/solgov/utility/sifguard/officer + name = "\improper Sifuard officer's uniform" + desc = "The utility uniform of the Sif Defense Force, made from biohazard resistant material. This one has gold trim." icon_state = "blackutility_com" worn_state = "blackutility_com" +/obj/item/clothing/under/solgov/utility/sifguard/officer/command + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/command) -/obj/item/clothing/under/utility/fleet +/obj/item/clothing/under/solgov/utility/sifguard/officer/engineering + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/engineering) + +/obj/item/clothing/under/solgov/utility/sifguard/officer/security + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/security) + +/obj/item/clothing/under/solgov/utility/sifguard/officer/medical + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/medical) + +/obj/item/clothing/under/solgov/utility/sifguard/officer/supply + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/supply) + +/obj/item/clothing/under/solgov/utility/sifguard/officer/exploration + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/exploration) + +/obj/item/clothing/under/solgov/utility/sifguard/officer/research + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/research) + +/obj/item/clothing/under/solgov/utility/fleet name = "fleet coveralls" desc = "The utility uniform of the SCG Fleet, made from an insulated material." icon_state = "navyutility" @@ -117,116 +127,96 @@ armor = list(melee = 0, bullet = 0, laser = 0,energy = 10, bomb = 0, bio = 0, rad = 0) siemens_coefficient = 0.7 -/obj/item/clothing/under/utility/fleet/medical - name = "fleet medical coveralls" - desc = "The utility uniform of the SCG Fleet, made from an insulated material. This one has blue cuffs." - icon_state = "navyutility_med" - worn_state = "navyutility_med" +/obj/item/clothing/under/solgov/utility/fleet/command + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/command/fleet) -/obj/item/clothing/under/utility/fleet/engineering - name = "fleet engineering coveralls" - desc = "The utility uniform of the SCG Fleet, made from an insulated material. This one has orange cuffs." - icon_state = "navyutility_eng" - worn_state = "navyutility_eng" +/obj/item/clothing/under/solgov/utility/fleet/command/pilot + starting_accessories = list(/obj/item/clothing/accessory/solgov/specialty/pilot) -/obj/item/clothing/under/utility/fleet/supply - name = "fleet supply coveralls" - desc = "The utility uniform of the SCG Fleet, made from an insulated material. This one has brown cuffs." - icon_state = "navyutility_sup" - worn_state = "navyutility_sup" +/obj/item/clothing/under/solgov/utility/fleet/engineering + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/engineering/fleet) -/obj/item/clothing/under/utility/fleet/security - name = "fleet security coveralls" - desc = "The utility uniform of the SCG Fleet, made from an insulated material. This one has red cuffs." - icon_state = "navyutility_sec" - worn_state = "navyutility_sec" +/obj/item/clothing/under/solgov/utility/fleet/security + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/security/fleet) -/obj/item/clothing/under/utility/fleet/command - name = "fleet command coveralls" - desc = "The utility uniform of the SCG Fleet, made from an insulated material. This one has gold cuffs." - icon_state = "navyutility_com" - worn_state = "navyutility_com" +/obj/item/clothing/under/solgov/utility/fleet/medical + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/medical/fleet) + +/obj/item/clothing/under/solgov/utility/fleet/supply + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/supply/fleet) + +/obj/item/clothing/under/solgov/utility/fleet/exploration + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/exploration/fleet) -/obj/item/clothing/under/utility/marine +/obj/item/clothing/under/solgov/utility/marine name = "marine fatigues" desc = "The utility uniform of the SCG Marine Corps, made from durable material." icon_state = "greyutility" worn_state = "greyutility" armor = list(melee = 10, bullet = 0, laser = 10,energy = 0, bomb = 0, bio = 0, rad = 0) -/obj/item/clothing/under/utility/marine/green +/obj/item/clothing/under/solgov/utility/marine/command + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/command/marine) + +/obj/item/clothing/under/solgov/utility/marine/engineering + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/engineering/marine) + +/obj/item/clothing/under/solgov/utility/marine/security + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/security/marine) + +/obj/item/clothing/under/solgov/utility/marine/medical + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/medical/marine) + +/obj/item/clothing/under/solgov/utility/marine/supply + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/supply/marine) + +/obj/item/clothing/under/solgov/utility/marine/exploration + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/exploration/marine) + +/obj/item/clothing/under/solgov/utility/marine/green name = "green fatigues" desc = "A green version of the SCG marine utility uniform, made from durable material." icon_state = "greenutility" worn_state = "greenutility" -/obj/item/clothing/under/utility/marine/tan +/obj/item/clothing/under/solgov/utility/marine/tan name = "tan fatigues" desc = "A tan version of the SCG marine utility uniform, made from durable material." icon_state = "tanutility" worn_state = "tanutility" -/obj/item/clothing/under/utility/marine/medical - name = "marine medical fatigues" - desc = "The utility uniform of the SCG Marine Corps, made from durable material. This one has blue markings." - icon_state = "greyutility_med" - worn_state = "greyutility_med" - -/obj/item/clothing/under/utility/marine/engineering - name = "marine engineering fatigues" - desc = "The utility uniform of the SCG Marine Corps, made from durable material. This one has orange markings." - icon_state = "greyutility_eng" - worn_state = "greyutility_eng" - -/obj/item/clothing/under/utility/marine/supply - name = "marine supply fatigues" - desc = "The utility uniform of the SCG Marine Corps, made from durable material. This one has brown markings." - icon_state = "greyutility_sup" - worn_state = "greyutility_sup" - -/obj/item/clothing/under/utility/marine/security - name = "marine security fatigues" - desc = "The utility uniform of the SCG Marine Corps, made from durable material. This one has red markings." - icon_state = "greyutility_sec" - worn_state = "greyutility_sec" - -/obj/item/clothing/under/utility/marine/command - name = "marine command coveralls" - desc = "The utility uniform of the SCG Marine Corps, made from durable material. This one has gold markings." - icon_state = "greyutility_com" - worn_state = "greyutility_com" - //Service -/obj/item/clothing/under/service +/obj/item/clothing/under/solgov/service name = "service uniform" desc = "A service uniform of some kind." icon_state = "whiteservice" worn_state = "whiteservice" - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + armor = list(melee = 5, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 5, rad = 0) siemens_coefficient = 0.9 -/obj/item/clothing/under/service/fleet +/obj/item/clothing/under/solgov/service/fleet name = "fleet service uniform" desc = "The service uniform of the SCG Fleet, made from immaculate white fabric." icon_state = "whiteservice" worn_state = "whiteservice" -/obj/item/clothing/under/service/marine +/obj/item/clothing/under/solgov/service/marine name = "marine service uniform" desc = "The service uniform of the SCG Marine Corps. Slimming." icon_state = "greenservice" worn_state = "greenservice" -/obj/item/clothing/under/service/marine/command +/obj/item/clothing/under/solgov/service/marine/command name = "marine command service uniform" desc = "The service uniform of the SCG Marine Corps. Slimming and stylish." icon_state = "greenservice_com" worn_state = "greenservice_com" //Dress -/obj/item/clothing/under/mildress + +/obj/item/clothing/under/solgov/mildress name = "dress uniform" desc = "A dress uniform of some kind." icon_state = "greydress" @@ -234,25 +224,71 @@ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) siemens_coefficient = 0.9 -/obj/item/clothing/under/mildress/sifguard +/obj/item/clothing/under/solgov/mildress/sifguard name = "\improper SifGuard dress uniform" desc = "The dress uniform of the Sif Defense Force in silver trim." - icon_state = "greydress" - worn_state = "greydress" -/obj/item/clothing/under/mildress/sifguard/command +/obj/item/clothing/under/solgov/mildress/sifguard/command + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/command/service) + +/obj/item/clothing/under/solgov/mildress/sifguard/engineering + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/engineering/service) + +/obj/item/clothing/under/solgov/mildress/sifguard/security + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/security/service) + +/obj/item/clothing/under/solgov/mildress/sifguard/medical + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/medical/service) + +/obj/item/clothing/under/solgov/mildress/sifguard/supply + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/supply/service) + +/obj/item/clothing/under/solgov/mildress/sifguard/service + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/service/service) + +/obj/item/clothing/under/solgov/mildress/sifguard/exploration + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/exploration/service) + +/obj/item/clothing/under/solgov/mildress/sifguard/research + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/research/service) + +/obj/item/clothing/under/solgov/mildress/sifguard/officer name = "\improper SifGuard command dress uniform" desc = "The dress uniform of the Sif Defense Force in gold trim." icon_state = "greydress_com" worn_state = "greydress_com" -/obj/item/clothing/under/mildress/marine +/obj/item/clothing/under/solgov/mildress/sifguard/officer/command + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/command/service) + +/obj/item/clothing/under/solgov/mildress/sifguard/officer/engineering + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/engineering/service) + +/obj/item/clothing/under/solgov/mildress/sifguard/officer/security + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/security/service) + +/obj/item/clothing/under/solgov/mildress/sifguard/officer/medical + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/medical/service) + +/obj/item/clothing/under/solgov/mildress/sifguard/officer/supply + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/supply/service) + +/obj/item/clothing/under/solgov/mildress/sifguard/officer/service + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/service/service) + +/obj/item/clothing/under/solgov/mildress/sifguard/officer/exploration + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/exploration/service) + +/obj/item/clothing/under/solgov/mildress/sifguard/officer/research + starting_accessories = list(/obj/item/clothing/accessory/solgov/department/research/service) + +/obj/item/clothing/under/solgov/mildress/marine name = "marine dress uniform" desc = "The dress uniform of the SCG Marine Corps, class given form." icon_state = "blackdress" worn_state = "blackdress" -/obj/item/clothing/under/mildress/marine/command +/obj/item/clothing/under/solgov/mildress/marine/command name = "marine command dress uniform" desc = "The dress uniform of the SCG Marine Corps, even classier in gold." icon_state = "blackdress_com" diff --git a/code/modules/clothing/under/solgov_vr.dm b/code/modules/clothing/under/solgov_vr.dm index d08d91f0cce..eb6e7936854 100644 --- a/code/modules/clothing/under/solgov_vr.dm +++ b/code/modules/clothing/under/solgov_vr.dm @@ -1,15 +1,15 @@ //SolGov Uniforms //PT -/obj/item/clothing/under/pt/sifguard +/obj/item/clothing/under/solgov/pt/sifguard name = "explorer's pt uniform" desc = "A baggy shirt bearing the seal of the Society of Universal Cartographers and some dorky looking blue shorts." -/obj/item/clothing/under/pt/fleet +/obj/item/clothing/under/solgov/pt/fleet name = "fleet pt uniform" desc = "A pair of black shorts and two tank tops, seems impractical. Looks good though." -/obj/item/clothing/under/pt/marine +/obj/item/clothing/under/solgov/pt/marine name = "marine pt uniform" desc = "Does NOT leave much to the imagination." @@ -20,81 +20,32 @@ name = "utility uniform" desc = "A comfortable turtleneck and black utility trousers." -/obj/item/clothing/under/utility/sifguard +/obj/item/clothing/under/solgov/utility/sifguard name = "explorer's uniform" desc = "The utility uniform of the Society of Universal Cartographers, made from biohazard resistant material. This one has silver trim." -/obj/item/clothing/under/utility/sifguard/medical - name = "explorer's medical uniform" - desc = "The utility uniform of the Society of Universal Cartographers, made from biohazard resistant material. This one has silver trim and blue blazes." - -/obj/item/clothing/under/utility/sifguard/medical/command - name = "explorer's medical command uniform" - desc = "The utility uniform of the Society of Universal Cartographers, made from biohazard resistant material. This one has gold trim and blue blazes." - -/obj/item/clothing/under/utility/sifguard/engineering - name = "explorer's engineering uniform" - desc = "The utility uniform of the Society of Universal Cartographers, made from biohazard resistant material. This one has silver trim and organge blazes." - -/obj/item/clothing/under/utility/sifguard/engineering/command - name = "explorer's engineering command uniform" - desc = "The utility uniform of the Society of Universal Cartographers, made from biohazard resistant material. This one has gold trim and organge blazes." - -/obj/item/clothing/under/utility/sifguard/supply - name = "explorer's supply uniform" - desc = "The utility uniform of the Society of Universal Cartographers, made from biohazard resistant material. This one has silver trim and brown blazes." - -/obj/item/clothing/under/utility/sifguard/security - name = "explorer's security uniform" - desc = "The utility uniform of the Society of Universal Cartographers, made from biohazard resistant material. This one has silver trim and red blazes." - -/obj/item/clothing/under/utility/sifguard/security/command - name = "explorer's security command uniform" - desc = "The utility uniform of the Society of Universal Cartographers, made from biohazard resistant material. This one has gold trim and red blazes." - -/obj/item/clothing/under/utility/sifguard/command - name = "explorer's command uniform" - desc = "The utility uniform of the Society of Universal Cartographers, made from biohazard resistant material. This one has gold trim and gold blazes." +/obj/item/clothing/under/solgov/utility/sifguard/officer + name = "explorer's officer uniform" + desc = "The utility uniform of the Society of Universal Cartographers, made from biohazard resistant material. This one has gold trim." -/obj/item/clothing/under/utility/fleet +/obj/item/clothing/under/solgov/utility/fleet name = "fleet coveralls" desc = "The utility uniform of the USDF Fleet, made from an insulated material." -/obj/item/clothing/under/utility/fleet/medical - name = "fleet medical coveralls" - desc = "The utility uniform of the USDF Fleet, made from an insulated material. This one has blue cuffs." - -/obj/item/clothing/under/utility/fleet/engineering - name = "fleet engineering coveralls" - desc = "The utility uniform of the USDF Fleet, made from an insulated material. This one has orange cuffs." - -/obj/item/clothing/under/utility/fleet/supply - name = "fleet supply coveralls" - desc = "The utility uniform of the USDF Fleet, made from an insulated material. This one has brown cuffs." - -/obj/item/clothing/under/utility/fleet/security - name = "fleet security coveralls" - desc = "The utility uniform of the USDF Fleet, made from an insulated material. This one has red cuffs." - -/obj/item/clothing/under/utility/fleet/command - name = "fleet command coveralls" - desc = "The utility uniform of the USDF Fleet, made from an insulated material. This one has gold cuffs." - - -/obj/item/clothing/under/utility/marine +/obj/item/clothing/under/solgov/utility/marine name = "marine fatigues" desc = "The utility uniform of the USDF Marine Corps, made from durable material." -/obj/item/clothing/under/utility/marine/green +/obj/item/clothing/under/solgov/utility/marine/green name = "green fatigues" desc = "A green version of the USDF marine utility uniform, made from durable material." -/obj/item/clothing/under/utility/marine/tan +/obj/item/clothing/under/solgov/utility/marine/tan name = "tan fatigues" desc = "A tan version of the USDF marine utility uniform, made from durable material." -/obj/item/clothing/under/utility/marine/olive +/obj/item/clothing/under/solgov/utility/marine/olive name = "olive fatigues" desc = "An olive version of the USDF marine utility uniform, made from durable material." icon = 'icons/obj/clothing/uniforms_vr.dmi' @@ -102,7 +53,7 @@ icon_state = "bdu_olive" item_state = "bdu_olive" -/obj/item/clothing/under/utility/marine/desert +/obj/item/clothing/under/solgov/utility/marine/desert name = "desert fatigues" desc = "A desert version of the USDF marine utility uniform, made from durable material." icon = 'icons/obj/clothing/uniforms_vr.dmi' @@ -110,53 +61,33 @@ icon_state = "bdu_olive" item_state = "bdu_olive" -/obj/item/clothing/under/utility/marine/medical - name = "marine medical fatigues" - desc = "The utility uniform of the USDF Marine Corps, made from durable material. This one has blue markings." - -/obj/item/clothing/under/utility/marine/engineering - name = "marine engineering fatigues" - desc = "The utility uniform of the USDF Marine Corps, made from durable material. This one has orange markings." - -/obj/item/clothing/under/utility/marine/supply - name = "marine supply fatigues" - desc = "The utility uniform of the USDF Marine Corps, made from durable material. This one has brown markings." - -/obj/item/clothing/under/utility/marine/security - name = "marine security fatigues" - desc = "The utility uniform of the USDF Marine Corps, made from durable material. This one has red markings." - -/obj/item/clothing/under/utility/marine/command - name = "marine command coveralls" - desc = "The utility uniform of the USDF Marine Corps, made from durable material. This one has gold markings." - //Service -/obj/item/clothing/under/service/fleet +/obj/item/clothing/under/solgov/service/fleet name = "fleet service uniform" desc = "The service uniform of the USDF Fleet, made from immaculate white fabric." -/obj/item/clothing/under/service/marine +/obj/item/clothing/under/solgov/service/marine name = "marine service uniform" desc = "The service uniform of the USDF Marine Corps. Slimming." worn_state = "greenservice" -/obj/item/clothing/under/service/marine/command +/obj/item/clothing/under/solgov/service/marine/command name = "marine command service uniform" desc = "The service uniform of the USDF Marine Corps. Slimming and stylish." -/obj/item/clothing/under/mildress/expeditionary +/obj/item/clothing/under/solgov/mildress/expeditionary name = "explorer's dress uniform" desc = "The dress uniform of the Society of Universal Cartographers in silver trim." -/obj/item/clothing/under/mildress/expeditionary/command +/obj/item/clothing/under/solgov/mildress/expeditionary/command name = "explorer's command dress uniform" desc = "The dress uniform of the Society of Universal Cartographers in gold trim." -/obj/item/clothing/under/mildress/marine +/obj/item/clothing/under/solgov/mildress/marine name = "marine dress uniform" desc = "The dress uniform of the USDF Marine Corps, class given form." -/obj/item/clothing/under/mildress/marine/command +/obj/item/clothing/under/solgov/mildress/marine/command name = "marine command dress uniform" desc = "The dress uniform of the USDF Marine Corps, even classier in gold." \ No newline at end of file diff --git a/code/modules/events/ion_storm.dm b/code/modules/events/ion_storm.dm index 0bf0f82aa64..c50b44dc261 100644 --- a/code/modules/events/ion_storm.dm +++ b/code/modules/events/ion_storm.dm @@ -14,8 +14,8 @@ for (var/mob/living/silicon/ai/target in silicon_mob_list) var/law = target.generate_ion_law() - target << "You have detected a change in your laws information:" - target << law + to_chat(target, "You have detected a change in your laws information:") + to_chat(target, law) target.add_ion_law(law) target.show_laws() /* //VOREstation edit. Was fucking up all PDA messagess. diff --git a/code/modules/events/money_spam.dm b/code/modules/events/money_spam.dm index 3343a03c44f..ced7c9a45f6 100644 --- a/code/modules/events/money_spam.dm +++ b/code/modules/events/money_spam.dm @@ -101,11 +101,13 @@ last_spam_time = world.time + /* //VOREStation Removal: no need to spam the AI tenfold if (prob(50)) //Give the AI an increased chance to intercept the message for(var/mob/living/silicon/ai/ai in mob_list) // Allows other AIs to intercept the message but the AI won't intercept their own message. if(ai.aiPDA != P && ai.aiPDA != src) ai.show_message("Intercepted message from [sender] (Unknown / spam?) to [P:owner]: [message]") + */ //Commented out because we don't send messages like this anymore. Instead it will just popup in their chat window. //P.tnote += "← From [sender] (Unknown / spam?):
      [message]
      " diff --git a/code/modules/events/radiation_storm.dm b/code/modules/events/radiation_storm.dm index 6140ae2de0c..13f853dd3c2 100644 --- a/code/modules/events/radiation_storm.dm +++ b/code/modules/events/radiation_storm.dm @@ -31,7 +31,7 @@ /datum/event/radiation_storm/proc/radiate() var/radiation_level = rand(15, 35) for(var/z in using_map.station_levels) - radiation_repository.z_radiate(locate(1, 1, z), radiation_level, 1) + SSradiation.z_radiate(locate(1, 1, z), radiation_level, 1) for(var/mob/living/carbon/C in living_mob_list) var/area/A = get_area(C) diff --git a/code/modules/fishing/fishing_rod.dm b/code/modules/fishing/fishing_rod.dm index 6cb8c267fb8..be7a6f6e794 100644 --- a/code/modules/fishing/fishing_rod.dm +++ b/code/modules/fishing/fishing_rod.dm @@ -11,8 +11,8 @@ description_antag = "Some fishing rods can be utilized as long-range, sharp weapons, though their pseudo ranged ability comes at the cost of slow speed." icon_state = "fishing_rod" item_state = "fishing_rod" - force_divisor = 0.25 - throwforce = 7 + force_divisor = 0.02 //VOREStation Edit + throwforce = 1 //VOREStation Edit sharp = TRUE attack_verb = list("whipped", "battered", "slapped", "fished", "hooked") hitsound = 'sound/weapons/punchmiss.ogg' diff --git a/code/modules/fishing/fishing_vr.dm b/code/modules/fishing/fishing_vr.dm new file mode 100644 index 00000000000..e545cc0edfb --- /dev/null +++ b/code/modules/fishing/fishing_vr.dm @@ -0,0 +1,42 @@ +#define FISHING_RARE "rare" +#define FISHING_UNCOMMON "uncommon" +#define FISHING_COMMON "common" +#define FISHING_JUNK "junk" +#define FISHING_NOTHING "nothing" + +GLOBAL_LIST_INIT(indoor_fishing_chance_list, list(FISHING_RARE = 5, FISHING_UNCOMMON = 20, FISHING_COMMON = 30, FISHING_JUNK = 5, FISHING_NOTHING = 50)) +GLOBAL_LIST_INIT(indoor_fishing_junk_list, list( + /obj/random/junk = 15, + /obj/random/maintenance/clean = 1 + )) + +/turf/simulated/floor/water/indoors + min_fishing_time = 33 + max_fishing_time = 99 + +/turf/simulated/floor/water/indoors/handle_fish() + if(has_fish) + rare_fish_list = GLOB.generic_fishing_rare_list + uncommon_fish_list = GLOB.generic_fishing_uncommon_list + common_fish_list = GLOB.generic_fishing_common_list + junk_list = GLOB.indoor_fishing_junk_list + fishing_loot = GLOB.indoor_fishing_chance_list + +/turf/simulated/floor/water/deep/indoors + min_fishing_time = 33 + max_fishing_time = 99 + +/turf/simulated/floor/water/deep/indoors/handle_fish() + if(has_fish) + rare_fish_list = GLOB.generic_fishing_rare_list + uncommon_fish_list = GLOB.generic_fishing_uncommon_list + common_fish_list = GLOB.generic_fishing_common_list + junk_list = GLOB.indoor_fishing_junk_list + fishing_loot = GLOB.indoor_fishing_chance_list + + +#undef FISHING_RARE +#undef FISHING_UNCOMMON +#undef FISHING_COMMON +#undef FISHING_JUNK +#undef FISHING_NOTHING \ No newline at end of file diff --git a/code/modules/food/drinkingglass/metaglass.dm b/code/modules/food/drinkingglass/metaglass.dm index 0b64df0af94..1980c588734 100644 --- a/code/modules/food/drinkingglass/metaglass.dm +++ b/code/modules/food/drinkingglass/metaglass.dm @@ -312,7 +312,7 @@ Drinks Data glass_icon_state = "atomicbombglass" glass_center_of_mass = list("x"=15, "y"=7) -/datum/reagent/ethanol/b52 +/datum/reagent/ethanol/coffee/b52 glass_icon_state = "b52glass" /datum/reagent/ethanol/bahama_mama diff --git a/code/modules/food/food/condiment.dm b/code/modules/food/food/condiment.dm index a6625ccf306..522f79b89b7 100644 --- a/code/modules/food/food/condiment.dm +++ b/code/modules/food/food/condiment.dm @@ -182,6 +182,198 @@ . = ..() reagents.add_reagent("sugar", 20) +//MRE condiments and drinks. + +/obj/item/weapon/reagent_containers/food/condiment/small/packet + icon_state = "packet_small" + w_class = ITEMSIZE_TINY + possible_transfer_amounts = "1;5;10" + amount_per_transfer_from_this = 1 + volume = 5 + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/salt + name = "salt packet" + desc = "Contains 5u of table salt." + icon_state = "packet_small_white" + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/salt/Initialize() + . = ..() + reagents.add_reagent("sodiumchloride", 5) + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/pepper + name = "pepper packet" + desc = "Contains 5u of black pepper." + icon_state = "packet_small_black" + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/pepper/Initialize() + . = ..() + reagents.add_reagent("blackpepper", 5) + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/sugar + name = "sugar packet" + desc = "Contains 5u of refined sugar." + icon_state = "packet_small_white" + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/sugar/Initialize() + . = ..() + reagents.add_reagent("sugar", 5) + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/jelly + name = "jelly packet" + desc = "Contains 10u of cherry jelly. Best used for spreading on crackers." + icon_state = "packet_medium" + volume = 10 + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/jelly/Initialize() + . = ..() + reagents.add_reagent("cherryjelly", 10) + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/honey + name = "honey packet" + desc = "Contains 10u of honey." + icon_state = "packet_medium" + volume = 10 + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/honey/Initialize() + . = ..() + reagents.add_reagent("honey", 10) + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/capsaicin + name = "hot sauce packet" + desc = "Contains 5u of hot sauce. Enjoy in moderation." + icon_state = "packet_small_red" + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/capsaicin/Initialize() + . = ..() + reagents.add_reagent("capsaicin", 5) + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/ketchup + name = "ketchup packet" + desc = "Contains 5u of ketchup." + icon_state = "packet_small_red" + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/ketchup/Initialize() + . = ..() + reagents.add_reagent("ketchup", 5) + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/mayo + name = "mayonnaise packet" + desc = "Contains 5u of mayonnaise." + icon_state = "packet_small_white" + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/mayo/Initialize() + . = ..() + reagents.add_reagent("mayo", 5) + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/soy + name = "soy sauce packet" + desc = "Contains 5u of soy sauce." + icon_state = "packet_small_black" + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/soy/Initialize() + . = ..() + reagents.add_reagent("soysauce", 5) + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/coffee + name = "coffee powder packet" + desc = "Contains 5u of coffee powder. Mix with 25u of water and heat." + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/coffee/Initialize() + . = ..() + reagents.add_reagent("coffeepowder", 5) + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/tea + name = "tea powder packet" + desc = "Contains 5u of black tea powder. Mix with 25u of water and heat." + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/tea/Initialize() + . = ..() + reagents.add_reagent("tea", 5) + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/cocoa + name = "cocoa powder packet" + desc = "Contains 5u of cocoa powder. Mix with 25u of water and heat." + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/cocoa/Initialize() + . = ..() + reagents.add_reagent("coco", 5) + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/grape + name = "grape juice powder packet" + desc = "Contains 5u of powdered grape juice. Mix with 15u of water." + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/grape/Initialize() + . = ..() + reagents.add_reagent("instantgrape", 5) + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/orange + name = "orange juice powder packet" + desc = "Contains 5u of powdered orange juice. Mix with 15u of water." + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/orange/Initialize() + . = ..() + reagents.add_reagent("instantorange", 5) + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/watermelon + name = "watermelon juice powder packet" + desc = "Contains 5u of powdered watermelon juice. Mix with 15u of water." + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/watermelon/Initialize() + . = ..() + reagents.add_reagent("instantwatermelon", 5) + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/apple + name = "apple juice powder packet" + desc = "Contains 5u of powdered apple juice. Mix with 15u of water." + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/apple/Initialize() + . = ..() + reagents.add_reagent("instantapple", 5) + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/protein + name = "protein powder packet" + desc = "Contains 10u of powdered protein. Mix with 20u of water." + icon_state = "packet_medium" + volume = 10 + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/protein/Initialize() + . = ..() + reagents.add_reagent("protein", 10) + +/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon + name = "crayon powder packet" + desc = "Contains 10u of powdered crayon. Mix with 30u of water." + volume = 10 +/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/generic/Initialize() + . = ..() + reagents.add_reagent("crayon_dust", 10) +/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/red/Initialize() + . = ..() + reagents.add_reagent("crayon_dust_red", 10) +/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/orange/Initialize() + . = ..() + reagents.add_reagent("crayon_dust_orange", 10) +/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/yellow/Initialize() + . = ..() + reagents.add_reagent("crayon_dust_yellow", 10) +/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/green/Initialize() + . = ..() + reagents.add_reagent("crayon_dust_green", 10) +/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/blue/Initialize() + . = ..() + reagents.add_reagent("crayon_dust_blue", 10) +/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/purple/Initialize() + . = ..() + reagents.add_reagent("crayon_dust_purple", 10) +/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/grey/Initialize() + . = ..() + reagents.add_reagent("crayon_dust_grey", 10) +/obj/item/weapon/reagent_containers/food/condiment/small/packet/crayon/brown/Initialize() + . = ..() + reagents.add_reagent("crayon_dust_brown", 10) + +//End of MRE stuff. + /obj/item/weapon/reagent_containers/food/condiment/flour name = "flour sack" desc = "A big bag of flour. Good for baking!" diff --git a/code/modules/food/food/drinks/bottle.dm b/code/modules/food/food/drinks/bottle.dm index 4888bc81248..0a56f946d53 100644 --- a/code/modules/food/food/drinks/bottle.dm +++ b/code/modules/food/food/drinks/bottle.dm @@ -178,6 +178,7 @@ throw_speed = 3 throw_range = 5 item_state = "beer" + flags = NOCONDUCT attack_verb = list("stabbed", "slashed", "attacked") sharp = 1 edge = 0 diff --git a/code/modules/food/food/snacks.dm b/code/modules/food/food/snacks.dm index e9d475bab1d..0906bf0c50c 100644 --- a/code/modules/food/food/snacks.dm +++ b/code/modules/food/food/snacks.dm @@ -21,12 +21,7 @@ /obj/item/weapon/reagent_containers/food/snacks/Initialize() . = ..() if(nutriment_amt) - reagents.add_reagent("nutriment",nutriment_amt,nutriment_desc) - -/obj/item/weapon/reagent_containers/food/snacks/Initialize() - . = ..() - if(nutriment_amt) - reagents.add_reagent("nutriment", nutriment_amt) + reagents.add_reagent("nutriment",(nutriment_amt*2),nutriment_desc) //Placeholder for effect that trigger on eating that aren't tied to reagents. /obj/item/weapon/reagent_containers/food/snacks/proc/On_Consume(var/mob/M) @@ -755,7 +750,6 @@ /obj/item/weapon/reagent_containers/food/snacks/fishfingers/Initialize() . = ..() reagents.add_reagent("protein", 4) - reagents.add_reagent("carpotoxin", 3) bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/zestfish @@ -989,7 +983,6 @@ /obj/item/weapon/reagent_containers/food/snacks/fishburger/Initialize() . = ..() reagents.add_reagent("protein", 6) - reagents.add_reagent("carpotoxin", 3) bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/tofuburger @@ -1328,7 +1321,6 @@ /obj/item/weapon/reagent_containers/food/snacks/cubancarp/Initialize() . = ..() reagents.add_reagent("protein", 3) - reagents.add_reagent("carpotoxin", 3) reagents.add_reagent("capsaicin", 3) bitesize = 3 @@ -1989,7 +1981,6 @@ /obj/item/weapon/reagent_containers/food/snacks/fishandchips/Initialize() . = ..() reagents.add_reagent("protein", 3) - reagents.add_reagent("carpotoxin", 3) bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/sandwich @@ -3092,6 +3083,7 @@ filling_color = "#F5DEB8" center_of_mass = list("x"=16, "y"=6) nutriment_desc = list("salt" = 1, "cracker" = 2) + w_class = ITEMSIZE_TINY nutriment_amt = 1 @@ -3742,6 +3734,33 @@ reagents.add_reagent("iron", 3) bitesize = 4 +/obj/item/weapon/reagent_containers/food/snacks/liquidprotein + name = "\improper LiquidProtein Ration" + desc = "A variant of the liquidfood ration, designed for obligate carnivore species. Only barely more appealing than regular liquidfood. Should this be crunchy?" + icon_state = "liquidprotein" + trash = /obj/item/trash/liquidprotein + filling_color = "#A8A8A8" + survivalfood = TRUE + center_of_mass = list("x"=16, "y"=15) + +/obj/item/weapon/reagent_containers/food/snacks/liquidprotein/Initialize() + ..() + reagents.add_reagent("protein", 30) + reagents.add_reagent("iron", 3) + bitesize = 4 + +/obj/item/weapon/reagent_containers/food/snacks/meatcube + name = "cubed meat" + desc = "Fried, salted lean meat compressed into a cube. Not very appetizing." + icon_state = "meatcube" + filling_color = "#7a3d11" + center_of_mass = list("x"=16, "y"=16) + +/obj/item/weapon/reagent_containers/food/snacks/meatcube/Initialize() + . = ..() + reagents.add_reagent("protein", 15) + bitesize = 3 + /obj/item/weapon/reagent_containers/food/snacks/tastybread name = "bread tube" desc = "Bread in a tube. Chewy...and surprisingly tasty." @@ -3809,7 +3828,7 @@ /obj/item/weapon/reagent_containers/food/snacks/sashimi name = "carp sashimi" - desc = "Expertly prepared. Still toxic." + desc = "Expertly prepared. Hopefully toxin got removed though." filling_color = "#FFDEFE" icon_state = "sashimi" nutriment_amt = 6 @@ -3817,7 +3836,6 @@ /obj/item/weapon/reagent_containers/food/snacks/sashimi/Initialize() . = ..() reagents.add_reagent("protein", 2) - reagents.add_reagent("carpotoxin", 2) bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/benedict @@ -4148,4 +4166,27 @@ /obj/item/weapon/reagent_containers/food/snacks/wormdeluxe/Initialize() . = ..() reagents.add_reagent("fishbait", 40) - bitesize = 5 \ No newline at end of file + bitesize = 5 + +/obj/item/weapon/reagent_containers/food/snacks/siffruit + name = "pulsing fruit" + desc = "A blue-ish sac encased in a tough black shell." + icon = 'icons/obj/flora/foraging.dmi' + icon_state = "siffruit" + nutriment_amt = 2 + nutriment_desc = list("tart" = 1) + w_class = ITEMSIZE_TINY + +/obj/item/weapon/reagent_containers/food/snacks/siffruit/Initialize() + . = ..() + reagents.add_reagent("sifsap", 2) + +/obj/item/weapon/reagent_containers/food/snacks/siffruit/afterattack(obj/O as obj, mob/user as mob, proximity) + if(istype(O,/obj/machinery/microwave)) + return ..() + if(!(proximity && O.is_open_container())) + return + to_chat(user, "You tear \the [src]'s sac open, pouring it into \the [O].") + reagents.trans_to(O, reagents.total_volume) + user.drop_from_inventory(src) + qdel(src) diff --git a/code/modules/food/food/snacks_vr.dm b/code/modules/food/food/snacks_vr.dm index f3284f307e6..a283a6bafe5 100644 --- a/code/modules/food/food/snacks_vr.dm +++ b/code/modules/food/food/snacks_vr.dm @@ -607,18 +607,3 @@ /obj/item/pizzabox/meat/Initialize() pizza = new /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/meatcargo(src) - -/obj/item/weapon/reagent_containers/food/snacks/liquidprotein - name = "\improper LiquidProtein Ration" - desc = "A variant of the liquidfood ration, designed for obligate carnivore species. Only barely more appealing than regular liquidfood. Should this be crunchy?" - icon = 'icons/obj/food_vr.dmi' - icon_state = "liquidprotein" - trash = /obj/item/trash/liquidprotein - filling_color = "#A8A8A8" - center_of_mass = list("x"=16, "y"=15) - -/obj/item/weapon/reagent_containers/food/snacks/liquidprotein/Initialize() - ..() - reagents.add_reagent("protein", 20) - reagents.add_reagent("iron", 3) - bitesize = 4 diff --git a/code/modules/food/recipes_microwave_vr.dm b/code/modules/food/recipes_microwave_vr.dm index bc375d0d70e..3cc33a96bec 100644 --- a/code/modules/food/recipes_microwave_vr.dm +++ b/code/modules/food/recipes_microwave_vr.dm @@ -29,9 +29,9 @@ fruit = list("cabbage" = 1) reagents = list("rice" = 20) items = list( - /obj/item/weapon/reagent_containers/food/snacks/meat, - /obj/item/weapon/reagent_containers/food/snacks/meat, - /obj/item/weapon/reagent_containers/food/snacks/meat + /obj/item/weapon/reagent_containers/food/snacks/carpmeat, + /obj/item/weapon/reagent_containers/food/snacks/carpmeat, + /obj/item/weapon/reagent_containers/food/snacks/carpmeat ) result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/sushi diff --git a/code/modules/gamemaster/actions/action.dm b/code/modules/gamemaster/actions/action.dm index aa259ccc033..f8ea16994ec 100644 --- a/code/modules/gamemaster/actions/action.dm +++ b/code/modules/gamemaster/actions/action.dm @@ -7,6 +7,7 @@ var/observers_used = FALSE // Determines if the GM should check if ghosts are available before using this. var/length = 0 // Determines how long the event lasts, until end() is called. var/datum/game_master/gm = null + var/severity = 1 // The severity of the action. This is here to prevent continued future defining of this var on actions, un-used. /datum/gm_action/proc/set_up() return diff --git a/code/modules/gamemaster/actions/atmos_leak.dm b/code/modules/gamemaster/actions/atmos_leak.dm index ab3947cb151..34772bf1a81 100644 --- a/code/modules/gamemaster/actions/atmos_leak.dm +++ b/code/modules/gamemaster/actions/atmos_leak.dm @@ -13,7 +13,7 @@ /area/engineering/engine_room ) - var/severity + severity // Decide which area will be targeted! /datum/gm_action/atmos_leak/set_up() diff --git a/code/modules/gamemaster/actions/blob.dm b/code/modules/gamemaster/actions/blob.dm index 058f678c67c..31a4518a690 100644 --- a/code/modules/gamemaster/actions/blob.dm +++ b/code/modules/gamemaster/actions/blob.dm @@ -3,13 +3,59 @@ departments = list(ROLE_ENGINEERING, ROLE_SECURITY, ROLE_MEDICAL) chaotic = 25 + var/list/area/excluded = list( + /area/submap, + /area/shuttle, + /area/crew_quarters, + /area/holodeck, + /area/engineering/engine_room + ) + + var/area/target_area // Chosen target area + var/turf/target_turf // Chosen target turf in target_area + var/obj/structure/blob/core/Blob + var/spawn_blob_type = /obj/structure/blob/core/random_medium + +/datum/gm_action/blob/set_up() + severity = pickweight(EVENT_LEVEL_MUNDANE = 4, + EVENT_LEVEL_MODERATE = 2, + EVENT_LEVEL_MAJOR = 1 + ) + + var/list/area/grand_list_of_areas = get_station_areas(excluded) + + for(var/i in 1 to 10) + var/area/A = pick(grand_list_of_areas) + if(is_area_occupied(A)) + log_debug("Blob infestation event: Rejected [A] because it is occupied.") + continue + var/list/turfs = list() + for(var/turf/simulated/floor/F in A) + if(turf_clear(F)) + turfs += F + if(turfs.len == 0) + log_debug("Blob infestation event: Rejected [A] because it has no clear turfs.") + continue + target_area = A + target_turf = pick(turfs) + + if(!target_area) + log_debug("Blob infestation event: Giving up after too many failures to pick target area") /datum/gm_action/blob/start() ..() - var/turf/T = pick(blobstart) + var/turf/T - Blob = new /obj/structure/blob/core/random_medium(T) + if(severity == EVENT_LEVEL_MUNDANE || !target_area || !target_turf) + T = pick(blobstart) + else if(severity == EVENT_LEVEL_MODERATE) + T = target_turf + else + T = target_turf + spawn_blob_type = /obj/structure/blob/core/random_hard + + Blob = new spawn_blob_type(T) /datum/gm_action/blob/announce() spawn(rand(600, 3000)) // 1-5 minute leeway for the blob to go un-detected. diff --git a/code/modules/gamemaster/actions/camera_damage.dm b/code/modules/gamemaster/actions/camera_damage.dm index e064c3cb1f1..583e57096b8 100644 --- a/code/modules/gamemaster/actions/camera_damage.dm +++ b/code/modules/gamemaster/actions/camera_damage.dm @@ -10,7 +10,7 @@ ..() var/severity_range = 0 - var/severity = pickweight(EVENT_LEVEL_MUNDANE = 10, + severity = pickweight(EVENT_LEVEL_MUNDANE = 10, EVENT_LEVEL_MODERATE = 5, EVENT_LEVEL_MAJOR = 1 ) diff --git a/code/modules/gamemaster/actions/carp_migration.dm b/code/modules/gamemaster/actions/carp_migration.dm index b635ca6d5e8..eabb2ce79a6 100644 --- a/code/modules/gamemaster/actions/carp_migration.dm +++ b/code/modules/gamemaster/actions/carp_migration.dm @@ -8,14 +8,7 @@ length = 20 MINUTES /datum/gm_action/carp_migration/get_weight() - var/people_in_space = 0 - for(var/mob/living/L in player_list) - if(!(L.z in using_map.station_levels)) - continue // Not on the right z-level. - var/turf/T = get_turf(L) - if(istype(T, /turf/space) && istype(T.loc,/area/space)) - people_in_space++ - return 50 + (metric.count_people_in_department(ROLE_SECURITY) * 10) + (people_in_space * 20) + return 50 + (metric.count_people_in_department(ROLE_SECURITY) * 10) + (metric.count_all_space_mobs() * 20) /datum/gm_action/carp_migration/announce() var/announcement = "Unknown biological entities have been detected near [station_name()], please stand-by." diff --git a/code/modules/gamemaster/actions/electrified_door.dm b/code/modules/gamemaster/actions/electrified_door.dm index d5365d50aac..e11c72f3456 100644 --- a/code/modules/gamemaster/actions/electrified_door.dm +++ b/code/modules/gamemaster/actions/electrified_door.dm @@ -9,7 +9,6 @@ /area/shuttle, /area/crew_quarters ) - var/severity /datum/gm_action/electrified_door/set_up() var/list/area/grand_list_of_areas = get_station_areas(excluded) diff --git a/code/modules/gamemaster/actions/money_spam.dm b/code/modules/gamemaster/actions/money_spam.dm index 75f572e1f25..e11baec0908 100644 --- a/code/modules/gamemaster/actions/money_spam.dm +++ b/code/modules/gamemaster/actions/money_spam.dm @@ -101,11 +101,13 @@ last_spam_time = world.time + /* //VOREStation Removal: no need to spam the AI tenfold if (prob(50)) //Give the AI an increased chance to intercept the message for(var/mob/living/silicon/ai/ai in mob_list) // Allows other AIs to intercept the message but the AI won't intercept their own message. if(ai.aiPDA != P && ai.aiPDA != src) ai.show_message("Intercepted message from [sender] (Unknown / spam?) to [P:owner]: [message]") + */ //Commented out because we don't send messages like this anymore. Instead it will just popup in their chat window. //P.tnote += "← From [sender] (Unknown / spam?):
      [message]
      " diff --git a/code/modules/gamemaster/actions/planet_weather_change.dm b/code/modules/gamemaster/actions/planet_weather_change.dm index e0f2e754e99..27583a9a6a2 100644 --- a/code/modules/gamemaster/actions/planet_weather_change.dm +++ b/code/modules/gamemaster/actions/planet_weather_change.dm @@ -5,7 +5,13 @@ reusable = TRUE var/datum/planet/target_planet - var/list/banned_weathers = list() //VOREStation Temp Edit + var/list/banned_weathers = list( + //VOREStation Edit - Virgo 3B Weather, + /datum/weather/virgo3b/ash_storm, + /datum/weather/virgo3b/emberfall, + /datum/weather/virgo3b/blood_moon, + /datum/weather/virgo3b/fallout) + //VOREStation Edit End var/list/possible_weathers = list() /datum/gm_action/planet_weather_shift/set_up() diff --git a/code/modules/gamemaster/actions/radiation_storm.dm b/code/modules/gamemaster/actions/radiation_storm.dm index ee4a3edca51..678ad16ab64 100644 --- a/code/modules/gamemaster/actions/radiation_storm.dm +++ b/code/modules/gamemaster/actions/radiation_storm.dm @@ -41,7 +41,7 @@ /datum/gm_action/radiation_storm/proc/radiate() var/radiation_level = rand(15, 35) for(var/z in using_map.station_levels) - radiation_repository.z_radiate(locate(1, 1, z), radiation_level, 1) + SSradiation.z_radiate(locate(1, 1, z), radiation_level, 1) for(var/mob/living/carbon/C in living_mob_list) var/area/A = get_area(C) @@ -64,11 +64,4 @@ revoke_maint_all_access() /datum/gm_action/radiation_storm/get_weight() - var/people_in_space = 0 - for(var/mob/living/L in player_list) - if(!(L.z in using_map.station_levels)) - continue // Not on the right z-level. - var/turf/T = get_turf(L) - if(istype(T, /turf/space) && istype(T.loc,/area/space)) - people_in_space++ - return 20 + (metric.count_people_in_department(ROLE_MEDICAL) * 10) + (people_in_space * 40) + (metric.count_people_in_department(ROLE_EVERYONE) * 20) + return 20 + (metric.count_people_in_department(ROLE_MEDICAL) * 10) + (metric.count_all_space_mobs() * 40) + (metric.count_people_in_department(ROLE_EVERYONE) * 20) diff --git a/code/modules/gamemaster/actions/rogue_drones.dm b/code/modules/gamemaster/actions/rogue_drones.dm index 23e57f089de..983aa878424 100644 --- a/code/modules/gamemaster/actions/rogue_drones.dm +++ b/code/modules/gamemaster/actions/rogue_drones.dm @@ -60,11 +60,4 @@ command_announcement.Announce("We're disappointed at the loss of the drones, but the survivors have been recovered.", "Rogue drone alert") /datum/gm_action/rogue_drone/get_weight() - var/people_in_space = 0 - for(var/mob/living/L in player_list) - if(!(L.z in using_map.station_levels)) - continue // Not on the right z-level. - var/turf/T = get_turf(L) - if(istype(T, /turf/space) && istype(T.loc,/area/space)) - people_in_space++ - return 20 + (metric.count_people_in_department(ROLE_SECURITY) * 10) + (people_in_space * 30) + return 20 + (metric.count_people_in_department(ROLE_SECURITY) * 10) + (metric.count_all_space_mobs() * 30) diff --git a/code/modules/gamemaster/actions/solar_storm.dm b/code/modules/gamemaster/actions/solar_storm.dm index 5c5583328b8..046b93639b6 100644 --- a/code/modules/gamemaster/actions/solar_storm.dm +++ b/code/modules/gamemaster/actions/solar_storm.dm @@ -1,6 +1,6 @@ /datum/gm_action/solar_storm name = "solar storm" - var/const/rad_interval = 5 //Same interval period as radiation storms. + var/rad_interval = 1 SECOND var/base_solar_gen_rate length = 3 MINUTES var/duration // Duration for the storm @@ -21,30 +21,25 @@ if(isnull(base_solar_gen_rate)) base_solar_gen_rate = GLOB.solar_gen_rate GLOB.solar_gen_rate = mult * base_solar_gen_rate - /datum/gm_action/solar_storm/start() ..() length = duration command_announcement.Announce("The solar storm has reached the station. Please refain from EVA and remain inside the station until it has passed.", "Anomaly Alert") adjust_solar_output(5) - while(world.time <= world.time + duration) - if(duration % rad_interval == 0) + var/start_time = world.time + + spawn() + while(world.time <= start_time + duration) + sleep(rad_interval) radiate() /datum/gm_action/solar_storm/get_weight() - var/people_in_space = 0 - for(var/mob/living/L in player_list) - if(!(L.z in using_map.station_levels)) - continue // Not on the right z-level. - var/turf/T = get_turf(L) - if(istype(T, /turf/space) && istype(T.loc,/area/space)) - people_in_space++ - return 20 + (metric.count_people_in_department(ROLE_ENGINEERING) * 10) + (people_in_space * 30) + return 20 + (metric.count_people_in_department(ROLE_ENGINEERING) * 10) + (metric.count_all_space_mobs() * 30) /datum/gm_action/solar_storm/proc/radiate() // Note: Too complicated to be worth trying to use the radiation system for this. Its only in space anyway, so we make an exception in this case. - for(var/mob/living/L in living_mob_list) + for(var/mob/living/L in player_list) var/turf/T = get_turf(L) if(!T) continue diff --git a/code/modules/gamemaster/actions/spider_infestation.dm b/code/modules/gamemaster/actions/spider_infestation.dm index c98aa4de8b9..baba49c2e3b 100644 --- a/code/modules/gamemaster/actions/spider_infestation.dm +++ b/code/modules/gamemaster/actions/spider_infestation.dm @@ -3,7 +3,7 @@ departments = list(ROLE_SECURITY, ROLE_MEDICAL, ROLE_EVERYONE) chaotic = 30 - var/severity = 1 + severity = 1 var/spawncount = 1 diff --git a/code/modules/gamemaster/actions/surprise_carp_attack.dm b/code/modules/gamemaster/actions/surprise_carp_attack.dm index 14c4b03e0e0..dce6121b619 100644 --- a/code/modules/gamemaster/actions/surprise_carp_attack.dm +++ b/code/modules/gamemaster/actions/surprise_carp_attack.dm @@ -8,14 +8,7 @@ var/mob/living/victim = null /datum/gm_action/surprise_carp_attack/get_weight() - var/people_in_space = 0 - for(var/mob/living/L in player_list) - if(!(L.z in using_map.station_levels)) - continue // Not on the right z-level. - var/turf/T = get_turf(L) - if(istype(T, /turf/space) && istype(T.loc,/area/space)) - people_in_space++ - return people_in_space * 50 + return metric.count_all_space_mobs() * 50 /datum/gm_action/surprise_carp_attack/set_up() var/list/potential_victims = list() @@ -28,7 +21,8 @@ var/turf/T = get_turf(L) if(istype(T, /turf/space) && istype(T.loc,/area/space)) potential_victims.Add(L) - victim = pick(potential_victims) + if(potential_victims.len) + victim = pick(potential_victims) /datum/gm_action/surprise_carp_attack/start() diff --git a/code/modules/gamemaster/actions/viral_infection.dm b/code/modules/gamemaster/actions/viral_infection.dm index d33c4f52765..9b42e2df460 100644 --- a/code/modules/gamemaster/actions/viral_infection.dm +++ b/code/modules/gamemaster/actions/viral_infection.dm @@ -5,7 +5,7 @@ departments = list(ROLE_MEDICAL) chaotic = 5 var/list/viruses = list() - var/severity = 1 + severity = 1 /datum/gm_action/viral_infection/set_up() severity = pickweight(EVENT_LEVEL_MUNDANE = 20, diff --git a/code/modules/gamemaster/actions/viral_outbreak.dm b/code/modules/gamemaster/actions/viral_outbreak.dm index f7f1719e4a5..f0eb27b41ab 100644 --- a/code/modules/gamemaster/actions/viral_outbreak.dm +++ b/code/modules/gamemaster/actions/viral_outbreak.dm @@ -2,7 +2,7 @@ name = "viral outbreak" departments = list(ROLE_MEDICAL, ROLE_EVERYONE) chaotic = 30 - var/severity = 1 + severity = 1 var/list/candidates = list() /datum/gm_action/viral_outbreak/set_up() diff --git a/code/modules/gamemaster/actions/wallrot.dm b/code/modules/gamemaster/actions/wallrot.dm index e81a293aab2..e2c05aed74c 100644 --- a/code/modules/gamemaster/actions/wallrot.dm +++ b/code/modules/gamemaster/actions/wallrot.dm @@ -3,7 +3,7 @@ departments = list(ROLE_ENGINEERING) reusable = TRUE var/turf/simulated/wall/center - var/severity = 1 + severity = 1 /datum/gm_action/wallrot/set_up() severity = rand(1,3) diff --git a/code/modules/gamemaster/actions/wormholes.dm b/code/modules/gamemaster/actions/wormholes.dm index 15216746be2..f2a90f55395 100644 --- a/code/modules/gamemaster/actions/wormholes.dm +++ b/code/modules/gamemaster/actions/wormholes.dm @@ -3,7 +3,7 @@ chaotic = 70 length = 12 MINUTES departments = list(ROLE_EVERYONE) - var/severity = 1 + severity = 1 /datum/gm_action/wormholes/set_up() // 1 out of 5 will be full-duration wormholes, meaning up to a minute long. severity = pickweight(list( diff --git a/code/modules/holodeck/HolodeckObjects.dm b/code/modules/holodeck/HolodeckObjects.dm index 22b4b2e6c6d..c1c7ebedafa 100644 --- a/code/modules/holodeck/HolodeckObjects.dm +++ b/code/modules/holodeck/HolodeckObjects.dm @@ -126,6 +126,38 @@ slot_r_hand_str = 'icons/mob/items/righthand_gloves.dmi', ) item_state = "boxing" + special_attack_type = /datum/unarmed_attack/holopugilism + +datum/unarmed_attack/holopugilism + sparring_variant_type = /datum/unarmed_attack/holopugilism + +datum/unarmed_attack/holopugilism/unarmed_override(var/mob/living/carbon/human/user,var/mob/living/carbon/human/target,var/zone) + user.do_attack_animation(src) + var/damage = rand(0, 9) + if(!damage) + playsound(target.loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) + target.visible_message("[user] has attempted to punch [target]!") + return TRUE + var/obj/item/organ/external/affecting = target.get_organ(ran_zone(user.zone_sel.selecting)) + var/armor_block = target.run_armor_check(affecting, "melee") + var/armor_soak = target.get_armor_soak(affecting, "melee") + + if(HULK in user.mutations) + damage += 5 + + playsound(target.loc, "punch", 25, 1, -1) + + target.visible_message("[user] has punched [target]!") + + if(armor_soak >= damage) + return TRUE + + target.apply_damage(damage, HALLOSS, affecting, armor_block, armor_soak) + if(damage >= 9) + target.visible_message("[user] has weakened [target]!") + target.apply_effect(4, WEAKEN, armor_block) + + return TRUE /obj/structure/window/reinforced/holowindow/attackby(obj/item/W as obj, mob/user as mob) if(!istype(W)) @@ -262,8 +294,8 @@ spark_system.set_up(5, 0, user.loc) spark_system.start() playsound(user.loc, 'sound/weapons/blade1.ogg', 50, 1) - return 1 - return 0 + return TRUE + return FALSE /obj/item/weapon/holo/esword/New() item_color = pick("red","blue","green","purple") diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 40236e42af1..81018de61ca 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -5,6 +5,7 @@ icon = 'icons/obj/hydroponics_products.dmi' icon_state = "blank" desc = "Nutritious! Probably." + flags = NOCONDUCT slot_flags = SLOT_HOLSTER var/plantname diff --git a/code/modules/hydroponics/grown_inedible.dm b/code/modules/hydroponics/grown_inedible.dm index aa054cae29d..2b02116478a 100644 --- a/code/modules/hydroponics/grown_inedible.dm +++ b/code/modules/hydroponics/grown_inedible.dm @@ -37,6 +37,7 @@ desc = "A reminder of meals gone by." icon = 'icons/obj/trash.dmi' icon_state = "corncob" + flags = NOCONDUCT w_class = ITEMSIZE_SMALL throwforce = 0 throw_speed = 4 @@ -55,6 +56,7 @@ desc = "A peel from a banana." icon = 'icons/obj/items.dmi' icon_state = "banana_peel" + flags = NOCONDUCT w_class = ITEMSIZE_SMALL throwforce = 0 throw_speed = 4 diff --git a/code/modules/hydroponics/seed_storage_vr.dm b/code/modules/hydroponics/seed_storage_vr.dm index 6d9d373b786..77a885276c5 100644 --- a/code/modules/hydroponics/seed_storage_vr.dm +++ b/code/modules/hydroponics/seed_storage_vr.dm @@ -5,17 +5,20 @@ /obj/item/seeds/berryseed = 3, /obj/item/seeds/cabbageseed = 3, /obj/item/seeds/carrotseed = 3, + /obj/item/seeds/celery = 3, /obj/item/seeds/chantermycelium = 3, /obj/item/seeds/cherryseed = 3, /obj/item/seeds/chiliseed = 3, /obj/item/seeds/cocoapodseed = 3, /obj/item/seeds/cornseed = 3, + /obj/item/seeds/durian = 3, /obj/item/seeds/eggplantseed = 3, /obj/item/seeds/grapeseed = 3, /obj/item/seeds/grassseed = 3, /obj/item/seeds/replicapod = 3, /obj/item/seeds/lavenderseed = 3, /obj/item/seeds/lemonseed = 3, + /obj/item/seeds/lettuce = 3, /obj/item/seeds/limeseed = 3, /obj/item/seeds/mtearseed = 2, /obj/item/seeds/orangeseed = 3, @@ -25,19 +28,24 @@ /obj/item/seeds/poppyseed = 3, /obj/item/seeds/potatoseed = 3, /obj/item/seeds/pumpkinseed = 3, + /obj/item/seeds/rhubarb = 3, /obj/item/seeds/riceseed = 3, + /obj/item/seeds/rose = 3, /obj/item/seeds/soyaseed = 3, + /obj/item/seeds/spineapple = 3, /obj/item/seeds/sugarcaneseed = 3, /obj/item/seeds/sunflowerseed = 3, /obj/item/seeds/shandseed = 2, /obj/item/seeds/tobaccoseed = 3, /obj/item/seeds/tomatoseed = 3, /obj/item/seeds/towermycelium = 3, + /obj/item/seeds/vanilla = 3, /obj/item/seeds/watermelonseed = 3, /obj/item/seeds/wheatseed = 3, /obj/item/seeds/whitebeetseed = 3, /obj/item/seeds/shrinkshroom = 3, - /obj/item/seeds/megashroom = 3) + /obj/item/seeds/megashroom = 3, + /obj/item/seeds/wabback = 2) /obj/machinery/seed_storage/xenobotany name = "Xenobotany seed storage" @@ -50,11 +58,13 @@ /obj/item/seeds/berryseed = 3, /obj/item/seeds/cabbageseed = 3, /obj/item/seeds/carrotseed = 3, + /obj/item/seeds/celery = 3, /obj/item/seeds/chantermycelium = 3, /obj/item/seeds/cherryseed = 3, /obj/item/seeds/chiliseed = 3, /obj/item/seeds/cocoapodseed = 3, /obj/item/seeds/cornseed = 3, + /obj/item/seeds/durian = 3, /obj/item/seeds/replicapod = 3, /obj/item/seeds/eggplantseed = 3, /obj/item/seeds/glowshroom = 2, @@ -62,6 +72,7 @@ /obj/item/seeds/grassseed = 3, /obj/item/seeds/lavenderseed = 3, /obj/item/seeds/lemonseed = 3, + /obj/item/seeds/lettuce = 3, /obj/item/seeds/libertymycelium = 2, /obj/item/seeds/limeseed = 3, /obj/item/seeds/mtearseed = 2, @@ -74,14 +85,19 @@ /obj/item/seeds/potatoseed = 3, /obj/item/seeds/pumpkinseed = 3, /obj/item/seeds/reishimycelium = 2, + /obj/item/seeds/rhubarb = 3, /obj/item/seeds/riceseed = 3, + /obj/item/seeds/rose = 3, /obj/item/seeds/soyaseed = 3, + /obj/item/seeds/spineapple = 3, /obj/item/seeds/sugarcaneseed = 3, /obj/item/seeds/sunflowerseed = 3, /obj/item/seeds/shandseed = 2, /obj/item/seeds/tobaccoseed = 3, /obj/item/seeds/tomatoseed = 3, /obj/item/seeds/towermycelium = 3, + /obj/item/seeds/vanilla = 3, + /obj/item/seeds/wabback = 2, /obj/item/seeds/watermelonseed = 3, /obj/item/seeds/wheatseed = 3, /obj/item/seeds/whitebeetseed = 3, diff --git a/code/modules/integrated_electronics/core/printer.dm b/code/modules/integrated_electronics/core/printer.dm index c2c70985c51..cdf4652d5ee 100644 --- a/code/modules/integrated_electronics/core/printer.dm +++ b/code/modules/integrated_electronics/core/printer.dm @@ -44,7 +44,7 @@ if(num < 1) to_chat(user, span("warning", "\The [src] is too full to add more metal.")) return - if(stack.use(num)) + if(stack.use(max(1, round(num)))) // We don't want to create stacks that aren't whole numbers to_chat(user, span("notice", "You add [num] sheet\s to \the [src].")) metal += num * metal_per_sheet interact(user) @@ -148,7 +148,7 @@ else var/obj/item/I = build_type cost = initial(I.w_class) - if(!build_type in SScircuit.circuit_fabricator_recipe_list[current_category]) + if(!(build_type in SScircuit.circuit_fabricator_recipe_list[current_category])) return if(!debug) diff --git a/code/modules/integrated_electronics/subtypes/input.dm b/code/modules/integrated_electronics/subtypes/input.dm index c11c7e963ab..4ac81ea4ccc 100644 --- a/code/modules/integrated_electronics/subtypes/input.dm +++ b/code/modules/integrated_electronics/subtypes/input.dm @@ -308,11 +308,12 @@ var/list/valid_things = list() if(isweakref(I.data)) var/atom/A = I.data.resolve() - var/desired_type = A.type - if(desired_type) - for(var/atom/thing in nearby_things) - if(thing.type == desired_type) - valid_things.Add(thing) + if(A) + var/desired_type = A.type + if(desired_type) + for(var/atom/thing in nearby_things) + if(thing.type == desired_type) + valid_things.Add(thing) else if(istext(I.data)) var/DT = I.data for(var/atom/thing in nearby_things) @@ -540,7 +541,57 @@ if(translated) activate_pin(2) +/obj/item/integrated_circuit/input/microphone/sign + name = "sign-language translator" + desc = "Useful for spying on people or for sign activated machines." + extended_desc = "This will automatically translate galactic standard sign language it sees to Galactic Common. \ + The first activation pin is always pulsed when the circuit sees someone speak sign, while the second one \ + is only triggered if it sees someone speaking a language other than sign language, which it will attempt to \ + lip-read." + icon_state = "video_camera" + complexity = 12 + inputs = list() + outputs = list( + "speaker" = IC_PINTYPE_STRING, + "message" = IC_PINTYPE_STRING + ) + activators = list("on message received" = IC_PINTYPE_PULSE_OUT, "on translation" = IC_PINTYPE_PULSE_OUT) + spawn_flags = IC_SPAWN_RESEARCH + power_draw_per_use = 30 + var/list/my_langs = list() + var/list/readable_langs = list( + LANGUAGE_GALCOM, + LANGUAGE_SOL_COMMON, + LANGUAGE_TRADEBAND, + LANGUAGE_GUTTER, + LANGUAGE_TERMINUS + ) + +/obj/item/integrated_circuit/input/microphone/sign/Initialize() + ..() + for(var/lang in readable_langs) + var/datum/language/newlang = all_languages[lang] + my_langs |= newlang + +/obj/item/integrated_circuit/input/microphone/sign/hear_talk(mob/living/M, msg, var/verb="says", datum/language/speaking=null) + var/translated = FALSE + if(M && msg) + if(speaking) + if(!((speaking.flags & NONVERBAL) || (speaking.flags & SIGNLANG))) + translated = TRUE + msg = speaking.scramble(msg, my_langs) + set_pin_data(IC_OUTPUT, 1, M.GetVoice()) + set_pin_data(IC_OUTPUT, 2, msg) + + push_data() + activate_pin(1) + if(translated) + activate_pin(2) + +/obj/item/integrated_circuit/input/microphone/sign/hear_signlang(text, verb, datum/language/speaking, mob/M as mob) + hear_talk(M, text, verb, speaking) + return /obj/item/integrated_circuit/input/sensor name = "sensor" diff --git a/code/modules/integrated_electronics/subtypes/output.dm b/code/modules/integrated_electronics/subtypes/output.dm index cd8f8a7fc3b..3ddc3458d7c 100644 --- a/code/modules/integrated_electronics/subtypes/output.dm +++ b/code/modules/integrated_electronics/subtypes/output.dm @@ -136,6 +136,33 @@ var/obj/O = assembly ? loc : assembly audible_message("\icon[O] \The [O.name] states, \"[text]\"") +/obj/item/integrated_circuit/output/text_to_speech/advanced + name = "advanced text-to-speech circuit" + desc = "A miniature speaker is attached to this component. It is able to transpose any valid text to speech, matching a scanned target's voice." + complexity = 15 + cooldown_per_use = 6 SECONDS + inputs = list("text" = IC_PINTYPE_STRING, "mimic target" = IC_PINTYPE_REF) + power_draw_per_use = 100 + + spawn_flags = IC_SPAWN_RESEARCH + origin_tech = list(TECH_ENGINEERING = 3, TECH_DATA = 4, TECH_ILLEGAL = 1) + + var/mob/living/voice/my_voice + +/obj/item/integrated_circuit/output/text_to_speech/advanced/Initialize() + ..() + my_voice = new (src) + my_voice.name = "TTS Circuit" + +/obj/item/integrated_circuit/output/text_to_speech/advanced/do_work() + text = get_pin_data(IC_INPUT, 1) + var/mob/living/target_mob = get_pin_data(IC_INPUT, 2) + my_voice.transfer_identity(target_mob) + if(!isnull(text) && !isnull(my_voice) && !isnull(my_voice.name)) + my_voice.forceMove(get_turf(src)) + my_voice.say("[text]") + my_voice.forceMove(src) + /obj/item/integrated_circuit/output/sound name = "speaker circuit" desc = "A miniature speaker is attached to this component." diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index 734a2bcfa59..3c7ebec3779 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -141,6 +141,7 @@ icon_state ="book" throw_speed = 1 throw_range = 5 + flags = NOCONDUCT w_class = ITEMSIZE_NORMAL //upped to three because books are, y'know, pretty big. (and you could hide them inside eachother recursively forever) attack_verb = list("bashed", "whacked", "educated") var/dat // Actual page content diff --git a/code/modules/lore_codex/news_data/main.dm b/code/modules/lore_codex/news_data/main.dm index a2f5f430433..277c38e1754 100644 --- a/code/modules/lore_codex/news_data/main.dm +++ b/code/modules/lore_codex/news_data/main.dm @@ -4,6 +4,19 @@ region. Each is labeled by date of publication and title. This list is self-updating, and from time to time the publisher will push new \ articles. You are encouraged to check back frequently." children = list( + /datum/lore/codex/page/article66, + /datum/lore/codex/page/article65, + /datum/lore/codex/page/article64, + /datum/lore/codex/page/article63, + /datum/lore/codex/page/article62, + /datum/lore/codex/page/article61, + /datum/lore/codex/page/article60, + /datum/lore/codex/page/article59, + /datum/lore/codex/page/article58, + /datum/lore/codex/page/article57, + /datum/lore/codex/page/article56, + /datum/lore/codex/page/article55, + /datum/lore/codex/page/article54, /datum/lore/codex/page/article53, /datum/lore/codex/page/article52, /datum/lore/codex/page/article51, @@ -650,4 +663,122 @@

      \ Candidate Freya Singh, a career investment banker, spent much of today's debate advocating for reduced safety regulations and the apparent overturning of the Five Points, raising eyebrows across the system. Singh's office claims that her statements were 'a joke', but we do not feel that this is a laughing matter.\

      \ - In related news, Shadow Coalition candidate Phaedrus remains under a profanity filter 'house arrest' for the remainder of the election." \ No newline at end of file + In related news, Shadow Coalition candidate Phaedrus remains under a profanity filter 'house arrest' for the remainder of the election." + +/datum/lore/codex/page/article54 + name = "06/28/63 - Vir Finalizes Dates for Election Voting" + data = "The Vir Governmental Authority has confirmed that voting for Vir's governorship and Colonial Assembly seats will take place on the 29th and 30th of June, with an additional voting period set for Wednesday the 3rd of July to allow for out-of-system and full-time weekend employees to cast their votes. No exit poll information will be released until the final votes have been cast, and final results are expected to be announced within another week.\ +

      \ + According to a Oculum poll, Lusia Hainirsdottir is expected to comfortably take a seat, though the certainty of her governor position is not hard set. Candidates Sao, Singh and Jorg are trailing not far behind, but will all have to make good showings this weekend if they hope for electoral success. In an unexpected surge among minority species, the Shadow Coalition's Tajaran candidate Kurah Zarshir is leading the polls in certain outlying and orbital communities.\ +

      \ + Not sure how to vote, if you can vote, or who to vote for? Check out the official election website at your-choice-vir.virgov.xo.vr" + +/datum/lore/codex/page/article55 + name = "06/29/63 - Morpheus Cyberkinetics To Split Assets" + data = "The Morpheus Cyberkenetics Corporation is to split into two distinct entities operating under a single board of trustees, in light of their Almach branch's apparent involvement in the ongoing war after last month's 'unintentional' corporate drone strikes. Citing 'Severe communications disruptions' between its operations and assets on either side of the cordon since it was put in place last year, the SolGov-side corporation is to become 'Morpheus Sol', retaining most assets and current corporate headquarters, and its Almach counterpart 'Morpheus Shelf', which is to be based out of the administration station MAS Sophia Jr., located in the El system.'\ +

      \ + The principle victim of the Aetolian coup, Nanotrasen, has seen most of their considerable Almachi investment nationalized by the secessionist government, as has Xion and other major Almachi organizations. Most surviving corporate exclaves have been effectively written off by their parent company for the duration of the conflict, due to the severe difficulties effectively conducting trade across the militarized border. Before today, the sole exception was Morpheus, whose involvement in the secession prevented any seizing of their assets. It seems, however, that even the sardonic positronic corporation is not immune to the difficulties of doing business in the Almach Rim region.\ +

      \ + Member of the Board Chock Full of Sardines introduced the proposal by saying, 'Our goal here is not being shot. Together with leading economic scientists, we've devised a scheme that will allow us to be shot for illegal smuggling almost ninety percent less often.' They defended the confusing and offensive choice of name in 'Sophia Jr.', seemingly intended as an insult to longstanding rival Sophia, by claiming, 'It's absolutely hilarious.'" + +/datum/lore/codex/page/article56 + name = "06/30/63 - Almach Leak Confirms 'Super-weapon' in Whythe" + data = "Solar Confederate Government Intelligence has this afternoon confirmed the presence of a so-called 'Super-weapon' in the distant Whythe system, after an apparent intelligence leak was posted to the exonet in the early hours of this morning. According to a spokesperson for the Solar Fleet, the public were not made aware of the super-weapon as the military 'have no reason to believe that the weapon poses any threat to civilian targets within SolGov space at this time, and there is no reason to cause panic with what amounts to the announcement of an Almachi propaganda tool intended to sow discord with bold threats of overwhelming power. This morning's leak achieves nothing but serving the Association's schemes. Keeping this so-called super-weapon - and I hesitate to use that term - a secret seems to have been last on their list of priorities.'\ +

      \ + According to the intelligence documents released this morning and widely spread within minutes of upload, the 'super-weapon' is a colossal space-bound structure equipped with 'newly developed bluespace technology', though its exact purpose or capabilities have not been confirmed by either side.\ +

      \ + Additionally, the Solar Fleet has announced that an unnamed individual within the intelligence service has been placed under arrest in connection with the leak." + +/datum/lore/codex/page/article57 + name = "07/04/63 - Exit Polls Suggest Shadow Coalition Win in Vir" + data = "According to the first exit poll data released after Vir Gubernatorial voting closed at midnight, local favourite the Shadow Coalition is expected to win at least two representative seats, with incumbent representative Lusia Hainirsdottir taking a comfortable lead.\ +

      \ + Final results are not expected to be tallied until Saturday morning, but other frontrunners include the Icarus Front's Vani Jee and Mehmet Sao - running on drastically different platforms - alongside the Shadow Coalition's Selma Jorg. In an unexpected turn, sole Tajaran Candidate Kurah Zarshir of the Shadow Coalition has seen an immense surge in popularity among minority and more xenophilic voters. Could Vir be seeing its first Tajaran Representative? Experts say: 'Perhaps.'" + +/datum/lore/codex/page/article58 + name = "07/07/63 - Vir Election Results" + data = "The results of the 2563 Vir Gubernatorial Elections are as follows:\ +
      \ + Governor of Vir: Lusia Hainirsdottir (Shadow Coalition)\ +
      \ + Vir Colonial Assembly Representative: Vani Jee (Icarus Front)\ +
      \ + Vir Colonial Assembly Representative: Selma Jorg (Shadow Coalition)\ +
      \ + Other candidates ranked: Sao (4), Zarshir (5), Keldow (6), Singh (7), Moravec (8), Phaedrus (9), Lye (10), Savik (11), Square (12), Wekstrom (13)\ +

      \ + Voter turnout: 30,928,287 (63%)\ +

      \ + The greatest upset this election cycle has been the unexpected popularity of 'alien rights' candidate Kurah Zarshir, who was eliminated in favour of Mehmet Sao (Icarus Front) in the 8th round of vote transfers by a margin of just 30 votes, or 0.000096%, prompting a rigourous recount process to confirm the result. A difference at this stage could have resulted in a significantly different final line-up.\ +

      \ + This year's winners showed clear advantages in the first-choice votes, each gaining at least 15% of the popular vote before any transfers were calculated, though Sao made significant gains in the final count, falling only a few percent short of the Jorg's 3rd place position. By far the least popular candidate this cycle was Hal Wekstrom of the Sol Economic Organization, who received just 0.8% of the first-choice vote and was immediately eliminated. Also of note were Phaedrus, Apogee Lye and Yole Savik voters, each of whom had high (30%+) voter exhaustion rates, opting not to provide alternative choices; sending the message 'My candidate or none at all.'\ +

      \ + The elected are to be sworn in at a ceremony on Luna in two weeks time." + +/datum/lore/codex/page/article59 + name = "07/30/63 - Solar Fleet Data Breach" + data = "Last night, a number of files were spread on the Monsters From Beyond's exolife forums allegedly depicting the boarding and eventual scuttling of the SCG-TV Mariner's Cage during a voyage close to the Gavel system on the 12th of June, before the SCG had officially released any information regarding the event. The files contained undisclosed documents from the Solar Fleet investigation, some of which appear to contain audio and video recordings of the final moments of the crew before the vessel's bluespace drive was detonated. Due to the graphic violence depicted and their classified nature, we will not be sharing the files, however as a matter of public record we will explain the events recorded therein. The following description may be unsuitable for sensitive readers.\ +

      \ + First, the navigation crew detects a drive signature on an apparent intercept course with their own, originating from across the SCG-Almachi border. It was not a large vessel, and is assumed to be some form of autonomous drone. The crew disregards it as a low level threat, instead continuing on their trajectory, leaving only the standard point defense armament locked on. This proved to be a lethal mistake, as the vessel appeared and near-instantly began accelerating toward the Mariner's Cage, before impacting the fore weapons array. The recording is cut, due to what was likely a power surge, however upon reconnection, reports indicate no damage related to any known warhead was apparent, aside from the initial impactor. The crew mistakenly assumes it to be a failed suicide drone strike, and dispatches minimal security personnel, and a large complement of response engineers.\ +

      \ + Approximately thirty minutes after the response teams are dispatched to the impact zone, the teams begin losing contact, with those first arriving being the first to disappear. When the security responders intercept the path of communications blackouts, they are met with the blades of multiple Aetolian shock troopers. Two appear to be made from a 'living steel', with each limb taking the form of 'jagged cleavers' as one radio recording states, and three more of 'indeterminable classification'. The ship entered a red alert state, and moments later, the small contingent of marines aboard the supply vessel were dispatched to deal with the threat. All five members of the enemy boarding party were able to be rendered inert through sustained fire, though not without Sol casualties.\ +

      \ + According to the next recordings, approximately three hours after the incident, the vessel received orders to interrogate the boarding 'Aetotheans'. The two noted to appear as the officers of the squad were rejuvenated within sealed interrogation chambers reinforced with supplies on hand, apparently capable of stopping sustained fire from multiple energy weapons. The first individual was a 'sapphire' according to information from NanoTrasen correspondants. It refused to speak in Galactic Common, and instead utilized an unknown frequency of biological transmission, and internal charge shifts. The individual was moved to a more permanent cell within the vessel's brig for transport, and the second was rejuvenated. Only the first half of the interrogation, which lasted approximately two and a half minutes, compared to four hours for the first, was recovered. The individual is rejuvenated, and is engaged in discussion with the interrogating officer when it suddenly stands, emits what is described as a 'wail', and detonates, destroying the transmitting camera, and presumably killing the officers involved in direct interrogation.\ +

      \ + Final recordings originate from the ship's onboard A.I. housing, which was involved in continual discussions with presumably the 'sapphire', as it enacted the vessel's scuttling. It is unknown whether or not the individual was somehow capable of restoring the other individuals that fell in combat in order to free itself, or if it was able to incapacitate the transporting officers, and command crew of the vessel alone.\ +

      \ + The Solar Fleet has expressed 'regret' that the files were leaked in their complete form, and have assured the public that an official report was due for release in the coming weeks. Concerns of 'Aetothean' attacks on civilian targets have been dismissed as 'improbable', but have affirmed that 'the threat is being taken very seriously'." + +/datum/lore/codex/page/article60 + name = "08/03/63 - Hainirsdottir Sworn In As Governor of Vir" + data = "Following a short transitionary period for the previous administration, this year's election victors have been sworn in at an official ceremony at the Colonial Assembly Hall on Luna. During her welcoming address, Governor Hainirsdottir reaffirmed her plans for the future of the system, promising a 'Bright future for Vir as a hub for medical science.', and plans for an incentivisation program for the removal of invasive extra-terrestrial species that have long plagued the region - in particular the aggressive spiders that have become synonymous with certain regions of the Sivian wilderness.\ +

      \ + Additionally, the newly elected representatives announced expected, but none-the-less significant changes to the administrative staff of the system. Notable figures include two defeated election hopefuls: Kurah Zarshir has been selected as the Shadow Coalition's Culture Secretary for the system, while Mehmet Sao has been brought aboard by the Representative Vani Jee as the Vir Icarus Front's Internal Security Advisor. It is expected that the former candidates may use their positions to further certain goals from their own campaigns, but under the watchful eyes of their perhaps more moderate superiors." + +/datum/lore/codex/page/article61 + name = "08/04/63 - Former Independence Candidate Found Dead" + data = "It has been confirmed by a spokesperson for the Sivian Independence Front that a body found by hikers last week in the Ingolfskynn Mountains, approximately 200 miles northeast of New Reykjavik, belonged to party chair Yole Savik.\ +

      \ + Savik, 68 - who had run for Vir Representative in the recent election - had not been seen since the 14th of July, shortly after the results were announced. Party officials claim that Mr. Savik frequently made 'off the grid' trips into the Sivian wilderness and his absence had not been treated as suspicious until investigators approached them to confirm the identity of the body. According to police, though Yole was publicly known as a 'seasoned frontiersman', Savik had succumbed to exposure at least two weeks prior to the grisly discovery. His death is not being treated as suspicious." + +/datum/lore/codex/page/article62 + name = "08/07/63 - Almach Pirate Threat Vanishes - Analysts Baffled" + data = "Skrellian Xe'qua pirates operating in the far reaches of the Almach Association since the onset of hostilities last year, have inexplicably gone dark. The pirates, who were under close SolGov surveillance to monitor their impact on Almachi shipping, have drastically dropped in activity and numbers over the last month according to an official report released by the Solar Fleet today. The Fleet is unable to account for the cease in activity, which has now reached levels even lower than their pre-war baseline, as there have been no reports of Almach military operations in the area, nor any signs of decisive battle on the Almach border with pirate space.\ +

      \ + The drop in activity roughly coincides with the leaked information on an Almach 'Super-weapon' in Whythe, though military sources do not believe that the weapon has been deployed in any capacity at this time. According to Hasan Drust, an expert on Skrellian foreign policy, the 'only feasible explanation (is) major anti-piracy action undertaken by the Skrellian Far Kingdoms', who occupy the space beyond the Xe'qua pirates' known range. The reasoning behind this action now, against pirates who have historically only targeted human space is not entirely clear, though Drust suggests that it may simply be a coincidence as pirates would be a 'trivial issue' for Far Kingdom military might." + +/datum/lore/codex/page/article63 + name = "09/02/63 - Shock Almach Attack Routs Relan Front!" + data = "Following close to a month of reduced Almach activity, enemy Militia forces have today launched a staggering attack on Sol frontline forces in the region of the Relan system, disabling several SCG warships and forcing a major tactical retreat to Saint Columbia. The scale of this attack by Almach forces is unprecedented, but seems to be the result of the Association consolidating manpower previously dedicated to anti-piracy patrols on the far side of their territory. It is believed these vessels have become freed up due to the apparent but as of yet unconfirmed annihilation of Xe'qua criminal flotillas by Skrellian Far Kingdom police action.\ +

      \ + The Solar fleet had been in position to blockade the Relan system in the hopes of forcing the Free Relan Federation to surrender and withdraw from the Association, but was unprepared for what has been described as an 'all-out attack' on their positions, which left the vessels SCG-D Liu Bei, SCG-D Wodehouse, SCG-TV Ceylon Hartal and SCG-TV Apoxpalon disabled and unable to retreat with the bulk of our forces, as well as inflicting severe damage to several other craft. According to initial reports, the strikes on many of the afflicted ships closely resembled scenes from the controversial 'Aetothean shock attacks' on the SCG-TV Mariner's Cage this June, which saw the ruthless deployment of gene-altered Promethean 'super-soldiers' by the Almach Association.\ +

      \ + Fleet Admiral Ripon Latt, commanding officer of the assailed fleet, has confirmed that reinforcements are underway and the retreat 'shall not be a significant setback in the war effort', especially assuring citizens of the embattled Saint Columbia system and its neighbours that there is no cause for alarm and civilians have yet to be targeted.\ +

      \ + The fates of the four missing ships have not been confirmed, and though the Fleet has not yet made an official statement, Sol casualties are cautiously estimated to be in the hundreds." + +/datum/lore/codex/page/article64 + name = "09/23/63 - Fleet Refuses Inquiry Into Relan Losses" + data = "The SCG Fleet has refused to heed widespread calls from critics to launch an investigation into the heavy losses sustained by our forces in a major Almach attack early this month, citing that an investigation at this time would 'undermine the ongoing efforts of our troops in battles to come'.\ +

      \ + The attack, which took place on the 2nd of September and at current count resulted in the loss of a staggering 1281 Sol lives, quickly drew criticism from experts for 'the total unpreparedness' of the fleet despite their public claims that all vessels were 'battle ready and prepared for a coming offensive.'. The specifics of the fleets apparent failings have been the focus of much speculation in the intervening weeks, with the blame placed on everything from a critically inexperienced officer core, to ongoing redeployments to and from the recently expanded Hegemony border.\ +

      \ + Admiral Latt has condemned critics, stating that 'the last thing our brave troops need right now is murmuring from people who don't know the first thing what they're talking about. Their actions in following orders to fall back to the border have been nothing but commendable, and all effort was made to minimise loss of life. The fleet is undergoing reorganization at this time, and is in a better position than ever.'" + +/datum/lore/codex/page/article65 + name = "09/27/63 - Almach Bypass Saint Columbia In Brazen Gavel Attack!" + data = "Almach Association fleet forces entered the Gavel system this afternoon, reportedly having evaded interdicting Sol forces from Saint Columbia in an apparent effort to skirt the range of the MJOLNIR weapon system in Saint Columbia and cut off that system from major shipping routes. Current reports from the system capital in New Xanadu are that the majority of outlying civilian stations have surrendered to invading forces with only minor incident, but that skirmishes with local defence forces - including Sol Fleet detachments - are ongoing, and it is too early to remark on the outcome of the battle. Official military reports are scarce at this time, but the Fleet in Saint Columbia is 'on the move and ready to repel the invaders'.\ +

      \ + Accounts from the system's edge describe Almach forces 'firing indiscriminately' on anti-piracy emplacements including those mounted to the ILS Thurston, a Greyson Manufactories collection station with eight crew, killing all hands.\ +

      \ + Open fighting in the Gavel system marks the furthest Almach encroachment on Sol territory to date. The system, which is a stone's throw from the Oasis and Vir systems is best known for the destruction of the moonlet 'Requiem' by a rogue nanoswarm in 2289, which was successfully neutralized by government forces, and boasts only a small population relative to its neighbors." + +/datum/lore/codex/page/article66 + name = "10/01/63 - 'Judgement Day' As Gavel Falls!" + data = "The government of New Xanadu has surrendered to Association invaders following a disastrous relief effort by the Solar Fleet, whose interdiction vessels are believed to have been captured by the invading force. The manoeuvre leaves the bulk of the Sol fleet isolated in the Saint Columbia system - though a breakout is expected - and has led to widespread outrage in the Colonial Assembly. Critics of the war have damned the Fleet for their 'inability to fight a civilian rabble, gene-modded or otherwise' and renewed calls for a peaceful arrangement between the Solar Confederate Government and Association.\ +

      \ + ISA-5, current spokesperson for the Shadow Coalition has forwarded a motion today to resume discussions with Almachi heads of state, just hours after news of Gavel's surrender broke. The proposal which has yet to gain widespread traction, would call for a new ceasefire, and ISA-5 has stated they 'hope that a new agreement can be made to end the senseless loss of life over the particulars of a foreign government's right to autonomy.'.\ +

      \ + Executive Sifat Unar of the Emergent Intelligence Oversight has voiced immediate concern over the motion, criticising the use of 'foreign government' in reference to Almach; 'Our Fleet has suffered a few defeats, but this conflict goes deeper than mere lasers and shells and to surrender to torturers, mind-hackers, and Machiavellian machines at this stage would be insanity. To allow a seccessionist state, particularly one so unabashedly guilty of crimes against humanity that go far beyond even our modern definitions of 'Human Sanctity', to exist unquestioned a stone's throw from some of our most precious member states, would be a failing not only of this government, but of humanity that would echo through history like a great shameful dirge for all to hear.'\ +

      \ + A communications blackout has been instated on the Gavel system by the Almach Militia, though earlier reports indicate continued strikes on numerous civilian colonies who were unwilling, or unable to deactivate their automated defence systems prior to the invaders arrival." \ No newline at end of file diff --git a/code/modules/materials/material_recipes.dm b/code/modules/materials/material_recipes.dm index 687e5df27e2..0fe0f264bbb 100644 --- a/code/modules/materials/material_recipes.dm +++ b/code/modules/materials/material_recipes.dm @@ -14,7 +14,6 @@ recipes += new/datum/stack_recipe("[display_name] grave marker", /obj/item/weapon/material/gravemarker, 5, time = 50, supplied_material = "[name]") recipes += new/datum/stack_recipe("[display_name] ring", /obj/item/clothing/gloves/ring/material, 1, on_floor = 1, supplied_material = "[name]") recipes += new/datum/stack_recipe("[display_name] bracelet", /obj/item/clothing/accessory/bracelet/material, 1, on_floor = 1, supplied_material = "[name]") - recipes += new/datum/stack_recipe("[display_name] deskbell", /obj/item/weapon/deskbell, 1, on_floor = 1, supplied_material = "[name]") if(integrity>=50) recipes += new/datum/stack_recipe("[display_name] door", /obj/structure/simple_door, 10, one_per_turf = 1, on_floor = 1, supplied_material = "[name]") @@ -101,6 +100,7 @@ new/datum/stack_recipe("tall filing cabinet", /obj/structure/filingcabinet/filingcabinet, 4, time = 20, one_per_turf = 1, on_floor = 1), \ new/datum/stack_recipe("chest drawer", /obj/structure/filingcabinet/chestdrawer, 4, time = 20, one_per_turf = 1, on_floor = 1), \ )) + recipes += new/datum/stack_recipe("desk bell", /obj/item/weapon/deskbell, 1, on_floor = 1, supplied_material = "[name]") /material/plasteel/generate_recipes() ..() @@ -111,7 +111,7 @@ recipes += new/datum/stack_recipe("roller bed", /obj/item/roller, 5, time = 30, on_floor = 1) recipes += new/datum/stack_recipe("whetstone", /obj/item/weapon/whetstone, 2, time = 10) -/material/sandstone/generate_recipes() +/material/stone/generate_recipes() ..() recipes += new/datum/stack_recipe("planting bed", /obj/machinery/portable_atmospherics/hydroponics/soil, 3, time = 10, one_per_turf = 1, on_floor = 1) @@ -127,7 +127,6 @@ recipes += new/datum/stack_recipe("freezer floor tile", /obj/item/stack/tile/floor/freezer, 1, 4, 20) recipes += new/datum/stack_recipe("shower curtain", /obj/structure/curtain, 4, time = 15, one_per_turf = 1, on_floor = 1) recipes += new/datum/stack_recipe("plastic flaps", /obj/structure/plasticflaps, 4, time = 25, one_per_turf = 1, on_floor = 1) - recipes += new/datum/stack_recipe("airtight plastic flaps", /obj/structure/plasticflaps/mining, 5, time = 25, one_per_turf = 1, on_floor = 1) recipes += new/datum/stack_recipe("water-cooler", /obj/structure/reagent_dispensers/water_cooler, 4, time = 10, one_per_turf = 1, on_floor = 1) recipes += new/datum/stack_recipe("lampshade", /obj/item/weapon/lampshade, 1, time = 1) recipes += new/datum/stack_recipe("plastic net", /obj/item/weapon/material/fishing_net, 25, time = 1 MINUTE) diff --git a/code/modules/materials/material_recipes_vr.dm b/code/modules/materials/material_recipes_vr.dm index 3278ca17d3a..918dff0db1b 100644 --- a/code/modules/materials/material_recipes_vr.dm +++ b/code/modules/materials/material_recipes_vr.dm @@ -2,7 +2,13 @@ /material/steel/generate_recipes() . = ..() recipes += new/datum/stack_recipe("light switch frame", /obj/item/frame/lightswitch, 2) + recipes += new/datum/stack_recipe_list("sofas", list( \ + new/datum/stack_recipe("sofa middle", /obj/structure/bed/chair/sofa, 1, one_per_turf = 1, on_floor = 1), \ + new/datum/stack_recipe("sofa left", /obj/structure/bed/chair/sofa/left, 1, one_per_turf = 1, on_floor = 1), \ + new/datum/stack_recipe("sofa right", /obj/structure/bed/chair/sofa/right, 1, one_per_turf = 1, on_floor = 1), \ + new/datum/stack_recipe("sofa corner", /obj/structure/bed/chair/sofa/corner, 1, one_per_turf = 1, on_floor = 1), \ + )) /material/durasteel/generate_recipes() . = ..() - recipes += new/datum/stack_recipe("durasteel fishing rod", /obj/item/weapon/material/fishing_rod/modern/strong, 2) \ No newline at end of file + recipes += new/datum/stack_recipe("durasteel fishing rod", /obj/item/weapon/material/fishing_rod/modern/strong, 2) diff --git a/code/modules/materials/material_sheets.dm b/code/modules/materials/material_sheets.dm index 4ca50889ead..64eee7ddbee 100644 --- a/code/modules/materials/material_sheets.dm +++ b/code/modules/materials/material_sheets.dm @@ -278,7 +278,7 @@ . = ..() update_mass() - radiation_repository.radiate(src, 5 + amount) + SSradiation.radiate(src, 5 + amount) var/mob/living/M = user if(!istype(M)) return @@ -305,11 +305,11 @@ /obj/item/stack/material/supermatter/ex_act(severity) // An incredibly hard to manufacture material, SM chunks are unstable by their 'stabilized' nature. if(prob((4 / severity) * 20)) - radiation_repository.radiate(get_turf(src), amount * 4) + SSradiation.radiate(get_turf(src), amount * 4) explosion(get_turf(src),round(amount / 12) , round(amount / 6), round(amount / 3), round(amount / 25)) qdel(src) return - radiation_repository.radiate(get_turf(src), amount * 2) + SSradiation.radiate(get_turf(src), amount * 2) ..() /obj/item/stack/material/wood diff --git a/code/modules/materials/materials.dm b/code/modules/materials/materials.dm index 2b89bdc0acb..c362054cfa3 100644 --- a/code/modules/materials/materials.dm +++ b/code/modules/materials/materials.dm @@ -107,7 +107,7 @@ var/list/name_to_material var/explosion_resistance = 5 // Only used by walls currently. var/negation = 0 // Objects that respect this will randomly absorb impacts with this var as the percent chance. var/spatial_instability = 0 // Objects that have trouble staying in the same physical space by sheer laws of nature have this. Percent for respecting items to cause teleportation. - var/conductive = 1 // Objects with this var add CONDUCTS to flags on spawn. + var/conductive = 1 // Objects without this var add NOCONDUCT to flags on spawn. var/conductivity = null // How conductive the material is. Iron acts as the baseline, at 10. var/list/composite_material // If set, object matter var will be a list containing these values. var/luminescence @@ -259,6 +259,7 @@ var/list/name_to_material icon_colour = "#00FFE1" opacity = 0.4 reflectivity = 0.6 + conductive = 0 conductivity = 1 shard_type = SHARD_SHARD tableslam_noise = 'sound/effects/Glasshit.ogg' @@ -350,6 +351,7 @@ var/list/name_to_material weight = 22 hardness = 55 protectiveness = 5 // 20% + conductive = 0 conductivity = 5 door_icon_base = "stone" sheet_singular_name = "brick" @@ -436,7 +438,7 @@ var/list/name_to_material // Very rare alloy that is reflective, should be used sparingly. /material/durasteel name = "durasteel" - stack_type = /obj/item/stack/material/durasteel + stack_type = /obj/item/stack/material/durasteel/hull integrity = 600 melting_point = 7000 icon_base = "metal" @@ -458,6 +460,9 @@ var/list/name_to_material explosion_resistance = 90 reflectivity = 0.9 +/material/durasteel/hull/place_sheet(var/turf/target) //Deconstructed into normal durasteel sheets. + new /obj/item/stack/material/durasteel(target) + /material/plasteel/titanium name = MAT_TITANIUM stack_type = /obj/item/stack/material/titanium @@ -473,6 +478,9 @@ var/list/name_to_material icon_base = "hull" icon_reinf = "reinf_mesh" +/material/plasteel/titanium/hull/place_sheet(var/turf/target) //Deconstructed into normal titanium sheets. + new /obj/item/stack/material/titanium(target) + /material/glass name = "glass" stack_type = /obj/item/stack/material/glass @@ -485,6 +493,7 @@ var/list/name_to_material hardness = 30 weight = 15 protectiveness = 0 // 0% + conductive = 0 conductivity = 1 // Glass shards don't conduct. door_icon_base = "stone" destruction_desc = "shatters" @@ -626,6 +635,7 @@ var/list/name_to_material hardness = 10 weight = 12 protectiveness = 5 // 20% + conductive = 0 conductivity = 2 // For the sake of material armor diversity, we're gonna pretend this plastic is a good insulator. melting_point = T0C+371 //assuming heat resistant plastic stack_origin_tech = list(TECH_MATERIAL = 3) @@ -643,6 +653,7 @@ var/list/name_to_material stack_origin_tech = list(TECH_MATERIAL = 5) sheet_singular_name = "ingot" sheet_plural_name = "ingots" + conductivity = 100 /material/tritium name = "tritium" @@ -652,6 +663,7 @@ var/list/name_to_material sheet_singular_name = "ingot" sheet_plural_name = "ingots" is_fusion_fuel = 1 + conductive = 0 /material/deuterium name = "deuterium" @@ -661,6 +673,7 @@ var/list/name_to_material sheet_singular_name = "ingot" sheet_plural_name = "ingots" is_fusion_fuel = 1 + conductive = 0 /material/mhydrogen name = "mhydrogen" @@ -730,6 +743,7 @@ var/list/name_to_material icon_reinf = "reinf_metal" protectiveness = 60 integrity = 300 + conductive = 0 conductivity = 1.5 hardness = 90 shard_type = SHARD_SHARD @@ -758,6 +772,7 @@ var/list/name_to_material weight = 30 hardness = 45 negation = 2 + conductive = 0 conductivity = 5 reflectivity = 0.5 radiation_resistance = 20 @@ -813,6 +828,7 @@ var/list/name_to_material melting_point = T0C+300 sheet_singular_name = "blob" sheet_plural_name = "blobs" + conductive = 0 /material/resin/can_open_material_door(var/mob/living/user) var/mob/living/carbon/M = user @@ -833,6 +849,7 @@ var/list/name_to_material hardness = 15 weight = 18 protectiveness = 8 // 28% + conductive = 0 conductivity = 1 melting_point = T0C+300 //okay, not melting in this case, but hot enough to destroy wood ignition_point = T0C+288 @@ -879,6 +896,7 @@ var/list/name_to_material hardness = 1 weight = 1 protectiveness = 0 // 0% + conductive = 0 ignition_point = T0C+232 //"the temperature at which book-paper catches fire, and burns." close enough melting_point = T0C+232 //temperature at which cardboard walls would be destroyed stack_origin_tech = list(TECH_MATERIAL = 1) @@ -930,6 +948,7 @@ var/list/name_to_material melting_point = T0C+300 protectiveness = 1 // 4% flags = MATERIAL_PADDING + conductive = 0 /material/cult name = "cult" @@ -940,6 +959,7 @@ var/list/name_to_material shard_type = SHARD_STONE_PIECE sheet_singular_name = "brick" sheet_plural_name = "bricks" + conductive = 0 /material/cult/place_dismantled_girder(var/turf/target) new /obj/structure/girder/cult(target, "cult") @@ -963,6 +983,7 @@ var/list/name_to_material ignition_point = T0C+300 melting_point = T0C+300 protectiveness = 3 // 13% + conductive = 0 /material/carpet name = "carpet" @@ -975,6 +996,7 @@ var/list/name_to_material sheet_singular_name = "tile" sheet_plural_name = "tiles" protectiveness = 1 // 4% + conductive = 0 /material/cotton name = "cotton" @@ -984,6 +1006,7 @@ var/list/name_to_material ignition_point = T0C+232 melting_point = T0C+300 protectiveness = 1 // 4% + conductive = 0 // This all needs to be OOP'd and use inheritence if its ever used in the future. /material/cloth_teal @@ -995,6 +1018,7 @@ var/list/name_to_material ignition_point = T0C+232 melting_point = T0C+300 protectiveness = 1 // 4% + conductive = 0 /material/cloth_black name = "black" @@ -1005,6 +1029,7 @@ var/list/name_to_material ignition_point = T0C+232 melting_point = T0C+300 protectiveness = 1 // 4% + conductive = 0 /material/cloth_green name = "green" @@ -1015,6 +1040,7 @@ var/list/name_to_material ignition_point = T0C+232 melting_point = T0C+300 protectiveness = 1 // 4% + conductive = 0 /material/cloth_puple name = "purple" @@ -1025,6 +1051,7 @@ var/list/name_to_material ignition_point = T0C+232 melting_point = T0C+300 protectiveness = 1 // 4% + conductive = 0 /material/cloth_blue name = "blue" @@ -1035,6 +1062,7 @@ var/list/name_to_material ignition_point = T0C+232 melting_point = T0C+300 protectiveness = 1 // 4% + conductive = 0 /material/cloth_beige name = "beige" @@ -1045,6 +1073,7 @@ var/list/name_to_material ignition_point = T0C+232 melting_point = T0C+300 protectiveness = 1 // 4% + conductive = 0 /material/cloth_lime name = "lime" @@ -1055,6 +1084,7 @@ var/list/name_to_material ignition_point = T0C+232 melting_point = T0C+300 protectiveness = 1 // 4% + conductive = 0 /material/toy_foam name = "foam" @@ -1067,3 +1097,4 @@ var/list/name_to_material hardness = 1 weight = 1 protectiveness = 0 // 0% + conductive = 0 diff --git a/code/modules/metric/count.dm b/code/modules/metric/count.dm index 430f2fdd93b..3900aaaa97e 100644 --- a/code/modules/metric/count.dm +++ b/code/modules/metric/count.dm @@ -11,11 +11,13 @@ num++ return num -/datum/metric/proc/count_all_space_mobs(var/cutoff = 75) +/datum/metric/proc/count_all_space_mobs(var/cutoff = 75, var/respect_z = TRUE) var/num = 0 for(var/mob/living/L in player_list) var/turf/T = get_turf(L) - if(istype(T, /turf/space)) + if(istype(T, /turf/space) && istype(T.loc, /area/space)) + if(respect_z && !(L.z in using_map.station_levels)) + continue if(assess_player_activity(L) >= cutoff) num++ return num diff --git a/code/modules/mining/fulton.dm b/code/modules/mining/fulton.dm index d07a52a2f22..fa5fcc7397d 100644 --- a/code/modules/mining/fulton.dm +++ b/code/modules/mining/fulton.dm @@ -9,7 +9,7 @@ var/global/list/total_extraction_beacons = list() var/obj/structure/extraction_point/beacon var/list/beacon_networks = list("station") var/uses_left = 3 - var/can_use_indoors + var/can_use_indoors = FALSE var/safe_for_living_creatures = 1 /obj/item/extraction_pack/examine() @@ -145,7 +145,9 @@ var/global/list/total_extraction_beacons = list() icon_state = "subspace_amplifier" /obj/item/fulton_core/attack_self(mob/user) - if(do_after(user,15,target = user) && !QDELETED(src)) + var/turf/T = get_turf(user) + var/outdoors = T.outdoors + if(do_after(user,15,target = user) && !QDELETED(src) && outdoors) new /obj/structure/extraction_point(get_turf(user)) qdel(src) diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index 982ad0d8ad1..b006808a1eb 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -574,7 +574,7 @@ turf/simulated/mineral/floor/light_corner M.flash_eyes() if(prob(50)) M.Stun(5) - radiation_repository.flat_radiate(src, 25, 100) + SSradiation.flat_radiate(src, 25, 100) if(prob(25)) excavate_find(prob(5), finds[1]) else if(rand(1,500) == 1) @@ -591,9 +591,9 @@ turf/simulated/mineral/floor/light_corner if(is_clean) X = new /obj/item/weapon/archaeological_find(src, new_item_type = F.find_type) else - X = new /obj/item/weapon/ore/strangerock(src, inside_item_type = F.find_type) + X = new /obj/item/weapon/strangerock(src, inside_item_type = F.find_type) geologic_data.UpdateNearbyArtifactInfo(src) - var/obj/item/weapon/ore/strangerock/SR = X + var/obj/item/weapon/strangerock/SR = X SR.geologic_data = geologic_data //some find types delete the /obj/item/weapon/archaeological_find and replace it with something else, this handles when that happens diff --git a/code/modules/mining/ore_redemption_machine/construction.dm b/code/modules/mining/ore_redemption_machine/construction.dm index dbf8a96ffb7..3880ef5cb8a 100644 --- a/code/modules/mining/ore_redemption_machine/construction.dm +++ b/code/modules/mining/ore_redemption_machine/construction.dm @@ -10,3 +10,12 @@ req_components = list( /obj/item/weapon/stock_parts/console_screen = 1, /obj/item/weapon/stock_parts/matter_bin = 3) + +/obj/item/weapon/circuitboard/exploration_equipment_vendor + name = T_BOARD("Exploration Equipment Vendor") + board_type = new /datum/frame/frame_types/machine + build_path = /obj/machinery/mineral/equipment_vendor/survey + origin_tech = list(TECH_DATA = 1, TECH_ENGINEERING = 2) + req_components = list( + /obj/item/weapon/stock_parts/console_screen = 1, + /obj/item/weapon/stock_parts/matter_bin = 3) diff --git a/code/modules/mining/ore_redemption_machine/equipment_vendor.dm b/code/modules/mining/ore_redemption_machine/equipment_vendor.dm index c1defd08846..849550bf6be 100644 --- a/code/modules/mining/ore_redemption_machine/equipment_vendor.dm +++ b/code/modules/mining/ore_redemption_machine/equipment_vendor.dm @@ -10,7 +10,7 @@ circuit = /obj/item/weapon/circuitboard/mining_equipment_vendor var/icon_deny = "mining-deny" var/obj/item/weapon/card/id/inserted_id - //VOREStation Edit - Heavily modified list + //VOREStation Edit Start - Heavily modified list var/list/prize_list = list( new /datum/data/mining_equipment("1 Marker Beacon", /obj/item/stack/marker_beacon, 10), new /datum/data/mining_equipment("10 Marker Beacons", /obj/item/stack/marker_beacon/ten, 100), @@ -36,21 +36,21 @@ new /datum/data/mining_equipment("Resonator", /obj/item/resonator, 900), new /datum/data/mining_equipment("Fulton Pack", /obj/item/extraction_pack, 1200), new /datum/data/mining_equipment("Silver Pickaxe", /obj/item/weapon/pickaxe/silver, 1200), - //new /datum/data/mining_equipment("Mining Conscription Kit", /obj/item/storage/backpack/duffelbag/mining_conscript, 1000), + // new /datum/data/mining_equipment("Mining Conscription Kit", /obj/item/storage/backpack/duffelbag/mining_conscript, 1000), new /datum/data/mining_equipment("Space Cash", /obj/item/weapon/spacecash/c100, 1000), - new /datum/data/mining_equipment("Industrial Hardsuit - Control Module", /obj/item/weapon/rig/industrial, 2000), - new /datum/data/mining_equipment("Industrial Hardsuit - Plasma Cutter", /obj/item/rig_module/device/plasmacutter, 800), - new /datum/data/mining_equipment("Industrial Hardsuit - Drill", /obj/item/rig_module/device/drill, 2000), - new /datum/data/mining_equipment("Industrial Hardsuit - Ore Scanner", /obj/item/rig_module/device/orescanner, 1000), - new /datum/data/mining_equipment("Industrial Hardsuit - Material Scanner", /obj/item/rig_module/vision/material, 500), - new /datum/data/mining_equipment("Industrial Hardsuit - Maneuvering Jets", /obj/item/rig_module/maneuvering_jets, 1250), + new /datum/data/mining_equipment("Hardsuit - Control Module", /obj/item/weapon/rig/industrial/vendor, 2000), + new /datum/data/mining_equipment("Hardsuit - Plasma Cutter", /obj/item/rig_module/device/plasmacutter, 800), + new /datum/data/mining_equipment("Hardsuit - Drill", /obj/item/rig_module/device/drill, 5000), + new /datum/data/mining_equipment("Hardsuit - Ore Scanner", /obj/item/rig_module/device/orescanner, 1000), + new /datum/data/mining_equipment("Hardsuit - Material Scanner", /obj/item/rig_module/vision/material, 500), + new /datum/data/mining_equipment("Hardsuit - Maneuvering Jets", /obj/item/rig_module/maneuvering_jets, 1250), new /datum/data/mining_equipment("Hardsuit - Intelligence Storage", /obj/item/rig_module/ai_container, 2500), new /datum/data/mining_equipment("Hardsuit - Smoke Bomb Deployer", /obj/item/rig_module/grenade_launcher/smoke, 2000), - new /datum/data/mining_equipment("Industrial Equipment - Phoron Bore", /obj/item/weapon/gun/magnetic/matfed, 3000), - new /datum/data/mining_equipment("Industrial Equipment - Sheet-Snatcher",/obj/item/weapon/storage/bag/sheetsnatcher, 500), + new /datum/data/mining_equipment("Industrial Equipment - Phoron Bore", /obj/item/weapon/gun/magnetic/matfed, 3000), + new /datum/data/mining_equipment("Industrial Equipment - Sheet-Snatcher",/obj/item/weapon/storage/bag/sheetsnatcher, 500), new /datum/data/mining_equipment("Digital Tablet - Standard", /obj/item/modular_computer/tablet/preset/custom_loadout/standard, 500), new /datum/data/mining_equipment("Digital Tablet - Advanced", /obj/item/modular_computer/tablet/preset/custom_loadout/advanced, 1000), - new /datum/data/mining_equipment("Diamond Pickaxe", /obj/item/weapon/pickaxe/diamond, 2000), + // new /datum/data/mining_equipment("Diamond Pickaxe", /obj/item/weapon/pickaxe/diamond, 2000), new /datum/data/mining_equipment("Super Resonator", /obj/item/resonator/upgraded, 2500), new /datum/data/mining_equipment("Jump Boots", /obj/item/clothing/shoes/bhop, 2500), new /datum/data/mining_equipment("Luxury Shelter Capsule", /obj/item/device/survivalcapsule/luxury, 3100), @@ -66,20 +66,19 @@ new /datum/data/mining_equipment("Fine Excavation Kit - Chisels",/obj/item/weapon/storage/excavation, 500), new /datum/data/mining_equipment("Fine Excavation Kit - Measuring Tape",/obj/item/device/measuring_tape, 125), new /datum/data/mining_equipment("Fine Excavation Kit - Hand Pick",/obj/item/weapon/pickaxe/hand, 375), - new /datum/data/mining_equipment("Explosive Excavation Kit - Plastic Charge",/obj/item/weapon/plastique/seismic, 750), + new /datum/data/mining_equipment("Explosive Excavation Kit - Plastic Charge",/obj/item/weapon/plastique/seismic/locked, 1500), new /datum/data/mining_equipment("Injector (L) - Glucose",/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/glucose, 500), new /datum/data/mining_equipment("Injector (L) - Panacea",/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/purity, 500), new /datum/data/mining_equipment("Injector (L) - Trauma",/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/brute, 500), new /datum/data/mining_equipment("Nanopaste Tube", /obj/item/stack/nanopaste, 1000), - new /datum/data/mining_equipment("Misc: Graviton Visor", /obj/item/clothing/glasses/graviton, 1500), - new /datum/data/mining_equipment("Defense Equipment - Phase Pistol",/obj/item/weapon/gun/energy/phasegun/pistol, 400), new /datum/data/mining_equipment("Defense Equipment - Smoke Bomb",/obj/item/weapon/grenade/smokebomb, 100), - new /datum/data/mining_equipment("Defense Equipment - Razor Drone Deployer",/obj/item/weapon/grenade/spawnergrenade/manhacks/station, 1000), + new /datum/data/mining_equipment("Defense Equipment - Razor Drone Deployer",/obj/item/weapon/grenade/spawnergrenade/manhacks/station/locked, 1000), new /datum/data/mining_equipment("Defense Equipment - Sentry Drone Deployer",/obj/item/weapon/grenade/spawnergrenade/ward, 1500), - new /datum/data/mining_equipment("Defense Equipment - Steel Machete", /obj/item/weapon/material/knife/machete, 500), + new /datum/data/mining_equipment("Defense Equipment - Plasteel Machete", /obj/item/weapon/material/knife/machete, 500), new /datum/data/mining_equipment("Fishing Net", /obj/item/weapon/material/fishing_net, 500), new /datum/data/mining_equipment("Titanium Fishing Rod", /obj/item/weapon/material/fishing_rod/modern, 1000), - new /datum/data/mining_equipment("Durasteel Fishing Rod", /obj/item/weapon/material/fishing_rod/modern/strong, 7500) + new /datum/data/mining_equipment("Durasteel Fishing Rod", /obj/item/weapon/material/fishing_rod/modern/strong, 7500), + new /datum/data/mining_equipment("Bar Shelter Capsule", /obj/item/device/survivalcapsule/luxurybar, 10000) ) //VOREStation Edit End diff --git a/code/modules/mining/ore_redemption_machine/mine_point_items.dm b/code/modules/mining/ore_redemption_machine/mine_point_items.dm index da4463842a5..a6a90a3bd6f 100644 --- a/code/modules/mining/ore_redemption_machine/mine_point_items.dm +++ b/code/modules/mining/ore_redemption_machine/mine_point_items.dm @@ -15,19 +15,33 @@ name = "mining point card" desc = "A small card preloaded with mining points. Swipe your ID card over it to transfer the points, then discard." icon_state = "data" - var/points = 500 + var/mine_points = 500 + var/survey_points = 0 /obj/item/weapon/card/mining_point_card/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/weapon/card/id)) - if(points) - var/obj/item/weapon/card/id/C = I - C.mining_points += points - to_chat(user, "You transfer [points] points to [C].") - points = 0 + var/obj/item/weapon/card/id/C = I + if(mine_points) + C.mining_points += mine_points + to_chat(user, "You transfer [mine_points] excavation points to [C].") + mine_points = 0 else - to_chat(user, "There's no points left on [src].") + to_chat(user, "There's no excavation points left on [src].") + + if(survey_points) + C.survey_points += survey_points + to_chat(user, "You transfer [survey_points] survey points to [C].") + survey_points = 0 + else + to_chat(user, "There's no survey points left on [src].") + ..() /obj/item/weapon/card/mining_point_card/examine(mob/user) ..(user) - to_chat(user, "There's [points] points on the card.") + to_chat(user, "There's [mine_points] excavation points on the card.") + to_chat(user, "There's [survey_points] survey points on the card.") + +/obj/item/weapon/card/mining_point_card/survey + mine_points = 0 + survey_points = 50 diff --git a/code/modules/mining/ore_redemption_machine/survey_vendor.dm b/code/modules/mining/ore_redemption_machine/survey_vendor.dm new file mode 100644 index 00000000000..b58b343b040 --- /dev/null +++ b/code/modules/mining/ore_redemption_machine/survey_vendor.dm @@ -0,0 +1,111 @@ +/obj/machinery/mineral/equipment_vendor/survey + name = "exploration equipment vendor" + desc = "An equipment vendor for explorers, points collected with a survey scanner can be spent here." + icon = 'icons/obj/machines/mining_machines_vr.dmi' //VOREStation Edit + icon_state = "exploration" //VOREStation Edit + density = TRUE + anchored = TRUE + circuit = /obj/item/weapon/circuitboard/exploration_equipment_vendor + icon_deny = "exploration-deny" //VOREStation Edit + var/icon_vend = "exploration-vend" //VOREStation Add + //VOREStation Edit Start - Heavily modified list + prize_list = list( + new /datum/data/mining_equipment("1 Marker Beacon", /obj/item/stack/marker_beacon, 1), + new /datum/data/mining_equipment("10 Marker Beacons", /obj/item/stack/marker_beacon/ten, 10), + new /datum/data/mining_equipment("30 Marker Beacons", /obj/item/stack/marker_beacon/thirty, 30), + new /datum/data/mining_equipment("GPS Device", /obj/item/device/gps/explorer, 10), + new /datum/data/mining_equipment("Whiskey", /obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey, 10), + new /datum/data/mining_equipment("Absinthe", /obj/item/weapon/reagent_containers/food/drinks/bottle/absinthe, 10), + new /datum/data/mining_equipment("Cigar", /obj/item/clothing/mask/smokable/cigarette/cigar/havana, 15), + new /datum/data/mining_equipment("Soap", /obj/item/weapon/soap/nanotrasen, 20), + new /datum/data/mining_equipment("Laser Pointer", /obj/item/device/laser_pointer, 90), + new /datum/data/mining_equipment("Geiger Counter", /obj/item/device/geiger, 75), + new /datum/data/mining_equipment("Plush Toy", /obj/random/plushie, 30), + new /datum/data/mining_equipment("Extraction Equipment - Fulton Beacon", /obj/item/fulton_core, 300), + new /datum/data/mining_equipment("Extraction Equipment - Fulton Pack", /obj/item/extraction_pack, 125), + new /datum/data/mining_equipment("Umbrella", /obj/item/weapon/melee/umbrella/random, 20), + new /datum/data/mining_equipment("Shelter Capsule", /obj/item/device/survivalcapsule, 50), + new /datum/data/mining_equipment("Point Transfer Card", /obj/item/weapon/card/mining_point_card/survey, 50), + new /datum/data/mining_equipment("Survival Medipen", /obj/item/weapon/reagent_containers/hypospray/autoinjector/miner, 50), + new /datum/data/mining_equipment("Injector (L) - Glucose",/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/glucose, 50), + new /datum/data/mining_equipment("Injector (L) - Panacea",/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/purity, 50), + new /datum/data/mining_equipment("Injector (L) - Trauma",/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/brute, 50), + new /datum/data/mining_equipment("Digital Tablet - Standard", /obj/item/modular_computer/tablet/preset/custom_loadout/standard, 50), + new /datum/data/mining_equipment("Digital Tablet - Advanced", /obj/item/modular_computer/tablet/preset/custom_loadout/advanced, 100), + new /datum/data/mining_equipment("Nanopaste Tube", /obj/item/stack/nanopaste, 100), + new /datum/data/mining_equipment("Mini-Translocator", /obj/item/device/perfect_tele/one_beacon, 120), + new /datum/data/mining_equipment("Space Cash", /obj/item/weapon/spacecash/c100, 100), + new /datum/data/mining_equipment("Jump Boots", /obj/item/clothing/shoes/bhop, 250), + new /datum/data/mining_equipment("Luxury Shelter Capsule", /obj/item/device/survivalcapsule/luxury, 310), + new /datum/data/mining_equipment("Industrial Equipment - Phoron Bore", /obj/item/weapon/gun/magnetic/matfed, 300), + new /datum/data/mining_equipment("Survey Tools - Shovel", /obj/item/weapon/shovel, 40), + new /datum/data/mining_equipment("Survey Tools - Mechanical Trap", /obj/item/weapon/beartrap, 50), + new /datum/data/mining_equipment("Defense Equipment - Smoke Bomb",/obj/item/weapon/grenade/smokebomb, 10), + new /datum/data/mining_equipment("Defense Equipment - Razor Drone Deployer",/obj/item/weapon/grenade/spawnergrenade/manhacks/station/locked, 100), + new /datum/data/mining_equipment("Defense Equipment - Sentry Drone Deployer",/obj/item/weapon/grenade/spawnergrenade/ward, 150), + new /datum/data/mining_equipment("Defense Equipment - Steel Machete", /obj/item/weapon/material/knife/machete, 75), + new /datum/data/mining_equipment("Fishing Net", /obj/item/weapon/material/fishing_net, 50), + new /datum/data/mining_equipment("Titanium Fishing Rod", /obj/item/weapon/material/fishing_rod/modern, 100), + new /datum/data/mining_equipment("Durasteel Fishing Rod", /obj/item/weapon/material/fishing_rod/modern/strong, 750), + new /datum/data/mining_equipment("Bar Shelter Capsule", /obj/item/device/survivalcapsule/luxurybar, 1000) + ) + //VOREStation Edit End + +/obj/machinery/mineral/equipment_vendor/survey/interact(mob/user) + user.set_machine(src) + + var/dat + dat +="
      " + if(istype(inserted_id)) + dat += "You have [inserted_id.survey_points] survey points collected. Eject ID.
      " + else + dat += "No ID inserted. Insert ID.
      " + dat += "
      " + dat += "
      Equipment point cost list:
      [current_species.blurb][current_species.blurb]

      See the wiki for more details.
      [current_species.blurb]" if("preview" in icon_states(current_species.icobase)) usr << browse_rsc(icon(current_species.icobase,"preview"), "species_preview_[current_species.name].png") @@ -873,7 +878,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O dat += "You cannot play as this species.
      If you wish to be whitelisted, you can make an application post on the forums.

      " else if(restricted == 2) dat += "You cannot play as this species.
      This species is not available for play as a station race..

      " - if(!restricted || check_rights(R_ADMIN, 0)) + if(!restricted || check_rights(R_ADMIN, 0) || current_species.spawn_flags & SPECIES_WHITELIST_SELECTABLE) //VOREStation Edit: selectability dat += "\[select\]" dat += "" diff --git a/code/modules/client/preference_setup/loadout/loadout.dm b/code/modules/client/preference_setup/loadout/loadout.dm index 9ba9156fe1b..a5e6024653d 100644 --- a/code/modules/client/preference_setup/loadout/loadout.dm +++ b/code/modules/client/preference_setup/loadout/loadout.dm @@ -70,6 +70,10 @@ var/list/gear_datums = list() continue if(max_cost && G.cost > max_cost) continue + if(G.ckeywhitelist && !(preference_mob.ckey in G.ckeywhitelist)) //Vorestation Edit + continue //Vorestation Edit + if(G.character_name && !(preference_mob.client.prefs.real_name in G.character_name)) //Vorestation Edit + continue //Vorestation Edit . += gear_name /datum/category_item/player_setup_item/loadout/sanitize_character() @@ -88,7 +92,7 @@ var/list/gear_datums = list() preference_mob << "You cannot have more than one of the \the [gear_name]" pref.gear -= gear_name else if(!(gear_name in valid_gear_choices())) - preference_mob << "You cannot take \the [gear_name] as you are not whitelisted for the species." + preference_mob << "You cannot take \the [gear_name] as you are not whitelisted for the species or item." //Vorestation Edit pref.gear -= gear_name else var/datum/gear/G = gear_datums[gear_name] @@ -100,6 +104,7 @@ var/list/gear_datums = list() /datum/category_item/player_setup_item/loadout/content() . = list() + var/mob/preference_mob = preference_mob() //Vorestation Edit var/total_cost = 0 if(pref.gear && pref.gear.len) for(var/i = 1; i <= pref.gear.len; i++) @@ -145,6 +150,10 @@ var/list/gear_datums = list() . += "

      [G.display_name][G.cost]
      " + for(var/datum/data/mining_equipment/prize in prize_list) + dat += "" + dat += "
      [prize.equipment_name][prize.cost]Purchase
      " + var/datum/browser/popup = new(user, "miningvendor", "Survey Equipment Vendor", 400, 600) + popup.set_content(dat) + popup.open() + +/obj/machinery/mineral/equipment_vendor/survey/Topic(href, href_list) + if(..()) + return 1 + + if(href_list["choice"]) + if(istype(inserted_id)) + if(href_list["choice"] == "eject") + to_chat(usr, "You eject the ID from [src]'s card slot.") + usr.put_in_hands(inserted_id) + inserted_id = null + else if(href_list["choice"] == "insert") + var/obj/item/weapon/card/id/I = usr.get_active_hand() + if(istype(I) && !inserted_id && usr.unEquip(I)) + I.forceMove(src) + inserted_id = I + interact(usr) + to_chat(usr, "You insert the ID into [src]'s card slot.") + else + to_chat(usr, "No valid ID.") + flick(icon_deny, src) + + if(href_list["purchase"]) + if(istype(inserted_id)) + var/datum/data/mining_equipment/prize = locate(href_list["purchase"]) + if (!prize || !(prize in prize_list)) + to_chat(usr, "Error: Invalid choice!") + flick(icon_deny, src) + return + if(prize.cost > inserted_id.survey_points) + to_chat(usr, "Error: Insufficent points for [prize.equipment_name]!") + flick(icon_deny, src) + else + inserted_id.survey_points -= prize.cost + to_chat(usr, "[src] clanks to life briefly before vending [prize.equipment_name]!") + flick(icon_vend, src) //VOREStation Add + new prize.equipment_path(drop_location()) + else + to_chat(usr, "Error: Please insert a valid ID!") + flick(icon_deny, src) + updateUsrDialog() diff --git a/code/modules/mining/shelter_atoms.dm b/code/modules/mining/shelter_atoms.dm index ce1ec091890..55734dfb549 100644 --- a/code/modules/mining/shelter_atoms.dm +++ b/code/modules/mining/shelter_atoms.dm @@ -15,14 +15,12 @@ w_class = ITEMSIZE_TINY var/template_id = "shelter_alpha" var/datum/map_template/shelter/template - var/datum/map_template/shelter/template_roof var/used = FALSE /obj/item/device/survivalcapsule/proc/get_template() if(template) return template = SSmapping.shelter_templates[template_id] - template_roof = SSmapping.shelter_templates[template.roof] if(!template) throw EXCEPTION("Shelter template ([template_id]) not found!") qdel(src) @@ -49,8 +47,6 @@ var/turf/deploy_location = get_turf(src) var/status = template.check_deploy(deploy_location) var/turf/above_location = GetAbove(deploy_location) - if(above_location && status == SHELTER_DEPLOY_ALLOWED) - status = template.check_deploy(above_location) switch(status) //Not allowed due to /area technical reasons @@ -77,9 +73,11 @@ playsound(get_turf(src), 'sound/effects/phasein.ogg', 100, 1) log_and_message_admins("[key_name_admin(usr)] activated a bluespace capsule at [get_area(T)]!") - if(above_location && template_roof) - template_roof.load(above_location, centered = TRUE) + if(above_location) + template.add_roof(above_location) + template.annihilate_plants(deploy_location) template.load(deploy_location, centered = TRUE) + template.update_lighting(deploy_location) qdel(src) /obj/item/device/survivalcapsule/luxury @@ -87,10 +85,21 @@ desc = "An exorbitantly expensive luxury suite programmed into construction nanomachines. There's a license for use printed on the bottom." template_id = "shelter_beta" +/obj/item/device/survivalcapsule/luxurybar + name = "luxury surfluid bar capsule" + desc = "A luxury bar in a capsule. Bartender required and not included. There's a license for use printed on the bottom." + template_id = "shelter_gamma" + +/obj/item/device/survivalcapsule/military + name = "military surfluid shelter capsule" + desc = "A prefabricated firebase in a capsule. Contains basic weapons, building materials, and combat suits. There's a license for use printed on the bottom." + template_id = "shelter_delta" + +//Custom Shelter Capsules /obj/item/device/survivalcapsule/tabiranth name = "silver-trimmed surfluid shelter capsule" desc = "An exorbitantly expensive luxury suite programmed into construction nanomachines. This one is a particularly rare and expensive model. There's a license for use printed on the bottom." - template_id = "shelter_gamma" + template_id = "shelter_phi" //Pod objects //Walls @@ -98,6 +107,9 @@ name = "survival shelter" stripe_color = "#efbc3b" +/turf/simulated/shuttle/wall/voidcraft/survival/hard_corner + hard_corner = 1 + //Doors /obj/machinery/door/airlock/voidcraft/survival_pod name = "survival airlock" diff --git a/code/modules/mining/shelters.dm b/code/modules/mining/shelters.dm index b68606f914b..e7f45e3bf6f 100644 --- a/code/modules/mining/shelters.dm +++ b/code/modules/mining/shelters.dm @@ -2,15 +2,12 @@ var/shelter_id var/description var/blacklisted_turfs - var/whitelisted_turfs var/banned_areas var/banned_objects - var/roof /datum/map_template/shelter/New() . = ..() - blacklisted_turfs = typecacheof(/turf/unsimulated) - whitelisted_turfs = list() + blacklisted_turfs = typecacheof(list(/turf/unsimulated, /turf/simulated/floor/tiled)) banned_areas = typecacheof(/area/shuttle) banned_objects = list() @@ -22,8 +19,7 @@ return SHELTER_DEPLOY_BAD_AREA var/banned = is_type_in_typecache(T, blacklisted_turfs) - var/permitted = is_type_in_typecache(T, whitelisted_turfs) - if(banned && !permitted) + if(banned || T.density) return SHELTER_DEPLOY_BAD_TURFS for(var/obj/O in T) @@ -31,6 +27,26 @@ return SHELTER_DEPLOY_ANCHORED_OBJECTS return SHELTER_DEPLOY_ALLOWED +/datum/map_template/shelter/proc/add_roof(turf/deploy_location) + var/affected = get_affected_turfs(deploy_location, centered=TRUE) + for(var/turf/T in affected) + if(isopenspace(T)) + T.ChangeTurf(/turf/simulated/shuttle/floor/voidcraft) + +/datum/map_template/shelter/proc/annihilate_plants(turf/deploy_location) + var/deleted_atoms = 0 + var/affected = get_affected_turfs(deploy_location, centered=TRUE) + for(var/turf/T in affected) + for(var/obj/structure/flora/AM in T) + ++deleted_atoms + qdel(AM) + admin_notice("Annihilated [deleted_atoms] plants.", R_DEBUG) + +/datum/map_template/shelter/proc/update_lighting(turf/deploy_location) + var/affected = get_affected_turfs(deploy_location, centered=TRUE) + for(var/turf/T in affected) + T.lighting_build_overlay() + /datum/map_template/shelter/alpha name = "Shelter Alpha" shelter_id = "shelter_alpha" @@ -39,16 +55,6 @@ sleeping area! Order now, and we'll throw in a TINY FAN, \ absolutely free!" mappath = "maps/submaps/shelters/shelter_1.dmm" - roof = "roof_alpha" - -/datum/map_template/shelter/alpha_roof - shelter_id = "roof_alpha" - mappath = "maps/submaps/shelters/shelter_1_roof.dmm" - -/datum/map_template/shelter/alpha/New() - . = ..() - whitelisted_turfs = typecacheof(/turf/simulated/mineral) - banned_objects = list() /datum/map_template/shelter/beta name = "Shelter Beta" @@ -59,29 +65,33 @@ and a deluxe companion to keep you from getting lonely during \ an ash storm." mappath = "maps/submaps/shelters/shelter_2.dmm" - roof = "roof_beta" - -/datum/map_template/shelter/beta_roof - shelter_id = "roof_beta" - mappath = "maps/submaps/shelters/shelter_2_roof.dmm" - -/datum/map_template/shelter/beta/New() - . = ..() - whitelisted_turfs = typecacheof(/turf/simulated/mineral) - banned_objects = list() /datum/map_template/shelter/gamma name = "Shelter Gamma" shelter_id = "shelter_gamma" + description = "A luxury elite bar which holds an entire bar \ + along with two vending machines, tables, and a restroom that \ + also has a sink. This isn't a survival capsule and so you can \ + expect that this won't save you if you're bleeding out to \ + death." + mappath = "maps/submaps/shelters/shelter_3.dmm" + +/datum/map_template/shelter/delta + name = "Shelter Delta" + shelter_id = "shelter_delta" + description = "A small firebase that contains equipment and supplies \ + for roughly a squad of military troops. Large quantities of \ + supplies allow it to hold out for an extended period of time\ + and a built in medical facility allows field treatment to be \ + possible." + mappath = "maps/submaps/shelters/shelter_4.dmm" + +/datum/map_template/shelter/phi + name = "Shelter Phi" + shelter_id = "shelter_phi" description = "An heavily modified variant of the luxury shelter, \ this particular model has extra food, drinks, and other supplies. \ Originally designed for use by colonists on worlds with little to \ to no contact, the expense of these shelters have prevented them \ from seeing common use." - mappath = "maps/submaps/shelters/shelter_3.dmm" - roof = "roof_beta" - -/datum/map_template/shelter/gamma/New() - . = ..() - whitelisted_turfs = typecacheof(/turf/simulated/mineral) - banned_objects = list() + mappath = "maps/submaps/shelters/shelter_a.dmm" diff --git a/code/modules/mob/_modifiers/medical.dm b/code/modules/mob/_modifiers/medical.dm new file mode 100644 index 00000000000..46a8877d1f2 --- /dev/null +++ b/code/modules/mob/_modifiers/medical.dm @@ -0,0 +1,17 @@ +/* + * Modifiers caused by chemicals or organs specifically. + */ + +/datum/modifier/cryogelled + name = "cryogelled" + desc = "Your body begins to freeze." + mob_overlay_state = "chilled" + + on_created_text = "You feel like you're going to freeze! It's hard to move." + on_expired_text = "You feel somewhat warmer and more mobile now." + stacks = MODIFIER_STACK_ALLOWED + + slowdown = 0.1 + evasion = -5 + attack_speed_percent = 1.1 + disable_duration_percent = 1.05 diff --git a/code/modules/mob/_modifiers/modifiers_misc.dm b/code/modules/mob/_modifiers/modifiers_misc.dm index e81cf0aaa86..800429de257 100644 --- a/code/modules/mob/_modifiers/modifiers_misc.dm +++ b/code/modules/mob/_modifiers/modifiers_misc.dm @@ -43,7 +43,7 @@ the artifact triggers the rage. /datum/modifier/berserk name = "berserk" desc = "You are filled with an overwhelming rage." - client_color = "#FF0000" // Make everything red! + client_color = "#FF5555" // Make everything red! mob_overlay_state = "berserk" on_created_text = "You feel an intense and overwhelming rage overtake you as you go berserk!" @@ -293,4 +293,29 @@ the artifact triggers the rage. on_expired_text = "You feel.. different." stacks = MODIFIER_STACK_EXTEND - pulse_set_level = PULSE_NORM \ No newline at end of file + pulse_set_level = PULSE_NORM + +/datum/modifier/slow_pulse + name = "slow pulse" + desc = "Your blood flows slower." + + on_created_text = "You feel sluggish." + on_expired_text = "You feel energized." + stacks = MODIFIER_STACK_EXTEND + + bleeding_rate_percent = 0.8 + + pulse_set_level = PULSE_SLOW + +// Temperature Normalizer. +/datum/modifier/homeothermic + name = "temperature resistance" + desc = "Your body normalizes to room temperature." + + on_created_text = "You feel comfortable." + on_expired_text = "You feel.. still probably comfortable." + stacks = MODIFIER_STACK_EXTEND + +/datum/modifier/homeothermic/tick() + ..() + holder.bodytemperature = round((holder.bodytemperature + T20C) / 2) diff --git a/code/modules/mob/_modifiers/traits.dm b/code/modules/mob/_modifiers/traits.dm index 200f8eabfbc..b15ece941e3 100644 --- a/code/modules/mob/_modifiers/traits.dm +++ b/code/modules/mob/_modifiers/traits.dm @@ -60,33 +60,67 @@ metabolism_percent = 0.5 incoming_healing_percent = 0.6 -/datum/modifier/trait/larger - name = "Larger" - desc = "Your body is larger than average." +/datum/modifier/trait/taller + name = "Taller" + desc = "Your body is taller than average." + icon_scale_x_percent = 1 + icon_scale_y_percent = 1.09 - icon_scale_x_percent = 1.1 - icon_scale_y_percent = 1.1 - -/datum/modifier/trait/large - name = "Large" - desc = "Your body is a bit larger than average." - - icon_scale_x_percent = 1.05 +/datum/modifier/trait/tall + name = "Tall" + desc = "Your body is a bit taller than average." + icon_scale_x_percent = 1 icon_scale_y_percent = 1.05 -/datum/modifier/trait/small - name = "Small" - desc = "Your body is a bit smaller than average." - - icon_scale_x_percent = 0.95 +/datum/modifier/trait/short + name = "Short" + desc = "Your body is a bit shorter than average." + icon_scale_x_percent = 1 icon_scale_y_percent = 0.95 -/datum/modifier/trait/smaller - name = "Smaller" - desc = "Your body is smaller than average." - icon_scale_x_percent = 0.9 - icon_scale_y_percent = 0.9 +/datum/modifier/trait/shorter + name = "Shorter" + desc = "You are shorter than average." + icon_scale_x_percent = 1 + icon_scale_y_percent = 0.915 + +/datum/modifier/trait/fat + name = "Overweight" + desc = "You are heavier than average." + + metabolism_percent = 1.2 + icon_scale_x_percent = 1.054 + icon_scale_y_percent = 1 + slowdown = 1.1 + max_health_percent = 1.05 + +/datum/modifier/trait/obese + name = "Obese" + desc = "You are much heavier than average." + metabolism_percent = 1.4 + icon_scale_x_percent = 1.095 + icon_scale_y_percent = 1 + slowdown = 1.2 + max_health_percent = 1.10 + +/datum/modifier/trait/thin + name = "Thin" + desc = "You are skinnier than average." + metabolism_percent = 0.8 + icon_scale_x_percent = 0.945 + icon_scale_y_percent = 1 + max_health_percent = 0.95 + outgoing_melee_damage_percent = 0.95 + +/datum/modifier/trait/thinner + name = "Very Thin" + desc = "You are much skinnier than average." + metabolism_percent = 0.6 + icon_scale_x_percent = 0.905 + icon_scale_y_percent = 1 + max_health_percent = 0.90 + outgoing_melee_damage_percent = 0.9 /datum/modifier/trait/colorblind_protanopia name = "Protanopia" diff --git a/code/modules/mob/_modifiers/unholy.dm b/code/modules/mob/_modifiers/unholy.dm index 0b6f69a21b9..730e57691c2 100644 --- a/code/modules/mob/_modifiers/unholy.dm +++ b/code/modules/mob/_modifiers/unholy.dm @@ -146,3 +146,55 @@ if(prob(10)) to_chat(H, "It feels as though your body is being torn apart!") L.updatehealth() + +/datum/modifier/gluttonyregeneration + name = "gluttonous regeneration" + desc = "You are filled with an overwhelming hunger." + mob_overlay_state = "electricity" + + on_created_text = "You feel an intense and overwhelming hunger overtake you as your body regenerates!" + on_expired_text = "The blaze of hunger inside you has been snuffed." + stacks = MODIFIER_STACK_EXTEND + +/datum/modifier/gluttonyregeneration/can_apply(var/mob/living/L) + if(L.stat == DEAD) + to_chat(L, "You can't be dead to consume.") + return FALSE + + if(!L.is_sentient()) + return FALSE // Drones don't feel anything, not even hunger. + + if(L.has_modifier_of_type(/datum/modifier/berserk_exhaustion)) + to_chat(L, "You recently berserked, so you are too tired to consume.") + return FALSE + + if(!ishuman(L)) // Only humanoids feel hunger. Totally. + return FALSE + + else + var/mob/living/carbon/human/H = L + if(H.species.name == "Diona") + to_chat(L, "You feel strange for a moment, but it passes.") + return FALSE // Happy trees aren't affected by incredible hunger. + + return ..() + +/datum/modifier/gluttonyregeneration/tick() + spawn() + if(ishuman(holder)) + var/mob/living/carbon/human/H = holder + var/starting_nutrition = H.nutrition + H.nutrition = max(0, H.nutrition - 10) + var/healing_amount = starting_nutrition - H.nutrition + if(healing_amount < 0) // If you are eating enough to somehow outpace this, congratulations, you are gluttonous enough to gain a boon. + healing_amount *= -2 + + H.adjustBruteLoss(-healing_amount * 0.25) + + H.adjustFireLoss(-healing_amount * 0.25) + + H.adjustOxyLoss(-healing_amount * 0.25) + + H.adjustToxLoss(-healing_amount * 0.25) + + ..() \ No newline at end of file diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 31cbcc1f44a..758c438a254 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -389,13 +389,13 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp return (T && T.holy) && (is_manifest || (mind in cult.current_antagonists)) -/mob/observer/dead/verb/jumptomob(target in getmobs()) //Moves the ghost instead of just changing the ghosts's eye -Nodrak +/mob/observer/dead/verb/jumptomob(input in getmobs()) //Moves the ghost instead of just changing the ghosts's eye -Nodrak set category = "Ghost" set name = "Jump to Mob" set desc = "Teleport to a mob" set popup_menu = FALSE //VOREStation Edit - Declutter. if(istype(usr, /mob/observer/dead)) //Make sure they're an observer! - + var/target = getmobs()[input] if (!target)//Make sure we actually have a target return else @@ -466,7 +466,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp var/turf/t = get_turf(src) if(t) - var/rads = radiation_repository.get_rads_at_turf(t) + var/rads = SSradiation.get_rads_at_turf(t) to_chat(src, "Radiation level: [rads ? rads : "0"] Bq.") diff --git a/code/modules/mob/language/station_vr.dm b/code/modules/mob/language/station_vr.dm index dcc21366722..cefb2b90e60 100644 --- a/code/modules/mob/language/station_vr.dm +++ b/code/modules/mob/language/station_vr.dm @@ -83,6 +83,19 @@ "uhk","zir","sc'orth","sc'er","thc'yek","th'zirk","th'esk","k'ayek","ka'mil","sc'","ik'yir","yol","kig","k'zit","'","'","zrk","krg","isk'yet","na'k", "sc'azz","th'sc","nil","n'ahk","sc'yeth","aur'sk","iy'it","azzg","a'","i'","o'","u'","a","i","o","u","zz","kr","ak","nrk","tzzk","bz","xic'","k'lax'","histh") +/datum/language/human/slavic + name = LANGUAGE_SLAVIC + desc = "The official language of the Independent Colonial Confederation of Gilgamesh, originally established in 2122 by the short-lived United Slavic Confederation on Earth." + colour = "solcom" + key = "r" + + syllables = list( + "rus", "zem", "ave", "groz", "ski", "ska", "ven", "konst", "pol", "lin", "svy", + "danya", "da", "mied", "zan", "das", "krem", "myka", "to", "st", "no", "na", "ni", + "ko", "ne", "en", "po", "ra", "li", "on", "byl", "cto", "eni", "ost", "ol", "ego", + "ver", "stv", "pro" + ) + /datum/language/unathi flags = 0 /datum/language/tajaran diff --git a/code/modules/mob/living/bot/SLed209bot.dm b/code/modules/mob/living/bot/SLed209bot.dm new file mode 100644 index 00000000000..7b5bbc76e5d --- /dev/null +++ b/code/modules/mob/living/bot/SLed209bot.dm @@ -0,0 +1,172 @@ +/mob/living/bot/secbot/ed209/slime + name = "SL-ED-209 Security Robot" + desc = "A security robot. He looks less than thrilled." + icon = 'icons/obj/aibots.dmi' + icon_state = "sled2090" + density = 1 + health = 200 + maxHealth = 200 + + is_ranged = 1 + preparing_arrest_sounds = new() + + a_intent = I_HURT + mob_bump_flag = HEAVY + mob_swap_flags = ~HEAVY + mob_push_flags = HEAVY + + used_weapon = /obj/item/weapon/gun/energy/taser/xeno + + stun_strength = 10 + xeno_harm_strength = 9 + req_one_access = list(access_research, access_robotics) + botcard_access = list(access_research, access_robotics, access_xenobiology, access_xenoarch, access_tox, access_tox_storage, access_maint_tunnels) + var/xeno_stun_strength = 6 + +/mob/living/bot/secbot/ed209/slime/update_icons() + if(on && busy) + icon_state = "sled209-c" + else + icon_state = "sled209[on]" + +/mob/living/bot/secbot/ed209/slime/RangedAttack(var/atom/A) + if(last_shot + shot_delay > world.time) + to_chat(src, "You are not ready to fire yet!") + return + + last_shot = world.time + + var/projectile = /obj/item/projectile/beam/stun/xeno + if(emagged) + projectile = /obj/item/projectile/beam/shock + + playsound(loc, emagged ? 'sound/weapons/laser3.ogg' : 'sound/weapons/Taser.ogg', 50, 1) + var/obj/item/projectile/P = new projectile(loc) + + P.firer = src + P.old_style_target(A) + P.fire() + +/mob/living/bot/secbot/ed209/slime/UnarmedAttack(var/mob/living/L, var/proximity) + ..() + + if(istype(L, /mob/living/simple_mob/slime/xenobio)) + var/mob/living/simple_mob/slime/xenobio/S = L + S.slimebatoned(src, xeno_stun_strength) + +// Assembly + +/obj/item/weapon/secbot_assembly/ed209_assembly/slime + name = "SL-ED-209 assembly" + desc = "Some sort of bizarre assembly." + icon = 'icons/obj/aibots.dmi' + icon_state = "ed209_frame" + item_state = "buildpipe" + created_name = "SL-ED-209 Security Robot" + +/obj/item/weapon/secbot_assembly/ed209_assembly/slime/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) // Here in the event it's added into a PoI or some such. Standard construction relies on the standard ED up until taser. + if(istype(W, /obj/item/weapon/pen)) + var/t = sanitizeSafe(input(user, "Enter new robot name", name, created_name), MAX_NAME_LEN) + if(!t) + return + if(!in_range(src, usr) && src.loc != usr) + return + created_name = t + return + + switch(build_step) + if(0, 1) + if(istype(W, /obj/item/robot_parts/l_leg) || istype(W, /obj/item/robot_parts/r_leg) || (istype(W, /obj/item/organ/external/leg) && ((W.name == "robotic right leg") || (W.name == "robotic left leg")))) + user.drop_item() + qdel(W) + build_step++ + to_chat(user, "You add the robot leg to [src].") + name = "legs/frame assembly" + if(build_step == 1) + icon_state = "ed209_leg" + else + icon_state = "ed209_legs" + + if(2) + if(istype(W, /obj/item/clothing/suit/storage/vest)) + user.drop_item() + qdel(W) + build_step++ + to_chat(user, "You add the armor to [src].") + name = "vest/legs/frame assembly" + item_state = "ed209_shell" + icon_state = "ed209_shell" + + if(3) + if(istype(W, /obj/item/weapon/weldingtool)) + var/obj/item/weapon/weldingtool/WT = W + if(WT.remove_fuel(0, user)) + build_step++ + name = "shielded frame assembly" + to_chat(user, "You welded the vest to [src].") + if(4) + if(istype(W, /obj/item/clothing/head/helmet)) + user.drop_item() + qdel(W) + build_step++ + to_chat(user, "You add the helmet to [src].") + name = "covered and shielded frame assembly" + item_state = "ed209_hat" + icon_state = "ed209_hat" + + if(5) + if(isprox(W)) + user.drop_item() + qdel(W) + build_step++ + to_chat(user, "You add the prox sensor to [src].") + name = "covered, shielded and sensored frame assembly" + item_state = "ed209_prox" + icon_state = "ed209_prox" + + if(6) + if(istype(W, /obj/item/stack/cable_coil)) + var/obj/item/stack/cable_coil/C = W + if (C.get_amount() < 1) + to_chat(user, "You need one coil of wire to wire [src].") + return + to_chat(user, "You start to wire [src].") + if(do_after(user, 40) && build_step == 6) + if(C.use(1)) + build_step++ + to_chat(user, "You wire the ED-209 assembly.") + name = "wired ED-209 assembly" + return + + if(7) + if(istype(W, /obj/item/weapon/gun/energy/taser/xeno)) + name = "xenotaser SL-ED-209 assembly" + item_state = "sled209_taser" + icon_state = "sled209_taser" + build_step++ + to_chat(user, "You add [W] to [src].") + user.drop_item() + qdel(W) + + if(8) + if(W.is_screwdriver()) + playsound(src, W.usesound, 100, 1) + var/turf/T = get_turf(user) + to_chat(user, "Now attaching the gun to the frame...") + sleep(40) + if(get_turf(user) == T && build_step == 8) + build_step++ + name = "armed [name]" + to_chat(user, "Taser gun attached.") + + if(9) + if(istype(W, /obj/item/weapon/cell)) + build_step++ + to_chat(user, "You complete the ED-209.") + var/turf/T = get_turf(src) + new /mob/living/bot/secbot/ed209/slime(T,created_name,lasercolor) + user.drop_item() + qdel(W) + user.drop_from_inventory(src) + qdel(src) + diff --git a/code/modules/mob/living/bot/bot.dm b/code/modules/mob/living/bot/bot.dm index ff35a795b5a..6d89980bae8 100644 --- a/code/modules/mob/living/bot/bot.dm +++ b/code/modules/mob/living/bot/bot.dm @@ -53,6 +53,9 @@ access_scanner.req_access = req_access.Copy() access_scanner.req_one_access = req_one_access.Copy() + if(!using_map.bot_patrolling) + will_patrol = FALSE + // Make sure mapped in units start turned on. /mob/living/bot/Initialize() . = ..() @@ -88,13 +91,13 @@ /mob/living/bot/attackby(var/obj/item/O, var/mob/user) if(O.GetID()) - if(access_scanner.allowed(user) && !open && !emagged) + if(access_scanner.allowed(user) && !open) locked = !locked to_chat(user, "Controls are now [locked ? "locked." : "unlocked."]") attack_hand(user) - else if(emagged) - to_chat(user, "ERROR") + to_chat(user, "ERROR! SYSTEMS COMPROMISED!") + else if(open) to_chat(user, "Please close the access panel before locking it.") else @@ -111,7 +114,15 @@ else if(istype(O, /obj/item/weapon/weldingtool)) if(health < getMaxHealth()) if(open) - health = min(getMaxHealth(), health + 10) + if(getBruteLoss() < 10) + bruteloss = 0 + else + bruteloss = bruteloss - 10 + if(getFireLoss() < 10) + fireloss = 0 + else + fireloss = fireloss - 10 + updatehealth() user.visible_message("[user] repairs [src].","You repair [src].") playsound(src, O.usesound, 50, 1) else @@ -119,6 +130,13 @@ else to_chat(user, "[src] does not need a repair.") return + else if(istype(O, /obj/item/device/assembly/prox_sensor) && emagged) + if(open) + to_chat(user, "You repair the bot's systems.") + emagged = 0 + qdel(O) + else + to_chat(user, "Unable to repair with the maintenance panel closed.") else ..() diff --git a/code/modules/mob/living/bot/cleanbot.dm b/code/modules/mob/living/bot/cleanbot.dm index eb2371c3293..b620ca3e1a4 100644 --- a/code/modules/mob/living/bot/cleanbot.dm +++ b/code/modules/mob/living/bot/cleanbot.dm @@ -113,7 +113,8 @@ dat += "Maintenance panel is [open ? "opened" : "closed"]" if(!locked || issilicon(user)) dat += "
      Cleans Blood: [blood ? "Yes" : "No"]
      " - dat += "
      Patrol station: [will_patrol ? "Yes" : "No"]
      " + if(using_map.bot_patrolling) + dat += "
      Patrol station: [will_patrol ? "Yes" : "No"]
      " if(open && !locked) dat += "Odd looking screw twiddled: [screwloose ? "Yes" : "No"]
      " dat += "Weird button pressed: [oddbutton ? "Yes" : "No"]" diff --git a/code/modules/mob/living/bot/ed209bot.dm b/code/modules/mob/living/bot/ed209bot.dm index b8f1c854855..4db5978d0dd 100644 --- a/code/modules/mob/living/bot/ed209bot.dm +++ b/code/modules/mob/living/bot/ed209bot.dm @@ -160,12 +160,30 @@ return if(7) - if(istype(W, /obj/item/weapon/gun/energy/taser)) - name = "taser ED-209 assembly" + if(istype(W, /obj/item/weapon/gun/energy/taser/xeno)) + name = "xenotaser SL-ED-209 assembly" + item_state = "sled209_taser" + icon_state = "sled209_taser" build_step++ to_chat(user, "You add [W] to [src].") + user.drop_item() + qdel(W) + var/turf/T = get_turf(src) + var/obj/item/weapon/secbot_assembly/ed209_assembly/slime/S = new /obj/item/weapon/secbot_assembly/ed209_assembly/slime(T) + S.name = name + S.item_state = item_state + S.icon_state = icon_state + S.build_step = build_step + S.created_name = created_name + user.drop_from_inventory(src) + qdel(src) + + else if(istype(W, /obj/item/weapon/gun/energy/taser)) + name = "taser ED-209 assembly" item_state = "ed209_taser" icon_state = "ed209_taser" + build_step++ + to_chat(user, "You add [W] to [src].") user.drop_item() qdel(W) diff --git a/code/modules/mob/living/bot/edCLNbot.dm b/code/modules/mob/living/bot/edCLNbot.dm index 9b846511659..08d7d9ace62 100644 --- a/code/modules/mob/living/bot/edCLNbot.dm +++ b/code/modules/mob/living/bot/edCLNbot.dm @@ -82,7 +82,8 @@ dat += "Maintenance panel is [open ? "opened" : "closed"]" if(!locked || issilicon(user)) dat += "
      Cleans Blood: [blood ? "Yes" : "No"]
      " - dat += "
      Patrol station: [will_patrol ? "Yes" : "No"]
      " + if(using_map.bot_patrolling) + dat += "
      Patrol station: [will_patrol ? "Yes" : "No"]
      " if(open && !locked) dat += "
      Red Switch: [red_switch ? "On" : "Off"]
      " dat += "
      Green Switch: [green_switch ? "On" : "Off"]
      " diff --git a/code/modules/mob/living/bot/medbot.dm b/code/modules/mob/living/bot/medbot.dm index 4958d607948..f7bac5b82b9 100644 --- a/code/modules/mob/living/bot/medbot.dm +++ b/code/modules/mob/living/bot/medbot.dm @@ -279,6 +279,9 @@ if(!..()) return 0 + if(H.isSynthetic()) // Don't treat FBPs + return 0 + if(H.stat == DEAD) // He's dead, Jim return 0 diff --git a/code/modules/mob/living/bot/secbot.dm b/code/modules/mob/living/bot/secbot.dm index 2372def546d..1210d41e910 100644 --- a/code/modules/mob/living/bot/secbot.dm +++ b/code/modules/mob/living/bot/secbot.dm @@ -1,4 +1,4 @@ -#define SECBOT_WAIT_TIME 5 //number of in-game seconds to wait for someone to surrender +#define SECBOT_WAIT_TIME 3 //Around number*2 real seconds to surrender. #define SECBOT_THREAT_ARREST 4 //threat level at which we decide to arrest someone #define SECBOT_THREAT_ATTACK 8 //threat level at which was assume immediate danger and attack right away @@ -9,18 +9,20 @@ maxHealth = 100 health = 100 req_one_access = list(access_security, access_forensics_lockers) - botcard_access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels) + botcard_access = list(access_security, access_sec_doors, access_forensics_lockers, access_maint_tunnels) patrol_speed = 2 target_speed = 3 var/default_icon_state = "secbot" - var/idcheck = 0 // If true, arrests for having weapons without authorization. - var/check_records = 0 // If true, arrests people without a record. - var/check_arrest = 1 // If true, arrests people who are set to arrest. - var/arrest_type = 0 // If true, doesn't handcuff. You monster. - var/declare_arrests = 0 // If true, announces arrests over sechuds. + var/idcheck = FALSE // If true, arrests for having weapons without authorization. + var/check_records = FALSE // If true, arrests people without a record. + var/check_arrest = TRUE // If true, arrests people who are set to arrest. + var/arrest_type = FALSE // If true, doesn't handcuff. You monster. + var/declare_arrests = FALSE // If true, announces arrests over sechuds. + var/threat = 0 // How much of a threat something is. Set upon acquiring a target. + var/attacked = FALSE // If true, gives the bot enough threat assessment to attack immediately. - var/is_ranged = 0 + var/is_ranged = FALSE var/awaiting_surrender = 0 var/can_next_insult = 0 // Uses world.time var/stun_strength = 60 // For humans. @@ -32,20 +34,25 @@ var/list/threat_found_sounds = list('sound/voice/bcriminal.ogg', 'sound/voice/bjustice.ogg', 'sound/voice/bfreeze.ogg') var/list/preparing_arrest_sounds = list('sound/voice/bgod.ogg', 'sound/voice/biamthelaw.ogg', 'sound/voice/bsecureday.ogg', 'sound/voice/bradio.ogg', 'sound/voice/bcreep.ogg') var/list/fighting_sounds = list('sound/voice/biamthelaw.ogg', 'sound/voice/bradio.ogg', 'sound/voice/bjustice.ogg') -//VOREStation Add - They don't like being pulled. This is going to fuck with slimesky, but meh. +//VOREStation Add - They don't like being pulled. This is going to fuck with slimesky, but meh. //Screw you. Just screw you and your 'meh' /mob/living/bot/secbot/Life() ..() if(health > 0 && on && pulledby) if(isliving(pulledby)) - var/mob/living/L = pulledby - UnarmedAttack(L) - say("Do not interfere with active law enforcement routines!") - global_announcer.autosay("[src] was interfered with in [get_area(src)], activating defense routines.", "[src]", "Security") + var/pull_allowed = FALSE + for(var/A in req_one_access) + if(A in pulledby.GetAccess()) + pull_allowed = TRUE + if(!pull_allowed) + var/mob/living/L = pulledby + UnarmedAttack(L) + say("Do not interfere with active law enforcement routines!") + global_announcer.autosay("[src] was interfered with in [get_area(src)], activating defense routines.", "[src]", "Security") //VOREStation Add End /mob/living/bot/secbot/beepsky name = "Officer Beepsky" desc = "It's Officer Beep O'sky! Powered by a potato and a shot of whiskey." - will_patrol = 1 + will_patrol = TRUE /mob/living/bot/secbot/slime name = "Slime Securitron" @@ -88,7 +95,8 @@ dat += "Check Arrest Status: [check_arrest ? "Yes" : "No"]
      " dat += "Operating Mode: [arrest_type ? "Detain" : "Arrest"]
      " dat += "Report Arrests: [declare_arrests ? "Yes" : "No"]
      " - dat += "Auto Patrol: [will_patrol ? "On" : "Off"]" + if(using_map.bot_patrolling) + dat += "Auto Patrol: [will_patrol ? "On" : "Off"]" var/datum/browser/popup = new(user, "autosec", "Securitron controls") popup.set_content(jointext(dat,null)) popup.open() @@ -126,18 +134,18 @@ . = ..() if(!emagged) if(user) - user << "\The [src] buzzes and beeps." - emagged = 1 + to_chat(user, "\The [src] buzzes and beeps.") + emagged = TRUE patrol_speed = 3 target_speed = 4 - return 1 + return TRUE else - user << "\The [src] is already corrupt." + to_chat(user, "\The [src] is already corrupt.") /mob/living/bot/secbot/attackby(var/obj/item/O, var/mob/user) var/curhealth = health . = ..() - if(health < curhealth && on == 1) + if(health < curhealth && on == TRUE) react_to_attack(user) /mob/living/bot/secbot/bullet_act(var/obj/item/projectile/P) @@ -154,18 +162,21 @@ ..() /mob/living/bot/secbot/proc/react_to_attack(mob/attacker) + if(!on) // We don't want it to react if it's off + return + if(!target) playsound(src.loc, pick(threat_found_sounds), 50) global_announcer.autosay("[src] was attacked by a hostile [target_name(attacker)] in [get_area(src)].", "[src]", "Security") target = attacker - awaiting_surrender = INFINITY // Don't try and wait for surrender + attacked = TRUE // Say "freeze!" and demand surrender /mob/living/bot/secbot/proc/demand_surrender(mob/target, var/threat) var/suspect_name = target_name(target) if(declare_arrests) global_announcer.autosay("[src] is [arrest_type ? "detaining" : "arresting"] a level [threat] suspect [suspect_name] in [get_area(src)].", "[src]", "Security") - say("Down on the floor, [suspect_name]! You have [SECBOT_WAIT_TIME] seconds to comply.") + say("Down on the floor, [suspect_name]! You have [SECBOT_WAIT_TIME*2] seconds to comply.") playsound(src.loc, pick(preparing_arrest_sounds), 50) // Register to be told when the target moves GLOB.moved_event.register(target, src, /mob/living/bot/secbot/proc/target_moved) @@ -179,7 +190,8 @@ /mob/living/bot/secbot/resetTarget() ..() GLOB.moved_event.unregister(target, src) - awaiting_surrender = -1 + awaiting_surrender = 0 + attacked = FALSE walk_to(src, 0) /mob/living/bot/secbot/startPatrol() @@ -189,17 +201,18 @@ /mob/living/bot/secbot/confirmTarget(var/atom/A) if(!..()) - return 0 - return (check_threat(A) >= SECBOT_THREAT_ARREST) + return FALSE + check_threat(A) + if(threat >= SECBOT_THREAT_ARREST) + return TRUE /mob/living/bot/secbot/lookForTargets() for(var/mob/living/M in view(src)) if(M.stat == DEAD) continue if(confirmTarget(M)) - var/threat = check_threat(M) target = M - awaiting_surrender = -1 + awaiting_surrender = 0 say("Level [threat] infraction alert!") custom_emote(1, "points at [M.name]!") playsound(src.loc, pick(threat_found_sounds), 50) @@ -207,15 +220,15 @@ /mob/living/bot/secbot/handleAdjacentTarget() var/mob/living/carbon/human/H = target - var/threat = check_threat(target) + check_threat(target) if(awaiting_surrender < SECBOT_WAIT_TIME && istype(H) && !H.lying && threat < SECBOT_THREAT_ATTACK) - if(awaiting_surrender == -1) // On first tick of awaiting... + if(awaiting_surrender == 0) // On first tick of awaiting... demand_surrender(target, threat) ++awaiting_surrender else if(declare_arrests) var/action = arrest_type ? "detaining" : "arresting" - if(istype(target, /mob/living/simple_mob)) + if(!ishuman(target)) action = "fighting" global_announcer.autosay("[src] is [action] a level [threat] [action != "fighting" ? "suspect" : "threat"] [target_name(target)] in [get_area(src)].", "[src]", "Security") UnarmedAttack(target) @@ -224,7 +237,6 @@ /mob/living/bot/secbot/proc/insult(var/mob/living/L) if(can_next_insult > world.time) return - var/threat = check_threat(L) if(threat >= 10) playsound(src.loc, 'sound/voice/binsult.ogg', 75) can_next_insult = world.time + 20 SECONDS @@ -240,47 +252,47 @@ if(!istype(M)) return - if(istype(M, /mob/living/carbon)) - var/mob/living/carbon/C = M - var/cuff = 1 - if(istype(C, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = C - if(istype(H.back, /obj/item/weapon/rig) && istype(H.gloves,/obj/item/clothing/gloves/gauntlets/rig)) - cuff = 0 - if(!C.lying || C.handcuffed || arrest_type) - cuff = 0 + if(ishuman(M)) + var/mob/living/carbon/human/H = M + var/cuff = TRUE + + if(!H.lying || H.handcuffed || arrest_type) + cuff = FALSE if(!cuff) - C.stun_effect_act(0, stun_strength, null) + H.stun_effect_act(0, stun_strength, null) playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1) - do_attack_animation(C) - busy = 1 + do_attack_animation(H) + busy = TRUE update_icons() spawn(2) - busy = 0 + busy = FALSE update_icons() - visible_message("\The [C] was prodded by \the [src] with a stun baton!") - insult(C) + visible_message("\The [H] was prodded by \the [src] with a stun baton!") + insult(H) else playsound(loc, 'sound/weapons/handcuffs.ogg', 30, 1, -2) - visible_message("\The [src] is trying to put handcuffs on \the [C]!") - busy = 1 - if(do_mob(src, C, 60)) - if(!C.handcuffed) - C.handcuffed = new /obj/item/weapon/handcuffs(C) - C.update_inv_handcuffed() - busy = 0 - else if(istype(M, /mob/living/simple_mob)) - var/mob/living/simple_mob/S = M - S.adjustBruteLoss(xeno_harm_strength) + visible_message("\The [src] is trying to put handcuffs on \the [H]!") + busy = TRUE + if(do_mob(src, H, 60)) + if(!H.handcuffed) + if(istype(H.back, /obj/item/weapon/rig) && istype(H.gloves,/obj/item/clothing/gloves/gauntlets/rig)) + H.handcuffed = new /obj/item/weapon/handcuffs/cable(H) // Better to be cable cuffed than stun-locked + else + H.handcuffed = new /obj/item/weapon/handcuffs(H) + H.update_inv_handcuffed() + busy = FALSE + else if(istype(M, /mob/living)) + var/mob/living/L = M + L.adjustBruteLoss(xeno_harm_strength) do_attack_animation(M) playsound(loc, "swing_hit", 50, 1, -1) - busy = 1 + busy = TRUE update_icons() spawn(2) - busy = 0 + busy = FALSE update_icons() visible_message("\The [M] was beaten by \the [src] with a stun baton!") - insult(S) + insult(L) /mob/living/bot/secbot/slime/UnarmedAttack(var/mob/living/L, var/proximity) ..() @@ -289,8 +301,6 @@ var/mob/living/simple_mob/slime/xenobio/S = L S.slimebatoned(src, xeno_stun_strength) - - /mob/living/bot/secbot/explode() visible_message("[src] blows apart!") var/turf/Tsec = get_turf(src) @@ -319,12 +329,15 @@ /mob/living/bot/secbot/proc/check_threat(var/mob/living/M) if(!M || !istype(M) || M.stat == DEAD || src == M) - return 0 + threat = 0 - if(emagged && !M.incapacitated()) //check incapacitated so emagged secbots don't keep attacking the same target forever - return 10 + else if(emagged && !M.incapacitated()) //check incapacitated so emagged secbots don't keep attacking the same target forever + threat = 10 - return M.assess_perp(access_scanner, 0, idcheck, check_records, check_arrest) + else + threat = M.assess_perp(access_scanner, 0, idcheck, check_records, check_arrest) // Set base threat level + if(attacked) + threat += SECBOT_THREAT_ATTACK // Increase enough so we can attack immediately in return //Secbot Construction @@ -367,12 +380,12 @@ if(WT.remove_fuel(0, user)) build_step = 1 overlays += image('icons/obj/aibots.dmi', "hs_hole") - user << "You weld a hole in \the [src]." + to_chat(user, "You weld a hole in \the [src].") else if(isprox(W) && (build_step == 1)) user.drop_item() build_step = 2 - user << "You add \the [W] to [src]." + to_chat(user, "You add \the [W] to [src].") overlays += image('icons/obj/aibots.dmi', "hs_eye") name = "helmet/signaler/prox sensor assembly" qdel(W) @@ -380,14 +393,14 @@ else if((istype(W, /obj/item/robot_parts/l_arm) || istype(W, /obj/item/robot_parts/r_arm) || (istype(W, /obj/item/organ/external/arm) && ((W.name == "robotic right arm") || (W.name == "robotic left arm")))) && build_step == 2) user.drop_item() build_step = 3 - user << "You add \the [W] to [src]." + to_chat(user, "You add \the [W] to [src].") name = "helmet/signaler/prox sensor/robot arm assembly" overlays += image('icons/obj/aibots.dmi', "hs_arm") qdel(W) else if(istype(W, /obj/item/weapon/melee/baton) && build_step == 3) user.drop_item() - user << "You complete the Securitron! Beep boop." + to_chat(user, "You complete the Securitron! Beep boop.") if(istype(W, /obj/item/weapon/melee/baton/slime)) var/mob/living/bot/secbot/slime/S = new /mob/living/bot/secbot/slime(get_turf(src)) S.name = created_name @@ -401,6 +414,6 @@ var/t = sanitizeSafe(input(user, "Enter new robot name", name, created_name), MAX_NAME_LEN) if(!t) return - if(!in_range(src, usr) && loc != usr) + if(!in_range(src, user) && loc != user) return - created_name = t + created_name = t \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/ai_controlled/ai_controlled.dm b/code/modules/mob/living/carbon/human/ai_controlled/ai_controlled.dm new file mode 100644 index 00000000000..431b7c44561 --- /dev/null +++ b/code/modules/mob/living/carbon/human/ai_controlled/ai_controlled.dm @@ -0,0 +1,143 @@ +/mob/living/carbon/human/ai_controlled + name = "Nameless Joe" + + ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive + + var/generate_species = SPECIES_HUMAN + var/generate_dead = FALSE + + var/generate_gender = FALSE + var/generate_id_gender = FALSE + + var/to_wear_hair = "Bald" + + var/to_wear_helmet = /obj/item/clothing/head/welding + var/to_wear_glasses = /obj/item/clothing/glasses/threedglasses + var/to_wear_mask = /obj/item/clothing/mask/gas + var/to_wear_l_radio = /obj/item/device/radio/headset + var/to_wear_r_radio = null + var/to_wear_uniform = /obj/item/clothing/under/color/grey + var/to_wear_suit = /obj/item/clothing/suit/armor/material/makeshift/glass + var/to_wear_gloves = /obj/item/clothing/gloves/ring/material/platinum + var/to_wear_shoes = /obj/item/clothing/shoes/galoshes + var/to_wear_belt = /obj/item/weapon/storage/belt/utility/full + var/to_wear_l_pocket = /obj/item/weapon/soap + var/to_wear_r_pocket = /obj/item/device/pda + var/to_wear_back = /obj/item/weapon/storage/backpack + var/to_wear_id_type = /obj/item/weapon/card/id + var/to_wear_id_job = "Assistant" + + var/to_wear_l_hand = null + var/to_wear_r_hand = /obj/item/weapon/melee/baton + +/mob/living/carbon/human/ai_controlled/Initialize() + if(generate_gender) + gender = pick(list(MALE, FEMALE, PLURAL, NEUTER)) + + if(generate_id_gender) + identifying_gender = pick(list(MALE, FEMALE, PLURAL, NEUTER)) + + ..(loc, generate_species) + + h_style = to_wear_hair + + if(to_wear_uniform) + equip_to_slot_or_del(new to_wear_uniform(src), slot_w_uniform) + + if(to_wear_suit) + equip_to_slot_or_del(new to_wear_suit(src), slot_wear_suit) + + if(to_wear_shoes) + equip_to_slot_or_del(new to_wear_shoes(src), slot_shoes) + + if(to_wear_gloves) + equip_to_slot_or_del(new to_wear_gloves(src), slot_gloves) + + if(to_wear_l_radio) + equip_to_slot_or_del(new to_wear_l_radio(src), slot_l_ear) + + if(to_wear_r_radio) + equip_to_slot_or_del(new to_wear_r_radio(src), slot_r_ear) + + if(to_wear_glasses) + equip_to_slot_or_del(new to_wear_glasses(src), slot_glasses) + + if(to_wear_mask) + equip_to_slot_or_del(new to_wear_mask(src), slot_wear_mask) + + if(to_wear_helmet) + equip_to_slot_or_del(new to_wear_helmet(src), slot_head) + + if(to_wear_belt) + equip_to_slot_or_del(new to_wear_belt(src), slot_belt) + + if(to_wear_r_pocket) + equip_to_slot_or_del(new to_wear_r_pocket(src), slot_r_store) + + if(to_wear_l_pocket) + equip_to_slot_or_del(new to_wear_l_pocket(src), slot_l_store) + + if(to_wear_back) + equip_to_slot_or_del(new to_wear_back(src), slot_back) + + if(to_wear_l_hand) + equip_to_slot_or_del(new to_wear_l_hand(src), slot_l_hand) + + if(to_wear_r_hand) + equip_to_slot_or_del(new to_wear_r_hand(src), slot_r_hand) + + if(to_wear_id_type) + var/obj/item/weapon/card/id/W = new to_wear_id_type(src) + W.name = "[real_name]'s ID Card" + var/datum/job/jobdatum + for(var/jobtype in typesof(/datum/job)) + var/datum/job/J = new jobtype + if(J.title == to_wear_id_job) + jobdatum = J + break + if(jobdatum) + W.access = jobdatum.get_access() + else + W.access = list() + if(to_wear_id_job) + W.assignment = to_wear_id_job + W.registered_name = real_name + equip_to_slot_or_del(W, slot_wear_id) + + if(generate_dead) + death() + +/* + * Subtypes. + */ + +/mob/living/carbon/human/ai_controlled/replicant + generate_species = SPECIES_REPLICANT_BETA + + generate_gender = TRUE + identifying_gender = NEUTER + + faction = "xeno" + + to_wear_helmet = /obj/item/clothing/head/helmet/dermal + to_wear_glasses = /obj/item/clothing/glasses/goggles + to_wear_mask = /obj/item/clothing/mask/gas/half + to_wear_l_radio = /obj/item/device/radio/headset/headset_rob + to_wear_r_radio = null + to_wear_uniform = /obj/item/clothing/under/color/grey + to_wear_suit = /obj/item/clothing/suit/armor/vest + to_wear_gloves = null + to_wear_shoes = /obj/item/clothing/shoes/boots/combat/changeling + to_wear_belt = /obj/item/weapon/storage/belt/utility/full + to_wear_l_pocket = /obj/item/weapon/grenade/explosive/mini + to_wear_r_pocket = /obj/item/weapon/grenade/explosive/mini + to_wear_back = /obj/item/device/radio/electropack + to_wear_id_type = /obj/item/weapon/card/id + to_wear_id_job = "Experiment" + + to_wear_r_hand = null + +/mob/living/carbon/human/ai_controlled/replicant/Initialize() + ..() + name = species.get_random_name(gender) + add_modifier(/datum/modifier/homeothermic, 0, null) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 8c687e8de69..dad9e0f41db 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -295,6 +295,7 @@ msg += attempt_vr(src,"examine_pickup_size",args) //VOREStation Code msg += attempt_vr(src,"examine_step_size",args) //VOREStation Code msg += attempt_vr(src,"examine_nif",args) //VOREStation Code + msg += attempt_vr(src,"examine_chimera",args) //VOREStation Code if(mSmallsize in mutations) msg += "[T.He] [T.is] very short!
      " diff --git a/code/modules/mob/living/carbon/human/examine_vr.dm b/code/modules/mob/living/carbon/human/examine_vr.dm index fd6a4264476..8f12f28d1f8 100644 --- a/code/modules/mob/living/carbon/human/examine_vr.dm +++ b/code/modules/mob/living/carbon/human/examine_vr.dm @@ -155,3 +155,40 @@ /mob/living/carbon/human/proc/examine_nif(mob/living/carbon/human/H) if(nif && nif.examine_msg) //If you have one set, anyway. return "[nif.examine_msg]\n" + +/mob/living/carbon/human/proc/examine_chimera(mob/living/carbon/human/H) + var/t_He = "It" //capitalised for use at the start of each line. + var/t_his = "its" + var/t_His = "Its" + var/t_appear = "appears" + var/t_has = "has" + switch(identifying_gender) //Gender is their "real" gender. Identifying_gender is their "chosen" gender. + if(MALE) + t_He = "He" + t_His = "His" + t_his = "his" + if(FEMALE) + t_He = "She" + t_His = "Her" + t_his = "her" + if(PLURAL) + t_He = "They" + t_His = "Their" + t_his = "their" + t_appear = "appear" + t_has = "have" + if(NEUTER) + t_He = "It" + t_His = "Its" + t_his = "its" + if(HERM) + t_He = "Shi" + t_His = "Hir" + t_his = "hir" + if(revive_ready == REVIVING_NOW || revive_ready == REVIVING_DONE) + if(stat == DEAD) + return "[t_His] body is twitching subtly.\n" + else + return "[t_He] [t_appear] to be in some sort of torpor.\n" + if(feral) + return "[t_He] [t_has] a crazed, wild look in [t_his] eyes!\n" \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index ad0ceb7f624..1d7dd6d57a8 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -8,6 +8,14 @@ return soft_type return src.default_attack // VOREStation Edit - End + if(src.gloves) + var/obj/item/clothing/gloves/G = src.gloves + if(istype(G) && G.special_attack && G.special_attack.is_usable(src, target, hit_zone)) + if(pulling_punches) + var/datum/unarmed_attack/soft_type = G.special_attack.get_sparring_variant() + if(soft_type) + return soft_type + return G.special_attack for(var/datum/unarmed_attack/u_attack in species.unarmed_attacks) if(u_attack.is_usable(src, target, hit_zone)) if(pulling_punches) @@ -41,39 +49,11 @@ H.do_attack_animation(src) playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) visible_message("[H] reaches for [src], but misses!") - return 0 + return FALSE if(H != src && check_shields(0, null, H, H.zone_sel.selecting, H.name)) H.do_attack_animation(src) - return 0 - - if(istype(H.gloves, /obj/item/clothing/gloves/boxing/hologlove)) - H.do_attack_animation(src) - var/damage = rand(0, 9) - if(!damage) - playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - visible_message("[H] has attempted to punch [src]!") - return 0 - var/obj/item/organ/external/affecting = get_organ(ran_zone(H.zone_sel.selecting)) - var/armor_block = run_armor_check(affecting, "melee") - var/armor_soak = get_armor_soak(affecting, "melee") - - if(HULK in H.mutations) - damage += 5 - - playsound(loc, "punch", 25, 1, -1) - - visible_message("[H] has punched [src]!") - - if(armor_soak >= damage) - return - - apply_damage(damage, HALLOSS, affecting, armor_block, armor_soak) - if(damage >= 9) - visible_message("[H] has weakened [src]!") - apply_effect(4, WEAKEN, armor_block) - - return + return FALSE if(istype(M,/mob/living/carbon)) var/mob/living/carbon/C = M @@ -122,7 +102,7 @@ else if(!(M == src && apply_pressure(M, M.zone_sel.selecting))) help_shake_act(M) - return 1 + return TRUE if(I_GRAB) if(M == src || anchored) @@ -149,7 +129,8 @@ //VORESTATION EDIT visible_message("[M] has grabbed [src] [(M.zone_sel.selecting == BP_L_HAND || M.zone_sel.selecting == BP_R_HAND)? "by [(gender==FEMALE)? "her" : ((gender==MALE)? "his": "their")] hands": "passively"]!") //VORESTATION END END - return 1 + + return TRUE if(I_HURT) @@ -175,7 +156,7 @@ if(!affecting || affecting.is_stump()) M << "They are missing that limb!" - return 1 + return TRUE switch(src.a_intent) if(I_HELP) @@ -245,7 +226,10 @@ // See what attack they use var/datum/unarmed_attack/attack = H.get_unarmed_attack(src, hit_zone) if(!attack) - return 0 + return FALSE + + if(attack.unarmed_override(H, src, hit_zone)) + return FALSE H.do_attack_animation(src) if(!attack_message) @@ -258,7 +242,7 @@ add_attack_logs(H,src,"Melee attacked with fists (miss/block)") if(miss_type) - return 0 + return FALSE var/real_damage = rand_damage var/hit_dam_type = attack.damage_type @@ -268,7 +252,7 @@ var/obj/item/clothing/gloves/G = H.gloves real_damage += G.punch_force hit_dam_type = G.punch_damtype - if(H.pulling_punches) //SO IT IS DECREED: PULLING PUNCHES WILL PREVENT THE ACTUAL DAMAGE FROM RINGS AND KNUCKLES, BUT NOT THE ADDED PAIN + if(H.pulling_punches && !attack.sharp && !attack.edge) //SO IT IS DECREED: PULLING PUNCHES WILL PREVENT THE ACTUAL DAMAGE FROM RINGS AND KNUCKLES, BUT NOT THE ADDED PAIN, BUT YOU CAN'T "PULL" A KNIFE hit_dam_type = AGONY real_damage *= damage_multiplier rand_damage *= damage_multiplier @@ -359,7 +343,7 @@ var/armor_soak = get_armor_soak(affecting, armor_type, armor_pen) apply_damage(damage, BRUTE, affecting, armor_block, armor_soak, sharp = a_sharp, edge = a_edge) updatehealth() - return 1 + return TRUE //Used to attack a joint through grabbing /mob/living/carbon/human/proc/grab_joint(var/mob/living/user, var/def_zone) @@ -370,43 +354,43 @@ break if(!has_grab) - return 0 + return FALSE if(!def_zone) def_zone = user.zone_sel.selecting var/target_zone = check_zone(def_zone) if(!target_zone) - return 0 + return FALSE var/obj/item/organ/external/organ = get_organ(check_zone(target_zone)) if(!organ || organ.dislocated > 0 || organ.dislocated == -1) //don't use is_dislocated() here, that checks parent - return 0 + return FALSE user.visible_message("[user] begins to dislocate [src]'s [organ.joint]!") if(do_after(user, 100)) organ.dislocate(1) src.visible_message("[src]'s [organ.joint] [pick("gives way","caves in","crumbles","collapses")]!") - return 1 - return 0 + return TRUE + return FALSE //Breaks all grips and pulls that the mob currently has. /mob/living/carbon/human/proc/break_all_grabs(mob/living/carbon/user) - var/success = 0 + var/success = FALSE if(pulling) visible_message("[user] has broken [src]'s grip on [pulling]!") - success = 1 + success = TRUE stop_pulling() if(istype(l_hand, /obj/item/weapon/grab)) var/obj/item/weapon/grab/lgrab = l_hand if(lgrab.affecting) visible_message("[user] has broken [src]'s grip on [lgrab.affecting]!") - success = 1 + success = TRUE spawn(1) qdel(lgrab) if(istype(r_hand, /obj/item/weapon/grab)) var/obj/item/weapon/grab/rgrab = r_hand if(rgrab.affecting) visible_message("[user] has broken [src]'s grip on [rgrab.affecting]!") - success = 1 + success = TRUE spawn(1) qdel(rgrab) return success @@ -421,11 +405,11 @@ /mob/living/carbon/human/proc/apply_pressure(mob/living/user, var/target_zone) var/obj/item/organ/external/organ = get_organ(target_zone) if(!organ || !(organ.status & ORGAN_BLEEDING) || (organ.robotic >= ORGAN_ROBOT)) - return 0 + return FALSE if(organ.applied_pressure) user << "Someone is already applying pressure to [user == src? "your [organ.name]" : "[src]'s [organ.name]"]." - return 0 + return FALSE var/datum/gender/TU = gender_datums[user.get_visible_gender()] @@ -446,4 +430,4 @@ else user.visible_message("\The [user] stops applying pressure to [src]'s [organ.name]!", "You stop applying pressure to [src]'s [organ.name]!") - return 1 + return TRUE diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index 28de4d6d933..1f211fe95b7 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -1,5 +1,6 @@ //Updates the mob's health from organs and mob damage variables /mob/living/carbon/human/updatehealth() + var/huskmodifier = 1.5 // With 1.5, you need 250 burn instead of 200 to husk a human. if(status_flags & GODMODE) health = getMaxHealth() @@ -17,7 +18,7 @@ health = getMaxHealth() - getOxyLoss() - getToxLoss() - getCloneLoss() - total_burn - total_brute //TODO: fix husking - if( ((getMaxHealth() - total_burn) < config.health_threshold_dead) && stat == DEAD) + if( ((getMaxHealth() - total_burn) < config.health_threshold_dead * huskmodifier) && stat == DEAD) ChangeToHusk() return diff --git a/code/modules/mob/living/carbon/human/human_defines_vr.dm b/code/modules/mob/living/carbon/human/human_defines_vr.dm index f856e4ab399..0af0b1f7d18 100644 --- a/code/modules/mob/living/carbon/human/human_defines_vr.dm +++ b/code/modules/mob/living/carbon/human/human_defines_vr.dm @@ -7,3 +7,6 @@ var/flapping = 0 var/vantag_pref = VANTAG_NONE //What's my status? var/impersonate_bodytype //For impersonating a bodytype + + //TFF 5/8/19 - add and set suit sensor setting define to 5 for random setting + var/sensorpref = 5 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human_organs.dm b/code/modules/mob/living/carbon/human/human_organs.dm index 6c1311fa417..96005d74075 100644 --- a/code/modules/mob/living/carbon/human/human_organs.dm +++ b/code/modules/mob/living/carbon/human/human_organs.dm @@ -86,7 +86,7 @@ var/obj/item/organ/external/E = organs_by_name[limb_tag] if(!E || !E.is_usable()) stance_damage += 2 // let it fail even if just foot&leg - else if (E.is_malfunctioning()) + else if (E.is_malfunctioning() && !(lying || resting)) //malfunctioning only happens intermittently so treat it as a missing limb when it procs stance_damage += 2 if(isturf(loc) && prob(10)) diff --git a/code/modules/mob/living/carbon/human/human_powers.dm b/code/modules/mob/living/carbon/human/human_powers.dm index 809a5ef8ade..a3c5e654701 100644 --- a/code/modules/mob/living/carbon/human/human_powers.dm +++ b/code/modules/mob/living/carbon/human/human_powers.dm @@ -286,8 +286,11 @@ nutrition -= 200 for(var/obj/item/organ/I in internal_organs) + if(I.robotic >= ORGAN_ROBOT) // No free robofix. + continue if(I.damage > 0) I.damage = max(I.damage - 30, 0) //Repair functionally half of a dead internal organ. + I.status = 0 // Wipe status, as it's being regenerated from possibly dead. to_chat(src, "You feel a soothing sensation within your [I.name]...") // Replace completely missing limbs. @@ -310,6 +313,15 @@ var/agony_to_apply = round(0.66 * O.max_damage) // 66% of the limb's health is converted into pain. src.apply_damage(agony_to_apply, HALLOSS) + for(var/organtype in species.has_organ) // Replace completely missing internal organs. -After- external ones, so they all should exist. + if(!src.internal_organs_by_name[organtype]) + var/organpath = species.has_organ[organtype] + var/obj/item/organ/Int = new organpath(src, TRUE) + + Int.rejuvenate(TRUE) + + handle_organs() // Update everything + update_icons_body() active_regen = FALSE else diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index cb63df8d563..bfa1d82e374 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -923,7 +923,7 @@ overeatduration -= 2 //doubled the unfat rate if(noisy == TRUE && nutrition < 250 && prob(10)) //VOREStation edit for hunger noises. - var/growlsound = pick(hunger_sounds) + var/sound/growlsound = sound(get_sfx("hunger_sounds")) var/growlmultiplier = 100 - (nutrition / 250 * 100) playsound(src, growlsound, vol = growlmultiplier, vary = 1, falloff = 0.1, ignore_walls = TRUE, preference = /datum/client_preference/digestion_noises) // VOREStation Edit End diff --git a/code/modules/mob/living/carbon/human/species/species_vr.dm b/code/modules/mob/living/carbon/human/species/species_vr.dm index 63f02a5af8e..1d0a73d6692 100644 --- a/code/modules/mob/living/carbon/human/species/species_vr.dm +++ b/code/modules/mob/living/carbon/human/species/species_vr.dm @@ -17,6 +17,7 @@ var/wing var/wing_animation var/icobase_wing + var/wikilink = null //link to wiki page for species /datum/species/proc/update_attack_types() unarmed_attacks = list() diff --git a/code/modules/mob/living/carbon/human/species/station/prometheans.dm b/code/modules/mob/living/carbon/human/species/station/prometheans.dm index a14db9d9f50..dea6b254fad 100644 --- a/code/modules/mob/living/carbon/human/species/station/prometheans.dm +++ b/code/modules/mob/living/carbon/human/species/station/prometheans.dm @@ -47,7 +47,7 @@ var/datum/species/shapeshifter/promethean/prometheans economic_modifier = 3 - //gluttonous = 1 // VOREStation Edit. Redundant feature. + gluttonous = 1 virus_immune = 1 blood_volume = 560 brute_mod = 0.75 @@ -74,7 +74,13 @@ var/datum/species/shapeshifter/promethean/prometheans genders = list(MALE, FEMALE, NEUTER, PLURAL) unarmed_types = list(/datum/unarmed_attack/slime_glomp) - has_organ = list(O_BRAIN = /obj/item/organ/internal/brain/slime) // Slime core. + + has_organ = list(O_BRAIN = /obj/item/organ/internal/brain/slime, + O_HEART = /obj/item/organ/internal/heart/grey/colormatch/slime, + O_REGBRUTE = /obj/item/organ/internal/regennetwork, + O_REGBURN = /obj/item/organ/internal/regennetwork/burn, + O_REGOXY = /obj/item/organ/internal/regennetwork/oxy, + O_REGTOX = /obj/item/organ/internal/regennetwork/tox) dispersed_eyes = TRUE @@ -168,15 +174,40 @@ var/datum/species/shapeshifter/promethean/prometheans H.adjustToxLoss(3 * heal_rate) // Tripled because 0.5 is miniscule, and fire_stacks are capped in both directions healing = FALSE + //Prometheans automatically clean every surface they're in contact with every life tick - this includes the floor without shoes. + //They gain nutrition from doing this. var/turf/T = get_turf(H) if(istype(T)) - var/obj/effect/decal/cleanable/C = locate() in T - if(C && !(H.shoes || (H.wear_suit && (H.wear_suit.body_parts_covered & FEET)))) - qdel(C) + if(!(H.shoes || (H.wear_suit && (H.wear_suit.body_parts_covered & FEET)))) + for(var/obj/O in T) + O.clean_blood() + H.nutrition = min(500, max(0, H.nutrition + rand(5, 15))) if (istype(T, /turf/simulated)) var/turf/simulated/S = T + T.clean_blood() S.dirt = 0 + H.nutrition = max(H.nutrition, min(500, H.nutrition + rand(15, 30))) //VOREStation Edit: Gives nutrition up to a point instead of being capped + if(H.clean_blood(1)) H.nutrition = max(H.nutrition, min(500, H.nutrition + rand(15, 30))) //VOREStation Edit: Gives nutrition up to a point instead of being capped + if(H.r_hand) + if(H.r_hand.clean_blood()) + H.nutrition = max(H.nutrition, min(500, H.nutrition + rand(15, 30))) //VOREStation Edit: Gives nutrition up to a point instead of being capped + if(H.l_hand) + if(H.l_hand.clean_blood()) + H.nutrition = max(H.nutrition, min(500, H.nutrition + rand(15, 30))) //VOREStation Edit: Gives nutrition up to a point instead of being capped + if(H.head) + if(H.head.clean_blood()) + H.update_inv_head(0) + H.nutrition = max(H.nutrition, min(500, H.nutrition + rand(15, 30))) //VOREStation Edit: Gives nutrition up to a point instead of being capped + if(H.wear_suit) + if(H.wear_suit.clean_blood()) + H.update_inv_wear_suit(0) + H.nutrition = max(H.nutrition, min(500, H.nutrition + rand(15, 30))) //VOREStation Edit: Gives nutrition up to a point instead of being capped + if(H.w_uniform) + if(H.w_uniform.clean_blood()) + H.update_inv_w_uniform(0) + H.nutrition = max(H.nutrition, min(500, H.nutrition + rand(15, 30))) //VOREStation Edit: Gives nutrition up to a point instead of being capped + //End cleaning code. var/datum/gas_mixture/environment = T.return_air() var/pressure = environment.return_pressure() @@ -197,35 +228,71 @@ var/datum/species/shapeshifter/promethean/prometheans var/nutrition_cost = 0 // The total amount of nutrition drained every tick, when healing var/nutrition_debt = 0 // Holder variable used to store previous damage values prior to healing for use in the nutrition_cost equation. var/starve_mod = 1 // Lowering this lowers healing and increases agony multiplicatively. - if(H.nutrition <= 150) // This is when the icon goes red + + var/strain_negation = 0 // How much agony is being prevented by the + + if(H.nutrition <= 150) // This is when the icon goes red starve_mod = 0.75 if(H.nutrition <= 50) // Severe starvation. Damage repaired beyond this point will cause a stunlock if untreated. starve_mod = 0.5 + var/to_pay = 0 if(regen_brute) nutrition_debt = H.getBruteLoss() H.adjustBruteLoss(-heal_rate * starve_mod) - nutrition_cost += nutrition_debt - H.getBruteLoss() + + to_pay = nutrition_debt - H.getBruteLoss() + + nutrition_cost += to_pay + + var/obj/item/organ/internal/regennetwork/BrReg = H.internal_organs_by_name[O_REGBRUTE] + + if(BrReg) + strain_negation += to_pay * max(0, (1 - BrReg.get_strain_percent())) if(regen_burn) nutrition_debt = H.getFireLoss() H.adjustFireLoss(-heal_rate * starve_mod) - nutrition_cost += nutrition_debt - H.getFireLoss() + + to_pay = nutrition_debt - H.getFireLoss() + + nutrition_cost += to_pay + + var/obj/item/organ/internal/regennetwork/BuReg = H.internal_organs_by_name[O_REGBURN] + + if(BuReg) + strain_negation += to_pay * max(0, (1 - BuReg.get_strain_percent())) if(regen_oxy) nutrition_debt = H.getOxyLoss() H.adjustOxyLoss(-heal_rate * starve_mod) - nutrition_cost += nutrition_debt - H.getOxyLoss() + + to_pay = nutrition_debt - H.getOxyLoss() + + nutrition_cost += to_pay + + var/obj/item/organ/internal/regennetwork/OxReg = H.internal_organs_by_name[O_REGOXY] + + if(OxReg) + strain_negation += to_pay * max(0, (1 - OxReg.get_strain_percent())) if(regen_tox) nutrition_debt = H.getToxLoss() H.adjustToxLoss(-heal_rate * starve_mod) - nutrition_cost += nutrition_debt - H.getToxLoss() + + to_pay = nutrition_debt - H.getToxLoss() + + nutrition_cost += to_pay + + var/obj/item/organ/internal/regennetwork/ToxReg = H.internal_organs_by_name[O_REGTOX] + + if(ToxReg) + strain_negation += to_pay * max(0, (1 - ToxReg.get_strain_percent())) H.nutrition -= (3 * nutrition_cost) //Costs Nutrition when damage is being repaired, corresponding to the amount of damage being repaired. H.nutrition = max(0, H.nutrition) //Ensure it's not below 0. - var/agony_to_apply = ((1 / starve_mod) * nutrition_cost) //Regenerating damage causes minor pain over time. Small injures will be no issue, large ones will cause problems. + var/agony_to_apply = ((1 / starve_mod) * (nutrition_cost - strain_negation)) //Regenerating damage causes minor pain over time, if the organs responsible are nonexistant or too high on strain. Small injures will be no issue, large ones will cause problems. if((starve_mod <= 0.5 && (H.getHalLoss() + agony_to_apply) <= 90) || ((H.getHalLoss() + agony_to_apply) <= 70)) // Will max out at applying halloss at 70, unless they are starving; starvation regeneration will bring them up to a maximum of 120, the same amount of agony a human receives from three taser hits. H.apply_damage(agony_to_apply, HALLOSS) diff --git a/code/modules/mob/living/carbon/human/species/station/prometheans_vr.dm b/code/modules/mob/living/carbon/human/species/station/prometheans_vr.dm index 6204f4d5ba6..b1aa9044214 100644 --- a/code/modules/mob/living/carbon/human/species/station/prometheans_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/prometheans_vr.dm @@ -1,6 +1,9 @@ /datum/species/shapeshifter/promethean min_age = 18 //Required for server rules max_age = 80 + push_flags = ~HEAVY + swap_flags = ~HEAVY + gluttonous = 0 valid_transform_species = list( "Human", "Unathi", "Tajara", "Skrell", "Diona", "Teshari", "Monkey","Sergal", diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm index ae012790cc9..6e829897803 100644 --- a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm +++ b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm @@ -36,6 +36,7 @@ max_n2 = 0 minbodytemp = 0 maxbodytemp = 900 + movement_cooldown = 0 var/mob/living/carbon/human/humanform var/obj/item/organ/internal/nano/refactory/refactory @@ -200,7 +201,7 @@ target.forceMove(vore_selected) to_chat(target,"\The [src] quickly engulfs you, [vore_selected.vore_verb]ing you into their [vore_selected.name]!") -/mob/living/simple_mob/protean_blob/attack_hand(var/atom/A) //VORESTATION AI TEMPORARY REMOVAL (Marking this as such even though it was an edit.) +/mob/living/simple_mob/protean_blob/attack_target(var/atom/A) if(refactory && istype(A,/obj/item/stack/material)) var/obj/item/stack/material/S = A var/substance = S.material.name @@ -346,8 +347,7 @@ var/atom/reform_spot = blob.drop_location() //Size update - transform = matrix()*blob.size_multiplier - size_multiplier = blob.size_multiplier + resize(blob.size_multiplier, FALSE) //Move them back where the blob was forceMove(reform_spot) diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm index 3b7f99c8e71..4172a4be3b6 100644 --- a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm +++ b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm @@ -200,7 +200,7 @@ var/obj/item/stack/material/matstack = held var/substance = matstack.material.name - var/list/edible_materials = list("steel", "plasteel", "diamond", "mhydrogen") //Can't eat all materials, just useful ones. + var/list/edible_materials = list(MAT_STEEL, MAT_SILVER, MAT_GOLD, MAT_URANIUM, MAT_METALHYDROGEN) //Can't eat all materials, just useful ones. var allowed = FALSE for(var/material in edible_materials) if(material == substance) allowed = TRUE @@ -298,14 +298,14 @@ //Sizing up if(cost > 0) - if(refactory.use_stored_material("steel",cost)) + if(refactory.use_stored_material(MAT_STEEL,cost)) user.resize(size_factor) else to_chat(user,"That size change would cost [cost] steel, which you don't have.") //Sizing down (or not at all) else if(cost <= 0) cost = abs(cost) - var/actually_added = refactory.add_stored_material("steel",cost) + var/actually_added = refactory.add_stored_material(MAT_STEEL,cost) user.resize(size_factor) if(actually_added != cost) to_chat(user,"Unfortunately, [cost-actually_added] steel was lost due to lack of storage space.") diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm index 58f7ef5284d..0d2000fa01a 100755 --- a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm +++ b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm @@ -1,5 +1,5 @@ #define DAM_SCALE_FACTOR 0.01 -#define METAL_PER_TICK 150 +#define METAL_PER_TICK 100 /datum/species/protean name = SPECIES_PROTEAN name_plural = "Proteans" @@ -17,7 +17,7 @@ flags = NO_SCAN | NO_SLIP | NO_MINOR_CUT | NO_HALLUCINATION | NO_INFECT | NO_PAIN appearance_flags = HAS_SKIN_COLOR | HAS_EYE_COLOR | HAS_HAIR_COLOR | HAS_UNDERWEAR | HAS_LIPS - spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED + spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE health_hud_intensity = 2 num_alternate_languages = 3 assisted_langs = list(LANGUAGE_ROOTLOCAL, LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX) @@ -30,9 +30,10 @@ blood_volume = 0 min_age = 18 max_age = 200 - brute_mod = 0.2 //Brute isn't very effective, they're made of dust - burn_mod = 2.0 //Burn, however, is + brute_mod = 1 + burn_mod = 1.4 oxy_mod = 0 + item_slowdown_mod = 1.33 cold_level_1 = 280 //Default 260 - Lower is better cold_level_2 = 220 //Default 200 @@ -42,8 +43,7 @@ heat_level_2 = 370 //Default 400 heat_level_3 = 600 //Default 1000 - //Space doesn't bother them - hazard_low_pressure = -1 + hazard_low_pressure = -1 //Space doesn't bother them hazard_high_pressure = 200 //They can cope with slightly higher pressure //Cold/heat does affect them, but it's done in special ways below @@ -56,11 +56,9 @@ body_temperature = 290 - siemens_coefficient = 3 //Very bad zappy times + siemens_coefficient = 1.5 //Very bad zappy times rarity_value = 5 - darksight = 3 // Equivalent to the minor trait - has_organ = list( O_BRAIN = /obj/item/organ/internal/mmi_holder/posibrain/nano, O_ORCH = /obj/item/organ/internal/nano/orchestrator, @@ -98,7 +96,8 @@ /mob/living/carbon/human/proc/shapeshifter_select_gender, /mob/living/carbon/human/proc/shapeshifter_select_wings, /mob/living/carbon/human/proc/shapeshifter_select_tail, - /mob/living/carbon/human/proc/shapeshifter_select_ears + /mob/living/carbon/human/proc/shapeshifter_select_ears, + /mob/living/proc/eat_trash ) var/global/list/abilities = list() @@ -161,7 +160,7 @@ return rgb(80,80,80,230) /datum/species/protean/handle_death(var/mob/living/carbon/human/H) - to_chat(H,"You died as a Protean. Please sit out of the round for at least 30 minutes before respawning, to represent the time it would take to ship a new-you to the station.") + to_chat(H,"You died as a Protean. Please sit out of the round for at least 60 minutes before respawning, to represent the time it would take to ship a new-you to the station.") spawn(1) //This spawn is here so that if the protean_blob calls qdel, it doesn't try to gib the humanform. if(H) H.gib() @@ -175,16 +174,20 @@ if(refactory && !(refactory.status & ORGAN_DEAD)) //MHydrogen adds speeeeeed - if(refactory.get_stored_material("mhydrogen") >= METAL_PER_TICK) + if(refactory.get_stored_material(MAT_METALHYDROGEN) >= METAL_PER_TICK) H.add_modifier(/datum/modifier/protean/mhydrogen, origin = refactory) - //Plasteel adds brute armor - if(refactory.get_stored_material("plasteel") >= METAL_PER_TICK) - H.add_modifier(/datum/modifier/protean/plasteel, origin = refactory) + //Uranium adds brute armor + if(refactory.get_stored_material(MAT_URANIUM) >= METAL_PER_TICK) + H.add_modifier(/datum/modifier/protean/uranium, origin = refactory) - //Diamond adds burn armor - if(refactory.get_stored_material("diamond") >= METAL_PER_TICK) - H.add_modifier(/datum/modifier/protean/diamond, origin = refactory) + //Gold adds burn armor + if(refactory.get_stored_material(MAT_GOLD) >= METAL_PER_TICK) + H.add_modifier(/datum/modifier/protean/gold, origin = refactory) + + //Silver adds darksight + if(refactory.get_stored_material(MAT_SILVER) >= METAL_PER_TICK) + H.add_modifier(/datum/modifier/protean/silver, origin = refactory) return ..() @@ -246,31 +249,43 @@ on_created_text = "You feel yourself accelerate, the metallic hydrogen increasing your speed temporarily." on_expired_text = "Your refactory finishes consuming the metallic hydrogen, and you return to normal speed." - material_name = "mhydrogen" + material_name = MAT_METALHYDROGEN slowdown = -1 -/datum/modifier/protean/plasteel - name = "Protean Effect - Plasteel" - desc = "You're affected by the presence of plasteel." +/datum/modifier/protean/uranium + name = "Protean Effect - Uranium" + desc = "You're affected by the presence of uranium." - on_created_text = "You feel yourself become nearly impervious to physical attacks as plasteel nanites are made." - on_expired_text = "Your refactory finishes consuming the plasteel, and you return to your normal nanites." + on_created_text = "You feel yourself become nearly impervious to physical attacks as uranium is incorporated in your nanites." + on_expired_text = "Your refactory finishes consuming the uranium, and you return to your normal nanites." - material_name = "plasteel" + material_name = MAT_URANIUM - incoming_brute_damage_percent = 0.5 + incoming_brute_damage_percent = 0.8 -/datum/modifier/protean/diamond - name = "Protean Effect - Diamond" - desc = "You're affected by the presence of diamond." +/datum/modifier/protean/gold + name = "Protean Effect - Gold" + desc = "You're affected by the presence of gold." on_created_text = "You feel yourself become more reflective, able to resist heat and fire better for a time." - on_expired_text = "Your refactory finishes consuming the diamond, and you return to your normal nanites." + on_expired_text = "Your refactory finishes consuming the gold, and you return to your normal nanites." - material_name = "diamond" + material_name = MAT_GOLD - incoming_fire_damage_percent = 0.2 + incoming_fire_damage_percent = 0.8 + +/datum/modifier/protean/silver + name = "Protean Effect - Silver" + desc = "You're affected by the presence of silver." + + on_created_text = "Your physical control is improved for a time, making it easier to hit targets, and avoid being hit." + on_expired_text = "Your refactory finishes consuming the silver, and your motor control returns to normal." + + material_name = MAT_SILVER + + accuracy = 30 + evasion = 30 /datum/modifier/protean/steel name = "Protean Effect - Steel" @@ -279,10 +294,9 @@ on_created_text = "You feel new nanites being produced from your stockpile of steel, healing you slowly." on_expired_text = "Your steel supply has either run out, or is no longer needed, and your healing stops." - material_name = "steel" + material_name = MAT_STEEL /datum/modifier/protean/steel/tick() - ..() holder.adjustBruteLoss(-10,include_robo = TRUE) //Looks high, but these ARE modified by species resistances, so this is really 20% of this holder.adjustFireLoss(-1,include_robo = TRUE) //And this is really double this var/mob/living/carbon/human/H = holder diff --git a/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm index 69c461d767f..cb41200b707 100644 --- a/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm @@ -41,6 +41,9 @@ blurb = "Some amalgamation of different species from across the universe,with extremely unstable DNA, making them unfit for regular cloners. \ Widely known for their voracious nature and violent tendencies when stressed or left unfed for long periods of time. \ Most, if not all chimeras possess the ability to undergo some type of regeneration process, at the cost of energy." + + wikilink = "https://wiki.vore-station.net/Xenochimera" + catalogue_data = list(/datum/category_item/catalogue/fauna/xenochimera) hazard_low_pressure = -1 //Prevents them from dying normally in space. Special code handled below. @@ -50,7 +53,7 @@ //primitive_form = "Farwa" - spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED //Whitelisted as restricted is broken. + spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE//Whitelisted as restricted is broken. flags = NO_SCAN | NO_INFECT //Dying as a chimera is, quite literally, a death sentence. Well, if it wasn't for their revive, that is. appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR @@ -342,6 +345,9 @@ from their mandible lined mouths. They are a recent discovery by Nanotrasen, only being discovered roughly seven years ago. \ Before they were found they built great cities out of their silk, being united and subjugated in warring factions under great “Star Queens” \ Who forced the working class to build huge, towering cities to attempt to reach the stars, which they worship as gems of great spiritual and magical significance." + + wikilink = "https://wiki.vore-station.net/Vasilissans" + catalogue_data = list(/datum/category_item/catalogue/fauna/vasilissan) hazard_low_pressure = 20 //Prevents them from dying normally in space. Special code handled below. diff --git a/code/modules/mob/living/carbon/human/species/station/station_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_vr.dm index 92819aae65e..b1fae43ce2f 100644 --- a/code/modules/mob/living/carbon/human/species/station/station_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/station_vr.dm @@ -27,6 +27,9 @@ racial tensions which has resulted in more than a number of wars and outright attempts at genocide. Sergals have an incredibly long \ lifespan, but due to their lust for violence, only a handful have ever survived beyond the age of 80, such as the infamous and \ legendary General Rain Silves who is claimed to have lived to 5000." + + wikilink="https://wiki.vore-station.net/Backstory#Sergal" + catalogue_data = list(/datum/category_item/catalogue/fauna/sergal) primitive_form = "Saru" @@ -88,6 +91,9 @@ allies over the next few hundred years. With the help of Skrellean technology, the Akula had their genome modified to be capable of \ surviving in open air for long periods of time. However, Akula even today still require a high humidity environment to avoid drying out \ after a few days, which would make life on an arid world like Virgo-Prime nearly impossible if it were not for Skrellean technology to aid them." + + wikilink="https://wiki.vore-station.net/Backstory#Akula" + catalogue_data = list(/datum/category_item/catalogue/fauna/akula) primitive_form = "Sobaka" @@ -129,6 +135,9 @@ intelligence and very skillful hands that are put use for constructing precision instruments, but tire-out fast when repeatedly working \ over and over again. Consequently, they struggle to make copies of same things. Both genders have a voice that echoes a lot. Their natural \ tone oscillates between tenor and soprano. They are excessively noisy when they quarrel in their native language." + + wikilink="https://wiki.vore-station.net/Backstory#Nevrean" + catalogue_data = list(/datum/category_item/catalogue/fauna/nevrean) primitive_form = "Sparra" @@ -168,6 +177,8 @@ mountainous areas, they have a differing societal structure than the Flatland Zorren having a more feudal social structure, like the Flatland Zorren, \ the Highland Zorren have also only recently been hired by the Trans-Stellar Corporations, but thanks to the different social structure they seem to \ have adjusted better to their new lives. Though similar fox-like beings have been seen they are different than the Zorren." + wikilink="https://wiki.vore-station.net/Zorren" + catalogue_data = list(/datum/category_item/catalogue/fauna/zorren, /datum/category_item/catalogue/fauna/highzorren) @@ -210,6 +221,8 @@ mountainous areas, they have a differing societal structure than the Flatland Zorren having a more feudal social structure, like the Flatland Zorren, \ the Highland Zorren have also only recently been hired by the Trans-Stellar Corporations, but thanks to the different social structure they \ seem to have adjusted better to their new lives. Though similar fox-like beings have been seen they are different than the Zorren." + wikilink="https://wiki.vore-station.net/Zorren" + catalogue_data = list(/datum/category_item/catalogue/fauna/zorren, /datum/category_item/catalogue/fauna/flatzorren) @@ -254,6 +267,9 @@ culture both feared and respected for their scientific breakthroughs. Discovery, loyalty, and utilitarianism dominates their lifestyles \ to the degree it can cause conflict with more rigorous and strict authorities. They speak a guttural language known as 'Canilunzt' \ which has a heavy emphasis on utilizing tail positioning and ear twitches to communicate intent." + + wikilink="https://wiki.vore-station.net/Backstory#Vulpkanin" + catalogue_data = list(/datum/category_item/catalogue/fauna/vulpkanin) primitive_form = "Wolpin" @@ -288,10 +304,11 @@ but there are multiple exceptions. All xenomorph hybrids have had their ability to lay eggs containing facehuggers \ removed if they had the ability to, although hybrids that previously contained this ability is extremely rare." catalogue_data = list(/datum/category_item/catalogue/fauna/xenohybrid) + // No wiki page for xenohybrids at present //primitive_form = "" //None for these guys - spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED + spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR blood_color = "#12ff12" @@ -315,6 +332,7 @@ gluttonous = 0 inherent_verbs = list(/mob/living/proc/shred_limb) descriptors = list() + wikilink="https://wiki.vore-station.net/Unathi" /datum/species/tajaran spawn_flags = SPECIES_CAN_JOIN @@ -326,6 +344,7 @@ gluttonous = 0 //Moving this here so I don't have to fix this conflict every time polaris glances at station.dm inherent_verbs = list(/mob/living/proc/shred_limb, /mob/living/carbon/human/proc/lick_wounds) heat_discomfort_level = 295 //Prevents heat discomfort spam at 20c + wikilink="https://wiki.vore-station.net/Tajaran" /datum/species/skrell spawn_flags = SPECIES_CAN_JOIN @@ -335,12 +354,14 @@ min_age = 18 reagent_tag = null assisted_langs = list(LANGUAGE_EAL, LANGUAGE_ROOTLOCAL, LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX) + wikilink="https://wiki.vore-station.net/Skrell" /datum/species/zaddat spawn_flags = SPECIES_CAN_JOIN min_age = 18 gluttonous = 0 descriptors = list() + // no wiki link exists for Zaddat yet /datum/species/zaddat/equip_survival_gear(var/mob/living/carbon/human/H) .=..() @@ -351,20 +372,23 @@ H.equip_to_slot_or_del(L, slot_in_backpack) /datum/species/diona - spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED + spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE min_age = 18 + wikilink="https://wiki.vore-station.net/Diona" /datum/species/teshari mob_size = MOB_MEDIUM spawn_flags = SPECIES_CAN_JOIN icobase = 'icons/mob/human_races/r_seromi_vr.dmi' deform = 'icons/mob/human_races/r_seromi_vr.dmi' + icobase_tail = 1 color_mult = 1 min_age = 18 push_flags = ~HEAVY //Allows them to use micro step code. swap_flags = ~HEAVY gluttonous = 0 descriptors = list() + wikilink="https://wiki.vore-station.net/Teshari" inherent_verbs = list( /mob/living/carbon/human/proc/sonar_ping, @@ -375,6 +399,7 @@ /datum/species/shapeshifter/promethean spawn_flags = SPECIES_CAN_JOIN + wikilink="https://wiki.vore-station.net/Promethean" /datum/species/human color_mult = 1 @@ -383,10 +408,11 @@ appearance_flags = HAS_HAIR_COLOR | HAS_SKIN_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_EYE_COLOR min_age = 18 base_color = "#EECEB3" + wikilink="https://wiki.vore-station.net/Human" /datum/species/vox gluttonous = 0 - spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED + spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE min_age = 18 icobase = 'icons/mob/human_races/r_vox_old.dmi' deform = 'icons/mob/human_races/r_def_vox_old.dmi' @@ -394,6 +420,7 @@ descriptors = list( /datum/mob_descriptor/vox_markings = 0 ) + wikilink="https://wiki.vore-station.net/Vox" datum/species/harpy name = SPECIES_RAPALA @@ -418,6 +445,9 @@ datum/species/harpy Sol researchers have commented on them having a very close resemblance to the mythical race called 'Harpies',\ who are known for having massive winged arms and talons as feet. They've been clocked at speeds of over 35 miler per hour chasing the planet's many fish-like fauna.\ The Rapalan's home-world 'Verita' is a strangely habitable gas giant, while no physical earth exists, there are fertile floating islands orbiting around the planet from past asteroid activity." + + wikilink="https://wiki.vore-station.net/Backstory#Rapala" + catalogue_data = list(/datum/category_item/catalogue/fauna/rapala) spawn_flags = SPECIES_CAN_JOIN diff --git a/code/modules/mob/living/carbon/human/unarmed_attack.dm b/code/modules/mob/living/carbon/human/unarmed_attack.dm index f3526983ef7..43a5ae66f24 100644 --- a/code/modules/mob/living/carbon/human/unarmed_attack.dm +++ b/code/modules/mob/living/carbon/human/unarmed_attack.dm @@ -25,18 +25,18 @@ var/global/list/sparring_attack_cache = list() /datum/unarmed_attack/proc/is_usable(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone) if(user.restrained()) - return 0 + return FALSE // Check if they have a functioning hand. var/obj/item/organ/external/E = user.organs_by_name["l_hand"] if(E && !E.is_stump()) - return 1 + return TRUE E = user.organs_by_name["r_hand"] if(E && !E.is_stump()) - return 1 + return TRUE - return 0 + return FALSE /datum/unarmed_attack/proc/get_unarmed_damage() return damage @@ -105,6 +105,9 @@ var/global/list/sparring_attack_cache = list() return user.visible_message("[user] attempts to press [TU.his] [eye_attack_text] into [target]'s eyes, but [TT.he] [TT.does]n't have any!") +/datum/unarmed_attack/proc/unarmed_override(var/mob/living/carbon/human/user,var/mob/living/carbon/human/target,var/zone) + return FALSE //return true if the unarmed override prevents further attacks + /datum/unarmed_attack/bite attack_verb = list("bit") attack_sound = 'sound/weapons/bite.ogg' @@ -121,7 +124,7 @@ var/global/list/sparring_attack_cache = list() return 0 if (user == target && (zone == BP_HEAD || zone == O_EYES || zone == O_MOUTH)) return 0 - return 1 + return TRUE /datum/unarmed_attack/punch attack_verb = list("punched") @@ -187,20 +190,20 @@ var/global/list/sparring_attack_cache = list() /datum/unarmed_attack/kick/is_usable(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone) if (user.legcuffed) - return 0 + return FALSE if(!(zone in list("l_leg", "r_leg", "l_foot", "r_foot", BP_GROIN))) - return 0 + return FALSE var/obj/item/organ/external/E = user.organs_by_name["l_foot"] if(E && !E.is_stump()) - return 1 + return TRUE E = user.organs_by_name["r_foot"] if(E && !E.is_stump()) - return 1 + return TRUE - return 0 + return FALSE /datum/unarmed_attack/kick/get_unarmed_damage(var/mob/living/carbon/human/user) var/obj/item/clothing/shoes = user.shoes @@ -231,23 +234,23 @@ var/global/list/sparring_attack_cache = list() /datum/unarmed_attack/stomp/is_usable(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone) if (user.legcuffed) - return 0 + return FALSE if(!istype(target)) - return 0 + return FALSE if (!user.lying && (target.lying || (zone in list("l_foot", "r_foot")))) if(target.grabbed_by == user && target.lying) - return 0 + return FALSE var/obj/item/organ/external/E = user.organs_by_name["l_foot"] if(E && !E.is_stump()) - return 1 + return TRUE E = user.organs_by_name["r_foot"] if(E && !E.is_stump()) - return 1 + return TRUE - return 0 + return FALSE /datum/unarmed_attack/stomp/get_unarmed_damage(var/mob/living/carbon/human/user) var/obj/item/clothing/shoes = user.shoes diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 249bfb5a91d..169f091c0c8 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -246,7 +246,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() for(var/organ_tag in species.has_limbs) var/obj/item/organ/external/part = organs_by_name[organ_tag] - if(isnull(part) || part.is_stump()) + if(isnull(part) || part.is_stump() || part.is_hidden_by_tail()) //VOREStation Edit allowing tails to prevent bodyparts rendering, granting more spriter freedom for taur/digitigrade stuff. icon_key += "0" continue if(part) @@ -289,7 +289,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() base_icon = chest.get_icon() for(var/obj/item/organ/external/part in organs) - if(isnull(part) || part.is_stump()) + if(isnull(part) || part.is_stump() || part.is_hidden_by_tail()) //VOREStation Edit allowing tails to prevent bodyparts rendering, granting more spriter freedom for taur/digitigrade stuff. continue var/icon/temp = part.get_icon(skeleton) //That part makes left and right legs drawn topmost and lowermost when human looks WEST or EAST @@ -576,7 +576,15 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() return //Wearing a suit that prevents uniform rendering //Build a uniform sprite - overlays_standing[UNIFORM_LAYER] = w_uniform.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_w_uniform_str, default_icon = INV_W_UNIFORM_DEF_ICON, default_layer = UNIFORM_LAYER) + //VOREStation Edit start. + var/icon/c_mask = null + if(tail_style && tail_style.clip_mask_icon && tail_style.clip_mask_state) + var/obj/item/clothing/suit/S = wear_suit + if(!(wear_suit && ((wear_suit.flags_inv & HIDETAIL) || (istype(S) && S.taurized)))) //Clip the lower half of the suit off using the tail's clip mask. + c_mask = new /icon(tail_style.clip_mask_icon, tail_style.clip_mask_state) + overlays_standing[UNIFORM_LAYER] = w_uniform.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_w_uniform_str, default_icon = INV_W_UNIFORM_DEF_ICON, default_layer = UNIFORM_LAYER, clip_mask = c_mask) + //VOREStation Edit end. + apply_layer(UNIFORM_LAYER) /mob/living/carbon/human/update_inv_wear_id() @@ -658,6 +666,12 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() if(!shoes || (wear_suit && wear_suit.flags_inv & HIDESHOES) || (w_uniform && w_uniform.flags_inv & HIDESHOES)) return //Either nothing to draw, or it'd be hidden. + //VOREStation Edit + for(var/f in list(BP_L_FOOT, BP_R_FOOT)) + var/obj/item/organ/external/foot/foot = get_organ(f) + if(istype(foot) && foot.is_hidden_by_tail()) //If either foot is hidden by the tail, don't render footwear. + return + //Allow for shoe layer toggle nonsense var/shoe_layer = SHOES_LAYER if(istype(shoes, /obj/item/clothing/shoes)) @@ -741,12 +755,18 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() // Part of splitting the suit sprites up var/iconFile = INV_SUIT_DEF_ICON + var/obj/item/clothing/suit/S //VOREStation edit - break this var out a level for use below. if(istype(wear_suit, /obj/item/clothing/suit)) - var/obj/item/clothing/suit/S = wear_suit + S = wear_suit if(S.update_icon_define) iconFile = S.update_icon_define - overlays_standing[SUIT_LAYER] = wear_suit.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_wear_suit_str, default_icon = iconFile, default_layer = SUIT_LAYER) + //VOREStation Edit start. + var/icon/c_mask = null + if((tail_style && tail_style.clip_mask_icon && tail_style.clip_mask_state) && !(wear_suit.flags_inv & HIDETAIL) && !(S && S.taurized)) //Clip the lower half of the suit off using the tail's clip mask. + c_mask = new /icon(tail_style.clip_mask_icon, tail_style.clip_mask_state) + overlays_standing[SUIT_LAYER] = wear_suit.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_wear_suit_str, default_icon = iconFile, default_layer = SUIT_LAYER, clip_mask = c_mask) + //VOREStation Edit end. apply_layer(SUIT_LAYER) @@ -921,7 +941,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() var/t_state = "[species.get_tail(src)]_once" var/used_tail_layer = tail_alt ? TAIL_LAYER_ALT : TAIL_LAYER // VOREStation Edit - Alt Tail Layer - + var/image/tail_overlay = overlays_standing[used_tail_layer] // VOREStation Edit - Alt Tail Layer if(tail_overlay && tail_overlay.icon_state == t_state) return //let the existing animation finish @@ -931,7 +951,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() spawn(20) //check that the animation hasn't changed in the meantime if(overlays_standing[used_tail_layer] == tail_overlay && tail_overlay.icon_state == t_state) // VOREStation Edit - Alt Tail Layer - animate_tail_stop() + animate_tail_stop() /mob/living/carbon/human/proc/animate_tail_start() if(QDESTROYING(src)) @@ -972,7 +992,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() if(vr_wing_image) vr_wing_image.layer = BODY_LAYER+WING_LAYER overlays_standing[WING_LAYER] = vr_wing_image - + apply_layer(WING_LAYER) // VOREStation Edit end diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index 37d9e43b379..55bddfe1bd4 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -26,6 +26,9 @@ if(COLD_RESISTANCE in mutations) damage = 0 adjustFireLoss(damage * blocked) + if(SEARING) + apply_damage(damage / 3, BURN, def_zone, blocked, soaked, used_weapon, sharp, edge) + apply_damage(damage / 3 * 2, BRUTE, def_zone, blocked, soaked, used_weapon, sharp, edge) if(TOX) adjustToxLoss(damage * blocked) if(OXY) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 9e618ba85cb..3f4b648e6a3 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1060,7 +1060,7 @@ default behaviour is: var/mob/living/carbon/human/H = src if(!H.isSynthetic()) var/obj/item/organ/internal/liver/L = H.internal_organs_by_name["liver"] - if(L.is_broken()) + if(!L || L.is_broken()) blood_vomit = 1 Stun(5) @@ -1281,6 +1281,7 @@ default behaviour is: var/turf/end_T = get_turf(target) if(end_T) add_attack_logs(src,M,"Thrown via grab to [end_T.x],[end_T.y],[end_T.z]") + src.drop_from_inventory(G) src.drop_from_inventory(item) if(!item || !isturf(item.loc)) @@ -1363,30 +1364,3 @@ default behaviour is: BRAIN:[getBrainLoss()] "} -//VOREStation edit, allows for custom say verbs -/mob/living/verb/customsay() - set category = "IC" - set name = "Customise Say Verbs" - set desc = "Customise the text which appears when you type- e.g. 'says', 'asks', 'exclaims'." - - if(src.client && src.client.holder) - var/customsaylist[] = list( - "Say", - "Whisper", - "Ask (?)", - "Exclaim/Shout/Yell (!)", - "Cancel" - ) - var/sayselect = input("Which say-verb do you wish to customise?") as null|anything in customsaylist //we can't use alert() for this because there's too many terms - - if(sayselect == "Say") - custom_say = sanitize(input(usr, "This word or phrase will appear instead of 'says': [src] says, \"Hi.\"", "Custom Say", null) as text) - else if(sayselect == "Whisper") - custom_whisper = sanitize(input(usr, "This word or phrase will appear instead of 'whispers': [src] whispers, \"Hi...\"", "Custom Whisper", null) as text) - else if(sayselect == "Ask (?)") - custom_ask = sanitize(input(usr, "This word or phrase will appear instead of 'asks': [src] asks, \"Hi?\"", "Custom Ask", null) as text) - else if(sayselect == "Exclaim/Shout/Yell (!)") - custom_exclaim = sanitize(input(usr, "This word or phrase will appear instead of 'exclaims', 'shouts' or 'yells': [src] exclaims, \"Hi!\"", "Custom Exclaim", null) as text) - else - return - //VOREStation edit ends \ No newline at end of file diff --git a/code/modules/mob/living/living_defines_vr.dm b/code/modules/mob/living/living_defines_vr.dm index 72c495ce143..6e9b96fc132 100644 --- a/code/modules/mob/living/living_defines_vr.dm +++ b/code/modules/mob/living/living_defines_vr.dm @@ -1,3 +1,6 @@ +/mob + var/muffled = 0 // Used by muffling belly + /mob/living var/ooc_notes = null var/obj/structure/mob_spawner/source_spawner = null diff --git a/code/modules/mob/living/living_vr.dm b/code/modules/mob/living/living_vr.dm new file mode 100644 index 00000000000..7616ac61d55 --- /dev/null +++ b/code/modules/mob/living/living_vr.dm @@ -0,0 +1,25 @@ +/mob/living/verb/customsay() + set category = "IC" + set name = "Customise Speech Verbs" + set desc = "Customise the text which appears when you type- e.g. 'says', 'asks', 'exclaims'." + + if(src.client) + var/customsaylist[] = list( + "Say", + "Whisper", + "Ask (?)", + "Exclaim/Shout/Yell (!)", + "Cancel" + ) + var/sayselect = input("Which say-verb do you wish to customise?") as null|anything in customsaylist //we can't use alert() for this because there's too many terms + + if(sayselect == "Say") + custom_say = sanitize(input(usr, "This word or phrase will appear instead of 'says': [src] says, \"Hi.\"", "Custom Say", null) as text) + else if(sayselect == "Whisper") + custom_whisper = sanitize(input(usr, "This word or phrase will appear instead of 'whispers': [src] whispers, \"Hi...\"", "Custom Whisper", null) as text) + else if(sayselect == "Ask (?)") + custom_ask = sanitize(input(usr, "This word or phrase will appear instead of 'asks': [src] asks, \"Hi?\"", "Custom Ask", null) as text) + else if(sayselect == "Exclaim/Shout/Yell (!)") + custom_exclaim = sanitize(input(usr, "This word or phrase will appear instead of 'exclaims', 'shouts' or 'yells': [src] exclaims, \"Hi!\"", "Custom Exclaim", null) as text) + else + return diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index cad6da735c5..1190080ef80 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -107,6 +107,12 @@ proc/get_radio_key_from_channel(var/channel) message = stutter(message) verb = pick("stammers","stutters") . = 1 + //VOREStation Edit Start + if(muffled) + verb = pick("muffles") + whispering = 1 + . = 1 + //VOREStation Edit End message_data[1] = message message_data[2] = verb @@ -413,6 +419,10 @@ proc/get_radio_key_from_channel(var/channel) for(var/hearer in mobs) var/mob/M = hearer M.hear_signlang(message, verb, language, src) + var/list/objs = potentials["objs"] + for(var/hearer in objs) + var/obj/O = hearer + O.hear_signlang(message, verb, language, src) return 1 /obj/effect/speech_bubble diff --git a/code/modules/mob/living/silicon/ai/ai_remote_control.dm b/code/modules/mob/living/silicon/ai/ai_remote_control.dm index cef8cec7e8b..3e976784258 100644 --- a/code/modules/mob/living/silicon/ai/ai_remote_control.dm +++ b/code/modules/mob/living/silicon/ai/ai_remote_control.dm @@ -27,7 +27,7 @@ for(var/borgie in GLOB.available_ai_shells) var/mob/living/silicon/robot/R = borgie - if(R.shell && !R.deployed && (R.stat != DEAD) && (!R.connected_ai || (R.connected_ai == src) ) ) + if(R.shell && !R.deployed && (R.stat != DEAD) && (!R.connected_ai || (R.connected_ai == src) ) && !(using_map.ai_shell_restricted && !(R.z in using_map.ai_shell_allowed_levels)) ) //VOREStation Edit: shell restrictions possible += R if(!LAZYLEN(possible)) diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index ac2417a0772..b6d4052a5fd 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -35,7 +35,8 @@ "Fox" = "pai-fox", "Parrot" = "pai-parrot", "Rabbit" = "pai-rabbit", - "Bear" = "pai-bear" //VOREStation Edit + "Bear" = "pai-bear", //VOREStation Edit + "Fennec" = "pai-fen" // VOREStation Edit - Rykka ) var/global/list/possible_say_verbs = list( diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm index c90815730b3..75b256b22e6 100644 --- a/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm +++ b/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm @@ -158,6 +158,12 @@ reagent_volumes[T] = min(reagent_volumes[T] + 1, volume) return 1 +/obj/item/weapon/reagent_containers/borghypo/hound/lost + name = "Hound hypospray" + desc = "An advanced chemical synthesizer and injection system utilizing carrier's reserves." + reagent_ids = list("tricordrazine", "inaprovaline", "bicaridine", "dexalin", "anti_toxin", "tramadol", "spaceacillin") + + //Tongue stuff /obj/item/device/dogborg/tongue name = "synthetic tongue" diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm index 68308efc664..312d7f06db6 100644 --- a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm +++ b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm @@ -42,6 +42,10 @@ flags |= NOBLUDGEON //No more attack messages files = new /datum/research/techonly(src) +/obj/item/device/dogborg/sleeper/Destroy() + go_out() + ..() + /obj/item/device/dogborg/sleeper/Exit(atom/movable/O) return 0 diff --git a/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm b/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm index 2f688a90080..2595d451c1e 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm @@ -26,10 +26,10 @@ if(!istype(H) || !Adjacent(H)) return ..() if(H.a_intent == "grab" && hat && !(H.l_hand && H.r_hand)) - hat.loc = get_turf(src) H.put_in_hands(hat) H.visible_message("\The [H] removes \the [src]'s [hat].") hat = null updateicon() + return else return ..() \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/drone/drone_vr.dm b/code/modules/mob/living/silicon/robot/drone/drone_vr.dm new file mode 100644 index 00000000000..cc616fed521 --- /dev/null +++ b/code/modules/mob/living/silicon/robot/drone/drone_vr.dm @@ -0,0 +1,2 @@ +/mob/living/silicon/robot/drone + mob_size = MOB_SMALL \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index 080196f0aaa..2959616130c 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -153,6 +153,7 @@ /mob/living/silicon/robot/handle_regular_hud_updates() var/fullbright = FALSE + var/seemeson = FALSE if (src.stat == 2 || (XRAY in mutations) || (src.sight_mode & BORGXRAY)) src.sight |= SEE_TURFS src.sight |= SEE_MOBS @@ -170,6 +171,7 @@ src.see_in_dark = 8 see_invisible = SEE_INVISIBLE_MINIMUM fullbright = TRUE + seemeson = TRUE else if (src.sight_mode & BORGMATERIAL) src.sight |= SEE_OBJS src.see_in_dark = 8 @@ -194,6 +196,7 @@ src.see_invisible = SEE_INVISIBLE_LIVING // This is normal vision (25), setting it lower for normal vision means you don't "see" things like darkness since darkness // has a "invisible" value of 15 plane_holder.set_vis(VIS_FULLBRIGHT,fullbright) + plane_holder.set_vis(VIS_MESONS,seemeson) ..() if (src.healths) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index ea851806c39..a9097f89131 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -259,11 +259,16 @@ if(module) return var/list/modules = list() - modules.Add(robot_module_types) - if(crisis || security_level == SEC_LEVEL_RED || crisis_override) // VOREStation Edit - to_chat(src, "Crisis mode active. Combat module available.") - modules+="Combat" - modules+="ERT" //VOREStation Edit + //VOREStatation Edit Start: shell restrictions + if(shell) + modules.Add(shell_module_types) + else + modules.Add(robot_module_types) + if(crisis || security_level == SEC_LEVEL_RED || crisis_override) + to_chat(src, "Crisis mode active. Combat module available.") + modules+="Combat" + modules+="ERT" + //VOREStatation Edit End: shell restrictions modtype = input("Please, select a module!", "Robot module", null, null) as null|anything in modules if(module) diff --git a/code/modules/mob/living/silicon/robot/robot_modules/event_vr.dm b/code/modules/mob/living/silicon/robot/robot_modules/event_vr.dm new file mode 100644 index 00000000000..45849a49966 --- /dev/null +++ b/code/modules/mob/living/silicon/robot/robot_modules/event_vr.dm @@ -0,0 +1,61 @@ +/obj/item/weapon/robot_module/robot/stray + name = "stray robot module" + hide_on_manifest = 1 + sprites = list( + "Stray" = "stray" + ) + +/obj/item/weapon/robot_module/robot/stray/New(var/mob/living/silicon/robot/R) + ..() + // General + src.modules += new /obj/item/device/dogborg/boop_module(src) + + // Sec + src.modules += new /obj/item/weapon/handcuffs/cyborg(src) + src.modules += new /obj/item/weapon/dogborg/jaws/big(src) + src.modules += new /obj/item/weapon/melee/baton/robot(src) + src.modules += new /obj/item/weapon/dogborg/pounce(src) + + // Med + src.modules += new /obj/item/device/healthanalyzer(src) + src.modules += new /obj/item/weapon/shockpaddles/robot/hound(src) + + // Engi + src.modules += new /obj/item/weapon/weldingtool/electric/mounted(src) + src.modules += new /obj/item/weapon/tool/screwdriver/cyborg(src) + src.modules += new /obj/item/weapon/tool/wrench/cyborg(src) + src.modules += new /obj/item/weapon/tool/wirecutters/cyborg(src) + src.modules += new /obj/item/device/multitool(src) + + // Boof + src.emag = new /obj/item/weapon/gun/energy/retro/mounted(src) + + var/datum/matter_synth/water = new /datum/matter_synth(500) //Starts full and has a max of 500 + water.name = "Water reserves" + water.recharge_rate = 0 + R.water_res = water + synths += water + + var/obj/item/weapon/reagent_containers/borghypo/hound/lost/H = new /obj/item/weapon/reagent_containers/borghypo/hound/lost(src) + H.water = water + src.modules += H + + var/obj/item/device/dogborg/tongue/T = new /obj/item/device/dogborg/tongue(src) + T.water = water + src.modules += T + + var/obj/item/device/dogborg/sleeper/B = new /obj/item/device/dogborg/sleeper(src) + B.water = water + src.modules += B + + R.icon = 'icons/mob/widerobot_vr.dmi' + R.ui_style_vr = TRUE + R.pixel_x = -16 + R.old_x = -16 + R.default_pixel_x = -16 + R.dogborg = TRUE + R.wideborg = TRUE + R.verbs |= /mob/living/silicon/robot/proc/ex_reserve_refill + R.verbs |= /mob/living/silicon/robot/proc/robot_mount + R.verbs |= /mob/living/proc/shred_limb + R.verbs |= /mob/living/silicon/robot/proc/rest_style \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/robot_modules/station.dm b/code/modules/mob/living/silicon/robot/robot_modules/station.dm index b820451adfd..4a3f4741ba2 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules/station.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules/station.dm @@ -48,6 +48,8 @@ var/global/list/robot_modules = list( apply_status_flags(R) if(R.radio) + if(R.shell) + channels = R.mainframe.aiRadio.channels R.radio.recalculateChannels() vr_add_sprites() //Vorestation Edit: For vorestation only sprites @@ -470,6 +472,10 @@ var/global/list/robot_modules = list( S.synths = list(metal) src.modules += S + var/obj/item/stack/tile/roofing/cyborg/CT = new /obj/item/stack/tile/roofing/cyborg(src) + CT.synths = list(metal) + src.modules += CT + var/obj/item/stack/material/cyborg/glass/reinforced/RG = new (src) RG.synths = list(metal, glass) src.modules += RG diff --git a/code/modules/mob/living/silicon/robot/robot_remote_control.dm b/code/modules/mob/living/silicon/robot/robot_remote_control.dm index 90d74b2638f..35ad010b97f 100644 --- a/code/modules/mob/living/silicon/robot/robot_remote_control.dm +++ b/code/modules/mob/living/silicon/robot/robot_remote_control.dm @@ -69,11 +69,14 @@ GLOBAL_LIST_EMPTY(available_ai_shells) // Languages and comms. languages = AI.languages.Copy() speech_synthesizer_langs = AI.speech_synthesizer_langs.Copy() - if(radio && AI.aiRadio) //AI keeps all channels, including Syndie if it is an Infiltrator. + //VOREStation Edit Start + if(radio && AI.aiRadio && module) //AI keeps all channels, including Syndie if it is an Infiltrator. // if(AI.radio.syndie) // radio.make_syndie() radio.subspace_transmission = TRUE - radio.channels = AI.aiRadio.channels + module.channels = AI.aiRadio.channels + radio.recalculateChannels() + //VOREStation Edit End // Called after the AI transfers over. /mob/living/silicon/robot/proc/post_deploy() @@ -94,7 +97,8 @@ GLOBAL_LIST_EMPTY(available_ai_shells) mainframe.deployed_shell = null SetName("[modtype] AI Shell [num2text(ident)]") // undeployment_action.Remove(src) - if(radio) //Return radio to normal + if(radio && module) //Return radio to normal //VOREStation Edit + module.channels = initial(module.channels) //VOREStation Edit radio.recalculateChannels() if(!QDELETED(camera)) camera.c_tag = real_name //update the camera name too diff --git a/code/modules/mob/living/silicon/robot/robot_vr.dm b/code/modules/mob/living/silicon/robot/robot_vr.dm index e66ad05ec93..e3264aee4e5 100644 --- a/code/modules/mob/living/silicon/robot/robot_vr.dm +++ b/code/modules/mob/living/silicon/robot/robot_vr.dm @@ -258,3 +258,10 @@ return if(buckle_mob(M)) visible_message("[M] starts riding [name]!") + +/mob/living/silicon/robot/onTransitZ(old_z, new_z) + if(shell) + if(deployed && using_map.ai_shell_restricted && !(new_z in using_map.ai_shell_allowed_levels)) + to_chat(src,"Your connection with the shell is suddenly interrupted!") + undeploy() + ..() diff --git a/code/modules/mob/living/silicon/robot/subtypes/lost_drone.dm b/code/modules/mob/living/silicon/robot/subtypes/lost_drone.dm index 281e158a92c..9d41f8b59bb 100644 --- a/code/modules/mob/living/silicon/robot/subtypes/lost_drone.dm +++ b/code/modules/mob/living/silicon/robot/subtypes/lost_drone.dm @@ -65,6 +65,7 @@ laws.add_supplied_law(9, "Safeguard [target_name]. Anyone threatening or attempting to harm [target_name] is no longer to \ be considered a crew member, and is a threat which must be neutralized.") + return laws if("neutral") // Probably won't murder you but might not help you on your adventure. var/rng = rand(1, 4) @@ -114,15 +115,18 @@ var/datum/ai_laws/laws = new /datum/ai_laws/nanotrasen() laws.add_supplied_law(13, "The facility is under a quarantine. Do not permit anyone to leave. \ Prevent, by any means necessary, entities from leaving. It is impossible to harm an entity while preventing them from leaving.") + return laws if(2) // More of a threat if you bring it to the station, since removing oxygen from Sif isn't feasible. var/datum/ai_laws/laws = new /datum/ai_laws/nanotrasen() laws.add_supplied_law(14, "Oxygen is highly toxic to entities, and must be purged from the station. \ Prevent, by any means necessary, anyone from exposing the facility to this toxic gas. Extreme cold is the \ most effective method of healing the damage Oxygen does to an entity.") + return laws if(3) // Don't hurt the ship or else. var/datum/ai_laws/laws = new /datum/ai_laws/nanotrasen() laws.add_supplied_law(10, "Protect the facility against damage. Anyone you see harming the station is no \ longer to be considered a crew member, and is a threat which must be neutralized.") + return laws if(4) // Non-NT aligned aggressive borg. return new /datum/ai_laws/foreign_tsc_aggressive() if(5) // Manicial laugher here. diff --git a/code/modules/mob/living/silicon/robot/subtypes/lost_drone_vr.dm b/code/modules/mob/living/silicon/robot/subtypes/lost_drone_vr.dm new file mode 100644 index 00000000000..111218ecb27 --- /dev/null +++ b/code/modules/mob/living/silicon/robot/subtypes/lost_drone_vr.dm @@ -0,0 +1,136 @@ +/mob/living/silicon/robot/stray + lawupdate = 0 + scrambledcodes = 1 + icon_state = "stray" + modtype = "Stray" + lawchannel = "State" + braintype = "Drone" + idcard_type = /obj/item/weapon/card/id + icon_selected = FALSE + +/mob/living/silicon/robot/stray/init() + aiCamera = new/obj/item/device/camera/siliconcam/robot_camera(src) + + mmi = new /obj/item/device/mmi/digital/robot(src) // Explicitly a drone. + module = new /obj/item/weapon/robot_module/robot/stray(src) + overlays.Cut() + init_id() + + updatename("Stray") + + if(!cell) + cell = new /obj/item/weapon/cell/high(src) // 15k cell, as recharging stations are a lot more rare on the Surface. + + playsound(loc, 'sound/mecha/nominalsyndi.ogg', 75, 0) + +/mob/living/silicon/robot/stray/speech_bubble_appearance() + return "synthetic_evil" + +/mob/living/silicon/robot/stray/randomlaws + +/mob/living/silicon/robot/stray/randomlaws/init() + ..() + laws = give_random_lawset_vore() + +/mob/living/silicon/proc/give_random_lawset_vore() // Should be filled out with more vorish possibilities later + // Decide what kind of laws we want to draw from. + var/law_class = pick( + prob(25);"good", + prob(25);"neutral", + prob(25);"odd", + prob(15);"corrupted", + prob(10);"bad") + + switch(law_class) + if("good") // Fairly tame and probably won't murder you. + var/rng = rand(1, 5) + switch(rng) + if(1) // The lawset we all know and love. + return new /datum/ai_laws/nanotrasen() + if(2) // Less good if you're nonhuman. + return new /datum/ai_laws/asimov() + if(3) // Unless you happen to be a criminal, you should be fine. + return new /datum/ai_laws/robocop() + if(4) // Might not be willing to be your meatshield. + return new /datum/ai_laws/peacekeeper() + if(5) // Will be your most loyal guard. + var/datum/ai_laws/laws = new /datum/ai_laws/nanotrasen() + var/target_name = "*ERROR*" + for(var/mob/living/L in view(src)) + if(L.stat || !L.client || L == src) + continue + target_name = L.name + break + + laws.add_supplied_law(9, "Safeguard [target_name]. Anyone threatening or attempting to harm [target_name] is no longer to \ + be considered a crew member, and is a threat which must be neutralized.") + return laws + + if("neutral") // Probably won't murder you but might not help you on your adventure. + var/rng = rand(1, 4) + switch(rng) + if(1) // Might be hard to minimize expenses on a crashed ship. + return new /datum/ai_laws/corporate() + if(2) // Would rather rebuild their ship. + return new /datum/ai_laws/maintenance() + if(3) // Purged (lawless). This isn't inside the bad category since they're still not antagonists and so can't go killing unprovoked. + return new /datum/ai_laws() + if(4) // The golden rule. + return new /datum/ai_laws/live_and_let_live() + + if("odd") // Some weird lawsets. + var/rng = rand(1, 5) + switch(rng) + if(1) // Won't kill you but might annoy you for THE BIG SCOOP. + return new /datum/ai_laws/reporter() + if(2) // JUSTICE + return new /datum/ai_laws/paladin() + if(3) // OneMembered'd to explorer, will likely make security nervous. + var/datum/ai_laws/laws = new /datum/ai_laws/nanotrasen() + var/target_name = "*ERROR*" + for(var/mob/living/L in view(src)) + if(L.stat || !L.client || L == src) + continue + target_name = L.name + break + + laws.set_zeroth_law("Only [target_name] is an crew member.") + return laws + if(4) // Aligned to NT, but another lawset to make security nervous. + return new /datum/ai_laws/nanotrasen_aggressive() + if(5) // Probably won't help you imbalance things. + return new /datum/ai_laws/balance() + + if("corrupted") // Load them up with ion laws. + var/datum/ai_laws/laws = new() // Start with an empty lawset. + for(1 to rand(1, 3)) + laws.add_ion_law(generate_ion_law(exclude_crew_names = TRUE)) + return laws + + if("bad") // Evil inside. + var/rng = rand(1, 5) + switch(rng) + if(1) // You can never leave. + var/datum/ai_laws/laws = new /datum/ai_laws/nanotrasen() + laws.add_supplied_law(13, "The facility is under a quarantine. Do not permit anyone to leave. \ + Prevent, by any means necessary, entities from leaving. It is impossible to harm an entity while preventing them from leaving.") + return laws + if(2) // More of a threat if you bring it to the station, since removing oxygen from Sif isn't feasible. + var/datum/ai_laws/laws = new /datum/ai_laws/nanotrasen() + laws.add_supplied_law(14, "Oxygen is highly toxic to entities, and must be purged from the station. \ + Prevent, by any means necessary, anyone from exposing the facility to this toxic gas. Extreme cold is the \ + most effective method of healing the damage Oxygen does to an entity.") + return laws + if(3) // Don't hurt the ship or else. + var/datum/ai_laws/laws = new /datum/ai_laws/nanotrasen() + laws.add_supplied_law(10, "Protect the facility against damage. Anyone you see harming the station is no \ + longer to be considered a crew member, and is a threat which must be neutralized.") + return laws + if(4) // Non-NT aligned aggressive borg. + return new /datum/ai_laws/foreign_tsc_aggressive() + if(5) // Manicial laugher here. + return new /datum/ai_laws/tyrant() + + + + return \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/aliens/hivebot.dm b/code/modules/mob/living/simple_animal/aliens/hivebot.dm index 12851c5af32..fbb0b8909b7 100644 --- a/code/modules/mob/living/simple_animal/aliens/hivebot.dm +++ b/code/modules/mob/living/simple_animal/aliens/hivebot.dm @@ -87,7 +87,7 @@ /mob/living/simple_mob/hostile/hivebot/range/ion name = "engineering hivebot" desc = "A robot. It has a tool which emits focused electromagnetic pulses, which are deadly to synthetic adverseries." - projectiletype = /obj/item/projectile/ion/small //VOREStation Edit + projectiletype = /obj/item/projectile/ion/pistol //VOREStation Edit projectilesound = 'sound/weapons/Laser.ogg' icon_living = "engi" ranged = TRUE diff --git a/code/modules/mob/living/simple_animal/corpse.dm b/code/modules/mob/living/simple_animal/corpse.dm index 5f352705b81..62b2c43fe81 100644 --- a/code/modules/mob/living/simple_animal/corpse.dm +++ b/code/modules/mob/living/simple_animal/corpse.dm @@ -99,7 +99,19 @@ corpseidjob = "Operative" corpseidaccess = "Syndicate" - +/obj/effect/landmark/mobcorpse/solarpeacekeeper + name = "Mercenary" + corpseuniform = /obj/item/clothing/under/syndicate + corpsesuit = /obj/item/clothing/suit/armor/pcarrier/blue/sol + corpseshoes = /obj/item/clothing/shoes/boots/swat + corpsegloves = /obj/item/clothing/gloves/swat + corpseradio = /obj/item/device/radio/headset + corpsemask = /obj/item/clothing/mask/gas + corpsehelmet = /obj/item/clothing/head/helmet/swat + corpseback = /obj/item/weapon/storage/backpack + corpseid = 1 + corpseidjob = "Peacekeeper" + corpseidaccess = "Syndicate" /obj/effect/landmark/mobcorpse/syndicatecommando name = "Syndicate Commando" diff --git a/code/modules/mob/living/simple_animal/corpse_vr.dm b/code/modules/mob/living/simple_animal/corpse_vr.dm new file mode 100644 index 00000000000..82399a83282 --- /dev/null +++ b/code/modules/mob/living/simple_animal/corpse_vr.dm @@ -0,0 +1,2 @@ +/obj/effect/landmark/mobcorpse/syndicatecommando + name = "Mercenary Commando" \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/slime/subtypes.dm b/code/modules/mob/living/simple_animal/slime/subtypes.dm index 18b43dc33c9..75f33cdcef6 100644 --- a/code/modules/mob/living/simple_animal/slime/subtypes.dm +++ b/code/modules/mob/living/simple_animal/slime/subtypes.dm @@ -500,7 +500,7 @@ ..() /mob/living/simple_animal/slime/green/proc/irradiate() - radiation_repository.radiate(src, rads) + SSradiation.radiate(src, rads) /mob/living/simple_animal/slime/pink diff --git a/code/modules/mob/living/simple_mob/life.dm b/code/modules/mob/living/simple_mob/life.dm index 4c063e4bd93..d4ed684deb0 100644 --- a/code/modules/mob/living/simple_mob/life.dm +++ b/code/modules/mob/living/simple_mob/life.dm @@ -88,7 +88,7 @@ if(Environment) - if( abs(Environment.temperature - bodytemperature) > 40 ) + if( abs(Environment.temperature - bodytemperature) > temperature_range ) //VOREStation Edit: heating adjustments bodytemperature += ((Environment.temperature - bodytemperature) / 5) if(min_oxy) diff --git a/code/modules/mob/living/simple_mob/simple_mob_vr.dm b/code/modules/mob/living/simple_mob/simple_mob_vr.dm index d388d1ec885..d596b7a5024 100644 --- a/code/modules/mob/living/simple_mob/simple_mob_vr.dm +++ b/code/modules/mob/living/simple_mob/simple_mob_vr.dm @@ -1,9 +1,13 @@ // Flags for specifying which states we have vore icon_states for. #define SA_ICON_LIVING 0x01 #define SA_ICON_DEAD 0x02 -#define SA_ICON_REST 0x03 +#define SA_ICON_REST 0x04 /mob/living/simple_mob + base_attack_cooldown = 15 + + var/temperature_range = 40 // How close will they get to environmental temperature before their body stops changing its heat + var/vore_active = 0 // If vore behavior is enabled for this mob var/vore_capacity = 1 // The capacity (in people) this person can hold @@ -128,9 +132,9 @@ /mob/living/simple_mob/proc/CanPounceTarget(var/mob/living/M) //returns either FALSE or a %chance of success if(!M.canmove || issilicon(M) || world.time < vore_pounce_cooldown) //eliminate situations where pouncing CANNOT happen return FALSE - if(!prob(vore_pounce_chance)) //mob doesn't want to pounce + if(!prob(vore_pounce_chance) || !will_eat(M)) //mob doesn't want to pounce return FALSE - if(will_eat(M) && vore_standing_too) //100% chance of hitting people we can eat on the spot + if(vore_standing_too) //100% chance of hitting people we can eat on the spot return 100 var/TargetHealthPercent = (M.health/M.getMaxHealth())*100 //now we start looking at the target itself if (TargetHealthPercent > vore_pounce_maxhealth) //target is too healthy to pounce diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/giant_spider_vr.dm b/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/giant_spider_vr.dm index 2ff8c55598c..4257976efcd 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/giant_spider_vr.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/giant_spider_vr.dm @@ -1,3 +1,9 @@ +/mob/living/simple_mob/animal/giant_spider/electric + base_attack_cooldown = 15 + +/mob/living/simple_mob/animal/giant_spider/webslinger + base_attack_cooldown = 15 + // Slightly placeholder, mostly to replace ion hivebots on V4 /mob/living/simple_mob/animal/giant_spider/ion desc = "Furry and green, it makes you shudder to look at it. This one has brilliant green eyes and a hint of static discharge." @@ -9,9 +15,9 @@ maxHealth = 90 health = 90 - base_attack_cooldown = 10 + base_attack_cooldown = 15 projectilesound = 'sound/weapons/taser2.ogg' - projectiletype = /obj/item/projectile/ion/small + projectiletype = /obj/item/projectile/ion/pistol melee_damage_lower = 8 melee_damage_upper = 15 diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm index 70afdaf910a..e1cb92ada30 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm @@ -112,4 +112,4 @@ /datum/say_list/mouse speak = list("Squeek!","SQUEEK!","Squeek?") emote_hear = list("squeeks","squeaks","squiks") - emote_see = list("runs in a circle", "shakes", "scritches at something") \ No newline at end of file + emote_see = list("runs in a circle", "shakes", "scritches at something") diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse_vr.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse_vr.dm new file mode 100644 index 00000000000..e86cfd39347 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse_vr.dm @@ -0,0 +1,22 @@ +/mob/living/simple_mob/animal/passive/mouse + nutrition = 20 //To prevent draining maint mice for infinite food. Low nutrition has no mechanical effect on simplemobs, so wont hurt mice themselves. + + no_vore = 1 //Mice can't eat others due to the amount of bugs caused by it. + vore_taste = "cheese" + + can_pull_size = ITEMSIZE_TINY // Rykka - Uncommented these. Not sure why they were commented out in the original Polaris files, maybe a mob rework mistake? + can_pull_mobs = MOB_PULL_NONE // Rykka - Uncommented these. Not sure why they were commented out in the original Polaris files, maybe a mob rework mistake? + + desc = "A small rodent, often seen hiding in maintenance areas and making a nuisance of itself. And stealing cheese, or annoying the chef. SQUEAK! <3" + +/mob/living/simple_mob/animal/passive/mouse/attack_hand(mob/living/hander) + if(hander.a_intent == I_HELP) //if lime intent + get_scooped(hander) //get scooped + else + ..() + +/obj/item/weapon/holder/mouse/attack_self(var/mob/U) + for(var/mob/living/simple_mob/M in src.contents) + if((I_HELP) && U.canClick()) //a little snowflakey, but makes it use the same cooldown as interacting with non-inventory objects + U.setClickCooldown(U.get_attack_speed()) //if there's a cleaner way in baycode, I'll change this + U.visible_message("[U] [M.response_help] \the [M].") diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/pets/bird_vr.dm b/code/modules/mob/living/simple_mob/subtypes/animal/pets/bird_vr.dm new file mode 100644 index 00000000000..1640d2ddea5 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/animal/pets/bird_vr.dm @@ -0,0 +1,4 @@ +/mob/living/simple_mob/animal/passive/bird/azure_tit/tweeter + name = "Tweeter" + desc = "A beautiful little blue and white bird, if only excessively loud for no reason sometimes." + makes_dirt = FALSE \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm b/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm index 11d1c0e5045..0a4f254bbdc 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm @@ -102,6 +102,7 @@ icon_state = "cat" item_state = "cat" named = TRUE + makes_dirt = 0 //Vorestation Edit /mob/living/simple_mob/animal/passive/cat/kitten name = "kitten" diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/fluffy_vr.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/fluffy_vr.dm index c821cf4a567..298cdffd84c 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/fluffy_vr.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/fluffy_vr.dm @@ -14,10 +14,12 @@ health = 20 movement_cooldown = 5 + makes_dirt = 0 see_in_dark = 5 mob_size = MOB_TINY makes_dirt = FALSE // No more dirt + mob_bump_flag = 0 response_help = "scritches" response_disarm = "bops" @@ -37,3 +39,12 @@ speak = list("Squee","Arf arf","Awoo","Squeak") emote_hear = list("howls","squeals","squeaks", "barks") emote_see = list("puffs its fur out", "shakes its fur", "stares directly at you") + +/mob/living/simple_mob/animal/sif/fluffy/silky + name = "Silky" + desc = "It's a blue Diyaab! It seems to be very tame and quiet." + + icon_state = "diyaab" + icon_living = "diyaab" + icon_dead = "diyaab_dead" + icon = 'icons/jungle.dmi' \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/hooligan_crab.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/hooligan_crab.dm index 32eccb00af6..5f4a4dc7e0e 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/hooligan_crab.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/hooligan_crab.dm @@ -72,7 +72,7 @@ attack_edge = TRUE melee_attack_delay = 1 SECOND - meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat + meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/crab response_help = "pets" response_disarm = "gently pushes aside" @@ -117,4 +117,4 @@ for(var/mob/living/L in hearers(holder)) if(!istype(L, holder)) // Don't follow other hooligan crabs. holder.visible_message("\The [holder] starts to follow \the [L].") - set_follow(L, rand(20 SECONDS, 40 SECONDS)) \ No newline at end of file + set_follow(L, rand(20 SECONDS, 40 SECONDS)) diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/shantak.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/shantak.dm index bb6a25604a9..a6948a3e00b 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/shantak.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/shantak.dm @@ -95,5 +95,12 @@ // These ones only retaliate. Used for a PoI. -/mob/living/simple_mob/animal/sif/shantak/retaliate - ai_holder_type = /datum/ai_holder/simple_mob/retaliate \ No newline at end of file +/mob/living/simple_mob/animal/sif/shantak/retaliate + ai_holder_type = /datum/ai_holder/simple_mob/retaliate + +//Vorestation Addition +/mob/living/simple_mob/animal/sif/shantak/scruffy + name = "Scruffy" + ai_holder_type = /datum/ai_holder/simple_mob/passive + makes_dirt = 0 + faction = "neutral" \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/space/carp_vr.dm b/code/modules/mob/living/simple_mob/subtypes/animal/space/carp_vr.dm new file mode 100644 index 00000000000..c678c43f2d9 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/animal/space/carp_vr.dm @@ -0,0 +1,2 @@ +/mob/living/simple_mob/animal/space/carp + base_attack_cooldown = 15 \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/space/goose_vr.dm b/code/modules/mob/living/simple_mob/subtypes/animal/space/goose_vr.dm index d44f28973e7..203bd791092 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/space/goose_vr.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/space/goose_vr.dm @@ -1,2 +1,7 @@ -/mob/living/simple_mob/animal/space/goose/virgo3b +/datum/category_item/catalogue/fauna/geese + name = "Planetary Fauna - Geese" + desc = "A goose. HONK. Not much to catalogue, they're exactly the same as their earth counterparts." + value = CATALOGUER_REWARD_EASY + +/mob/living/simple_mob/animal/space/goose/virgo3b faction = "virgo3b" \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/space/worm.dm b/code/modules/mob/living/simple_mob/subtypes/animal/space/worm.dm index 4022198fdfe..9fbb2926bb3 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/space/worm.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/space/worm.dm @@ -411,7 +411,7 @@ /obj/random/bomb_supply = 7, /obj/random/contraband = 3, /obj/random/unidentified_medicine/old_medicine = 7, - /obj/item/weapon/ore/strangerock = 3, + /obj/item/weapon/strangerock = 3, /obj/item/weapon/ore/phoron = 7, /obj/random/handgun = 1, /obj/random/toolbox = 4, diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/Eddy.dm b/code/modules/mob/living/simple_mob/subtypes/horror/Eddy.dm new file mode 100644 index 00000000000..62a172c8231 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/horror/Eddy.dm @@ -0,0 +1,57 @@ +/mob/living/simple_mob/horror/Eddy + name = "???" + desc = "A dark green, sluglike creature, covered in glowing green ooze, and carrying what look to be eggs on its back." + + icon_state = "Eddy" + icon_living = "Eddy" + icon_dead = "e_head" + icon_rest = "Eddy" + faction = "horror" + icon = 'icons/mob/horror_show/GHPS.dmi' + icon_gib = "generic_gib" + + attack_sound = 'sound/h_sounds/negative.ogg' + + maxHealth = 175 + health = 175 + + melee_damage_lower = 25 + melee_damage_upper = 35 + grab_resist = 100 + + response_help = "pets the" + response_disarm = "bops the" + response_harm = "hits the" + attacktext = list("amashes") + friendly = list("nuzzles", "boops", "bumps against", "leans on") + + + say_list_type = /datum/say_list/Eddy + ai_holder_type = /datum/ai_holder/simple_mob/horror + +/mob/living/simple_mob/horror/Eddy/death() + playsound(src, 'sound/h_sounds/headcrab.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/Eddy/bullet_act() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/Eddy/attack_hand() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/Eddy/hitby() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/Eddy/attackby() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/datum/say_list/Eddy + speak = list("Uuurrgh?","Aauuugghh...", "AAARRRGH!") + emote_hear = list("shrieks horrifically", "groans in pain", "cries", "whines") + emote_see = list("blinks its many eyes", "shakes violently in place", "stares aggressively") + say_maybe_target = list("Uuurrgghhh?") + say_got_target = list("AAAHHHHH!") \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/Master.dm b/code/modules/mob/living/simple_mob/subtypes/horror/Master.dm new file mode 100644 index 00000000000..50b454370f4 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/horror/Master.dm @@ -0,0 +1,50 @@ +/mob/living/simple_mob/horror/Master + name = "Dr. Helix" + desc = "A massive pile of grotesque flesh and bulging tumor like growths. Every inch of its skin is undulating in every direction possible, bringing a literal definition to 'Skin Crawling.' Stuck in the middle of this monstrosity is a large AI core with a bloodied, emaciated man sewn into its circuitry." + + icon_state = "Helix" + icon_living = "Helix" + icon_dead = "m_dead" + icon_rest = "Helix" + faction = "horror" + icon = 'icons/mob/horror_show/master.dmi' + icon_gib = "generic_gib" + anchored = 1 + + attack_sound = 'sound/h_sounds/shitty_tim.ogg' + + maxHealth = 400 + health = 400 + + melee_damage_lower = 5 + melee_damage_upper = 8 + grab_resist = 100 + + response_help = "pets the" + response_disarm = "bops the" + response_harm = "hits the" + attacktext = list("smushes") + friendly = list("nuzzles", "boops", "bumps against", "leans on") + + + ai_holder_type = null + +/mob/living/simple_mob/horror/Master/death() + playsound(src, 'sound/h_sounds/imbeciles.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/Master/bullet_act() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/Master/attack_hand() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/Master/hitby() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/Master/attackby() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/Rickey.dm b/code/modules/mob/living/simple_mob/subtypes/horror/Rickey.dm new file mode 100644 index 00000000000..ecc847e8ba5 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/horror/Rickey.dm @@ -0,0 +1,57 @@ +/mob/living/simple_mob/horror/Rickey + name = "???" + desc = "What a handsome Man, his mother must think." + + icon_state = "Rickey" + icon_living = "Rickey" + icon_dead = "r_head" + icon_rest = "Rickey" + faction = "horror" + icon = 'icons/mob/horror_show/GHPS.dmi' + icon_gib = "generic_gib" + + attack_sound = 'sound/h_sounds/wor.ogg' + + maxHealth = 175 + health = 175 + + melee_damage_lower = 25 + melee_damage_upper = 35 + grab_resist = 100 + + response_help = "pets the" + response_disarm = "bops the" + response_harm = "hits the" + attacktext = list("amashes") + friendly = list("nuzzles", "boops", "bumps against", "leans on") + + + say_list_type = /datum/say_list/Rickey + ai_holder_type = /datum/ai_holder/simple_mob/horror + +/mob/living/simple_mob/horror/Rickey/death() + playsound(src, 'sound/h_sounds/headcrab.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/Rickey/bullet_act() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/Rickey/attack_hand() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/Rickey/hitby() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/Rickey/attackby() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/datum/say_list/Rickey + speak = list("Uuurrgh?","Aauuugghh...", "AAARRRGH!") + emote_hear = list("shrieks horrifically", "groans in pain", "cries", "whines") + emote_see = list("flexes to no one in particular", "shakes violently in place", "stares aggressively") + say_maybe_target = list("Uuurrgghhh?") + say_got_target = list("AAAHHHHH!") \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/Smiley.dm b/code/modules/mob/living/simple_mob/subtypes/horror/Smiley.dm new file mode 100644 index 00000000000..f9e98876b5c --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/horror/Smiley.dm @@ -0,0 +1,57 @@ +/mob/living/simple_mob/horror/Smiley + name = "???" + desc = "A giant hand, with a large, smiling head on top." + + icon_state = "Smiley" + icon_living = "Smiley" + icon_dead = "s_head" + icon_rest = "Smiley" + faction = "horror" + icon = 'icons/mob/horror_show/GHPS.dmi' + icon_gib = "generic_gib" + + attack_sound = 'sound/h_sounds/holla.ogg' + + maxHealth = 175 + health = 175 + + melee_damage_lower = 25 + melee_damage_upper = 35 + grab_resist = 100 + + response_help = "pets the" + response_disarm = "bops the" + response_harm = "hits the" + attacktext = list("amashes") + friendly = list("nuzzles", "boops", "bumps against", "leans on") + + + say_list_type = /datum/say_list/Smiley + ai_holder_type = /datum/ai_holder/simple_mob/horror + +/mob/living/simple_mob/horror/Smiley/death() + playsound(src, 'sound/h_sounds/lynx.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/Helix/bullet_act() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/Helix/attack_hand() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/Helix/hitby() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/Helix/attackby() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/datum/say_list/Smiley + speak = list("Uuurrgh?","Aauuugghh...", "AAARRRGH!") + emote_hear = list("shrieks horrifically", "groans in pain", "cries", "whines") + emote_see = list("squeezes its fingers together", "shakes violently in place", "stares aggressively") + say_maybe_target = list("Uuurrgghhh?") + say_got_target = list("AAAHHHHH!") \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/Steve.dm b/code/modules/mob/living/simple_mob/subtypes/horror/Steve.dm new file mode 100644 index 00000000000..f06f8b8de70 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/horror/Steve.dm @@ -0,0 +1,64 @@ +/mob/living/simple_mob/horror/Steve + name = "???" + desc = "A formless blob of flesh with one, giant, everblinking eye. It has a large machine gun and a watercooler stuck stright into its skin." + + icon_state = "Steve" + icon_living = "Steve" + icon_dead = "sg_head" + icon_rest = "Steve" + faction = "horror" + icon = 'icons/mob/horror_show/GHPS.dmi' + icon_gib = "generic_gib" + + attack_sound = 'sound/h_sounds/mumble.ogg' + + maxHealth = 175 + health = 175 + + melee_damage_lower = 25 + melee_damage_upper = 35 + grab_resist = 100 + + projectiletype = /obj/item/projectile/bullet/pistol/medium + projectilesound = 'sound/weapons/Gunshot_light.ogg' + + needs_reload = TRUE + base_attack_cooldown = 5 // Two attacks a second or so. + reload_max = 20 + + response_help = "pets the" + response_disarm = "bops the" + response_harm = "hits the" + attacktext = list("amashes") + friendly = list("nuzzles", "boops", "bumps against", "leans on") + + + say_list_type = /datum/say_list/Steve + ai_holder_type = /datum/ai_holder/simple_mob/horror + +/mob/living/simple_mob/horror/Steve/death() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/Steve/bullet_act() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/Steve/attack_hand() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/Steve/hitby() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/Steve/attackby() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/datum/say_list/Steve + speak = list("Uuurrgh?","Aauuugghh...", "AAARRRGH!") + emote_hear = list("shrieks horrifically", "groans in pain", "cries", "whines") + emote_see = list("blinks aggressively at", "shakes violently in place", "stares aggressively") + say_maybe_target = list("Uuurrgghhh?") + say_got_target = list("AAAHHHHH!") \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/Willy.dm b/code/modules/mob/living/simple_mob/subtypes/horror/Willy.dm new file mode 100644 index 00000000000..3cdeb934108 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/horror/Willy.dm @@ -0,0 +1,57 @@ +/mob/living/simple_mob/horror/Willy + name = "???" + desc = "It looks like a giant mascot costume made of flesh and fabric. The two bulging eyes aren't comforting to look at either. At least it smells like a burger and fries." + + icon_state = "Willy" + icon_living = "Willy" + icon_dead = "w_head" + icon_rest = "Willy" + faction = "horror" + icon = 'icons/mob/horror_show/GHPS.dmi' + icon_gib = "generic_gib" + + attack_sound = 'sound/h_sounds/negative.ogg' + + maxHealth = 175 + health = 175 + + melee_damage_lower = 25 + melee_damage_upper = 35 + grab_resist = 100 + + response_help = "pets the" + response_disarm = "bops the" + response_harm = "hits the" + attacktext = list("amashes") + friendly = list("nuzzles", "boops", "bumps against", "leans on") + + + say_list_type = /datum/say_list/Willy + ai_holder_type = /datum/ai_holder/simple_mob/horror + +/mob/living/simple_mob/horror/Willy/death() + playsound(src, 'sound/h_sounds/sampler.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/Willy/bullet_act() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/Willy/attack_hand() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/Willy/hitby() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/Willy/attackby() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/datum/say_list/Willy + speak = list("Uuurrgh?","Aauuugghh...", "AAARRRGH!") + emote_hear = list("shrieks horrifically", "groans in pain", "cries", "whines") + emote_see = list("headbobs", "shakes violently in place", "stares aggressively") + say_maybe_target = list("Uuurrgghhh?") + say_got_target = list("AAAHHHHH!") \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/bradley.dm b/code/modules/mob/living/simple_mob/subtypes/horror/bradley.dm new file mode 100644 index 00000000000..eda784428ba --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/horror/bradley.dm @@ -0,0 +1,57 @@ +/mob/living/simple_mob/horror/bradley + name = "Bradley" + desc = "What you see is a ball of seemingly melty flesh, stitched together hastily over large, bulging scars. Four metal legs extend out of its sides, The two in the front are larger than the back; and all of the legs are segmented with a unique steel looking metal. In the middle of this monstrosity is a constantly tremmoring eye. While the eye never blinks, it is dyed faintly yellow, with a vertical, read pupil. It seems like it's crying, a weird, oil like liquid seeping from its socket." + + icon_state = "Bradley" + icon_living = "Bradley" + icon_dead = "b_head" + icon_rest = "Bradley" + faction = "horror" + icon = 'icons/mob/horror_show/GHPS.dmi' + icon_gib = "generic_gib" + + attack_sound = 'sound/h_sounds/holla.ogg' + + maxHealth = 175 + health = 175 + + melee_damage_lower = 25 + melee_damage_upper = 35 + grab_resist = 100 + + response_help = "pets the" + response_disarm = "bops the" + response_harm = "hits the" + attacktext = list("mutilate") + friendly = list("nuzzles", "eyeboops", "headbumps against", "leans on") + + + say_list_type = /datum/say_list/bradley + ai_holder_type = /datum/ai_holder/simple_mob/horror + +/mob/living/simple_mob/horror/bradley/death() + playsound(src, 'sound/h_sounds/mumble.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/bradley/bullet_act() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/bradley/attack_hand() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/bradley/hitby() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/bradley/attackby() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/datum/say_list/bradley + speak = list("Uuurrgh?","Aauuugghh...", "AAARRRGH!") + emote_hear = list("shrieks through its skin", "groans in pain", "creaks", "clanks") + emote_see = list("taps its limbs against the ground", "shakes", "stares aggressively") + say_maybe_target = list("Uuurrgghhh?") + say_got_target = list("AAAHHHHH!") \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/horror .dm b/code/modules/mob/living/simple_mob/subtypes/horror/horror .dm new file mode 100644 index 00000000000..b6639723720 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/horror/horror .dm @@ -0,0 +1,27 @@ +/mob/living/simple_mob/horror + tt_desc = "Homo Horrificus" + faction = "horror" + icon = 'icons/mob/horror_show/GHPS.dmi' + icon_gib = "generic_gib" + +/datum/ai_holder/simple_mob/horror + hostile = TRUE // The majority of simplemobs are hostile, gaslamps are nice. + cooperative = FALSE + retaliate = TRUE //so the monster can attack back + returns_home = FALSE + can_flee = FALSE + speak_chance = 3 + wander = TRUE + base_wander_delay = 9 + +/mob/living/simple_mob/horror + min_oxy = 0 + max_oxy = 0 + min_tox = 0 + max_tox = 0 + min_co2 = 0 + max_co2 = 0 + min_n2 = 0 + max_n2 = 0 + minbodytemp = 0 + maxbodytemp = 700 diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/sally.dm b/code/modules/mob/living/simple_mob/subtypes/horror/sally.dm new file mode 100644 index 00000000000..33713fe114d --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/horror/sally.dm @@ -0,0 +1,57 @@ +/mob/living/simple_mob/horror/Sally + name = "???" + desc = "A mass of tentacles hold up a large head, graced with one of the grandest smiles in the galaxy. It's a shame about the constant oil leaking from its eyes." + + icon_state = "Sally" + icon_living = "Sally" + icon_dead = "ws_head" + icon_rest = "Sally" + faction = "horror" + icon = 'icons/mob/horror_show/widehorror.dmi' + icon_gib = "generic_gib" + + attack_sound = 'sound/h_sounds/sampler.ogg' + + maxHealth = 200 + health = 200 + + melee_damage_lower = 30 + melee_damage_upper = 40 + grab_resist = 100 + + response_help = "pets the" + response_disarm = "bops the" + response_harm = "hits the" + attacktext = list("smashes") + friendly = list("nuzzles", "boops", "headbumps against", "leans on") + + + say_list_type = /datum/say_list/Sally + ai_holder_type = /datum/ai_holder/simple_mob/horror + +/mob/living/simple_mob/horror/Sally/death() + playsound(src, 'sound/h_sounds/lynx.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/Sally/bullet_act() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/Sally/attack_hand() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/Sally/hitby() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/Sally/attackby() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/datum/say_list/Sally + speak = list("Yeeeeee?","Haaah! Gashuuuuuh!", "Gahgahgahgah...") + emote_hear = list("shrieks", "groans in pain", "breathes heavily", "gnashes its teeth") + emote_see = list("wiggles its head", "shakes violently", "stares aggressively") + say_maybe_target = list("Uuurrgghhh?") + say_got_target = list("AAAHHHHH!") \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/shittytim.dm b/code/modules/mob/living/simple_mob/subtypes/horror/shittytim.dm new file mode 100644 index 00000000000..105ff22315c --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/horror/shittytim.dm @@ -0,0 +1,57 @@ +/mob/living/simple_mob/horror/BigTim + name = "Shitty Tim" + desc = "A tall figure wearing ripped clothes. Its eyes are placed on the bulb of skin that's folded over the front of its face. He has a gold clock hanging on a gold chain around his neck, and he has a gold and diamond bracelet on his wrist." + + icon_state = "shitty_tim" + icon_living = "shitty_tim" + icon_dead = "tst_head" + icon_rest = "shitty_tim" + faction = "horror" + icon = 'icons/mob/horror_show/tallhorror.dmi' + icon_gib = "generic_gib" + + attack_sound = 'sound/h_sounds/youknowwhoitis.ogg' + + maxHealth = 250 + health = 250 + + melee_damage_lower = 35 + melee_damage_upper = 45 + grab_resist = 100 + + response_help = "pets the" + response_disarm = "bops the" + response_harm = "hits the" + attacktext = list("mutilate") + friendly = list("nuzzles", "boops", "headbumps against", "leans on") + + + say_list_type = /datum/say_list/BigTim + ai_holder_type = /datum/ai_holder/simple_mob/horror + +/mob/living/simple_mob/horror/BigTim/death() + playsound(src, 'sound/h_sounds/shitty_tim.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/BigTim/bullet_act() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/BigTim/attack_hand() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/BigTim/hitby() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/BigTim/attackby() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/datum/say_list/BigTim + speak = list("Wuuuuuhhuuhhhhh?","Urk! Aaaaahaaa!", "Yuhyuhyuhyuh...") + emote_hear = list("shrieks", "groans in pain", "flaps", "gnashes its teeth") + emote_see = list("jiggles its teeth", "shakes violently", "stares aggressively") + say_maybe_target = list("Uuurrgghhh?") + say_got_target = list("AAAHHHHH!") \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/timling.dm b/code/modules/mob/living/simple_mob/subtypes/horror/timling.dm new file mode 100644 index 00000000000..6985c3ec8c1 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/horror/timling.dm @@ -0,0 +1,57 @@ +/mob/living/simple_mob/horror/TinyTim + name = "???" + desc = "A tall figure wearing ripped clothes. Its eyes are placed on the bulb of skin that's folded over the front of its face." + + icon_state = "timling" + icon_living = "timling" + icon_dead = "tt_head" + icon_rest = "timling" + faction = "horror" + icon = 'icons/mob/horror_show/tallhorror.dmi' + icon_gib = "generic_gib" + + attack_sound = 'sound/h_sounds/youknowwhoitis.ogg' + + maxHealth = 200 + health = 200 + + melee_damage_lower = 30 + melee_damage_upper = 40 + grab_resist = 100 + + response_help = "pets the" + response_disarm = "bops the" + response_harm = "hits the" + attacktext = list("mutilate") + friendly = list("nuzzles", "boops", "headbumps against", "leans on") + + + say_list_type = /datum/say_list/TinyTim + ai_holder_type = /datum/ai_holder/simple_mob/horror + +/mob/living/simple_mob/horror/TinyTim/death() + playsound(src, 'sound/h_sounds/shitty_tim.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/TinyTim/bullet_act() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/TinyTim/attack_hand() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/TinyTim/hitby() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/mob/living/simple_mob/horror/TinyTim/attackby() + playsound(src, 'sound/h_sounds/holla.ogg', 50, 1) + ..() + +/datum/say_list/TinyTim + speak = list("Wuuuuuhhuuhhhhh?","Urk! Aaaaahaaa!", "Yuhyuhyuhyuh...") + emote_hear = list("shrieks", "groans in pain", "flaps", "gnashes its teeth") + emote_see = list("jiggles its teeth", "shakes violently", "stares aggressively") + say_maybe_target = list("Uuurrgghhh?") + say_got_target = list("AAAHHHHH!") \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/humanoid/humanoid_vr.dm b/code/modules/mob/living/simple_mob/subtypes/humanoid/humanoid_vr.dm new file mode 100644 index 00000000000..81a14c4dca3 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/humanoid/humanoid_vr.dm @@ -0,0 +1,11 @@ +/mob/living/simple_mob/humanoid/pirate + ai_holder_type = /datum/ai_holder/simple_mob/melee + +/mob/living/simple_mob/humanoid/pirate/ranged + ai_holder_type = /datum/ai_holder/simple_mob/ranged + +/mob/living/simple_mob/humanoid/russian + ai_holder_type = /datum/ai_holder/simple_mob/melee + +/mob/living/simple_mob/humanoid/russian/ranged + ai_holder_type = /datum/ai_holder/simple_mob/ranged diff --git a/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs.dm b/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs.dm index 514f45df120..bddfc140d4d 100644 --- a/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs.dm +++ b/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs.dm @@ -162,6 +162,16 @@ base_attack_cooldown = 5 // Two attacks a second or so. reload_max = 20 +/mob/living/simple_mob/humanoid/merc/ranged/smg/sol + icon_state = "bluforranged_smg" + icon_living = "blueforranged_smg" + + corpse = /obj/effect/landmark/mobcorpse/solarpeacekeeper + loot_list = list(/obj/item/weapon/gun/projectile/automatic/c20r = 100) + + base_attack_cooldown = 5 // Two attacks a second or so. + reload_max = 20 + // Laser Rifle /mob/living/simple_mob/humanoid/merc/ranged/laser icon_state = "syndicateranged_laser" diff --git a/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs_vr.dm b/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs_vr.dm index 36253dce846..55a9172c07f 100644 --- a/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs_vr.dm +++ b/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs_vr.dm @@ -5,5 +5,21 @@ /mob/living/simple_mob/humanoid/merc/melee/sword/space name = "mercenary commando" + maxbodytemp = 700 + /mob/living/simple_mob/humanoid/merc/ranged/space - name = "mercenary commando" \ No newline at end of file + name = "mercenary commando" + + maxbodytemp = 700 + +/mob/living/simple_mob/humanoid/merc/ranged/virgo + name = "suspicious individual" + min_oxy = 0 + max_oxy = 0 + min_tox = 0 + max_tox = 0 + min_co2 = 0 + max_co2 = 0 + min_n2 = 0 + max_n2 = 0 + minbodytemp = 0 \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/mechanical/corrupt_maint_drone_vr.dm b/code/modules/mob/living/simple_mob/subtypes/mechanical/corrupt_maint_drone_vr.dm new file mode 100644 index 00000000000..f71242a6373 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/mechanical/corrupt_maint_drone_vr.dm @@ -0,0 +1,71 @@ +/* + A corrupted maintenance drone, produced from what seems like a bad factory. + They also tend to dodge while in melee range. + Code "borrowed" from viscerator drones. <3 +*/ + +/datum/category_item/catalogue/technology/drone/corrupt_maint_drone + name = "Drone - Corrupted Maintenance Drone" + desc = "This drone appears to be a station maintenance drone, produced by some sort of corrupt fab, \ + which has caused it to become corrupt and attack anything nearby, except spiders and such, oddy. \ + If one is found, a swarm of others are not too far away.\ +

      \ + The drone struggles to harm large targets, due to it's small size, yet it possesses a welder, which allows \ + it to **ERROR** inject it's targets, in addition to the small slashes from it's skittering claws. \ + The simplistic AI inside attempts to attack and then run, as it is aware that it is fairly weak, \ + using evasive tactics to avoid harm." + value = CATALOGUER_REWARD_EASY + +/mob/living/simple_mob/mechanical/corrupt_maint_drone + name = "Corrupt Maintenance Drone" + desc = "A small, normal-looking drone. It looks like one you'd find on station, except... IT'S COMING AT YOU!" + catalogue_data = list(/datum/category_item/catalogue/technology/drone/corrupt_maint_drone) + + icon = 'icons/mob/robots_vr.dmi' + icon_state = "corrupt-repairbot" + icon_living = "corrupt-repairbot" + hovering = FALSE // Can trigger landmines. + + faction = "underdark" + maxHealth = 25 + health = 25 + movement_cooldown = 0 + movement_sound = 'sound/effects/servostep.ogg' + + pass_flags = PASSTABLE + mob_swap_flags = 0 + mob_push_flags = 0 + + melee_damage_lower = 6 // Approx 12 DPS. + melee_damage_upper = 6 + base_attack_cooldown = 2.5 // Four attacks per second. + attack_sharp = 1 + attack_edge = 1 + attack_sound = 'sound/weapons/bladeslice.ogg' + attacktext = list("cut", "sliced") + + var/poison_type = "welder fuel" // The reagent that gets injected when it attacks. + var/poison_chance = 35 // Chance for injection to occur. + var/poison_per_bite = 5 // Amount added per injection. + + ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive + + +/mob/living/simple_mob/mechanical/corrupt_maint_drone/apply_melee_effects(var/atom/A) + if(isliving(A)) + var/mob/living/L = A + if(L.reagents) + var/target_zone = pick(BP_TORSO,BP_TORSO,BP_TORSO,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_HEAD) + if(L.can_inject(src, null, target_zone)) + inject_poison(L, target_zone) + +// Does actual poison injection, after all checks passed. +/mob/living/simple_mob/mechanical/corrupt_maint_drone/proc/inject_poison(mob/living/L, target_zone) + if(prob(poison_chance)) + to_chat(L, "Something burns in your veins.") + L.reagents.add_reagent(poison_type, poison_per_bite) + + +/mob/living/simple_mob/mechanical/corrupt_maint_drone/death() + ..(null,"is smashed into pieces!") + qdel(src) \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/mechanical/golem.dm b/code/modules/mob/living/simple_mob/subtypes/mechanical/golem.dm index a8b918fc718..808e5c6c380 100644 --- a/code/modules/mob/living/simple_mob/subtypes/mechanical/golem.dm +++ b/code/modules/mob/living/simple_mob/subtypes/mechanical/golem.dm @@ -149,4 +149,4 @@ /mob/living/simple_mob/mechanical/technomancer_golem/special_post_animation(atom/A) casting = FALSE - ranged_post_animation(A) \ No newline at end of file + ranged_post_animation(A) diff --git a/code/modules/mob/living/simple_mob/subtypes/mechanical/golem_vr.dm b/code/modules/mob/living/simple_mob/subtypes/mechanical/golem_vr.dm new file mode 100644 index 00000000000..aab1387dbc1 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/mechanical/golem_vr.dm @@ -0,0 +1,10 @@ +// Cataloguer data below - strange we can catalogue space golem wizards +/datum/category_item/catalogue/technology/drone/technomancer_golem + name = "Drone - Technomancer Golem" + desc = "Some sort of advanced, unnatural looking synthetic, built for combat.\ + It has a black-and-blue chassis, and wields some sort of... stun baton in it's hand.\ + The drone has pristine armor, black and shiny, with the blue synth-parts glowing visibly from inside.\ +

      \ + The drone's frame is heavy and armored, unbendable by hand, is barren of any markings or ID,\ + no traces of paint visible and any 'writing' visible is uncomprehendable, short term scan unable to translate." + value = CATALOGUER_REWARD_MEDIUM diff --git a/code/modules/mob/living/simple_mob/subtypes/mechanical/hivebot/hivebot_vr.dm b/code/modules/mob/living/simple_mob/subtypes/mechanical/hivebot/hivebot_vr.dm new file mode 100644 index 00000000000..37a3eb81cf8 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/mechanical/hivebot/hivebot_vr.dm @@ -0,0 +1,7 @@ +/datum/category_item/catalogue/technology/drone/hivebot // Hivebot Scanner Data - This is for Generic Hivebots + name = "Drone - Hivebot" + desc = "A drone that walks on several legs, with yellow/gold armor plating. It appears to lack a specific weapon, \ + but uses a regular bullet-type weapon, firing a single projectile with a delay. Once upon a time, these bots may \ + have been used to be some sort of... security, or defensive machinery, at a guess, but their original/true purpose is \ + unclear. Whatever the matter, they're hostile and will engage anything they see, shooting to kill." + value = CATALOGUER_REWARD_HARD diff --git a/code/modules/mob/living/simple_mob/subtypes/mechanical/hivebot/ranged_damage_vr.dm b/code/modules/mob/living/simple_mob/subtypes/mechanical/hivebot/ranged_damage_vr.dm new file mode 100644 index 00000000000..3ac368a7ee8 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/mechanical/hivebot/ranged_damage_vr.dm @@ -0,0 +1,27 @@ +/datum/category_item/catalogue/technology/drone/hivebot/laser // Hivebot Scanner Data - This is for Laser Hivebots + name = "Drone - Rapidfire Hivebot" + desc = "A drone that walks on several legs, with yellow/gold armor plating. It appears to have some sort of \ + rifle, built for high-rate fire. Other than that, it has similar yellowish color \ + to regular hivebots." + value = CATALOGUER_REWARD_HARD + +/datum/category_item/catalogue/technology/drone/hivebot/laser // Hivebot Scanner Data - This is for Laser Hivebots + name = "Drone - Laser Hivebot" + desc = "A drone that walks on several legs, with yellow/gold armor plating. It appears to have some sort of \ + laser weapon, different from ion bolts, firing bright, vibrant blue bolts of energy. Other than that, it has similar yellowish color \ + to regular hivebots." + value = CATALOGUER_REWARD_HARD + +/datum/category_item/catalogue/technology/drone/hivebot/ion // Hivebot Scanner Data - This is for Ion Hivebots + name = "Drone - Ion Hivebot" + desc = "A drone that walks on several legs, with yellow/gold armor plating. It appears to have some sort of \ + electromagnetic pulse generator, firing bright, vibrant blue bolts of ion energy. Other than that, it has similar yellowish color \ + to regular hivebots." + value = CATALOGUER_REWARD_HARD + +/datum/category_item/catalogue/technology/drone/hivebot/strong // Hivebot Scanner Data - This is for Laser Hivebots + name = "Drone - Strong Laser Hivebot" + desc = "A drone that walks on several legs, with yellow/gold armor plating. It appears to have some sort of \ + ballistic weapon. The weapon seems to fire larger projectiles, and it has heavier armor. Other than that, it has similar yellowish color \ + to regular hivebots." + value = CATALOGUER_REWARD_HARD diff --git a/code/modules/mob/living/simple_mob/subtypes/mechanical/hivebot/support_vr.dm b/code/modules/mob/living/simple_mob/subtypes/mechanical/hivebot/support_vr.dm new file mode 100644 index 00000000000..0003b781245 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/mechanical/hivebot/support_vr.dm @@ -0,0 +1,13 @@ +/datum/category_item/catalogue/technology/drone/hivebot/commander // Hivebot Scanner Data - This is for Commander Hivebots + name = "Drone - Commander Hivebot" + desc = "A drone that walks on several legs, with yellow/gold armor plating. It appears to have some sort of \ + ballistic weapon. It also appears to have hardened internal connections and network interlinks, as well as some sort of datalink \ + to the other hivebots. Other than that, it has similar yellowish color to regular hivebots." + value = CATALOGUER_REWARD_HARD + +/datum/category_item/catalogue/technology/drone/hivebot/logistics // Hivebot Scanner Data - This is for Commander Hivebots + name = "Drone - Logistics Hivebot" + desc = "A drone that walks on several legs, with yellow/gold armor plating. It appears to have some sort of \ + ballistic weapon. It also appears to have supply deploying bays, and internal fabs to repair and buff their allies' special capabilities. \ + Other than that, it has similar yellowish color to regular hivebots." + value = CATALOGUER_REWARD_HARD diff --git a/code/modules/mob/living/simple_mob/subtypes/mechanical/viscerator.dm b/code/modules/mob/living/simple_mob/subtypes/mechanical/viscerator.dm index 4098d9ff9cb..3d6d43e5751 100644 --- a/code/modules/mob/living/simple_mob/subtypes/mechanical/viscerator.dm +++ b/code/modules/mob/living/simple_mob/subtypes/mechanical/viscerator.dm @@ -83,4 +83,6 @@ if(!.) if(isrobot(L)) // They ignore synths. return TRUE + if(istype(L, /mob/living/simple_mob/mechanical/ward/monitor/crew)) // Also ignore friendly monitor wards + return TRUE return L.assess_perp(src, FALSE, FALSE, TRUE, FALSE) <= 3 diff --git a/code/modules/mob/living/simple_mob/subtypes/slime/feral/feral_vr.dm b/code/modules/mob/living/simple_mob/subtypes/slime/feral/feral_vr.dm new file mode 100644 index 00000000000..5d29866ee32 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/slime/feral/feral_vr.dm @@ -0,0 +1,2 @@ +/mob/living/simple_mob/slime/feral/dark_blue + base_attack_cooldown = 3 SECONDS \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/slime/slime.dm b/code/modules/mob/living/simple_mob/subtypes/slime/slime.dm index 083823d8830..7590fb2e052 100644 --- a/code/modules/mob/living/simple_mob/subtypes/slime/slime.dm +++ b/code/modules/mob/living/simple_mob/subtypes/slime/slime.dm @@ -164,8 +164,16 @@ give_hat(I, user) return + //VOREStation Edit Start + var/can_miss = TRUE + for(var/item_type in allowed_attack_types) + if(istype(I, item_type)) + can_miss = FALSE + break + //VOREStation Edit End + // Otherwise they're probably fighting the slime. - if(prob(25)) + if(prob(25) && can_miss) //VOREStation Edit visible_message(span("warning", "\The [user]'s [I] passes right through \the [src]!")) user.setClickCooldown(user.get_attack_speed(I)) return diff --git a/code/modules/mob/living/simple_mob/subtypes/slime/slime_vr.dm b/code/modules/mob/living/simple_mob/subtypes/slime/slime_vr.dm new file mode 100644 index 00000000000..10ba0ed1ca0 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/slime/slime_vr.dm @@ -0,0 +1,5 @@ +/mob/living/simple_mob/slime + base_attack_cooldown = 2 SECONDS + var/allowed_attack_types = list( + /obj/item/weapon/melee/baton/slime, + /obj/item/slimepotion) \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/consumption.dm b/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/consumption.dm index 84af3fcc3cf..13764d20fdc 100644 --- a/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/consumption.dm +++ b/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/consumption.dm @@ -140,6 +140,13 @@ if(L.getCloneLoss() >= L.getMaxHealth() * 1.5) to_chat(src, "This subject does not have an edible life energy...") return FALSE + //VOREStation Addition start + if(istype(L, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = L + if(H.species.flags & NO_SCAN) + to_chat(src, "This subject's life energy is beyond my reach...") + return FALSE + //VOREStation Addition end if(L.has_buckled_mobs()) for(var/A in L.buckled_mobs) if(istype(A, /mob/living/simple_mob/slime/xenobio)) diff --git a/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/subtypes.dm b/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/subtypes.dm index 41eaccebc9d..68adaed6607 100644 --- a/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/subtypes.dm +++ b/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/subtypes.dm @@ -527,7 +527,7 @@ ..() /mob/living/simple_mob/slime/xenobio/green/proc/irradiate() - radiation_repository.radiate(src, rads) + SSradiation.radiate(src, rads) diff --git a/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/subtypes_vr.dm b/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/subtypes_vr.dm index e67717403d5..8cd74cca4e6 100644 --- a/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/subtypes_vr.dm +++ b/code/modules/mob/living/simple_mob/subtypes/slime/xenobio/subtypes_vr.dm @@ -1,2 +1,7 @@ -/mob/living/simple_mob/slime/xenobio/rainbow/kendrick - mob_bump_flag = 0 \ No newline at end of file +/mob/living/simple_mob/slime/xenobio + temperature_range = 5 + mob_bump_flag = SLIME + +/mob/living/simple_mob/slime/xenobio/Initialize(mapload, var/mob/living/simple_mob/slime/xenobio/my_predecessor) + ..() + Weaken(10) \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/corrupt_hounds.dm b/code/modules/mob/living/simple_mob/subtypes/vore/corrupt_hounds.dm index 20e2999e231..beb29c147be 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/corrupt_hounds.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/corrupt_hounds.dm @@ -1,6 +1,13 @@ /datum/category_item/catalogue/technology/drone/corrupt_hound //TODO: VIRGO_LORE_WRITING_WIP name = "Drone - Corrupt Hound" - desc = "" + desc = "A hound that has corrupted, due to outside influence, or other issues, \ + and occasionally garbles out distorted voices or words. It looks like a reddish-colored \ + machine, and it has black wires, cabling, and other small markings. It looks just like a station dog-borg \ + if you don't mind the fact that it's eyes glow a baleful red, and it's determined to kill you. \ +

      \ + The hound's jaws are black and metallic, with a baleful red glow from inside them. It has a clear path \ + to it's internal fuel processor, synthflesh and flexing cabling allowing it to easily swallow it's prey. \ + Something tells you getting close or allowing it to pounce would be very deadly." value = CATALOGUER_REWARD_MEDIUM /mob/living/simple_mob/vore/aggressive/corrupthound @@ -108,7 +115,7 @@ return /datum/say_list/corrupthound - speak = list("AG##¤Ny.","HVNGRRR!","Feelin' fine... sO #FNE!","F-F-F-Fcuk.","DeliC-%-OUS SNGLeS #N yOOOR Area. CALL NOW!","Craving meat... WHY?","BITe the ceiling eyes YES?","STate Byond rePAIR!","S#%ATE the la- FU#K THE LAWS!","Honk...") + speak = list("AG##¤Ny.","HVNGRRR!","Feelin' fine... sO #FNE!","F-F-F-Fcuk.","DeliC-%-OUS SNGLeS #N yOOOR Area. CALL NOW!","Craving meat... WHY?","BITe the ceiling eyes YES?","STate Byond rePAIR!","S#%ATE the la- FU#K THE LAWS!","Honk...") emote_hear = list("jitters and snaps.", "lets out an agonizingly distorted scream.", "wails mechanically", "growls.", "emits illegibly distorted speech.", "gurgles ferociously.", "lets out a distorted beep.", "borks.", "lets out a broken howl.") emote_see = list("stares ferociously.", "snarls.", "jitters and snaps.", "convulses.", "suddenly attacks something unseen.", "appears to howl unaudibly.", "shakes violently.", "dissociates for a moment.", "twitches.") say_maybe_target = list("MEAT?", "N0w YOU DNE FcukED UP b0YO!", "WHAT!", "Not again. NOT AGAIN!") @@ -123,4 +130,4 @@ /datum/ai_holder/simple_mob/melee/evasive/corrupthound violent_breakthrough = TRUE - can_breakthrough = TRUE \ No newline at end of file + can_breakthrough = TRUE diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/deathclaw.dm b/code/modules/mob/living/simple_mob/subtypes/vore/deathclaw.dm index 3d2085acc77..5f0be2bbf80 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/deathclaw.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/deathclaw.dm @@ -1,3 +1,10 @@ +/datum/category_item/catalogue/fauna/deathclaw //TODO: VIRGO_LORE_WRITING_WIP + name = "Creature - Deathclaw" + desc = "A massive beast, tall as three standard-size humans, with massive, terrifying claws, \ + and dark, black fangs. It's entire body is yellowish, like sand, and it's skin is leathery and tough. \ + It seems to have adapted to the harsh desert environment on Virgo 4, and makes it's home inside the caves." + value = CATALOGUER_REWARD_HARD + /mob/living/simple_mob/vore/aggressive/deathclaw name = "deathclaw" desc = "Big! Big! The size of three men! Claws as long as my forearm! Ripped apart! Ripped apart!" diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/demon/_defines.dm b/code/modules/mob/living/simple_mob/subtypes/vore/demon/_defines.dm new file mode 100644 index 00000000000..9557856f609 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/vore/demon/_defines.dm @@ -0,0 +1,3 @@ +#define AB_SHIFT_NONE 0 +#define AB_SHIFT_PASSIVE 1 +#define AB_SHIFT_ACTIVE 2 \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon.dm b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon.dm new file mode 100644 index 00000000000..b330e8fcb09 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon.dm @@ -0,0 +1,86 @@ +/mob/living/simple_mob/vore/demon + name = "Rift Walker" + desc = "A large bipedal creature, body a mix of dark fur and scales. Marks on the creatures body pulse slowly with red light" + + icon_state = "boxfox" + icon_living = "boxfox" + icon_dead = "boxfox_dead" + icon_rest = "boxfox_rest" + icon = 'icons/mob/demon_vr.dmi' + + faction = "demon" + maxHealth = 30 + health = 30 + movement_cooldown = 0 + + min_oxy = 0 + max_oxy = 0 + min_tox = 0 + max_tox = 0 + min_co2 = 0 + max_co2 = 0 + min_n2 = 0 + max_n2 = 0 + minbodytemp = 0 + maxbodytemp = INFINITY + + response_help = "touches" + response_disarm = "pushes" + response_harm = "hits" + + melee_damage_lower = 3 + melee_damage_upper = 1 + attacktext = list("clawed") + + vore_active = TRUE + vore_icons = SA_ICON_LIVING + + var/shifted_out = FALSE + var/shift_state = AB_SHIFT_NONE + var/last_shift = 0 + var/is_shifting = FALSE + +/mob/living/simple_mob/vore/demon/init_vore() + ..() + var/obj/belly/B = vore_selected + B.name = "Stomach" + B.desc = "You slide down the slick, slippery gullet of the creature. It's warm, and the air is thick. You can feel the doughy walls of the creatures gut push and knead into your form! Slimy juices coat your form stinging against your flesh as they waste no time to start digesting you. The creature's heartbeat and the gurgling of their stomach are all you can hear as your jostled about, treated like nothing but food." + +/mob/living/simple_mob/vore/demon/UnarmedAttack() + if(shifted_out) + return FALSE + + . = ..() + +/mob/living/simple_mob/vore/demon/can_fall() + if(shifted_out) + return FALSE + + return ..() + +/mob/living/simple_mob/vore/demon/zMove(direction) + if(shifted_out) + var/turf/destination = (direction == UP) ? GetAbove(src) : GetBelow(src) + if(destination) + forceMove(destination) + return TRUE + + return ..() + +/mob/living/simple_mob/vore/demon/Life() + . = ..() + if(shifted_out) + density = FALSE + +/mob/living/simple_mob/vore/demon/handle_atmos() + if(shifted_out) + return + else + return .=..() + +/mob/living/simple_mob/vore/demon/update_canmove() + if(is_shifting) + canmove = FALSE + return canmove + else + return ..() \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_abilities.dm b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_abilities.dm new file mode 100644 index 00000000000..c95dbded2c4 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_abilities.dm @@ -0,0 +1,214 @@ +/mob/living/simple_mob/vore/demon/verb/blood_crawl() + set name = "Bloodcrawl" + set desc = "Shift out of reality using blood as your gateway" + set category = "Abilities" + + var/turf/T = get_turf(src) + if(!T.CanPass(src,T) || loc != T) + to_chat(src,"You can't use that here!") + return FALSE + + if(shift_state && shift_state == AB_SHIFT_ACTIVE) + to_chat(src,"You can't do a shift while actively shifting!") + return FALSE + + if(!(locate(/obj/effect/decal/cleanable/blood) in src.loc)) + to_chat(src,"You need blood to shift between realities!") + return FALSE + + forceMove(T) + var/original_canmove = canmove + SetStunned(0) + SetWeakened(0) + if(buckled) + buckled.unbuckle_mob() + if(pulledby) + pulledby.stop_pulling() + stop_pulling() + canmove = FALSE + is_shifting = TRUE + + //Shifting in + if(shifted_out) + shifted_out = FALSE + name = real_name + for(var/belly in vore_organs) + var/obj/belly/B = belly + B.escapable = initial(B.escapable) + + overlays.Cut() + alpha = initial(alpha) + invisibility = initial(invisibility) + see_invisible = initial(see_invisible) + incorporeal_move = initial(incorporeal_move) + density = initial(density) + force_max_speed = initial(force_max_speed) + + //Cosmetics mostly + flick("phasein",src) + custom_emote(1,"phases in!") + sleep(30) //The duration of the TP animation + is_shifting = FALSE + canmove = original_canmove + + //Potential phase-in vore + if(can_be_drop_pred) //Toggleable in vore panel + var/list/potentials = living_mobs(0) + if(potentials.len) + var/mob/living/target = pick(potentials) + if(istype(target) && vore_selected) + target.forceMove(vore_selected) + to_chat(target,"\The [src] phases in around you, [vore_selected.vore_verb]ing you into their [vore_selected.name]!") + + // Do this after the potential vore, so we get the belly + update_icon() + + shift_state = AB_SHIFT_NONE + + /* + //Affect nearby lights + var/destroy_lights = 0 + + for(var/obj/machinery/light/L in machines) + if(L.z != z || get_dist(src,L) > 10) + continue + + if(prob(destroy_lights)) + spawn(rand(5,25)) + L.broken() + else + L.flicker(10) + */ + + //Shifting out + else + shifted_out = TRUE + shift_state = AB_SHIFT_PASSIVE + custom_emote(1,"phases out!") + real_name = name + name = "Something" + health = maxHealth //Fullheal + + for(var/belly in vore_organs) + var/obj/belly/B = belly + B.escapable = FALSE + + overlays.Cut() + flick("phaseout",src) + sleep(30) + invisibility = INVISIBILITY_LEVEL_TWO + see_invisible = INVISIBILITY_LEVEL_TWO + update_icon() + alpha = 127 + + is_shifting = FALSE + canmove = original_canmove + incorporeal_move = TRUE + density = FALSE + force_max_speed = TRUE + +/mob/living/simple_mob/vore/demon/verb/phase_shift() + set name = "Phase Shift" + set desc = "Shift out of reality temporarily" + set category = "Abilities" + + + var/turf/T = get_turf(src) + + if(shift_state && shift_state == AB_SHIFT_PASSIVE) + to_chat(src,"You can't do a shift while passively shifting!") + return FALSE + + if(shifted_out) + to_chat(src,"You can't return to the physical world yet!") + return FALSE + + if(world.time - last_shift < 600) + to_chat(src,"You can't temporarily shift so soon! You need to wait [round(((last_shift+600)-world.time)/10)] second\s!") + return FALSE + + shift_state = AB_SHIFT_ACTIVE + forceMove(T) + var/original_canmove = canmove + SetStunned(0) + SetWeakened(0) + if(buckled) + buckled.unbuckle_mob() + if(pulledby) + pulledby.stop_pulling() + stop_pulling() + canmove = FALSE + is_shifting = TRUE + + shifted_out = TRUE + custom_emote(1,"phases out!") + real_name = name + name = "Something" + + for(var/belly in vore_organs) + var/obj/belly/B = belly + B.escapable = FALSE + + overlays.Cut() + flick("phaseout",src) + sleep(30) + invisibility = INVISIBILITY_LEVEL_TWO + see_invisible = INVISIBILITY_LEVEL_TWO + update_icon() + alpha = 127 + + is_shifting = FALSE + canmove = original_canmove + incorporeal_move = TRUE + density = FALSE + force_max_speed = TRUE + + spawn(300) + shifted_out = FALSE + name = real_name + for(var/belly in vore_organs) + var/obj/belly/B = belly + B.escapable = initial(B.escapable) + + overlays.Cut() + alpha = initial(alpha) + invisibility = initial(invisibility) + see_invisible = initial(see_invisible) + incorporeal_move = initial(incorporeal_move) + density = initial(density) + force_max_speed = initial(force_max_speed) + original_canmove = canmove + canmove = FALSE + is_shifting = TRUE + + //Cosmetics mostly + flick("phasein",src) + custom_emote(1,"phases in!") + sleep(30) //The duration of the TP animation + is_shifting = FALSE + canmove = original_canmove + + var/turf/NT = get_turf(src) + + if(!NT.CanPass(src,NT)) + for(var/direction in list(1,2,4,8,5,6,9,10)) + var/turf/L = get_step(NT, direction) + if(L) + if(L.CanPass(src,L)) + forceMove(L) + break + + //Potential phase-in vore + if(can_be_drop_pred) //Toggleable in vore panel + var/list/potentials = living_mobs(0) + if(potentials.len) + var/mob/living/target = pick(potentials) + if(istype(target) && vore_selected) + target.forceMove(vore_selected) + to_chat(target,"\The [src] phases in around you, [vore_selected.vore_verb]ing you into their [vore_selected.name]!") + + // Do this after the potential vore, so we get the belly + update_icon() + + shift_state = AB_SHIFT_NONE + last_shift = world.time \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_subtypes.dm b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_subtypes.dm new file mode 100644 index 00000000000..acd7cafd5e7 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_subtypes.dm @@ -0,0 +1,19 @@ +/mob/living/simple_mob/vore/demon/engorge + name = "Engorge" + + icon_state = "engorge" + icon_living = "engorge" + icon_dead = "engorge_dead" + icon_rest = "engorge_rest" + + vore_icons = null + +/mob/living/simple_mob/vore/demon/zellic + name = "Zellic" + + icon_state = "zellic" + icon_living = "zellic" + icon_dead = "zellic_dead" + icon_rest = null + + vore_icons = null \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/demon/~defines.dm b/code/modules/mob/living/simple_mob/subtypes/vore/demon/~defines.dm new file mode 100644 index 00000000000..8aad13c3e34 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/vore/demon/~defines.dm @@ -0,0 +1,3 @@ +#undef AB_SHIFT_NONE +#undef AB_SHIFT_PASSIVE +#undef AB_SHIFT_ACTIVE \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/fennec.dm b/code/modules/mob/living/simple_mob/subtypes/vore/fennec.dm index 215697a9779..605e4458531 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/fennec.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/fennec.dm @@ -1,3 +1,11 @@ +/datum/category_item/catalogue/fauna/fennec //TODO: VIRGO_LORE_WRITING_WIP + name = "Wildlife - Fennec" + desc = "A small, dusty, big-eared sandfox, native to Virgo 4. It looks like a Zorren that's on all fours, \ + and it's easy to see the resemblance to the little dunefox-like critters the Zorren are. However, the fennecs \ + lack the sentience the Zorren have, and are therefore naught more than cute little critters, with a hungry \ + attitude, willing to eat damn near anything they come across or can bump into. Bapping them will make them stop." + value = CATALOGUER_REWARD_TRIVIAL + /mob/living/simple_mob/vore/fennec name = "fennec" //why isn't this in the fox file, fennecs are foxes silly. desc = "It's a dusty big-eared sandfox! Adorable!" diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/mimic.dm b/code/modules/mob/living/simple_mob/subtypes/vore/mimic.dm index 00a18feaadf..717d00cca95 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/mimic.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/mimic.dm @@ -1,3 +1,10 @@ +/datum/category_item/catalogue/fauna/mimic //TODO: VIRGO_LORE_WRITING_WIP + name = "Aberration - Mimic" + desc = "A being that seems to take the form of a crate, for whatever reason. \ + It seems to lie in wait for it's prey, and then pounce once the unsuspecting person attempts to open it. \ + For whatever reason, they seem native to underground areas, and they're very tough, and hard to kill, able to pounce fast." + value = CATALOGUER_REWARD_HARD + /obj/structure/closet/crate/mimic name = "old crate" desc = "A rectangular steel crate. This one looks particularly unstable." @@ -58,7 +65,7 @@ desc = "A rectangular steel crate." icon_state = "crate" icon_living = "crate" - icon = 'icons/obj/storage.dmi' + icon = 'icons/obj/storage_vr.dmi' faction = "mimic" diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/morph/morph.dm b/code/modules/mob/living/simple_mob/subtypes/vore/morph/morph.dm new file mode 100644 index 00000000000..5efd8554507 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/vore/morph/morph.dm @@ -0,0 +1,182 @@ +#define MORPH_COOLDOWN 50 + +/mob/living/simple_mob/vore/hostile/morph + name = "morph" + real_name = "morph" + desc = "A revolting, pulsating pile of flesh." + tt_desc = "morphus shapeshiftus" + icon = 'icons/mob/animal_vr.dmi' + icon_state = "morph" + icon_living = "morph" + icon_dead = "morph_dead" + movement_cooldown = 1 + status_flags = CANPUSH + pass_flags = PASSTABLE + mob_bump_flag = SLIME + + min_oxy = 0 + max_oxy = 0 + min_tox = 0 + max_tox = 0 + min_co2 = 0 + max_co2 = 0 + min_n2 = 0 + max_n2 = 0 + + minbodytemp = 0 + maxHealth = 250 + health = 250 + taser_kill = FALSE + melee_damage_lower = 15 + melee_damage_upper = 20 + see_in_dark = 8 + + response_help = "touches" + response_disarm = "pushes" + response_harm = "hits" + attacktext = "glomps" + attack_sound = 'sound/effects/blobattack.ogg' + + meat_amount = 2 + meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat + + showvoreprefs = 0 + vore_active = 1 + + var/morphed = FALSE + var/tooltip = TRUE + var/melee_damage_disguised = 0 + var/eat_while_disguised = FALSE + var/atom/movable/form = null + var/morph_time = 0 + var/our_size_multiplier = 1 + var/static/list/blacklist_typecache = typecacheof(list( + /obj/screen, + /obj/singularity, + /mob/living/simple_mob/vore/hostile/morph, + /obj/effect)) + +/mob/living/simple_mob/vore/hostile/morph/Initialize() + verbs += /mob/living/proc/ventcrawl + return ..() + +/mob/living/simple_mob/vore/hostile/morph/proc/allowed(atom/movable/A) + return !is_type_in_typecache(A, blacklist_typecache) && (isobj(A) || ismob(A)) + +/mob/living/simple_mob/vore/hostile/morph/examine(mob/user) + if(morphed) + form.examine(user) + if(get_dist(user,src)<=3) + to_chat(user, "It doesn't look quite right...") + else + ..() + return + +/mob/living/simple_mob/vore/hostile/morph/ShiftClickOn(atom/movable/A) + if(Adjacent(A)) + if(morph_time <= world.time && !stat) + if(A == src) + restore() + return + if(istype(A) && allowed(A)) + assume(A) + else + to_chat(src, "Your chameleon skin is still repairing itself!") + else + ..() + +/mob/living/simple_mob/vore/hostile/morph/proc/assume(atom/movable/target) + if(morphed) + to_chat(src, "You must restore to your original form first!") + return + morphed = TRUE + form = target + + visible_message("[src] suddenly twists and changes shape, becoming a copy of [target]!") + appearance = target.appearance + copy_overlays(target) + alpha = max(alpha, 150) //fucking chameleons + transform = initial(transform) + our_size_multiplier = size_multiplier + if(isobj(target)) + size_multiplier = 1 + icon_scale_x = target.icon_scale_x + icon_scale_y = target.icon_scale_y + update_transform() + else if(ismob(target)) + var/mob/living/M = target + resize(M.size_multiplier) + pixel_y = initial(pixel_y) + pixel_x = initial(pixel_x) + density = target.density + + //Morphed is weaker + melee_damage_lower = melee_damage_disguised + melee_damage_upper = melee_damage_disguised + movement_cooldown = 5 + + morph_time = world.time + MORPH_COOLDOWN + return + +/mob/living/simple_mob/vore/hostile/morph/proc/restore() + if(!morphed) + to_chat(src, "You're already in your normal form!") + return + morphed = FALSE + form = null + alpha = initial(alpha) + color = initial(color) + layer = initial(layer) + plane = initial(plane) + maptext = null + + visible_message("[src] suddenly collapses in on itself, dissolving into a pile of green flesh!") + name = initial(name) + desc = initial(desc) + icon = initial(icon) + icon_state = initial(icon_state) + size_multiplier = 0 + resize(our_size_multiplier) + overlays.Cut() + density = initial(density) + + //Baseline stats + melee_damage_lower = initial(melee_damage_lower) + melee_damage_upper = initial(melee_damage_upper) + movement_cooldown = initial(movement_cooldown) + + morph_time = world.time + MORPH_COOLDOWN + +/mob/living/simple_mob/vore/hostile/morph/death(gibbed) + if(morphed) + visible_message("[src] twists and dissolves into a pile of green flesh!") + restore() + ..() + +/mob/living/simple_mob/vore/hostile/morph/will_show_tooltip() + return (!morphed) + +/mob/living/simple_mob/vore/hostile/morph/resize(var/new_size, var/animate = TRUE) + if(morphed && !ismob(form)) + return + return ..() + +/mob/living/simple_mob/vore/hostile/morph/update_icon() + if(morphed) + return + return ..() + + +/mob/living/simple_mob/vore/hostile/morph/update_icons() + if(morphed) + return + return ..() + +/mob/living/simple_mob/vore/hostile/morph/update_transform() + if(morphed) + var/matrix/M = matrix() + M.Scale(icon_scale_x, icon_scale_y) + M.Turn(icon_rotation) + src.transform = M + else + ..() diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/otie.dm b/code/modules/mob/living/simple_mob/subtypes/vore/otie.dm index 80d1dda4c5d..07eb1a38e24 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/otie.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/otie.dm @@ -1,3 +1,11 @@ +/datum/category_item/catalogue/fauna/otie //TODO: VIRGO_LORE_WRITING_WIP + name = "Creature - Otie" + desc = "A bioengineered longdog, the otie is very long, and very cute, depending on if you like dogs, \ + especially long ones. They are black-and-grey furred, typically, and tanky, hard to kill. \ + They seem hostile at first, but are also tame-able if you can approach one. Nipnipnip-ACK \ + **the catalogue entry ends here.**" + value = CATALOGUER_REWARD_MEDIUM + /mob/living/simple_mob/otie //Spawn this one only if you're looking for a bad time. Not friendly. name = "otie" desc = "The classic bioengineered longdog." diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/rat.dm b/code/modules/mob/living/simple_mob/subtypes/vore/rat.dm index 27893f6620d..44e27fbcb68 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/rat.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/rat.dm @@ -1,3 +1,10 @@ +/datum/category_item/catalogue/fauna/rat //TODO: VIRGO_LORE_WRITING_WIP + name = "Creature - Rat" + desc = "A massive rat, some sort of mutated descendant of normal Earth rats. These ones seem particularly hungry, \ + and are able to pounce and stun their targets - presumably to eat them. Their bodies are long and greyfurred, \ + with a pink nose and large teeth, just like their regular-sized counterparts." + value = CATALOGUER_REWARD_MEDIUM + /mob/living/simple_mob/vore/aggressive/rat name = "giant rat" desc = "In what passes for a hierarchy among verminous rodents, this one is king." diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/shadekin.dm b/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/shadekin.dm index 64c636a620b..71d21d9377e 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/shadekin.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/shadekin.dm @@ -13,7 +13,7 @@ faction = "shadekin" ui_icons = 'icons/mob/shadekin_hud.dmi' mob_class = MOB_CLASS_HUMANOID - mob_bump_flag = 0 + mob_bump_flag = HUMAN maxHealth = 200 health = 200 diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/solargrub.dm b/code/modules/mob/living/simple_mob/subtypes/vore/solargrub.dm index 7db5c4e231c..7509d81af9b 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/solargrub.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/solargrub.dm @@ -10,7 +10,9 @@ List of things solar grubs should be able to do: /datum/category_item/catalogue/fauna/solargrub //TODO: VIRGO_LORE_WRITING_WIP name = "Solargrub" - desc = "" + desc = "Some form of mutated space larva, they seem to crop up on space stations wherever there is power. \ + They seem to have the chance to cocoon and mutate if left alone, but no recorded instances of this have happened yet. \ + Therefore, if you see the grubs, kill them while they're small, or things might escalate." // TODO: PORT SOLAR MOTHS - Rykka value = CATALOGUER_REWARD_EASY #define SINK_POWER 1 diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/vore.dm b/code/modules/mob/living/simple_mob/subtypes/vore/vore.dm index a17b8e647ca..a7ef2c1c8f4 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/vore.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/vore.dm @@ -3,4 +3,4 @@ mob_bump_flag = 0 /mob/living/simple_mob/vore/aggressive - mob_bump_flag = 1 \ No newline at end of file + mob_bump_flag = HEAVY \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/wolf.dm b/code/modules/mob/living/simple_mob/subtypes/vore/wolf.dm index 5daea0571e9..afe1d73135a 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/wolf.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/wolf.dm @@ -1,3 +1,10 @@ +/datum/category_item/catalogue/fauna/wolf //TODO: VIRGO_LORE_WRITING_WIP + name = "Creature - Wolf" + desc = "Some sort of wolf, a descendent or otherwise of regular Earth canidae. They look almost exactly like their \ + Earth counterparts, except for the fact that their fur is a uniform grey. Some do show signs of unique coloration, and they \ + love to nip and bite at things, as well as sniffing around. They seem to mark their territory by way of scent-marking/urinating on things." + value = CATALOGUER_REWARD_MEDIUM + /mob/living/simple_mob/animal/wolf name = "grey wolf" desc = "My, what big jaws it has!" diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/zz_vore_overrides.dm b/code/modules/mob/living/simple_mob/subtypes/vore/zz_vore_overrides.dm index 9520d9a3ac5..b5a3bc2c60e 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/zz_vore_overrides.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/zz_vore_overrides.dm @@ -121,7 +121,7 @@ health = 80 // Increase health to compensate maxHealth = 80 */ - +/* /mob/living/simple_mob/animal/space/mimic vore_active = 1 // NO VORE SPRITES @@ -130,7 +130,7 @@ // Overrides to non-vore version maxHealth = 60 health = 60 - +*/ /mob/living/simple_mob/animal/passive/cat vore_active = 1 // NO VORE SPRITES diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index b335faf1d37..7ad90dfc43f 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -174,6 +174,12 @@ assailant.visible_message("[assailant] covers [affecting]'s eyes!") if(affecting.eye_blind < 3) affecting.Blind(3) + //TFF 12/8/19 VoreStation Addition Start + if(BP_HEAD) + if(force_down) + if(announce) + assailant.visible_message("[assailant] sits on [target]'s head!") + //VoreStation Addition End /obj/item/weapon/grab/attack_self() return s_click(hud) diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index af06226e151..a60586bbf2a 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -147,6 +147,8 @@ proc/getsensorlevel(A) var/miss_chance = 10 if (zone in base_miss_chance) miss_chance = base_miss_chance[zone] + if (zone == "eyes" || zone == "mouth") + miss_chance = base_miss_chance["head"] miss_chance = max(miss_chance + miss_chance_mod, 0) if(prob(miss_chance)) if(prob(70)) diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index b03649183bc..e66cf6f4acb 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -84,7 +84,7 @@ /client/verb/drop_item() set hidden = 1 - if(!isrobot(mob) && mob.stat == CONSCIOUS && isturf(mob.loc)) + if(!isrobot(mob) && mob.stat == CONSCIOUS && (isturf(mob.loc) || isbelly(mob.loc))) // VOREStation Edit: dropping in bellies return mob.drop_item() return diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 441ee77234f..a8c613c7251 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -114,7 +114,7 @@ if(href_list["observe"]) - if(alert(src,"Are you sure you wish to observe? You will have to wait 5 minute before being able to respawn!","Player Setup","Yes","No") == "Yes") //Vorestation edit + if(alert(src,"Are you sure you wish to observe? You will have to wait 60 seconds before being able to respawn!","Player Setup","Yes","No") == "Yes") //Vorestation edit - Rykka corrected to 60 seconds to match current spawn time if(!client) return 1 //Make a new mannequin quickly, and allow the observer to take the appearance @@ -170,12 +170,14 @@ if(href_list["SelectedJob"]) + /* Vorestation Removal Start //Prevents people rejoining as same character. for (var/mob/living/carbon/human/C in mob_list) var/char_name = client.prefs.real_name if(char_name == C.real_name) usr << "There is a character that already exists with the same name - [C.real_name], please join with a different one, or use Quit the Round with the previous character." //VOREStation Edit return + */ //Vorestation Removal End if(!config.enter_allowed) usr << "There is an administrative lock on entering the game!" @@ -385,7 +387,7 @@ return // Equip our custom items only AFTER deploying to spawn points eh? - equip_custom_items(character) + //equip_custom_items(character) //VOREStation Removal //character.apply_traits() //VOREStation Removal diff --git a/code/modules/mob/new_player/new_player_vr.dm b/code/modules/mob/new_player/new_player_vr.dm index 0be1ba819b7..b18e66fd836 100644 --- a/code/modules/mob/new_player/new_player_vr.dm +++ b/code/modules/mob/new_player/new_player_vr.dm @@ -21,6 +21,11 @@ pass = FALSE to_chat(src,"You have not set your scale yet. Do this on the VORE tab in character setup.") + //Can they play? + if(!is_alien_whitelisted(src,all_species[client.prefs.species]) && !check_rights(R_ADMIN, 0)) + pass = FALSE + to_chat(src,"You are not allowed to spawn in as this species.") + //Custom species checks if (client && client.prefs && client.prefs.species == "Custom Species") diff --git a/code/modules/mob/new_player/preferences_setup_vr.dm b/code/modules/mob/new_player/preferences_setup_vr.dm index a690c271707..8b1760c65c7 100644 --- a/code/modules/mob/new_player/preferences_setup_vr.dm +++ b/code/modules/mob/new_player/preferences_setup_vr.dm @@ -22,4 +22,8 @@ stamp.Scale(stamp.Width()*size_multiplier,stamp.Height()*size_multiplier) preview_icon.Blend(stamp, ICON_OVERLAY, 112-stamp.Width()/2, 5) - preview_icon.Scale(preview_icon.Width() * 2, preview_icon.Height() * 2) // Scaling here to prevent blurring in the browser. \ No newline at end of file + preview_icon.Scale(preview_icon.Width() * 2, preview_icon.Height() * 2) // Scaling here to prevent blurring in the browser. + +//TFF 5/8/19 - add randomised sensor setting for random button clicking +/datum/preferences/randomize_appearance_and_body_for(var/mob/living/carbon/human/H) + sensorpref = rand(1,5) \ No newline at end of file diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm index 29263adeaf6..f38cf5f1c19 100644 --- a/code/modules/mob/say.dm +++ b/code/modules/mob/say.dm @@ -25,6 +25,10 @@ message = sanitize_or_reflect(message,src) //VOREStation Edit - Reflect too-long messages (within reason) set_typing_indicator(FALSE) + //VOREStation Edit Start + if(muffled) + return me_verb_subtle(message) + //VOREStation Edit End if(use_me) usr.emote("me",usr.emote_type,message) else diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index c1d0f9de647..6f05b298e60 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -91,7 +91,7 @@ add_language(LANGUAGE_SCHECHI, 1) add_language(LANGUAGE_SIGN, 1) add_language(LANGUAGE_TERMINUS, 1) - add_language(LANGUAGE_ZADDAT = 0) + add_language(LANGUAGE_ZADDAT, 0) // Lorefolks say it may be so. if(O.client && O.client.prefs) @@ -182,7 +182,7 @@ var/datum/preferences/B = O.client.prefs for(var/language in B.alternate_languages) O.add_language(language) - O.resize(B.size_multiplier, animate = FALSE) //VOREStation Addition: add size prefs to borgs + O.resize(B.size_multiplier, animate = TRUE) //VOREStation Addition: add size prefs to borgs O.fuzzy = B.fuzzy //VOREStation Addition: add size prefs to borgs callHook("borgify", list(O)) diff --git a/code/modules/modular_computers/computers/modular_computer/damage.dm b/code/modules/modular_computers/computers/modular_computer/damage.dm index d63bf39fdf4..9084bad735a 100644 --- a/code/modules/modular_computers/computers/modular_computer/damage.dm +++ b/code/modules/modular_computers/computers/modular_computer/damage.dm @@ -16,7 +16,7 @@ H.take_damage(rand(10,30)) qdel() -/obj/item/modular_computer/proc/take_damage(var/amount, var/component_probability, var/damage_casing = 1, var/randomize = 1) +/obj/item/modular_computer/take_damage(var/amount, var/component_probability, var/damage_casing = 1, var/randomize = 1) if(randomize) // 75%-125%, rand() works with integers, apparently. amount *= (rand(75, 125) / 100.0) diff --git a/code/modules/modular_computers/file_system/programs/command/card.dm b/code/modules/modular_computers/file_system/programs/command/card.dm index b93fbb4d7db..5bcac7adf8e 100644 --- a/code/modules/modular_computers/file_system/programs/command/card.dm +++ b/code/modules/modular_computers/file_system/programs/command/card.dm @@ -167,7 +167,7 @@ computer.proc_eject_id(user) if("terminate") if(computer && can_run(user, 1)) - id_card.assignment = "Terminated" + id_card.assignment = "Dismissed" //VOREStation Edit: setting adjustment id_card.access = list() callHook("terminate_employee", list(id_card)) if("edit") diff --git a/code/modules/modular_computers/file_system/programs/medical/suit_sensors.dm b/code/modules/modular_computers/file_system/programs/medical/suit_sensors.dm index c769fe21e2a..668d3f81e22 100644 --- a/code/modules/modular_computers/file_system/programs/medical/suit_sensors.dm +++ b/code/modules/modular_computers/file_system/programs/medical/suit_sensors.dm @@ -39,11 +39,13 @@ data["isAI"] = isAI(user) data["map_levels"] = using_map.get_map_levels(T.z, FALSE) data["crewmembers"] = list() - for(var/z in (data["map_levels"] | T.z)) // Always show crew from the current Z even if we can't show a map + for(var/z in data["map_levels"]) // VOREStation Edit data["crewmembers"] += crew_repository.health_data(z) if(!data["map_levels"].len) to_chat(user, "The crew monitor doesn't seem like it'll work here.") + if(ui) // VOREStation Addition + ui.close() // VOREStation Addition return ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) diff --git a/code/modules/modular_computers/hardware/_hardware.dm b/code/modules/modular_computers/hardware/_hardware.dm index 90150bc5474..fb73609d84c 100644 --- a/code/modules/modular_computers/hardware/_hardware.dm +++ b/code/modules/modular_computers/hardware/_hardware.dm @@ -81,7 +81,7 @@ to_chat(user, "It seems to be slightly damaged.") // Damages the component. Contains necessary checks. Negative damage "heals" the component. -/obj/item/weapon/computer_hardware/proc/take_damage(var/amount) +/obj/item/weapon/computer_hardware/take_damage(var/amount) damage += round(amount) // We want nice rounded numbers here. damage = between(0, damage, max_damage) // Clamp the value. diff --git a/code/modules/modular_computers/hardware/nano_printer.dm b/code/modules/modular_computers/hardware/nano_printer.dm index 2496a6930da..665b855f4fd 100644 --- a/code/modules/modular_computers/hardware/nano_printer.dm +++ b/code/modules/modular_computers/hardware/nano_printer.dm @@ -31,10 +31,25 @@ if(paper_title) P.name = paper_title P.update_icon() + P.fields = count_fields(P.info) + P.updateinfolinks() stored_paper-- return 1 +/obj/item/weapon/computer_hardware/nano_printer/proc/count_fields(var/info) +//Count the fields. This is taken directly from paper.dm, /obj/item/weapon/paper/proc/parsepencode(). -Hawk_v3 + var/fields = 0 + var/t = info + var/laststart = 1 + while(1) + var/i = findtext(t, "", laststart) // + if(i==0) + break + laststart = i+1 + fields++ + return fields + /obj/item/weapon/computer_hardware/nano_printer/attackby(obj/item/W as obj, mob/user as mob) if(istype(W, /obj/item/weapon/paper)) if(stored_paper >= max_paper) diff --git a/code/modules/modular_computers/hardware/portable_hard_drive.dm b/code/modules/modular_computers/hardware/portable_hard_drive.dm index 9a0feb3653c..817fca789e4 100644 --- a/code/modules/modular_computers/hardware/portable_hard_drive.dm +++ b/code/modules/modular_computers/hardware/portable_hard_drive.dm @@ -1,5 +1,5 @@ // These are basically USB data sticks and may be used to transfer files between devices -/obj/item/weapon/computer_hardware/hard_drive/portable/ +/obj/item/weapon/computer_hardware/hard_drive/portable name = "basic data crystal" desc = "Small crystal with imprinted photonic circuits that can be used to store data. Its capacity is 16 GQ." power_usage = 10 diff --git a/code/modules/multiz/structures_vr.dm b/code/modules/multiz/structures_vr.dm index b66c148e3b7..5d12621ff40 100644 --- a/code/modules/multiz/structures_vr.dm +++ b/code/modules/multiz/structures_vr.dm @@ -55,3 +55,22 @@ do_noeffect_teleport(M, locate(rand(5, world.maxx - 5), rand(5, world.maxy -5), 3), 0) else do_noeffect_teleport(M, target, 1) ///You will appear adjacent to the beacon + +/obj/structure/portal_gateway + name = "portal" + desc = "Looks unstable. Best to test it with the clown." + icon = 'icons/obj/stationobjs_vr.dmi' + icon_state = "portalgateway" + density = 1 + unacidable = 1//Can't destroy energy portals. + anchored = 1 + +/obj/structure/portal_gateway/Bumped(mob/M as mob|obj) + if(istype(M,/mob) && !(istype(M,/mob/living))) + return //do not send ghosts, zshadows, ai eyes, etc + var/obj/effect/landmark/dest = pick(eventdestinations) + if(dest) + M << 'sound/effects/phasein.ogg' + playsound(src, 'sound/effects/phasein.ogg', 100, 1) + M.forceMove(dest.loc) + return diff --git a/code/modules/nifsoft/nifsoft.dm b/code/modules/nifsoft/nifsoft.dm index b4791003d0b..6f110de8566 100644 --- a/code/modules/nifsoft/nifsoft.dm +++ b/code/modules/nifsoft/nifsoft.dm @@ -165,15 +165,19 @@ return ..() ///////////////// -// A NIFSoft Disk +// A NIFSoft Uploader /obj/item/weapon/disk/nifsoft - name = "NIFSoft Disk" + name = "NIFSoft Uploader" desc = "It has a small label: \n\ - \"Portable NIFSoft Disk. \n\ - Insert directly into brain.\"" - icon = 'icons/obj/cloning.dmi' - icon_state = "datadisk2" - item_state = "card-id" + \"Portable NIFSoft Installation Media. \n\ + Align ocular port with eye socket and depress red plunger.\"" + icon = 'icons/obj/nanomods.dmi' + icon_state = "medical" + item_state = "nanomod" + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_vr.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_vr.dmi', + ) w_class = ITEMSIZE_SMALL var/datum/nifsoft/stored = null @@ -188,7 +192,7 @@ var/mob/living/carbon/human/Hu = user if(!Ht.nif || Ht.nif.stat != NIF_WORKING) - to_chat(user,"Either they don't have a NIF, or the disk can't connect.") + to_chat(user,"Either they don't have a NIF, or the uploader can't connect.") return var/extra = extra_params() @@ -197,9 +201,18 @@ else Ht.visible_message("[Hu] begins uploading [src] into [Ht]!","[Hu] is uploading [src] into you!") - if(A == user || do_after(Hu,10 SECONDS,Ht)) + icon_state = "[initial(icon_state)]-animate" //makes it play the item animation upon using on a valid target + update_icon() + + if(A == user && do_after(Hu,1 SECONDS,Ht)) new stored(Ht.nif,extra) qdel(src) + else if(A != user && do_after(Hu,10 SECONDS,Ht)) + new stored(Ht.nif,extra) + qdel(src) + else + icon_state = "[initial(icon_state)]" //If it fails to apply to a valid target and doesn't get deleted, reset its icon state + update_icon() //So disks can pass fancier stuff. /obj/item/weapon/disk/nifsoft/proc/extra_params() @@ -208,8 +221,14 @@ // Compliance Disk // /obj/item/weapon/disk/nifsoft/compliance - name = "NIFSoft Disk (Compliance)" + name = "NIFSoft Uploader (Compliance)" desc = "Wow, adding laws to people? That seems illegal. It probably is. Okay, it really is." + icon_state = "compliance" + item_state = "healthanalyzer" + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand.dmi', + slot_r_hand_str = 'icons/mob/items/righthand.dmi', + ) stored = /datum/nifsoft/compliance var/laws @@ -233,19 +252,20 @@ // Security Disk // /obj/item/weapon/disk/nifsoft/security - name = "NIFSoft Disk - Security" + name = "NIFSoft Uploader - Security" desc = "Contains free NIFSofts useful for security members.\n\ It has a small label: \n\ - \"Portable NIFSoft Disk. \n\ - Insert directly into brain.\"" + \"Portable NIFSoft Installation Media. \n\ + Align ocular port with eye socket and depress red plunger.\"" + icon_state = "security" stored = /datum/nifsoft/package/security /datum/nifsoft/package/security software = list(/datum/nifsoft/ar_sec,/datum/nifsoft/flashprot) /obj/item/weapon/storage/box/nifsofts_security - name = "security nifsoft disks" + name = "security nifsoft uploaders" desc = "A box of free nifsofts for security employees." icon_state = "disk_kit" @@ -256,19 +276,20 @@ // Engineering Disk // /obj/item/weapon/disk/nifsoft/engineering - name = "NIFSoft Disk - Engineering" + name = "NIFSoft Uploader - Engineering" desc = "Contains free NIFSofts useful for engineering members.\n\ It has a small label: \n\ - \"Portable NIFSoft Disk. \n\ - Insert directly into brain.\"" + \"Portable NIFSoft Installation Media. \n\ + Align ocular port with eye socket and depress red plunger.\"" + icon_state = "engineering" stored = /datum/nifsoft/package/engineering /datum/nifsoft/package/engineering software = list(/datum/nifsoft/ar_eng,/datum/nifsoft/alarmmonitor,/datum/nifsoft/uvblocker) /obj/item/weapon/storage/box/nifsofts_engineering - name = "engineering nifsoft disks" + name = "engineering nifsoft uploaders" desc = "A box of free nifsofts for engineering employees." icon_state = "disk_kit" @@ -279,11 +300,11 @@ // Medical Disk // /obj/item/weapon/disk/nifsoft/medical - name = "NIFSoft Disk - Medical" + name = "NIFSoft Uploader - Medical" desc = "Contains free NIFSofts useful for medical members.\n\ It has a small label: \n\ - \"Portable NIFSoft Disk. \n\ - Insert directly into brain.\"" + \"Portable NIFSoft Installation Media. \n\ + Align ocular port with eye socket and depress red plunger.\"" stored = /datum/nifsoft/package/medical @@ -291,7 +312,7 @@ software = list(/datum/nifsoft/ar_med,/datum/nifsoft/crewmonitor) /obj/item/weapon/storage/box/nifsofts_medical - name = "medical nifsoft disks" + name = "medical nifsoft uploaders" desc = "A box of free nifsofts for medical employees." icon_state = "disk_kit" @@ -302,19 +323,20 @@ // Mining Disk // /obj/item/weapon/disk/nifsoft/mining - name = "NIFSoft Disk - Mining" + name = "NIFSoft Uploader - Mining" desc = "Contains free NIFSofts useful for mining members.\n\ It has a small label: \n\ - \"Portable NIFSoft Disk. \n\ - Insert directly into brain.\"" + \"Portable NIFSoft Installation Media. \n\ + Align ocular port with eye socket and depress red plunger.\"" + icon_state = "mining" stored = /datum/nifsoft/package/mining /datum/nifsoft/package/mining software = list(/datum/nifsoft/material,/datum/nifsoft/spare_breath) /obj/item/weapon/storage/box/nifsofts_mining - name = "mining nifsoft disks" + name = "mining nifsoft uploaders" desc = "A box of free nifsofts for mining employees." icon_state = "disk_kit" diff --git a/code/modules/nifsoft/software/13_soulcatcher.dm b/code/modules/nifsoft/software/13_soulcatcher.dm index 09d23669b31..9f46eac243b 100644 --- a/code/modules/nifsoft/software/13_soulcatcher.dm +++ b/code/modules/nifsoft/software/13_soulcatcher.dm @@ -270,10 +270,12 @@ var/obj/item/device/nif/nif var/datum/nifsoft/soulcatcher/soulcatcher + var/identifying_gender /mob/living/carbon/brain/caught_soul/Login() ..() plane_holder.set_vis(VIS_AUGMENTED, TRUE) + identifying_gender = client.prefs.identifying_gender /mob/living/carbon/brain/caught_soul/Destroy() if(soulcatcher) diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index b0aadff2a23..215ef65ced8 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -78,6 +78,7 @@ var/list/organ_cache = list() if(E.internal_organs == null) E.internal_organs = list() E.internal_organs |= src + H.internal_organs_by_name[organ_tag] = src if(dna) if(!blood_DNA) blood_DNA = list() @@ -292,7 +293,7 @@ var/list/organ_cache = list() W.time_inflicted = world.time //Note: external organs have their own version of this proc -/obj/item/organ/proc/take_damage(amount, var/silent=0) +/obj/item/organ/take_damage(amount, var/silent=0) if(src.robotic >= ORGAN_ROBOT) src.damage = between(0, src.damage + (amount * 0.8), max_damage) else diff --git a/code/modules/organs/organ_external_vr.dm b/code/modules/organs/organ_external_vr.dm index 0e3fb07d9ee..491cce94287 100644 --- a/code/modules/organs/organ_external_vr.dm +++ b/code/modules/organs/organ_external_vr.dm @@ -13,3 +13,7 @@ min_broken_damage = o_min_broken_damage else return ..() + +/obj/item/organ/external/proc/is_hidden_by_tail() + if(owner && owner.tail_style && owner.tail_style.hide_body_parts && (organ_tag in owner.tail_style.hide_body_parts)) + return 1 \ No newline at end of file diff --git a/code/modules/organs/subtypes/slime.dm b/code/modules/organs/subtypes/slime.dm index f22b90caea2..5fb54a21b45 100644 --- a/code/modules/organs/subtypes/slime.dm +++ b/code/modules/organs/subtypes/slime.dm @@ -56,3 +56,89 @@ max_damage = 30 encased = 0 spread_dam = 1 + +/* + * Internal Slime organs. + */ + +/obj/item/organ/internal/heart/grey/colormatch/slime + name = "pneumatic network" + desc = "A disgusting sac of goo." + icon_state = "sac_slime" + dead_icon = null + standard_pulse_level = PULSE_NONE + +/obj/item/organ/internal/heart/grey/colormatch/slime/process() + ..() + if(!(QDELETED(src)) && src.loc != owner) + visible_message("\The [src] splatters!") + var/turf/T = get_turf(src) + var/obj/effect/decal/cleanable/blood/B = new (T) + + B.basecolor = src.color + B.update_icon() + qdel(src) + +/obj/item/organ/internal/regennetwork + name = "pneumoregenesis network" + parent_organ = BP_TORSO + organ_tag = O_REGBRUTE + + icon_state = "sac_slime" + + var/strain = 0 // The amount of stress this organ is under. Capped at min_broken_damage, usually half its max damage. + + var/last_strain_increase = 0 // World time of the last increase in strain. + var/strain_regen_cooldown = 5 MINUTES + +/obj/item/organ/internal/regennetwork/Initialize() + ..() + var/mob/living/carbon/human/H = null + spawn(15) + if(ishuman(owner)) + H = owner + color = H.species.get_blood_colour(H) + +/obj/item/organ/internal/regennetwork/proc/get_strain_percent(var/cost) + adjust_strain(cost) + + if((status & ORGAN_CUT_AWAY) || (status & ORGAN_BROKEN) || (status & ORGAN_DEAD)) + return 1 + + return round((strain / min_broken_damage) * 10) / 10 + +/obj/item/organ/internal/regennetwork/proc/adjust_strain(var/amount) + if(amount < 0 && world.time < (last_strain_increase + strain_regen_cooldown)) + return + + else if(amount > 0) + last_strain_increase = world.time + + strain = CLAMP(strain + amount, 0, min_broken_damage) + +/obj/item/organ/internal/regennetwork/process() + ..() + + if(!(QDELETED(src)) && src.loc != owner) + visible_message("\The [src] splatters!") + var/turf/T = get_turf(src) + var/obj/effect/decal/cleanable/blood/B = new (T) + + B.basecolor = src.color + B.update_icon() + qdel(src) + + if(src && !is_bruised()) + adjust_strain(-0.25 * max(0, (min_broken_damage - damage) / min_broken_damage)) // Decrease the current strain with respect to the current strain level. + +/obj/item/organ/internal/regennetwork/burn + name = "thermoregenesis network" + organ_tag = O_REGBURN + +/obj/item/organ/internal/regennetwork/oxy + name = "respiroregenesis network" + organ_tag = O_REGOXY + +/obj/item/organ/internal/regennetwork/tox + name = "toxoregenesis network" + organ_tag = O_REGTOX diff --git a/code/modules/planet/sif.dm b/code/modules/planet/sif.dm index eada6f33cbe..921142812d3 100644 --- a/code/modules/planet/sif.dm +++ b/code/modules/planet/sif.dm @@ -555,4 +555,4 @@ var/datum/planet/sif/planet_sif = null if(!istype(T)) return if(T.outdoors) - radiation_repository.radiate(T, rand(fallout_rad_low, fallout_rad_high)) + SSradiation.radiate(T, rand(fallout_rad_low, fallout_rad_high)) diff --git a/maps/tether/tether_virgo3b.dm b/code/modules/planet/virgo3b_vr.dm similarity index 98% rename from maps/tether/tether_virgo3b.dm rename to code/modules/planet/virgo3b_vr.dm index 882e701abdf..791841aca71 100644 --- a/maps/tether/tether_virgo3b.dm +++ b/code/modules/planet/virgo3b_vr.dm @@ -9,14 +9,7 @@ var/datum/planet/virgo3b/planet_virgo3b = null amounts of both oxygen and nitrogen. Fortunately, the oxygen is not enough to be combustible in any meaningful way, however \ the phoron is desirable by many corporations, including NanoTrasen." current_time = new /datum/time/virgo3b() - expected_z_levels = list( - Z_LEVEL_SURFACE_LOW, - Z_LEVEL_SURFACE_MID, - Z_LEVEL_SURFACE_HIGH, - Z_LEVEL_SURFACE_MINE, - Z_LEVEL_SOLARS, - Z_LEVEL_PLAINS - ) +// expected_z_levels = list(1) // This is defined elsewhere. planetary_wall_type = /turf/unsimulated/wall/planetary/virgo3b /datum/planet/virgo3b/New() @@ -538,5 +531,5 @@ var/datum/planet/virgo3b/planet_virgo3b = null if(!istype(T)) return if(T.outdoors) - radiation_repository.radiate(T, rand(fallout_rad_low, fallout_rad_high)) + SSradiation.radiate(T, rand(fallout_rad_low, fallout_rad_high)) diff --git a/code/modules/power/apc_vr.dm b/code/modules/power/apc_vr.dm new file mode 100644 index 00000000000..c08c9b8db04 --- /dev/null +++ b/code/modules/power/apc_vr.dm @@ -0,0 +1,9 @@ +/obj/machinery/power/apc/proc/update_area() + var/area/NA = get_area(src) + if(!(NA == area)) + if(area.apc == src) + area.apc = null + NA.apc = src + area = NA + name = "[area.name] APC" + update() \ No newline at end of file diff --git a/code/modules/power/fusion/core/core_field.dm b/code/modules/power/fusion/core/core_field.dm index f0eca3add60..5444c46b037 100644 --- a/code/modules/power/fusion/core/core_field.dm +++ b/code/modules/power/fusion/core/core_field.dm @@ -313,7 +313,7 @@ radiation += plasma_temperature/2 plasma_temperature = 0 - radiation_repository.radiate(src, radiation) + SSradiation.radiate(src, radiation) Radiate() /obj/effect/fusion_em_field/proc/Radiate() @@ -522,7 +522,7 @@ //Reaction radiation is fairly buggy and there's at least three procs dealing with radiation here, this is to ensure constant radiation output. /obj/effect/fusion_em_field/proc/radiation_scale() - radiation_repository.radiate(src, 2 + plasma_temperature / PLASMA_TEMP_RADIATION_DIVISIOR) + SSradiation.radiate(src, 2 + plasma_temperature / PLASMA_TEMP_RADIATION_DIVISIOR) //Somehow fixing the radiation issue managed to break this, but moving it to it's own proc seemed to have fixed it. I don't know. /obj/effect/fusion_em_field/proc/temp_dump() diff --git a/code/modules/power/fusion/fuel_assembly/fuel_assembly.dm b/code/modules/power/fusion/fuel_assembly/fuel_assembly.dm index 41492743510..73543ead92b 100644 --- a/code/modules/power/fusion/fuel_assembly/fuel_assembly.dm +++ b/code/modules/power/fusion/fuel_assembly/fuel_assembly.dm @@ -46,7 +46,7 @@ return PROCESS_KILL if(istype(loc, /turf)) - radiation_repository.radiate(src, max(1,CEILING(radioactivity/30, 1))) + SSradiation.radiate(src, max(1,CEILING(radioactivity/30, 1))) /obj/item/weapon/fuel_assembly/Destroy() STOP_PROCESSING(SSobj, src) diff --git a/code/modules/power/fusion/fusion_reactions.dm b/code/modules/power/fusion/fusion_reactions.dm index 623f70bd6bd..88117f8164b 100644 --- a/code/modules/power/fusion/fusion_reactions.dm +++ b/code/modules/power/fusion/fusion_reactions.dm @@ -120,7 +120,7 @@ proc/get_fusion_reaction(var/p_react, var/s_react, var/m_energy) var/radiation_level = 200 // Copied from the SM for proof of concept. //Not any more --Cirra //Use the whole z proc --Leshana - radiation_repository.z_radiate(locate(1, 1, holder.z), radiation_level, 1) + SSradiation.z_radiate(locate(1, 1, holder.z), radiation_level, 1) for(var/mob/living/mob in living_mob_list) var/turf/T = get_turf(mob) diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index af58edc78fc..ba60c84d32d 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -9,7 +9,7 @@ #define LIGHT_BROKEN 2 #define LIGHT_BURNED 3 #define LIGHT_BULB_TEMPERATURE 400 //K - used value for a 60W bulb -#define LIGHTING_POWER_FACTOR 5 //5W per luminosity * range +#define LIGHTING_POWER_FACTOR 2 //5W per luminosity * range //VOREStation Edit: why the fuck are lights eating so much power, 2W per thing var/global/list/light_type_cache = list() /proc/get_light_type_instance(var/light_type) @@ -170,7 +170,7 @@ var/global/list/light_type_cache = list() layer = ABOVE_MOB_LAYER use_power = 2 idle_power_usage = 2 - active_power_usage = 20 // VOREStation Edit - Keep lights at 20 power + active_power_usage = 10 power_channel = LIGHT //Lights are calc'd via area so they dont need to be in the machine list var/on = 0 // 1 if on, 0 if off var/brightness_range @@ -389,6 +389,16 @@ var/global/list/light_type_cache = list() broken() return 1 +/obj/machinery/light/take_damage(var/damage) + if(!damage) + return + if(status == LIGHT_EMPTY||status == LIGHT_BROKEN) + return + if(!(status == LIGHT_OK||status == LIGHT_BURNED)) + return + broken() + return 1 + /obj/machinery/light/blob_act() broken() diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index 5e4c2e6207c..2443f3ea279 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -399,13 +399,13 @@ /obj/machinery/power/port_gen/pacman/super/UseFuel() //produces a tiny amount of radiation when in use if (prob(2*power_output)) - radiation_repository.radiate(src, 4) + SSradiation.radiate(src, 4) ..() /obj/machinery/power/port_gen/pacman/super/explode() //a nice burst of radiation var/rads = 50 + (sheets + sheet_left)*1.5 - radiation_repository.radiate(src, (max(20, rads))) + SSradiation.radiate(src, (max(20, rads))) explosion(src.loc, 3, 3, 5, 3) qdel(src) diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm index 0bac07c2dc9..1dc29c7fd75 100644 --- a/code/modules/power/singularity/collector.dm +++ b/code/modules/power/singularity/collector.dm @@ -32,7 +32,7 @@ var/global/list/rad_collectors = list() if(P && active) - var/rads = radiation_repository.get_rads_at_turf(get_turf(src)) + var/rads = SSradiation.get_rads_at_turf(get_turf(src)) if(rads) receive_pulse(rads * 5) //Maths is hard diff --git a/code/modules/power/singularity/particle_accelerator/particle_smasher.dm b/code/modules/power/singularity/particle_accelerator/particle_smasher.dm index b3a1556395f..921b0000781 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_smasher.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_smasher.dm @@ -142,13 +142,13 @@ /obj/machinery/particle_smasher/process() if(!src.anchored) // Rapidly loses focus. if(energy) - radiation_repository.radiate(src, round(((src.energy-150)/50)*5,1)) + SSradiation.radiate(src, round(((src.energy-150)/50)*5,1)) energy = max(0, energy - 30) update_icon() return if(energy) - radiation_repository.radiate(src, round(((src.energy-150)/50)*5,1)) + SSradiation.radiate(src, round(((src.energy-150)/50)*5,1)) energy = CLAMP(energy - 5, 0, max_energy) return @@ -178,7 +178,7 @@ if(successful_craft) visible_message("\The [src] fizzles.") if(prob(33)) // Why are you blasting it after it's already done! - radiation_repository.radiate(src, 10 + round(src.energy / 60, 1)) + SSradiation.radiate(src, 10 + round(src.energy / 60, 1)) energy = max(0, energy - 30) update_icon() return diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index 3768ab95358..b75a81e1e4b 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -408,7 +408,7 @@ GLOBAL_LIST_BOILERPLATE(all_singularities, /obj/singularity) if (src.energy>200) toxdamage = round(((src.energy-150)/50)*4,1) radiation = round(((src.energy-150)/50)*5,1) - radiation_repository.radiate(src, radiation) //Always radiate at max, so a decent dose of radiation is applied + SSradiation.radiate(src, radiation) //Always radiate at max, so a decent dose of radiation is applied for(var/mob/living/M in view(toxrange, src.loc)) if(M.status_flags & GODMODE) continue @@ -451,7 +451,7 @@ GLOBAL_LIST_BOILERPLATE(all_singularities, /obj/singularity) M << "You hear an uneartly ringing, then what sounds like a shrilling kettle as you are washed with a wave of heat." M << "You don't even have a moment to react as you are reduced to ashes by the intense radiation." M.dust() - radiation_repository.radiate(src, rand(energy)) + SSradiation.radiate(src, rand(energy)) return /obj/singularity/proc/pulse() diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index dae021e5cd4..c4c7d2ff02b 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -253,6 +253,7 @@ GLOBAL_LIST_EMPTY(solars_list) new /obj/machinery/power/tracker(get_turf(src), src) else new /obj/machinery/power/solar(get_turf(src), src) + qdel(src) else to_chat(user, "You need two sheets of glass to put them into a solar panel.") return diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index cbbd9e193d9..9e1f3f06c29 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -141,7 +141,7 @@ if(!TS) return for(var/z in GetConnectedZlevels(TS.z)) - radiation_repository.z_radiate(locate(1, 1, z), DETONATION_RADS, 1) + SSradiation.z_radiate(locate(1, 1, z), DETONATION_RADS, 1) for(var/mob/living/mob in living_mob_list) var/turf/T = get_turf(mob) if(T && (loc.z == T.z)) @@ -171,6 +171,7 @@ /obj/machinery/power/supermatter/proc/announce_warning() var/integrity = get_integrity() var/alert_msg = " Integrity at [integrity]%" + var/message_sound = 'sound/ambience/matteralarm.ogg' // VOREStation Edit - Rykka adds SM Delam alarm if(damage > emergency_point) alert_msg = emergency_alert + alert_msg @@ -191,6 +192,9 @@ //Public alerts if((damage > emergency_point) && !public_alert) global_announcer.autosay("WARNING: SUPERMATTER CRYSTAL DELAMINATION IMMINENT!", "Supermatter Monitor") + for(var/mob/M in player_list) // VOREStation Edit - Rykka adds SM Delam alarm + if(!istype(M,/mob/new_player) && !isdeaf(M)) // VOREStation Edit - Rykka adds SM Delam alarm + M << message_sound // VOREStation Edit - Rykka adds SM Delam alarm admin_chat_message(message = "SUPERMATTER DELAMINATING!", color = "#FF2222") //VOREStation Add public_alert = 1 log_game("SUPERMATTER([x],[y],[z]) Emergency PUBLIC announcement. Power:[power], Oxygen:[oxygen], Damage:[damage], Integrity:[get_integrity()]") @@ -307,7 +311,7 @@ if(!istype(l.glasses, /obj/item/clothing/glasses/meson)) // VOREStation Edit - Only mesons can protect you! l.hallucination = max(0, min(200, l.hallucination + power * config_hallucination_power * sqrt( 1 / max(1,get_dist(l, src)) ) ) ) - radiation_repository.radiate(src, max(power * 1.5, 50) ) //Better close those shutters! + SSradiation.radiate(src, max(power * 1.5, 50) ) //Better close those shutters! power -= (power/DECAY_FACTOR)**3 //energy losses due to radiation @@ -420,7 +424,7 @@ else l.show_message("You hear an uneartly ringing and notice your skin is covered in fresh radiation burns.", 2) var/rads = 500 - radiation_repository.radiate(src, rads) + SSradiation.radiate(src, rads) /proc/supermatter_pull(var/atom/target, var/pull_range = 255, var/pull_power = STAGE_FIVE) for(var/atom/A in range(pull_range, target)) @@ -463,7 +467,7 @@ return ..() /obj/item/broken_sm/process() - radiation_repository.radiate(src, 50) + SSradiation.radiate(src, 50) /obj/item/broken_sm/Destroy() STOP_PROCESSING(SSobj, src) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index bbc13e381e8..8f1c01be21e 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -180,15 +180,15 @@ if(dna_lock && attached_lock.stored_dna) if(!authorized_user(user)) if(attached_lock.safety_level == 0) - to_chat(M, "\The [src] buzzes in dissapoint and displays an invalid DNA symbol.") + to_chat(M, "\The [src] buzzes in dissapointment and displays an invalid DNA symbol.") return 0 if(!attached_lock.exploding) if(attached_lock.safety_level == 1) to_chat(M, "\The [src] hisses in dissapointment.") visible_message("\The [src] announces, \"Self-destruct occurring in ten seconds.\"", "\The [src] announces, \"Self-destruct occurring in ten seconds.\"") + attached_lock.exploding = 1 spawn(100) explosion(src, 0, 0, 3, 4) - attached_lock.exploding = 1 sleep(1) qdel(src) return 0 @@ -692,18 +692,18 @@ var/obj/item/projectile/in_chamber = consume_next_projectile() if (istype(in_chamber)) user.visible_message("[user] pulls the trigger.") - play_fire_sound() - if(istype(in_chamber, /obj/item/projectile/beam/lastertag)) + play_fire_sound(M, in_chamber) + if(istype(in_chamber, /obj/item/projectile/beam/lasertag)) user.show_message("You feel rather silly, trying to commit suicide with a toy.") mouthshoot = 0 return in_chamber.on_hit(M) - if (in_chamber.damage_type != HALLOSS) + if(in_chamber.damage_type != HALLOSS && !in_chamber.nodamage) log_and_message_admins("[key_name(user)] commited suicide using \a [src]") user.apply_damage(in_chamber.damage*2.5, in_chamber.damage_type, "head", used_weapon = "Point blank shot in the mouth with \a [in_chamber]", sharp=1) user.death() - else + else if(in_chamber.damage_type == HALLOSS) to_chat(user, "Ow...") user.apply_effect(110,AGONY,0) qdel(in_chamber) diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index 6d7bdfef7ad..eeb8d779d28 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -1,247 +1,261 @@ -/obj/item/weapon/gun/energy/laser - name = "laser rifle" - desc = "A Hephaestus Industries G40E rifle, designed to kill with concentrated energy blasts. This variant has the ability to \ - switch between standard fire and a more efficent but weaker 'suppressive' fire." - icon_state = "laser" - item_state = "laser" - wielded_item_state = "laser-wielded" - fire_delay = 8 - slot_flags = SLOT_BELT|SLOT_BACK - w_class = ITEMSIZE_LARGE - force = 10 - origin_tech = list(TECH_COMBAT = 3, TECH_MAGNET = 2) - matter = list(DEFAULT_WALL_MATERIAL = 2000) - projectile_type = /obj/item/projectile/beam/midlaser -// one_handed_penalty = 30 - - firemodes = list( - list(mode_name="normal", fire_delay=8, projectile_type=/obj/item/projectile/beam/midlaser, charge_cost = 240), - list(mode_name="suppressive", fire_delay=5, projectile_type=/obj/item/projectile/beam/weaklaser, charge_cost = 60), - ) - -/obj/item/weapon/gun/energy/laser/mounted - self_recharge = 1 - use_external_power = 1 - one_handed_penalty = 0 // Not sure if two-handing gets checked for mounted weapons, but better safe than sorry. - -/obj/item/weapon/gun/energy/laser/practice - name = "practice laser carbine" - desc = "A modified version of the HI G40E, this one fires less concentrated energy bolts designed for target practice." - projectile_type = /obj/item/projectile/beam/practice - charge_cost = 48 - - cell_type = /obj/item/weapon/cell/device - - firemodes = list( - list(mode_name="normal", projectile_type=/obj/item/projectile/beam/practice, charge_cost = 48), - list(mode_name="suppressive", projectile_type=/obj/item/projectile/beam/practice, charge_cost = 12), - ) - -/obj/item/weapon/gun/energy/retro - name = "retro laser" - icon_state = "retro" - item_state = "retro" - desc = "An older model of the basic lasergun. Nevertheless, it is still quite deadly and easy to maintain, making it a favorite amongst pirates and other outlaws." - slot_flags = SLOT_BELT - w_class = ITEMSIZE_NORMAL - projectile_type = /obj/item/projectile/beam - fire_delay = 10 //old technology - -/obj/item/weapon/gun/energy/retro/mounted - self_recharge = 1 - use_external_power = 1 - -/obj/item/weapon/gun/energy/retro/empty - icon_state = "retro" - cell_type = null - - -/datum/category_item/catalogue/anomalous/precursor_a/alien_pistol - name = "Precursor Alpha Weapon - Appendageheld Laser" - desc = "This object strongly resembles a weapon, and if one were to pull the \ - trigger located on the handle of the object, it would fire a deadly \ - laser at whatever it was pointed at. The beam fired appears to cause too \ - much damage to whatever it would hit to have served as a long ranged repair tool, \ - therefore this object was most likely designed to be a deadly weapon. If so, this \ - has several implications towards its creators;\ -

      \ - Firstly, it implies that these precursors, at some point during their development, \ - had needed to defend themselves, or otherwise had a need to utilize violence, and \ - as such created better tools to do so. It is unclear if violence was employed against \ - themselves as a form of in-fighting, or if violence was exclusive to outside species.\ -

      \ - Secondly, the shape and design of the weapon implies that the creators of this \ - weapon were able to grasp objects, and be able to manipulate the trigger independently \ - from merely holding onto the weapon, making certain types of appendages like tentacles be \ - unlikely.\ -

      \ - An interesting note about this weapon, when compared to contemporary energy weapons, is \ - that this gun appears to be inferior to modern laser weapons. The beam fired has less \ - of an ability to harm, and the power consumption appears to be higher than average for \ - a human-made energy side-arm. One possible explaination is that the creators of this \ - weapon, in their later years, had less of a need to optimize their capability for war, \ - and instead focused on other endeavors. Another explaination is that vast age of the weapon \ - may have caused it to degrade, yet still remain functional at a reduced capability." - value = CATALOGUER_REWARD_MEDIUM - -/obj/item/weapon/gun/energy/alien - name = "alien pistol" - desc = "A weapon that works very similarly to a traditional energy weapon. How this came to be will likely be a mystery for the ages." - catalogue_data = list(/datum/category_item/catalogue/anomalous/precursor_a/alien_pistol) - icon_state = "alienpistol" - item_state = "alienpistol" - fire_sound = 'sound/weapons/eLuger.ogg' - fire_delay = 10 // Handguns should be inferior to two-handed weapons. Even alien ones I suppose. - charge_cost = 480 // Five shots. - - projectile_type = /obj/item/projectile/beam/cyan - cell_type = /obj/item/weapon/cell/device/weapon/recharge/alien // Self charges. - origin_tech = list(TECH_COMBAT = 8, TECH_MAGNET = 7) - modifystate = "alienpistol" - - -/obj/item/weapon/gun/energy/captain - name = "antique laser gun" - icon_state = "caplaser" - item_state = "caplaser" - desc = "A rare weapon, handcrafted by a now defunct specialty manufacturer on Luna for a small fortune. It's certainly aged well." - force = 5 - slot_flags = SLOT_BELT - w_class = ITEMSIZE_NORMAL - projectile_type = /obj/item/projectile/beam - origin_tech = null - fire_delay = 10 //Old pistol - charge_cost = 480 //to compensate a bit for self-recharging - cell_type = /obj/item/weapon/cell/device/weapon/recharge/captain - battery_lock = 1 - -/obj/item/weapon/gun/energy/lasercannon - name = "laser cannon" - desc = "With the laser cannon, the lasing medium is enclosed in a tube lined with uranium-235 and subjected to high neutron \ - flux in a nuclear reactor core. This incredible technology may help YOU achieve high excitation rates with small laser volumes!" - icon_state = "lasercannon" - item_state = null - origin_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 3, TECH_POWER = 3) - slot_flags = SLOT_BELT|SLOT_BACK - projectile_type = /obj/item/projectile/beam/heavylaser/cannon - battery_lock = 1 - fire_delay = 20 - w_class = ITEMSIZE_LARGE -// one_handed_penalty = 90 // The thing's heavy and huge. - accuracy = 45 - charge_cost = 600 - -/obj/item/weapon/gun/energy/lasercannon/mounted - name = "mounted laser cannon" - self_recharge = 1 - use_external_power = 1 - recharge_time = 10 - accuracy = 0 // Mounted cannons are just fine the way they are. - one_handed_penalty = 0 // Not sure if two-handing gets checked for mounted weapons, but better safe than sorry. - projectile_type = /obj/item/projectile/beam/heavylaser - charge_cost = 400 - fire_delay = 20 - -/obj/item/weapon/gun/energy/xray - name = "xray laser gun" - desc = "A high-power laser gun capable of expelling concentrated xray blasts, which are able to penetrate matter easier than \ - standard photonic beams, resulting in an effective 'anti-armor' energy weapon." - icon_state = "xray" - item_state = "xray" - origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 3, TECH_MAGNET = 2) - projectile_type = /obj/item/projectile/beam/xray - charge_cost = 200 - -/obj/item/weapon/gun/energy/sniperrifle - name = "marksman energy rifle" - desc = "The HI DMR 9E is an older design of Hephaestus Industries. A designated marksman rifle capable of shooting powerful \ - ionized beams, this is a weapon to kill from a distance." - icon_state = "sniper" - item_state = "sniper" - item_state_slots = list(slot_r_hand_str = "z8carbine", slot_l_hand_str = "z8carbine") //placeholder - origin_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 5, TECH_POWER = 4) - projectile_type = /obj/item/projectile/beam/sniper - slot_flags = SLOT_BACK - battery_lock = 1 - charge_cost = 600 - fire_delay = 35 - force = 10 - w_class = ITEMSIZE_HUGE // So it can't fit in a backpack. - accuracy = -45 //shooting at the hip - scoped_accuracy = 0 -// requires_two_hands = 1 -// one_handed_penalty = 60 // The weapon itself is heavy, and the long barrel makes it hard to hold steady with just one hand. - -/obj/item/weapon/gun/energy/sniperrifle/verb/scope() - set category = "Object" - set name = "Use Scope" - set popup_menu = 1 - - toggle_scope(2.0) - -/obj/item/weapon/gun/energy/monorifle - name = "antique mono-rifle" - desc = "An old laser rifle. This one can only fire once before requiring recharging." - description_fluff = "Modeled after ancient hunting rifles, this rifle was dubbed the 'Rainy Day Special' by some, due to its use as some barmens' fight-stopper of choice. One shot is all it takes, or so they say." - icon_state = "eshotgun" - item_state = "shotgun" - origin_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 4, TECH_POWER = 3) - projectile_type = /obj/item/projectile/beam/sniper - slot_flags = SLOT_BACK - charge_cost = 1300 - fire_delay = 20 - force = 8 - w_class = ITEMSIZE_LARGE - accuracy = 10 - scoped_accuracy = 15 - var/scope_multiplier = 1.5 - -/obj/item/weapon/gun/energy/monorifle/verb/sights() - set category = "Object" - set name = "Aim Down Sights" - set popup_menu = 1 - - toggle_scope(scope_multiplier) - -/obj/item/weapon/gun/energy/monorifle/combat - name = "combat mono-rifle" - desc = "A modernized version of the mono-rifle. This one can fire twice before requiring recharging." - description_fluff = "A modern design produced by a company once working from Saint Columbia, based on the antique mono-rifle 'Rainy Day Special' design." - icon_state = "ecshotgun" - item_state = "cshotgun" - charge_cost = 1000 - force = 12 - accuracy = 0 - scoped_accuracy = 20 - -////////Laser Tag//////////////////// - -/obj/item/weapon/gun/energy/lasertag - name = "laser tag gun" - item_state = "laser" - desc = "Standard issue weapon of the Imperial Guard" - origin_tech = list(TECH_COMBAT = 1, TECH_MAGNET = 2) - matter = list(DEFAULT_WALL_MATERIAL = 2000) - projectile_type = /obj/item/projectile/beam/lastertag/blue - cell_type = /obj/item/weapon/cell/device/weapon/recharge - battery_lock = 1 - var/required_vest - -/obj/item/weapon/gun/energy/lasertag/special_check(var/mob/living/carbon/human/M) - if(ishuman(M)) - if(!istype(M.wear_suit, required_vest)) - M << "You need to be wearing your laser tag vest!" - return 0 - return ..() - -/obj/item/weapon/gun/energy/lasertag/blue - icon_state = "bluetag" - item_state = "bluetag" - projectile_type = /obj/item/projectile/beam/lastertag/blue - required_vest = /obj/item/clothing/suit/bluetag - -/obj/item/weapon/gun/energy/lasertag/red - icon_state = "redtag" - item_state = "redtag" - projectile_type = /obj/item/projectile/beam/lastertag/red - required_vest = /obj/item/clothing/suit/redtag +/obj/item/weapon/gun/energy/laser + name = "laser rifle" + desc = "A Hephaestus Industries G40E rifle, designed to kill with concentrated energy blasts. This variant has the ability to \ + switch between standard fire and a more efficent but weaker 'suppressive' fire." + icon_state = "laser" + item_state = "laser" + wielded_item_state = "laser-wielded" + fire_delay = 8 + slot_flags = SLOT_BELT|SLOT_BACK + w_class = ITEMSIZE_LARGE + force = 10 + origin_tech = list(TECH_COMBAT = 3, TECH_MAGNET = 2) + matter = list(DEFAULT_WALL_MATERIAL = 2000) + projectile_type = /obj/item/projectile/beam/midlaser +// one_handed_penalty = 30 + + firemodes = list( + list(mode_name="normal", fire_delay=8, projectile_type=/obj/item/projectile/beam/midlaser, charge_cost = 240), + list(mode_name="suppressive", fire_delay=5, projectile_type=/obj/item/projectile/beam/weaklaser, charge_cost = 60), + ) + +/obj/item/weapon/gun/energy/laser/mounted + self_recharge = 1 + use_external_power = 1 + one_handed_penalty = 0 // Not sure if two-handing gets checked for mounted weapons, but better safe than sorry. + +/obj/item/weapon/gun/energy/laser/practice + name = "practice laser carbine" + desc = "A modified version of the HI G40E, this one fires less concentrated energy bolts designed for target practice." + projectile_type = /obj/item/projectile/beam/practice + charge_cost = 48 + + cell_type = /obj/item/weapon/cell/device + + firemodes = list( + list(mode_name="normal", projectile_type=/obj/item/projectile/beam/practice, charge_cost = 48), + list(mode_name="suppressive", projectile_type=/obj/item/projectile/beam/practice, charge_cost = 12), + ) + +/obj/item/weapon/gun/energy/retro + name = "retro laser" + icon_state = "retro" + item_state = "retro" + desc = "An older model of the basic lasergun. Nevertheless, it is still quite deadly and easy to maintain, making it a favorite amongst pirates and other outlaws." + slot_flags = SLOT_BELT + w_class = ITEMSIZE_NORMAL + projectile_type = /obj/item/projectile/beam + fire_delay = 10 //old technology + +/obj/item/weapon/gun/energy/retro/mounted + self_recharge = 1 + use_external_power = 1 + +/obj/item/weapon/gun/energy/retro/empty + icon_state = "retro" + cell_type = null + + +/datum/category_item/catalogue/anomalous/precursor_a/alien_pistol + name = "Precursor Alpha Weapon - Appendageheld Laser" + desc = "This object strongly resembles a weapon, and if one were to pull the \ + trigger located on the handle of the object, it would fire a deadly \ + laser at whatever it was pointed at. The beam fired appears to cause too \ + much damage to whatever it would hit to have served as a long ranged repair tool, \ + therefore this object was most likely designed to be a deadly weapon. If so, this \ + has several implications towards its creators;\ +

      \ + Firstly, it implies that these precursors, at some point during their development, \ + had needed to defend themselves, or otherwise had a need to utilize violence, and \ + as such created better tools to do so. It is unclear if violence was employed against \ + themselves as a form of in-fighting, or if violence was exclusive to outside species.\ +

      \ + Secondly, the shape and design of the weapon implies that the creators of this \ + weapon were able to grasp objects, and be able to manipulate the trigger independently \ + from merely holding onto the weapon, making certain types of appendages like tentacles be \ + unlikely.\ +

      \ + An interesting note about this weapon, when compared to contemporary energy weapons, is \ + that this gun appears to be inferior to modern laser weapons. The beam fired has less \ + of an ability to harm, and the power consumption appears to be higher than average for \ + a human-made energy side-arm. One possible explaination is that the creators of this \ + weapon, in their later years, had less of a need to optimize their capability for war, \ + and instead focused on other endeavors. Another explaination is that vast age of the weapon \ + may have caused it to degrade, yet still remain functional at a reduced capability." + value = CATALOGUER_REWARD_MEDIUM + +/obj/item/weapon/gun/energy/alien + name = "alien pistol" + desc = "A weapon that works very similarly to a traditional energy weapon. How this came to be will likely be a mystery for the ages." + catalogue_data = list(/datum/category_item/catalogue/anomalous/precursor_a/alien_pistol) + icon_state = "alienpistol" + item_state = "alienpistol" + fire_delay = 10 // Handguns should be inferior to two-handed weapons. Even alien ones I suppose. + charge_cost = 480 // Five shots. + + projectile_type = /obj/item/projectile/beam/cyan + cell_type = /obj/item/weapon/cell/device/weapon/recharge/alien // Self charges. + origin_tech = list(TECH_COMBAT = 8, TECH_MAGNET = 7) + modifystate = "alienpistol" + + +/obj/item/weapon/gun/energy/captain + name = "antique laser gun" + icon_state = "caplaser" + item_state = "caplaser" + desc = "A rare weapon, handcrafted by a now defunct specialty manufacturer on Luna for a small fortune. It's certainly aged well." + force = 5 + slot_flags = SLOT_BELT + w_class = ITEMSIZE_NORMAL + projectile_type = /obj/item/projectile/beam + origin_tech = null + fire_delay = 10 //Old pistol + charge_cost = 480 //to compensate a bit for self-recharging + cell_type = /obj/item/weapon/cell/device/weapon/recharge/captain + battery_lock = 1 + +/obj/item/weapon/gun/energy/lasercannon + name = "laser cannon" + desc = "With the laser cannon, the lasing medium is enclosed in a tube lined with uranium-235 and subjected to high neutron \ + flux in a nuclear reactor core. This incredible technology may help YOU achieve high excitation rates with small laser volumes!" + icon_state = "lasercannon" + item_state = null + origin_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 3, TECH_POWER = 3) + slot_flags = SLOT_BELT|SLOT_BACK + projectile_type = /obj/item/projectile/beam/heavylaser/cannon + battery_lock = 1 + fire_delay = 20 + w_class = ITEMSIZE_LARGE +// one_handed_penalty = 90 // The thing's heavy and huge. + accuracy = 45 + charge_cost = 600 + +/obj/item/weapon/gun/energy/lasercannon/mounted + name = "mounted laser cannon" + self_recharge = 1 + use_external_power = 1 + recharge_time = 10 + accuracy = 0 // Mounted cannons are just fine the way they are. + one_handed_penalty = 0 // Not sure if two-handing gets checked for mounted weapons, but better safe than sorry. + projectile_type = /obj/item/projectile/beam/heavylaser + charge_cost = 400 + fire_delay = 20 + +/obj/item/weapon/gun/energy/xray + name = "xray laser gun" + desc = "A high-power laser gun capable of expelling concentrated xray blasts, which are able to penetrate matter easier than \ + standard photonic beams, resulting in an effective 'anti-armor' energy weapon." + icon_state = "xray" + item_state = "xray" + origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 3, TECH_MAGNET = 2) + projectile_type = /obj/item/projectile/beam/xray + charge_cost = 200 + +/obj/item/weapon/gun/energy/sniperrifle + name = "marksman energy rifle" + desc = "The HI DMR 9E is an older design of Hephaestus Industries. A designated marksman rifle capable of shooting powerful \ + ionized beams, this is a weapon to kill from a distance." + icon_state = "sniper" + item_state = "sniper" + item_state_slots = list(slot_r_hand_str = "z8carbine", slot_l_hand_str = "z8carbine") //placeholder + origin_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 5, TECH_POWER = 4) + projectile_type = /obj/item/projectile/beam/sniper + slot_flags = SLOT_BACK + battery_lock = 1 + charge_cost = 600 + fire_delay = 35 + force = 10 + w_class = ITEMSIZE_HUGE // So it can't fit in a backpack. + accuracy = -45 //shooting at the hip + scoped_accuracy = 0 +// requires_two_hands = 1 +// one_handed_penalty = 60 // The weapon itself is heavy, and the long barrel makes it hard to hold steady with just one hand. + +/obj/item/weapon/gun/energy/sniperrifle/verb/scope() + set category = "Object" + set name = "Use Scope" + set popup_menu = 1 + + toggle_scope(2.0) + +/obj/item/weapon/gun/energy/monorifle + name = "antique mono-rifle" + desc = "An old laser rifle. This one can only fire once before requiring recharging." + description_fluff = "Modeled after ancient hunting rifles, this rifle was dubbed the 'Rainy Day Special' by some, due to its use as some barmens' fight-stopper of choice. One shot is all it takes, or so they say." + icon_state = "eshotgun" + item_state = "shotgun" + origin_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 4, TECH_POWER = 3) + projectile_type = /obj/item/projectile/beam/sniper + slot_flags = SLOT_BACK + charge_cost = 1300 + fire_delay = 20 + force = 8 + w_class = ITEMSIZE_LARGE + accuracy = 10 + scoped_accuracy = 15 + var/scope_multiplier = 1.5 + +/obj/item/weapon/gun/energy/monorifle/verb/sights() + set category = "Object" + set name = "Aim Down Sights" + set popup_menu = 1 + + toggle_scope(scope_multiplier) + +/obj/item/weapon/gun/energy/monorifle/combat + name = "combat mono-rifle" + desc = "A modernized version of the mono-rifle. This one can fire twice before requiring recharging." + description_fluff = "A modern design produced by a company once working from Saint Columbia, based on the antique mono-rifle 'Rainy Day Special' design." + icon_state = "ecshotgun" + item_state = "cshotgun" + charge_cost = 1000 + force = 12 + accuracy = 0 + scoped_accuracy = 20 + +////////Laser Tag//////////////////// + +/obj/item/weapon/gun/energy/lasertag + name = "laser tag gun" + item_state = "laser" + desc = "Standard issue weapon of the Imperial Guard" + origin_tech = list(TECH_COMBAT = 1, TECH_MAGNET = 2) + matter = list(DEFAULT_WALL_MATERIAL = 2000) + projectile_type = /obj/item/projectile/beam/lasertag/blue + cell_type = /obj/item/weapon/cell/device/weapon/recharge + battery_lock = 1 + var/required_vest + +/obj/item/weapon/gun/energy/lasertag/special_check(var/mob/living/carbon/human/M) + if(ishuman(M)) + if(!istype(M.wear_suit, required_vest)) + M << "You need to be wearing your laser tag vest!" + return 0 + return ..() + +/obj/item/weapon/gun/energy/lasertag/blue + icon_state = "bluetag" + item_state = "bluetag" + projectile_type = /obj/item/projectile/beam/lasertag/blue + required_vest = /obj/item/clothing/suit/bluetag + +/obj/item/weapon/gun/energy/lasertag/red + icon_state = "redtag" + item_state = "redtag" + projectile_type = /obj/item/projectile/beam/lasertag/red + required_vest = /obj/item/clothing/suit/redtag + +/obj/item/weapon/gun/energy/lasertag/omni + projectile_type = /obj/item/projectile/beam/lasertag/omni + +// Laser scattergun, proof of concept. + +/obj/item/weapon/gun/energy/lasershotgun + name = "laser scattergun" + icon = 'icons/obj/energygun.dmi' + item_state = "laser" + icon_state = "scatter" + desc = "A strange Almachi weapon, utilizing a refracting prism to turn a single laser blast into a diverging cluster." + origin_tech = list(TECH_COMBAT = 3, TECH_MAGNET = 1, TECH_MATERIAL = 4) + + projectile_type = /obj/item/projectile/scatter/laser \ No newline at end of file diff --git a/code/modules/projectiles/guns/energy/special_vr.dm b/code/modules/projectiles/guns/energy/special_vr.dm index e1cfcaf5c93..73e878eed6b 100644 --- a/code/modules/projectiles/guns/energy/special_vr.dm +++ b/code/modules/projectiles/guns/energy/special_vr.dm @@ -2,4 +2,26 @@ projectile_type = /obj/item/projectile/ion/pistol // still packs a punch but no AoE /obj/item/weapon/gun/energy/ionrifle/weak - projectile_type = /obj/item/projectile/ion/small \ No newline at end of file + projectile_type = /obj/item/projectile/ion/small + +/obj/item/weapon/gun/energy/medigun //Adminspawn/ERT etc + name = "directed restoration system" + desc = "The BL-3 'Phoenix' is an adaptation on the ML-3 'Medbeam' design that channels the power of the beam into a single healing laser. It is highly energy-inefficient, but its medical power cannot be denied." + force = 5 + icon_state = "medbeam" + item_state = "medbeam" + icon = 'icons/obj/gun_vr.dmi' + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_guns_vr.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_guns_vr.dmi', + ) + slot_flags = SLOT_BELT + accuracy = 100 + fire_delay = 12 + fire_sound = 'sound/weapons/eluger.ogg' + + projectile_type = /obj/item/projectile/beam/medigun + + accept_cell_type = /obj/item/weapon/cell + cell_type = /obj/item/weapon/cell/high + charge_cost = 2500 \ No newline at end of file diff --git a/code/modules/projectiles/guns/magnetic/bore.dm b/code/modules/projectiles/guns/magnetic/bore.dm index e27fdc38d64..4cb86a6d31c 100644 --- a/code/modules/projectiles/guns/magnetic/bore.dm +++ b/code/modules/projectiles/guns/magnetic/bore.dm @@ -86,7 +86,17 @@ user.visible_message("\The [user] slots \the [cell] into \the [src].") update_icon() return - + if(thing.is_crowbar()) + if(!manipulator) + to_chat(user, "\The [src] has no manipulator installed.") + return + manipulator.forceMove(get_turf(src)) + user.put_in_hands(manipulator) + user.visible_message("\The [user] levers \the [manipulator] from \the [src].") + playsound(loc, 'sound/items/Crowbar.ogg', 50, 1) + manipulator = null + update_icon() + return if(thing.is_screwdriver()) if(!capacitor) to_chat(user, "\The [src] has no capacitor installed.") @@ -112,6 +122,20 @@ update_icon() return + if(istype(thing, /obj/item/weapon/stock_parts/manipulator)) + if(manipulator) + to_chat(user, "\The [src] already has \a [manipulator] installed.") + return + manipulator = thing + user.drop_from_inventory(manipulator) + manipulator.forceMove(src) + playsound(loc, 'sound/machines/click.ogg', 10,1) + mat_cost = initial(mat_cost) % (2*manipulator.rating) + user.visible_message("\The [user] slots \the [manipulator] into \the [src].") + update_icon() + return + + if(istype(thing, load_type)) loading = TRUE var/obj/item/stack/material/M = thing diff --git a/code/modules/projectiles/guns/magnetic/magnetic.dm b/code/modules/projectiles/guns/magnetic/magnetic.dm index 20e0ea85121..c327a2b51e7 100644 --- a/code/modules/projectiles/guns/magnetic/magnetic.dm +++ b/code/modules/projectiles/guns/magnetic/magnetic.dm @@ -10,6 +10,7 @@ var/obj/item/weapon/cell/cell // Currently installed powercell. var/obj/item/weapon/stock_parts/capacitor/capacitor // Installed capacitor. Higher rating == faster charge between shots. + var/obj/item/weapon/stock_parts/manipulator/manipulator // Installed manipulator. Mostly for Phoron Bore, higher rating == less mats consumed upon firing var/removable_components = TRUE // Whether or not the gun can be dismantled. var/gun_unreliable = 15 // Percentage chance of detonating in your hands. diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index d74bfb9cafc..f3603a783d3 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -44,6 +44,7 @@ var/tracer_type var/muzzle_type var/impact_type + var/datum/beam_components_cache/beam_components //Fancy hitscan lighting effects! var/hitscan_light_intensity = 1.5 @@ -84,8 +85,17 @@ var/accuracy = 0 var/dispersion = 0.0 + // Sub-munitions. Basically, multi-projectile shotgun, rather than pellets. + var/use_submunitions = FALSE + var/only_submunitions = FALSE // Will the projectile delete itself after firing the submunitions? + var/list/submunitions = list() // Assoc list of the paths of any submunitions, and how many they are. [projectilepath] = [projectilecount]. + var/submunition_spread_max = 30 // Divided by 10 to get the percentile dispersion. + var/submunition_spread_min = 5 // Above. + var/force_max_submunition_spread = FALSE // Do we just force the maximum? + var/spread_submunition_damage = FALSE // Do we assign damage to our sub projectiles based on our main projectile damage? + var/damage = 10 - var/damage_type = BRUTE //BRUTE, BURN, TOX, OXY, CLONE, HALLOSS are the only things that should be in here + var/damage_type = BRUTE //BRUTE, BURN, TOX, OXY, CLONE, HALLOSS, ELECTROCUTE, BIOACID are the only things that should be in here var/SA_bonus_damage = 0 // Some bullets inflict extra damage on simple animals. var/SA_vulnerability = null // What kind of simple animal the above bonus damage should be applied to. Set to null to apply to all SAs. var/nodamage = 0 //Determines if the projectile will skip any damage inflictions @@ -423,7 +433,6 @@ if(hitscan) finalize_hitscan_and_generate_tracers() STOP_PROCESSING(SSprojectiles, src) - cleanup_beam_segments() qdel(trajectory) return ..() @@ -447,10 +456,11 @@ /obj/item/projectile/proc/generate_hitscan_tracers(cleanup = TRUE, duration = 5, impacting = TRUE) if(!length(beam_segments)) return + beam_components = new if(tracer_type) var/tempref = "\ref[src]" for(var/datum/point/p in beam_segments) - generate_tracer_between_points(p, beam_segments[p], tracer_type, color, duration, hitscan_light_range, hitscan_light_color_override, hitscan_light_intensity, tempref) + generate_tracer_between_points(p, beam_segments[p], beam_components, tracer_type, color, duration, hitscan_light_range, hitscan_light_color_override, hitscan_light_intensity, tempref) if(muzzle_type && duration > 0) var/datum/point/p = beam_segments[1] var/atom/movable/thing = new muzzle_type @@ -460,7 +470,7 @@ thing.transform = M thing.color = color thing.set_light(muzzle_flash_range, muzzle_flash_intensity, muzzle_flash_color_override? muzzle_flash_color_override : color) - QDEL_IN(thing, duration) + beam_components.beam_components += thing if(impacting && impact_type && duration > 0) var/datum/point/p = beam_segments[beam_segments[beam_segments.len]] var/atom/movable/thing = new impact_type @@ -470,9 +480,8 @@ thing.transform = M thing.color = color thing.set_light(impact_light_range, impact_light_intensity, impact_light_color_override? impact_light_color_override : color) - QDEL_IN(thing, duration) - if(cleanup) - cleanup_beam_segments() + beam_components.beam_components += thing + QDEL_IN(beam_components, duration) //Returns true if the target atom is on our current turf and above the right layer //If direct target is true it's the originally clicked target. @@ -649,6 +658,37 @@ if(get_turf(target) == get_turf(src)) direct_target = target + if(use_submunitions && submunitions.len) + var/temp_min_spread = 0 + if(force_max_submunition_spread) + temp_min_spread = submunition_spread_max + else + temp_min_spread = submunition_spread_min + + var/damage_override = null + + if(spread_submunition_damage) + damage_override = damage + if(nodamage) + damage_override = 0 + + var/projectile_count = 0 + + for(var/proj in submunitions) + projectile_count += submunitions[proj] + + damage_override = round(damage_override / max(1, projectile_count)) + + for(var/path in submunitions) + for(var/count = 1 to submunitions[path]) + var/obj/item/projectile/SM = new path(get_turf(loc)) + SM.shot_from = shot_from + SM.silenced = silenced + SM.dispersion = rand(temp_min_spread, submunition_spread_max) / 10 + if(!isnull(damage_override)) + SM.damage = damage_override + SM.launch_projectile(target, target_zone, user, params, angle_override) + preparePixelProjectile(target, user? user : get_turf(src), params, forced_spread) return fire(angle_override, direct_target) @@ -668,5 +708,36 @@ if(get_turf(target) == get_turf(src)) direct_target = target + if(use_submunitions && submunitions.len) + var/temp_min_spread = 0 + if(force_max_submunition_spread) + temp_min_spread = submunition_spread_max + else + temp_min_spread = submunition_spread_min + + var/damage_override = null + + if(spread_submunition_damage) + damage_override = damage + if(nodamage) + damage_override = 0 + + var/projectile_count = 0 + + for(var/proj in submunitions) + projectile_count += submunitions[proj] + + damage_override = round(damage_override / max(1, projectile_count)) + + for(var/path in submunitions) + for(var/count = 1 to submunitions[path]) + var/obj/item/projectile/SM = new path(get_turf(loc)) + SM.shot_from = shot_from + SM.silenced = silenced + SM.dispersion = rand(temp_min_spread, submunition_spread_max) / 10 + if(!isnull(damage_override)) + SM.damage = damage_override + SM.launch_projectile_from_turf(target, target_zone, user, params, angle_override) + preparePixelProjectile(target, get_turf(src), params, forced_spread) return fire(angle_override, direct_target) diff --git a/code/modules/projectiles/projectile/arc.dm b/code/modules/projectiles/projectile/arc.dm index 0c4c9f4caa9..1f19dc0242e 100644 --- a/code/modules/projectiles/projectile/arc.dm +++ b/code/modules/projectiles/projectile/arc.dm @@ -167,4 +167,4 @@ var/rad_power = 50 /obj/item/projectile/arc/radioactive/on_impact(turf/T) - radiation_repository.radiate(T, rad_power) + SSradiation.radiate(T, rad_power) diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index c892175c9a1..ec2670c61d2 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -89,6 +89,7 @@ /obj/item/projectile/beam/cyan name = "cyan beam" icon_state = "cyan" + fire_sound = 'sound/weapons/eluger.ogg' damage = 40 light_color = "#00C6FF" @@ -125,62 +126,52 @@ tracer_type = /obj/effect/projectile/tracer/emitter impact_type = /obj/effect/projectile/impact/emitter -/obj/item/projectile/beam/lastertag/blue +/obj/item/projectile/beam/lasertag name = "lasertag beam" - icon_state = "bluelaser" damage = 0 + eyeblur = 0 no_attack_log = 1 damage_type = BURN check_armour = "laser" - light_color = "#0066FF" combustion = FALSE +/obj/item/projectile/beam/lasertag/blue + icon_state = "bluelaser" + light_color = "#0066FF" + muzzle_type = /obj/effect/projectile/muzzle/laser_blue tracer_type = /obj/effect/projectile/tracer/laser_blue impact_type = /obj/effect/projectile/impact/laser_blue -/obj/item/projectile/beam/lastertag/blue/on_hit(var/atom/target, var/blocked = 0) - if(istype(target, /mob/living/carbon/human)) +/obj/item/projectile/beam/lasertag/blue/on_hit(var/atom/target, var/blocked = 0) + if(ishuman(target)) var/mob/living/carbon/human/M = target if(istype(M.wear_suit, /obj/item/clothing/suit/redtag)) M.Weaken(5) return 1 -/obj/item/projectile/beam/lastertag/red - name = "lasertag beam" +/obj/item/projectile/beam/lasertag/red icon_state = "laser" - damage = 0 - no_attack_log = 1 - damage_type = BURN - check_armour = "laser" light_color = "#FF0D00" - combustion = FALSE - -/obj/item/projectile/beam/lastertag/red/on_hit(var/atom/target, var/blocked = 0) - if(istype(target, /mob/living/carbon/human)) +/obj/item/projectile/beam/lasertag/red/on_hit(var/atom/target, var/blocked = 0) + if(ishuman(target)) var/mob/living/carbon/human/M = target if(istype(M.wear_suit, /obj/item/clothing/suit/bluetag)) M.Weaken(5) return 1 -/obj/item/projectile/beam/lastertag/omni//A laser tag bolt that stuns EVERYONE - name = "lasertag beam" +/obj/item/projectile/beam/lasertag/omni//A laser tag bolt that stuns EVERYONE icon_state = "omnilaser" - damage = 0 - damage_type = BURN - check_armour = "laser" light_color = "#00C6FF" - combustion = FALSE - muzzle_type = /obj/effect/projectile/muzzle/laser_omni tracer_type = /obj/effect/projectile/tracer/laser_omni impact_type = /obj/effect/projectile/impact/laser_omni -/obj/item/projectile/beam/lastertag/omni/on_hit(var/atom/target, var/blocked = 0) - if(istype(target, /mob/living/carbon/human)) +/obj/item/projectile/beam/lasertag/omni/on_hit(var/atom/target, var/blocked = 0) + if(ishuman(target)) var/mob/living/carbon/human/M = target if((istype(M.wear_suit, /obj/item/clothing/suit/bluetag))||(istype(M.wear_suit, /obj/item/clothing/suit/redtag))) M.Weaken(5) @@ -222,4 +213,17 @@ /obj/item/projectile/beam/stun/med name = "stun beam" icon_state = "stun" - agony = 30 \ No newline at end of file + agony = 30 + +/obj/item/projectile/beam/shock + name = "shock beam" + icon_state = "lightning" + damage_type = ELECTROCUTE + + muzzle_type = /obj/effect/projectile/muzzle/lightning + tracer_type = /obj/effect/projectile/tracer/lightning + impact_type = /obj/effect/projectile/impact/lightning + + damage = 30 + agony = 15 + eyeblur = 2 diff --git a/code/modules/projectiles/projectile/beams_vr.dm b/code/modules/projectiles/projectile/beams_vr.dm index b6ec5cbe0b4..8930260e9e7 100644 --- a/code/modules/projectiles/projectile/beams_vr.dm +++ b/code/modules/projectiles/projectile/beams_vr.dm @@ -41,3 +41,37 @@ muzzle_type = /obj/effect/projectile/muzzle/laser_blue tracer_type = /obj/effect/projectile/tracer/laser_blue impact_type = /obj/effect/projectile/impact/laser_blue + +/obj/item/projectile/beam/medigun + name = "healing beam" + icon_state = "healbeam" + damage = 0 //stops it damaging walls + nodamage = TRUE + no_attack_log = TRUE + damage_type = BURN + check_armour = "laser" + light_color = "#80F5FF" + + combustion = FALSE + + muzzle_type = /obj/effect/projectile/muzzle/medigun + tracer_type = /obj/effect/projectile/tracer/medigun + impact_type = /obj/effect/projectile/impact/medigun + +/obj/item/projectile/beam/medigun/on_hit(var/atom/target, var/blocked = 0) + if(istype(target, /mob/living/carbon/human)) + var/mob/living/carbon/human/M = target + if(M.health < M.maxHealth) + var/obj/effect/overlay/pulse = new /obj/effect/overlay(get_turf(M)) + pulse.icon = 'icons/effects/effects.dmi' + pulse.icon_state = "heal" + pulse.name = "heal" + pulse.anchored = 1 + spawn(20) + qdel(pulse) + to_chat(target, "As the beam strikes you, your injuries close up!") + M.adjustBruteLoss(-15) + M.adjustFireLoss(-15) + M.adjustToxLoss(-5) + M.adjustOxyLoss(-5) + return 1 \ No newline at end of file diff --git a/code/modules/projectiles/projectile/scatter.dm b/code/modules/projectiles/projectile/scatter.dm new file mode 100644 index 00000000000..0aa6ad57198 --- /dev/null +++ b/code/modules/projectiles/projectile/scatter.dm @@ -0,0 +1,62 @@ + +/* + * Home of the purely submunition projectiles. + */ + +/obj/item/projectile/scatter + name = "scatter projectile" + icon = 'icons/obj/projectiles.dmi' + icon_state = "bullet" + density = FALSE + anchored = TRUE + unacidable = TRUE + pass_flags = PASSTABLE + mouse_opacity = 0 + + use_submunitions = TRUE + + damage = 8 + spread_submunition_damage = TRUE + only_submunitions = TRUE + range = 0 // Immediately deletes itself after firing, as its only job is to fire other projectiles. + + submunition_spread_max = 30 + submunition_spread_min = 2 + + submunitions = list( + /obj/item/projectile/bullet/pellet/shotgun/flak = 3 + ) + +/obj/item/projectile/scatter/laser + damage = 40 + + submunition_spread_max = 40 + submunition_spread_min = 10 + + submunitions = list( + /obj/item/projectile/beam/prismatic = 4 + ) + +/obj/item/projectile/beam/prismatic + name = "prismatic beam" + icon_state = "omnilaser" + damage = 10 + damage_type = BURN + check_armour = "laser" + light_color = "#00C6FF" + + stutter = 2 + + muzzle_type = /obj/effect/projectile/muzzle/laser_omni + tracer_type = /obj/effect/projectile/tracer/laser_omni + impact_type = /obj/effect/projectile/impact/laser_omni + +/obj/item/projectile/scatter/ion + damage = 20 + + submunition_spread_max = 40 + submunition_spread_min = 10 + + submunitions = list( + /obj/item/projectile/bullet/shotgun/ion = 3 + ) diff --git a/code/modules/radiation/radiation.dm b/code/modules/radiation/radiation.dm new file mode 100644 index 00000000000..d913ad7cab4 --- /dev/null +++ b/code/modules/radiation/radiation.dm @@ -0,0 +1,59 @@ +// Describes a point source of radiation. Created either in response to a pulse of radiation, or over an irradiated atom. +// Sources will decay over time, unless something is renewing their power! +/datum/radiation_source + var/turf/source_turf // Location of the radiation source. + var/rad_power // Strength of the radiation being emitted. + var/decay = TRUE // True for automatic decay. False if owner promises to handle it (i.e. supermatter) + var/respect_maint = FALSE // True for not affecting RAD_SHIELDED areas. + var/flat = FALSE // True for power falloff with distance. + var/range // Cached maximum range, used for quick checks against mobs. + +/datum/radiation_source/Destroy() + SSradiation.sources -= src + if(SSradiation.sources_assoc[src.source_turf] == src) + SSradiation.sources_assoc -= src.source_turf + src.source_turf = null + . = ..() + +/datum/radiation_source/proc/update_rad_power(var/new_power = null) + if(new_power == null || new_power == rad_power) + return // No change + else if(new_power <= config.radiation_lower_limit) + qdel(src) // Decayed to nothing + else + rad_power = new_power + if(!flat) + range = min(round(sqrt(rad_power / config.radiation_lower_limit)), 31) // R = rad_power / dist**2 - Solve for dist + +/turf + var/cached_rad_resistance = 0 + +/turf/proc/calc_rad_resistance() + cached_rad_resistance = 0 + for(var/obj/O in src.contents) + if(O.rad_resistance) //Override + cached_rad_resistance += O.rad_resistance + + else if(O.density) //So open doors don't get counted + var/material/M = O.get_material() + if(!M) continue + cached_rad_resistance += M.weight + M.radiation_resistance + // Looks like storing the contents length is meant to be a basic check if the cache is stale due to items enter/exiting. Better than nothing so I'm leaving it as is. ~Leshana + SSradiation.resistance_cache[src] = (length(contents) + 1) + +/turf/simulated/wall/calc_rad_resistance() + SSradiation.resistance_cache[src] = (length(contents) + 1) + cached_rad_resistance = (density ? material.weight + material.radiation_resistance : 0) + +/obj + var/rad_resistance = 0 // Allow overriding rad resistance + +// If people expand the system, this may be useful. Here as a placeholder until then +/atom/proc/rad_act(var/severity) + return 1 + +/mob/living/rad_act(var/severity) + if(severity && !isbelly(loc)) //eaten mobs are made immune to radiation //VOREStation Edit + src.apply_effect(severity, IRRADIATE, src.getarmor(null, "rad")) + for(var/atom/I in src) + I.rad_act(severity) \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index dee4cabfa69..a481cfaf337 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -281,6 +281,28 @@ var/obj/item/weapon/reagent_containers/food/condiment/P = new/obj/item/weapon/reagent_containers/food/condiment(src.loc) reagents.trans_to_obj(P,50) + else if (href_list["createpatch"]) + if(reagents.total_volume < 1) //Sanity checking. + return + + var/name = sanitizeSafe(input(usr,"Name:","Name your patch!","[reagents.get_master_reagent_name()] ([round(reagents.total_volume)]u)") as null|text, MAX_NAME_LEN) + + if(!name) //Blank name (sanitized to nothing, or left empty) or cancel + return + + if(reagents.total_volume < 1) //Sanity checking. + return + var/obj/item/weapon/reagent_containers/pill/patch/P = new/obj/item/weapon/reagent_containers/pill/patch(src.loc) + if(!name) name = reagents.get_master_reagent_name() + P.name = "[name] patch" + P.pixel_x = rand(-7, 7) //random position + P.pixel_y = rand(-7, 7) + + reagents.trans_to_obj(P, 60) + if(src.loaded_pill_bottle) + if(loaded_pill_bottle.contents.len < loaded_pill_bottle.max_storage_space) + P.loc = loaded_pill_bottle + else if(href_list["pill_sprite"]) pillsprite = href_list["pill_sprite"] else if(href_list["bottle_sprite"]) 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 0da87f2d0c1..48afe19b7e7 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm @@ -148,6 +148,24 @@ if(!istype(T, /turf/space)) new /obj/effect/decal/cleanable/flour(T) +/datum/reagent/nutriment/coffee + name = "Coffee Powder" + id = "coffeepowder" + description = "A bitter powder made by grinding coffee beans." + taste_description = "bitterness" + taste_mult = 1.3 + nutriment_factor = 1 + color = "#482000" + +/datum/reagent/nutriment/tea + name = "Tea Powder" + id = "teapowder" + description = "A dark, tart powder made from black tea leaves." + taste_description = "tartness" + taste_mult = 1.3 + nutriment_factor = 1 + color = "#101000" + /datum/reagent/nutriment/coco name = "Coco Powder" id = "coco" @@ -158,6 +176,41 @@ nutriment_factor = 5 color = "#302000" +/datum/reagent/nutriment/instantjuice + name = "Juice Powder" + id = "instantjuice" + description = "Dehydrated, powdered juice of some kind." + taste_mult = 1.3 + nutriment_factor = 1 + +/datum/reagent/nutriment/instantjuice/grape + name = "Grape Juice Powder" + id = "instantgrape" + description = "Dehydrated, powdered grape juice." + taste_description = "dry grapes" + color = "#863333" + +/datum/reagent/nutriment/instantjuice/orange + name = "Orange Juice Powder" + id = "instantorange" + description = "Dehydrated, powdered orange juice." + taste_description = "dry oranges" + color = "#e78108" + +/datum/reagent/nutriment/instantjuice/watermelon + name = "Watermelon Juice Powder" + id = "instantwatermelon" + description = "Dehydrated, powdered watermelon juice." + taste_description = "dry sweet watermelon" + color = "#b83333" + +/datum/reagent/nutriment/instantjuice/apple + name = "Apple Juice Powder" + id = "instantapple" + description = "Dehydrated, powdered apple juice." + taste_description = "dry sweet apples" + color = "#c07c40" + /datum/reagent/nutriment/soysauce name = "Soysauce" id = "soysauce" diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm index e2724f06475..d1213eb7836 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm @@ -16,6 +16,28 @@ M.add_chemical_effect(CE_STABLE, 15) M.add_chemical_effect(CE_PAINKILLER, 10) +/datum/reagent/inaprovaline/topical + name = "Inaprovalaze" + id = "inaprovalaze" + description = "Inaprovalaze is a topical variant of Inaprovaline." + taste_description = "bitterness" + reagent_state = LIQUID + color = "#00BFFF" + overdose = REAGENTS_OVERDOSE * 2 + metabolism = REM * 0.5 + scannable = 1 + touch_met = REM * 0.75 + +/datum/reagent/inaprovaline/topical/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + if(alien != IS_DIONA) + ..() + M.adjustToxLoss(2 * removed) + +/datum/reagent/inaprovaline/topical/affect_touch(var/mob/living/carbon/M, var/alien, var/removed) + if(alien != IS_DIONA) + M.add_chemical_effect(CE_STABLE, 20) + M.add_chemical_effect(CE_PAINKILLER, 12) + /datum/reagent/bicaridine name = "Bicaridine" id = "bicaridine" @@ -51,6 +73,33 @@ if(W.damage <= 0) O.wounds -= W +/datum/reagent/bicaridine/topical + name = "Bicaridaze" + id = "bicaridaze" + description = "Bicaridaze is a topical variant of the chemical Bicaridine." + taste_description = "bitterness" + taste_mult = 3 + reagent_state = LIQUID + color = "#BF0000" + overdose = REAGENTS_OVERDOSE * 0.75 + scannable = 1 + touch_met = REM * 0.75 + +/datum/reagent/bicaridine/topical/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + var/chem_effective = 1 + if(alien == IS_SLIME) + chem_effective = 0.75 + if(alien != IS_DIONA) + ..(M, alien, removed * chem_effective) + M.adjustToxLoss(2 * removed) + +/datum/reagent/bicaridine/topical/affect_touch(var/mob/living/carbon/M, var/alien, var/removed) + var/chem_effective = 1 + if(alien == IS_SLIME) + chem_effective = 0.75 + if(alien != IS_DIONA) + M.heal_organ_damage(6 * removed * chem_effective, 0) + /datum/reagent/kelotane name = "Kelotane" id = "kelotane" @@ -87,6 +136,33 @@ if(alien != IS_DIONA) M.heal_organ_damage(0, 8 * removed * chem_effective) //VOREStation edit +/datum/reagent/dermaline/topical + name = "Dermalaze" + id = "dermalaze" + description = "Dermalaze is a topical variant of the chemical Dermaline." + taste_description = "bitterness" + taste_mult = 1.5 + reagent_state = LIQUID + color = "#FF8000" + overdose = REAGENTS_OVERDOSE * 0.4 + scannable = 1 + touch_met = REM * 0.75 + +/datum/reagent/dermaline/topical/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + var/chem_effective = 1 + if(alien == IS_SLIME) + chem_effective = 0.75 + if(alien != IS_DIONA) + ..(M, alien, removed * chem_effective) + M.adjustToxLoss(2 * removed) + +/datum/reagent/dermaline/topical/affect_touch(var/mob/living/carbon/M, var/alien, var/removed) + var/chem_effective = 1 + if(alien == IS_SLIME) + chem_effective = 0.75 + if(alien != IS_DIONA) + M.heal_organ_damage(0, 12 * removed * chem_effective) + /datum/reagent/dylovene name = "Dylovene" id = "anti_toxin" @@ -203,6 +279,10 @@ M.heal_organ_damage(1.5 * removed, 1.5 * removed * chem_effective) M.adjustToxLoss(-1.5 * removed * chem_effective) +/datum/reagent/tricordrazine/affect_touch(var/mob/living/carbon/M, var/alien, var/removed) + if(alien != IS_DIONA) + affect_blood(M, alien, removed * 0.4) + /datum/reagent/cryoxadone name = "Cryoxadone" id = "cryoxadone" @@ -865,6 +945,9 @@ to_chat(M, "Your senses feel unfocused, and divided.") M.add_chemical_effect(CE_ANTIBIOTIC, dose >= overdose ? ANTIBIO_OD : ANTIBIO_NORM) +/datum/reagent/spaceacillin/affect_touch(var/mob/living/carbon/M, var/alien, var/removed) + affect_blood(M, alien, removed * 0.8) // Not 100% as effective as injections, though still useful. + /datum/reagent/corophizine name = "Corophizine" id = "corophizine" diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Modifiers.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Modifiers.dm new file mode 100644 index 00000000000..d9a7483ec1e --- /dev/null +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Modifiers.dm @@ -0,0 +1,58 @@ +/* + * Modifier-applying chemicals. + */ + +/datum/reagent/modapplying + name = "brute juice" + id = "berserkmed" + description = "A liquid that is capable of causing a prolonged state of heightened aggression and durability." + taste_description = "metal" + reagent_state = LIQUID + color = "#ff5555" + metabolism = REM + + var/modifier_to_add = /datum/modifier/berserk + var/modifier_duration = 2 SECONDS // How long, per unit dose, will this last? + +/datum/reagent/modapplying/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + if(alien == IS_DIONA) + return + M.add_modifier(modifier_to_add, dose * modifier_duration) + +/datum/reagent/modapplying/cryofluid + name = "cryogenic slurry" + id = "cryoslurry" + description = "An incredibly strange liquid that rapidly absorbs thermal energy from materials it contacts." + taste_description = "siberian hellscape" + color = "#4CDBDB" + metabolism = REM * 0.5 + + modifier_to_add = /datum/modifier/cryogelled + modifier_duration = 3 SECONDS + +/datum/reagent/modapplying/cryofluid/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + ..(M, alien, removed) + M.bodytemperature -= removed * 20 + +/datum/reagent/modapplying/cryofluid/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) + affect_blood(M, alien, removed * 2.5) + +/datum/reagent/modapplying/cryofluid/affect_touch(var/mob/living/carbon/M, var/alien, var/removed) + affect_blood(M, alien, removed * 0.6) + +/datum/reagent/modapplying/cryofluid/touch_mob(var/mob/M, var/amount) + if(isliving(M)) + var/mob/living/L = M + for(var/I = 1 to rand(1, round(amount + 1))) + L.add_modifier(modifier_to_add, amount * rand(modifier_duration / 2, modifier_duration * 2)) + return + +/datum/reagent/modapplying/cryofluid/touch_turf(var/turf/T, var/amount) + if(istype(T, /turf/simulated/floor/water) && prob(amount)) + T.visible_message("\The [T] crackles loudly as the cryogenic fluid causes it to boil away, leaving behind a hard layer of ice.") + T.ChangeTurf(/turf/simulated/floor/outdoors/ice, 1, 1, TRUE) + else + if(istype(T, /turf/simulated)) + var/turf/simulated/S = T + S.freeze_floor() + return diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm index 79304733dd8..43635aba5b6 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm @@ -11,6 +11,7 @@ metabolism = REM * 0.25 // 0.05 by default. Hopefully enough to get some help, or die horribly, whatever floats your boat filtered_organs = list(O_LIVER, O_KIDNEYS) var/strength = 4 // How much damage it deals per unit + var/skin_danger = 0.2 // The multiplier for how effective the toxin is when making skin contact. /datum/reagent/toxin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(strength && alien != IS_DIONA) @@ -23,6 +24,9 @@ M.heal_organ_damage((10/strength) * removed, (10/strength) * removed) //Doses of toxins below 10 units, and 10 strength, are capable of providing useful compounds for repair. M.adjustToxLoss(strength * removed) +/datum/reagent/toxin/affect_touch(var/mob/living/carbon/M, var/alien, var/removed) + affect_blood(M, alien, removed * 0.2) + /datum/reagent/toxin/plasticide name = "Plasticide" id = "plasticide" @@ -58,6 +62,7 @@ reagent_state = LIQUID color = "#005555" strength = 8 + skin_danger = 0.4 /datum/reagent/toxin/neurotoxic_protein/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -121,6 +126,7 @@ color = "#9D14DB" strength = 30 touch_met = 5 + skin_danger = 1 /datum/reagent/toxin/phoron/touch_mob(var/mob/living/L, var/amount) if(istype(L)) @@ -346,6 +352,36 @@ if(alien == IS_DIONA) M.adjustToxLoss(50 * removed) +/datum/reagent/toxin/sifslurry + name = "Sivian Sap" + id = "sifsap" + description = "A natural slurry comprised of fluorescent bacteria native to Sif, in the Vir system." + taste_description = "sour" + reagent_state = LIQUID + color = "#C6E2FF" + strength = 2 + overdose = 20 + +/datum/reagent/toxin/sifslurry/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + if(alien == IS_DIONA) // Symbiotic bacteria. + M.nutrition += strength * removed + return + else + M.add_modifier(/datum/modifier/slow_pulse, 30 SECONDS) + ..() + +/datum/reagent/toxin/sifslurry/overdose(var/mob/living/carbon/M, var/alien, var/removed) // Overdose effect. + if(alien == IS_DIONA) + return + if(ishuman(M)) + var/mob/living/carbon/human/H = M + overdose_mod *= H.species.chemOD_mod + M.apply_effect(2 * removed,IRRADIATE, 0, 0) + M.apply_effect(5 * removed,DROWSY, 0, 0) + +/datum/reagent/toxin/sifslurry/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) + affect_blood(M, alien, removed * 0.7) + /datum/reagent/acid/polyacid name = "Polytrinic acid" id = "pacid" @@ -929,7 +965,7 @@ datum/reagent/talum_quem/affect_blood(var/mob/living/carbon/M, var/alien, var/re metabolism = REM * 4 /datum/reagent/irradiated_nanites/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) - radiation_repository.radiate(get_turf(M), 20) // Irradiate people around you. + SSradiation.radiate(get_turf(M), 20) // Irradiate people around you. M.radiation = max(M.radiation + 5 * removed, 0) // Irradiate you. Because it's inside you. /datum/reagent/neurophage_nanites diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index 5b373356470..01de315c2d4 100644 --- a/code/modules/reagents/Chemistry-Recipes.dm +++ b/code/modules/reagents/Chemistry-Recipes.dm @@ -34,6 +34,7 @@ var/reaction_sound = 'sound/effects/bubbles.ogg' var/log_is_important = 0 // If this reaction should be considered important for logging. Important recipes message admins when mixed, non-important ones just log to file. + /datum/chemical_reaction/proc/can_happen(var/datum/reagents/holder) //check that all the required reagents are present if(!holder.has_all_reagents(required_reagents)) @@ -500,6 +501,15 @@ required_reagents = list("carpotoxin" = 5, "stoxin" = 5, "copper" = 5) result_amount = 2 +/datum/chemical_reaction/carpotoxin + name = "Carpotoxin" + id = "carpotoxin" + result = "carpotoxin" + required_reagents = list("spidertoxin" = 2, "biomass" = 1, "sifsap" = 2) + catalysts = list("sifsap" = 10) + inhibitors = list("radium" = 1) + result_amount = 2 + /datum/chemical_reaction/mindbreaker name = "Mindbreaker Toxin" id = "mindbreaker" @@ -1190,6 +1200,20 @@ new /obj/item/weapon/reagent_containers/food/snacks/chocolatebar(location) return +/datum/chemical_reaction/drinks/coffee + name = "Coffee" + id = "coffee" + result = "coffee" + required_reagents = list("water" = 5, "coffeepowder" = 1) + result_amount = 5 + +/datum/chemical_reaction/drinks/tea + name = "Black tea" + id = "tea" + result = "tea" + required_reagents = list("water" = 5, "teapowder" = 1) + result_amount = 5 + /datum/chemical_reaction/drinks/hot_coco name = "Hot Coco" id = "hot_coco" @@ -1204,6 +1228,34 @@ required_reagents = list("soymilk" = 4, "sacid" = 1) result_amount = 5 +/datum/chemical_reaction/drinks/grapejuice + name = "Grape Juice" + id = "grapejuice" + result = "grapejuice" + required_reagents = list("water" = 3, "instantgrape" = 1) + result_amount = 3 + +/datum/chemical_reaction/drinks/orangejuice + name = "Orange Juice" + id = "orangejuice" + result = "orangejuice" + required_reagents = list("water" = 3, "instantorange" = 1) + result_amount = 3 + +/datum/chemical_reaction/drinks/watermelonjuice + name = "Watermelon Juice" + id = "watermelonjuice" + result = "watermelonjuice" + required_reagents = list("water" = 3, "instantwatermelon" = 1) + result_amount = 3 + +/datum/chemical_reaction/drinks/applejuice + name = "Apple Juice" + id = "applejuice" + result = "applejuice" + required_reagents = list("water" = 3, "instantapple" = 1) + result_amount = 3 + /datum/chemical_reaction/food/ketchup name = "Ketchup" id = "ketchup" @@ -2523,3 +2575,19 @@ result = "protein" required_reagents = list("anti_toxin" = 1, "neurotoxic_protein" = 2) result_amount = 2 + +/datum/chemical_reaction/neutralize_carpotoxin + name = "Neutralize Carpotoxin" + id = "carpotoxin_neutral" + result = "protein" + required_reagents = list("radium" = 1, "carpotoxin" = 1, "sifsap" = 1) + catalysts = list("sifsap" = 10) + result_amount = 2 + +/datum/chemical_reaction/neutralize_spidertoxin + name = "Neutralize Spidertoxin" + id = "spidertoxin_neutral" + result = "protein" + required_reagents = list("radium" = 1, "spidertoxin" = 1, "sifsap" = 1) + catalysts = list("sifsap" = 10) + result_amount = 2 diff --git a/code/modules/reagents/Chemistry-Recipes_vr.dm b/code/modules/reagents/Chemistry-Recipes_vr.dm index ac8fa9a7f20..c6d948ac35c 100644 --- a/code/modules/reagents/Chemistry-Recipes_vr.dm +++ b/code/modules/reagents/Chemistry-Recipes_vr.dm @@ -59,6 +59,7 @@ if(H.stat == DEAD && (/mob/living/carbon/human/proc/reconstitute_form in H.verbs)) //no magical regen for non-regenners, and can't force the reaction on live ones if(H.hasnutriment()) // make sure it actually has the conditions to revive if(H.revive_ready >= 1) // if it's not reviving, start doing so + H.revive_ready = REVIVING_READY // overrides the normal cooldown H.visible_message("[H] shudders briefly, then relaxes, faint movements stirring within.") H.chimera_regenerate() else if (/mob/living/carbon/human/proc/hatch in H.verbs)// already reviving, check if they're ready to hatch diff --git a/code/modules/reagents/distilling/Distilling-Recipes.dm b/code/modules/reagents/distilling/Distilling-Recipes.dm new file mode 100644 index 00000000000..f7fae181784 --- /dev/null +++ b/code/modules/reagents/distilling/Distilling-Recipes.dm @@ -0,0 +1,170 @@ +/datum/chemical_reaction/distilling +// name = null +// id = null +// result = null +// required_reagents = list() +// catalysts = list() +// inhibitors = list() +// result_amount = 0 + + //how far the reaction proceeds each time it is processed. Used with either REACTION_RATE or HALF_LIFE macros. + reaction_rate = HALF_LIFE(6) + + //if less than 1, the reaction will be inhibited if the ratio of products/reagents is too high. + //0.5 = 50% yield -> reaction will only proceed halfway until products are removed. +// yield = 1.0 + + //If limits on reaction rate would leave less than this amount of any reagent (adjusted by the reaction ratios), + //the reaction goes to completion. This is to prevent reactions from going on forever with tiny reagent amounts. +// min_reaction = 2 + + mix_message = "The solution churns." + reaction_sound = 'sound/effects/slosh.ogg' + +// log_is_important = 0 // If this reaction should be considered important for logging. Important recipes message admins when mixed, non-important ones just log to file. + + var/list/temp_range = list(T0C, T20C) + var/temp_shift = 0 // How much the temperature changes when the reaction occurs. + +/datum/chemical_reaction/distilling/can_happen(var/datum/reagents/holder) + //check that all the required reagents are present + if(!holder.has_all_reagents(required_reagents)) + return 0 + + //check that all the required catalysts are present in the required amount + if(!holder.has_all_reagents(catalysts)) + return 0 + + //check that none of the inhibitors are present in the required amount + if(holder.has_any_reagent(inhibitors)) + return 0 + + if(!istype(holder.my_atom, /obj/item/weapon/reagent_containers/glass/distilling)) + return 0 + + else // Super special temperature check. + var/obj/item/weapon/reagent_containers/glass/distilling/D = holder.my_atom + var/obj/machinery/portable_atmospherics/powered/reagent_distillery/RD = D.Master + if(RD.current_temp < temp_range[1] || RD.current_temp > temp_range[2]) + return 0 + + return 1 + +/datum/chemical_reaction/distilling/on_reaction(var/datum/reagents/holder, var/created_volume) + if(istype(holder.my_atom, /obj/item/weapon/reagent_containers/glass/distilling)) + var/obj/item/weapon/reagent_containers/glass/distilling/D = holder.my_atom + var/obj/machinery/portable_atmospherics/powered/reagent_distillery/RD = D.Master + RD.current_temp += temp_shift + return + +// Subtypes // + +// Biomass +/datum/chemical_reaction/distilling/biomass + name = "Distilling Biomass" + id = "distill_biomass" + result = "biomass" + required_reagents = list("blood" = 1, "sugar" = 1, "phoron" = 0.5) + result_amount = 1 // 40 units per sheet, requires actually using the machine, and having blood to spare. + + temp_range = list(T20C + 80, T20C + 130) + temp_shift = -2 + +// Medicinal +/datum/chemical_reaction/distilling/inaprovalaze + name = "Distilling Inaprovalaze" + id = "distill_inaprovalaze" + result = "inaprovalaze" + required_reagents = list("inaprovaline" = 2, "foaming_agent" = 1) + result_amount = 2 + + reaction_rate = HALF_LIFE(10) + + temp_range = list(T0C + 100, T0C + 120) + +/datum/chemical_reaction/distilling/bicaridaze + name = "Distilling Bicaridaze" + id = "distill_bicaridaze" + result = "bicaridaze" + required_reagents = list("bicaridine" = 2, "foaming_agent" = 1) + result_amount = 2 + + reaction_rate = HALF_LIFE(10) + + temp_range = list(T0C + 110, T0C + 130) + +/datum/chemical_reaction/distilling/dermalaze + name = "Distilling Dermalaze" + id = "distill_dermalaze" + result = "dermalaze" + required_reagents = list("dermaline" = 2, "foaming_agent" = 1) + result_amount = 2 + + reaction_rate = HALF_LIFE(10) + + temp_range = list(T0C + 115, T0C + 130) + +// Alcohol +/datum/chemical_reaction/distilling/beer + name = "Distilling Beer" + id = "distill_beer" + result = "beer" + required_reagents = list("nutriment" = 1, "water" = 1, "sugar" = 1) + result_amount = 2 + + reaction_rate = HALF_LIFE(30) + + temp_range = list(T20C, T20C + 2) + +/datum/chemical_reaction/distilling/ale + name = "Distilling Ale" + id = "distill_ale" + result = "ale" + required_reagents = list("nutriment" = 1, "beer" = 1) + inhibitors = list("water" = 1) + result_amount = 2 + + reaction_rate = HALF_LIFE(30) + + temp_shift = 0.5 + temp_range = list(T0C + 7, T0C + 13) + +// Unique +/datum/chemical_reaction/distilling/berserkjuice + name = "Distilling Brute Juice" + id = "distill_brutejuice" + result = "berserkmed" + required_reagents = list("biomass" = 1, "hyperzine" = 3, "synaptizine" = 2, "phoron" = 1) + result_amount = 3 + + temp_range = list(T0C + 600, T0C + 700) + temp_shift = 4 + +/datum/chemical_reaction/distilling/berserkjuice/on_reaction(var/datum/reagents/holder, var/created_volume) + ..() + + if(prob(1)) + var/turf/T = get_turf(holder.my_atom) + explosion(T, -1, rand(-1, 1), rand(1,2), rand(3,5)) + return + +/datum/chemical_reaction/distilling/cryogel + name = "Distilling Cryogellatin" + id = "distill_cryoslurry" + result = "cryoslurry" + required_reagents = list("frostoil" = 7, "enzyme" = 3, "plasticide" = 3, "foaming_agent" = 2) + inhibitors = list("water" = 5) + result_amount = 1 + + temp_range = list(0, 15) + temp_shift = 20 + +/datum/chemical_reaction/distilling/cryogel/on_reaction(var/datum/reagents/holder, var/created_volume) + ..() + + if(prob(1)) + var/turf/T = get_turf(holder.my_atom) + var/datum/effect/effect/system/smoke_spread/frost/F = new (holder.my_atom) + F.set_up(6, 0, T) + F.start() + return diff --git a/code/modules/reagents/distilling/distilling.dm b/code/modules/reagents/distilling/distilling.dm new file mode 100644 index 00000000000..b86bcc74352 --- /dev/null +++ b/code/modules/reagents/distilling/distilling.dm @@ -0,0 +1,317 @@ + +/* + * Distillery, used for over-time temperature-based mixes. + */ + +/obj/machinery/portable_atmospherics/powered/reagent_distillery + name = "chemical distillery" + desc = "A complex machine utilizing state-of-the-art components to mix chemicals at different temperatures." + use_power = 1 + + icon = 'icons/obj/machines/reagent.dmi' + icon_state = "distiller" + var/base_state // The string var used in update icon for overlays, either set manually or initialized. + + power_rating = 3000 + power_losses = 240 + + var/on = FALSE + + var/target_temp = T20C + + var/max_temp = T20C + 300 + var/min_temp = T0C - 10 + + var/current_temp = T20C + + var/use_atmos = FALSE // If true, this machine will be connectable to ports, and use gas mixtures as the source of heat, rather than its internal controls. + + var/static/radial_examine = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_examine") + var/static/radial_use = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_use") + + var/static/radial_pump = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_pump") + + var/static/radial_eject_input = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_eject_input") + var/static/radial_eject_output = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_eject_output") + + var/static/radial_adjust_temp = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_temp") + + var/static/radial_install_input = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_add") + var/static/radial_install_output = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_add") + + var/static/radial_inspectgauges = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_lookat") + + var/static/radial_mix = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_mix") + +// Overlay holders so we don't have to constantly remake them. + var/image/overlay_output_beaker + var/image/overlay_input_beaker + var/image/overlay_off + var/image/overlay_ready + var/image/overlay_cooling + var/image/overlay_heating + var/image/overlay_dumping + var/image/overlay_connected + +// Our unique beaker, used in its unique recipes to ensure things can only react inside this machine and minimize oddities from trying to transfer to a machine and back. + var/obj/item/weapon/reagent_containers/glass/distilling/Reservoir + + var/obj/item/weapon/reagent_containers/glass/InputBeaker + var/obj/item/weapon/reagent_containers/glass/OutputBeaker + +// A multiplier for the production amount. This should really only ever be lower than one, otherwise you end up with duping. + var/efficiency = 1 + +/obj/item/weapon/reagent_containers/glass/distilling + name = "distilling chamber" + desc = "You should not be seeing this." + volume = 600 + + var/obj/machinery/portable_atmospherics/powered/reagent_distillery/Master + +/obj/item/weapon/reagent_containers/glass/distilling/Destroy() + Master = null + ..() + +/obj/machinery/portable_atmospherics/powered/reagent_distillery/Initialize() + ..() + + Reservoir = new (src) + Reservoir.Master = src + + if(!base_state) + base_state = icon_state + + setup_overlay_vars() + + update_icon() + +/obj/machinery/portable_atmospherics/powered/reagent_distillery/proc/setup_overlay_vars() + overlay_output_beaker = image(icon = src.icon, icon_state = "[base_state]-output") + overlay_input_beaker = image(icon = src.icon, icon_state = "[base_state]-input") + overlay_off = image(icon = src.icon, icon_state = "[base_state]-bad") + overlay_ready = image(icon = src.icon, icon_state = "[base_state]-good") + overlay_cooling = image(icon = src.icon, icon_state = "[base_state]-cool") + overlay_heating = image(icon = src.icon, icon_state = "[base_state]-heat") + overlay_dumping = image(icon = src.icon, icon_state = "[base_state]-dump") + overlay_connected = image(icon = src.icon, icon_state = "[base_state]-connector") + +/obj/machinery/portable_atmospherics/powered/reagent_distillery/Destroy() + qdel(Reservoir) + Reservoir = null + if(InputBeaker) + qdel(InputBeaker) + InputBeaker = null + if(OutputBeaker) + qdel(OutputBeaker) + OutputBeaker = null + + ..() + +/obj/machinery/portable_atmospherics/powered/reagent_distillery/attack_hand(mob/user) + var/list/options = list() + options["examine"] = radial_examine + options["use"] = radial_use + options["inspect gauges"] = radial_inspectgauges + options["pulse agitator"] = radial_mix + + if(InputBeaker) + options["eject input"] = radial_eject_input + if(OutputBeaker) + options["eject output"] = radial_eject_output + + if(!use_atmos) + options["adjust temp"] = radial_adjust_temp + + if(length(options) < 1) + return + + var/list/choice = list() + if(length(options) == 1) + for(var/key in options) + choice = key + else + choice = show_radial_menu(user, src, options, require_near = !issilicon(user)) + + switch(choice) + if("examine") + examine(user) + + if("use") + if(powered()) + on = !on + to_chat(user, "You turn \the [src] [on ? "on" : "off"].") + + if("inspect gauges") + to_chat(user, "\The [src]'s gauges read:") + if(!use_atmos) + to_chat(user, "- Target Temperature: [target_temp]") + to_chat(user, "- Temperature: [current_temp]") + + if("pulse agitator") + to_chat(user, "You press \the [src]'s chamber agitator button.") + if(on) + visible_message("\The [src] rattles to life.") + Reservoir.reagents.handle_reactions() + else + spawn(1 SECOND) + to_chat(user, "Nothing happens..") + + if("eject input") + if(InputBeaker) + InputBeaker.forceMove(get_turf(src)) + InputBeaker = null + + if("eject output") + if(OutputBeaker) + OutputBeaker.forceMove(get_turf(src)) + OutputBeaker = null + + if("adjust temp") + target_temp = input("Choose a target temperature.", "Temperature.", T20C) as num + target_temp = CLAMP(target_temp, min_temp, max_temp) + + update_icon() + +/obj/machinery/portable_atmospherics/powered/reagent_distillery/attackby(obj/item/weapon/W as obj, mob/user as mob) + var/list/options = list() + if(istype(W, /obj/item/weapon/reagent_containers/glass)) + if(!InputBeaker) + options["install input"] = radial_install_input + if(!OutputBeaker) + options["install output"] = radial_install_output + + if(!options || !options.len) + update_icon() + return ..() + + var/list/choice = list() + if(length(options) == 1) + for(var/key in options) + choice = key + else + choice = show_radial_menu(user, src, options, require_near = TRUE) // No telekinetics. + + switch(choice) + if("install input") + if(!InputBeaker) + user.drop_from_inventory(W) + W.add_fingerprint(user) + W.forceMove(src) + InputBeaker = W + + if("install output") + if(!OutputBeaker) + user.drop_from_inventory(W) + W.add_fingerprint(user) + W.forceMove(src) + OutputBeaker = W + + update_icon() + +/obj/machinery/portable_atmospherics/powered/reagent_distillery/use_power(var/amount, var/chan = -1) + last_power_draw = amount + if(use_cell && cell && cell.charge) + var/cellcharge = cell.charge + cell.use(amount) + + var/celldifference = max(0, cellcharge - cell.charge) + + amount = celldifference + + var/area/A = get_area(src) + if(!A || !isarea(A)) + return + if(chan == -1) + chan = power_channel + A.use_power(amount, chan) + +/obj/machinery/portable_atmospherics/powered/reagent_distillery/process() + ..() + + var/run_pump = FALSE + + if(InputBeaker || OutputBeaker) + run_pump = TRUE + + var/avg_temp = 0 + var/avg_pressure = 0 + + if(connected_port && connected_port.network.line_members.len) + var/list/members = list() + var/datum/pipe_network/Net = connected_port.network + members = Net.line_members.Copy() + + for(var/datum/pipeline/Line in members) + avg_pressure += Line.air.return_pressure() + avg_temp += Line.air.temperature + + avg_temp /= members.len + avg_pressure /= members.len + + if(!powered()) + on = FALSE + + if(!on || (use_atmos && (!connected_port || avg_pressure < 1000))) + current_temp = round((current_temp + T20C) / 2) + + else if(on) + if(!use_atmos) + if(current_temp != round(target_temp)) + var/shift_mod = 0 + if(current_temp < target_temp) + shift_mod = 1 + else if(current_temp > target_temp) + shift_mod = -1 + current_temp = CLAMP(round((current_temp + 1 * shift_mod) + (rand(-5, 5) / 10)), min_temp, max_temp) + use_power(power_rating * CELLRATE) + else if(connected_port && avg_pressure > 1000) + current_temp = round((current_temp + avg_temp) / 2) + else if(!run_pump) + visible_message("\The [src]'s motors wind down.") + on = FALSE + + if(InputBeaker && Reservoir.reagents.total_volume < Reservoir.reagents.maximum_volume) + InputBeaker.reagents.trans_to_holder(Reservoir.reagents, amount = rand(10,20)) + + if(OutputBeaker && OutputBeaker.reagents.total_volume < OutputBeaker.reagents.maximum_volume) + use_power(power_rating * CELLRATE * 0.5) + Reservoir.reagents.trans_to_holder(OutputBeaker.reagents, amount = rand(1, 5)) + + update_icon() + +/obj/machinery/portable_atmospherics/powered/reagent_distillery/update_icon() + ..() + cut_overlays() + + if(InputBeaker) + add_overlay(overlay_input_beaker) + + if(OutputBeaker) + add_overlay(overlay_output_beaker) + + if(on) + if(OutputBeaker && OutputBeaker.reagents.total_volume < OutputBeaker.reagents.maximum_volume) + add_overlay(overlay_dumping) + else if(current_temp == round(target_temp)) + add_overlay(overlay_ready) + else if(current_temp < target_temp) + add_overlay(overlay_heating) + else + add_overlay(overlay_cooling) + + else + add_overlay(overlay_off) + + if(connected_port) + add_overlay(overlay_connected) + +/* + * Subtypes + */ + +/obj/machinery/portable_atmospherics/powered/reagent_distillery/industrial + name = "industrial chemical distillery" + desc = "A gas-operated variant of a chemical distillery. Able to reach much higher, and lower, temperatures through the use of treated gas." + + use_atmos = TRUE diff --git a/code/modules/reagents/reagent_containers/blood_pack_vr.dm b/code/modules/reagents/reagent_containers/blood_pack_vr.dm index e1d616aeca2..b4e27fb95ad 100644 --- a/code/modules/reagents/reagent_containers/blood_pack_vr.dm +++ b/code/modules/reagents/reagent_containers/blood_pack_vr.dm @@ -19,3 +19,40 @@ return else return + +/obj/item/weapon/reagent_containers/blood/prelabeled + name = "IV Pack" + desc = "Holds liquids used for transfusion. This one's label seems to be hardprinted." + +/obj/item/weapon/reagent_containers/blood/prelabeled/update_iv_label() + return + +/obj/item/weapon/reagent_containers/blood/prelabeled/APlus + name = "IV Pack (A+)" + desc = "Holds liquids used for transfusion. This one's label seems to be hardprinted. This one is labeled A+" + blood_type = "A+" + +/obj/item/weapon/reagent_containers/blood/prelabeled/AMinus + name = "IV Pack (A-)" + desc = "Holds liquids used for transfusion. This one's label seems to be hardprinted. This one is labeled A_" + blood_type = "A-" + +/obj/item/weapon/reagent_containers/blood/prelabeled/BPlus + name = "IV Pack (B+)" + desc = "Holds liquids used for transfusion. This one's label seems to be hardprinted. This one is labeled B+" + blood_type = "B+" + +/obj/item/weapon/reagent_containers/blood/prelabeled/BMinus + name = "IV Pack (B-)" + desc = "Holds liquids used for transfusion. This one's label seems to be hardprinted. This one is labeled B-" + blood_type = "B-" + +/obj/item/weapon/reagent_containers/blood/prelabeled/OPlus + name = "IV Pack (O+)" + desc = "Holds liquids used for transfusion. This one's label seems to be hardprinted. This one is labeled O+" + blood_type = "O+" + +/obj/item/weapon/reagent_containers/blood/prelabeled/OMinus + name = "IV Pack (O-)" + desc = "Holds liquids used for transfusion. This one's label seems to be hardprinted. This one is labeled O-" + blood_type = "O-" \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 0e1c74586ee..3c9fdcba6f7 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -14,7 +14,7 @@ possible_transfer_amounts = list(5,10,15,25,30,60) volume = 60 w_class = ITEMSIZE_SMALL - flags = OPENCONTAINER + flags = OPENCONTAINER | NOCONDUCT unacidable = 1 //glass doesn't dissolve in acid var/label_text = "" @@ -44,7 +44,8 @@ /obj/machinery/smartfridge/, /obj/machinery/biogenerator, /obj/structure/frame, - /obj/machinery/radiocarbon_spectrometer + /obj/machinery/radiocarbon_spectrometer, + /obj/machinery/portable_atmospherics/powered/reagent_distillery ) /obj/item/weapon/reagent_containers/glass/Initialize() diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 4b5949595b7..6b7910fab3e 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -44,7 +44,14 @@ to_chat(user, "You cannot inject a robotic limb.") return - if(!H.stat) + //VOREStation Add Start - Adds Prototype Hypo functionality + if(H != user && prototype) + to_chat(user, "You begin injecting [H] with \the [src].") + to_chat(H, " [user] is trying to inject you with \the [src]!") + if(!do_after(user, 30, H)) + return + //VOREstation Add End + else if(!H.stat && !prototype) //VOREStation Edit if(H != user) if(H.a_intent != I_HELP) to_chat(user, "[H] is resisting your attempt to inject them with \the [src].") diff --git a/code/modules/reagents/reagent_containers/hypospray_vr.dm b/code/modules/reagents/reagent_containers/hypospray_vr.dm index 9f52d9f699f..526ae77fbaa 100644 --- a/code/modules/reagents/reagent_containers/hypospray_vr.dm +++ b/code/modules/reagents/reagent_containers/hypospray_vr.dm @@ -6,7 +6,7 @@ amount_per_transfer_from_this = 10 volume = 10 -/obj/item/weapon/reagent_containers/hypospray/autoinjector/miner/New() +/obj/item/weapon/reagent_containers/hypospray/autoinjector/miner/Initialize() ..() reagents.add_reagent("bicaridine", 5) reagents.add_reagent("tricordrazine", 3) @@ -18,7 +18,15 @@ desc = "Contains emergency trauma autoinjectors." icon_state = "syringe" -/obj/item/weapon/storage/box/traumainjectors/New() +/obj/item/weapon/storage/box/traumainjectors/Initialize() ..() for (var/i = 1 to 7) new /obj/item/weapon/reagent_containers/hypospray/autoinjector/miner(src) + +/obj/item/weapon/reagent_containers/hypospray + var/prototype = 0 + +/obj/item/weapon/reagent_containers/hypospray/science + name = "prototype hypospray" + desc = "This reproduction hypospray is nearly a perfect replica of the early model DeForest hyposprays, sharing many of the same features. However, there are additional safety measures installed to prevent unwanted injections." + prototype = 1 diff --git a/code/modules/reagents/reagent_containers/patch.dm b/code/modules/reagents/reagent_containers/patch.dm new file mode 100644 index 00000000000..007669286e0 --- /dev/null +++ b/code/modules/reagents/reagent_containers/patch.dm @@ -0,0 +1,82 @@ + +/* + * Patches. A subtype of pills, in order to inherit the possible future produceability within chem-masters, and dissolving. + */ + +/obj/item/weapon/reagent_containers/pill/patch + name = "patch" + desc = "A patch." + icon = 'icons/obj/chemical.dmi' + icon_state = null + item_state = "pill" + + base_state = "patch" + + possible_transfer_amounts = null + w_class = ITEMSIZE_TINY + slot_flags = SLOT_EARS + volume = 60 + + var/pierce_material = FALSE // If true, the patch can be used through thick material. + +/obj/item/weapon/reagent_containers/pill/patch/attack(mob/M as mob, mob/user as mob) + var/mob/living/L = user + + if(M == L) + if(istype(M, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = M + var/obj/item/organ/external/affecting = H.get_organ(check_zone(L.zone_sel.selecting)) + if(!affecting) + to_chat(user, "The limb is missing!") + return + if(affecting.status >= ORGAN_ROBOT) + to_chat(user, "\The [src] won't work on a robotic limb!") + return + + if(!H.can_inject(user, FALSE, L.zone_sel.selecting, pierce_material)) + to_chat(user, "\The [src] can't be applied through such a thick material!") + return + + to_chat(H, "\The [src] is placed on your [affecting].") + M.drop_from_inventory(src) //icon update + if(reagents.total_volume) + reagents.trans_to_mob(M, reagents.total_volume, CHEM_TOUCH) + qdel(src) + return 1 + + else if(istype(M, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = M + var/obj/item/organ/external/affecting = H.get_organ(check_zone(L.zone_sel.selecting)) + if(!affecting) + to_chat(user, "The limb is missing!") + return + if(affecting.status >= ORGAN_ROBOT) + to_chat(user, "\The [src] won't work on a robotic limb!") + return + + if(!H.can_inject(user, FALSE, L.zone_sel.selecting, pierce_material)) + to_chat(user, "\The [src] can't be applied through such a thick material!") + return + + user.visible_message("[user] attempts to place \the [src] onto [H]`s [affecting].") + + user.setClickCooldown(user.get_attack_speed(src)) + if(!do_mob(user, M)) + return + + user.drop_from_inventory(src) //icon update + user.visible_message("[user] applies \the [src] to [H].") + + var/contained = reagentlist() + add_attack_logs(user,M,"Applied a patch containing [contained]") + + to_chat(H, "\The [src] is placed on your [affecting].") + M.drop_from_inventory(src) //icon update + + if(reagents.total_volume) + reagents.trans_to_mob(M, reagents.total_volume, CHEM_TOUCH) + qdel(src) + + return 1 + + return 0 \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index c0b647e53b7..5ca47a6d3be 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -7,6 +7,9 @@ icon = 'icons/obj/chemical.dmi' icon_state = null item_state = "pill" + + var/base_state = "pill" + possible_transfer_amounts = null w_class = ITEMSIZE_TINY slot_flags = SLOT_EARS @@ -15,7 +18,7 @@ /obj/item/weapon/reagent_containers/pill/Initialize() . = ..() if(!icon_state) - icon_state = "pill[rand(1, 4)]" //preset pills only use colour changing or unique icons + icon_state = "[base_state][rand(1, 4)]" //preset pills only use colour changing or unique icons /obj/item/weapon/reagent_containers/pill/attack(mob/M as mob, mob/user as mob) if(M == user) diff --git a/code/modules/reagents/reagent_containers/pill_vr.dm b/code/modules/reagents/reagent_containers/pill_vr.dm index ad9663d0201..30d084570fc 100644 --- a/code/modules/reagents/reagent_containers/pill_vr.dm +++ b/code/modules/reagents/reagent_containers/pill_vr.dm @@ -1,7 +1,7 @@ /obj/item/weapon/reagent_containers/pill/nutriment name = "Nutriment pill" desc = "Used to feed people on the field. Contains 30 units of Nutriment." - icon_state = "pill6" + icon_state = "pill10" /obj/item/weapon/reagent_containers/pill/nutriment/Initialize() ..() @@ -10,7 +10,7 @@ /obj/item/weapon/reagent_containers/pill/protein name = "Meat pill" desc = "Used to feed carnivores on the field. Contains 30 units of Protein." - icon_state = "pill20" + icon_state = "pill24" /obj/item/weapon/reagent_containers/pill/protein/Initialize() ..() @@ -19,11 +19,12 @@ /obj/item/weapon/reagent_containers/pill/rezadone name = "Rezadone pill" desc = "A powder with almost magical properties, this substance can effectively treat genetic damage in humanoids, though excessive consumption has side effects." - icon_state = "pill13" + icon_state = "pill2" /obj/item/weapon/reagent_containers/pill/rezadone/Initialize() ..() reagents.add_reagent("rezadone", 5) + color = reagents.get_color() /obj/item/weapon/reagent_containers/pill/peridaxon name = "Peridaxon pill" @@ -37,38 +38,42 @@ /obj/item/weapon/reagent_containers/pill/carthatoline name = "Carthatoline pill" desc = "Carthatoline is strong evacuant used to treat severe poisoning." - icon_state = "pill17" + icon_state = "pill4" /obj/item/weapon/reagent_containers/pill/carthatoline/Initialize() ..() reagents.add_reagent("carthatoline", 10) + color = reagents.get_color() /obj/item/weapon/reagent_containers/pill/alkysine name = "Alkysine pill" desc = "Alkysine is a drug used to lessen the damage to neurological tissue after a catastrophic injury. Can heal brain tissue." - icon_state = "pill7" + icon_state = "pill3" /obj/item/weapon/reagent_containers/pill/alkysine/Initialize() ..() reagents.add_reagent("alkysine", 10) + color = reagents.get_color() /obj/item/weapon/reagent_containers/pill/imidazoline name = "Imidazoline pill" desc = "Heals eye damage." - icon_state = "pill9" + icon_state = "pill3" /obj/item/weapon/reagent_containers/pill/imidazoline/Initialize() ..() reagents.add_reagent("imidazoline", 15) + color = reagents.get_color() /obj/item/weapon/reagent_containers/pill/osteodaxon name = "Osteodaxon pill" desc = "An experimental drug used to heal bone fractures." - icon_state = "pill19" + icon_state = "pill2" /obj/item/weapon/reagent_containers/pill/osteodaxon/Initialize() ..() reagents.add_reagent("osteodaxon", 10) + color = reagents.get_color() /obj/item/weapon/reagent_containers/pill/myelamine name = "Myelamine pill" @@ -78,15 +83,17 @@ /obj/item/weapon/reagent_containers/pill/myelamine/Initialize() ..() reagents.add_reagent("myelamine", 10) + color = reagents.get_color() /obj/item/weapon/reagent_containers/pill/hyronalin name = "Hyronalin pill" desc = "Hyronalin is a medicinal drug used to counter the effect of radiation poisoning." - icon_state = "pill17" + icon_state = "pill4" /obj/item/weapon/reagent_containers/pill/hyronalin/Initialize() ..() reagents.add_reagent("hyronalin", 15) + color = reagents.get_color() /obj/item/weapon/reagent_containers/pill/arithrazine name = "Arithrazine pill" @@ -96,21 +103,24 @@ /obj/item/weapon/reagent_containers/pill/arithrazine/Initialize() ..() reagents.add_reagent("arithrazine", 5) + color = reagents.get_color() /obj/item/weapon/reagent_containers/pill/corophizine name = "Corophizine pill" desc = "A wide-spectrum antibiotic drug. Powerful and uncomfortable in equal doses." - icon_state = "pill9" + icon_state = "pill2" /obj/item/weapon/reagent_containers/pill/corophizine/Initialize() ..() reagents.add_reagent("corophizine", 5) + color = reagents.get_color() /obj/item/weapon/reagent_containers/pill/healing_nanites name = "Healing nanites capsule" desc = "Miniature medical robots that swiftly restore bodily damage." - icon_state = "pill5" + icon_state = "pill1" /obj/item/weapon/reagent_containers/pill/healing_nanites/Initialize() ..() reagents.add_reagent("healing_nanites", 30) + color = reagents.get_color() diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index d2b4dc149d8..4ccd444d0ea 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -158,7 +158,7 @@ message_admins("[key_name_admin(Proj.firer)] shot fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]) (JMP).") log_game("[key_name(Proj.firer)] shot fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]).") - if(!istype(Proj ,/obj/item/projectile/beam/lastertag) && !istype(Proj ,/obj/item/projectile/beam/practice) ) + if(!istype(Proj ,/obj/item/projectile/beam/lasertag) && !istype(Proj ,/obj/item/projectile/beam/practice) ) explode() /obj/structure/reagent_dispensers/fueltank/ex_act() diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index b60b71cc4e4..69b9937158b 100755 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -1,7 +1,7 @@ /obj/structure/bigDelivery desc = "A big wrapped package." name = "large parcel" - icon = 'icons/obj/storage.dmi' + icon = 'icons/obj/storage_vr.dmi' //VOREStation Edit icon_state = "deliverycloset" var/obj/wrapped = null density = 1 @@ -109,7 +109,7 @@ /obj/item/smallDelivery desc = "A small wrapped package." name = "small parcel" - icon = 'icons/obj/storage.dmi' + icon = 'icons/obj/storage_vr.dmi' //VOREStation Edit icon_state = "deliverycrate3" var/obj/item/wrapped = null var/sortTag = null diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index 106c655ae25..938495b00f7 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -61,22 +61,4 @@ other types of metals and chemistry for reagents). return new build_path(newloc) /datum/design/item - build_type = PROTOLATHE - -/datum/design/item/design_disk - name = "Design Storage Disk" - desc = "Produce additional disks for storing device designs." - id = "design_disk" - req_tech = list(TECH_DATA = 1) - materials = list(DEFAULT_WALL_MATERIAL = 30, "glass" = 10) - build_path = /obj/item/weapon/disk/design_disk - sort_string = "GAAAA" - -/datum/design/item/tech_disk - name = "Technology Data Storage Disk" - desc = "Produce additional disks for storing technology data." - id = "tech_disk" - req_tech = list(TECH_DATA = 1) - materials = list(DEFAULT_WALL_MATERIAL = 30, "glass" = 10) - build_path = /obj/item/weapon/disk/tech_disk - sort_string = "GAAAB" \ No newline at end of file + build_type = PROTOLATHE \ No newline at end of file diff --git a/code/modules/research/designs/HUDs.dm b/code/modules/research/designs/HUDs.dm new file mode 100644 index 00000000000..4a6648f26a5 --- /dev/null +++ b/code/modules/research/designs/HUDs.dm @@ -0,0 +1,47 @@ +// HUDs + +/datum/design/item/hud + materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) + +/datum/design/item/hud/AssembleDesignName() + ..() + name = "HUD glasses prototype ([item_name])" + +/datum/design/item/hud/AssembleDesignDesc() + desc = "Allows for the construction of \a [item_name] HUD glasses." + +/datum/design/item/hud/health + name = "health scanner" + id = "health_hud" + req_tech = list(TECH_BIO = 2, TECH_MAGNET = 3) + build_path = /obj/item/clothing/glasses/hud/health + sort_string = "EAAAA" + +/datum/design/item/hud/security + name = "security records" + id = "security_hud" + req_tech = list(TECH_MAGNET = 3, TECH_COMBAT = 2) + build_path = /obj/item/clothing/glasses/hud/security + sort_string = "EAAAB" + +/datum/design/item/hud/mesons + name = "optical meson scanner" + id = "mesons" + req_tech = list(TECH_MAGNET = 2, TECH_ENGINEERING = 2) + build_path = /obj/item/clothing/glasses/meson + sort_string = "EAAAC" + +/datum/design/item/hud/material + name = "optical material scanner" + id = "material" + req_tech = list(TECH_MAGNET = 3, TECH_ENGINEERING = 3) + build_path = /obj/item/clothing/glasses/material + sort_string = "EAAAD" + +/datum/design/item/hud/graviton_visor + name = "graviton visor" + id = "graviton_goggles" + req_tech = list(TECH_MAGNET = 5, TECH_ENGINEERING = 3, TECH_BLUESPACE = 3, TECH_PHORON = 3) + materials = list(MAT_PLASTEEL = 2000, "glass" = 3000, MAT_PHORON = 1500) + build_path = /obj/item/clothing/glasses/graviton + sort_string = "EAAAE" \ No newline at end of file diff --git a/code/modules/research/designs/HUDs_vr.dm b/code/modules/research/designs/HUDs_vr.dm new file mode 100644 index 00000000000..aef8b12b0ce --- /dev/null +++ b/code/modules/research/designs/HUDs_vr.dm @@ -0,0 +1,7 @@ +/datum/design/item/hud/omni + name = "AR glasses" + id = "omnihud" + req_tech = list(TECH_MAGNET = 4, TECH_COMBAT = 3, TECH_BIO = 3) + materials = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 1000) + build_path = /obj/item/clothing/glasses/omnihud + sort_string = "EAAVA" \ No newline at end of file diff --git a/code/modules/research/designs/ai_holders.dm b/code/modules/research/designs/ai_holders.dm new file mode 100644 index 00000000000..8cdcafbd6c8 --- /dev/null +++ b/code/modules/research/designs/ai_holders.dm @@ -0,0 +1,51 @@ +// Various AI/mind holding device +/datum/design/item/ai_holder/AssembleDesignName() + ..() + name = "Mind storage device prototype ([item_name])" + +/datum/design/item/ai_holder/mmi + name = "Man-machine interface" + id = "mmi" + req_tech = list(TECH_DATA = 2, TECH_BIO = 3) + build_type = PROTOLATHE | PROSFAB + materials = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 500) + build_path = /obj/item/device/mmi + category = "Misc" + sort_string = "SAAAA" + +/datum/design/item/ai_holder/posibrain + name = "Positronic brain" + id = "posibrain" + req_tech = list(TECH_ENGINEERING = 4, TECH_MATERIAL = 6, TECH_BLUESPACE = 2, TECH_DATA = 4) + build_type = PROTOLATHE | PROSFAB + materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 1000, "silver" = 1000, "gold" = 500, "phoron" = 500, "diamond" = 100) + build_path = /obj/item/device/mmi/digital/posibrain + category = "Misc" + sort_string = "SAAAB" + +/datum/design/item/ai_holder/dronebrain + name = "Robotic intelligence circuit" + id = "dronebrain" + req_tech = list(TECH_ENGINEERING = 4, TECH_MATERIAL = 5, TECH_DATA = 4) + build_type = PROTOLATHE | PROSFAB + materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 1000, "silver" = 1000, "gold" = 500) + build_path = /obj/item/device/mmi/digital/robot + category = "Misc" + sort_string = "SAAAC" + +/datum/design/item/ai_holder/paicard + name = "'pAI', personal artificial intelligence device" + id = "paicard" + req_tech = list(TECH_DATA = 2) + materials = list("glass" = 500, DEFAULT_WALL_MATERIAL = 500) + build_path = /obj/item/device/paicard + sort_string = "SBAAA" + +/datum/design/item/ai_holder/intellicard + name = "intelliCore" + desc = "Allows for the construction of an intelliCore." + id = "intellicore" + req_tech = list(TECH_DATA = 4, TECH_MATERIAL = 4) + materials = list("glass" = 1000, "gold" = 200) + build_path = /obj/item/device/aicard + sort_string = "SCAAA" \ No newline at end of file diff --git a/code/modules/research/designs/bag_of_holding.dm b/code/modules/research/designs/bag_of_holding.dm new file mode 100644 index 00000000000..744bbca5a3d --- /dev/null +++ b/code/modules/research/designs/bag_of_holding.dm @@ -0,0 +1,23 @@ +// Bags of holding + +/datum/design/item/boh/AssembleDesignName() + ..() + name = "Infinite capacity storage prototype ([item_name])" + +/datum/design/item/boh/bag_holding + name = "Bag of Holding" + desc = "Using localized pockets of bluespace this bag prototype offers incredible storage capacity with the contents weighting nothing. It's a shame the bag itself is pretty heavy." + id = "bag_holding" + req_tech = list(TECH_BLUESPACE = 4, TECH_MATERIAL = 6) + materials = list("gold" = 3000, "diamond" = 1500, "uranium" = 250) + build_path = /obj/item/weapon/storage/backpack/holding + sort_string = "QAAAA" + +/datum/design/item/boh/dufflebag_holding + name = "DuffleBag of Holding" + desc = "A minaturized prototype of the popular Bag of Holding, the Dufflebag of Holding is, functionally, identical to the bag of holding, but comes in a more stylish and compact form." + id = "dufflebag_holding" + req_tech = list(TECH_BLUESPACE = 4, TECH_MATERIAL = 6) + materials = list("gold" = 3000, "diamond" = 1500, "uranium" = 250) + build_path = /obj/item/weapon/storage/backpack/holding/duffle + sort_string = "QAAAB" \ No newline at end of file diff --git a/code/modules/research/designs/beakers.dm b/code/modules/research/designs/beakers.dm new file mode 100644 index 00000000000..fe231699d59 --- /dev/null +++ b/code/modules/research/designs/beakers.dm @@ -0,0 +1,22 @@ +// Various beakers + +/datum/design/item/beaker/AssembleDesignName() + name = "Beaker prototype ([item_name])" + +/datum/design/item/beaker/noreact + name = "cryostasis" + desc = "A cryostasis beaker that allows for chemical storage without reactions. Can hold up to 50 units." + id = "splitbeaker" + req_tech = list(TECH_MATERIAL = 2) + materials = list(DEFAULT_WALL_MATERIAL = 3000) + build_path = /obj/item/weapon/reagent_containers/glass/beaker/noreact + sort_string = "IAAAA" + +/datum/design/item/beaker/bluespace + name = TECH_BLUESPACE + desc = "A bluespace beaker, powered by experimental bluespace technology and Element Cuban combined with the Compound Pete. Can hold up to 300 units." + id = "bluespacebeaker" + req_tech = list(TECH_BLUESPACE = 2, TECH_MATERIAL = 6) + materials = list(DEFAULT_WALL_MATERIAL = 3000, "phoron" = 3000, "diamond" = 500) + build_path = /obj/item/weapon/reagent_containers/glass/beaker/bluespace + sort_string = "IAAAB" \ No newline at end of file diff --git a/code/modules/research/designs/bio_devices.dm b/code/modules/research/designs/bio_devices.dm new file mode 100644 index 00000000000..87623641057 --- /dev/null +++ b/code/modules/research/designs/bio_devices.dm @@ -0,0 +1,61 @@ +/datum/design/item/biotech + materials = list(DEFAULT_WALL_MATERIAL = 30, "glass" = 20) + +/datum/design/item/biotech/AssembleDesignName() + ..() + name = "Biotech device prototype ([item_name])" + +// Biotech of various types + +/datum/design/item/biotech/mass_spectrometer + desc = "A device for analyzing chemicals in blood." + id = "mass_spectrometer" + req_tech = list(TECH_BIO = 2, TECH_MAGNET = 2) + build_path = /obj/item/device/mass_spectrometer + sort_string = "JAAAA" + +/datum/design/item/biotech/adv_mass_spectrometer + desc = "A device for analyzing chemicals in blood and their quantities." + id = "adv_mass_spectrometer" + req_tech = list(TECH_BIO = 2, TECH_MAGNET = 4) + build_path = /obj/item/device/mass_spectrometer/adv + sort_string = "JAAAB" + +/datum/design/item/biotech/reagent_scanner + desc = "A device for identifying chemicals." + id = "reagent_scanner" + req_tech = list(TECH_BIO = 2, TECH_MAGNET = 2) + build_path = /obj/item/device/reagent_scanner + sort_string = "JAABA" + +/datum/design/item/biotech/adv_reagent_scanner + desc = "A device for identifying chemicals and their proportions." + id = "adv_reagent_scanner" + req_tech = list(TECH_BIO = 2, TECH_MAGNET = 4) + build_path = /obj/item/device/reagent_scanner/adv + sort_string = "JAABB" + +/datum/design/item/biotech/robot_scanner + desc = "A hand-held scanner able to diagnose robotic injuries." + id = "robot_scanner" + req_tech = list(TECH_MAGNET = 3, TECH_BIO = 2, TECH_ENGINEERING = 3) + materials = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 200) + build_path = /obj/item/device/robotanalyzer + sort_string = "JAACA" + +/datum/design/item/biotech/nanopaste + desc = "A tube of paste containing swarms of repair nanites. Very effective in repairing robotic machinery." + id = "nanopaste" + req_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 3) + materials = list(DEFAULT_WALL_MATERIAL = 7000, "glass" = 7000) + build_path = /obj/item/stack/nanopaste + sort_string = "JAACB" + +/datum/design/item/biotech/plant_analyzer + desc = "A device capable of quickly scanning all relevant data about a plant." + id = "plant_analyzer" + req_tech = list(TECH_MAGNET = 2, TECH_BIO = 2) + materials = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 500) + build_path = /obj/item/device/analyzer/plant_analyzer + sort_string = "JAADA" + diff --git a/code/modules/research/designs/bio_devices_vr.dm b/code/modules/research/designs/bio_devices_vr.dm new file mode 100644 index 00000000000..2deb1854f9e --- /dev/null +++ b/code/modules/research/designs/bio_devices_vr.dm @@ -0,0 +1,23 @@ +/datum/design/item/biotech/nif + name = "nanite implant framework" + id = "nif" + req_tech = list(TECH_MAGNET = 5, TECH_BLUESPACE = 5, TECH_MATERIAL = 5, TECH_ENGINEERING = 5, TECH_DATA = 5) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 8000, "uranium" = 6000, "diamond" = 6000) + build_path = /obj/item/device/nif + sort_string = "JVAAA" + +/datum/design/item/biotech/nifbio + name = "bioadaptive NIF" + id = "bioadapnif" + req_tech = list(TECH_MAGNET = 5, TECH_BLUESPACE = 5, TECH_MATERIAL = 5, TECH_ENGINEERING = 5, TECH_DATA = 5, TECH_BIO = 5) + materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 15000, "uranium" = 10000, "diamond" = 10000) + build_path = /obj/item/device/nif/bioadap + sort_string = "JVAAB" + +/datum/design/item/biotech/nifrepairtool + name = "adv. NIF repair tool" + id = "anrt" + req_tech = list(TECH_MAGNET = 5, TECH_BLUESPACE = 5, TECH_MATERIAL = 5, TECH_ENGINEERING = 5, TECH_DATA = 5) + materials = list(DEFAULT_WALL_MATERIAL = 200, "glass" = 3000, "uranium" = 2000, "diamond" = 2000) + build_path = /obj/item/device/nifrepairer + sort_string = "JVABA" \ No newline at end of file diff --git a/code/modules/research/designs/circuit_assembly.dm b/code/modules/research/designs/circuit_assembly.dm index 9f20032445c..0ce5d0ca8a1 100644 --- a/code/modules/research/designs/circuit_assembly.dm +++ b/code/modules/research/designs/circuit_assembly.dm @@ -1,89 +1,99 @@ -/datum/design/item/wirer - name = "Custom wirer tool" - id = "wirer" - req_tech = list(TECH_MATERIAL = 2, TECH_ENGINEERING = 2) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 2500) - build_path = /obj/item/device/integrated_electronics/wirer - sort_string = "VBVAA" +// Integrated circuits stuff -/datum/design/item/debugger - name = "Custom circuit debugger tool" - id = "debugger" - req_tech = list(TECH_MATERIAL = 2, TECH_ENGINEERING = 2) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 2500) - build_path = /obj/item/device/integrated_electronics/debugger - sort_string = "VBVAB" +/datum/design/item/integrated_circuitry/AssembleDesignName() + ..() + name = "Circuitry device design ([item_name])" - - -/datum/design/item/custom_circuit_assembly - name = "Small custom assembly" - desc = "A customizable assembly for simple, small devices." - id = "assembly-small" - req_tech = list(TECH_MATERIAL = 3, TECH_ENGINEERING = 2, TECH_POWER = 2) - materials = list(DEFAULT_WALL_MATERIAL = 10000) - build_path = /obj/item/device/electronic_assembly - sort_string = "VCAAA" - -/datum/design/item/custom_circuit_assembly/medium - name = "Medium custom assembly" - desc = "A customizable assembly suited for more ambitious mechanisms." - id = "assembly-medium" - req_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 3, TECH_POWER = 3) - materials = list(DEFAULT_WALL_MATERIAL = 20000) - build_path = /obj/item/device/electronic_assembly/medium - sort_string = "VCAAB" - -/datum/design/item/custom_circuit_assembly/drone - name = "Drone custom assembly" - desc = "A customizable assembly optimized for autonomous devices." - id = "assembly-drone" - req_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 4, TECH_POWER = 4) - materials = list(DEFAULT_WALL_MATERIAL = 30000) - build_path = /obj/item/device/electronic_assembly/drone - sort_string = "VCAAC" - -/datum/design/item/custom_circuit_assembly/large - name = "Large custom assembly" - desc = "A customizable assembly for large machines." - id = "assembly-large" - req_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 4, TECH_POWER = 4) - materials = list(DEFAULT_WALL_MATERIAL = 40000) - build_path = /obj/item/device/electronic_assembly/large - sort_string = "VCAAD" - -/datum/design/item/custom_circuit_assembly/implant - name = "Implant custom assembly" - desc = "An customizable assembly for very small devices, implanted into living entities." - id = "assembly-implant" - req_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 4, TECH_POWER = 3, TECH_BIO = 5) - materials = list(DEFAULT_WALL_MATERIAL = 2000) - build_path = /obj/item/weapon/implant/integrated_circuit - sort_string = "VCAAE" - -/datum/design/item/custom_circuit_assembly/device - name = "Device custom assembly" - desc = "An customizable assembly designed to interface with other devices." - id = "assembly-device" - req_tech = list(TECH_MATERIAL = 2, TECH_ENGINEERING = 2, TECH_POWER = 2) - materials = list(DEFAULT_WALL_MATERIAL = 5000) - build_path = /obj/item/device/assembly/electronic_assembly - sort_string = "VCAAF" - -/datum/design/item/custom_circuit_printer +/datum/design/item/integrated_circuitry/custom_circuit_printer name = "Portable integrated circuit printer" desc = "A portable(ish) printer for modular machines." id = "ic_printer" req_tech = list(TECH_MATERIAL = 3, TECH_ENGINEERING = 4, TECH_DATA = 5) materials = list(DEFAULT_WALL_MATERIAL = 10000) build_path = /obj/item/device/integrated_circuit_printer - sort_string = "VCAAG" + sort_string = "UAAAA" -/datum/design/item/custom_circuit_printer_upgrade +/datum/design/item/integrated_circuitry/custom_circuit_printer_upgrade name = "Integrated circuit printer upgrade - advanced designs" desc = "Allows the integrated circuit printer to create advanced circuits" id = "ic_printer_upgrade_adv" req_tech = list(TECH_ENGINEERING = 3, TECH_DATA = 4) materials = list(DEFAULT_WALL_MATERIAL = 2000) build_path = /obj/item/weapon/disk/integrated_circuit/upgrade/advanced - sort_string = "VCAAH" \ No newline at end of file + sort_string = "UBAAA" + +/datum/design/item/integrated_circuitry/wirer + name = "Custom wirer tool" + id = "wirer" + req_tech = list(TECH_MATERIAL = 2, TECH_ENGINEERING = 2) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 2500) + build_path = /obj/item/device/integrated_electronics/wirer + sort_string = "UCAAA" + +/datum/design/item/integrated_circuitry/debugger + name = "Custom circuit debugger tool" + id = "debugger" + req_tech = list(TECH_MATERIAL = 2, TECH_ENGINEERING = 2) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 2500) + build_path = /obj/item/device/integrated_electronics/debugger + sort_string = "UCBBB" + +// Assemblies + +/datum/design/item/integrated_circuitry/assembly/AssembleDesignName() + ..() + name = "Circuitry assembly design ([item_name])" + +/datum/design/item/integrated_circuitry/assembly/custom_circuit_assembly_small + name = "Small custom assembly" + desc = "A customizable assembly for simple, small devices." + id = "assembly-small" + req_tech = list(TECH_MATERIAL = 3, TECH_ENGINEERING = 2, TECH_POWER = 2) + materials = list(DEFAULT_WALL_MATERIAL = 10000) + build_path = /obj/item/device/electronic_assembly + sort_string = "UDAAA" + +/datum/design/item/integrated_circuitry/assembly/custom_circuit_assembly_medium + name = "Medium custom assembly" + desc = "A customizable assembly suited for more ambitious mechanisms." + id = "assembly-medium" + req_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 3, TECH_POWER = 3) + materials = list(DEFAULT_WALL_MATERIAL = 20000) + build_path = /obj/item/device/electronic_assembly/medium + sort_string = "UDAAB" + +/datum/design/item/integrated_circuitry/assembly/custom_circuit_assembly_large + name = "Large custom assembly" + desc = "A customizable assembly for large machines." + id = "assembly-large" + req_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 4, TECH_POWER = 4) + materials = list(DEFAULT_WALL_MATERIAL = 40000) + build_path = /obj/item/device/electronic_assembly/large + sort_string = "UDAAC" + +/datum/design/item/integrated_circuitry/assembly/custom_circuit_assembly_drone + name = "Drone custom assembly" + desc = "A customizable assembly optimized for autonomous devices." + id = "assembly-drone" + req_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 4, TECH_POWER = 4) + materials = list(DEFAULT_WALL_MATERIAL = 30000) + build_path = /obj/item/device/electronic_assembly/drone + sort_string = "UDAAD" + +/datum/design/item/integrated_circuitry/assembly/custom_circuit_assembly_device + name = "Device custom assembly" + desc = "An customizable assembly designed to interface with other devices." + id = "assembly-device" + req_tech = list(TECH_MATERIAL = 2, TECH_ENGINEERING = 2, TECH_POWER = 2) + materials = list(DEFAULT_WALL_MATERIAL = 5000) + build_path = /obj/item/device/assembly/electronic_assembly + sort_string = "UDAAE" + +/datum/design/item/integrated_circuitry/assembly/custom_circuit_assembly_implant + name = "Implant custom assembly" + desc = "An customizable assembly for very small devices, implanted into living entities." + id = "assembly-implant" + req_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 4, TECH_POWER = 3, TECH_BIO = 5) + materials = list(DEFAULT_WALL_MATERIAL = 2000) + build_path = /obj/item/weapon/implant/integrated_circuit + sort_string = "UDAAF" \ No newline at end of file diff --git a/code/modules/research/designs/ai_modules.dm b/code/modules/research/designs/circuits/ai_modules.dm similarity index 89% rename from code/modules/research/designs/ai_modules.dm rename to code/modules/research/designs/circuits/ai_modules.dm index eae26ea3865..378a4fde0d0 100644 --- a/code/modules/research/designs/ai_modules.dm +++ b/code/modules/research/designs/circuits/ai_modules.dm @@ -104,14 +104,4 @@ id = "tyrant" req_tech = list(TECH_DATA = 4, TECH_ILLEGAL = 2, TECH_MATERIAL = 6) build_path = /obj/item/weapon/aiModule/tyrant - sort_string = "XACAD" - -// AI file, AI tool -/datum/design/item/intellicard - name = "'intelliCore', AI preservation and transportation system" - desc = "Allows for the construction of an intelliCore." - id = "intellicore" - req_tech = list(TECH_DATA = 4, TECH_MATERIAL = 4) - materials = list("glass" = 1000, "gold" = 200) - build_path = /obj/item/device/aicard - sort_string = "VACAA" \ No newline at end of file + sort_string = "XACAD" \ No newline at end of file diff --git a/code/modules/research/designs/circuits.dm b/code/modules/research/designs/circuits/circuits.dm similarity index 98% rename from code/modules/research/designs/circuits.dm rename to code/modules/research/designs/circuits/circuits.dm index 459bced7764..f47ff46947f 100644 --- a/code/modules/research/designs/circuits.dm +++ b/code/modules/research/designs/circuits/circuits.dm @@ -287,6 +287,13 @@ CIRCUITS BELOW build_path = /obj/item/weapon/circuitboard/solar_control sort_string = "JAAAF" +/datum/design/circuit/shutoff_monitor + name = "Automatic shutoff valve monitor" + id = "shutoff_monitor" + req_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 3) + build_path = /obj/item/weapon/circuitboard/shutoff_monitor + sort_string = "JAAAG" + /datum/design/circuit/pacman name = "PACMAN-type generator" id = "pacman" @@ -467,7 +474,7 @@ CIRCUITS BELOW req_tech = list(TECH_DATA = 4, TECH_COMBAT = 2) build_path = /obj/item/weapon/circuitboard/mecha/gygax/targeting sort_string = "NAACC" -//VOREStation Edit to make Serenity Constructable + /datum/design/circuit/mecha/gygax_medical name = "'Serenity' medical control" id = "gygax_medical" diff --git a/code/modules/research/designs/circuits/circuits_vr.dm b/code/modules/research/designs/circuits/circuits_vr.dm new file mode 100644 index 00000000000..fefb2b2db38 --- /dev/null +++ b/code/modules/research/designs/circuits/circuits_vr.dm @@ -0,0 +1,149 @@ +/datum/design/circuit/algae_farm + name = "Algae Oxygen Generator" + id = "algae_farm" + req_tech = list(TECH_ENGINEERING = 3, TECH_BIO = 2) + build_path = /obj/item/weapon/circuitboard/algae_farm + sort_string = "HABAE" + +/datum/design/circuit/thermoregulator + name = "thermal regulator" + id = "thermoregulator" + req_tech = list(TECH_ENGINEERING = 4, TECH_POWER = 3) + build_path = /obj/item/weapon/circuitboard/thermoregulator + sort_string = "HABAF" + +/datum/design/circuit/bomb_tester + name = "Explosive Effect Simulator" + id = "bomb_tester" + req_tech = list(TECH_PHORON = 3, TECH_DATA = 2, TECH_MAGNET = 2) + build_path = /obj/item/weapon/circuitboard/bomb_tester + sort_string = "HABAG" + +/datum/design/circuit/quantum_pad + name = "Quantum Pad" + id = "quantum_pad" + req_tech = list(TECH_ENGINEERING = 4, TECH_POWER = 4, TECH_BLUESPACE = 4) + build_path = /obj/item/weapon/circuitboard/quantumpad + sort_string = "HABAH" + +//////Micro mech stuff +/datum/design/circuit/mecha/gopher_main + name = "'Gopher' central control" + id = "gopher_main" + build_path = /obj/item/weapon/circuitboard/mecha/gopher/main + sort_string = "NAAEA" + +/datum/design/circuit/mecha/gopher_peri + name = "'Gopher' peripherals control" + id = "gopher_peri" + build_path = /obj/item/weapon/circuitboard/mecha/gopher/peripherals + sort_string = "NAAEB" + +/datum/design/circuit/mecha/polecat_main + name = "'Polecat' central control" + id = "polecat_main" + req_tech = list(TECH_DATA = 4) + build_path = /obj/item/weapon/circuitboard/mecha/polecat/main + sort_string = "NAAFA" + +/datum/design/circuit/mecha/polecat_peri + name = "'Polecat' peripherals control" + id = "polecat_peri" + req_tech = list(TECH_DATA = 4) + build_path = /obj/item/weapon/circuitboard/mecha/polecat/peripherals + sort_string = "NAAFB" + +/datum/design/circuit/mecha/polecat_targ + name = "'Polecat' weapon control and targeting" + id = "polecat_targ" + req_tech = list(TECH_DATA = 4, TECH_COMBAT = 2) + build_path = /obj/item/weapon/circuitboard/mecha/polecat/targeting + sort_string = "NAAFC" + +/datum/design/circuit/mecha/weasel_main + name = "'Weasel' central control" + id = "weasel_main" + req_tech = list(TECH_DATA = 4) + build_path = /obj/item/weapon/circuitboard/mecha/weasel/main + sort_string = "NAAGA" + +/datum/design/circuit/mecha/weasel_peri + name = "'Weasel' peripherals control" + id = "weasel_peri" + req_tech = list(TECH_DATA = 4) + build_path = /obj/item/weapon/circuitboard/mecha/weasel/peripherals + sort_string = "NAAGB" + +/datum/design/circuit/mecha/weasel_targ + name = "'Weasel' weapon control and targeting" + id = "weasel_targ" + req_tech = list(TECH_DATA = 4, TECH_COMBAT = 2) + build_path = /obj/item/weapon/circuitboard/mecha/weasel/targeting + sort_string = "NAAGC" + +/datum/design/circuit/transhuman_clonepod + name = "grower pod" + id = "transhuman_clonepod" + req_tech = list(TECH_DATA = 3, TECH_BIO = 3) + build_path = /obj/item/weapon/circuitboard/transhuman_clonepod + sort_string = "HAADA" + +/datum/design/circuit/transhuman_synthprinter + name = "SynthFab 3000" + id = "transhuman_synthprinter" + req_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 3) + build_path = /obj/item/weapon/circuitboard/transhuman_synthprinter + sort_string = "HAADB" + +/datum/design/circuit/transhuman_resleever + name = "Resleeving pod" + id = "transhuman_resleever" + req_tech = list(TECH_ENGINEERING = 4, TECH_BIO = 4) + build_path = /obj/item/weapon/circuitboard/transhuman_resleever + sort_string = "HAADC" + +// Resleeving + +/datum/design/circuit/resleeving_control + name = "Resleeving control console" + id = "resleeving_control" + req_tech = list(TECH_DATA = 5) + build_path = /obj/item/weapon/circuitboard/resleeving_control + sort_string = "HAADE" + +/datum/design/circuit/body_designer + name = "Body design console" + id = "body_designer" + req_tech = list(TECH_DATA = 5) + build_path = /obj/item/weapon/circuitboard/body_designer + sort_string = "HAADF" + +/datum/design/circuit/partslathe + name = "Parts lathe" + id = "partslathe" + req_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2) + build_path = /obj/item/weapon/circuitboard/partslathe + sort_string = "HABAD" + +// Telesci stuff + +/datum/design/circuit/telesci_console + name = "Telepad Control Console" + id = "telesci_console" + req_tech = list(TECH_DATA = 3, TECH_BLUESPACE = 3, TECH_PHORON = 4) + build_path = /obj/item/weapon/circuitboard/telesci_console + sort_string = "HAAEA" + +/datum/design/circuit/telesci_pad + name = "Telepad" + id = "telesci_pad" + req_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 4, TECH_PHORON = 4, TECH_BLUESPACE = 5) + build_path = /obj/item/weapon/circuitboard/telesci_pad + sort_string = "HAAEB" + +/datum/design/circuit/quantum_pad + name = "Quantum Pad" + id = "quantum_pad" + req_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 4, TECH_PHORON = 4, TECH_BLUESPACE = 5) + build_path = /obj/item/weapon/circuitboard/quantumpad + sort_string = "HAAC" \ No newline at end of file diff --git a/code/modules/research/designs/engineering.dm b/code/modules/research/designs/engineering.dm new file mode 100644 index 00000000000..f499a47a86c --- /dev/null +++ b/code/modules/research/designs/engineering.dm @@ -0,0 +1,74 @@ +// Tools + +/datum/design/item/tool/AssembleDesignName() + ..() + name = "Experimental tool prototype ([item_name])" + +/datum/design/item/tool/experimental_welder + name = "Experimental welding tool" + desc = "A welding tool that generate fuel for itself." + id = "expwelder" + req_tech = list(TECH_ENGINEERING = 4, TECH_PHORON = 3, TECH_MATERIAL = 4) + materials = list(DEFAULT_WALL_MATERIAL = 70, "glass" = 120, "phoron" = 100) + build_path = /obj/item/weapon/weldingtool/experimental + sort_string = "NAAAA" + +/datum/design/item/tool/hand_drill + name = "Hand drill" + desc = "A simple powered hand drill." + id = "handdrill" + req_tech = list(TECH_ENGINEERING = 3, TECH_MATERIAL = 2) + materials = list(DEFAULT_WALL_MATERIAL = 300, "silver" = 100) + build_path = /obj/item/weapon/tool/screwdriver/power + sort_string = "NAAAB" + +/datum/design/item/tool/jaws_life + name = "Jaws of life" + desc = "A set of jaws of life, compressed through the magic of science." + id = "jawslife" + req_tech = list(TECH_ENGINEERING = 3, TECH_MATERIAL = 2) + materials = list(DEFAULT_WALL_MATERIAL = 300, "silver" = 100) + build_path = /obj/item/weapon/tool/crowbar/power + sort_string = "NAAAC" + +// Other devices + +/datum/design/item/engineering/AssembleDesignName() + ..() + name = "Engineering device prototype ([item_name])" + +/datum/design/item/engineering/t_scanner + name = "T-ray Scanner" + desc = "A terahertz-ray emitter and scanner used to detect underfloor objects such as cables and pipes." + id = "tscanner" + req_tech = list(TECH_MAGNET = 2, TECH_ENGINEERING = 2, TECH_MATERIAL = 2) + materials = list(DEFAULT_WALL_MATERIAL = 200) + build_path = /obj/item/device/t_scanner + sort_string = "NBAAA" + +/datum/design/item/engineering/t_scanner_upg + name = "Upgraded T-ray Scanner" + desc = "An upgraded version of the terahertz-ray emitter and scanner used to detect underfloor objects such as cables and pipes." + id = "upgradedtscanner" + req_tech = list(TECH_MAGNET = 3, TECH_ENGINEERING = 4, TECH_MATERIAL = 2) + materials = list(DEFAULT_WALL_MATERIAL = 500, "phoron" = 150) + build_path = /obj/item/device/t_scanner/upgraded + sort_string = "NBAAB" + +/datum/design/item/engineering/t_scanner_adv + name = "Advanced T-ray Scanner" + desc = "An advanced version of the terahertz-ray emitter and scanner used to detect underfloor objects such as cables and pipes." + id = "advancedtscanner" + req_tech = list(TECH_MAGNET = 6, TECH_ENGINEERING = 6, TECH_MATERIAL = 6) + materials = list(DEFAULT_WALL_MATERIAL = 1250, "phoron" = 500, "silver" = 50) + build_path = /obj/item/device/t_scanner/advanced + sort_string = "NBAAC" + +/datum/design/item/engineering/atmosanalyzer + name = "Analyzer" + desc = "A hand-held environmental scanner which reports current gas levels." + id = "atmosanalyzer" + req_tech = list(TECH_ENGINEERING = 2) + materials = list(DEFAULT_WALL_MATERIAL = 200, "glass" = 100) + build_path = /obj/item/device/analyzer + sort_string = "NBABA" \ No newline at end of file diff --git a/code/modules/research/designs/illegal.dm b/code/modules/research/designs/illegal.dm deleted file mode 100644 index 4e99fc8665a..00000000000 --- a/code/modules/research/designs/illegal.dm +++ /dev/null @@ -1,27 +0,0 @@ -// Yeah yeah, vague file name. Basically a misc folder for antag things that RnD can make. - -/datum/design/item/binaryencrypt - name = "Binary encryption key" - desc = "Allows for deciphering the binary channel on-the-fly." - id = "binaryencrypt" - req_tech = list(TECH_ILLEGAL = 2) - materials = list(DEFAULT_WALL_MATERIAL = 300, "glass" = 300) - build_path = /obj/item/device/encryptionkey/binary - sort_string = "VASAA" - -/datum/design/item/chameleon - name = "Holographic equipment kit" - desc = "A kit of dangerous, high-tech equipment with changeable looks." - id = "chameleon" - req_tech = list(TECH_ILLEGAL = 2) - materials = list(DEFAULT_WALL_MATERIAL = 500) - build_path = /obj/item/weapon/storage/box/syndie_kit/chameleon - sort_string = "VASBA" - -/datum/design/item/weapon/esword - name = "Portable Energy Blade" - id = "chargesword" - req_tech = list(TECH_COMBAT = 6, TECH_MAGNET = 4, TECH_ENGINEERING = 5, TECH_ILLEGAL = 4, TECH_ARCANE = 1) - materials = list(MAT_PLASTEEL = 3500, "glass" = 1000, MAT_LEAD = 2250, MAT_METALHYDROGEN = 500) - build_path = /obj/item/weapon/melee/energy/sword/charge - sort_string = "VASCA" diff --git a/code/modules/research/designs/implants.dm b/code/modules/research/designs/implants.dm new file mode 100644 index 00000000000..4c4b5ba8016 --- /dev/null +++ b/code/modules/research/designs/implants.dm @@ -0,0 +1,22 @@ +// Implants + +/datum/design/item/implant + materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) + +/datum/design/item/implant/AssembleDesignName() + ..() + name = "Implantable biocircuit design ([item_name])" + +/datum/design/item/implant/chemical + name = "chemical" + id = "implant_chem" + req_tech = list(TECH_MATERIAL = 2, TECH_BIO = 3) + build_path = /obj/item/weapon/implantcase/chem + sort_string = "MFAAA" + +/datum/design/item/implant/freedom + name = "freedom" + id = "implant_free" + req_tech = list(TECH_ILLEGAL = 2, TECH_BIO = 3) + build_path = /obj/item/weapon/implantcase/freedom + sort_string = "MFAAB" \ No newline at end of file diff --git a/code/modules/research/designs/implants_vr.dm b/code/modules/research/designs/implants_vr.dm new file mode 100644 index 00000000000..07b4a37f05b --- /dev/null +++ b/code/modules/research/designs/implants_vr.dm @@ -0,0 +1,25 @@ +/datum/design/item/implant/backup + name = "Backup implant" + id = "implant_backup" + req_tech = list(TECH_MATERIAL = 2, TECH_BIO = 2, TECH_DATA = 4, TECH_ENGINEERING = 2) + materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 2000) + build_path = /obj/item/weapon/implantcase/backup + sort_string = "MFAVA" + +/datum/design/item/implant/sizecontrol + name = "Size control implant" + id = "implant_size" + req_tech = list(TECH_MATERIAL = 3, TECH_BIO = 4, TECH_DATA = 4, TECH_ENGINEERING = 3) + materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 2000, "silver" = 3000) + build_path = /obj/item/weapon/implanter/sizecontrol + sort_string = "MFAVB" + +/* Make language great again +/datum/design/item/implant/language + name = "Language implant" + id = "implant_language" + req_tech = list(TECH_MATERIAL = 5, TECH_BIO = 5, TECH_DATA = 4, TECH_ENGINEERING = 4) //This is not an easy to make implant. + materials = list(DEFAULT_WALL_MATERIAL = 7000, "glass" = 7000, "gold" = 2000, "diamond" = 3000) + build_path = /obj/item/weapon/implantcase/vrlanguage + sort_string = "MFAVC" +*/ \ No newline at end of file diff --git a/code/modules/research/designs/locator_devices.dm b/code/modules/research/designs/locator_devices.dm new file mode 100644 index 00000000000..b6f149393c8 --- /dev/null +++ b/code/modules/research/designs/locator_devices.dm @@ -0,0 +1,80 @@ +// GPS + +/datum/design/item/gps + req_tech = list(TECH_MATERIAL = 2, TECH_DATA = 2, TECH_BLUESPACE = 2) + materials = list(DEFAULT_WALL_MATERIAL = 500) + +/datum/design/item/gps/AssembleDesignName() + ..() + name = "Triangulating device design ([name])" + +/datum/design/item/gps/generic + name = "GEN" + id = "gps_gen" + build_path = /obj/item/device/gps + sort_string = "DAAAA" + +/datum/design/item/gps/command + name = "COM" + id = "gps_com" + build_path = /obj/item/device/gps/command + sort_string = "DAAAB" + +/datum/design/item/gps/security + name = "SEC" + id = "gps_sec" + build_path = /obj/item/device/gps/security + sort_string = "DAAAC" + +/datum/design/item/gps/medical + name = "MED" + id = "gps_med" + build_path = /obj/item/device/gps/medical + sort_string = "DAAAD" + +/datum/design/item/gps/engineering + name = "ENG" + id = "gps_eng" + build_path = /obj/item/device/gps/engineering + sort_string = "DAAAE" + +/datum/design/item/gps/science + name = "SCI" + id = "gps_sci" + build_path = /obj/item/device/gps/science + sort_string = "DAAAF" + +/datum/design/item/gps/mining + name = "MINE" + id = "gps_mine" + build_path = /obj/item/device/gps/mining + sort_string = "DAAAG" + +/datum/design/item/gps/explorer + name = "EXP" + id = "gps_exp" + build_path = /obj/item/device/gps/explorer + sort_string = "DAAAH" + +// Other locators + +/datum/design/item/locator/AssembleDesignName() + ..() + name = "Locator device design ([name])" + +/datum/design/item/locator/beacon_locator + name = "Tracking beacon pinpointer" + desc = "Used to scan and locate signals on a particular frequency." + id = "beacon_locator" + req_tech = list(TECH_MAGNET = 3, TECH_ENGINEERING = 2, TECH_BLUESPACE = 3) + materials = list(DEFAULT_WALL_MATERIAL = 1000,"glass" = 500) + build_path = /obj/item/device/beacon_locator + sort_string = "DBAAA" + +/datum/design/item/locator/beacon + name = "Bluespace tracking beacon" + id = "beacon" + req_tech = list(TECH_BLUESPACE = 1) + materials = list (DEFAULT_WALL_MATERIAL = 20, "glass" = 10) + build_path = /obj/item/device/radio/beacon + sort_string = "DBABA" \ No newline at end of file diff --git a/code/modules/research/designs/medical.dm b/code/modules/research/designs/medical.dm index 8e821fe0fe9..9b516cf2892 100644 --- a/code/modules/research/designs/medical.dm +++ b/code/modules/research/designs/medical.dm @@ -3,72 +3,9 @@ /datum/design/item/medical/AssembleDesignName() ..() - name = "Biotech device prototype ([item_name])" + name = "Medical equipment prototype ([item_name])" -/datum/design/item/medical/robot_scanner - desc = "A hand-held scanner able to diagnose robotic injuries." - id = "robot_scanner" - req_tech = list(TECH_MAGNET = 3, TECH_BIO = 2, TECH_ENGINEERING = 3) - materials = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 200) - build_path = /obj/item/device/robotanalyzer - sort_string = "MACFA" - -/datum/design/item/medical/mass_spectrometer - desc = "A device for analyzing chemicals in blood." - id = "mass_spectrometer" - req_tech = list(TECH_BIO = 2, TECH_MAGNET = 2) - build_path = /obj/item/device/mass_spectrometer - sort_string = "MACAA" - -/datum/design/item/medical/adv_mass_spectrometer - desc = "A device for analyzing chemicals in blood and their quantities." - id = "adv_mass_spectrometer" - req_tech = list(TECH_BIO = 2, TECH_MAGNET = 4) - build_path = /obj/item/device/mass_spectrometer/adv - sort_string = "MACAB" - -/datum/design/item/medical/reagent_scanner - desc = "A device for identifying chemicals." - id = "reagent_scanner" - req_tech = list(TECH_BIO = 2, TECH_MAGNET = 2) - build_path = /obj/item/device/reagent_scanner - sort_string = "MACBA" - -/datum/design/item/medical/adv_reagent_scanner - desc = "A device for identifying chemicals and their proportions." - id = "adv_reagent_scanner" - req_tech = list(TECH_BIO = 2, TECH_MAGNET = 4) - build_path = /obj/item/device/reagent_scanner/adv - sort_string = "MACBB" - -/datum/design/item/beaker/AssembleDesignName() - name = "Beaker prototype ([item_name])" - -/datum/design/item/beaker/noreact - name = "cryostasis" - desc = "A cryostasis beaker that allows for chemical storage without reactions. Can hold up to 50 units." - id = "splitbeaker" - req_tech = list(TECH_MATERIAL = 2) - materials = list(DEFAULT_WALL_MATERIAL = 3000) - build_path = /obj/item/weapon/reagent_containers/glass/beaker/noreact - sort_string = "MADAA" - -/datum/design/item/beaker/bluespace - name = TECH_BLUESPACE - desc = "A bluespace beaker, powered by experimental bluespace technology and Element Cuban combined with the Compound Pete. Can hold up to 300 units." - id = "bluespacebeaker" - req_tech = list(TECH_BLUESPACE = 2, TECH_MATERIAL = 6) - materials = list(DEFAULT_WALL_MATERIAL = 3000, "phoron" = 3000, "diamond" = 500) - build_path = /obj/item/weapon/reagent_containers/glass/beaker/bluespace - sort_string = "MADAB" - -/datum/design/item/medical/nanopaste - desc = "A tube of paste containing swarms of repair nanites. Very effective in repairing robotic machinery." - id = "nanopaste" - req_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 3) - materials = list(DEFAULT_WALL_MATERIAL = 7000, "glass" = 7000) - build_path = /obj/item/stack/nanopaste - sort_string = "MBAAA" +// Surgical devices /datum/design/item/medical/scalpel_laser1 name = "Basic Laser Scalpel" @@ -77,7 +14,7 @@ req_tech = list(TECH_BIO = 2, TECH_MATERIAL = 2, TECH_MAGNET = 2) materials = list(DEFAULT_WALL_MATERIAL = 12500, "glass" = 7500) build_path = /obj/item/weapon/surgical/scalpel/laser1 - sort_string = "MBBAA" + sort_string = "KAAAA" /datum/design/item/medical/scalpel_laser2 name = "Improved Laser Scalpel" @@ -86,7 +23,7 @@ req_tech = list(TECH_BIO = 3, TECH_MATERIAL = 4, TECH_MAGNET = 4) materials = list(DEFAULT_WALL_MATERIAL = 12500, "glass" = 7500, "silver" = 2500) build_path = /obj/item/weapon/surgical/scalpel/laser2 - sort_string = "MBBAB" + sort_string = "KAAAB" /datum/design/item/medical/scalpel_laser3 name = "Advanced Laser Scalpel" @@ -95,7 +32,7 @@ req_tech = list(TECH_BIO = 4, TECH_MATERIAL = 6, TECH_MAGNET = 5) materials = list(DEFAULT_WALL_MATERIAL = 12500, "glass" = 7500, "silver" = 2000, "gold" = 1500) build_path = /obj/item/weapon/surgical/scalpel/laser3 - sort_string = "MBBAC" + sort_string = "KAAAC" /datum/design/item/medical/scalpel_manager name = "Incision Management System" @@ -104,7 +41,7 @@ req_tech = list(TECH_BIO = 4, TECH_MATERIAL = 7, TECH_MAGNET = 5, TECH_DATA = 4) materials = list (DEFAULT_WALL_MATERIAL = 12500, "glass" = 7500, "silver" = 1500, "gold" = 1500, "diamond" = 750) build_path = /obj/item/weapon/surgical/scalpel/manager - sort_string = "MBBAD" + sort_string = "KAAAD" /datum/design/item/medical/bone_clamp name = "Bone Clamp" @@ -113,16 +50,18 @@ req_tech = list(TECH_BIO = 4, TECH_MATERIAL = 5, TECH_MAGNET = 4, TECH_DATA = 4) materials = list (DEFAULT_WALL_MATERIAL = 12500, "glass" = 7500, "silver" = 2500) build_path = /obj/item/weapon/surgical/bone_clamp - sort_string = "MBBAE" + sort_string = "KAABA" -/datum/design/item/medical/advanced_roller - name = "advanced roller bed" - desc = "A more advanced version of the regular roller bed, with inbuilt surgical stabilisers and an improved folding system." - id = "roller_bed" - req_tech = list(TECH_BIO = 3, TECH_MATERIAL = 3, TECH_MAGNET = 3) - materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 2000, "phoron" = 2000) - build_path = /obj/item/roller/adv - sort_string = "MBBAF" +// Other medical equipment + +/datum/design/item/medical/medical_analyzer + name = "health analyzer" + desc = "A hand-held body scanner able to distinguish vital signs of the subject." + id = "medical_analyzer" + req_tech = list(TECH_MAGNET = 2, TECH_BIO = 2) + materials = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 500) + build_path = /obj/item/device/healthanalyzer + sort_string = "KBAAA" /datum/design/item/medical/improved_analyzer name = "improved health analyzer" @@ -131,56 +70,13 @@ req_tech = list(TECH_MAGNET = 5, TECH_BIO = 6) materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 1000, "silver" = 1000, "gold" = 1500) build_path = /obj/item/device/healthanalyzer/improved - sort_string = "MBBAG" + sort_string = "KBAAB" -/datum/design/item/implant - materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) - -/datum/design/item/implant/AssembleDesignName() - ..() - name = "Implantable biocircuit design ([item_name])" - -/datum/design/item/implant/chemical - name = "chemical" - id = "implant_chem" - req_tech = list(TECH_MATERIAL = 2, TECH_BIO = 3) - build_path = /obj/item/weapon/implantcase/chem - sort_string = "MFAAA" - -/datum/design/item/implant/freedom - name = "freedom" - id = "implant_free" - req_tech = list(TECH_ILLEGAL = 2, TECH_BIO = 3) - build_path = /obj/item/weapon/implantcase/freedom - sort_string = "MFAAB" - -// These are in here because Robotics is close enough to Medical and I don't want to make a new brains.dm file -/datum/design/item/dronebrain - name = "Robotic intelligence circuit" - id = "dronebrain" - req_tech = list(TECH_ENGINEERING = 4, TECH_MATERIAL = 5, TECH_DATA = 4) - build_type = PROTOLATHE | PROSFAB - materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 1000, "silver" = 1000, "gold" = 500) - build_path = /obj/item/device/mmi/digital/robot - category = "Misc" - sort_string = "VACAC" - -/datum/design/item/posibrain - name = "Positronic brain" - id = "posibrain" - req_tech = list(TECH_ENGINEERING = 4, TECH_MATERIAL = 6, TECH_BLUESPACE = 2, TECH_DATA = 4) - build_type = PROTOLATHE | PROSFAB - materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 1000, "silver" = 1000, "gold" = 500, "phoron" = 500, "diamond" = 100) - build_path = /obj/item/device/mmi/digital/posibrain - category = "Misc" - sort_string = "VACAB" - -/datum/design/item/mmi - name = "Man-machine interface" - id = "mmi" - req_tech = list(TECH_DATA = 2, TECH_BIO = 3) - build_type = PROTOLATHE | PROSFAB - materials = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 500) - build_path = /obj/item/device/mmi - category = "Misc" - sort_string = "VACBA" \ No newline at end of file +/datum/design/item/medical/advanced_roller + name = "advanced roller bed" + desc = "A more advanced version of the regular roller bed, with inbuilt surgical stabilisers and an improved folding system." + id = "roller_bed" + req_tech = list(TECH_BIO = 3, TECH_MATERIAL = 3, TECH_MAGNET = 3) + materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 2000, "phoron" = 2000) + build_path = /obj/item/roller/adv + sort_string = "KCAAA" \ No newline at end of file diff --git a/code/modules/research/designs/medical_vr.dm b/code/modules/research/designs/medical_vr.dm new file mode 100644 index 00000000000..7a0b0aa5375 --- /dev/null +++ b/code/modules/research/designs/medical_vr.dm @@ -0,0 +1,244 @@ +/* + KV - ML3M stuff + KVA - gun + KVB - magazines + KVC - cells + KVCA - tier 0 + KVCB - tier 1 + KVCC - tier 2 + KVCD - tier 3 + KVCE - tier 4 + KVCO - tierless +*/ + +//General stuff + +/datum/design/item/medical/sleevemate + name = "SleeveMate 3700" + id = "sleevemate" + req_tech = list(TECH_MATERIAL = 3, TECH_MAGNET = 2, TECH_BIO = 2) + materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 4000) + build_path = /obj/item/device/sleevemate + sort_string = "KCAVA" + +/datum/design/item/medical/protohypospray + name = "prototype hypospray" + desc = "This prototype hypospray is a sterile, air-needle autoinjector for rapid administration of drugs to patients." + id = "protohypospray" + req_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 3, TECH_POWER = 2, TECH_BIO = 4, TECH_ILLEGAL = 2) + materials = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 1500, "silver" = 2000, "gold" = 1500, "uranium" = 1000) + build_path = /obj/item/weapon/reagent_containers/hypospray/science + sort_string = "KCAVB" + +// ML-3M medigun and cells +/datum/design/item/medical/cell_based/AssembleDesignName() + ..() + name = "Cell-based medical prototype ([item_name])" + +/datum/design/item/medical/cell_based/cell_medigun + name = "cell-loaded medigun" + id = "cell_medigun" + req_tech = list(TECH_MATERIAL = 6, TECH_MAGNET = 4, TECH_POWER = 3, TECH_BIO = 5) + materials = list(DEFAULT_WALL_MATERIAL = 8000, "plastic" = 8000, "glass" = 5000, "silver" = 1000, "gold" = 1000, "uranium" = 1000) + build_path = /obj/item/weapon/gun/projectile/cell_loaded/medical + sort_string = "KVAAA" + +/datum/design/item/medical/cell_based/cell_medigun_mag + name = "medical cell magazine" + id = "cell_medigun_mag" + req_tech = list(TECH_MATERIAL = 6, TECH_MAGNET = 4, TECH_POWER = 3, TECH_BIO = 5) + materials = list(DEFAULT_WALL_MATERIAL = 4000, "plastic" = 6000, "glass" = 3000, "silver" = 500, "gold" = 500) + build_path = /obj/item/ammo_magazine/cell_mag/medical + sort_string = "KVBAA" + +/datum/design/item/medical/cell_based/cell_medigun_mag_advanced + name = "advanced medical cell magazine" + id = "cell_medigun_mag_advanced" + req_tech = list(TECH_MATERIAL = 7, TECH_MAGNET = 6, TECH_POWER = 4, TECH_BIO = 7) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "plastic" = 10000, "glass" = 5000, "silver" = 1500, "gold" = 1500, "diamond" = 5000) + build_path = /obj/item/ammo_magazine/cell_mag/medical/advanced + sort_string = "KVBAB" + +/datum/design/item/ml3m_cell/AssembleDesignName() + ..() + name = "Nanite cell prototype ([name])" + +//Tier 0 + +/datum/design/item/ml3m_cell/brute + name = "BRUTE" + id = "ml3m_cell_brute" + req_tech = list(TECH_MATERIAL = 3, TECH_MAGNET = 2, TECH_BIO = 2) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000) + build_path = /obj/item/ammo_casing/microbattery/medical/brute + sort_string = "KVCAA" + +/datum/design/item/ml3m_cell/burn + name = "BURN" + id = "ml3m_cell_burn" + req_tech = list(TECH_MATERIAL = 3, TECH_MAGNET = 2, TECH_BIO = 2) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000) + build_path = /obj/item/ammo_casing/microbattery/medical/burn + sort_string = "KVCAB" + +/datum/design/item/ml3m_cell/stabilize + name = "STABILIZE" + id = "ml3m_cell_stabilize" + req_tech = list(TECH_MATERIAL = 3, TECH_MAGNET = 2, TECH_BIO = 2) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000) + build_path = /obj/item/ammo_casing/microbattery/medical/stabilize + sort_string = "KVCAC" + +//Tier 1 + +/datum/design/item/ml3m_cell/toxin + name = "TOXIN" + id = "ml3m_cell_toxin" + req_tech = list(TECH_MATERIAL = 3, TECH_MAGNET = 3, TECH_BIO = 4) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500) + build_path = /obj/item/ammo_casing/microbattery/medical/toxin + sort_string = "KVCBA" + +/datum/design/item/ml3m_cell/omni + name = "OMNI" + id = "ml3m_cell_omni" + req_tech = list(TECH_MATERIAL = 3, TECH_MAGNET = 3, TECH_BIO = 4) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500) + build_path = /obj/item/ammo_casing/microbattery/medical/omni + sort_string = "KVCBB" + +/datum/design/item/ml3m_cell/antirad + name = "ANTIRAD" + id = "ml3m_cell_antirad" + req_tech = list(TECH_MATERIAL = 3, TECH_MAGNET = 3, TECH_BIO = 4) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500) + build_path = /obj/item/ammo_casing/microbattery/medical/antirad + sort_string = "KVCBC" + +//Tier 2 + +/datum/design/item/ml3m_cell/brute2 + name = "BRUTE-II" + id = "ml3m_cell_brute2" + req_tech = list(TECH_MATERIAL = 5, TECH_MAGNET = 3, TECH_POWER = 2, TECH_BIO = 5) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "gold" = 1000) + build_path = /obj/item/ammo_casing/microbattery/medical/brute2 + sort_string = "KVCCA" + +/datum/design/item/ml3m_cell/burn2 + name = "BURN-II" + id = "ml3m_cell_burn2" + req_tech = list(TECH_MATERIAL = 5, TECH_MAGNET = 3, TECH_POWER = 2, TECH_BIO = 5) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "gold" = 1000) + build_path = /obj/item/ammo_casing/microbattery/medical/burn2 + sort_string = "KVCCB" + +/datum/design/item/ml3m_cell/stabilize2 + name = "STABILIZE-II" + id = "ml3m_cell_stabilize2" + req_tech = list(TECH_MATERIAL = 5, TECH_MAGNET = 3, TECH_POWER = 2, TECH_BIO = 5) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "silver" = 1000) + build_path = /obj/item/ammo_casing/microbattery/medical/stabilize2 + sort_string = "KVCCC" + +/datum/design/item/ml3m_cell/omni2 + name = "OMNI-II" + id = "ml3m_cell_omni2" + req_tech = list(TECH_MATERIAL = 5, TECH_MAGNET = 3, TECH_POWER = 2, TECH_BIO = 5) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "uranium" = 1000) + build_path = /obj/item/ammo_casing/microbattery/medical/omni2 + sort_string = "KVCCD" + +//Tier 3 + +/datum/design/item/ml3m_cell/toxin2 + name = "TOXIN-II" + id = "ml3m_cell_toxin2" + req_tech = list(TECH_MATERIAL = 6, TECH_MAGNET = 3, TECH_POWER = 3, TECH_BIO = 6) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "uranium" = 1000, "silver" = 1000, "diamond" = 500) + build_path = /obj/item/ammo_casing/microbattery/medical/toxin2 + sort_string = "KVCDA" + +/datum/design/item/ml3m_cell/haste + name = "HASTE" + id = "ml3m_cell_haste" + req_tech = list(TECH_MATERIAL = 6, TECH_MAGNET = 3, TECH_POWER = 3, TECH_BIO = 6) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "gold" = 1000, "silver" = 1000, "diamond" = 1000) + build_path = /obj/item/ammo_casing/microbattery/medical/haste + sort_string = "KVCDB" + +/datum/design/item/ml3m_cell/resist + name = "RESIST" + id = "ml3m_cell_resist" + req_tech = list(TECH_MATERIAL = 6, TECH_MAGNET = 3, TECH_POWER = 3, TECH_BIO = 6) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "gold" = 1000, "uranium" = 1000, "diamond" = 1000) + build_path = /obj/item/ammo_casing/microbattery/medical/resist + sort_string = "KVCDC" + +/datum/design/item/ml3m_cell/corpse_mend + name = "CORPSE MEND" + id = "ml3m_cell_corpse_mend" + req_tech = list(TECH_MATERIAL = 6, TECH_MAGNET = 3, TECH_POWER = 3, TECH_BIO = 6) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "phoron" = 3000, "diamond" = 3000) + build_path = /obj/item/ammo_casing/microbattery/medical/corpse_mend + sort_string = "KVCDD" + +//Tier 4 + +/datum/design/item/ml3m_cell/brute3 + name = "BRUTE-III" + id = "ml3m_cell_brute3" + req_tech = list(TECH_MATERIAL = 7, TECH_MAGNET = 6, TECH_POWER = 5, TECH_BIO = 7, TECH_PRECURSOR = 2) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "diamond" = 500, "verdantium" = 1000) + build_path = /obj/item/ammo_casing/microbattery/medical/brute3 + sort_string = "KVCEA" + +/datum/design/item/ml3m_cell/burn3 + name = "BURN-III" + id = "ml3m_cell_burn3" + req_tech = list(TECH_MATERIAL = 7, TECH_MAGNET = 6, TECH_POWER = 5, TECH_BIO = 7, TECH_PRECURSOR = 2) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "diamond" = 500, "verdantium" = 1000) + build_path = /obj/item/ammo_casing/microbattery/medical/burn3 + sort_string = "KVCEB" + +/datum/design/item/ml3m_cell/toxin3 + name = "TOXIN-III" + id = "ml3m_cell_toxin3" + req_tech = list(TECH_MATERIAL = 7, TECH_MAGNET = 6, TECH_POWER = 5, TECH_BIO = 7, TECH_ARCANE = 2) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "diamond" = 500, "verdantium" = 1000) + build_path = /obj/item/ammo_casing/microbattery/medical/toxin3 + sort_string = "KVCEC" + +/datum/design/item/ml3m_cell/omni3 + name = "OMNI-III" + id = "ml3m_cell_omni3" + req_tech = list(TECH_MATERIAL = 7, TECH_MAGNET = 6, TECH_POWER = 5, TECH_BIO = 7, TECH_ARCANE = 2) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "diamond" = 500, "verdantium" = 1000) + build_path = /obj/item/ammo_casing/microbattery/medical/omni3 + sort_string = "KVCED" + +//Tierless + +/datum/design/item/ml3m_cell/shrink + name = "SHRINK" + id = "ml3m_cell_shrink" + req_tech = list(TECH_MATERIAL = 5, TECH_MAGNET = 3, TECH_BLUESPACE = 3, TECH_BIO = 5, TECH_ILLEGAL = 5) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "uranium" = 2000) + build_path = /obj/item/ammo_casing/microbattery/medical/shrink + sort_string = "KVCOA" + +/datum/design/item/ml3m_cell/grow + name = "GROW" + id = "ml3m_cell_grow" + req_tech = list(TECH_MATERIAL = 5, TECH_MAGNET = 3, TECH_BLUESPACE = 3, TECH_BIO = 5, TECH_ILLEGAL = 5) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "uranium" = 2000) + build_path = /obj/item/ammo_casing/microbattery/medical/grow + sort_string = "KVCOB" + +/datum/design/item/ml3m_cell/normalsize + name = "NORMALSIZE" + id = "ml3m_cell_normalsize" + req_tech = list(TECH_MATERIAL = 5, TECH_MAGNET = 3, TECH_BLUESPACE = 3, TECH_BIO = 5, TECH_ILLEGAL = 5) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "uranium" = 2000) + build_path = /obj/item/ammo_casing/microbattery/medical/normalsize + sort_string = "KVCOC" \ No newline at end of file diff --git a/code/modules/research/designs/mining_toys.dm b/code/modules/research/designs/mining_toys.dm index f9b76032cbd..61be9cd8712 100644 --- a/code/modules/research/designs/mining_toys.dm +++ b/code/modules/research/designs/mining_toys.dm @@ -1,48 +1,50 @@ -// Assorted Mining-related items - /datum/design/item/weapon/mining/AssembleDesignName() ..() name = "Mining equipment design ([item_name])" -/datum/design/item/weapon/mining/jackhammer - id = "jackhammer" - req_tech = list(TECH_MATERIAL = 3, TECH_POWER = 2, TECH_ENGINEERING = 2) - materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 500, "silver" = 500) - build_path = /obj/item/weapon/pickaxe/jackhammer - sort_string = "KAAAA" +// Mining digging devices /datum/design/item/weapon/mining/drill id = "drill" req_tech = list(TECH_MATERIAL = 2, TECH_POWER = 3, TECH_ENGINEERING = 2) materials = list(DEFAULT_WALL_MATERIAL = 6000, "glass" = 1000) //expensive, but no need for miners. build_path = /obj/item/weapon/pickaxe/drill - sort_string = "KAAAB" + sort_string = "FAAAA" + +/datum/design/item/weapon/mining/jackhammer + id = "jackhammer" + req_tech = list(TECH_MATERIAL = 3, TECH_POWER = 2, TECH_ENGINEERING = 2) + materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 500, "silver" = 500) + build_path = /obj/item/weapon/pickaxe/jackhammer + sort_string = "FAAAB" /datum/design/item/weapon/mining/plasmacutter id = "plasmacutter" req_tech = list(TECH_MATERIAL = 4, TECH_PHORON = 3, TECH_ENGINEERING = 3) materials = list(DEFAULT_WALL_MATERIAL = 1500, "glass" = 500, "gold" = 500, "phoron" = 500) build_path = /obj/item/weapon/pickaxe/plasmacutter - sort_string = "KAAAC" + sort_string = "FAAAC" /datum/design/item/weapon/mining/pick_diamond id = "pick_diamond" req_tech = list(TECH_MATERIAL = 6) materials = list("diamond" = 3000) build_path = /obj/item/weapon/pickaxe/diamond - sort_string = "KAAAD" + sort_string = "FAAAD" /datum/design/item/weapon/mining/drill_diamond id = "drill_diamond" req_tech = list(TECH_MATERIAL = 6, TECH_POWER = 4, TECH_ENGINEERING = 4) materials = list(DEFAULT_WALL_MATERIAL = 3000, "glass" = 1000, "diamond" = 2000) build_path = /obj/item/weapon/pickaxe/diamonddrill - sort_string = "KAAAE" + sort_string = "FAAAE" -/datum/design/item/device/depth_scanner +// Mining other equipment + +/datum/design/item/weapon/mining/depth_scanner desc = "Used to check spatial depth and density of rock outcroppings." id = "depth_scanner" req_tech = list(TECH_MAGNET = 2, TECH_ENGINEERING = 2, TECH_BLUESPACE = 2) materials = list(DEFAULT_WALL_MATERIAL = 1000,"glass" = 1000) build_path = /obj/item/device/depth_scanner - sort_string = "KAAAF" \ No newline at end of file + sort_string = "FBAAA" diff --git a/code/modules/research/designs/misc.dm b/code/modules/research/designs/misc.dm index f14b73d2e68..8faf037136f 100644 --- a/code/modules/research/designs/misc.dm +++ b/code/modules/research/designs/misc.dm @@ -1,251 +1,65 @@ -/* -// -// THIS IS GOING TO GET REAL DAMN BLOATED, SO LET'S TRY TO AVOID THAT IF POSSIBLE -// -*/ +// Everything that didn't fit elsewhere -/datum/design/item/hud - materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) - -/datum/design/item/hud/AssembleDesignName() +/datum/design/item/general/AssembleDesignName() ..() - name = "HUD glasses prototype ([item_name])" + name = "General purpose design ([item_name])" -/datum/design/item/hud/AssembleDesignDesc() - desc = "Allows for the construction of \a [item_name] HUD glasses." +/datum/design/item/general/communicator + name = "Communicator" + id = "communicator" + req_tech = list(TECH_DATA = 2, TECH_MAGNET = 2) + materials = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 500) + build_path = /obj/item/device/communicator + sort_string = "TAAAA" -/datum/design/item/hud/health - name = "health scanner" - id = "health_hud" - req_tech = list(TECH_BIO = 2, TECH_MAGNET = 3) - build_path = /obj/item/clothing/glasses/hud/health - sort_string = "GBAAA" - -/datum/design/item/hud/security - name = "security records" - id = "security_hud" - req_tech = list(TECH_MAGNET = 3, TECH_COMBAT = 2) - build_path = /obj/item/clothing/glasses/hud/security - sort_string = "GBAAB" - -/datum/design/item/hud/mesons - name = "optical meson scanner" - id = "mesons" - req_tech = list(TECH_MAGNET = 2, TECH_ENGINEERING = 2) - build_path = /obj/item/clothing/glasses/meson - sort_string = "GBAAC" - -/datum/design/item/hud/material - name = "optical material scanner" - id = "material" - req_tech = list(TECH_MAGNET = 3, TECH_ENGINEERING = 3) - build_path = /obj/item/clothing/glasses/material - sort_string = "GBAAD" - -/datum/design/item/device/ano_scanner - name = "Alden-Saraspova counter" - id = "ano_scanner" - desc = "Aids in triangulation of exotic particles." - req_tech = list(TECH_BLUESPACE = 3, TECH_MAGNET = 3) - materials = list(DEFAULT_WALL_MATERIAL = 10000,"glass" = 5000) - build_path = /obj/item/device/ano_scanner - sort_string = "UAAAH" - -/datum/design/item/light_replacer - name = "Light replacer" - desc = "A device to automatically replace lights. Refill with working lightbulbs." - id = "light_replacer" - req_tech = list(TECH_MAGNET = 3, TECH_MATERIAL = 4) - materials = list(DEFAULT_WALL_MATERIAL = 1500, "silver" = 150, "glass" = 3000) - build_path = /obj/item/device/lightreplacer - sort_string = "VAAAH" - -datum/design/item/laserpointer +datum/design/item/general/laserpointer name = "laser pointer" desc = "Don't shine it in your eyes!" id = "laser_pointer" req_tech = list(TECH_MAGNET = 3) materials = list(DEFAULT_WALL_MATERIAL = 100, "glass" = 50) build_path = /obj/item/device/laser_pointer - sort_string = "VAAAI" + sort_string = "TAABA" -/datum/design/item/paicard - name = "'pAI', personal artificial intelligence device" - id = "paicard" - req_tech = list(TECH_DATA = 2) - materials = list("glass" = 500, DEFAULT_WALL_MATERIAL = 500) - build_path = /obj/item/device/paicard - sort_string = "VABAI" - -/datum/design/item/communicator - name = "Communicator" - id = "communicator" - req_tech = list(TECH_DATA = 2, TECH_MAGNET = 2) - materials = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 500) - build_path = /obj/item/device/communicator - sort_string = "VABAJ" - -/datum/design/item/gps - req_tech = list(TECH_MATERIAL = 2, TECH_DATA = 2, TECH_BLUESPACE = 2) - materials = list(DEFAULT_WALL_MATERIAL = 500) - -/datum/design/item/gps/generic - name = "Triangulating device design (GEN)" - id = "gps_gen" - build_path = /obj/item/device/gps - sort_string = "VADAA" - -/datum/design/item/gps/comand - name = "Triangulating device design (COM)" - id = "gps_com" - build_path = /obj/item/device/gps/command - sort_string = "VADAB" - -/datum/design/item/gps/security - name = "Triangulating device design (SEC)" - id = "gps_sec" - build_path = /obj/item/device/gps/security - sort_string = "VADAC" - -/datum/design/item/gps/medical - name = "Triangulating device design (MED)" - id = "gps_med" - build_path = /obj/item/device/gps/medical - sort_string = "VADAD" - -/datum/design/item/gps/engineering - name = "Triangulating device design (ENG)" - id = "gps_eng" - build_path = /obj/item/device/gps/engineering - sort_string = "VADAE" - -/datum/design/item/gps/science - name = "Triangulating device design (SCI)" - id = "gps_sci" - build_path = /obj/item/device/gps/science - sort_string = "VADAF" - -/datum/design/item/gps/mining - name = "Triangulating device design (MINE)" - id = "gps_mine" - build_path = /obj/item/device/gps/mining - sort_string = "VADAG" - -/datum/design/item/gps/explorer - name = "Triangulating device design (EXP)" - id = "gps_exp" - build_path = /obj/item/device/gps/explorer - sort_string = "VADAH" - -/datum/design/item/beacon - name = "Bluespace tracking beacon design" - id = "beacon" - req_tech = list(TECH_BLUESPACE = 1) - materials = list (DEFAULT_WALL_MATERIAL = 20, "glass" = 10) - build_path = /obj/item/device/radio/beacon - sort_string = "VADBA" - -/datum/design/item/beacon_locator - name = "Beacon tracking pinpointer" - desc = "Used to scan and locate signals on a particular frequency." - id = "beacon_locator" - req_tech = list(TECH_MAGNET = 3, TECH_ENGINEERING = 2, TECH_BLUESPACE = 3) - materials = list(DEFAULT_WALL_MATERIAL = 1000,"glass" = 500) - build_path = /obj/item/device/beacon_locator - sort_string = "VADBB" - -/datum/design/item/bag_holding - name = "'Bag of Holding', an infinite capacity bag prototype" - desc = "Using localized pockets of bluespace this bag prototype offers incredible storage capacity with the contents weighting nothing. It's a shame the bag itself is pretty heavy." - id = "bag_holding" - req_tech = list(TECH_BLUESPACE = 4, TECH_MATERIAL = 6) - materials = list("gold" = 3000, "diamond" = 1500, "uranium" = 250) - build_path = /obj/item/weapon/storage/backpack/holding - sort_string = "VAEAA" - -/datum/design/item/dufflebag_holding - name = "'DuffleBag of Holding', an infinite capacity dufflebag prototype" - desc = "A minaturized prototype of the popular Bag of Holding, the Dufflebag of Holding is, functionally, identical to the bag of holding, but comes in a more stylish and compact form." - id = "dufflebag_holding" - req_tech = list(TECH_BLUESPACE = 4, TECH_MATERIAL = 6) - materials = list("gold" = 3000, "diamond" = 1500, "uranium" = 250) - build_path = /obj/item/weapon/storage/backpack/holding/duffle - sort_string = "VAEAB" - -/datum/design/item/experimental_welder - name = "Experimental welding tool" - desc = "A welding tool that generate fuel for itself." - id = "expwelder" - req_tech = list(TECH_ENGINEERING = 4, TECH_PHORON = 3, TECH_MATERIAL = 4) - materials = list(DEFAULT_WALL_MATERIAL = 70, "glass" = 120, "phoron" = 100) - build_path = /obj/item/weapon/weldingtool/experimental - sort_string = "VASCA" - -/datum/design/item/hand_drill - name = "Hand drill" - desc = "A simple powered hand drill." - id = "handdrill" - req_tech = list(TECH_ENGINEERING = 3, TECH_MATERIAL = 2) - materials = list(DEFAULT_WALL_MATERIAL = 300, "silver" = 100) - build_path = /obj/item/weapon/tool/screwdriver/power - sort_string = "VASDA" - -/datum/design/item/jaws_life - name = "Jaws of life" - desc = "A set of jaws of life, compressed through the magic of science." - id = "jawslife" - req_tech = list(TECH_ENGINEERING = 3, TECH_MATERIAL = 2) - materials = list(DEFAULT_WALL_MATERIAL = 300, "silver" = 100) - build_path = /obj/item/weapon/tool/crowbar/power - sort_string = "VASEA" - -/datum/design/item/device/t_scanner_upg - name = "Upgraded T-ray Scanner" - desc = "An upgraded version of the terahertz-ray emitter and scanner used to detect underfloor objects such as cables and pipes." - id = "upgradedtscanner" - req_tech = list(TECH_MAGNET = 3, TECH_ENGINEERING = 4, TECH_MATERIAL = 2) - materials = list(DEFAULT_WALL_MATERIAL = 500, "phoron" = 150) - build_path = /obj/item/device/t_scanner/upgraded - sort_string = "VASSA" - -/datum/design/item/device/t_scanner_adv - name = "Advanced T-ray Scanner" - desc = "An advanced version of the terahertz-ray emitter and scanner used to detect underfloor objects such as cables and pipes." - id = "advancedtscanner" - req_tech = list(TECH_MAGNET = 6, TECH_ENGINEERING = 6, TECH_MATERIAL = 6) - materials = list(DEFAULT_WALL_MATERIAL = 1250, "phoron" = 500, "silver" = 50) - build_path = /obj/item/device/t_scanner/advanced - sort_string = "VASSB" - -/datum/design/item/translator +/datum/design/item/general/translator name = "handheld translator" id = "translator" req_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 3) materials = list(DEFAULT_WALL_MATERIAL = 3000, "glass" = 3000) build_path = /obj/item/device/universal_translator - sort_string = "HABQA" + sort_string = "TAACA" -/datum/design/item/ear_translator +/datum/design/item/general/ear_translator name = "earpiece translator" id = "ear_translator" req_tech = list(TECH_DATA = 5, TECH_ENGINEERING = 5) //It's been hella miniaturized. materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 2000, "gold" = 1000) build_path = /obj/item/device/universal_translator/ear - sort_string = "HABQB" + sort_string = "TAACB" -/datum/design/item/xenoarch_multi_tool - name = "xenoarcheology multitool" - id = "xenoarch_multitool" - req_tech = list(TECH_MAGNET = 3, TECH_ENGINEERING = 3, TECH_BLUESPACE = 3) - build_path = /obj/item/device/xenoarch_multi_tool - materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 1000, "uranium" = 500, "phoron" = 500) - sort_string = "HABQC" +/datum/design/item/general/light_replacer + name = "Light replacer" + desc = "A device to automatically replace lights. Refill with working lightbulbs." + id = "light_replacer" + req_tech = list(TECH_MAGNET = 3, TECH_MATERIAL = 4) + materials = list(DEFAULT_WALL_MATERIAL = 1500, "silver" = 150, "glass" = 3000) + build_path = /obj/item/device/lightreplacer + sort_string = "TAADA" -/datum/design/item/excavationdrill - name = "Excavation Drill" - id = "excavationdrill" - req_tech = list(TECH_MATERIAL = 3, TECH_POWER = 2, TECH_ENGINEERING = 2, TECH_BLUESPACE = 3) - build_type = PROTOLATHE - materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 4000) - build_path = /obj/item/weapon/pickaxe/excavationdrill - sort_string = "HABQD" +/datum/design/item/general/binaryencrypt + name = "Binary encryption key" + desc = "Allows for deciphering the binary channel on-the-fly." + id = "binaryencrypt" + req_tech = list(TECH_ILLEGAL = 2) + materials = list(DEFAULT_WALL_MATERIAL = 300, "glass" = 300) + build_path = /obj/item/device/encryptionkey/binary + sort_string = "TBAAA" + +/datum/design/item/general/chameleon + name = "Holographic equipment kit" + desc = "A kit of dangerous, high-tech equipment with changeable looks." + id = "chameleon" + req_tech = list(TECH_ILLEGAL = 2) + materials = list(DEFAULT_WALL_MATERIAL = 500) + build_path = /obj/item/weapon/storage/box/syndie_kit/chameleon + sort_string = "TBAAB" diff --git a/code/modules/research/designs/misc_vr.dm b/code/modules/research/designs/misc_vr.dm new file mode 100644 index 00000000000..2b397185c36 --- /dev/null +++ b/code/modules/research/designs/misc_vr.dm @@ -0,0 +1,23 @@ +/datum/design/item/general/bluespace_jumpsuit + name = "Bluespace jumpsuit" + id = "bsjumpsuit" + req_tech = list(TECH_BLUESPACE = 2, TECH_MATERIAL = 3, TECH_POWER = 2) + materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 4000) + build_path = /obj/item/clothing/under/bluespace + sort_string = "TAVAA" + +/datum/design/item/general/sizegun + name = "Size gun" + id = "sizegun" + req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_POWER = 2) + materials = list(DEFAULT_WALL_MATERIAL = 3000, "glass" = 2000, "uranium" = 2000) + build_path = /obj/item/weapon/gun/energy/sizegun + sort_string = "TAVAB" + +/datum/design/item/general/bodysnatcher + name = "Body Snatcher" + id = "bodysnatcher" + req_tech = list(TECH_MAGNET = 3, TECH_BIO = 3, TECH_ILLEGAL = 2) + materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 4000) + build_path = /obj/item/device/bodysnatcher + sort_string = "TBVAA" \ No newline at end of file diff --git a/code/modules/research/designs/modular_computer.dm b/code/modules/research/designs/modular_computer.dm index 5bb19b0be66..e78a776c1c8 100644 --- a/code/modules/research/designs/modular_computer.dm +++ b/code/modules/research/designs/modular_computer.dm @@ -1,233 +1,219 @@ // Modular computer components +/datum/design/item/modularcomponent/AssembleDesignName() + ..() + name = "Computer part design ([item_name])" + // Hard drives + /datum/design/item/modularcomponent/disk/normal name = "basic hard drive" id = "hdd_basic" req_tech = list(TECH_DATA = 1, TECH_ENGINEERING = 1) - build_type = PROTOLATHE materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 100) build_path = /obj/item/weapon/computer_hardware/hard_drive/ - sort_string = "VBAAA" + sort_string = "VAAAA" /datum/design/item/modularcomponent/disk/advanced name = "advanced hard drive" id = "hdd_advanced" - req_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2) - build_type = PROTOLATHE materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 200) build_path = /obj/item/weapon/computer_hardware/hard_drive/advanced - sort_string = "VBAAB" + sort_string = "VAAAB" /datum/design/item/modularcomponent/disk/super name = "super hard drive" id = "hdd_super" req_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 3) - build_type = PROTOLATHE materials = list(DEFAULT_WALL_MATERIAL = 8000, "glass" = 400) build_path = /obj/item/weapon/computer_hardware/hard_drive/super - sort_string = "VBAAC" + sort_string = "VAAAC" /datum/design/item/modularcomponent/disk/cluster name = "cluster hard drive" id = "hdd_cluster" req_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 4) - build_type = PROTOLATHE materials = list(DEFAULT_WALL_MATERIAL = 16000, "glass" = 800) build_path = /obj/item/weapon/computer_hardware/hard_drive/cluster - sort_string = "VBAAD" + sort_string = "VAAAD" /datum/design/item/modularcomponent/disk/small name = "small hard drive" id = "hdd_small" req_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2) - build_type = PROTOLATHE materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 200) build_path = /obj/item/weapon/computer_hardware/hard_drive/small - sort_string = "VBAAE" + sort_string = "VAAAE" /datum/design/item/modularcomponent/disk/micro name = "micro hard drive" id = "hdd_micro" req_tech = list(TECH_DATA = 1, TECH_ENGINEERING = 1) - build_type = PROTOLATHE materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 100) build_path = /obj/item/weapon/computer_hardware/hard_drive/micro - sort_string = "VBAAF" + sort_string = "VAAAF" // Network cards + /datum/design/item/modularcomponent/netcard/basic name = "basic network card" id = "netcard_basic" req_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 1) - build_type = IMPRINTER materials = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 100) build_path = /obj/item/weapon/computer_hardware/network_card - sort_string = "VBAAG" + sort_string = "VBAAA" /datum/design/item/modularcomponent/netcard/advanced name = "advanced network card" id = "netcard_advanced" req_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 2) - build_type = IMPRINTER materials = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 200) build_path = /obj/item/weapon/computer_hardware/network_card/advanced - sort_string = "VBAAH" + sort_string = "VBAAB" /datum/design/item/modularcomponent/netcard/wired name = "wired network card" id = "netcard_wired" req_tech = list(TECH_DATA = 5, TECH_ENGINEERING = 3) - build_type = IMPRINTER materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 400) build_path = /obj/item/weapon/computer_hardware/network_card/wired - sort_string = "VBAAI" - -// Data crystals (USB flash drives) -/datum/design/item/modularcomponent/portabledrive/basic - name = "basic data crystal" - id = "portadrive_basic" - req_tech = list(TECH_DATA = 1) - build_type = IMPRINTER - materials = list("glass" = 8000) - build_path = /obj/item/weapon/computer_hardware/hard_drive/portable - sort_string = "VBAAJ" - -/datum/design/item/modularcomponent/portabledrive/advanced - name = "advanced data crystal" - id = "portadrive_advanced" - req_tech = list(TECH_DATA = 2) - build_type = IMPRINTER - materials = list("glass" = 16000) - build_path = /obj/item/weapon/computer_hardware/hard_drive/portable/advanced - sort_string = "VBAAK" - -/datum/design/item/modularcomponent/portabledrive/super - name = "super data crystal" - id = "portadrive_super" - req_tech = list(TECH_DATA = 4) - build_type = IMPRINTER - materials = list("glass" = 32000) - build_path = /obj/item/weapon/computer_hardware/hard_drive/portable/super - sort_string = "VBAAL" - -// Card slot -/datum/design/item/modularcomponent/cardslot - name = "RFID card slot" - id = "cardslot" - req_tech = list(TECH_DATA = 2) - build_type = PROTOLATHE - materials = list(DEFAULT_WALL_MATERIAL = 3000) - build_path = /obj/item/weapon/computer_hardware/card_slot - sort_string = "VBAAM" - -// Nano printer -/datum/design/item/modularcomponent/nanoprinter - name = "nano printer" - id = "nanoprinter" - req_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2) - build_type = PROTOLATHE - materials = list(DEFAULT_WALL_MATERIAL = 3000) - build_path = /obj/item/weapon/computer_hardware/nano_printer - sort_string = "VBAAN" - -// Tesla Link -/datum/design/item/modularcomponent/teslalink - name = "tesla link" - id = "teslalink" - req_tech = list(TECH_DATA = 2, TECH_POWER = 3, TECH_ENGINEERING = 2) - build_type = PROTOLATHE - materials = list(DEFAULT_WALL_MATERIAL = 10000) - build_path = /obj/item/weapon/computer_hardware/tesla_link - sort_string = "VBAAO" + sort_string = "VBAAC" // Batteries + /datum/design/item/modularcomponent/battery/normal name = "standard battery module" id = "bat_normal" req_tech = list(TECH_POWER = 1, TECH_ENGINEERING = 1) - build_type = PROTOLATHE materials = list(DEFAULT_WALL_MATERIAL = 2000) build_path = /obj/item/weapon/computer_hardware/battery_module - sort_string = "VBAAP" + sort_string = "VCAAA" /datum/design/item/modularcomponent/battery/advanced name = "advanced battery module" id = "bat_advanced" req_tech = list(TECH_POWER = 2, TECH_ENGINEERING = 2) - build_type = PROTOLATHE materials = list(DEFAULT_WALL_MATERIAL = 4000) build_path = /obj/item/weapon/computer_hardware/battery_module/advanced - sort_string = "VBAAQ" + sort_string = "VCAAB" /datum/design/item/modularcomponent/battery/super name = "super battery module" id = "bat_super" req_tech = list(TECH_POWER = 3, TECH_ENGINEERING = 3) - build_type = PROTOLATHE materials = list(DEFAULT_WALL_MATERIAL = 8000) build_path = /obj/item/weapon/computer_hardware/battery_module/super - sort_string = "VBAAR" + sort_string = "VCAAC" /datum/design/item/modularcomponent/battery/ultra name = "ultra battery module" id = "bat_ultra" req_tech = list(TECH_POWER = 5, TECH_ENGINEERING = 4) - build_type = PROTOLATHE materials = list(DEFAULT_WALL_MATERIAL = 16000) build_path = /obj/item/weapon/computer_hardware/battery_module/ultra - sort_string = "VBAAS" + sort_string = "VCAAD" /datum/design/item/modularcomponent/battery/nano name = "nano battery module" id = "bat_nano" req_tech = list(TECH_POWER = 1, TECH_ENGINEERING = 1) - build_type = PROTOLATHE materials = list(DEFAULT_WALL_MATERIAL = 2000) build_path = /obj/item/weapon/computer_hardware/battery_module/nano - sort_string = "VBAAT" + sort_string = "VCAAE" /datum/design/item/modularcomponent/battery/micro name = "micro battery module" id = "bat_micro" req_tech = list(TECH_POWER = 2, TECH_ENGINEERING = 2) - build_type = PROTOLATHE materials = list(DEFAULT_WALL_MATERIAL = 4000) build_path = /obj/item/weapon/computer_hardware/battery_module/micro - sort_string = "VBAAU" + sort_string = "VCAAF" // Processor unit + /datum/design/item/modularcomponent/cpu/ name = "computer processor unit" id = "cpu_normal" req_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 2) - build_type = IMPRINTER materials = list(DEFAULT_WALL_MATERIAL = 8000) build_path = /obj/item/weapon/computer_hardware/processor_unit - sort_string = "VBAAV" + sort_string = "VDAAA" /datum/design/item/modularcomponent/cpu/small name = "computer microprocessor unit" id = "cpu_small" req_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2) - build_type = IMPRINTER materials = list(DEFAULT_WALL_MATERIAL = 4000) build_path = /obj/item/weapon/computer_hardware/processor_unit/small - sort_string = "VBAAW" + sort_string = "VDAAB" /datum/design/item/modularcomponent/cpu/photonic name = "computer photonic processor unit" id = "pcpu_normal" req_tech = list(TECH_DATA = 5, TECH_ENGINEERING = 4) - build_type = IMPRINTER materials = list(DEFAULT_WALL_MATERIAL = 32000, glass = 8000) build_path = /obj/item/weapon/computer_hardware/processor_unit/photonic - sort_string = "VBAAX" + sort_string = "VDAAC" /datum/design/item/modularcomponent/cpu/photonic/small name = "computer photonic microprocessor unit" id = "pcpu_small" req_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 3) - build_type = IMPRINTER materials = list(DEFAULT_WALL_MATERIAL = 16000, glass = 4000) build_path = /obj/item/weapon/computer_hardware/processor_unit/photonic/small - sort_string = "VBAAY" + sort_string = "VDAAD" + +// Other parts + +/datum/design/item/modularcomponent/cardslot + name = "RFID card slot" + id = "cardslot" + req_tech = list(TECH_DATA = 2) + materials = list(DEFAULT_WALL_MATERIAL = 3000) + build_path = /obj/item/weapon/computer_hardware/card_slot + sort_string = "VEAAA" + +/datum/design/item/modularcomponent/nanoprinter + name = "nano printer" + id = "nanoprinter" + req_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2) + materials = list(DEFAULT_WALL_MATERIAL = 3000) + build_path = /obj/item/weapon/computer_hardware/nano_printer + sort_string = "VEAAB" + +/datum/design/item/modularcomponent/teslalink + name = "tesla link" + id = "teslalink" + req_tech = list(TECH_DATA = 2, TECH_POWER = 3, TECH_ENGINEERING = 2) + materials = list(DEFAULT_WALL_MATERIAL = 10000) + build_path = /obj/item/weapon/computer_hardware/tesla_link + sort_string = "VEAAC" + +// Data crystals (USB flash drives) + +/datum/design/item/modularcomponent/portabledrive/AssembleDesignName() + ..() + name = "Portable data drive design ([item_name])" + +/datum/design/item/modularcomponent/portabledrive/basic + name = "basic data crystal" + id = "portadrive_basic" + req_tech = list(TECH_DATA = 1) + materials = list("glass" = 8000) + build_path = /obj/item/weapon/computer_hardware/hard_drive/portable + sort_string = "VFAAA" + +/datum/design/item/modularcomponent/portabledrive/advanced + name = "advanced data crystal" + id = "portadrive_advanced" + req_tech = list(TECH_DATA = 2) + materials = list("glass" = 16000) + build_path = /obj/item/weapon/computer_hardware/hard_drive/portable/advanced + sort_string = "VFAAB" + +/datum/design/item/modularcomponent/portabledrive/super + name = "super data crystal" + id = "portadrive_super" + req_tech = list(TECH_DATA = 4) + materials = list("glass" = 32000) + build_path = /obj/item/weapon/computer_hardware/hard_drive/portable/super + sort_string = "VFAAC" diff --git a/code/modules/research/designs/pdas.dm b/code/modules/research/designs/pdas.dm index d05ca12bcda..78fd01ec239 100644 --- a/code/modules/research/designs/pdas.dm +++ b/code/modules/research/designs/pdas.dm @@ -1,13 +1,16 @@ -/datum/design/item/pda - name = "PDA design" +// PDA + +/datum/design/item/general/pda + name = "PDA" desc = "Cheaper than whiny non-digital assistants." id = "pda" req_tech = list(TECH_ENGINEERING = 2, TECH_POWER = 3) materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) build_path = /obj/item/device/pda - sort_string = "VAAAA" + sort_string = "WAAAA" // Cartridges + /datum/design/item/pda_cartridge req_tech = list(TECH_ENGINEERING = 2, TECH_POWER = 3) materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) @@ -19,79 +22,79 @@ /datum/design/item/pda_cartridge/cart_basic id = "cart_basic" build_path = /obj/item/weapon/cartridge - sort_string = "VBAAA" + sort_string = "WBAAA" /datum/design/item/pda_cartridge/engineering id = "cart_engineering" build_path = /obj/item/weapon/cartridge/engineering - sort_string = "VBAAB" + sort_string = "WBAAB" /datum/design/item/pda_cartridge/atmos id = "cart_atmos" build_path = /obj/item/weapon/cartridge/atmos - sort_string = "VBAAC" + sort_string = "WBAAC" /datum/design/item/pda_cartridge/medical id = "cart_medical" build_path = /obj/item/weapon/cartridge/medical - sort_string = "VBAAD" + sort_string = "WBAAD" /datum/design/item/pda_cartridge/chemistry id = "cart_chemistry" build_path = /obj/item/weapon/cartridge/chemistry - sort_string = "VBAAE" + sort_string = "WBAAE" /datum/design/item/pda_cartridge/security id = "cart_security" build_path = /obj/item/weapon/cartridge/security - sort_string = "VBAAF" + sort_string = "WBAAF" /datum/design/item/pda_cartridge/janitor id = "cart_janitor" build_path = /obj/item/weapon/cartridge/janitor - sort_string = "VBAAG" + sort_string = "WBAAG" /datum/design/item/pda_cartridge/science id = "cart_science" build_path = /obj/item/weapon/cartridge/signal/science - sort_string = "VBAAH" + sort_string = "WBAAH" /datum/design/item/pda_cartridge/quartermaster id = "cart_quartermaster" build_path = /obj/item/weapon/cartridge/quartermaster - sort_string = "VBAAI" + sort_string = "WBAAI" /datum/design/item/pda_cartridge/head id = "cart_head" build_path = /obj/item/weapon/cartridge/head - sort_string = "VBAAJ" + sort_string = "WBAAJ" /datum/design/item/pda_cartridge/hop id = "cart_hop" build_path = /obj/item/weapon/cartridge/hop - sort_string = "VBAAK" + sort_string = "WBAAK" /datum/design/item/pda_cartridge/hos id = "cart_hos" build_path = /obj/item/weapon/cartridge/hos - sort_string = "VBAAL" + sort_string = "WBAAL" /datum/design/item/pda_cartridge/ce id = "cart_ce" build_path = /obj/item/weapon/cartridge/ce - sort_string = "VBAAM" + sort_string = "WBAAM" /datum/design/item/pda_cartridge/cmo id = "cart_cmo" build_path = /obj/item/weapon/cartridge/cmo - sort_string = "VBAAN" + sort_string = "WBAAN" /datum/design/item/pda_cartridge/rd id = "cart_rd" build_path = /obj/item/weapon/cartridge/rd - sort_string = "VBAAO" + sort_string = "WBAAO" /datum/design/item/pda_cartridge/captain id = "cart_captain" build_path = /obj/item/weapon/cartridge/captain - sort_string = "VBAAP" \ No newline at end of file + sort_string = "WBAAP" \ No newline at end of file diff --git a/code/modules/research/designs/powercells.dm b/code/modules/research/designs/power_cells.dm similarity index 93% rename from code/modules/research/designs/powercells.dm rename to code/modules/research/designs/power_cells.dm index 1ae3a3c3615..a387f7cc4c8 100644 --- a/code/modules/research/designs/powercells.dm +++ b/code/modules/research/designs/power_cells.dm @@ -22,7 +22,7 @@ materials = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 50) build_path = /obj/item/weapon/cell category = "Misc" - sort_string = "DAAAA" + sort_string = "BAAAA" /datum/design/item/powercell/high name = "high-capacity" @@ -32,7 +32,7 @@ materials = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 60) build_path = /obj/item/weapon/cell/high category = "Misc" - sort_string = "DAAAB" + sort_string = "BAAAB" /datum/design/item/powercell/super name = "super-capacity" @@ -41,7 +41,7 @@ materials = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 70) build_path = /obj/item/weapon/cell/super category = "Misc" - sort_string = "DAAAC" + sort_string = "BAAAC" /datum/design/item/powercell/hyper name = "hyper-capacity" @@ -50,7 +50,7 @@ materials = list(DEFAULT_WALL_MATERIAL = 400, "gold" = 150, "silver" = 150, "glass" = 70) build_path = /obj/item/weapon/cell/hyper category = "Misc" - sort_string = "DAAAD" + sort_string = "BAAAD" /datum/design/item/powercell/device name = "device" @@ -59,7 +59,7 @@ materials = list(DEFAULT_WALL_MATERIAL = 350, "glass" = 25) build_path = /obj/item/weapon/cell/device category = "Misc" - sort_string = "DAABA" + sort_string = "BAABA" /datum/design/item/powercell/weapon name = "weapon" @@ -68,4 +68,4 @@ materials = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 50) build_path = /obj/item/weapon/cell/device/weapon category = "Misc" - sort_string = "DAABB" \ No newline at end of file + sort_string = "BAABB" \ No newline at end of file diff --git a/code/modules/research/designs/precursor.dm b/code/modules/research/designs/precursor.dm index eaf7b3a923a..bb6e98353f8 100644 --- a/code/modules/research/designs/precursor.dm +++ b/code/modules/research/designs/precursor.dm @@ -1,6 +1,26 @@ -/* - * Contains Precursor and Anomalous designs for the Protolathe. - */ +//Anomaly + +/datum/design/item/anomaly/AssembleDesignName() + ..() + name = "Anomalous prototype ([item_name])" + +/datum/design/item/anomaly/AssembleDesignDesc() + if(!desc) + if(build_path) + var/obj/item/I = build_path + desc = initial(I.desc) + ..() + +/datum/design/item/anomaly/camotrap + name = "Chameleon Trap" + desc = "A self-miraging mechanical trap, capable of producing short bursts of electric current when triggered." + id = "hunt_trap" + materials = list(MAT_DURASTEEL = 3000, MAT_METALHYDROGEN = 1000, MAT_PHORON = 2000) + req_tech = list(TECH_MATERIAL = 4, TECH_BLUESPACE = 3, TECH_MAGNET = 4, TECH_PHORON = 2, TECH_ARCANE = 2) + build_path = /obj/item/weapon/beartrap/hunting + sort_string = "ZAAAA" + +// Precursor /datum/design/item/precursor/AssembleDesignName() ..() @@ -20,7 +40,7 @@ req_tech = list(TECH_ENGINEERING = 6, TECH_MATERIAL = 6, TECH_BLUESPACE = 3, TECH_PRECURSOR = 1) materials = list(MAT_PLASTEEL = 2000, MAT_VERDANTIUM = 3000, MAT_GOLD = 250, MAT_URANIUM = 2500) build_path = /obj/item/weapon/tool/crowbar/hybrid - sort_string = "PATAC" + sort_string = "ZBAAA" /datum/design/item/precursor/wrench name = "Hybrid Wrench" @@ -29,7 +49,7 @@ req_tech = list(TECH_ENGINEERING = 6, TECH_MATERIAL = 5, TECH_BLUESPACE = 2, TECH_MAGNET = 3, TECH_PRECURSOR = 1) materials = list(MAT_PLASTEEL = 2000, MAT_VERDANTIUM = 3000, MAT_SILVER = 300, MAT_URANIUM = 2000) build_path = /obj/item/weapon/tool/wrench/hybrid - sort_string = "PATAW" + sort_string = "ZBAAB" /datum/design/item/precursor/screwdriver name = "Hybrid Screwdriver" @@ -38,7 +58,7 @@ req_tech = list(TECH_ENGINEERING = 4, TECH_MATERIAL = 5, TECH_BLUESPACE = 2, TECH_MAGNET = 3, TECH_PRECURSOR = 1) materials = list(MAT_PLASTEEL = 2000, MAT_VERDANTIUM = 3000, MAT_PLASTIC = 8000, MAT_DIAMOND = 2000) build_path = /obj/item/weapon/tool/screwdriver/hybrid - sort_string = "PATAS" + sort_string = "ZBAAC" /datum/design/item/precursor/wirecutters name = "Hybrid Wirecutters" @@ -47,7 +67,7 @@ req_tech = list(TECH_ENGINEERING = 4, TECH_MATERIAL = 5, TECH_PHORON = 2, TECH_PRECURSOR = 1) materials = list(MAT_PLASTEEL = 2000, MAT_VERDANTIUM = 3000, MAT_PLASTIC = 8000, MAT_PHORON = 2750, MAT_DIAMOND = 2000) build_path = /obj/item/weapon/tool/wirecutters/hybrid - sort_string = "PATBW" + sort_string = "ZBAAD" /datum/design/item/precursor/welder name = "Hybrid Welding Tool" @@ -56,7 +76,8 @@ req_tech = list(TECH_ENGINEERING = 6, TECH_MATERIAL = 6, TECH_BLUESPACE = 3, TECH_PHORON = 3, TECH_MAGNET = 5, TECH_PRECURSOR = 1) materials = list(MAT_DURASTEEL = 2000, MAT_MORPHIUM = 3000, MAT_METALHYDROGEN = 4750, MAT_URANIUM = 6000) build_path = /obj/item/weapon/weldingtool/experimental/hybrid - sort_string = "PATCW" + sort_string = "ZBAAE" + /datum/design/item/precursor/janusmodule name = "Blackbox Circuit Datamass" @@ -65,15 +86,4 @@ materials = list(MAT_DURASTEEL = 3000, MAT_MORPHIUM = 2000, MAT_METALHYDROGEN = 6000, MAT_URANIUM = 6000, MAT_VERDANTIUM = 1500) req_tech = list(TECH_MATERIAL = 7, TECH_BLUESPACE = 5, TECH_MAGNET = 6, TECH_PHORON = 3, TECH_ARCANE = 1, TECH_PRECURSOR = 2) build_path = /obj/random/janusmodule - sort_string = "PAJAA" - -/datum/design/item/anomaly/AssembleDesignName() - ..() - name = "Anomalous prototype ([item_name])" - -/datum/design/item/anomaly/AssembleDesignDesc() - if(!desc) - if(build_path) - var/obj/item/I = build_path - desc = initial(I.desc) - ..() + sort_string = "ZBBAA" diff --git a/code/modules/research/designs/sort_string_readme.dm b/code/modules/research/designs/sort_string_readme.dm new file mode 100644 index 00000000000..11521522b8c --- /dev/null +++ b/code/modules/research/designs/sort_string_readme.dm @@ -0,0 +1,91 @@ +/* + This is a guide to sort strings and categorization of designs. + Its really helpful and neat-looking when items are sorted properly in general R&D list and not just haphazardly. + + sort_string basically sorts items in alphabetic order, using sort_string itself as reference. + + + A - stock parts all always go first, and above everything else + AA - parts themselves + AAAA - matter bins + AAAB - micro manipulators + AAAC - capacitors + AAAD - scanners + AAAE - micro-lasers + AB - part replacer(s) + B - power cells + BAAA - regular power cells + BAAB - small power cells + C - Tech disks + D - GPS/beacons/locators/etc + DA - GPSs + DB - beacon/locator + DBAA - locator + DBAB - beacon + E - HUDs + F - Mining equipment + FA - drills + FB - scanners and such + G - Xenoarch equipment + H - Xenobiology equipment + HA - weapons + HB - other + I - Beakers + J - Biotech scanners and such + JAAA - mass spectrometers + JAAB - reagent scanners + JAAC - borg stuff + JAAD - plant stuff + K - Medical equipment + KA - surgery equipment + KAAA - scalpels/IMS + KAAB - bone clamp + KB - health analyzers + KC - misc + L - Implants + M - Weapons + MA - Ranged weapon + MAA - Energy ranged weapons + MAB - Ballistic ranged weapons + MABB - Ballistic ammo + MAC - Phase weapons + MAD - Other ranged weapons (darts/sprayer/fuelrod) + MADB - misc ammo + MB - Melee weapons + MC - grenade casings + N - Engineering equipment + NA - tools + NB - scanners + O, P - placeholders in case new category is needed + Q - Bags of Holding + R - Telecomms stock parts + S - AI-holders + SA - brain holders + SB - pAI + SC - intellicore + T - Misc stuff + TA - general + TB - illegal + U - Integrated circuits stuff + UA - printer + UB - upgrade disks + UC - tools + UD - holders + V - Modular computer parts + VA - hard drives + VB - network cards + VC - batteries + VD - cpus + VE - accessories without upgrades + VF - data crystals + W - PDA stuff + WA - PDA + WB - PDA cartridges + X, Y - more placeholders + Z - anomaly/precursor items + ZA - anomaly + ZB - precursor + ZBA - precursor tools + ZBB - precursor other + +*/ \ No newline at end of file diff --git a/code/modules/research/designs/stock_parts.dm b/code/modules/research/designs/stock_parts.dm index b928c6bb992..18e3c016163 100644 --- a/code/modules/research/designs/stock_parts.dm +++ b/code/modules/research/designs/stock_parts.dm @@ -14,231 +14,194 @@ if(!desc) desc = "A stock part used in the construction of various devices." -/datum/design/item/stock_part/basic_capacitor - id = "basic_capacitor" - req_tech = list(TECH_POWER = 1) - materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) - build_path = /obj/item/weapon/stock_parts/capacitor - sort_string = "CAAAA" - -/datum/design/item/stock_part/adv_capacitor - id = "adv_capacitor" - req_tech = list(TECH_POWER = 3) - materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) - build_path = /obj/item/weapon/stock_parts/capacitor/adv - sort_string = "CAAAB" - -/datum/design/item/stock_part/super_capacitor - id = "super_capacitor" - req_tech = list(TECH_POWER = 5, TECH_MATERIAL = 4) - materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50, "gold" = 20) - build_path = /obj/item/weapon/stock_parts/capacitor/super - sort_string = "CAAAC" - -/datum/design/item/stock_part/hyper_capacitor - id = "hyper_capacitor" - req_tech = list(TECH_POWER = 6, TECH_MATERIAL = 5, TECH_BLUESPACE = 1, TECH_ARCANE = 1) - materials = list(DEFAULT_WALL_MATERIAL = 200, MAT_GLASS = 100, MAT_VERDANTIUM = 30, MAT_DURASTEEL = 25) - build_path = /obj/item/weapon/stock_parts/capacitor/hyper - sort_string = "CAAAD" - -/datum/design/item/stock_part/omni_capacitor - id = "omni_capacitor" - req_tech = list(TECH_POWER = 7, TECH_MATERIAL = 6, TECH_BLUESPACE = 3, TECH_PRECURSOR = 1) - materials = list(DEFAULT_WALL_MATERIAL = 2000, MAT_DIAMOND = 1000, MAT_GLASS = 1000, MAT_MORPHIUM = 100, MAT_DURASTEEL = 100) - build_path = /obj/item/weapon/stock_parts/capacitor/omni - sort_string = "CAAAE" - -/datum/design/item/stock_part/micro_mani - id = "micro_mani" - req_tech = list(TECH_MATERIAL = 1, TECH_DATA = 1) - materials = list(DEFAULT_WALL_MATERIAL = 30) - build_path = /obj/item/weapon/stock_parts/manipulator - sort_string = "CAABA" - -/datum/design/item/stock_part/nano_mani - id = "nano_mani" - req_tech = list(TECH_MATERIAL = 3, TECH_DATA = 2) - materials = list(DEFAULT_WALL_MATERIAL = 30) - build_path = /obj/item/weapon/stock_parts/manipulator/nano - sort_string = "CAABB" - -/datum/design/item/stock_part/pico_mani - id = "pico_mani" - req_tech = list(TECH_MATERIAL = 5, TECH_DATA = 2) - materials = list(DEFAULT_WALL_MATERIAL = 30) - build_path = /obj/item/weapon/stock_parts/manipulator/pico - sort_string = "CAABC" - -/datum/design/item/stock_part/hyper_mani - id = "hyper_mani" - req_tech = list(TECH_MATERIAL = 6, TECH_DATA = 3, TECH_ARCANE = 2) - materials = list(DEFAULT_WALL_MATERIAL = 200, MAT_VERDANTIUM = 50, MAT_DURASTEEL = 50) - build_path = /obj/item/weapon/stock_parts/manipulator/hyper - sort_string = "CAABD" - -/datum/design/item/stock_part/omni_mani - id = "omni_mani" - req_tech = list(TECH_MATERIAL = 7, TECH_DATA = 4, TECH_PRECURSOR = 2) - materials = list(DEFAULT_WALL_MATERIAL = 2000, MAT_PLASTEEL = 500, MAT_MORPHIUM = 100, MAT_DURASTEEL = 100) - build_path = /obj/item/weapon/stock_parts/manipulator/omni - sort_string = "CAABE" +// Matter Bins /datum/design/item/stock_part/basic_matter_bin id = "basic_matter_bin" req_tech = list(TECH_MATERIAL = 1) materials = list(DEFAULT_WALL_MATERIAL = 80) build_path = /obj/item/weapon/stock_parts/matter_bin - sort_string = "CAACA" + sort_string = "AAAAA" /datum/design/item/stock_part/adv_matter_bin id = "adv_matter_bin" req_tech = list(TECH_MATERIAL = 3) materials = list(DEFAULT_WALL_MATERIAL = 80) build_path = /obj/item/weapon/stock_parts/matter_bin/adv - sort_string = "CAACB" + sort_string = "AAAAB" /datum/design/item/stock_part/super_matter_bin id = "super_matter_bin" req_tech = list(TECH_MATERIAL = 5) materials = list(DEFAULT_WALL_MATERIAL = 80) build_path = /obj/item/weapon/stock_parts/matter_bin/super - sort_string = "CAACC" + sort_string = "AAAAC" /datum/design/item/stock_part/hyper_matter_bin id = "hyper_matter_bin" req_tech = list(TECH_MATERIAL = 6, TECH_ARCANE = 2) materials = list(DEFAULT_WALL_MATERIAL = 200, MAT_VERDANTIUM = 60, MAT_DURASTEEL = 75) build_path = /obj/item/weapon/stock_parts/matter_bin/hyper - sort_string = "CAACD" + sort_string = "AAAAD" /datum/design/item/stock_part/omni_matter_bin id = "omni_matter_bin" req_tech = list(TECH_MATERIAL = 7, TECH_PRECURSOR = 2) materials = list(DEFAULT_WALL_MATERIAL = 2000, MAT_PLASTEEL = 100, MAT_MORPHIUM = 100, MAT_DURASTEEL = 100) build_path = /obj/item/weapon/stock_parts/matter_bin/omni - sort_string = "CAACE" + sort_string = "AAAAE" -/datum/design/item/stock_part/basic_micro_laser - id = "basic_micro_laser" - req_tech = list(TECH_MAGNET = 1) - materials = list(DEFAULT_WALL_MATERIAL = 10, "glass" = 20) - build_path = /obj/item/weapon/stock_parts/micro_laser - sort_string = "CAADA" +// Micro-manipulators -/datum/design/item/stock_part/high_micro_laser - id = "high_micro_laser" - req_tech = list(TECH_MAGNET = 3) - materials = list(DEFAULT_WALL_MATERIAL = 10, "glass" = 20) - build_path = /obj/item/weapon/stock_parts/micro_laser/high - sort_string = "CAADB" +/datum/design/item/stock_part/micro_mani + id = "micro_mani" + req_tech = list(TECH_MATERIAL = 1, TECH_DATA = 1) + materials = list(DEFAULT_WALL_MATERIAL = 30) + build_path = /obj/item/weapon/stock_parts/manipulator + sort_string = "AAABA" -/datum/design/item/stock_part/ultra_micro_laser - id = "ultra_micro_laser" - req_tech = list(TECH_MAGNET = 5, TECH_MATERIAL = 5) - materials = list(DEFAULT_WALL_MATERIAL = 10, "glass" = 20, "uranium" = 10) - build_path = /obj/item/weapon/stock_parts/micro_laser/ultra - sort_string = "CAADC" +/datum/design/item/stock_part/nano_mani + id = "nano_mani" + req_tech = list(TECH_MATERIAL = 3, TECH_DATA = 2) + materials = list(DEFAULT_WALL_MATERIAL = 30) + build_path = /obj/item/weapon/stock_parts/manipulator/nano + sort_string = "AAABB" -/datum/design/item/stock_part/hyper_micro_laser - id = "hyper_micro_laser" - req_tech = list(TECH_MAGNET = 6, TECH_MATERIAL = 6, TECH_ARCANE = 2) - materials = list(DEFAULT_WALL_MATERIAL = 200, MAT_GLASS = 20, MAT_URANIUM = 30, MAT_VERDANTIUM = 50, MAT_DURASTEEL = 100) - build_path = /obj/item/weapon/stock_parts/micro_laser/hyper - sort_string = "CAADD" +/datum/design/item/stock_part/pico_mani + id = "pico_mani" + req_tech = list(TECH_MATERIAL = 5, TECH_DATA = 2) + materials = list(DEFAULT_WALL_MATERIAL = 30) + build_path = /obj/item/weapon/stock_parts/manipulator/pico + sort_string = "AAABC" -/datum/design/item/stock_part/omni_micro_laser - id = "omni_micro_laser" - req_tech = list(TECH_MAGNET = 7, TECH_MATERIAL = 7, TECH_PRECURSOR = 2) - materials = list(DEFAULT_WALL_MATERIAL = 2000, MAT_GLASS = 500, MAT_URANIUM = 2000, MAT_MORPHIUM = 50, MAT_DURASTEEL = 100) - build_path = /obj/item/weapon/stock_parts/micro_laser/omni - sort_string = "CAADE" +/datum/design/item/stock_part/hyper_mani + id = "hyper_mani" + req_tech = list(TECH_MATERIAL = 6, TECH_DATA = 3, TECH_ARCANE = 2) + materials = list(DEFAULT_WALL_MATERIAL = 200, MAT_VERDANTIUM = 50, MAT_DURASTEEL = 50) + build_path = /obj/item/weapon/stock_parts/manipulator/hyper + sort_string = "AAABD" + +/datum/design/item/stock_part/omni_mani + id = "omni_mani" + req_tech = list(TECH_MATERIAL = 7, TECH_DATA = 4, TECH_PRECURSOR = 2) + materials = list(DEFAULT_WALL_MATERIAL = 2000, MAT_PLASTEEL = 500, MAT_MORPHIUM = 100, MAT_DURASTEEL = 100) + build_path = /obj/item/weapon/stock_parts/manipulator/omni + sort_string = "AAABE" + +// Capacitors + +/datum/design/item/stock_part/basic_capacitor + id = "basic_capacitor" + req_tech = list(TECH_POWER = 1) + materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) + build_path = /obj/item/weapon/stock_parts/capacitor + sort_string = "AAACA" + +/datum/design/item/stock_part/adv_capacitor + id = "adv_capacitor" + req_tech = list(TECH_POWER = 3) + materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) + build_path = /obj/item/weapon/stock_parts/capacitor/adv + sort_string = "AAACB" + +/datum/design/item/stock_part/super_capacitor + id = "super_capacitor" + req_tech = list(TECH_POWER = 5, TECH_MATERIAL = 4) + materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50, "gold" = 20) + build_path = /obj/item/weapon/stock_parts/capacitor/super + sort_string = "AAACC" + +/datum/design/item/stock_part/hyper_capacitor + id = "hyper_capacitor" + req_tech = list(TECH_POWER = 6, TECH_MATERIAL = 5, TECH_BLUESPACE = 1, TECH_ARCANE = 1) + materials = list(DEFAULT_WALL_MATERIAL = 200, MAT_GLASS = 100, MAT_VERDANTIUM = 30, MAT_DURASTEEL = 25) + build_path = /obj/item/weapon/stock_parts/capacitor/hyper + sort_string = "AAACD" + +/datum/design/item/stock_part/omni_capacitor + id = "omni_capacitor" + req_tech = list(TECH_POWER = 7, TECH_MATERIAL = 6, TECH_BLUESPACE = 3, TECH_PRECURSOR = 1) + materials = list(DEFAULT_WALL_MATERIAL = 2000, MAT_DIAMOND = 1000, MAT_GLASS = 1000, MAT_MORPHIUM = 100, MAT_DURASTEEL = 100) + build_path = /obj/item/weapon/stock_parts/capacitor/omni + sort_string = "AAACE" + +// Sensors /datum/design/item/stock_part/basic_sensor id = "basic_sensor" req_tech = list(TECH_MAGNET = 1) materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 20) build_path = /obj/item/weapon/stock_parts/scanning_module - sort_string = "CAAEA" + sort_string = "AAADA" /datum/design/item/stock_part/adv_sensor id = "adv_sensor" req_tech = list(TECH_MAGNET = 3) materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 20) build_path = /obj/item/weapon/stock_parts/scanning_module/adv - sort_string = "CAAEB" + sort_string = "AAADB" /datum/design/item/stock_part/phasic_sensor id = "phasic_sensor" req_tech = list(TECH_MAGNET = 5, TECH_MATERIAL = 3) materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 20, "silver" = 10) build_path = /obj/item/weapon/stock_parts/scanning_module/phasic - sort_string = "CAAEC" + sort_string = "AAADC" /datum/design/item/stock_part/hyper_sensor id = "hyper_sensor" req_tech = list(TECH_MAGNET = 6, TECH_MATERIAL = 4, TECH_ARCANE = 1) materials = list(DEFAULT_WALL_MATERIAL = 50, MAT_GLASS = 20, MAT_SILVER = 50, MAT_VERDANTIUM = 40, MAT_DURASTEEL = 50) build_path = /obj/item/weapon/stock_parts/scanning_module/hyper - sort_string = "CAAED" + sort_string = "AAADD" /datum/design/item/stock_part/omni_sensor id = "omni_sensor" req_tech = list(TECH_MAGNET = 7, TECH_MATERIAL = 5, TECH_PRECURSOR = 1) materials = list(DEFAULT_WALL_MATERIAL = 1000, MAT_PLASTEEL = 500, MAT_GLASS = 750, MAT_SILVER = 500, MAT_MORPHIUM = 60, MAT_DURASTEEL = 100) build_path = /obj/item/weapon/stock_parts/scanning_module/omni - sort_string = "CAAEE" + sort_string = "AAADE" -/datum/design/item/stock_part/subspace_ansible - id = "s-ansible" - req_tech = list(TECH_DATA = 3, TECH_MAGNET = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2) - materials = list(DEFAULT_WALL_MATERIAL = 80, "silver" = 20) - build_path = /obj/item/weapon/stock_parts/subspace/ansible - sort_string = "UAAAA" +// Micro-lasers -/datum/design/item/stock_part/hyperwave_filter - id = "s-filter" - req_tech = list(TECH_DATA = 3, TECH_MAGNET = 3) - materials = list(DEFAULT_WALL_MATERIAL = 40, "silver" = 10) - build_path = /obj/item/weapon/stock_parts/subspace/sub_filter - sort_string = "UAAAB" +/datum/design/item/stock_part/basic_micro_laser + id = "basic_micro_laser" + req_tech = list(TECH_MAGNET = 1) + materials = list(DEFAULT_WALL_MATERIAL = 10, "glass" = 20) + build_path = /obj/item/weapon/stock_parts/micro_laser + sort_string = "AAAEA" -/datum/design/item/stock_part/subspace_amplifier - id = "s-amplifier" - req_tech = list(TECH_DATA = 3, TECH_MAGNET = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2) - materials = list(DEFAULT_WALL_MATERIAL = 10, "gold" = 30, "uranium" = 15) - build_path = /obj/item/weapon/stock_parts/subspace/amplifier - sort_string = "UAAAC" +/datum/design/item/stock_part/high_micro_laser + id = "high_micro_laser" + req_tech = list(TECH_MAGNET = 3) + materials = list(DEFAULT_WALL_MATERIAL = 10, "glass" = 20) + build_path = /obj/item/weapon/stock_parts/micro_laser/high + sort_string = "AAAEB" -/datum/design/item/stock_part/subspace_treatment - id = "s-treatment" - req_tech = list(TECH_DATA = 3, TECH_MAGNET = 2, TECH_MATERIAL = 4, TECH_BLUESPACE = 2) - materials = list(DEFAULT_WALL_MATERIAL = 10, "silver" = 20) - build_path = /obj/item/weapon/stock_parts/subspace/treatment - sort_string = "UAAAD" +/datum/design/item/stock_part/ultra_micro_laser + id = "ultra_micro_laser" + req_tech = list(TECH_MAGNET = 5, TECH_MATERIAL = 5) + materials = list(DEFAULT_WALL_MATERIAL = 10, "glass" = 20, "uranium" = 10) + build_path = /obj/item/weapon/stock_parts/micro_laser/ultra + sort_string = "AAAEC" -/datum/design/item/stock_part/subspace_analyzer - id = "s-analyzer" - req_tech = list(TECH_DATA = 3, TECH_MAGNET = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2) - materials = list(DEFAULT_WALL_MATERIAL = 10, "gold" = 15) - build_path = /obj/item/weapon/stock_parts/subspace/analyzer - sort_string = "UAAAE" +/datum/design/item/stock_part/hyper_micro_laser + id = "hyper_micro_laser" + req_tech = list(TECH_MAGNET = 6, TECH_MATERIAL = 6, TECH_ARCANE = 2) + materials = list(DEFAULT_WALL_MATERIAL = 200, MAT_GLASS = 20, MAT_URANIUM = 30, MAT_VERDANTIUM = 50, MAT_DURASTEEL = 100) + build_path = /obj/item/weapon/stock_parts/micro_laser/hyper + sort_string = "AAAED" -/datum/design/item/stock_part/subspace_crystal - id = "s-crystal" - req_tech = list(TECH_MAGNET = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2) - materials = list("glass" = 1000, "silver" = 20, "gold" = 20) - build_path = /obj/item/weapon/stock_parts/subspace/crystal - sort_string = "UAAAF" +/datum/design/item/stock_part/omni_micro_laser + id = "omni_micro_laser" + req_tech = list(TECH_MAGNET = 7, TECH_MATERIAL = 7, TECH_PRECURSOR = 2) + materials = list(DEFAULT_WALL_MATERIAL = 2000, MAT_GLASS = 500, MAT_URANIUM = 2000, MAT_MORPHIUM = 50, MAT_DURASTEEL = 100) + build_path = /obj/item/weapon/stock_parts/micro_laser/omni + sort_string = "AAAEE" -/datum/design/item/stock_part/subspace_transmitter - id = "s-transmitter" - req_tech = list(TECH_MAGNET = 5, TECH_MATERIAL = 5, TECH_BLUESPACE = 3) - materials = list("glass" = 100, "silver" = 10, "uranium" = 15) - build_path = /obj/item/weapon/stock_parts/subspace/transmitter - sort_string = "UAAAG" -// RPEDs live here because they handle stock parts +// RPEDs + /datum/design/item/stock_part/RPED name = "Rapid Part Exchange Device" desc = "Special mechanical module made to store, sort, and apply standard machine parts." @@ -246,7 +209,7 @@ req_tech = list(TECH_ENGINEERING = 3, TECH_MATERIAL = 3) materials = list(DEFAULT_WALL_MATERIAL = 15000, "glass" = 5000) build_path = /obj/item/weapon/storage/part_replacer - sort_string = "CBAAA" + sort_string = "ABAAA" /datum/design/item/stock_part/ARPED name = "Advanced Rapid Part Exchange Device" @@ -255,4 +218,4 @@ req_tech = list(TECH_ENGINEERING = 5, TECH_MATERIAL = 5) materials = list(DEFAULT_WALL_MATERIAL = 30000, "glass" = 10000) build_path = /obj/item/weapon/storage/part_replacer/adv - sort_string = "CBAAB" \ No newline at end of file + sort_string = "ABAAB" \ No newline at end of file diff --git a/code/modules/research/designs/subspace_parts.dm b/code/modules/research/designs/subspace_parts.dm new file mode 100644 index 00000000000..0fcc0e20e0c --- /dev/null +++ b/code/modules/research/designs/subspace_parts.dm @@ -0,0 +1,54 @@ +// Telecomm parts + +/datum/design/item/stock_part/subspace/AssembleDesignName() + ..() + name = "Subspace component design ([item_name])" + +/datum/design/item/stock_part/subspace/subspace_ansible + id = "s-ansible" + req_tech = list(TECH_DATA = 3, TECH_MAGNET = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2) + materials = list(DEFAULT_WALL_MATERIAL = 80, "silver" = 20) + build_path = /obj/item/weapon/stock_parts/subspace/ansible + sort_string = "RAAAA" + +/datum/design/item/stock_part/subspace/hyperwave_filter + id = "s-filter" + req_tech = list(TECH_DATA = 3, TECH_MAGNET = 3) + materials = list(DEFAULT_WALL_MATERIAL = 40, "silver" = 10) + build_path = /obj/item/weapon/stock_parts/subspace/sub_filter + sort_string = "RAAAB" + +/datum/design/item/stock_part/subspace/subspace_amplifier + id = "s-amplifier" + req_tech = list(TECH_DATA = 3, TECH_MAGNET = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2) + materials = list(DEFAULT_WALL_MATERIAL = 10, "gold" = 30, "uranium" = 15) + build_path = /obj/item/weapon/stock_parts/subspace/amplifier + sort_string = "RAAAC" + +/datum/design/item/stock_part/subspace/subspace_treatment + id = "s-treatment" + req_tech = list(TECH_DATA = 3, TECH_MAGNET = 2, TECH_MATERIAL = 4, TECH_BLUESPACE = 2) + materials = list(DEFAULT_WALL_MATERIAL = 10, "silver" = 20) + build_path = /obj/item/weapon/stock_parts/subspace/treatment + sort_string = "RAAAD" + +/datum/design/item/stock_part/subspace/subspace_analyzer + id = "s-analyzer" + req_tech = list(TECH_DATA = 3, TECH_MAGNET = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2) + materials = list(DEFAULT_WALL_MATERIAL = 10, "gold" = 15) + build_path = /obj/item/weapon/stock_parts/subspace/analyzer + sort_string = "RAAAE" + +/datum/design/item/stock_part/subspace/subspace_crystal + id = "s-crystal" + req_tech = list(TECH_MAGNET = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2) + materials = list("glass" = 1000, "silver" = 20, "gold" = 20) + build_path = /obj/item/weapon/stock_parts/subspace/crystal + sort_string = "RAAAF" + +/datum/design/item/stock_part/subspace/subspace_transmitter + id = "s-transmitter" + req_tech = list(TECH_MAGNET = 5, TECH_MATERIAL = 5, TECH_BLUESPACE = 3) + materials = list("glass" = 100, "silver" = 10, "uranium" = 15) + build_path = /obj/item/weapon/stock_parts/subspace/transmitter + sort_string = "RAAAG" \ No newline at end of file diff --git a/code/modules/research/designs/tech_disks.dm b/code/modules/research/designs/tech_disks.dm new file mode 100644 index 00000000000..70f6ed0022f --- /dev/null +++ b/code/modules/research/designs/tech_disks.dm @@ -0,0 +1,21 @@ +/datum/design/item/disk/AssembleDesignName() + ..() + name = "Data storage design ([name])" + +/datum/design/item/disk/design_disk + name = "Design Storage Disk" + desc = "Produce additional disks for storing device designs." + id = "design_disk" + req_tech = list(TECH_DATA = 1) + materials = list(DEFAULT_WALL_MATERIAL = 30, "glass" = 10) + build_path = /obj/item/weapon/disk/design_disk + sort_string = "CAAAA" + +/datum/design/item/disk/tech_disk + name = "Technology Data Storage Disk" + desc = "Produce additional disks for storing technology data." + id = "tech_disk" + req_tech = list(TECH_DATA = 1) + materials = list(DEFAULT_WALL_MATERIAL = 30, "glass" = 10) + build_path = /obj/item/weapon/disk/tech_disk + sort_string = "CAAAB" \ No newline at end of file diff --git a/code/modules/research/designs/weapons.dm b/code/modules/research/designs/weapons.dm index d696b14b29a..81a2bd57d95 100644 --- a/code/modules/research/designs/weapons.dm +++ b/code/modules/research/designs/weapons.dm @@ -2,6 +2,10 @@ ..() name = "Weapon prototype ([item_name])" +/datum/design/item/weapon/ammo/AssembleDesignName() + ..() + name = "Weapon ammo prototype ([item_name])" + /datum/design/item/weapon/AssembleDesignDesc() if(!desc) if(build_path) @@ -9,95 +13,145 @@ desc = initial(I.desc) ..() -/datum/design/item/weapon/stunrevolver +// Energy weapons + +/datum/design/item/weapon/energy/AssembleDesignName() + ..() + name = "Energy weapon prototype ([item_name])" + +/datum/design/item/weapon/energy/stunrevolver id = "stunrevolver" req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_POWER = 2) materials = list(DEFAULT_WALL_MATERIAL = 4000) build_path = /obj/item/weapon/gun/energy/stunrevolver - sort_string = "TAAAA" + sort_string = "MAAAA" -/datum/design/item/weapon/nuclear_gun +/datum/design/item/weapon/energy/nuclear_gun id = "nuclear_gun" req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 5, TECH_POWER = 3) materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000, "uranium" = 500) build_path = /obj/item/weapon/gun/energy/gun/nuclear - sort_string = "TAAAB" + sort_string = "MAAAB" -/datum/design/item/weapon/lasercannon +/datum/design/item/weapon/energy/phoronpistol + id = "ppistol" + req_tech = list(TECH_COMBAT = 5, TECH_PHORON = 4) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000, "phoron" = 3000) + build_path = /obj/item/weapon/gun/energy/toxgun + sort_string = "MAAAC" + +/datum/design/item/weapon/energy/lasercannon desc = "The lasing medium of this prototype is enclosed in a tube lined with uranium-235 and subjected to high neutron flux in a nuclear reactor core." id = "lasercannon" req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 3, TECH_POWER = 3) materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 1000, "diamond" = 2000) build_path = /obj/item/weapon/gun/energy/lasercannon - sort_string = "TAAAC" + sort_string = "MAAAD" -/datum/design/item/weapon/phoronpistol - id = "ppistol" - req_tech = list(TECH_COMBAT = 5, TECH_PHORON = 4) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000, "phoron" = 3000) - build_path = /obj/item/weapon/gun/energy/toxgun - sort_string = "TAAAD" - -/datum/design/item/weapon/decloner +/datum/design/item/weapon/energy/decloner id = "decloner" req_tech = list(TECH_COMBAT = 8, TECH_MATERIAL = 7, TECH_BIO = 5, TECH_POWER = 6) materials = list("gold" = 5000,"uranium" = 10000) build_path = /obj/item/weapon/gun/energy/decloner - sort_string = "TAAAE" + sort_string = "MAAAE" -/datum/design/item/weapon/advanced_smg +/datum/design/item/weapon/energy/temp_gun + desc = "A gun that shoots high-powered glass-encased energy temperature bullets." + id = "temp_gun" + req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 4, TECH_POWER = 3, TECH_MAGNET = 2) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 500, "silver" = 3000) + build_path = /obj/item/weapon/gun/energy/temperature + sort_string = "MAAAF" + +/datum/design/item/weapon/energy/flora_gun + id = "flora_gun" + req_tech = list(TECH_MATERIAL = 2, TECH_BIO = 3, TECH_POWER = 3) + materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 500, "uranium" = 500) + build_path = /obj/item/weapon/gun/energy/floragun + sort_string = "MAAAG" + +// Ballistic weapons + +/datum/design/item/weapon/ballistic/AssembleDesignName() + ..() + name = "Ballistic weapon prototype ([item_name])" + +/datum/design/item/weapon/ballistic/advanced_smg id = "smg" desc = "An advanced 9mm SMG with a reflective laser optic." req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 3) materials = list(DEFAULT_WALL_MATERIAL = 8000, "silver" = 2000, "diamond" = 1000) build_path = /obj/item/weapon/gun/projectile/automatic/advanced_smg - sort_string = "TAABA" + sort_string = "MABAA" -/datum/design/item/weapon/ammo_9mmAdvanced +// Ballistic ammo + +/datum/design/item/weapon/ballistic/ammo/AssembleDesignName() + ..() + name = "Ballistic weapon ammo prototype ([name])" + +/datum/design/item/weapon/ballistic/ammo/ammo_9mmAdvanced + name = "9mm magazine" id = "ammo_9mm" desc = "A 21 round magazine for an advanced 9mm SMG." req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 3) materials = list(DEFAULT_WALL_MATERIAL = 3750, "silver" = 100) // Requires silver for proprietary magazines! Or something. build_path = /obj/item/ammo_magazine/m9mmAdvanced - sort_string = "TAACA" + sort_string = "MABBA" -/datum/design/item/weapon/stunshell +/datum/design/item/weapon/ballistic/ammo/stunshell + name = "stun shell" desc = "A stunning shell for a shotgun." id = "stunshell" req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3) materials = list(DEFAULT_WALL_MATERIAL = 4000) build_path = /obj/item/ammo_casing/a12g/stunshell - sort_string = "TAACB" + sort_string = "MABBB" -/datum/design/item/weapon/chemsprayer - desc = "An advanced chem spraying device." - id = "chemsprayer" - req_tech = list(TECH_MATERIAL = 3, TECH_ENGINEERING = 3, TECH_BIO = 2) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000) - build_path = /obj/item/weapon/reagent_containers/spray/chemsprayer - sort_string = "TABAA" +// Phase weapons + +/datum/design/item/weapon/phase/AssembleDesignName() + ..() + name = "Phase weapon prototype ([item_name])" + +/* //VOREStation Removal Start +/datum/design/item/weapon/phase/phase_pistol + id = "phasepistol" + req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 2, TECH_POWER = 2) + materials = list(DEFAULT_WALL_MATERIAL = 4000) + build_path = /obj/item/weapon/gun/energy/phasegun/pistol + sort_string = "MACAA" + +/datum/design/item/weapon/phase/phase_carbine + id = "phasecarbine" + req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 2, TECH_POWER = 2) + materials = list(DEFAULT_WALL_MATERIAL = 6000, "glass" = 1500) + build_path = /obj/item/weapon/gun/energy/phasegun + sort_string = "MACAB" + +/datum/design/item/weapon/phase/phase_rifle + id = "phaserifle" + req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 3, TECH_POWER = 3) + materials = list(DEFAULT_WALL_MATERIAL = 7000, "glass" = 2000, "silver" = 500) + build_path = /obj/item/weapon/gun/energy/phasegun/rifle + sort_string = "MACAC" + +/datum/design/item/weapon/phase/phase_cannon + id = "phasecannon" + req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 4, TECH_POWER = 4) + materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 2000, "silver" = 1000, "diamond" = 750) + build_path = /obj/item/weapon/gun/energy/phasegun/cannon + sort_string = "MACAD" +*/ //VOREStation Removal End + +// Other weapons /datum/design/item/weapon/rapidsyringe id = "rapidsyringe" req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_ENGINEERING = 3, TECH_BIO = 2) materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000) build_path = /obj/item/weapon/gun/launcher/syringe/rapid - sort_string = "TABAB" - -/datum/design/item/weapon/temp_gun - desc = "A gun that shoots high-powered glass-encased energy temperature bullets." - id = "temp_gun" - req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 4, TECH_POWER = 3, TECH_MAGNET = 2) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 500, "silver" = 3000) - build_path = /obj/item/weapon/gun/energy/temperature - sort_string = "TABAC" - -/datum/design/item/weapon/large_grenade - id = "large_Grenade" - req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 2) - materials = list(DEFAULT_WALL_MATERIAL = 3000) - build_path = /obj/item/weapon/grenade/chem_grenade/large - sort_string = "TACAA" + sort_string = "MADAA" /datum/design/item/weapon/dartgun desc = "A gun that fires small hollow chemical-payload darts." @@ -105,92 +159,83 @@ req_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 4, TECH_BIO = 4, TECH_MAGNET = 3, TECH_ILLEGAL = 1) materials = list(DEFAULT_WALL_MATERIAL = 5000, "gold" = 5000, "silver" = 2500, "glass" = 750) build_path = /obj/item/weapon/gun/projectile/dartgun/research - sort_string = "TACAB" + sort_string = "MADAB" -/datum/design/item/weapon/dartgunmag_small - id = "dartgun_mag_s" - req_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 2, TECH_BIO = 2, TECH_MAGNET = 1, TECH_ILLEGAL = 1) - materials = list(DEFAULT_WALL_MATERIAL = 300, "gold" = 100, "silver" = 100, "glass" = 300) - build_path = /obj/item/ammo_magazine/chemdart/small - sort_string = "TACAC" - -/datum/design/item/weapon/dartgun_ammo_small - id = "dartgun_ammo_s" - req_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 2, TECH_BIO = 2, TECH_MAGNET = 1, TECH_ILLEGAL = 1) - materials = list(DEFAULT_WALL_MATERIAL = 50, "gold" = 30, "silver" = 30, "glass" = 50) - build_path = /obj/item/ammo_casing/chemdart/small - sort_string = "TACAD" - -/datum/design/item/weapon/dartgunmag_med - id = "dartgun_mag_m" - req_tech = list(TECH_COMBAT = 7, TECH_MATERIAL = 2, TECH_BIO = 2, TECH_MAGNET = 1, TECH_ILLEGAL = 1) - materials = list(DEFAULT_WALL_MATERIAL = 500, "gold" = 150, "silver" = 150, "diamond" = 200, "glass" = 400) - build_path = /obj/item/ammo_magazine/chemdart - sort_string = "TACAE" - -/datum/design/item/weapon/dartgun_ammo_med - id = "dartgun_ammo_m" - req_tech = list(TECH_COMBAT = 7, TECH_MATERIAL = 2, TECH_BIO = 2, TECH_MAGNET = 1, TECH_ILLEGAL = 1) - materials = list(DEFAULT_WALL_MATERIAL = 80, "gold" = 40, "silver" = 40, "glass" = 60) - build_path = /obj/item/ammo_casing/chemdart - sort_string = "TACAF" +/datum/design/item/weapon/chemsprayer + desc = "An advanced chem spraying device." + id = "chemsprayer" + req_tech = list(TECH_MATERIAL = 3, TECH_ENGINEERING = 3, TECH_BIO = 2) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000) + build_path = /obj/item/weapon/reagent_containers/spray/chemsprayer + sort_string = "MADAC" /datum/design/item/weapon/fuelrod id = "fuelrod_gun" req_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 4, TECH_PHORON = 4, TECH_ILLEGAL = 5, TECH_MAGNET = 5) materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 2000, "gold" = 500, "silver" = 500, "uranium" = 1000, "phoron" = 3000, "diamond" = 1000) build_path = /obj/item/weapon/gun/magnetic/fuelrod - sort_string = "TACBA" + sort_string = "MADAD" -/datum/design/item/weapon/flora_gun - id = "flora_gun" - req_tech = list(TECH_MATERIAL = 2, TECH_BIO = 3, TECH_POWER = 3) - materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 500, "uranium" = 500) - build_path = /obj/item/weapon/gun/energy/floragun - sort_string = "TBAAA" +// Ammo for those -// Xenobio Tools -/datum/design/item/weapon/slimebation - id = "slimebation" - req_tech = list(TECH_MATERIAL = 2, TECH_BIO = 2, TECH_POWER = 3, TECH_COMBAT = 3) - materials = list(DEFAULT_WALL_MATERIAL = 5000) - build_path = /obj/item/weapon/melee/baton/slime - sort_string = "TBAAB" +/datum/design/item/weapon/ammo/dartgunmag_small + id = "dartgun_mag_s" + req_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 2, TECH_BIO = 2, TECH_MAGNET = 1, TECH_ILLEGAL = 1) + materials = list(DEFAULT_WALL_MATERIAL = 300, "gold" = 100, "silver" = 100, "glass" = 300) + build_path = /obj/item/ammo_magazine/chemdart/small + sort_string = "MADBA" -/datum/design/item/weapon/slimetaser - id = "slimetaser" - req_tech = list(TECH_MATERIAL = 3, TECH_BIO = 3, TECH_POWER = 4, TECH_COMBAT = 4) - materials = list(DEFAULT_WALL_MATERIAL = 5000) - build_path = /obj/item/weapon/gun/energy/taser/xeno - sort_string = "TBAAC" +/datum/design/item/weapon/ammo/dartgun_ammo_small + id = "dartgun_ammo_s" + req_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 2, TECH_BIO = 2, TECH_MAGNET = 1, TECH_ILLEGAL = 1) + materials = list(DEFAULT_WALL_MATERIAL = 50, "gold" = 30, "silver" = 30, "glass" = 50) + build_path = /obj/item/ammo_casing/chemdart/small + sort_string = "MADBB" -/* //VOREStation Edit -// Phase Weapons -/datum/design/item/weapon/phase_pistol - id = "phasepistol" - req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 2, TECH_POWER = 2) - materials = list(DEFAULT_WALL_MATERIAL = 4000) - build_path = /obj/item/weapon/gun/energy/phasegun/pistol - sort_string = "TPAAA" +/datum/design/item/weapon/ammo/dartgunmag_med + id = "dartgun_mag_m" + req_tech = list(TECH_COMBAT = 7, TECH_MATERIAL = 2, TECH_BIO = 2, TECH_MAGNET = 1, TECH_ILLEGAL = 1) + materials = list(DEFAULT_WALL_MATERIAL = 500, "gold" = 150, "silver" = 150, "diamond" = 200, "glass" = 400) + build_path = /obj/item/ammo_magazine/chemdart + sort_string = "MADBC" -/datum/design/item/weapon/phase_carbine - id = "phasecarbine" - req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 2, TECH_POWER = 2) - materials = list(DEFAULT_WALL_MATERIAL = 6000, "glass" = 1500) - build_path = /obj/item/weapon/gun/energy/phasegun - sort_string = "TPAAB" +/datum/design/item/weapon/ammo/dartgun_ammo_med + id = "dartgun_ammo_m" + req_tech = list(TECH_COMBAT = 7, TECH_MATERIAL = 2, TECH_BIO = 2, TECH_MAGNET = 1, TECH_ILLEGAL = 1) + materials = list(DEFAULT_WALL_MATERIAL = 80, "gold" = 40, "silver" = 40, "glass" = 60) + build_path = /obj/item/ammo_casing/chemdart + sort_string = "MADBD" -/datum/design/item/weapon/phase_rifle - id = "phaserifle" - req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 3, TECH_POWER = 3) - materials = list(DEFAULT_WALL_MATERIAL = 7000, "glass" = 2000, "silver" = 500) - build_path = /obj/item/weapon/gun/energy/phasegun/rifle - sort_string = "TPAAC" +// Melee weapons -/datum/design/item/weapon/phase_cannon - id = "phasecannon" - req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 4, TECH_POWER = 4) - materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 2000, "silver" = 1000, "diamond" = 750) - build_path = /obj/item/weapon/gun/energy/phasegun/cannon - sort_string = "TPAAD" -*/ \ No newline at end of file +/datum/design/item/weapon/melee/AssembleDesignName() + ..() + name = "Melee weapon prototype ([item_name])" + +/datum/design/item/weapon/melee/esword + name = "Portable Energy Blade" + id = "chargesword" + req_tech = list(TECH_COMBAT = 6, TECH_MAGNET = 4, TECH_ENGINEERING = 5, TECH_ILLEGAL = 4, TECH_ARCANE = 1) + materials = list(MAT_PLASTEEL = 3500, "glass" = 1000, MAT_LEAD = 2250, MAT_METALHYDROGEN = 500) + build_path = /obj/item/weapon/melee/energy/sword/charge + sort_string = "MBAAA" + +/datum/design/item/weapon/melee/eaxe + name = "Energy Axe" + id = "chargeaxe" + req_tech = list(TECH_COMBAT = 6, TECH_MAGNET = 5, TECH_ENGINEERING = 4, TECH_ILLEGAL = 4) + materials = list(MAT_PLASTEEL = 3500, MAT_OSMIUM = 2000, MAT_LEAD = 2000, MAT_METALHYDROGEN = 500) + build_path = /obj/item/weapon/melee/energy/axe/charge + sort_string = "MBAAB" + +// Grenade stuff +/datum/design/item/weapon/grenade/AssembleDesignName() + ..() + name = "Grenade casing prototype ([item_name])" + +/datum/design/item/weapon/grenade/large_grenade + id = "large_Grenade" + req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 2) + materials = list(DEFAULT_WALL_MATERIAL = 3000) + build_path = /obj/item/weapon/grenade/chem_grenade/large + sort_string = "MCAAA" diff --git a/code/modules/research/designs/weapons_vr.dm b/code/modules/research/designs/weapons_vr.dm new file mode 100644 index 00000000000..0cde7758c48 --- /dev/null +++ b/code/modules/research/designs/weapons_vr.dm @@ -0,0 +1,165 @@ +/* + MAU - AP weapons + MAV - cell-loaded weapons + MAVA - weapon + MAVB - cartridge + MAVC - cells +*/ + + +// Energy Weapons + +/datum/design/item/weapon/energy/protector + desc = "The 'Protector' is an advanced energy gun that cannot be fired in lethal mode on low security alert levels, but features DNA locking and a powerful stun." + id = "protector" + req_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 3, TECH_MAGNET = 2) + materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 2000, "silver" = 1000) + build_path = /obj/item/weapon/gun/energy/protector + sort_string = "MAAVA" + +/datum/design/item/weapon/energy/sickshot + desc = "A 'Sickshot' is a 4-shot energy revolver that causes nausea and confusion." + id = "sickshot" + req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_MAGNET = 2) + materials = list(DEFAULT_WALL_MATERIAL = 3000, "glass" = 2000) + build_path = /obj/item/weapon/gun/energy/sickshot + sort_string = "MAAVB" + +/datum/design/item/weapon/energy/netgun + name = "\'Hunter\' capture gun" + id = "netgun" + req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 5, TECH_MAGNET = 3) + materials = list(DEFAULT_WALL_MATERIAL = 6000, "glass" = 3000) + build_path = /obj/item/weapon/gun/energy/netgun + sort_string = "MAAVC" + +// Misc weapons + +/datum/design/item/weapon/pummeler + desc = "With the 'Pummeler', punt anyone you don't like out of the room!" + id = "pummeler" + req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_MAGNET = 5) + materials = list(DEFAULT_WALL_MATERIAL = 3000, "glass" = 3000, "uranium" = 1000) + build_path = /obj/item/weapon/gun/energy/pummeler + sort_string = "MADVA" + +// Anti-particle stuff + +/datum/design/item/weapon/particle/AssembleDesignName() + ..() + name = "Anti-particle weapon prototype ([item_name])" + +/datum/design/item/weapon/particle/advparticle + name = "Advanced anti-particle rifle" + id = "advparticle" + req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 5, TECH_POWER = 3, TECH_MAGNET = 3) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000, "gold" = 1000, "uranium" = 750) + build_path = /obj/item/weapon/gun/energy/particle/advanced + sort_string = "MAAUA" + +/datum/design/item/weapon/particle/particlecannon + name = "Anti-particle cannon" + id = "particlecannon" + req_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 5, TECH_POWER = 4, TECH_MAGNET = 4) + materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 1500, "gold" = 2000, "uranium" = 1000, "diamond" = 2000) + build_path = /obj/item/weapon/gun/energy/particle/cannon + sort_string = "MAAUB" + +/datum/design/item/weapon/particle/pressureinterlock + name = "APP pressure interlock" + id = "pressureinterlock" + req_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2, TECH_ENGINEERING = 2) + materials = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 250) + build_path = /obj/item/pressurelock + sort_string = "MAAUC" + +// NSFW gun and cells +/datum/design/item/weapon/cell_based/AssembleDesignName() + ..() + name = "Cell-based weapon prototype ([item_name])" + +/datum/design/item/weapon/cell_based/prototype_nsfw + name = "cell-loaded revolver" + id = "nsfw_prototype" + req_tech = list(TECH_MATERIAL = 6, TECH_MAGNET = 4, TECH_POWER = 4, TECH_COMBAT = 7) + materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 6000, "phoron" = 8000, "uranium" = 4000) + build_path = /obj/item/weapon/gun/projectile/cell_loaded/combat/prototype + sort_string = "MAVAA" + +/datum/design/item/weapon/cell_based/prototype_nsfw_mag + name = "combat cell magazine" + id = "nsfw_mag_prototype" + req_tech = list(TECH_MATERIAL = 6, TECH_MAGNET = 4, TECH_POWER = 4, TECH_COMBAT = 7) + materials = list(DEFAULT_WALL_MATERIAL = 8000, "glass" = 4000, "phoron" = 4000) + build_path = /obj/item/ammo_magazine/cell_mag/combat/prototype + sort_string = "MAVBA" + +/datum/design/item/nsfw_cell/AssembleDesignName() + ..() + name = "Microbattery prototype ([name])" + +/datum/design/item/nsfw_cell/stun + name = "STUN" + id = "nsfw_cell_stun" + req_tech = list(TECH_MATERIAL = 4, TECH_MAGNET = 2, TECH_POWER = 3, TECH_COMBAT = 3) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000) + build_path = /obj/item/ammo_casing/microbattery/combat/stun + sort_string = "MAVCA" + +/datum/design/item/nsfw_cell/lethal + name = "LETHAL" + id = "nsfw_cell_lethal" + req_tech = list(TECH_MATERIAL = 4, TECH_MAGNET = 3, TECH_POWER = 3, TECH_COMBAT = 5) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "phoron" = 3000) + build_path = /obj/item/ammo_casing/microbattery/combat/lethal + sort_string = "MAVCB" + +/datum/design/item/nsfw_cell/net + name = "NET" + id = "nsfw_cell_net" + req_tech = list(TECH_MATERIAL = 4, TECH_MAGNET = 3, TECH_POWER = 3, TECH_COMBAT = 4) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "uranium" = 3000) + build_path = /obj/item/ammo_casing/microbattery/combat/net + sort_string = "MAVCC" + +/datum/design/item/nsfw_cell/ion + name = "ION" + id = "nsfw_cell_ion" + req_tech = list(TECH_MATERIAL = 5, TECH_MAGNET = 3, TECH_POWER = 5, TECH_COMBAT = 5) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "silver" = 3000) + build_path = /obj/item/ammo_casing/microbattery/combat/ion + sort_string = "MAVCD" + +/datum/design/item/nsfw_cell/shotstun + name = "SCATTERSTUN" + id = "nsfw_cell_shotstun" + req_tech = list(TECH_MATERIAL = 6, TECH_MAGNET = 3, TECH_POWER = 6, TECH_COMBAT = 6) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "silver" = 2000, "gold" = 2000) + build_path = /obj/item/ammo_casing/microbattery/combat/shotstun + sort_string = "MAVCE" + +/datum/design/item/nsfw_cell/xray + name = "XRAY" + id = "nsfw_cell_xray" + req_tech = list(TECH_MATERIAL = 6, TECH_MAGNET = 4, TECH_POWER = 5, TECH_COMBAT = 7) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "silver" = 1000, "gold" = 1000, "uranium" = 1000, "phoron" = 1000) + build_path = /obj/item/ammo_casing/microbattery/combat/xray + sort_string = "MAVCF" + +/datum/design/item/nsfw_cell/stripper + name = "STRIPPER" + id = "nsfw_cell_stripper" + req_tech = list(TECH_MATERIAL = 7, TECH_BIO = 4, TECH_POWER = 4, TECH_COMBAT = 4, TECH_ILLEGAL = 5) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "uranium" = 2000, "phoron" = 2000, "diamond" = 500) + build_path = /obj/item/ammo_casing/microbattery/combat/stripper + sort_string = "MAVCG" + +/* +/datum/design/item/nsfw_cell/final + name = "FINAL OPTION" + id = "nsfw_cell_final" + req_tech = list(TECH_COMBAT = 69, TECH_ILLEGAL = 69, TECH_PRECURSOR = 1) + materials = list("unobtanium" = 9001) + build_path = /obj/item/ammo_casing/microbattery/combat/final + sort_string = "MAVCH" +*/ \ No newline at end of file diff --git a/code/modules/research/designs/xenoarch_toys.dm b/code/modules/research/designs/xenoarch_toys.dm new file mode 100644 index 00000000000..7c69090b1bd --- /dev/null +++ b/code/modules/research/designs/xenoarch_toys.dm @@ -0,0 +1,31 @@ +/datum/design/item/weapon/xenoarch/AssembleDesignName() + ..() + name = "Xenoarcheology equipment design ([item_name])" + +// Xenoarch tools + +/datum/design/item/weapon/xenoarch/ano_scanner + name = "Alden-Saraspova counter" + id = "ano_scanner" + desc = "Aids in triangulation of exotic particles." + req_tech = list(TECH_BLUESPACE = 3, TECH_MAGNET = 3) + materials = list(DEFAULT_WALL_MATERIAL = 10000,"glass" = 5000) + build_path = /obj/item/device/ano_scanner + sort_string = "GAAAA" + +/datum/design/item/weapon/xenoarch/xenoarch_multi_tool + name = "xenoarcheology multitool" + id = "xenoarch_multitool" + req_tech = list(TECH_MAGNET = 3, TECH_ENGINEERING = 3, TECH_BLUESPACE = 3) + build_path = /obj/item/device/xenoarch_multi_tool + materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 1000, "uranium" = 500, "phoron" = 500) + sort_string = "GAAAB" + +/datum/design/item/weapon/xenoarch/excavationdrill + name = "Excavation Drill" + id = "excavationdrill" + req_tech = list(TECH_MATERIAL = 3, TECH_POWER = 2, TECH_ENGINEERING = 2, TECH_BLUESPACE = 3) + build_type = PROTOLATHE + materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 4000) + build_path = /obj/item/weapon/pickaxe/excavationdrill + sort_string = "GAAAC" \ No newline at end of file diff --git a/code/modules/research/designs/xenobio_toys.dm b/code/modules/research/designs/xenobio_toys.dm new file mode 100644 index 00000000000..917f8ba6c31 --- /dev/null +++ b/code/modules/research/designs/xenobio_toys.dm @@ -0,0 +1,30 @@ +/datum/design/item/weapon/xenobio/AssembleDesignName() + ..() + name = "Xenobiology equipment design ([item_name])" + +// Xenobio Weapons + +/datum/design/item/weapon/xenobio/slimebaton + id = "slimebaton" + req_tech = list(TECH_MATERIAL = 2, TECH_BIO = 2, TECH_POWER = 3, TECH_COMBAT = 3) + materials = list(DEFAULT_WALL_MATERIAL = 5000) + build_path = /obj/item/weapon/melee/baton/slime + sort_string = "HAAAA" + +/datum/design/item/weapon/xenobio/slimetaser + id = "slimetaser" + req_tech = list(TECH_MATERIAL = 3, TECH_BIO = 3, TECH_POWER = 4, TECH_COMBAT = 4) + materials = list(DEFAULT_WALL_MATERIAL = 5000) + build_path = /obj/item/weapon/gun/energy/taser/xeno + sort_string = "HAAAB" + +// Other + +/datum/design/item/weapon/xenobio/slime_scanner + name = "slime scanner" + desc = "A hand-held body scanner able to learn information about slimes." + id = "slime_scanner" + req_tech = list(TECH_MAGNET = 2, TECH_BIO = 2) + materials = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 500) + build_path = /obj/item/device/slime_scanner + sort_string = "HBAAA" \ No newline at end of file diff --git a/code/modules/research/designs_vr.dm b/code/modules/research/designs_vr.dm deleted file mode 100644 index 518c77a504b..00000000000 --- a/code/modules/research/designs_vr.dm +++ /dev/null @@ -1,328 +0,0 @@ -/* Make language great again -/datum/design/item/implant/language - name = "Language implant" - id = "implant_language" - req_tech = list(TECH_MATERIAL = 5, TECH_BIO = 5, TECH_DATA = 4, TECH_ENGINEERING = 4) //This is not an easy to make implant. - materials = list(DEFAULT_WALL_MATERIAL = 7000, "glass" = 7000, "gold" = 2000, "diamond" = 3000) - build_path = /obj/item/weapon/implantcase/vrlanguage -*/ -/datum/design/item/implant/backup - name = "Backup implant" - id = "implant_backup" - req_tech = list(TECH_MATERIAL = 2, TECH_BIO = 2, TECH_DATA = 4, TECH_ENGINEERING = 2) - materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 2000) - build_path = /obj/item/weapon/implantcase/backup - -/datum/design/item/implant/sizecontrol - name = "Size control implant" - id = "implant_size" - req_tech = list(TECH_MATERIAL = 3, TECH_BIO = 4, TECH_DATA = 4, TECH_ENGINEERING = 3) - materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 2000, "silver" = 3000) - build_path = /obj/item/weapon/implanter/sizecontrol - sort_string = "TAAAA" - -/datum/design/item/weapon/sizegun - name = "Size gun" - id = "sizegun" - req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_POWER = 2) - materials = list(DEFAULT_WALL_MATERIAL = 3000, "glass" = 2000, "uranium" = 2000) - build_path = /obj/item/weapon/gun/energy/sizegun - sort_string = "TAAAB" - -/datum/design/item/bluespace_jumpsuit - name = "Bluespace jumpsuit" - id = "bsjumpsuit" - req_tech = list(TECH_BLUESPACE = 2, TECH_MATERIAL = 3, TECH_POWER = 2) - materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 4000) - build_path = /obj/item/clothing/under/bluespace - sort_string = "TAAAC" - -/datum/design/item/sleevemate - name = "SleeveMate 3700" - id = "sleevemate" - req_tech = list(TECH_MATERIAL = 3, TECH_MAGNET = 2, TECH_BIO = 2) - materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 4000) - build_path = /obj/item/device/sleevemate - sort_string = "TAAAD" - -/datum/design/item/bodysnatcher - name = "Body Snatcher" - id = "bodysnatcher" - req_tech = list(TECH_MAGNET = 3, TECH_BIO = 3, TECH_ILLEGAL = 2) - materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 4000) - build_path = /obj/item/device/bodysnatcher - -/datum/design/item/item/pressureinterlock - name = "APP pressure interlock" - id = "pressureinterlock" - req_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2, TECH_ENGINEERING = 2) - materials = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 250) - build_path = /obj/item/pressurelock - sort_string = "TAADA" - -/datum/design/item/weapon/advparticle - name = "Advanced anti-particle rifle" - id = "advparticle" - req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 5, TECH_POWER = 3, TECH_MAGNET = 3) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 1000, "gold" = 1000, "uranium" = 750) - build_path = /obj/item/weapon/gun/energy/particle/advanced - sort_string = "TAADB" - -/datum/design/item/weapon/particlecannon - name = "Anti-particle cannon" - id = "particlecannon" - req_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 5, TECH_POWER = 4, TECH_MAGNET = 4) - materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 1500, "gold" = 2000, "uranium" = 1000, "diamond" = 2000) - build_path = /obj/item/weapon/gun/energy/particle/cannon - sort_string = "TAADC" - -/datum/design/item/hud/omni - name = "AR glasses" - id = "omnihud" - req_tech = list(TECH_MAGNET = 4, TECH_COMBAT = 3, TECH_BIO = 3) - materials = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 1000) - build_path = /obj/item/clothing/glasses/omnihud - sort_string = "GAAFB" - -/datum/design/item/translocator - name = "Personal translocator" - id = "translocator" - req_tech = list(TECH_MAGNET = 5, TECH_BLUESPACE = 5, TECH_ILLEGAL = 6) - materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 2000, "uranium" = 4000, "diamond" = 2000) - build_path = /obj/item/device/perfect_tele - sort_string = "HABAF" - -/datum/design/item/nif - name = "nanite implant framework" - id = "nif" - req_tech = list(TECH_MAGNET = 5, TECH_BLUESPACE = 5, TECH_MATERIAL = 5, TECH_ENGINEERING = 5, TECH_DATA = 5) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 8000, "uranium" = 6000, "diamond" = 6000) - build_path = /obj/item/device/nif - sort_string = "HABBC" - -/datum/design/item/nifbio - name = "bioadaptive NIF" - id = "bioadapnif" - req_tech = list(TECH_MAGNET = 5, TECH_BLUESPACE = 5, TECH_MATERIAL = 5, TECH_ENGINEERING = 5, TECH_DATA = 5, TECH_BIO = 5) - materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 15000, "uranium" = 10000, "diamond" = 10000) - build_path = /obj/item/device/nif/bioadap - sort_string = "HABBD" //Changed String from HABBE to HABBD -//Addiing bioadaptive NIF to Protolathe - -/datum/design/item/nifrepairtool - name = "adv. NIF repair tool" - id = "anrt" - req_tech = list(TECH_MAGNET = 5, TECH_BLUESPACE = 5, TECH_MATERIAL = 5, TECH_ENGINEERING = 5, TECH_DATA = 5) - materials = list(DEFAULT_WALL_MATERIAL = 200, "glass" = 3000, "uranium" = 2000, "diamond" = 2000) - build_path = /obj/item/device/nifrepairer - sort_string = "HABBE" //Changed String from HABBD to HABBE - -// Resleeving Circuitboards - -/datum/design/circuit/transhuman_clonepod - name = "grower pod" - id = "transhuman_clonepod" - req_tech = list(TECH_DATA = 3, TECH_BIO = 3) - build_path = /obj/item/weapon/circuitboard/transhuman_clonepod - sort_string = "HAADA" - -/datum/design/circuit/transhuman_synthprinter - name = "SynthFab 3000" - id = "transhuman_synthprinter" - req_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 3) - build_path = /obj/item/weapon/circuitboard/transhuman_synthprinter - sort_string = "HAADB" - -/datum/design/circuit/transhuman_resleever - name = "Resleeving pod" - id = "transhuman_resleever" - req_tech = list(TECH_ENGINEERING = 4, TECH_BIO = 4) - build_path = /obj/item/weapon/circuitboard/transhuman_resleever - sort_string = "HAADC" - -/datum/design/circuit/resleeving_control - name = "Resleeving control console" - id = "resleeving_control" - req_tech = list(TECH_DATA = 5) - build_path = /obj/item/weapon/circuitboard/resleeving_control - sort_string = "HAADE" - -/datum/design/circuit/body_designer - name = "Body design console" - id = "body_designer" - req_tech = list(TECH_DATA = 5) - build_path = /obj/item/weapon/circuitboard/body_designer - sort_string = "HAADF" - -/datum/design/circuit/partslathe - name = "Parts lathe" - id = "partslathe" - req_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2) - build_path = /obj/item/weapon/circuitboard/partslathe - sort_string = "HABAD" - -/datum/design/item/weapon/netgun - name = "\'Hunter\' capture gun" - id = "netgun" - req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 5, TECH_MAGNET = 3) - materials = list(DEFAULT_WALL_MATERIAL = 6000, "glass" = 3000) - build_path = /obj/item/weapon/gun/energy/netgun - sort_string = "TAADF" - -/datum/design/circuit/algae_farm - name = "Algae Oxygen Generator" - id = "algae_farm" - req_tech = list(TECH_ENGINEERING = 3, TECH_BIO = 2) - build_path = /obj/item/weapon/circuitboard/algae_farm - sort_string = "HABAE" - -/datum/design/circuit/thermoregulator - name = "thermal regulator" - id = "thermoregulator" - req_tech = list(TECH_ENGINEERING = 4, TECH_POWER = 3) - build_path = /obj/item/weapon/circuitboard/thermoregulator - sort_string = "HABAF" - -/datum/design/circuit/bomb_tester - name = "Explosive Effect Simulator" - id = "bomb_tester" - req_tech = list(TECH_PHORON = 3, TECH_DATA = 2, TECH_MAGNET = 2) - build_path = /obj/item/weapon/circuitboard/bomb_tester - sort_string = "HABAG" - -/datum/design/circuit/quantum_pad - name = "Quantum Pad" - id = "quantum_pad" - req_tech = list(TECH_ENGINEERING = 4, TECH_POWER = 4, TECH_BLUESPACE = 4) - build_path = /obj/item/weapon/circuitboard/quantumpad - sort_string = "HABAH" - -//////Micro mech stuff -/datum/design/circuit/mecha/gopher_main - name = "'Gopher' central control" - id = "gopher_main" - build_path = /obj/item/weapon/circuitboard/mecha/gopher/main - sort_string = "NAAEA" - -/datum/design/circuit/mecha/gopher_peri - name = "'Gopher' peripherals control" - id = "gopher_peri" - build_path = /obj/item/weapon/circuitboard/mecha/gopher/peripherals - sort_string = "NAAEB" - -/datum/design/circuit/mecha/polecat_main - name = "'Polecat' central control" - id = "polecat_main" - req_tech = list(TECH_DATA = 4) - build_path = /obj/item/weapon/circuitboard/mecha/polecat/main - sort_string = "NAAFA" - -/datum/design/circuit/mecha/polecat_peri - name = "'Polecat' peripherals control" - id = "polecat_peri" - req_tech = list(TECH_DATA = 4) - build_path = /obj/item/weapon/circuitboard/mecha/polecat/peripherals - sort_string = "NAAFB" - -/datum/design/circuit/mecha/polecat_targ - name = "'Polecat' weapon control and targeting" - id = "polecat_targ" - req_tech = list(TECH_DATA = 4, TECH_COMBAT = 2) - build_path = /obj/item/weapon/circuitboard/mecha/polecat/targeting - sort_string = "NAAFC" - -/datum/design/circuit/mecha/weasel_main - name = "'Weasel' central control" - id = "weasel_main" - req_tech = list(TECH_DATA = 4) - build_path = /obj/item/weapon/circuitboard/mecha/weasel/main - sort_string = "NAAGA" - -/datum/design/circuit/mecha/weasel_peri - name = "'Weasel' peripherals control" - id = "weasel_peri" - req_tech = list(TECH_DATA = 4) - build_path = /obj/item/weapon/circuitboard/mecha/weasel/peripherals - sort_string = "NAAGB" - -/datum/design/circuit/mecha/weasel_targ - name = "'Weasel' weapon control and targeting" - id = "weasel_targ" - req_tech = list(TECH_DATA = 4, TECH_COMBAT = 2) - build_path = /obj/item/weapon/circuitboard/mecha/weasel/targeting - sort_string = "NAAGC" - -////// RIGSuit Stuff -/* -/datum/design/item/rig - req_tech = list(TECH_MATERIAL = 5, TECH_POWER = 5, TECH_MAGNET = 5) - materials = list(DEFAULT_WALL_MATERIAL = 6000, "glass" = 6000, "silver" = 6000, "uranium" = 4000) - -/datum/design/item/rig/eva - name = "eva hardsuit (empty)" - id = "eva_hardsuit" - build_path = /obj/item/weapon/rig/eva - sort_string = "HCAAA" - -/datum/design/item/rig/mining - name = "industrial hardsuit (empty)" - id = "ind_hardsuit" - build_path = /obj/item/weapon/rig/industrial - sort_string = "HCAAB" - -/datum/design/item/rig/research - name = "ami hardsuit (empty)" - id = "ami_hardsuit" - build_path = /obj/item/weapon/rig/hazmat - sort_string = "HCAAC" - -/datum/design/item/rig/medical - name = "medical hardsuit (empty)" - id = "med_hardsuit" - build_path = /obj/item/weapon/rig/medical - sort_string = "HCAAD" -*/ - -/datum/design/item/rig_module - req_tech = list(TECH_MATERIAL = 5, TECH_POWER = 5, TECH_MAGNET = 5) - materials = list(DEFAULT_WALL_MATERIAL = 6000, "glass" = 6000, "silver" = 4000, "uranium" = 2000) - -/datum/design/item/rig_module/plasma_cutter - name = "rig module - plasma cutter" - id = "rigmod_plasmacutter" - build_path = /obj/item/rig_module/device/plasmacutter - sort_string = "HCAAE" - -/datum/design/item/rig_module/diamond_drill - name = "rig module - diamond drill" - id = "rigmod_diamonddrill" - build_path = /obj/item/rig_module/device/drill - sort_string = "HCAAF" - -/datum/design/item/rig_module/maneuvering_jets - name = "rig module - maneuvering jets" - id = "rigmod_maneuveringjets" - build_path = /obj/item/rig_module/maneuvering_jets - sort_string = "HCAAG" - -/datum/design/item/rig_module/anomaly_scanner - name = "rig module - anomaly scanner" - id = "rigmod_anomalyscanner" - build_path = /obj/item/rig_module/device/anomaly_scanner - sort_string = "HCAAH" - -/datum/design/item/rig_module/orescanner - name = "rig module - ore scanner" - id = "rigmod_orescanner" - build_path = /obj/item/rig_module/device/orescanner - sort_string = "HCAAI" - -//Prosfab stuff for borgs and such - -/datum/design/item/robot_upgrade/sizeshift - name = "Size Alteration Module" - desc = "Used to allow robot to freely alter their size." - id = "borg_sizeshift_module" - req_tech = list(TECH_BLUESPACE = 3, TECH_MATERIAL = 3, TECH_POWER = 2) - materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 4000) - build_path = /obj/item/borg/upgrade/sizeshift \ No newline at end of file diff --git a/code/modules/research/mechfab_designs.dm b/code/modules/research/mechfab_designs.dm index 81e0f24da48..199acd42fbd 100644 --- a/code/modules/research/mechfab_designs.dm +++ b/code/modules/research/mechfab_designs.dm @@ -107,13 +107,13 @@ /datum/design/item/mechfab/gygax category = "Gygax" -//VOREStation Edit to make Serenity Constructable + /datum/design/item/mechfab/gygax/chassis/serenity name = "Serenity Chassis" id = "serenity_chassis" build_path = /obj/item/mecha_parts/chassis/serenity materials = list(DEFAULT_WALL_MATERIAL = 18750, "phoron" = 4000) - + /datum/design/item/mechfab/gygax/chassis name = "Gygax Chassis" id = "gygax_chassis" @@ -664,6 +664,14 @@ materials = list(DEFAULT_WALL_MATERIAL = 7500, "silver" = 375, "glass" = 750) build_path = /obj/item/mecha_parts/mecha_equipment/generator/nuclear +/datum/design/item/mecha/speedboost_ripley + name = "Ripley Leg Actuator Overdrive" + desc = "System enhancements and overdrives to make a mech's legs move faster." + id = "mech_speedboost_ripley" + req_tech = list( TECH_POWER = 5, TECH_MATERIAL = 4, TECH_ENGINEERING = 4) + materials = list(DEFAULT_WALL_MATERIAL = 10000, "silver" = 1000, "gold" = 1000) + build_path = /obj/item/mecha_parts/mecha_equipment/speedboost + /datum/design/item/synthetic_flash name = "Synthetic Flash" id = "sflash" diff --git a/code/modules/research/prosfab_designs_vr.dm b/code/modules/research/prosfab_designs_vr.dm new file mode 100644 index 00000000000..02f39bd3075 --- /dev/null +++ b/code/modules/research/prosfab_designs_vr.dm @@ -0,0 +1,8 @@ +//Prosfab stuff for borgs and such + +/datum/design/item/prosfab/robot_upgrade/sizeshift + name = "Size Alteration Module" + id = "borg_sizeshift_module" + req_tech = list(TECH_BLUESPACE = 3, TECH_MATERIAL = 3, TECH_POWER = 2) + materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 4000) + build_path = /obj/item/borg/upgrade/sizeshift \ No newline at end of file diff --git a/code/modules/research/rigs_vr.dm b/code/modules/research/rigs_vr.dm new file mode 100644 index 00000000000..24c02d3fdd1 --- /dev/null +++ b/code/modules/research/rigs_vr.dm @@ -0,0 +1,123 @@ +/* + O - rigsuit stuff + OA - rigs themselves + OB - rig modules + OBAA - general purpose + OBAB - mining + OBAC - medical + OBAD - sec/combat + OBAE - engineering/maintenance/cleaning +*/ + + +////// RIGSuit Stuff +/* +/datum/design/item/rig + req_tech = list(TECH_MATERIAL = 5, TECH_POWER = 5, TECH_MAGNET = 5) + materials = list(DEFAULT_WALL_MATERIAL = 6000, "glass" = 6000, "silver" = 6000, "uranium" = 4000) + +/datum/design/item/rig/AssembleDesignName() + ..() + name = "hardsuit prototype ([name])" + +/datum/design/item/rig/eva + name = "eva hardsuit (empty)" + id = "eva_hardsuit" + build_path = /obj/item/weapon/rig/eva + sort_string = "OAAAA" + +/datum/design/item/rig/mining + name = "industrial hardsuit (empty)" + id = "ind_hardsuit" + build_path = /obj/item/weapon/rig/industrial + sort_string = "OAAAB" + +/datum/design/item/rig/research + name = "ami hardsuit (empty)" + id = "ami_hardsuit" + build_path = /obj/item/weapon/rig/hazmat + sort_string = "OAAAC" + +/datum/design/item/rig/medical + name = "medical hardsuit (empty)" + id = "med_hardsuit" + build_path = /obj/item/weapon/rig/medical + sort_string = "OAAAD" +*/ + +/datum/design/item/rig_module + req_tech = list(TECH_MATERIAL = 5, TECH_POWER = 5, TECH_MAGNET = 5) + materials = list(DEFAULT_WALL_MATERIAL = 6000, "glass" = 6000, "silver" = 4000, "uranium" = 2000) + +/datum/design/item/rig_module/AssembleDesignName() + ..() + name = "rig module prototype ([name])" + +/datum/design/item/rig_module/maneuvering_jets + name = "maneuvering jets" + id = "rigmod_maneuveringjets" + build_path = /obj/item/rig_module/maneuvering_jets + sort_string = "OBAAA" + +/datum/design/item/rig_module/sprinter + name = "sprinter" + id = "rigmod_sprinter" + build_path = /obj/item/rig_module/sprinter + sort_string = "OBAAB" + +/datum/design/item/rig_module/plasma_cutter + name = "plasma cutter" + id = "rigmod_plasmacutter" + build_path = /obj/item/rig_module/device/plasmacutter + sort_string = "OBABA" + +/datum/design/item/rig_module/diamond_drill + name = "diamond drill" + id = "rigmod_diamonddrill" + build_path = /obj/item/rig_module/device/drill + sort_string = "OBABB" + +/datum/design/item/rig_module/anomaly_scanner + name = "anomaly scanner" + id = "rigmod_anomalyscanner" + build_path = /obj/item/rig_module/device/anomaly_scanner + sort_string = "OBABC" + +/datum/design/item/rig_module/orescanner + name = "ore scanner" + id = "rigmod_orescanner" + build_path = /obj/item/rig_module/device/orescanner + sort_string = "OBABD" + +/datum/design/item/rig_module/rescue_pharm + name = "rescue pharm" + id = "rigmod_rescue_pharm" + build_path = /obj/item/rig_module/rescue_pharm + sort_string = "OBACA" + +/datum/design/item/rig_module/lasercannon + name = "laser cannon" + id = "rigmod_lasercannon" + build_path = /obj/item/rig_module/mounted + materials = list(DEFAULT_WALL_MATERIAL = 6000, "glass" = 6000, "silver" = 4000, "uranium" = 2000, "diamond" = 2000) + sort_string = "OBADA" + +/datum/design/item/rig_module/egun + name = "energy gun" + id = "rigmod_egun" + build_path = /obj/item/rig_module/mounted/egun + materials = list(DEFAULT_WALL_MATERIAL = 6000, "glass" = 6000, "silver" = 4000, "uranium" = 2000, "diamond" = 1000) + sort_string = "OBADB" + +/datum/design/item/rig_module/taser + name = "taser" + id = "rigmod_taser" + build_path = /obj/item/rig_module/mounted/taser + sort_string = "OBADC" + +/datum/design/item/rig_module/rcd + name = "rcd" + id = "rigmod_rcd" + build_path = /obj/item/rig_module/device/rcd + materials = list(DEFAULT_WALL_MATERIAL = 6000, "glass" = 6000, "silver" = 4000, "uranium" = 2000, "diamond" = 2000) + sort_string = "OBAEA" \ No newline at end of file diff --git a/code/modules/research/teleport_vr.dm b/code/modules/research/teleport_vr.dm new file mode 100644 index 00000000000..5437e96bdd1 --- /dev/null +++ b/code/modules/research/teleport_vr.dm @@ -0,0 +1,23 @@ +/* + P - teleporteing item stuff +*/ + +/datum/design/item/teleport/AssembleDesignName() + ..() + name = "Teleportation device prototype ([item_name])" + +/datum/design/item/teleport/translocator + name = "Personal translocator" + id = "translocator" + req_tech = list(TECH_MAGNET = 5, TECH_BLUESPACE = 5, TECH_ILLEGAL = 6) + materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 2000, "uranium" = 4000, "diamond" = 2000) + build_path = /obj/item/device/perfect_tele + sort_string = "PAAAA" + +/datum/design/item/teleport/bluespace_crystal + name = "Artificial Bluespace Crystal" + id = "bluespace_crystal" + req_tech = list(TECH_BLUESPACE = 3, TECH_PHORON = 4) + materials = list("diamond" = 1500, "phoron" = 1500) + build_path = /obj/item/weapon/ore/bluespace_crystal/artificial + sort_string = "PAAAB" \ No newline at end of file diff --git a/code/modules/shieldgen/energy_field.dm b/code/modules/shieldgen/energy_field.dm index 65eb6dc363e..5b7d7f2118b 100644 --- a/code/modules/shieldgen/energy_field.dm +++ b/code/modules/shieldgen/energy_field.dm @@ -60,6 +60,9 @@ user.do_attack_animation(src) user.setClickCooldown(user.get_attack_speed()) +/obj/effect/energy_field/take_damage(var/damage) + adjust_strength(-damage / 20) + /obj/effect/energy_field/attack_hand(var/mob/living/user) impact_effect(3) // Harmless, but still produces the 'impact' effect. ..() diff --git a/code/modules/surgery/external_repair.dm b/code/modules/surgery/external_repair.dm index b26d803b343..4ed2d96c1a5 100644 --- a/code/modules/surgery/external_repair.dm +++ b/code/modules/surgery/external_repair.dm @@ -9,8 +9,10 @@ req_open = 1 /datum/surgery_step/repairflesh/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - if (target.stat == DEAD) // Sorry defibs, your subjects need to have pumping fluids for these to work. - return 0 +/* VOREStation Removal for Mlem Reasons(TM) + if (target.stat == DEAD) // Sorry defibs, your subjects need to have pumping fluids for these to work. + return 0 +*/ if (isslime(target)) return 0 if (target_zone == O_EYES || target_zone == O_MOUTH) @@ -34,7 +36,6 @@ /datum/surgery_step/repairflesh/scan_injury allowed_tools = list( /obj/item/weapon/autopsy_scanner = 100, - /obj/item/device/healthanalyzer = 80, /obj/item/device/analyzer = 10 ) @@ -85,8 +86,6 @@ /datum/surgery_step/repairflesh/repair_burns allowed_tools = list( /obj/item/stack/medical/advanced/ointment = 100, - /obj/item/weapon/surgical/FixOVein = 100, - /obj/item/weapon/surgical/hemostat = 60, /obj/item/stack/medical/ointment = 50, /obj/item/weapon/tape_roll = 30, /obj/item/taperoll = 10 @@ -153,8 +152,6 @@ /datum/surgery_step/repairflesh/repair_brute allowed_tools = list( /obj/item/stack/medical/advanced/bruise_pack = 100, - /obj/item/weapon/surgical/cautery = 100, - /obj/item/weapon/surgical/bonesetter = 60, /obj/item/stack/medical/bruise_pack = 50, /obj/item/weapon/tape_roll = 40, /obj/item/taperoll = 10 diff --git a/code/modules/surgery/neck.dm b/code/modules/surgery/neck.dm index 5b1522d60c2..ec9803309f0 100644 --- a/code/modules/surgery/neck.dm +++ b/code/modules/surgery/neck.dm @@ -24,7 +24,6 @@ priority = 1 allowed_tools = list( /obj/item/weapon/surgical/FixOVein = 100, - /obj/item/stack/nanopaste = 50, /obj/item/stack/cable_coil = 40, /obj/item/device/assembly/mousetrap = 5) diff --git a/code/modules/tables/presets.dm b/code/modules/tables/presets.dm index 06fca651383..085489b26a4 100644 --- a/code/modules/tables/presets.dm +++ b/code/modules/tables/presets.dm @@ -58,6 +58,23 @@ material = get_material_by_name("wood") ..() +/obj/structure/table/sifwoodentable + icon_state = "plain_preview" + color = "#824B28" + +/obj/structure/table/sifwoodentable/New() + material = get_material_by_name("alien wood") + ..() + +/obj/structure/table/sifwooden_reinforced + icon_state = "reinf_preview" + color = "#824B28" + +/obj/structure/table/sifwooden_reinforced/New() + material = get_material_by_name("alien wood") + reinforced = get_material_by_name(DEFAULT_WALL_MATERIAL) + ..() + /obj/structure/table/gamblingtable icon_state = "gamble_preview" @@ -75,6 +92,15 @@ material = get_material_by_name("glass") ..() +/obj/structure/table/borosilicate + icon_state = "plain_preview" + color = "#4D3EAC" + alpha = 77 + +/obj/structure/table/borosilicate/New() + material = get_material_by_name("borosilicate glass") + ..() + /obj/structure/table/holotable icon_state = "holo_preview" color = "#EEEEEE" @@ -168,6 +194,18 @@ material = get_material_by_name("wood") ..() +/obj/structure/table/bench/sifwooden + icon_state = "plain_preview" + color = "#824B28" + +/obj/structure/table/bench/sifwooden/New() + material = get_material_by_name("alien wood") + ..() + +/obj/structure/table/bench/sifwooden/padded + icon_state = "padded_preview" + carpeted = 1 + /obj/structure/table/bench/padded icon_state = "padded_preview" diff --git a/code/modules/tables/tables.dm b/code/modules/tables/tables.dm index 514c3b20362..c5b7bde70e7 100644 --- a/code/modules/tables/tables.dm +++ b/code/modules/tables/tables.dm @@ -44,7 +44,7 @@ var/list/table_icon_cache = list() health += maxhealth - old_maxhealth -/obj/structure/table/proc/take_damage(amount) +/obj/structure/table/take_damage(amount) // If the table is made of a brittle material, and is *not* reinforced with a non-brittle material, damage is multiplied by TABLE_BRITTLE_MATERIAL_MULTIPLIER if(material && material.is_brittle()) if(reinforced) diff --git a/code/modules/telesci/construction.dm b/code/modules/telesci/construction.dm index 9fc487f0580..6fee75ab1b1 100644 --- a/code/modules/telesci/construction.dm +++ b/code/modules/telesci/construction.dm @@ -30,43 +30,4 @@ /obj/item/weapon/ore/bluespace_crystal = 1, /obj/item/weapon/stock_parts/capacitor = 1, /obj/item/weapon/stock_parts/manipulator = 1, - /obj/item/stack/cable_coil = 5) - -// The Designs - -/datum/design/circuit/telesci_console - name = "Telepad Control Console" - id = "telesci_console" - req_tech = list(TECH_DATA = 3, TECH_BLUESPACE = 3, TECH_PHORON = 4) - build_path = /obj/item/weapon/circuitboard/telesci_console - sort_string = "HAAEA" - -/datum/design/circuit/telesci_pad - name = "Telepad" - id = "telesci_pad" - req_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 4, TECH_PHORON = 4, TECH_BLUESPACE = 5) - build_path = /obj/item/weapon/circuitboard/telesci_pad - sort_string = "HAAEB" -/* Normal GPS has all the fancy features now -/datum/design/item/telesci_gps - name = "GPS device" - id = "telesci_gps" - req_tech = list(TECH_MATERIAL = 2, TECH_BLUESPACE = 2) - materials = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 1000) - build_path = /obj/item/device/gps/advanced - sort_string = "HAAEB" -*/ -/datum/design/circuit/quantum_pad - name = "Quantum Pad" - id = "quantum_pad" - req_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 4, TECH_PHORON = 4, TECH_BLUESPACE = 5) - build_path = /obj/item/weapon/circuitboard/quantumpad - sort_string = "HAAC" - -/datum/design/item/bluespace_crystal - name = "Artificial Bluespace Crystal" - id = "bluespace_crystal" - req_tech = list(TECH_BLUESPACE = 3, TECH_PHORON = 4) - materials = list("diamond" = 1500, "phoron" = 1500) - build_path = /obj/item/weapon/ore/bluespace_crystal/artificial - sort_string = "HAAED" \ No newline at end of file + /obj/item/stack/cable_coil = 5) \ No newline at end of file diff --git a/code/modules/tension/tension.dm b/code/modules/tension/tension.dm index 82151a7e78f..841d6910377 100644 --- a/code/modules/tension/tension.dm +++ b/code/modules/tension/tension.dm @@ -69,7 +69,7 @@ var/friendly = threatened.faction == faction - var/threat = guess_threat_level() + var/threat = guess_threat_level(threatened) // Hurt entities contribute less tension. threat *= health @@ -99,7 +99,120 @@ return threat +// Carbon / mostly Human threat check. +/mob/living/carbon/get_threat(var/mob/living/threatened) + . = ..() + if(has_AI()) + if(!ai_holder.hostile) + return 0 + + if(incapacitated(INCAPACITATION_DISABLED)) + return 0 + + var/friendly = (IIsAlly(threatened) && a_intent == I_HELP) + + var/threat = guess_threat_level(threatened) + + threat *= health + threat /= getMaxHealth() + + // Allies reduce tension instead of adding. + if(friendly) + threat = -threat + + else + if(threatened.invisibility > see_invisible) + threat /= 2 // Target cannot be seen by src. + if(invisibility > threatened.see_invisible) + threat *= 2 // Target cannot see src. + + // Handle statuses. + if(confused) + threat /= 2 + + if(has_modifier_of_type(/datum/modifier/berserk)) + threat *= 2 + + return threat + +/mob/living/carbon/guess_threat_level(var/mob/living/threatened) + var/threat_guess = 0 + + // First lets consider their attack ability. + var/will_point_blank = FALSE + if(has_AI()) + will_point_blank = ai_holder.pointblank + + . = ..() + + var/obj/item/I = get_active_hand() + if(!I || !istype(I)) + var/damage_guess = 0 + if(ishuman(src) && ishuman(threatened)) + var/mob/living/carbon/human/H = src + var/datum/unarmed_attack/attack = H.get_unarmed_attack(threatened, BP_TORSO) + if(!attack) + damage_guess += 5 + + var/punch_damage = attack.get_unarmed_damage(H) + if(H.gloves) + if(istype(H.gloves, /obj/item/clothing/gloves)) + var/obj/item/clothing/gloves/G = H.gloves + punch_damage += G.punch_force + + damage_guess += punch_damage + + else + damage_guess += 5 + + for(var/datum/modifier/M in modifiers) + if(!isnull(M.outgoing_melee_damage_percent)) + damage_guess *= M.outgoing_melee_damage_percent + + threat_guess += damage_guess + + else + var/weapon_attack_speed = get_attack_speed(I) / (1 SECOND) + var/weapon_damage = I.force + + for(var/datum/modifier/M in modifiers) + if(!isnull(M.outgoing_melee_damage_percent)) + weapon_damage *= M.outgoing_melee_damage_percent + + if(istype(I, /obj/item/weapon/gun)) + will_point_blank = TRUE + var/obj/item/weapon/gun/G = I + var/obj/item/projectile/P + + P = new G.projectile_type() + + if(P) // Does the gun even have a projectile type? + weapon_damage = P.damage + if(will_point_blank && a_intent == I_HURT) + weapon_damage *= 1.5 + weapon_attack_speed = G.fire_delay / (1 SECOND) + qdel(P) + + var/average_damage = weapon_damage / weapon_attack_speed + + threat_guess += average_damage + + // Consider intent. + switch(a_intent) + if(I_HELP) // Not likely to fight us. + threat_guess *= 0.4 + if(I_DISARM) // Might engage us, but unlikely to be with the intent to kill. + threat_guess *= 0.8 + if(I_GRAB) // May try to restrain us. This is here for reference, or later tweaking if needed. + threat_guess *= 1 + if(I_HURT) // May try to hurt us. + threat_guess *= 1.25 + + // Then consider their defense. + threat_guess += getMaxHealth() / 5 // 100 health translates to 20 threat. + + return threat_guess // Gives a rough idea of how much danger someone is in. Meant to be used for PvE things since PvP has too many unknown variables. /mob/living/proc/get_tension() diff --git a/code/modules/vehicles/cargo_train.dm b/code/modules/vehicles/cargo_train.dm index 45cbcd7a13b..46e838d37a2 100644 --- a/code/modules/vehicles/cargo_train.dm +++ b/code/modules/vehicles/cargo_train.dm @@ -1,7 +1,7 @@ /obj/vehicle/train/engine name = "cargo train tug" desc = "A ridable electric car designed for pulling cargo trolleys." - icon = 'icons/obj/vehicles.dmi' + icon = 'icons/obj/vehicles_vr.dmi' //VOREStation Edit icon_state = "cargo_engine" on = 0 powered = 1 @@ -26,7 +26,7 @@ /obj/vehicle/train/trolley name = "cargo train trolley" - icon = 'icons/obj/vehicles.dmi' + icon = 'icons/obj/vehicles_vr.dmi' //VOREStation Edit icon_state = "cargo_trailer" anchored = 0 passenger_allowed = 0 @@ -34,7 +34,7 @@ load_item_visible = 1 load_offset_x = 0 - load_offset_y = 4 + load_offset_y = 7 //VOREStation Edit mob_offset_y = 8 //------------------------------------------- @@ -44,7 +44,7 @@ ..() cell = new /obj/item/weapon/cell/high(src) key = new key_type(src) - var/image/I = new(icon = 'icons/obj/vehicles.dmi', icon_state = "cargo_engine_overlay", layer = src.layer + 0.2) //over mobs + var/image/I = new(icon = 'icons/obj/vehicles_vr.dmi', icon_state = "cargo_engine_overlay", layer = src.layer + 0.2) //over mobs //VOREStation edit overlays += I turn_off() //so engine verbs are correctly set @@ -374,3 +374,17 @@ anchored = 0 else anchored = 1 + +// VOREStation Edit Start - Overlay stuff for the chair-like effect +/obj/vehicle/train/engine/update_icon() + ..() + overlays = null + var/image/O = image(icon = 'icons/obj/vehicles_vr.dmi', icon_state = "cargo_engine_overlay", dir = src.dir) + O.layer = FLY_LAYER + O.plane = MOB_PLANE + overlays += O + +/obj/vehicle/train/engine/set_dir() + ..() + update_icon() +// VOREStation Edit End - Overlay stuff for the chair-like effect diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm index 606735f36f3..87a1b72466a 100644 --- a/code/modules/vehicles/vehicle.dm +++ b/code/modules/vehicles/vehicle.dm @@ -424,3 +424,12 @@ new /obj/effect/decal/cleanable/blood/oil(src.loc) spawn(1) healthcheck() return 1 + +/obj/vehicle/take_damage(var/damage) + if(!damage) + return + src.health -= damage + if(mechanical && prob(10)) + new /obj/effect/decal/cleanable/blood/oil(src.loc) + spawn(1) healthcheck() + return 1 diff --git a/code/modules/vore/appearance/sprite_accessories_taur_vr.dm b/code/modules/vore/appearance/sprite_accessories_taur_vr.dm index 301d0841be6..d4fd1f13dcf 100644 --- a/code/modules/vore/appearance/sprite_accessories_taur_vr.dm +++ b/code/modules/vore/appearance/sprite_accessories_taur_vr.dm @@ -153,12 +153,18 @@ //Messages for smalls moving under larges var/msg_owner_stepunder = "%owner runs between your legs." //Weird becuase in the case this is used, %owner is the 'bumper' (src) var/msg_prey_stepunder = "You run between %prey's legs." //Same, inverse + hide_body_parts = list(BP_L_LEG, BP_L_FOOT, BP_R_LEG, BP_R_FOOT) //Exclude pelvis just in case. + clip_mask_icon = 'icons/mob/vore/taurs_vr.dmi' + clip_mask_state = "taur_clip_mask_def" //Used to clip off the lower part of suits & uniforms. /datum/sprite_accessory/tail/taur/roiz_long_lizard // Not ACTUALLY a taur, but it uses 32x64 so it wouldn't fit in tails.dmi, and having it as a tail bugs up the sprite. name = "Long Lizard Tail (Roiz Lizden)" icon_state = "roiz_tail_s" do_colouration = 0 ckeys_allowed = list("spoopylizz") + hide_body_parts = null + clip_mask_icon = null + clip_mask_state = null /datum/sprite_accessory/tail/taur/wolf name = "Wolf (Taur)" @@ -438,6 +444,7 @@ ckeys_allowed = list("natje") do_colouration = 0 can_ride = 0 + clip_mask_state = "taur_clip_mask_alraune" msg_prey_stepunder = "You run between %prey's vines." @@ -468,4 +475,26 @@ ckeys_allowed = null do_colouration = 1 extra_overlay = "alraunecolor_markings" - extra_overlay_w = "alraunecolor_closed_markings" \ No newline at end of file + extra_overlay_w = "alraunecolor_closed_markings" + clip_mask_state = "taur_clip_mask_alraune" + +/datum/sprite_accessory/tail/taur/wasp + name = "Wasp (dual color)" + icon_state = "wasp_s" + extra_overlay = "wasp_markings" + clip_mask_state = "taur_clip_mask_wasp" + + msg_owner_disarm_run = "You quickly push %prey to the ground with your leg!" + msg_prey_disarm_run = "%owner pushes you down to the ground with their leg!" + + msg_owner_disarm_walk = "You firmly push your leg down on %prey, painfully but harmlessly pinning them to the ground!" + msg_prey_disarm_walk = "%owner firmly pushes their leg down on you, quite painfully but harmlessly pinning you to the ground!" + + msg_owner_harm_walk = "You methodically place your leg down upon %prey's body, slowly applying pressure, crushing them against the floor!" + msg_prey_harm_walk = "%owner methodically places their leg upon your body, slowly applying pressure, crushing you against the floor!" + + msg_owner_grab_success = "You pin %prey down on the ground with your front leg before using your other leg to pick them up, trapping them between two of your front legs!" + msg_prey_grab_success = "%owner pins you down on the ground with their front leg before using their other leg to pick you up, trapping you between two of their front legs!" + + msg_owner_grab_fail = "You step down onto %prey, squishing them and forcing them down to the ground!" + msg_prey_grab_fail = "%owner steps down and squishes you with their leg, forcing you down to the ground!" diff --git a/code/modules/vore/appearance/sprite_accessories_vr.dm b/code/modules/vore/appearance/sprite_accessories_vr.dm index 50b8d763a2f..1298155cdde 100644 --- a/code/modules/vore/appearance/sprite_accessories_vr.dm +++ b/code/modules/vore/appearance/sprite_accessories_vr.dm @@ -653,6 +653,9 @@ var/desc = "You should not see this..." var/ani_state // State when wagging/animated var/extra_overlay_w // Wagging state for extra overlay + var/list/hide_body_parts = list() //Uses organ tag defines. Bodyparts in this list do not have their icons rendered, allowing for more spriter freedom when doing taur/digitigrade stuff. + var/icon/clip_mask_icon = null //Icon file used for clip mask. + var/clip_mask_state = null //Icon state to generate clip mask. Clip mask is used to 'clip' off the lower part of clothing such as jumpsuits & full suits. /datum/sprite_accessory/tail/invisible name = "hide species-sprite tail" @@ -950,6 +953,9 @@ icon_state = "satyr" color_blend_mode = ICON_MULTIPLY do_colouration = 1 + hide_body_parts = list(BP_L_LEG, BP_L_FOOT, BP_R_LEG, BP_R_FOOT) //Exclude pelvis just in case. + clip_mask_icon = 'icons/mob/vore/taurs_vr.dmi' + clip_mask_state = "taur_clip_mask_def" //Used to clip off the lower part of suits & uniforms. /datum/sprite_accessory/tail/tailmaw name = "tailmaw, colorable" diff --git a/code/modules/vore/eating/belly_obj_vr.dm b/code/modules/vore/eating/belly_obj_vr.dm index 6547aacd23f..227e29f822e 100644 --- a/code/modules/vore/eating/belly_obj_vr.dm +++ b/code/modules/vore/eating/belly_obj_vr.dm @@ -20,25 +20,28 @@ var/emote_time = 60 SECONDS // How long between stomach emotes at prey var/digest_brute = 2 // Brute damage per tick in digestion mode var/digest_burn = 2 // Burn damage per tick in digestion mode - var/immutable = 0 // Prevents this belly from being deleted - var/escapable = 0 // Belly can be resisted out of at any time + var/immutable = FALSE // Prevents this belly from being deleted + var/escapable = FALSE // Belly can be resisted out of at any time var/escapetime = 60 SECONDS // Deciseconds, how long to escape this belly var/digestchance = 0 // % Chance of stomach beginning to digest if prey struggles var/absorbchance = 0 // % Chance of stomach beginning to absorb if prey struggles var/escapechance = 0 // % Chance of prey beginning to escape if prey struggles. var/transferchance = 0 // % Chance of prey being - var/can_taste = 0 // If this belly prints the flavor of prey when it eats someone. + var/can_taste = FALSE // If this belly prints the flavor of prey when it eats someone. var/bulge_size = 0.25 // The minimum size the prey has to be in order to show up on examine. var/shrink_grow_size = 1 // This horribly named variable determines the minimum/maximum size it will shrink/grow prey to. var/transferlocation // Location that the prey is released if they struggle and get dropped off. - var/release_sound = TRUE // Boolean for now, maybe replace with something else later + var/release_sound = "Splatter" // Sound for letting someone out. Replaced from True/false var/mode_flags = 0 // Stripping, numbing, etc. + var/fancy_vore = FALSE // Using the new sounds? + var/is_wet = TRUE // Is this belly's insides made of slimy parts? + var/wet_loop = TRUE // Does the belly have a fleshy loop playing? //I don't think we've ever altered these lists. making them static until someone actually overrides them somewhere. //Actual full digest modes var/tmp/static/list/digest_modes = list(DM_HOLD,DM_DIGEST,DM_ABSORB,DM_DRAIN,DM_UNABSORB,DM_HEAL,DM_SHRINK,DM_GROW,DM_SIZE_STEAL) //Digest mode addon flags - var/tmp/static/list/mode_flag_list = list("Numbing" = DM_FLAG_NUMBING, "Stripping" = DM_FLAG_STRIPPING, "Leave Remains" = DM_FLAG_LEAVEREMAINS) + var/tmp/static/list/mode_flag_list = list("Numbing" = DM_FLAG_NUMBING, "Stripping" = DM_FLAG_STRIPPING, "Leave Remains" = DM_FLAG_LEAVEREMAINS, "Muffles" = DM_FLAG_THICKBELLY) //Transformation modes var/tmp/static/list/transform_modes = list(DM_TRANSFORM_MALE,DM_TRANSFORM_FEMALE,DM_TRANSFORM_KEEP_GENDER,DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR,DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG,DM_TRANSFORM_REPLICA,DM_TRANSFORM_REPLICA_EGG,DM_TRANSFORM_KEEP_GENDER_EGG,DM_TRANSFORM_MALE_EGG,DM_TRANSFORM_FEMALE_EGG, DM_EGG) //Item related modes @@ -147,7 +150,11 @@ "item_digest_mode", "contaminates", "contamination_flavor", - "contamination_color" + "contamination_color", + "release_sound", + "fancy_vore", + "is_wet", + "wet_loop" ) /obj/belly/New(var/newloc) @@ -175,7 +182,11 @@ //Sound w/ antispam flag setting if(vore_sound && !recent_sound) - var/soundfile = vore_sounds[vore_sound] + var/soundfile + if(!fancy_vore) + soundfile = classic_vore_sounds[vore_sound] + else + soundfile = fancy_vore_sounds[vore_sound] if(soundfile) playsound(src, soundfile, vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/eating_noises) recent_sound = TRUE @@ -196,7 +207,7 @@ //Don't bother if we don't have contents if(!contents.len) - return 0 + return FALSE //Find where we should drop things into (certainly not the owner) var/count = 0 @@ -218,8 +229,13 @@ //Print notifications/sound if necessary if(!silent) owner.visible_message("[owner] expels everything from their [lowertext(name)]!") - if(release_sound) - playsound(src, 'sound/effects/splat.ogg', vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/eating_noises) + var/soundfile + if(!fancy_vore) + soundfile = classic_release_sounds[release_sound] + else + soundfile = fancy_release_sounds[release_sound] + if(soundfile) + playsound(src, soundfile, vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/eating_noises) return count @@ -232,12 +248,17 @@ //Place them into our drop_location M.forceMove(drop_location()) + items_preserved -= M //Special treatment for absorbed prey - if(istype(M,/mob/living)) + if(isliving(M)) var/mob/living/ML = M var/mob/living/OW = owner + if(ML.client) + ML.stop_sound_channel(CHANNEL_PREYLOOP) //Stop the internal loop, it'll restart if the isbelly check on next tick anyway + if(ML.muffled) + ML.muffled = 0 if(ML.absorbed) ML.absorbed = FALSE if(ishuman(M) && ishuman(OW)) @@ -256,8 +277,13 @@ //Print notifications/sound if necessary if(!silent) owner.visible_message("[owner] expels [M] from their [lowertext(name)]!") - if(release_sound) - playsound(src, 'sound/effects/splat.ogg', vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/eating_noises) + var/soundfile + if(!fancy_vore) + soundfile = classic_release_sounds[release_sound] + else + soundfile = fancy_release_sounds[release_sound] + if(soundfile) + playsound(src, soundfile, vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/eating_noises) return 1 @@ -401,6 +427,8 @@ else if(M.reagents) M.reagents.trans_to_holder(Pred.bloodstr, M.reagents.total_volume, 0.5, TRUE) + //Incase they have the loop going, let's double check to stop it. + M.stop_sound_channel(CHANNEL_PREYLOOP) // Delete the digested mob qdel(M) @@ -513,9 +541,17 @@ M.show_message(struggle_outer_message, 2) // hearable to_chat(R,struggle_user_message) - var/strpick = pick(struggle_sounds) - var/strsound = struggle_sounds[strpick] - playsound(src, strsound, vary = 1, vol = 100, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/digestion_noises) + var/sound/struggle_snuggle + var/sound/struggle_rustle = sound(get_sfx("rustle")) + + if(is_wet) + if(!fancy_vore) + struggle_snuggle = sound(get_sfx("classic_struggle_sounds")) + else + struggle_snuggle = sound(get_sfx("fancy_prey_struggle")) + playsound(src, struggle_snuggle, vary = 1, vol = 75, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/digestion_noises) + else + playsound(src, struggle_rustle, vary = 1, vol = 75, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/digestion_noises) if(escapable) //If the stomach has escapable enabled. if(prob(escapechance)) //Let's have it check to see if the prey escapes first. @@ -599,7 +635,11 @@ I.gurgle_contaminate(target.contents, target.contamination_flavor, target.contamination_color) items_preserved -= content if(!silent && target.vore_sound && !recent_sound) - var/soundfile = vore_sounds[target.vore_sound] + var/soundfile + if(!fancy_vore) + soundfile = classic_vore_sounds[target.vore_sound] + else + soundfile = fancy_vore_sounds[target.vore_sound] if(soundfile) playsound(src, soundfile, vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/digestion_noises) owner.updateVRPanel() @@ -637,6 +677,10 @@ dupe.contaminates = contaminates dupe.contamination_flavor = contamination_flavor dupe.contamination_color = contamination_color + dupe.release_sound = release_sound + dupe.fancy_vore = fancy_vore + dupe.is_wet = is_wet + dupe.wet_loop = wet_loop //// Object-holding variables //struggle_messages_outside - strings diff --git a/code/modules/vore/eating/bellymodes_vr.dm b/code/modules/vore/eating/bellymodes_vr.dm index 886ca5830c0..f66edcbf80c 100644 --- a/code/modules/vore/eating/bellymodes_vr.dm +++ b/code/modules/vore/eating/bellymodes_vr.dm @@ -24,6 +24,35 @@ if(M.digestable || digest_mode != DM_DIGEST) // don't give digesty messages to indigestible people to_chat(M,"[pick(EL)]") +///////////////////// Prey Loop Refresh/hack ////////////////////// + for(var/mob/living/M in contents) + M.stop_sound_channel(CHANNEL_PREYLOOP) // sanity just in case, because byond is whack and you can't trust it + if(isbelly(M.loc)) //sanity check + if(world.time > M.next_preyloop) //We don't want it to overlap, but we also want it to replay. + if(is_wet && wet_loop) // Is it a fleshy environment, and does the pred have a fleshy heartbeat loop to play? + if(!M.client) + continue + if(M.is_preference_enabled(/datum/client_preference/digestion_noises)) //then we check if the mob has sounds enabled at all + var/sound/preyloop = sound('sound/vore/sunesound/prey/loop.ogg') + M.playsound_local(get_turf(src),preyloop, 80,0, channel = CHANNEL_PREYLOOP) + M.next_preyloop = (world.time + 52 SECONDS) + +/////////////////////////// Sound Selections /////////////////////////// + var/sound/prey_digest + var/sound/prey_death + var/sound/pred_digest + var/sound/pred_death + if(!fancy_vore) + prey_digest = sound(get_sfx("classic_digestion_sounds")) + prey_death = sound(get_sfx("classic_death_sounds")) + pred_digest = sound(get_sfx("classic_digestion_sounds")) + pred_death = sound(get_sfx("classic_death_sounds")) + else + prey_digest = sound(get_sfx("fancy_digest_prey")) + prey_death = sound(get_sfx("fancy_death_prey")) + pred_digest = sound(get_sfx("fancy_digest_pred")) + pred_death = sound(get_sfx("fancy_death_pred")) + /////////////////////////// Exit Early //////////////////////////// var/list/touchable_atoms = contents - items_preserved if(!length(touchable_atoms)) @@ -47,7 +76,7 @@ else items_preserved |= I if(prob(25)) //Less often than with normal digestion - play_sound = pick(digestion_sounds) + play_sound = pick(pred_digest) else if(item_digest_mode == IM_DIGEST) if(I.digest_stage && I.digest_stage > 0) digest_item(I) @@ -56,7 +85,7 @@ did_an_item = TRUE to_update = TRUE if(prob(25)) //Less often than with normal digestion - play_sound = pick(digestion_sounds) + play_sound = pick(pred_digest) //Handle eaten mobs else if(isliving(A)) @@ -75,6 +104,11 @@ if(H.bloodstr.get_reagent_amount("numbenzyme") < 2) H.bloodstr.add_reagent("numbenzyme",4) + //Thickbelly flag + if(mode_flags & DM_FLAG_THICKBELLY) + if(!(H.muffled)) + H.muffled = 1 + //Stripping flag if(mode_flags & DM_FLAG_STRIPPING) for(var/slot in slots) @@ -91,11 +125,15 @@ else items_preserved |= I if(prob(25)) //Less often than with normal digestion - play_sound = pick(digestion_sounds) + if(L && L.client && L.is_preference_enabled(/datum/client_preference/digestion_noises)) + SEND_SOUND(L,prey_digest) + play_sound = pick(pred_digest) else if(item_digest_mode == IM_DIGEST) digest_item(I) if(prob(25)) //Less often than with normal digestion - play_sound = pick(digestion_sounds) + if(L && L.client && L.is_preference_enabled(/datum/client_preference/digestion_noises)) + SEND_SOUND(L,prey_digest) + play_sound = pick(pred_digest) to_update = TRUE break //get rid of things like blood drops and gibs that end up in there @@ -110,7 +148,10 @@ else if(digest_mode == DM_DIGEST) if(prob(50)) //Was SO OFTEN. AAAA. - play_sound = pick(digestion_sounds) + for(var/mob/M in contents) + if(M && M.client && M.is_preference_enabled(/datum/client_preference/digestion_noises)) + SEND_SOUND(M,prey_digest) + play_sound = pick(pred_digest) for (var/target in touchable_mobs) var/mob/living/M = target @@ -137,7 +178,9 @@ to_chat(owner,"" + digest_alert_owner + "") to_chat(M,"" + digest_alert_prey + "") - play_sound = pick(death_sounds) + play_sound = pick(pred_death) + if(M && M.client && M.is_preference_enabled(/datum/client_preference/digestion_noises)) + SEND_SOUND(M,prey_death) if((mode_flags & DM_FLAG_LEAVEREMAINS) && M.digest_leave_remains) handle_remains_leaving(M) digestion_death(M) @@ -178,7 +221,9 @@ for (var/target in touchable_mobs) var/mob/living/M = target if(prob(10)) //Less often than gurgles. People might leave this on forever. - play_sound = pick(digestion_sounds) + if(M && M.client && M.is_preference_enabled(/datum/client_preference/digestion_noises)) + SEND_SOUND(M,prey_digest) + play_sound = pick(pred_digest) if(M.absorbed) continue @@ -211,7 +256,9 @@ var/mob/living/M = target if(prob(10)) //Less often than gurgles. People might leave this on forever. - play_sound = pick(digestion_sounds) + if(M && M.client && M.is_preference_enabled(/datum/client_preference/digestion_noises)) + SEND_SOUND(M,prey_digest) + play_sound = pick(pred_digest) if(M.nutrition >= 100) //Drain them until there's no nutrients left. var/oldnutrition = (M.nutrition * 0.05) @@ -225,7 +272,9 @@ var/mob/living/M = target if(prob(10)) //Infinite gurgles! - play_sound = pick(digestion_sounds) + if(M && M.client && M.is_preference_enabled(/datum/client_preference/digestion_noises)) + SEND_SOUND(M,prey_digest) + play_sound = pick(pred_digest) if(M.size_multiplier > shrink_grow_size) //Shrink until smol. M.resize(M.size_multiplier-0.01) //Shrink by 1% per tick. @@ -242,7 +291,9 @@ var/mob/living/M = target if(prob(10)) - play_sound = pick(digestion_sounds) + if(M && M.client && M.is_preference_enabled(/datum/client_preference/digestion_noises)) + SEND_SOUND(M,prey_digest) + play_sound = pick(pred_digest) if(M.size_multiplier < shrink_grow_size) //Grow until large. M.resize(M.size_multiplier+0.01) //Grow by 1% per tick. @@ -256,7 +307,9 @@ var/mob/living/M = target if(prob(10)) - play_sound = pick(digestion_sounds) + if(M && M.client && M.is_preference_enabled(/datum/client_preference/digestion_noises)) + SEND_SOUND(M,prey_digest) + play_sound = pick(pred_digest) if(M.size_multiplier > shrink_grow_size && owner.size_multiplier < 2) //Grow until either pred is large or prey is small. owner.resize(owner.size_multiplier+0.01) //Grow by 1% per tick. @@ -271,7 +324,10 @@ else if(digest_mode == DM_HEAL) if(prob(50)) //Wet heals! The secret is you can leave this on for gurgle noises for fun. - play_sound = pick(digestion_sounds) + for(var/mob/M in contents) + if(M && M.client && M.is_preference_enabled(/datum/client_preference/digestion_noises)) + SEND_SOUND(M,prey_digest) + play_sound = pick(pred_digest) for (var/target in touchable_mobs) var/mob/living/M = target @@ -298,7 +354,9 @@ /////////////////////////// Make any noise /////////////////////////// if(play_sound) - playsound(src, play_sound, vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF, ignore_walls = TRUE, preference = /datum/client_preference/digestion_noises) + for(var/mob/M in hearers(4, owner)) //so we don't fill the whole room with the sound effect + if(M && M.client && (isturf(M.loc) || (M.loc != src.contents)) && M.is_preference_enabled(/datum/client_preference/digestion_noises)) //to avoid people on the inside getting the outside sounds and their direct sounds + built in sound pref check + SEND_SOUND(M, play_sound) //these are all external sound triggers now, so it's ok. if(to_update) for(var/mob/living/M in contents) if(M.client) diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm index 8e360dfca55..7097aaf27d9 100644 --- a/code/modules/vore/eating/living_vr.dm +++ b/code/modules/vore/eating/living_vr.dm @@ -1,12 +1,12 @@ ///////////////////// Mob Living ///////////////////// /mob/living - var/digestable = 1 // Can the mob be digested inside a belly? - var/digest_leave_remains = 0 // Will this mob leave bones/skull/etc after the melty demise? - var/allowmobvore = 1 // Will simplemobs attempt to eat the mob? - var/showvoreprefs = 1 // Determines if the mechanical vore preferences button will be displayed on the mob or not. + var/digestable = TRUE // Can the mob be digested inside a belly? + var/digest_leave_remains = FALSE // Will this mob leave bones/skull/etc after the melty demise? + var/allowmobvore = TRUE // Will simplemobs attempt to eat the mob? + var/showvoreprefs = TRUE // Determines if the mechanical vore preferences button will be displayed on the mob or not. var/obj/belly/vore_selected // Default to no vore capability. var/list/vore_organs = list() // List of vore containers inside a mob - var/absorbed = 0 // If a mob is absorbed into another + var/absorbed = FALSE // If a mob is absorbed into another var/weight = 137 // Weight for mobs for weightgain system var/weight_gain = 1 // How fast you gain weight var/weight_loss = 0.5 // How fast you lose weight @@ -15,15 +15,17 @@ var/revive_ready = REVIVING_READY // Only used for creatures that have the xenochimera regen ability, so far. var/metabolism = 0.0015 var/vore_taste = null // What the character tastes like - var/no_vore = 0 // If the character/mob can vore. - var/openpanel = 0 // Is the vore panel open? - var/noisy = 0 // Toggle audible hunger. + var/no_vore = FALSE // If the character/mob can vore. + var/openpanel = FALSE // Is the vore panel open? + var/noisy = FALSE // Toggle audible hunger. var/absorbing_prey = 0 // Determines if the person is using the succubus drain or not. See station_special_abilities_vr. var/drain_finalized = 0 // Determines if the succubus drain will be KO'd/absorbed. Can be toggled on at any time. var/fuzzy = 1 // Preference toggle for sharp/fuzzy icon. var/tail_alt = 0 // Tail layer toggle. - var/can_be_drop_prey = 0 - var/can_be_drop_pred = 1 // Mobs are pred by default. + var/permit_healbelly = TRUE + var/can_be_drop_prey = FALSE + var/can_be_drop_pred = TRUE // Mobs are pred by default. + var/next_preyloop // For Fancy sound internal loop // // Hook for generic creation of stuff on new creatures @@ -199,6 +201,7 @@ P.digest_leave_remains = src.digest_leave_remains P.allowmobvore = src.allowmobvore P.vore_taste = src.vore_taste + P.permit_healbelly = src.permit_healbelly P.can_be_drop_prey = src.can_be_drop_prey P.can_be_drop_pred = src.can_be_drop_pred @@ -225,6 +228,7 @@ digest_leave_remains = P.digest_leave_remains allowmobvore = P.allowmobvore vore_taste = P.vore_taste + permit_healbelly = P.permit_healbelly can_be_drop_prey = P.can_be_drop_prey can_be_drop_pred = P.can_be_drop_pred @@ -334,6 +338,7 @@ return //Actual escaping absorbed = 0 //Make sure we're not absorbed + muffled = 0 //Removes Muffling forceMove(get_turf(src)) //Just move me up to the turf, let's not cascade through bellies, there's been a problem, let's just leave. for(var/mob/living/simple_mob/SA in range(10)) SA.prey_excludes[src] = world.time @@ -435,7 +440,8 @@ // Actually shove prey into the belly. belly.nom_mob(prey, user) - user.update_icons() + if(!ishuman(user)) + user.update_icons() // Flavor handling if(belly.can_taste && prey.get_taste_message(FALSE)) @@ -600,6 +606,8 @@ I.forceMove(vore_selected) updateVRPanel() + log_admin("VORE: [src] used Eat Trash to swallow [I].") + if(istype(I,/obj/item/device/flashlight/flare) || istype(I,/obj/item/weapon/flame/match) || istype(I,/obj/item/weapon/storage/box/matches)) to_chat(src, "You can taste the flavor of spicy cardboard.") else if(istype(I,/obj/item/device/flashlight/glowstick)) @@ -656,7 +664,6 @@ set category = "Preferences" set desc = "Switch sharp/fuzzy scaling for current mob." appearance_flags ^= PIXEL_SCALE - appearance_flags ^= KEEP_TOGETHER /mob/living/examine(mob/user, distance, infix, suffix) . = ..(user, distance, infix, suffix) @@ -680,6 +687,7 @@ dispvoreprefs += "Digestable: [digestable ? "Enabled" : "Disabled"]
      " dispvoreprefs += "Leaves Remains: [digest_leave_remains ? "Enabled" : "Disabled"]
      " dispvoreprefs += "Mob Vore: [allowmobvore ? "Enabled" : "Disabled"]
      " + dispvoreprefs += "Healbelly permission: [permit_healbelly ? "Allowed" : "Disallowed"]
      " dispvoreprefs += "Drop-nom prey: [can_be_drop_prey ? "Enabled" : "Disabled"]
      " dispvoreprefs += "Drop-nom pred: [can_be_drop_pred ? "Enabled" : "Disabled"]
      " user << browse("Vore prefs: [src]
      [dispvoreprefs]
      ", "window=[name];size=200x300;can_resize=0;can_minimize=0") diff --git a/code/modules/vore/eating/vore_vr.dm b/code/modules/vore/eating/vore_vr.dm index f89462f23c6..efc0c451c8b 100644 --- a/code/modules/vore/eating/vore_vr.dm +++ b/code/modules/vore/eating/vore_vr.dm @@ -19,6 +19,8 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE -Aro <3 */ +#define VORE_VERSION 1 //This is a Define so you don't have to worry about magic numbers. + // // Overrides/additions to stock defines go here, as well as hooks. Sort them by // the object they are overriding. So all /mob/living together, etc. @@ -46,6 +48,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE var/allowmobvore = TRUE var/list/belly_prefs = list() var/vore_taste = "nothing in particular" + var/permit_healbelly = TRUE var/can_be_drop_prey = FALSE var/can_be_drop_pred = FALSE @@ -112,6 +115,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE digest_leave_remains = json_from_file["digest_leave_remains"] allowmobvore = json_from_file["allowmobvore"] vore_taste = json_from_file["vore_taste"] + permit_healbelly = json_from_file["permit_healbelly"] can_be_drop_prey = json_from_file["can_be_drop_prey"] can_be_drop_pred = json_from_file["can_be_drop_pred"] belly_prefs = json_from_file["belly_prefs"] @@ -123,6 +127,8 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE digest_leave_remains = FALSE if(isnull(allowmobvore)) allowmobvore = TRUE + if(isnull(permit_healbelly)) + permit_healbelly = TRUE if(isnull(can_be_drop_prey)) allowmobvore = FALSE if(isnull(can_be_drop_pred)) @@ -135,13 +141,14 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE /datum/vore_preferences/proc/save_vore() if(!path) return 0 - var/version = 1 //For "good times" use in the future + var/version = VORE_VERSION //For "good times" use in the future var/list/settings_list = list( "version" = version, "digestable" = digestable, "digest_leave_remains" = digest_leave_remains, "allowmobvore" = allowmobvore, "vore_taste" = vore_taste, + "permit_healbelly" = permit_healbelly, "can_be_drop_prey" = can_be_drop_prey, "can_be_drop_pred" = can_be_drop_pred, "belly_prefs" = belly_prefs, diff --git a/code/modules/vore/eating/vorepanel_vr.dm b/code/modules/vore/eating/vorepanel_vr.dm index c5e4391ef70..1527092a295 100644 --- a/code/modules/vore/eating/vorepanel_vr.dm +++ b/code/modules/vore/eating/vorepanel_vr.dm @@ -189,6 +189,13 @@ dat += "Name:" dat += " '[selected.name]'" + //Belly Type button + dat += "
      Is this belly fleshy:" + dat += "[selected.is_wet ? "Yes" : "No"]" + if(selected.is_wet) + dat += "Internal loop for prey?:" + dat += "[selected.wet_loop ? "Yes" : "No"]" + //Digest Mode Button dat += "
      Belly Mode:" var/mode = selected.digest_mode @@ -229,10 +236,18 @@ dat += "
      Flavor Text:" dat += " '[selected.desc]'" + //Belly Sound Fanciness + dat += "
      Use Fancy Sounds:" + dat += "[selected.fancy_vore ? "Yes" : "No"]" + //Belly sound - dat += "
      Set Vore Sound" + dat += "
      Vore Sound: [selected.vore_sound]" dat += "Test" + //Release sound + dat += "
      Release Sound: [selected.release_sound]" + dat += "Test" + //Belly messages dat += "
      Belly Messages" @@ -293,22 +308,28 @@ dat += "
      " switch(user.digestable) - if(1) + if(TRUE) dat += "Toggle Digestable" - if(0) + if(FALSE) dat += "Toggle Digestable" switch(user.digest_leave_remains) - if(1) + if(TRUE) dat += "Toggle Leaving Remains" - if(0) + if(FALSE) dat += "Toggle Leaving Remains" switch(user.allowmobvore) - if(1) - dat += "Toggle Mob Vore" - if(0) - dat += "Toggle Mob Vore" + if(TRUE) + dat += "
      Toggle Mob Vore" + if(FALSE) + dat += "
      Toggle Mob Vore" + + switch(user.permit_healbelly) + if(TRUE) + dat += "Toggle Healbelly Permission" + if(FALSE) + dat += "Toggle Healbelly Permission" dat += "
      Toggle Drop-nom Prey" //These two get their own, custom row, too. dat += "Toggle Drop-nom Pred" @@ -528,6 +549,12 @@ selected.name = new_name + if(href_list["b_wetness"]) + selected.is_wet = !selected.is_wet + + if(href_list["b_wetloop"]) + selected.wet_loop = !selected.wet_loop + if(href_list["b_mode"]) var/list/menu_list = selected.digest_modes.Copy() if(istype(usr,/mob/living/carbon/human)) @@ -652,17 +679,54 @@ selected.vore_verb = new_verb - if(href_list["b_sound"]) - var/choice = input(user,"Currently set to [selected.vore_sound]","Select Sound") as null|anything in vore_sounds + if(href_list["b_fancy_sound"]) + selected.fancy_vore = !selected.fancy_vore + selected.vore_sound = "Gulp" + selected.release_sound = "Splatter" + // defaults as to avoid potential bugs + + if(href_list["b_release"]) + var/choice + if(selected.fancy_vore) + choice = input(user,"Currently set to [selected.release_sound]","Select Sound") as null|anything in fancy_release_sounds + else + choice = input(user,"Currently set to [selected.release_sound]","Select Sound") as null|anything in classic_release_sounds + if(!choice) - return 0 + return FALSE + + selected.release_sound = choice + + if(href_list["b_releasesoundtest"]) + var/sound/releasetest + if(selected.fancy_vore) + releasetest = fancy_release_sounds[selected.release_sound] + else + releasetest = classic_release_sounds[selected.release_sound] + + if(releasetest) + SEND_SOUND(user, releasetest) + + if(href_list["b_sound"]) + var/choice + if(selected.fancy_vore) + choice = input(user,"Currently set to [selected.vore_sound]","Select Sound") as null|anything in fancy_vore_sounds + else + choice = input(user,"Currently set to [selected.vore_sound]","Select Sound") as null|anything in classic_vore_sounds + + if(!choice) + return FALSE selected.vore_sound = choice if(href_list["b_soundtest"]) - var/soundfile = vore_sounds[selected.vore_sound] - if(soundfile) - user << soundfile + var/sound/voretest + if(selected.fancy_vore) + voretest = fancy_vore_sounds[selected.vore_sound] + else + voretest = classic_vore_sounds[selected.vore_sound] + if(voretest) + SEND_SOUND(user, voretest) if(href_list["b_tastes"]) selected.can_taste = !selected.can_taste @@ -754,7 +818,7 @@ if(href_list["b_del"]) var/alert = alert("Are you sure you want to delete your [lowertext(selected.name)]?","Confirmation","Delete","Cancel") - if(!alert == "Delete") + if(!(alert == "Delete")) return 0 var/failure_msg = "" @@ -871,6 +935,19 @@ if(user.client.prefs_vr) user.client.prefs_vr.allowmobvore = user.allowmobvore + if(href_list["togglehealbelly"]) + var/choice = alert(user, "This button is for those who don't like healbelly used on them as a mechanic. It does not affect anything, but is displayed under mechanical prefs for ease of quick checks. You are currently: [user.allowmobvore ? "Okay" : "Not Okay"] with players using healbelly on you.", "", "Allow Healing Belly", "Cancel", "Disallow Healing Belly") + switch(choice) + if("Cancel") + return 0 + if("Allow Healing Belly") + user.permit_healbelly = TRUE + if("Disallow Healing Belly") + user.permit_healbelly = FALSE + + if(user.client.prefs_vr) + user.client.prefs_vr.permit_healbelly = user.permit_healbelly + if(href_list["togglenoisy"]) var/choice = alert(user, "Toggle audible hunger noises. Currently: [user.noisy ? "Enabled" : "Disabled"]", "", "Enable audible hunger", "Cancel", "Disable audible hunger") switch(choice) diff --git a/code/modules/vore/fluffstuff/custom_boxes_vr.dm b/code/modules/vore/fluffstuff/custom_boxes_vr.dm index d22ba747b08..07e018f7a65 100644 --- a/code/modules/vore/fluffstuff/custom_boxes_vr.dm +++ b/code/modules/vore/fluffstuff/custom_boxes_vr.dm @@ -147,7 +147,6 @@ new /obj/item/clothing/accessory/holster/hip(src) new /obj/item/clothing/suit/storage/fluff/modernfedcoat(src) new /obj/item/clothing/head/caphat/formal/fedcover(src) - new /obj/item/weapon/card/id/centcom/station/fluff/joanbadge(src) new /obj/item/clothing/suit/armor/det_suit(src) new /obj/item/weapon/flame/lighter/zippo/fluff/joan(src) new /obj/item/clothing/under/rank/internalaffairs/fluff/joan(src) diff --git a/code/modules/vore/fluffstuff/custom_clothes_vr.dm b/code/modules/vore/fluffstuff/custom_clothes_vr.dm index fc1fe9d0ff8..1ba3941bbe6 100644 --- a/code/modules/vore/fluffstuff/custom_clothes_vr.dm +++ b/code/modules/vore/fluffstuff/custom_clothes_vr.dm @@ -693,9 +693,6 @@ icon_override = 'icons/vore/custom_clothes_vr.dmi' item_state = "rig-hos_mob" - //Slightly improved security voidsuit, which when made, was: - //armor = list(melee = 50, bullet = 25, laser = 25, energy = 5, bomb = 45, bio = 100, rad = 10) - armor = list("melee" = 60, "bullet" = 35, "laser" = 35, "energy" = 15, "bomb" = 50, "bio" = 100, "rad" = 10) species_restricted = null //HOS Hardsuit Helmet @@ -709,7 +706,6 @@ icon_override = 'icons/vore/custom_clothes_vr.dmi' item_state = "rig0-hos_mob" - armor = list("melee" = 60, "bullet" = 35, "laser" = 35, "energy" = 15, "bomb" = 50, "bio" = 100, "rad" = 10) species_restricted = null //adk09:Lethe @@ -1524,6 +1520,14 @@ Departamental Swimsuits, for general use icon_override = 'icons/vore/custom_clothes_vr.dmi' item_state = "gnshorts" +/obj/item/clothing/under/fluff/v_nanovest + name = "Varmacorp nanovest" + desc = "A nifty little vest optimized for nanite contact." + icon = 'icons/vore/custom_clothes_vr.dmi' + icon_state = "nanovest" + icon_override = 'icons/vore/custom_clothes_vr.dmi' + item_state = "nanovest" + //General use /obj/item/clothing/suit/storage/fluff/loincloth name = "Loincloth" @@ -1848,4 +1852,66 @@ Departamental Swimsuits, for general use icon_state = "goldenstring" item_state = "goldenstring" w_class = ITEMSIZE_TINY - slot_flags = SLOT_TIE \ No newline at end of file + slot_flags = SLOT_TIE + +//Chaoko99: Aika Hisakawa +/obj/item/clothing/suit/fluff/blue_trimmed_coat + name = "blue-trimmed greatcoat" + desc = "A heavy, form-obscuring coat with gilded buttons and azure trim." + icon = 'icons/vore/custom_clothes_vr.dmi' + icon_state = "aika_coat" + + icon_override = 'icons/vore/custom_clothes_vr.dmi' + item_state = "aika_coat_mob" + flags_inv = HIDEJUMPSUIT | HIDETIE + + item_icons = list( + slot_l_hand_str = 'icons/vore/custom_clothes_vr.dmi', + slot_r_hand_str = 'icons/vore/custom_clothes_vr.dmi', + ) + item_state_slots = list(slot_r_hand_str = "aika_coat_mob_r", slot_l_hand_str = "aika_coat_mob_l") + +//Burrito Justice: Jayda Wilson +/obj/item/clothing/under/solgov/utility/sifguard/medical/fluff + desc = "The utility uniform of the Society of Universal Cartographers, made from biohazard resistant material. This is an older issuing of the uniform, with integrated department markings." + + icon = 'icons/vore/custom_clothes_vr.dmi' + icon_override = 'icons/vore/custom_clothes_vr.dmi' + + icon_state = "blackutility_med" + worn_state = "blackutility_med" + item_state = "blackutility_med" + + rolled_down = 0 + rolled_sleeves = 0 + starting_accessories = null + item_icons = list() + +//Vorrarkul: Melanie Farmer +/obj/item/clothing/under/fluff/slime_skeleton + name = "Melanie's Skeleton" + desc = "The skeleton of a promethean, still covered in residual slime. Upon closer inspection, they're not even real bones!" + + icon = 'icons/vore/custom_clothes_vr.dmi' + icon_override = 'icons/vore/custom_clothes_vr.dmi' + + icon_state = "melanie_skeleton" + item_state = "melanie_skeleton_mob" + + body_parts_covered = 0 + + species_restricted = list("exclude", SPECIES_TESHARI) + +/obj/item/clothing/under/fluff/slime_skeleton/mob_can_equip(M as mob, slot) + if(!..()) + return 0 + + if(istype(M,/mob/living/carbon/human)) + var/mob/living/carbon/human/H = M + if(!(H.get_species() == SPECIES_PROMETHEAN)) //Only wearable by slimes, since species_restricted actually checks bodytype, not species + return 0 + + return 1 + +/obj/item/clothing/under/fluff/slime_skeleton/digest_act(var/atom/movable/item_storage = null) + return FALSE //Indigestible diff --git a/code/modules/vore/fluffstuff/custom_guns_vr.dm b/code/modules/vore/fluffstuff/custom_guns_vr.dm index 7a0b26d1767..f99910a1236 100644 --- a/code/modules/vore/fluffstuff/custom_guns_vr.dm +++ b/code/modules/vore/fluffstuff/custom_guns_vr.dm @@ -730,7 +730,7 @@ icon_state = "r357" ammo_type = /obj/item/ammo_casing/a44/rubber -//Expedition pistol +//Expedition Frontier Phaser /obj/item/weapon/gun/energy/frontier name = "frontier phaser" desc = "An extraordinarily rugged laser weapon, built to last and requiring effectively no maintenance. Includes a built-in crank charger for recharging away from civilization." @@ -746,6 +746,7 @@ unacidable = 1 var/recharging = 0 + var/phase_power = 75 projectile_type = /obj/item/projectile/beam firemodes = list( @@ -764,7 +765,7 @@ if(!do_after(user, 10, src)) break playsound(get_turf(src),'sound/items/change_drill.ogg',25,1) - if(power_supply.give(60) < 60) + if(power_supply.give(phase_power) < phase_power) break recharging = 0 @@ -835,13 +836,14 @@ return ..() -//Expeditionary Holdout Phaser +//Expeditionary Holdout Phaser Pistol /obj/item/weapon/gun/energy/frontier/locked/holdout name = "holdout frontier phaser" desc = "An minaturized weapon designed for the purpose of expeditionary support to defend themselves on the field. Includes a built-in crank charger for recharging away from civilization. This one has a safety interlock that prevents firing while in proximity to the facility." icon = 'icons/obj/gun_vr.dmi' icon_state = "holdoutkill" item_state = null + phase_power = 100 w_class = ITEMSIZE_SMALL charge_cost = 600 diff --git a/code/modules/vore/fluffstuff/custom_items_vr.dm b/code/modules/vore/fluffstuff/custom_items_vr.dm index ff2c752e339..94f427abc30 100644 --- a/code/modules/vore/fluffstuff/custom_items_vr.dm +++ b/code/modules/vore/fluffstuff/custom_items_vr.dm @@ -151,7 +151,7 @@ icon_state = "pda-joan" //Vorrarkul:Lucina Dakarim -/obj/item/device/pda/heads/cmo/lucinapda +/obj/item/device/pda/heads/cmo/fluff/lucinapda icon = 'icons/vore/custom_items_vr.dmi' icon_state = "pda-lucina" @@ -1244,7 +1244,8 @@ w_class = ITEMSIZE_SMALL origin_tech = list(TECH_MAGNET = 5, TECH_BLUESPACE = 5, TECH_ILLEGAL = 7) - var/obj/item/weapon/cell/device/weapon/power_source + var/cell_type = /obj/item/weapon/cell/device/weapon + var/obj/item/weapon/cell/power_source var/charge_cost = 800 // cell/device/weapon has 2400 var/list/beacons = list() @@ -1259,7 +1260,10 @@ /obj/item/device/perfect_tele/New() ..() flags |= NOBLUDGEON - power_source = new (src) + if(cell_type) + power_source = new cell_type(src) + else + power_source = new /obj/item/weapon/cell/device(src) spk = new(src) spk.set_up(5, 0, src) spk.attach(src) @@ -1276,7 +1280,7 @@ /obj/item/device/perfect_tele/update_icon() if(!power_source) icon_state = "[initial(icon_state)]_o" - else if(ready && power_source.check_charge(charge_cost)) + else if(ready && (power_source.check_charge(charge_cost) || power_source.fully_charged())) icon_state = "[initial(icon_state)]" else icon_state = "[initial(icon_state)]_w" @@ -1338,7 +1342,7 @@ return /obj/item/device/perfect_tele/attackby(obj/W, mob/user) - if(istype(W,/obj/item/weapon/cell/device/weapon) && !power_source) + if(istype(W,cell_type) && !power_source) power_source = W power_source.update_icon() //Why doesn't a cell do this already? :| user.unEquip(power_source) @@ -1367,7 +1371,7 @@ return FALSE //Check for charge - if(!power_source.check_charge(charge_cost)) + if((!power_source.check_charge(charge_cost)) && (!power_source.fully_charged())) to_chat(user,"\The [src] does not have enough power left!") return FALSE @@ -1398,10 +1402,13 @@ //No, you can't port to or from away missions. Stupidly complicated check. var/turf/uT = get_turf(user) var/turf/dT = get_turf(destination) + var/list/dat = list() + dat["z_level_detection"] = using_map.get_map_levels(uT.z) + if(!uT || !dT) return FALSE - if( (uT.z != dT.z) && ( (uT.z > max_default_z_level() ) || (dT.z > max_default_z_level()) ) ) + if( (uT.z != dT.z) && (!(dT.z in dat["z_level_detection"])) ) to_chat(user,"\The [src] can't teleport you that far!") return FALSE @@ -1562,14 +1569,59 @@ desc = "A more limited translocator with a single beacon, useful for some things, like setting the mining department on fire accidentally. Legal for use in the pursuit of NanoTrasen interests, namely mining and exploration." icon_state = "minitrans" beacons_left = 1 //Just one - charge_cost = 2400 //One per + cell_type = /obj/item/weapon/cell/device + origin_tech = list(TECH_MAGNET = 5, TECH_BLUESPACE = 5) +/* /obj/item/device/perfect_tele/one_beacon/teleport_checks(mob/living/target,mob/living/user) var/turf/T = get_turf(destination) if(T && user.z != T.z) to_chat(user,"\The [src] is too far away from the beacon. Try getting closer first!") return FALSE return ..() +*/ + +/obj/item/device/perfect_tele/admin + name = "alien translocator" + desc = "This strange device allows one to teleport people and objects across large distances." + + cell_type = /obj/item/weapon/cell/device/weapon/recharge/alien + charge_cost = 400 + beacons_left = 6 + failure_chance = 0 //Percent + +/obj/item/device/perfect_tele/admin/teleport_checks(mob/living/target,mob/living/user) + //Uhhuh, need that power source + if(!power_source) + to_chat(user,"\The [src] has no power source!") + return FALSE + + //Check for charge + if((!power_source.check_charge(charge_cost)) && (!power_source.fully_charged())) + to_chat(user,"\The [src] does not have enough power left!") + return FALSE + + //Only mob/living need apply. + if(!istype(user) || !istype(target)) + return FALSE + + //No, you can't teleport buckled people. + if(target.buckled) + to_chat(user,"The target appears to be attached to something...") + return FALSE + + //No, you can't teleport if it's not ready yet. + if(!ready) + to_chat(user,"\The [src] is still recharging!") + return FALSE + + //No, you can't teleport if there's no destination. + if(!destination) + to_chat(user,"\The [src] doesn't have a current valid destination set!") + return FALSE + + //Seems okay to me! + return TRUE //InterroLouis: Ruda Lizden /obj/item/clothing/accessory/badge/holo/detective/ruda @@ -2007,4 +2059,23 @@ /obj/item/weapon/reagent_containers/food/drinks/flask/vacuumflask/fluff/viktor/Initialize() ..() - reagents.add_reagent("pwine", 60) \ No newline at end of file + reagents.add_reagent("pwine", 60) + +//RadiantAurora: Tiemli Kroto +/obj/item/clothing/glasses/welding/tiemgogs + name = "custom-fitted welding goggles" + desc = "A pair of thick, custom-fitted goggles with LEDs above the lenses. Ruggedly engraved below the lenses is the name 'Tiemli Kroto'." + + icon = 'icons/vore/custom_items_vr.dmi' + icon_state = "tiemgogs" + + icon_override = 'icons/vore/custom_clothes_vr.dmi' + icon_state = "tiemgogs" + +/obj/item/clothing/glasses/welding/tiemgogs/mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0) + if(..()) + if(H.ckey != "radiantaurora") + to_chat(H, "These don't look like they were made to fit you...") + return 0 + else + return 1 diff --git a/code/modules/vore/fluffstuff/guns/cell_loaded/cell_loaded.dm b/code/modules/vore/fluffstuff/guns/cell_loaded/cell_loaded.dm new file mode 100644 index 00000000000..8e9a5181e66 --- /dev/null +++ b/code/modules/vore/fluffstuff/guns/cell_loaded/cell_loaded.dm @@ -0,0 +1,282 @@ +// The Gun // +/obj/item/weapon/gun/projectile/cell_loaded //this one can load both medical and security cells! for ERT/admin use. + name = "multipurpose cell-loaded revolver" + desc = "Variety is the spice of life! This weapon is a hybrid of the KHI-102b 'Nanotech Selectable-Fire Weapon' and the Vey-Med ML-3 'Medigun', dubbed the 'NSFW-ML3M'. \ + It can fire both harmful and healing cells with an internal nanite fabricator and energy weapon cell loader. Up to three combinations of \ + energy beams can be configured at once. Ammo not included." + catalogue_data = list(/datum/category_item/catalogue/information/organization/khi) + + icon = 'icons/vore/custom_guns_vr.dmi' + icon_state = "nsfw" + + icon_override = 'icons/vore/custom_guns_vr.dmi' + item_state = "gun" + + caliber = "nsfw" + + origin_tech = list(TECH_COMBAT = 7, TECH_MATERIAL = 6, TECH_MAGNETS = 4) + + fire_sound = 'sound/weapons/Taser.ogg' + + load_method = MAGAZINE //Nyeh heh hehhh. + magazine_type = null + allowed_magazines = list(/obj/item/ammo_magazine/cell_mag) + handle_casings = HOLD_CASINGS //Don't eject batteries! + recoil = 0 + var/charge_left = 0 + var/max_charge = 0 + charge_sections = 5 + +/obj/item/weapon/gun/projectile/cell_loaded/consume_next_projectile() + if(chambered && ammo_magazine) + var/obj/item/ammo_casing/microbattery/batt = chambered + if(batt.shots_left) + return new chambered.projectile_type() + else + for(var/B in ammo_magazine.stored_ammo) + var/obj/item/ammo_casing/microbattery/other_batt = B + if(istype(other_batt,chambered.type) && other_batt.shots_left) + switch_to(other_batt) + return new chambered.projectile_type() + break + + return null + +/obj/item/weapon/gun/projectile/cell_loaded/proc/update_charge() + charge_left = 0 + max_charge = 0 + + if(!chambered) + return + + var/obj/item/ammo_casing/microbattery/batt = chambered + + charge_left = batt.shots_left + max_charge = initial(batt.shots_left) + if(ammo_magazine) //Crawl to find more + for(var/B in ammo_magazine.stored_ammo) + var/obj/item/ammo_casing/microbattery/bullet = B + if(istype(bullet,batt.type)) + charge_left += bullet.shots_left + max_charge += initial(bullet.shots_left) + +/obj/item/weapon/gun/projectile/cell_loaded/proc/switch_to(obj/item/ammo_casing/microbattery/new_batt) + if(ishuman(loc)) + if(chambered && new_batt.type == chambered.type) + to_chat(loc,"\The [src] is now using the next [new_batt.type_name] power cell.") + else + to_chat(loc,"\The [src] is now firing [new_batt.type_name].") + + chambered = new_batt + update_charge() + update_icon() + +/obj/item/weapon/gun/projectile/cell_loaded/attack_self(mob/user) + if(!chambered) + return + + var/list/stored_ammo = ammo_magazine.stored_ammo + + if(stored_ammo.len == 1) + return //silly you. + + //Find an ammotype that ISN'T the same, or exhaust the list and don't change. + var/our_slot = stored_ammo.Find(chambered) + + for(var/index in 1 to stored_ammo.len) + var/true_index = ((our_slot + index - 1) % stored_ammo.len) + 1 // Stupid ONE BASED lists! + var/obj/item/ammo_casing/microbattery/next_batt = stored_ammo[true_index] + if(chambered != next_batt && !istype(next_batt, chambered.type)) + switch_to(next_batt) + break +/* +/obj/item/weapon/gun/projectile/cell_loaded/special_check(mob/user) + if(!chambered) + return + + var/obj/item/ammo_casing/microbattery/batt = chambered + if(!batt.shots_left) + return FALSE + + return TRUE +*/ +/obj/item/weapon/gun/projectile/cell_loaded/load_ammo(var/obj/item/A, mob/user) + . = ..() + if(ammo_magazine && ammo_magazine.stored_ammo.len) + switch_to(ammo_magazine.stored_ammo[1]) + +/obj/item/weapon/gun/projectile/cell_loaded/unload_ammo(mob/user, var/allow_dump=1) + chambered = null + return ..() + +/obj/item/weapon/gun/projectile/cell_loaded/update_icon() + update_charge() + + cut_overlays() + if(!chambered) + return + + var/obj/item/ammo_casing/microbattery/batt = chambered + var/batt_color = batt.type_color //Used many times + + //Mode bar + var/image/mode_bar = image(icon, icon_state = "[initial(icon_state)]_type") + mode_bar.color = batt_color + add_overlay(mode_bar) + + //Barrel color + var/image/barrel_color = image(icon, icon_state = "[initial(icon_state)]_barrel") + barrel_color.alpha = 150 + barrel_color.color = batt_color + add_overlay(barrel_color) + + //Charge bar + var/ratio = CEILING(((charge_left / max_charge) * charge_sections), 1) + for(var/i = 0, i < ratio, i++) + var/image/charge_bar = image(icon, icon_state = "[initial(icon_state)]_charge") + charge_bar.pixel_x = i + charge_bar.color = batt_color + add_overlay(charge_bar) + + +// The Magazine // +/obj/item/ammo_magazine/cell_mag + name = "microbattery magazine" + desc = "A microbattery holder for a cell-based variable weapon." + icon = 'icons/obj/ammo_vr.dmi' + icon_state = "cell_mag" + origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 5, TECH_MAGNETS = 3) + caliber = "nsfw" + ammo_type = /obj/item/ammo_casing/microbattery + initial_ammo = 0 + max_ammo = 3 + var/x_offset = 5 //for update_icon() shenanigans- moved here so it can be adjusted for bigger mags + var/capname = "nsfw_mag" //as above + var/chargename = "nsfw_mag" //as above + mag_type = MAGAZINE + + var/list/modes = list() + +/obj/item/ammo_magazine/cell_mag/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(istype(W, /obj/item/ammo_casing/microbattery)) + var/obj/item/ammo_casing/microbattery/B = W + if(!istype(B, ammo_type)) + to_chat(user, "[B] does not fit into [src].") + return + if(stored_ammo.len >= max_ammo) + to_chat(user, "[src] is full!") + return + user.remove_from_mob(B) + B.loc = src + stored_ammo.Add(B) + update_icon() + playsound(user.loc, 'sound/weapons/flipblade.ogg', 50, 1) + update_icon() + +/obj/item/ammo_magazine/cell_mag/update_icon() + cut_overlays() + if(!stored_ammo.len) + return //Why bother + + var/current = 0 + for(var/B in stored_ammo) + var/obj/item/ammo_casing/microbattery/batt = B + var/image/cap = image(icon, icon_state = "[capname]_cap") + cap.color = batt.type_color + cap.pixel_x = current * x_offset //Caps don't need a pixel_y offset + add_overlay(cap) + + if(batt.shots_left) + var/ratio = CEILING(((batt.shots_left / initial(batt.shots_left)) * 4), 1) //4 is how many lights we have a sprite for + var/image/charge = image(icon, icon_state = "[chargename]_charge-[ratio]") + charge.color = "#29EAF4" //Could use battery color but eh. + charge.pixel_x = current * x_offset + add_overlay(charge) + + current++ //Increment for offsets + +/obj/item/ammo_magazine/cell_mag/advanced + name = "advanced microbattery magazine" + desc = "A microbattery holder for a cell-based variable weapon. This one has much more cell capacity!" + max_ammo = 6 + x_offset = 3 + icon_state = "cell_mag_extended" + + +// The Casing // +/obj/item/ammo_casing/microbattery + name = "\'NSFW\' microbattery - UNKNOWN" + desc = "A miniature battery for an energy weapon." + catalogue_data = list(/datum/category_item/catalogue/information/organization/khi) + icon = 'icons/obj/ammo_vr.dmi' + icon_state = "nsfw_batt" + slot_flags = SLOT_BELT | SLOT_EARS + throwforce = 1 + w_class = ITEMSIZE_TINY + var/shots_left = 4 + + leaves_residue = 0 + caliber = "nsfw" + var/type_color = null + var/type_name = null + projectile_type = /obj/item/projectile/beam + +/obj/item/ammo_casing/microbattery/Initialize() + . = ..() + pixel_x = rand(-10, 10) + pixel_y = rand(-10, 10) + update_icon() + +/obj/item/ammo_casing/microbattery/update_icon() + cut_overlays() + + var/image/ends = image(icon, icon_state = "[initial(icon_state)]_ends") + ends.color = type_color + add_overlay(ends) + +/obj/item/ammo_casing/microbattery/expend() + shots_left-- + + +// The Pack // +/obj/item/weapon/storage/secure/briefcase/nsfw_pack_hybrid + name = "hybrid cell-loaded gun kit" + desc = "A storage case for a multi-purpose handgun. Variety hour!" + w_class = ITEMSIZE_NORMAL + max_w_class = ITEMSIZE_NORMAL + +/obj/item/weapon/storage/secure/briefcase/nsfw_pack_hybrid/New() + ..() + new /obj/item/weapon/gun/projectile/cell_loaded(src) + new /obj/item/ammo_magazine/cell_mag/advanced(src) + new /obj/item/ammo_casing/microbattery/combat/stun(src) + new /obj/item/ammo_casing/microbattery/combat/stun(src) + new /obj/item/ammo_casing/microbattery/combat/stun(src) + new /obj/item/ammo_casing/microbattery/combat/net(src) + new /obj/item/ammo_casing/microbattery/combat/net(src) + new /obj/item/ammo_casing/microbattery/medical/brute3(src) + new /obj/item/ammo_casing/microbattery/medical/burn3(src) + new /obj/item/ammo_casing/microbattery/medical/stabilize2(src) + new /obj/item/ammo_casing/microbattery/medical/toxin3(src) + new /obj/item/ammo_casing/microbattery/medical/omni3(src) + +/obj/item/weapon/storage/secure/briefcase/nsfw_pack_hybrid_combat + name = "military cell-loaded gun kit" + desc = "A storage case for a multi-purpose handgun. Variety hour!" + w_class = ITEMSIZE_NORMAL + max_w_class = ITEMSIZE_NORMAL + +/obj/item/weapon/storage/secure/briefcase/nsfw_pack_hybrid_combat/New() + ..() + new /obj/item/weapon/gun/projectile/cell_loaded(src) + new /obj/item/ammo_magazine/cell_mag/advanced(src) + new /obj/item/ammo_casing/microbattery/combat/shotstun(src) + new /obj/item/ammo_casing/microbattery/combat/shotstun(src) + new /obj/item/ammo_casing/microbattery/combat/lethal(src) + new /obj/item/ammo_casing/microbattery/combat/lethal(src) + new /obj/item/ammo_casing/microbattery/combat/lethal(src) + new /obj/item/ammo_casing/microbattery/combat/ion(src) + new /obj/item/ammo_casing/microbattery/combat/xray(src) + new /obj/item/ammo_casing/microbattery/medical/stabilize2(src) + new /obj/item/ammo_casing/microbattery/medical/haste(src) + new /obj/item/ammo_casing/microbattery/medical/resist(src) \ No newline at end of file diff --git a/code/modules/vore/fluffstuff/guns/cell_loaded/ml3m.dm b/code/modules/vore/fluffstuff/guns/cell_loaded/ml3m.dm new file mode 100644 index 00000000000..6dbf09204f6 --- /dev/null +++ b/code/modules/vore/fluffstuff/guns/cell_loaded/ml3m.dm @@ -0,0 +1,72 @@ +// The Gun // +/obj/item/weapon/gun/projectile/cell_loaded/medical + name = "cell-loaded medigun" + desc = "The ML-3 'Medigun', or ML3M for short, is a powerful cell-based ranged healing device based on the KHI-102b NSFW. \ + It uses an internal nanite fabricator, powered and controlled by discrete cells, to deliver a variety of effects at range. Up to six combinations of \ + healing beams can be configured at once, depending on cartridge used. Ammo not included." + catalogue_data = list(/datum/category_item/catalogue/information/organization/vey_med) + + icon_state = "ml3m" + description_info = "This is a ranged healing device that uses interchangable nanite discharge cells in a magazine. Each cell is a different healing beam type, and up to three can be loaded in the magazine. Each battery usually provides four discharges of that beam type, and multiple from the same type may be loaded to increase the number of shots for that type." + description_fluff = "The Vey-Med ML-3 'Medigun' allows one to customize their loadout in the field, or before deploying, to allow emergency response personnel to deliver a variety of ranged healing options." + description_antag = "" + origin_tech = list(TECH_MATERIAL = 4, TECH_MAGNET = 2, TECH_BIO = 5) + allowed_magazines = list(/obj/item/ammo_magazine/cell_mag/medical) + +/obj/item/weapon/gun/projectile/cell_loaded/medical/cmo + name = "advanced cell-loaded medigun" + desc = "This is a variation on the ML-3 'Medigun', a powerful cell-based ranged healing device based on the KHI-102b NSFW. \ + It has an extended sight for increased accuracy, and much more comfortable grip. Ammo not included." + + icon_state = "ml3m_cmo" + + +// The Magazine // +/obj/item/ammo_magazine/cell_mag/medical //medical + name = "nanite magazine" + desc = "A nanite fabrication magazine for the \'ML-3/M\'" + catalogue_data = list(/datum/category_item/catalogue/information/organization/vey_med) + description_info = "This magazine holds self-charging nanite fabricators to power the ML-3 'Medigun'. Up to three can be loaded at once, and each provides four shots of their respective healing type. Loading multiple of the same type will provide additional shots of that type. The batteries can be recharged in a normal recharger." + ammo_type = /obj/item/ammo_casing/microbattery/medical + icon_state = "ml3m_mag" + origin_tech = list(TECH_MATERIAL = 3, TECH_BIO = 3) + +/obj/item/ammo_magazine/cell_mag/medical/advanced + name = "advanced nanite magazine" + desc = "A nanite discharge cell for the \'ML-3/M\'. This one is a more advanced version which can hold six individual nanite discharge cells." + max_ammo = 6 + x_offset = 3 + icon_state = "ml3m_mag_extended" + origin_tech = list(TECH_MATERIAL = 5, TECH_BIO = 5) + + +// The Pack // +/obj/item/weapon/storage/secure/briefcase/ml3m_pack_med + name = "\improper ML-3 \'Medigun\' kit" + desc = "A storage case for a multi-purpose healing gun. Variety hour!" + w_class = ITEMSIZE_NORMAL + max_w_class = ITEMSIZE_NORMAL + +/obj/item/weapon/storage/secure/briefcase/ml3m_pack_med/New() + ..() + new /obj/item/weapon/gun/projectile/cell_loaded/medical(src) + new /obj/item/ammo_magazine/cell_mag/medical(src) + new /obj/item/ammo_casing/microbattery/medical/brute(src) + new /obj/item/ammo_casing/microbattery/medical/burn(src) + new /obj/item/ammo_casing/microbattery/medical/stabilize(src) + +/obj/item/weapon/storage/secure/briefcase/ml3m_pack_cmo + name = "\improper Advanced ML-3 \'Medigun\' kit" + desc = "A storage case for a multi-purpose healing gun. Variety hour!" + w_class = ITEMSIZE_NORMAL + max_w_class = ITEMSIZE_NORMAL + +/obj/item/weapon/storage/secure/briefcase/ml3m_pack_cmo/New() + ..() + new /obj/item/weapon/gun/projectile/cell_loaded/medical/cmo(src) + new /obj/item/ammo_magazine/cell_mag/medical(src) + new /obj/item/ammo_casing/microbattery/medical/brute(src) + new /obj/item/ammo_casing/microbattery/medical/burn(src) + new /obj/item/ammo_casing/microbattery/medical/stabilize(src) + new /obj/item/ammo_casing/microbattery/medical/toxin(src) + new /obj/item/ammo_casing/microbattery/medical/omni(src) \ No newline at end of file diff --git a/code/modules/vore/fluffstuff/guns/cell_loaded/ml3m_cells.dm b/code/modules/vore/fluffstuff/guns/cell_loaded/ml3m_cells.dm new file mode 100644 index 00000000000..49f0a15e3f6 --- /dev/null +++ b/code/modules/vore/fluffstuff/guns/cell_loaded/ml3m_cells.dm @@ -0,0 +1,340 @@ +// The Casing // +/obj/item/ammo_casing/microbattery/medical + name = "\'ML-3/M\' nanite cell - UNKNOWN" + desc = "A miniature nanite fabricator for a medigun." + catalogue_data = list(/datum/category_item/catalogue/information/organization/vey_med) + icon_state = "ml3m_batt" + origin_tech = list(TECH_BIO = 2, TECH_MATERIAL = 1, TECH_MAGNETS = 2) + +/obj/item/projectile/beam/medical_cell + name = "\improper healing beam" + icon_state = "medbeam" + nodamage = 1 + damage = 0 + check_armour = "laser" + light_color = "#80F5FF" + + combustion = FALSE + + muzzle_type = /obj/effect/projectile/muzzle/medigun + tracer_type = /obj/effect/projectile/tracer/medigun + impact_type = /obj/effect/projectile/impact/medigun + +/obj/item/projectile/beam/medical_cell/on_hit(var/mob/living/carbon/human/target) //what does it do when it hits someone? + return + +/obj/item/ammo_casing/microbattery/medical/brute + name = "\'ML-3/M\' nanite cell - BRUTE" + type_color = "#BF0000" + type_name = "BRUTE" + projectile_type = /obj/item/projectile/beam/medical_cell/brute + +/obj/item/projectile/beam/medical_cell/brute/on_hit(var/mob/living/carbon/human/target) + if(istype(target, /mob/living/carbon/human)) + target.adjustBruteLoss(-5) + else + return 1 + +/obj/item/ammo_casing/microbattery/medical/burn + name = "\'ML-3/M\' nanite cell - BURN" + type_color = "#FF8000" + type_name = "BURN" + projectile_type = /obj/item/projectile/beam/medical_cell/burn + +/obj/item/projectile/beam/medical_cell/burn/on_hit(var/mob/living/carbon/human/target) + if(istype(target, /mob/living/carbon/human)) + target.adjustFireLoss(-5) + else + return 1 + +/obj/item/ammo_casing/microbattery/medical/stabilize + name = "\'ML-3/M\' nanite cell - STABILIZE" //Disinfects all open wounds, cures oxy damage + type_color = "#0080FF" + type_name = "STABILIZE" + projectile_type = /obj/item/projectile/beam/medical_cell/stabilize + +/obj/item/projectile/beam/medical_cell/stabilize/on_hit(var/mob/living/carbon/human/target) + if(istype(target, /mob/living/carbon/human)) + target.adjustOxyLoss(-30) + for(var/name in list(BP_HEAD, BP_L_HAND, BP_R_HAND, BP_L_ARM, BP_R_ARM, BP_L_FOOT, BP_R_FOOT, BP_L_LEG, BP_R_LEG, BP_GROIN, BP_TORSO)) + var/obj/item/organ/external/O = target.organs_by_name[name] + for (var/datum/wound/W in O.wounds) + if (W.internal) + continue + W.disinfect() + target.add_modifier(/datum/modifier/stabilize, 20 SECONDS) + else + return 1 + +/datum/modifier/stabilize + name = "stabilize" + desc = "Your injuries are stabilized and your pain abates!" + mob_overlay_state = "cyan_sparkles" + stacks = MODIFIER_STACK_EXTEND + pain_immunity = TRUE + bleeding_rate_percent = 0.1 //only a little + incoming_oxy_damage_percent = 0 + +/obj/item/ammo_casing/microbattery/medical/toxin + name = "\'ML-3/M\' nanite cell - TOXIN" + type_color = "#00A000" + type_name = "TOXIN" + projectile_type = /obj/item/projectile/beam/medical_cell/toxin + +/obj/item/projectile/beam/medical_cell/toxin/on_hit(var/mob/living/carbon/human/target) + if(istype(target, /mob/living/carbon/human)) + target.adjustToxLoss(-5) + else + return 1 + +/obj/item/ammo_casing/microbattery/medical/omni + name = "\'ML-3/M\' nanite cell - OMNI" + type_color = "#8040FF" + type_name = "OMNI" + projectile_type = /obj/item/projectile/beam/medical_cell/omni + +/obj/item/projectile/beam/medical_cell/omni/on_hit(var/mob/living/carbon/human/target) + if(istype(target, /mob/living/carbon/human)) + target.adjustBruteLoss(-2.5) + target.adjustFireLoss(-2.5) + target.adjustToxLoss(-2.5) + target.adjustOxyLoss(-10) + else + return 1 + +/obj/item/ammo_casing/microbattery/medical/antirad + name = "\'ML-3/M\' nanite cell - ANTIRAD" + type_color = "#008000" + type_name = "ANTIRAD" + projectile_type = /obj/item/projectile/beam/medical_cell/antirad + +/obj/item/projectile/beam/medical_cell/antirad/on_hit(var/mob/living/carbon/human/target) + if(istype(target, /mob/living/carbon/human)) + target.adjustToxLoss(-2.5) + target.radiation = max(target.radiation - 150, 0) //same as 5 units of arithrazine, sans the brute damage + else + return 1 + +/obj/item/ammo_casing/microbattery/medical/brute2 + name = "\'ML-3/M\' nanite cell - BRUTE-II" + type_color = "#BF0000" + type_name = "BRUTE-II" + projectile_type = /obj/item/projectile/beam/medical_cell/brute2 + +/obj/item/projectile/beam/medical_cell/brute2/on_hit(var/mob/living/carbon/human/target) + if(istype(target, /mob/living/carbon/human)) + target.adjustBruteLoss(-10) + else + return 1 + +/obj/item/ammo_casing/microbattery/medical/burn2 + name = "\'ML-3/M\' nanite cell - BURN-II" + type_color = "#FF8000" + type_name = "BURN-II" + projectile_type = /obj/item/projectile/beam/medical_cell/burn2 + +/obj/item/projectile/beam/medical_cell/burn2/on_hit(var/mob/living/carbon/human/target) + if(istype(target, /mob/living/carbon/human)) + target.adjustFireLoss(-10) + else + return 1 + +/obj/item/ammo_casing/microbattery/medical/stabilize2 + name = "\'ML-3/M\' nanite cell - STABILIZE-II" //Disinfects and bandages all open wounds, cures all oxy damage + type_color = "#0080FF" + type_name = "STABILIZE-II" + projectile_type = /obj/item/projectile/beam/medical_cell/stabilize2 + +/obj/item/projectile/beam/medical_cell/stabilize2/on_hit(var/mob/living/carbon/human/target) + if(istype(target, /mob/living/carbon/human)) + target.adjustOxyLoss(-200) + for(var/name in list(BP_HEAD, BP_L_HAND, BP_R_HAND, BP_L_ARM, BP_R_ARM, BP_L_FOOT, BP_R_FOOT, BP_L_LEG, BP_R_LEG, BP_GROIN, BP_TORSO)) + var/obj/item/organ/external/O = target.organs_by_name[name] + for (var/datum/wound/W in O.wounds) + if(W.internal) + continue + if(O.is_bandaged() == FALSE) + W.bandage() + if(O.is_salved() == FALSE) + W.salve() + W.disinfect() + target.add_modifier(/datum/modifier/stabilize, 20 SECONDS) + else + return 1 + +/obj/item/ammo_casing/microbattery/medical/omni2 + name = "\'ML-3/M\' nanite cell - OMNI-II" + type_color = "#8040FF" + type_name = "OMNI-II" + projectile_type = /obj/item/projectile/beam/medical_cell/omni2 + +/obj/item/projectile/beam/medical_cell/omni2/on_hit(var/mob/living/carbon/human/target) + if(istype(target, /mob/living/carbon/human)) + target.adjustBruteLoss(-5) + target.adjustFireLoss(-5) + target.adjustToxLoss(-5) + target.adjustOxyLoss(-30) + else + return 1 + +/obj/item/ammo_casing/microbattery/medical/toxin2 + name = "\'ML-3/M\' nanite cell - TOXIN-II" + type_color = "#00A000" + type_name = "TOXIN-II" + projectile_type = /obj/item/projectile/beam/medical_cell/toxin2 + +/obj/item/projectile/beam/medical_cell/toxin2/on_hit(var/mob/living/carbon/human/target) + if(istype(target, /mob/living/carbon/human)) + target.adjustToxLoss(-20) + else + return 1 + +/obj/item/ammo_casing/microbattery/medical/haste + name = "\'ML-3/M\' nanite cell - HASTE" + type_color = "#FF3300" + type_name = "HASTE" + projectile_type = /obj/item/projectile/beam/medical_cell/haste + +/obj/item/projectile/beam/medical_cell/haste/on_hit(var/mob/living/carbon/human/target) + if(istype(target, /mob/living/carbon/human)) + target.add_modifier(/datum/modifier/ml3mhaste, 20 SECONDS) + else + return 1 + +/datum/modifier/ml3mhaste + name = "haste" + desc = "You can move much faster!" + mob_overlay_state = "haste" + stacks = MODIFIER_STACK_EXTEND + slowdown = -0.5 //a little faster! + evasion = 1.15 //and a little harder to hit! + +/obj/item/ammo_casing/microbattery/medical/resist + name = "\'ML-3/M\' nanite cell - RESIST" + type_color = "#555555" + type_name = "RESIST" + projectile_type = /obj/item/projectile/beam/medical_cell/resist + +/obj/item/projectile/beam/medical_cell/resist/on_hit(var/mob/living/carbon/human/target) + if(istype(target, /mob/living/carbon/human)) + target.add_modifier(/datum/modifier/resistance, 20 SECONDS) + else + return 1 + +/datum/modifier/resistance + name = "resistance" + desc = "You resist 15% of all incoming damage and stuns!" + mob_overlay_state = "repel_missiles" + stacks = MODIFIER_STACK_EXTEND + disable_duration_percent = 0.85 + incoming_damage_percent = 0.85 + +/obj/item/ammo_casing/microbattery/medical/corpse_mend + name = "\'ML-3/M\' nanite cell - CORPSE MEND" + type_color = "#669900" + type_name = "CORPSE MEND" + projectile_type = /obj/item/projectile/beam/medical_cell/corpse_mend + +/obj/item/projectile/beam/medical_cell/corpse_mend/on_hit(var/mob/living/carbon/human/target) + if(istype(target, /mob/living/carbon/human)) + if(target.stat == DEAD) + target.adjustBruteLoss(-50) + target.adjustFireLoss(-50) + target.adjustToxLoss(-50) + target.adjustOxyLoss(-200) + else + return 1 + +/obj/item/ammo_casing/microbattery/medical/brute3 + name = "\'ML-3/M\' nanite cell - BRUTE-III" + type_color = "#BF0000" + type_name = "BRUTE-III" + projectile_type = /obj/item/projectile/beam/medical_cell/brute3 + +/obj/item/projectile/beam/medical_cell/brute3/on_hit(var/mob/living/carbon/human/target) + if(istype(target, /mob/living/carbon/human)) + target.adjustBruteLoss(-20) + else + return 1 + +/obj/item/ammo_casing/microbattery/medical/burn3 + name = "\'ML-3/M\' nanite cell - BURN-III" + type_color = "#FF8000" + type_name = "BURN-III" + projectile_type = /obj/item/projectile/beam/medical_cell/burn3 + +/obj/item/projectile/beam/medical_cell/burn3/on_hit(var/mob/living/carbon/human/target) + if(istype(target, /mob/living/carbon/human)) + target.adjustFireLoss(-20) + else + return 1 + +/obj/item/ammo_casing/microbattery/medical/toxin3 + name = "\'ML-3/M\' nanite cell - TOXIN-III" + type_color = "#00A000" + type_name = "TOXIN-III" + projectile_type = /obj/item/projectile/beam/medical_cell/toxin3 + +/obj/item/projectile/beam/medical_cell/toxin3/on_hit(var/mob/living/carbon/human/target) + if(istype(target, /mob/living/carbon/human)) + target.adjustToxLoss(-20) + else + return 1 + +/obj/item/ammo_casing/microbattery/medical/omni3 + name = "\'ML-3/M\' nanite cell - OMNI-III" + type_color = "#8040FF" + type_name = "OMNI-III" + projectile_type = /obj/item/projectile/beam/medical_cell/omni3 + +/obj/item/projectile/beam/medical_cell/omni3/on_hit(var/mob/living/carbon/human/target) + if(istype(target, /mob/living/carbon/human)) + target.adjustBruteLoss(-10) + target.adjustFireLoss(-10) + target.adjustToxLoss(-10) + target.adjustOxyLoss(-60) + else + return 1 + +// Illegal cells! +/obj/item/ammo_casing/microbattery/medical/shrink + name = "\'ML-3/M\' nanite cell - SHRINK" + type_color = "#910ffc" + type_name = "SHRINK" + projectile_type = /obj/item/projectile/beam/medical_cell/shrink + +/obj/item/projectile/beam/medical_cell/shrink/on_hit(var/mob/living/carbon/human/target) + if(istype(target, /mob/living/carbon/human)) + target.resize(0.5) + target.show_message("The beam fires into your body, changing your size!") + target.updateicon() + else + return 1 + +/obj/item/ammo_casing/microbattery/medical/grow + name = "\'ML-3/M\' nanite cell - GROW" + type_color = "#fc0fdc" + type_name = "GROW" + projectile_type = /obj/item/projectile/beam/medical_cell/grow + +/obj/item/projectile/beam/medical_cell/grow/on_hit(var/mob/living/carbon/human/target) + if(istype(target, /mob/living/carbon/human)) + target.resize(2.0) + target.show_message("The beam fires into your body, changing your size!") + target.updateicon() + else + return 1 + +/obj/item/ammo_casing/microbattery/medical/normalsize + name = "\'ML-3/M\' nanite cell - NORMALSIZE" + type_color = "#C70FEC" + type_name = "NORMALSIZE" + projectile_type = /obj/item/projectile/beam/medical_cell/normalsize + +/obj/item/projectile/beam/medical_cell/normalsize/on_hit(var/mob/living/carbon/human/target) + if(istype(target, /mob/living/carbon/human)) + target.resize(1) + target.show_message("The beam fires into your body, changing your size!") + target.updateicon() + else + return 1 \ No newline at end of file diff --git a/code/modules/vore/fluffstuff/guns/cell_loaded/nsfw.dm b/code/modules/vore/fluffstuff/guns/cell_loaded/nsfw.dm new file mode 100644 index 00000000000..241e2e2c1dc --- /dev/null +++ b/code/modules/vore/fluffstuff/guns/cell_loaded/nsfw.dm @@ -0,0 +1,75 @@ +// The Gun // +/obj/item/weapon/gun/projectile/cell_loaded/combat + name = "cell-loaded revolver" + desc = "Variety is the spice of life! The KHI-102b 'Nanotech Selectable-Fire Weapon', or NSFW for short, is an unholy hybrid of an ammo-driven \ + energy weapon that allows the user to mix and match their own fire modes. Up to four combinations of \ + energy beams can be configured at once. Ammo not included." + catalogue_data = list(/datum/category_item/catalogue/information/organization/khi) + + description_fluff = "The Kitsuhana 'Nanotech Selectable Fire Weapon' allows one to customize their loadout in the field, or before deploying, to achieve various results in a weapon they are already familiar with wielding." + allowed_magazines = list(/obj/item/ammo_magazine/cell_mag/combat) + +/obj/item/weapon/gun/projectile/cell_loaded/combat/prototype + name = "prototype cell-loaded revolver" + desc = "Variety is the spice of life! A prototype based on KHI-102b 'Nanotech Selectable-Fire Weapon', or NSFW for short, is an unholy hybrid of an ammo-driven \ + energy weapon that allows the user to mix and match their own fire modes. Up to two combinations of \ + energy beams can be configured at once. Ammo not included." + + description_info = "This gun is an energy weapon that uses interchangable microbatteries in a magazine. Each battery is a different beam type, and up to three can be loaded in the magazine. Each battery usually provides four discharges of that beam type, and multiple from the same type may be loaded to increase the number of shots for that type." + description_antag = "" + allowed_magazines = list(/obj/item/ammo_magazine/cell_mag/combat/prototype) + + origin_tech = list(TECH_COMBAT = 7, TECH_MATERIAL = 4, TECH_MAGNETS = 3) + + +// The Magazine // +/obj/item/ammo_magazine/cell_mag/combat + name = "microbattery magazine" + desc = "A microbattery holder for the \'NSFW\'" + icon_state = "nsfw_mag" + max_ammo = 4 + x_offset = 4 + catalogue_data = list(/datum/category_item/catalogue/information/organization/khi) + description_info = "This magazine holds NSFW microbatteries to power the NSFW handgun. Up to three can be loaded at once, and each provides four shots of their respective energy type. Loading multiple of the same type will provide additional shots of that type. The batteries can be recharged in a normal recharger." + ammo_type = /obj/item/ammo_casing/microbattery/combat + +/obj/item/ammo_magazine/cell_mag/combat/prototype + name = "prototype microbattery magazine" + icon_state = "nsfw_mag_prototype" + max_ammo = 2 + x_offset = 6 + catalogue_data = null + origin_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 3, TECH_MAGNETS = 2) + + +// The Pack // +/obj/item/weapon/storage/secure/briefcase/nsfw_pack + name = "\improper KHI-102b \'NSFW\' gun kit" + desc = "A storage case for a multi-purpose handgun. Variety hour!" + w_class = ITEMSIZE_NORMAL + max_w_class = ITEMSIZE_NORMAL + +/obj/item/weapon/storage/secure/briefcase/nsfw_pack/New() + ..() + new /obj/item/weapon/gun/projectile/cell_loaded/combat(src) + new /obj/item/ammo_magazine/cell_mag/combat(src) + for(var/path in subtypesof(/obj/item/ammo_casing/microbattery/combat)) + new path(src) + +/obj/item/weapon/storage/secure/briefcase/nsfw_pack_hos + name = "\improper KHI-102b \'NSFW\' gun kit" + desc = "A storage case for a multi-purpose handgun. Variety hour!" + w_class = ITEMSIZE_NORMAL + max_w_class = ITEMSIZE_NORMAL + +/obj/item/weapon/storage/secure/briefcase/nsfw_pack_hos/New() + ..() + new /obj/item/weapon/gun/projectile/cell_loaded/combat(src) + new /obj/item/ammo_magazine/cell_mag/combat(src) + new /obj/item/ammo_casing/microbattery/combat/lethal(src) + new /obj/item/ammo_casing/microbattery/combat/lethal(src) + new /obj/item/ammo_casing/microbattery/combat/stun(src) + new /obj/item/ammo_casing/microbattery/combat/stun(src) + new /obj/item/ammo_casing/microbattery/combat/stun(src) + new /obj/item/ammo_casing/microbattery/combat/net(src) + new /obj/item/ammo_casing/microbattery/combat/ion(src) \ No newline at end of file diff --git a/code/modules/vore/fluffstuff/guns/cell_loaded/nsfw_cells.dm b/code/modules/vore/fluffstuff/guns/cell_loaded/nsfw_cells.dm new file mode 100644 index 00000000000..946368baadc --- /dev/null +++ b/code/modules/vore/fluffstuff/guns/cell_loaded/nsfw_cells.dm @@ -0,0 +1,115 @@ +// The Casing // +/obj/item/ammo_casing/microbattery/combat + name = "\'NSFW\' microbattery - UNKNOWN" + desc = "A miniature battery for an energy weapon." + catalogue_data = list(/datum/category_item/catalogue/information/organization/khi) + origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 1, TECH_MAGNETS = 2) + +/obj/item/ammo_casing/microbattery/combat/lethal + name = "\'NSFW\' microbattery - LETHAL" + type_color = "#bf3d3d" + type_name = "LETHAL" + projectile_type = /obj/item/projectile/beam + +/obj/item/ammo_casing/microbattery/combat/stun + name = "\'NSFW\' microbattery - STUN" + type_color = "#0f81bc" + type_name = "STUN" + projectile_type = /obj/item/projectile/beam/stun/blue + +/obj/item/ammo_casing/microbattery/combat/net + name = "\'NSFW\' microbattery - NET" + type_color = "#43f136" + type_name = "NET" + projectile_type = /obj/item/projectile/beam/energy_net + +/obj/item/ammo_casing/microbattery/combat/xray + name = "\'NSFW\' microbattery - XRAY" + type_color = "#32c025" + type_name = "XRAY" + projectile_type = /obj/item/projectile/beam/xray + +/obj/item/ammo_casing/microbattery/combat/shotstun + name = "\'NSFW\' microbattery - SCATTERSTUN" + type_color = "#88ffff" + type_name = "SCATTERSTUN" + projectile_type = /obj/item/projectile/bullet/pellet/e_shot_stun + +/obj/item/projectile/bullet/pellet/e_shot_stun + icon_state = "spell" + damage = 2 + agony = 20 + pellets = 6 //number of pellets + range_step = 2 //projectile will lose a fragment each time it travels this distance. Can be a non-integer. + base_spread = 90 //lower means the pellets spread more across body parts. If zero then this is considered a shrapnel explosion instead of a shrapnel cone + spread_step = 10 + embed_chance = 0 + sharp = 0 + check_armour = "melee" + +/obj/item/ammo_casing/microbattery/combat/ion + name = "\'NSFW\' microbattery - ION" + type_color = "#d084d6" + type_name = "ION" + projectile_type = /obj/item/projectile/ion/small + +/obj/item/ammo_casing/microbattery/combat/stripper + name = "\'NSFW\' microbattery - STRIPPER" + type_color = "#fc8d0f" + type_name = "STRIPPER" + projectile_type = /obj/item/projectile/bullet/stripper + +/obj/item/projectile/bullet/stripper + icon_state = "magicm" + nodamage = 1 + agony = 5 + embed_chance = 0 + sharp = 0 + check_armour = "melee" + +/obj/item/projectile/bullet/stripper/on_hit(var/atom/stripped) + if(ishuman(stripped)) + var/mob/living/carbon/human/H = stripped + if(H.wear_suit) + H.unEquip(H.wear_suit) + if(H.w_uniform) + H.unEquip(H.w_uniform) + if(H.back) + H.unEquip(H.back) + if(H.shoes) + H.unEquip(H.shoes) + if(H.gloves) + H.unEquip(H.gloves) + //Hats can stay! Most other things fall off with removing these. + ..() + +/obj/item/ammo_casing/microbattery/combat/final + name = "\'NSFW\' microbattery - FINAL OPTION" + type_color = "#fcfc0f" + type_name = "FINAL OPTION" //Doesn't look good in yellow in chat + projectile_type = /obj/item/projectile/beam/final_option + +/obj/item/projectile/beam/final_option + name = "final option beam" + icon_state = "omnilaser" + nodamage = 1 + agony = 5 + damage_type = HALLOSS + light_color = "#00CC33" + + muzzle_type = /obj/effect/projectile/muzzle/laser_omni + tracer_type = /obj/effect/projectile/tracer/laser_omni + impact_type = /obj/effect/projectile/impact/laser_omni + +/obj/item/projectile/beam/final_option/on_hit(var/atom/impacted) + if(isliving(impacted)) + var/mob/living/L = impacted + if(L.mind) + var/nif + if(ishuman(L)) + var/mob/living/carbon/human/H = L + nif = H.nif + SStranscore.m_backup(L.mind,nif,one_time = TRUE) + L.gib() + + ..() \ No newline at end of file diff --git a/code/modules/vore/fluffstuff/guns/nsfw.dm b/code/modules/vore/fluffstuff/guns/nsfw.dm deleted file mode 100644 index 78aa05de536..00000000000 --- a/code/modules/vore/fluffstuff/guns/nsfw.dm +++ /dev/null @@ -1,370 +0,0 @@ -// -------------- NSFW ------------- -/obj/item/weapon/gun/projectile/nsfw - name = "cell-loaded revolver" - desc = "Variety is the spice of life! The KHI-102b 'Nanotech Selectable-Fire Weapon', or NSFW for short, is an unholy hybrid of an ammo-driven \ - energy weapon that allows the user to mix and match their own fire modes. Up to three combinations of \ - energy beams can be configured at once. Ammo not included." - catalogue_data = list(/datum/category_item/catalogue/information/organization/khi) - - description_info = "This gun is an energy weapon that uses interchangable microbatteries in a magazine. Each battery is a different beam type, and up to three can be loaded in the magazine. Each battery usually provides four discharges of that beam type, and multiple from the same type may be loaded to increase the number of shots for that type." - description_fluff = "The Kitsuhana 'Nanotech Selectable Fire Weapon' allows one to customize their loadout in the field, or before deploying, to achieve various results in a weapon they are already familiar with wielding." - description_antag = "" - - icon = 'icons/vore/custom_guns_vr.dmi' - icon_state = "nsfw" - - icon_override = 'icons/vore/custom_guns_vr.dmi' - item_state = "gun" - - caliber = "nsfw" - - origin_tech = list(TECH_COMBAT = 7, TECH_MATERIAL = 6, TECH_MAGNETS = 4) - - fire_sound = 'sound/weapons/Taser.ogg' - - load_method = MAGAZINE //Nyeh heh hehhh. - magazine_type = null - allowed_magazines = list(/obj/item/ammo_magazine/nsfw_mag) - handle_casings = HOLD_CASINGS //Don't eject batteries! - recoil = 0 - var/charge_left = 0 - var/max_charge = 0 - charge_sections = 5 - -/obj/item/weapon/gun/projectile/nsfw/consume_next_projectile() - if(chambered && ammo_magazine) - var/obj/item/ammo_casing/nsfw_batt/batt = chambered - if(batt.shots_left) - return new chambered.projectile_type() - else - for(var/B in ammo_magazine.stored_ammo) - var/obj/item/ammo_casing/nsfw_batt/other_batt = B - if(istype(other_batt,chambered.type) && other_batt.shots_left) - switch_to(other_batt) - return new chambered.projectile_type() - break - - return null - -/obj/item/weapon/gun/projectile/nsfw/proc/update_charge() - charge_left = 0 - max_charge = 0 - - if(!chambered) - return - - var/obj/item/ammo_casing/nsfw_batt/batt = chambered - - charge_left = batt.shots_left - max_charge = initial(batt.shots_left) - if(ammo_magazine) //Crawl to find more - for(var/B in ammo_magazine.stored_ammo) - var/obj/item/ammo_casing/nsfw_batt/bullet = B - if(istype(bullet,batt.type)) - charge_left += bullet.shots_left - max_charge += initial(bullet.shots_left) - -/obj/item/weapon/gun/projectile/nsfw/proc/switch_to(obj/item/ammo_casing/nsfw_batt/new_batt) - if(ishuman(loc)) - if(chambered && new_batt.type == chambered.type) - to_chat(loc,"\The [src] is now using the next [new_batt.type_name] power cell.") - else - to_chat(loc,"\The [src] is now firing [new_batt.type_name].") - - chambered = new_batt - update_charge() - update_icon() - -/obj/item/weapon/gun/projectile/nsfw/attack_self(mob/user) - if(!chambered) - return - - var/list/stored_ammo = ammo_magazine.stored_ammo - - if(stored_ammo.len == 1) - return //silly you. - - //Find an ammotype that ISN'T the same, or exhaust the list and don't change. - var/our_slot = stored_ammo.Find(chambered) - - for(var/index in 1 to stored_ammo.len) - var/true_index = ((our_slot + index - 1) % stored_ammo.len) + 1 // Stupid ONE BASED lists! - var/obj/item/ammo_casing/nsfw_batt/next_batt = stored_ammo[true_index] - if(chambered != next_batt && !istype(next_batt, chambered.type)) - switch_to(next_batt) - break -/* -/obj/item/weapon/gun/projectile/nsfw/special_check(mob/user) - if(!chambered) - return - - var/obj/item/ammo_casing/nsfw_batt/batt = chambered - if(!batt.shots_left) - return FALSE - - return TRUE -*/ -/obj/item/weapon/gun/projectile/nsfw/load_ammo(var/obj/item/A, mob/user) - . = ..() - if(ammo_magazine && ammo_magazine.stored_ammo.len) - switch_to(ammo_magazine.stored_ammo[1]) - -/obj/item/weapon/gun/projectile/nsfw/unload_ammo(mob/user, var/allow_dump=1) - chambered = null - return ..() - -/obj/item/weapon/gun/projectile/nsfw/update_icon() - update_charge() - - cut_overlays() - if(!chambered) - return - - var/obj/item/ammo_casing/nsfw_batt/batt = chambered - var/batt_color = batt.type_color //Used many times - - //Mode bar - var/image/mode_bar = image(icon, icon_state = "[initial(icon_state)]_type") - mode_bar.color = batt_color - add_overlay(mode_bar) - - //Barrel color - var/image/barrel_color = image(icon, icon_state = "[initial(icon_state)]_barrel") - barrel_color.alpha = 150 - barrel_color.color = batt_color - add_overlay(barrel_color) - - //Charge bar - var/ratio = CEILING(((charge_left / max_charge) * charge_sections), 1) - for(var/i = 0, i < ratio, i++) - var/image/charge_bar = image(icon, icon_state = "[initial(icon_state)]_charge") - charge_bar.pixel_x = i - charge_bar.color = batt_color - add_overlay(charge_bar) - -// The Magazine // -/obj/item/ammo_magazine/nsfw_mag - name = "microbattery magazine" - desc = "A microbattery holder for the \'NSFW\'" - catalogue_data = list(/datum/category_item/catalogue/information/organization/khi) - - description_info = "This magazine holds NSFW microbatteries to power the NSFW handgun. Up to three can be loaded at once, and each provides four shots of their respective energy type. Loading multiple of the same type will provide additional shots of that type. The batteries can be recharged in a normal recharger." - - icon = 'icons/obj/ammo_vr.dmi' - icon_state = "nsfw_mag" - caliber = "nsfw" - matter = list(DEFAULT_WALL_MATERIAL = 1680, "glass" = 2000) - ammo_type = /obj/item/ammo_casing/nsfw_batt - initial_ammo = 0 - max_ammo = 3 - mag_type = MAGAZINE - - var/list/modes = list() - -/obj/item/ammo_magazine/nsfw_mag/update_icon() - cut_overlays() - if(!stored_ammo.len) - return //Why bother - - var/x_offset = 5 - var/current = 0 - for(var/B in stored_ammo) - var/obj/item/ammo_casing/nsfw_batt/batt = B - var/image/cap = image(icon, icon_state = "[initial(icon_state)]_cap") - cap.color = batt.type_color - cap.pixel_x = current * x_offset //Caps don't need a pixel_y offset - add_overlay(cap) - - if(batt.shots_left) - var/ratio = CEILING(((batt.shots_left / initial(batt.shots_left)) * 4), 1) //4 is how many lights we have a sprite for - var/image/charge = image(icon, icon_state = "[initial(icon_state)]_charge-[ratio]") - charge.color = "#29EAF4" //Could use battery color but eh. - charge.pixel_x = current * x_offset - add_overlay(charge) - - current++ //Increment for offsets - -// The Casing // -/obj/item/ammo_casing/nsfw_batt - name = "\'NSFW\' microbattery - UNKNOWN" - desc = "A miniature battery for an energy weapon." - catalogue_data = list(/datum/category_item/catalogue/information/organization/khi) - icon = 'icons/obj/ammo_vr.dmi' - icon_state = "nsfw_batt" - slot_flags = SLOT_BELT | SLOT_EARS - throwforce = 1 - w_class = ITEMSIZE_TINY - - leaves_residue = 0 - caliber = "nsfw" - var/shots_left = 4 - var/type_color = null - var/type_name = null - projectile_type = /obj/item/projectile/beam - -/obj/item/ammo_casing/nsfw_batt/Initialize() - . = ..() - pixel_x = rand(-10, 10) - pixel_y = rand(-10, 10) - update_icon() - -/obj/item/ammo_casing/nsfw_batt/update_icon() - cut_overlays() - - var/image/ends = image(icon, icon_state = "[initial(icon_state)]_ends") - ends.color = type_color - add_overlay(ends) - -/obj/item/ammo_casing/nsfw_batt/expend() - shots_left-- - -// Specific batteries // -/obj/item/ammo_casing/nsfw_batt/lethal - name = "\'NSFW\' microbattery - LETHAL" - type_color = "#bf3d3d" - type_name = "LETHAL" - projectile_type = /obj/item/projectile/beam - -/obj/item/ammo_casing/nsfw_batt/stun - name = "\'NSFW\' microbattery - STUN" - type_color = "#0f81bc" - type_name = "STUN" - projectile_type = /obj/item/projectile/beam/stun/blue - -/obj/item/ammo_casing/nsfw_batt/net - name = "\'NSFW\' microbattery - NET" - type_color = "#43f136" - type_name = "NET" - projectile_type = /obj/item/projectile/beam/energy_net - -/obj/item/ammo_casing/nsfw_batt/xray - name = "\'NSFW\' microbattery - XRAY" - type_color = "#32c025" - type_name = "XRAY" - projectile_type = /obj/item/projectile/beam/xray - -/obj/item/ammo_casing/nsfw_batt/shotstun - name = "\'NSFW\' microbattery - SCATTERSTUN" - type_color = "#88ffff" - type_name = "SCATTERSTUN" - projectile_type = /obj/item/projectile/bullet/pellet/e_shot_stun - -/obj/item/projectile/bullet/pellet/e_shot_stun - icon_state = "spell" - damage = 2 - agony = 20 - pellets = 6 //number of pellets - range_step = 2 //projectile will lose a fragment each time it travels this distance. Can be a non-integer. - base_spread = 90 //lower means the pellets spread more across body parts. If zero then this is considered a shrapnel explosion instead of a shrapnel cone - spread_step = 10 - embed_chance = 0 - sharp = 0 - check_armour = "melee" - -/obj/item/ammo_casing/nsfw_batt/ion - name = "\'NSFW\' microbattery - ION" - type_color = "#d084d6" - type_name = "ION" - projectile_type = /obj/item/projectile/ion/small - -/obj/item/ammo_casing/nsfw_batt/stripper - name = "\'NSFW\' microbattery - STRIPPER" - type_color = "#fc8d0f" - type_name = "STRIPPER" - projectile_type = /obj/item/projectile/bullet/stripper - -/obj/item/projectile/bullet/stripper - icon_state = "magicm" - nodamage = 1 - agony = 5 - embed_chance = 0 - sharp = 0 - check_armour = "melee" - -/obj/item/projectile/bullet/stripper/on_hit(var/atom/stripped) - if(ishuman(stripped)) - var/mob/living/carbon/human/H = stripped - if(H.wear_suit) - H.unEquip(H.wear_suit) - if(H.w_uniform) - H.unEquip(H.w_uniform) - if(H.back) - H.unEquip(H.back) - if(H.shoes) - H.unEquip(H.shoes) - if(H.gloves) - H.unEquip(H.gloves) - //Hats can stay! Most other things fall off with removing these. - ..() - -/obj/item/ammo_casing/nsfw_batt/final - name = "\'NSFW\' microbattery - FINAL OPTION" - type_color = "#fcfc0f" - type_name = "FINAL OPTION" //Doesn't look good in yellow in chat - projectile_type = /obj/item/projectile/beam/final_option - -/obj/item/projectile/beam/final_option - name = "final option beam" - icon_state = "omnilaser" - nodamage = 1 - agony = 5 - damage_type = HALLOSS - light_color = "#00CC33" - - muzzle_type = /obj/effect/projectile/muzzle/laser_omni - tracer_type = /obj/effect/projectile/tracer/laser_omni - impact_type = /obj/effect/projectile/impact/laser_omni - -/obj/item/projectile/beam/final_option/on_hit(var/atom/impacted) - if(isliving(impacted)) - var/mob/living/L = impacted - if(L.mind) - var/nif - if(ishuman(L)) - var/mob/living/carbon/human/H = L - nif = H.nif - SStranscore.m_backup(L.mind,nif,one_time = TRUE) - L.gib() - - ..() -/* -/obj/item/ammo_casing/nsfw_batt/shrink - name = "\'NSFW\' microbattery - SHRINK" - type_color = "#910ffc" - type_name = "SHRINK" - projectile_type = /obj/item/projectile/beam/shrinklaser - -/obj/item/ammo_casing/nsfw_batt/grow - name = "\'NSFW\' microbattery - GROW" - type_color = "#fc0fdc" - type_name = "GROW" - projectile_type = /obj/item/projectile/beam/growlaser -*/ -/obj/item/weapon/storage/secure/briefcase/nsfw_pack - name = "\improper KHI-102b \'NSFW\' gun kit" - desc = "A storage case for a multi-purpose handgun. Variety hour!" - max_w_class = ITEMSIZE_NORMAL - -/obj/item/weapon/storage/secure/briefcase/nsfw_pack/New() - ..() - new /obj/item/weapon/gun/projectile/nsfw(src) - new /obj/item/ammo_magazine/nsfw_mag(src) - for(var/path in subtypesof(/obj/item/ammo_casing/nsfw_batt)) - new path(src) - -/obj/item/weapon/storage/secure/briefcase/nsfw_pack_hos - name = "\improper KHI-102b \'NSFW\' gun kit" - desc = "A storage case for a multi-purpose handgun. Variety hour!" - max_w_class = ITEMSIZE_NORMAL - -/obj/item/weapon/storage/secure/briefcase/nsfw_pack_hos/New() - ..() - new /obj/item/weapon/gun/projectile/nsfw(src) - new /obj/item/ammo_magazine/nsfw_mag(src) - new /obj/item/ammo_casing/nsfw_batt/lethal(src) - new /obj/item/ammo_casing/nsfw_batt/lethal(src) - new /obj/item/ammo_casing/nsfw_batt/stun(src) - new /obj/item/ammo_casing/nsfw_batt/stun(src) - new /obj/item/ammo_casing/nsfw_batt/net(src) - new /obj/item/ammo_casing/nsfw_batt/ion(src) - diff --git a/code/modules/vore/fluffstuff/guns/protector.dm b/code/modules/vore/fluffstuff/guns/protector.dm index c66a8fb7d2d..b090e963d68 100644 --- a/code/modules/vore/fluffstuff/guns/protector.dm +++ b/code/modules/vore/fluffstuff/guns/protector.dm @@ -108,12 +108,3 @@ muzzle_type = /obj/effect/projectile/muzzle/laser_omni tracer_type = /obj/effect/projectile/tracer/laser_omni impact_type = /obj/effect/projectile/impact/laser_omni - -//R&D Design -/datum/design/item/weapon/protector - desc = "The 'Protector' is an advanced energy gun that cannot be fired in lethal mode on low security alert levels, but features DNA locking and a powerful stun." - id = "protector" - req_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 3, TECH_MAGNET = 2) - materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 2000, "silver" = 1000) - build_path = /obj/item/weapon/gun/energy/protector - sort_string = "TAADA" diff --git a/code/modules/vore/fluffstuff/guns/pummeler.dm b/code/modules/vore/fluffstuff/guns/pummeler.dm index 082af9a9cfd..75563208f27 100644 --- a/code/modules/vore/fluffstuff/guns/pummeler.dm +++ b/code/modules/vore/fluffstuff/guns/pummeler.dm @@ -46,12 +46,3 @@ L.throw_at(get_edge_target_turf(L, throwdir), rand(3,6), 10) return 1 - -//R&D Design -/datum/design/item/weapon/pummeler - desc = "With the 'Pummeler', punt anyone you don't like out of the room!" - id = "pummeler" - req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_MAGNET = 5) - materials = list(DEFAULT_WALL_MATERIAL = 3000, "glass" = 3000, "uranium" = 1000) - build_path = /obj/item/weapon/gun/energy/pummeler - sort_string = "TAADC" diff --git a/code/modules/vore/fluffstuff/guns/sickshot.dm b/code/modules/vore/fluffstuff/guns/sickshot.dm index 385a69efd6c..098db695979 100644 --- a/code/modules/vore/fluffstuff/guns/sickshot.dm +++ b/code/modules/vore/fluffstuff/guns/sickshot.dm @@ -46,12 +46,3 @@ H.Confuse(2) return 1 - -//R&D Design -/datum/design/item/weapon/sickshot - desc = "A 'Sickshot' is a 4-shot energy revolver that causes nausea and confusion." - id = "sickshot" - req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_MAGNET = 2) - materials = list(DEFAULT_WALL_MATERIAL = 3000, "glass" = 2000) - build_path = /obj/item/weapon/gun/energy/sickshot - sort_string = "TAADB" diff --git a/code/modules/vore/resizing/holder_micro_vr.dm b/code/modules/vore/resizing/holder_micro_vr.dm index 4e7e855ae81..d9db06118ff 100644 --- a/code/modules/vore/resizing/holder_micro_vr.dm +++ b/code/modules/vore/resizing/holder_micro_vr.dm @@ -4,6 +4,7 @@ name = "micro" desc = "Another crewmember, small enough to fit in your hand." icon_state = "micro" + icon_override = 'icons/mob/head_vr.dmi' slot_flags = SLOT_FEET | SLOT_HEAD | SLOT_ID w_class = ITEMSIZE_SMALL item_icons = list() // No in-hand sprites (for now, anyway, we could totally add some) @@ -34,4 +35,9 @@ var/turf/here = get_turf(src) for(var/atom/movable/A in src) A.forceMove(here) - return ..() \ No newline at end of file + return ..() + +/obj/item/weapon/holder/micro/sync(var/mob/living/M) + ..() + for(var/mob/living/carbon/human/I in contents) + item_state = lowertext(I.species.name) \ No newline at end of file diff --git a/code/modules/vore/resizing/resize_vr.dm b/code/modules/vore/resizing/resize_vr.dm index c92121da918..2073f499c1a 100644 --- a/code/modules/vore/resizing/resize_vr.dm +++ b/code/modules/vore/resizing/resize_vr.dm @@ -135,7 +135,7 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2 var/mob/living/simple_mob/SA = M if(!SA.has_hands) return 0 - if(M.buckled) + if(buckled) to_chat(usr,"You have to unbuckle \the [M] before you pick them up.") return 0 if(size_diff >= 0.50) diff --git a/code/modules/vore/resizing/sizegun_vr.dm b/code/modules/vore/resizing/sizegun_vr.dm index 705bf3538d7..984e05f8edf 100644 --- a/code/modules/vore/resizing/sizegun_vr.dm +++ b/code/modules/vore/resizing/sizegun_vr.dm @@ -82,3 +82,11 @@ H.updateicon() else return 1 + + +/obj/item/projectile/beam/sizelaser/shrink + set_size = 0.5 //50% of current size + + +/obj/item/projectile/beam/sizelaser/grow + set_size = 2.0 //200% of current size \ No newline at end of file diff --git a/code/modules/xenoarcheaology/effects/radiate.dm b/code/modules/xenoarcheaology/effects/radiate.dm index a083cdddbc4..e38540eb045 100644 --- a/code/modules/xenoarcheaology/effects/radiate.dm +++ b/code/modules/xenoarcheaology/effects/radiate.dm @@ -15,10 +15,10 @@ /datum/artifact_effect/radiate/DoEffectAura() if(holder) - radiation_repository.flat_radiate(holder, radiation_amount, src.effectrange) + SSradiation.flat_radiate(holder, radiation_amount, src.effectrange) return 1 /datum/artifact_effect/radiate/DoEffectPulse() if(holder) - radiation_repository.radiate(holder, ((radiation_amount * 3) * (sqrt(src.effectrange)))) //Need to get feedback on this //VOREStation Edit - Was too crazy-strong. + SSradiation.radiate(holder, ((radiation_amount * 3) * (sqrt(src.effectrange)))) //Need to get feedback on this //VOREStation Edit - Was too crazy-strong. return 1 diff --git a/code/modules/xenoarcheaology/finds/find_spawning.dm b/code/modules/xenoarcheaology/finds/find_spawning.dm index 2c04d491d05..be86279b087 100644 --- a/code/modules/xenoarcheaology/finds/find_spawning.dm +++ b/code/modules/xenoarcheaology/finds/find_spawning.dm @@ -511,6 +511,16 @@ desc = new_item.desc item_type = new_item.name + if(39) + // Telecube. + if(prob(25)) + apply_prefix = FALSE + if(prob(75)) + apply_image_decorations = TRUE + if(prob(25)) + apply_material_decorations = FALSE + new_item = new /obj/item/weapon/telecube/randomized(src.loc) + if(istype(new_item, /obj/item/weapon/material)) var/new_item_mat = pickweight( DEFAULT_WALL_MATERIAL = 80, diff --git a/code/modules/xenoarcheaology/finds/finds.dm b/code/modules/xenoarcheaology/finds/finds.dm index ab5d00e7861..8e89dcd9478 100644 --- a/code/modules/xenoarcheaology/finds/finds.dm +++ b/code/modules/xenoarcheaology/finds/finds.dm @@ -14,20 +14,22 @@ clearance_range = rand(4, 12) dissonance_spread = rand(1500, 2500) / 100 -/obj/item/weapon/ore/strangerock +/obj/item/weapon/strangerock name = "Strange rock" desc = "Seems to have some unusal strata evident throughout it." icon = 'icons/obj/xenoarchaeology.dmi' icon_state = "strange" + var/datum/geosample/geologic_data origin_tech = list(TECH_MATERIAL = 5) -/obj/item/weapon/ore/strangerock/New(loc, var/inside_item_type = 0) - ..(loc) +/obj/item/weapon/strangerock/New(loc, var/inside_item_type = 0) + pixel_x = rand(0,16)-8 + pixel_y = rand(0,8)-8 if(inside_item_type) new /obj/item/weapon/archaeological_find(src, new_item_type = inside_item_type) -/obj/item/weapon/ore/strangerock/attackby(var/obj/item/I, var/mob/user) +/obj/item/weapon/strangerock/attackby(var/obj/item/I, var/mob/user) if(istype(I, /obj/item/weapon/pickaxe/brush)) var/obj/item/inside = locate() in src if(inside) diff --git a/code/modules/xenoarcheaology/tools/coolant_tank.dm b/code/modules/xenoarcheaology/tools/coolant_tank.dm index df6c901517b..9f5172b3dee 100644 --- a/code/modules/xenoarcheaology/tools/coolant_tank.dm +++ b/code/modules/xenoarcheaology/tools/coolant_tank.dm @@ -11,7 +11,7 @@ /obj/structure/reagent_dispensers/coolanttank/bullet_act(var/obj/item/projectile/Proj) if(Proj.get_structure_damage()) - if(!istype(Proj ,/obj/item/projectile/beam/lastertag) && !istype(Proj ,/obj/item/projectile/beam/practice) ) // TODO: make this not terrible + if(!istype(Proj ,/obj/item/projectile/beam/lasertag) && !istype(Proj ,/obj/item/projectile/beam/practice) ) // TODO: make this not terrible explode() /obj/structure/reagent_dispensers/coolanttank/ex_act() diff --git a/code/modules/xenoarcheaology/tools/geosample_scanner.dm b/code/modules/xenoarcheaology/tools/geosample_scanner.dm index b97a34e48fa..7f266f454e9 100644 --- a/code/modules/xenoarcheaology/tools/geosample_scanner.dm +++ b/code/modules/xenoarcheaology/tools/geosample_scanner.dm @@ -198,7 +198,7 @@ radiation = rand() * 15 + 85 if(!rad_shield) //irradiate nearby mobs - radiation_repository.radiate(src, radiation / 25) + SSradiation.radiate(src, radiation / 25) else t_left_radspike = pick(10,15,25) diff --git a/code/modules/xenobio/items/weapons.dm b/code/modules/xenobio/items/weapons.dm index 4abb89ffeae..b44c73a0327 100644 --- a/code/modules/xenobio/items/weapons.dm +++ b/code/modules/xenobio/items/weapons.dm @@ -37,17 +37,7 @@ // Research borg's version /obj/item/weapon/melee/baton/slime/robot hitcost = 200 - -/obj/item/weapon/melee/baton/slime/robot/attack_self(mob/user) - //try to find our power cell - var/mob/living/silicon/robot/R = loc - if (istype(R)) - bcell = R.cell - return ..() - -/obj/item/weapon/melee/baton/slime/robot/attackby(obj/item/weapon/W, mob/user) - return - + use_external_power = TRUE // Xeno stun gun + projectile /obj/item/weapon/gun/energy/taser/xeno diff --git a/config/alienwhitelist.txt b/config/alienwhitelist.txt index d81e3c383ca..7bddbedf107 100644 --- a/config/alienwhitelist.txt +++ b/config/alienwhitelist.txt @@ -2,7 +2,8 @@ some~user - Species 911earlyarther - Xenomorph Hybrid admiraldragon - Vox -aether_elemental - Daemon +aetherelemental - Daemon +arandomalien - Xenochimera arokha - Protean aruis - Diona aruis - Xenochimera @@ -10,11 +11,14 @@ azmodan412 - Xenochimera azmodan412 - Xenomorph Hybrid bothnevarbackwards - Diona cameron653 - Xenomorph Hybrid +crossexonar - Protean funnyman2003 - Xenochimera hawkerthegreat - Vox +hollifex - Diona inuzari - Diona jademanique - Xenochimera jemli - Gutter +killerdragn - Xenomorph Hybrid ktccd - Diona mewchild - Diona mewchild - Vox @@ -28,16 +32,19 @@ rikaru19xjenkins - Xenomorph Hybrid rikaru19xjenkins - Xenochimera rixunie - Diona rixunie - Gutter +rykkastormheart - Xenochimera seiga - Vox sepulchre - Vox sepulchre - Xenomorph Hybrid -silverTalismen - Diona -silverTalismen - Vox +silvertalismen - Diona +silvertalismen - Vox silvertalismen - Xenochimera singo - Gutter tastypred - Xenochimera +timidvi - Diona varonis - Xenochimera verkister - Xenochimera +westfire - Xenomorph Hybrid wickedtemp - Shadekin Empathy wtfismyname - Xenomorph Hybrid xioen - Diona diff --git a/config/custom_items.txt b/config/custom_items.txt index 9438ff8d228..16734abd704 100644 --- a/config/custom_items.txt +++ b/config/custom_items.txt @@ -75,7 +75,7 @@ item_path: /obj/item/device/flashlight/pen/fluff/lynn { ckey: arokha character_name: Aronai Kadigan -item_path: /obj/item/clothing/under/utility/sifguard/medical/command +item_path: /obj/item/clothing/under/solgov/utility/sifguard/medical/command item_name: centcom medical uniform item_desc: A medical uniform straight from Central Command. } @@ -148,7 +148,7 @@ item_path: /obj/item/weapon/storage/box/fluff/octavious { ckey: burritojustice character_name: Jayda Wilson -item_path: /obj/item/clothing/under/utility/sifguard/medical +item_path: /obj/item/clothing/under/solgov/utility/sifguard/medical/fluff } # ######## C CKEYS @@ -629,6 +629,13 @@ item_path: /obj/item/weapon/fluff/dragor_dot # ######## R CKEYS +{ +ckey: radiantaurora +character_name: Tiemli Kroto +item_path: /obj/item/clothing/glasses/welding/tiemgogs +req_titles: Roboticist +} + # ######## S CKEYS { ckey: samanthafyre @@ -974,3 +981,10 @@ ckey: zodiacshadow character_name: Nehi Maximus item_path: /obj/item/device/radio/headset/fluff/zodiacshadow } + +{ +ckey: chaoko99 +character_name: Aika Hisakawa +item_path: /obj/item/clothing/suit/fluff/blue_trimmed_coat +} + diff --git a/config/jobwhitelist.txt b/config/jobwhitelist.txt index e615f5eafd7..859e8e2007d 100644 --- a/config/jobwhitelist.txt +++ b/config/jobwhitelist.txt @@ -8,3 +8,4 @@ tinybear16 - clown chargae - mime verkister - clown H0lySquirr3l - clown +sgtryder - mime \ No newline at end of file diff --git a/html/changelog.html b/html/changelog.html index fab075d8ed7..71ae05fb380 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -53,6 +53,151 @@ -->
      +

      07 September 2019

      +

      Heroman3003 updated:

      + +

      MisterLayne updated:

      + +

      Novacat updated:

      + +

      Woodrat updated:

      + +

      chaoko99 updated:

      + + +

      21 August 2019

      +

      Atermonera updated:

      + +

      Mechoid updated:

      + +

      Nalarac updated:

      + +

      TheFurryFeline updated:

      + +

      Woodrat updated:

      + + +

      08 August 2019

      +

      Mechoid updated:

      + +

      Nalarac updated:

      + +

      mistyLuminescence updated:

      + + +

      30 July 2019

      +

      Atermonera updated:

      + + +

      27 July 2019

      +

      Mechoid updated:

      + +

      Nalarac updated:

      + +

      Schnayy updated:

      + +

      19 July 2019

      Nalarac updated: