Merge pull request #202 from Yawn-Wider/master

Updates self
This commit is contained in:
Repede
2019-10-08 18:22:14 -04:00
committed by GitHub
139 changed files with 10121 additions and 1630 deletions
+5 -3
View File
@@ -348,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
-96
View File
@@ -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
-56
View File
@@ -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")
-169
View File
@@ -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)
+135
View File
@@ -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)
-138
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
..()
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+11 -1
View File
@@ -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
@@ -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, "<span class='notice'>You insert the cables.</span>")
construct_op--
stat &= ~BROKEN // the machine's not borked anymore!
else
to_chat(user, "<span class='warning'>You need five coils of wire for this.</span>")
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)
@@ -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"])
+1 -1
View File
@@ -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("<span class='alien'>The [src.name] appears to flicker, before its silhouette stabilizes!</span>")
return
+1 -1
View File
@@ -1201,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
@@ -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
+2 -2
View File
@@ -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)
+1 -1
View File
@@ -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()
@@ -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)
@@ -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
+2 -2
View File
@@ -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)
+1 -1
View File
@@ -20,7 +20,7 @@
</head>
<body>
<iframe width='100%' height='97%' src="[config.wikiurl]Guide_to_construction&printable=yes&remove_links=1" frameborder="0" id="main_frame"></iframe>
<iframe width='100%' height='97%' src="[config.wikiurl]Guide_to_Construction&printable=yes&remove_links=1" frameborder="0" id="main_frame"></iframe>
</body>
</html>
@@ -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("<span class='alien'>\The [src] shudders!</span>")
return FALSE
return TRUE
@@ -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("<span class='alien'>\The [src] shudders!</span>")
return FALSE
return TRUE
@@ -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("<span class='alien'>\The [src] shudders!</span>")
return FALSE
return TRUE
@@ -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("<span class='alien'>\The [src] shudders!</span>")
return FALSE
return TRUE
+1 -1
View File
@@ -38,7 +38,7 @@
if(!total_radiation)
return
radiation_repository.radiate(src, total_radiation)
SSradiation.radiate(src, total_radiation)
return total_radiation
+1 -1
View File
@@ -196,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")
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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()
+1 -1
View File
@@ -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)
+2
View File
@@ -27,6 +27,8 @@
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))
+2
View File
@@ -12,6 +12,8 @@ var/list/shell_module_types = list(
"Medihound", "Janihound"
)
var/list/eventdestinations = list() // List of scatter landmarks for VOREStation event portals
var/global/list/acceptable_fruit_types= list(
"ambrosia",
"apple",
+6
View File
@@ -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
+1 -1
View File
@@ -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"
@@ -5,7 +5,7 @@
description = "An example item that you probably shouldn't see!"
ckeywhitelist = list("broman2000")
allowed_roles = list("Station Engineer") //Don't include this if the item is not role restricted
character_name = list("shitfacemcgee") //Same applies here but for names
character_name = list("shitfacemcgee") //Character name. this variable is required, or the item doesn't show in loadout. Change to "character_name = null" if not character restricted.
*/
// 0-9 CKEYS
@@ -449,6 +449,16 @@
ckeywhitelist = list("generalpantsu")
character_name = list("Samantha Quzix")
//Gozulio
//Glitterpaws
/datum/gear/fluff/goz_whitecane
path = /obj/item/weapon/melee/goz_whitecane
display_name = "Telescopic White Cane."
description = "A telescoping white cane. They are commonly used by the blind or visually impaired as a mobility tool or as a courtesy to others."
ckeywhitelist = list("gozulio")
character_name = null
// H CKEYS
//harpsong
@@ -168,4 +168,8 @@ Swimsuits
//Tron Siren outfit
/datum/gear/uniform/siren
display_name = "jumpsuit, Siren"
path = /obj/item/clothing/under/fluff/siren
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
@@ -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"
+1 -1
View File
@@ -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"
+1 -1
View File
@@ -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)
@@ -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)
@@ -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)
+132 -1
View File
@@ -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 @@
<br><br>\
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.\
<br><br>\
In related news, Shadow Coalition candidate Phaedrus remains under a profanity filter 'house arrest' for the remainder of the election."
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.\
<br><br>\
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.\
<br><br>\
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.'\
<br><br>\
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.\
<br><br>\
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.'\
<br><br>\
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.\
<br><br>\
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.\
<br><br>\
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:\
<br>\
Governor of Vir: Lusia Hainirsdottir (Shadow Coalition)\
<br>\
Vir Colonial Assembly Representative: Vani Jee (Icarus Front)\
<br>\
Vir Colonial Assembly Representative: Selma Jorg (Shadow Coalition)\
<br>\
Other candidates ranked: Sao (4), Zarshir (5), Keldow (6), Singh (7), Moravec (8), Phaedrus (9), Lye (10), Savik (11), Square (12), Wekstrom (13)\
<br><br>\
Voter turnout: 30,928,287 (63%)\
<br><br>\
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.\
<br><br>\
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.'\
<br><br>\
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.\
<br><br>\
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.\
<br><br>\
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.\
<br><br>\
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.\
<br><br>\
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.\
<br><br>\
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.\
<br><br>\
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.\
<br><br>\
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.\
<br><br>\
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.\
<br><br>\
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.\
<br><br>\
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.\
<br><br>\
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'.\
<br><br>\
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.\
<br><br>\
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'.\
<br><br>\
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.\
<br><br>\
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.\
<br><br>\
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.'.\
<br><br>\
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.'\
<br><br>\
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."
+3 -3
View File
@@ -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
+1 -1
View File
@@ -582,7 +582,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)
+55 -21
View File
@@ -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"
+1 -1
View File
@@ -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, "<span class='notice'>Radiation level: [rads ? rads : "0"] Bq.</span>")
@@ -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!<br>"
@@ -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 "<span class='notice'>[nif.examine_msg]</span>\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 "<span class='warning'>[t_His] body is twitching subtly.</span>\n"
else
return "<span class='notice'>[t_He] [t_appear] to be in some sort of torpor.</span>\n"
if(feral)
return "<span class='warning'>[t_He] [t_has] a crazed, wild look in [t_his] eyes!</span>\n"
@@ -174,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()
@@ -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,"<span class='warning'>\The [src] quickly engulfs you, [vore_selected.vore_verb]ing you into their [vore_selected.name]!</span>")
/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)
@@ -96,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()
@@ -296,7 +297,6 @@
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
@@ -42,7 +42,7 @@
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"
wikilink = "https://www.yawn.ocry.com/Xenochimera"
catalogue_data = list(/datum/category_item/catalogue/fauna/xenochimera)
@@ -346,7 +346,7 @@
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"
wikilink = "https://www.yawn.ocry.com/Vasilissans"
catalogue_data = list(/datum/category_item/catalogue/fauna/vasilissan)
@@ -28,7 +28,7 @@
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"
wikilink="https://www.yawn.ocry.com/Sergal"
catalogue_data = list(/datum/category_item/catalogue/fauna/sergal)
@@ -92,7 +92,7 @@
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"
wikilink="https://www.yawn.ocry.com/Akula"
catalogue_data = list(/datum/category_item/catalogue/fauna/akula)
@@ -136,7 +136,7 @@
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"
wikilink="https://www.yawn.ocry.com/Nevrean"
catalogue_data = list(/datum/category_item/catalogue/fauna/nevrean)
@@ -178,7 +178,7 @@
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"
wikilink="https://www.yawn.ocry.com/Zorren"
catalogue_data = list(/datum/category_item/catalogue/fauna/zorren,
/datum/category_item/catalogue/fauna/highzorren)
@@ -223,7 +223,7 @@
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"
wikilink="https://www.yawn.ocry.com/Zorren"
catalogue_data = list(/datum/category_item/catalogue/fauna/zorren,
/datum/category_item/catalogue/fauna/flatzorren)
@@ -270,7 +270,7 @@
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"
wikilink="https://www.yawn.ocry.com/Vulpkanin"
catalogue_data = list(/datum/category_item/catalogue/fauna/vulpkanin)
@@ -306,7 +306,7 @@
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
wikilink="https://www.yawn.ocry.com/Xenomorph-Hybrid"
//primitive_form = "" //None for these guys
@@ -334,7 +334,7 @@
gluttonous = 0
inherent_verbs = list(/mob/living/proc/shred_limb)
descriptors = list()
wikilink="https://wiki.vore-station.net/Unathi"
wikilink="https://www.yawn.ocry.com/Unathi"
/datum/species/tajaran
spawn_flags = SPECIES_CAN_JOIN
@@ -346,7 +346,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"
wikilink="https://www.yawn.ocry.com/Tajaran"
/datum/species/skrell
spawn_flags = SPECIES_CAN_JOIN
@@ -356,14 +356,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"
wikilink="https://www.yawn.ocry.com/Skrell"
/datum/species/zaddat
spawn_flags = SPECIES_CAN_JOIN
min_age = 18
gluttonous = 0
descriptors = list()
// no wiki link exists for Zaddat yet
wikilink="https://www.yawn.ocry.com/Zaddat"
/datum/species/zaddat/equip_survival_gear(var/mob/living/carbon/human/H)
.=..()
@@ -376,7 +376,7 @@
/datum/species/diona
spawn_flags = SPECIES_CAN_JOIN
min_age = 18
wikilink="https://wiki.vore-station.net/Diona"
wikilink="https://www.yawn.ocry.com/Diona"
/datum/species/teshari
mob_size = MOB_MEDIUM
@@ -390,7 +390,7 @@
swap_flags = ~HEAVY
gluttonous = 0
descriptors = list()
wikilink="https://wiki.vore-station.net/Teshari"
wikilink="https://www.yawn.ocry.com/Teshari"
inherent_verbs = list(
/mob/living/carbon/human/proc/sonar_ping,
@@ -401,7 +401,7 @@
/datum/species/shapeshifter/promethean
spawn_flags = SPECIES_CAN_JOIN
wikilink="https://wiki.vore-station.net/Promethean"
wikilink="https://www.yawn.ocry.com/Promethean"
/datum/species/human
color_mult = 1
@@ -410,7 +410,7 @@
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"
wikilink="https://www.yawn.ocry.com/Human"
/datum/species/vox
gluttonous = 0
@@ -422,7 +422,7 @@
descriptors = list(
/datum/mob_descriptor/vox_markings = 0
)
wikilink="https://wiki.vore-station.net/Vox"
wikilink="https://www.yawn.ocry.com/Vox"
datum/species/harpy
name = SPECIES_RAPALA
@@ -448,7 +448,7 @@ datum/species/harpy
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"
wikilink="https://www.yawn.ocry.com/Rapala"
catalogue_data = list(/datum/category_item/catalogue/fauna/rapala)
@@ -176,8 +176,8 @@ var/global/list/robot_modules = list(
"XI-ALP" = "heavyStandard",
"Basic" = "robot_old",
"Android" = "droid",
"Drone" = "drone-standard"
// "Insekt" = "insekt-Default"
"Drone" = "drone-standard",
"Insekt" = "insekt-Default"
)
@@ -210,8 +210,8 @@ var/global/list/robot_modules = list(
"Advanced Droid" = "droid-medical",
"Needles" = "medicalrobot",
"Drone" = "drone-surgery",
"Handy" = "handy-med"
// "Insekt" = "insekt-Med"
"Handy" = "handy-med",
"Insekt" = "insekt-Med"
)
/obj/item/weapon/robot_module/robot/medical/surgeon/New()
@@ -283,8 +283,8 @@ var/global/list/robot_modules = list(
"Advanced Droid" = "droid-medical",
"Needles" = "medicalrobot",
"Drone - Medical" = "drone-medical",
"Drone - Chemistry" = "drone-chemistry"
// "Insekt" = "insekt-Med"
"Drone - Chemistry" = "drone-chemistry",
"Insekt" = "insekt-Med"
)
/obj/item/weapon/robot_module/robot/medical/crisis/New()
@@ -517,8 +517,8 @@ var/global/list/robot_modules = list(
"XI-ALP" = "heavySec",
"Basic" = "secborg",
"Black Knight" = "securityrobot",
"Drone" = "drone-sec"
// "Insekt" = "insekt-Sec"
"Drone" = "drone-sec",
"Insekt" = "insekt-Sec"
)
/obj/item/weapon/robot_module/robot/security/general/New()
@@ -734,8 +734,8 @@ var/global/list/robot_modules = list(
"WTOperator" = "sleekscience",
"Droid" = "droid-science",
"Drone" = "drone-science",
"Handy" = "handy-science"
// "Insekt" = "insekt-Sci"
"Handy" = "handy-science",
"Insekt" = "insekt-Sci"
)
/obj/item/weapon/robot_module/robot/research/New()
@@ -795,8 +795,8 @@ var/global/list/robot_modules = list(
hide_on_manifest = 1
sprites = list(
"Haruka" = "marinaCB",
"Combat Android" = "droid-combat"
// "Insekt" = "insekt-Combat"
"Combat Android" = "droid-combat",
"Insekt" = "insekt-Combat"
)
/obj/item/weapon/robot_module/robot/security/combat/New()
@@ -180,7 +180,7 @@
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/proc/shred_limb - YW Edit
R.verbs |= /mob/living/silicon/robot/proc/rest_style
..()
@@ -244,6 +244,30 @@
B.water = water
src.modules += B
// - YW Edit
var/datum/matter_synth/medicine = new /datum/matter_synth/medicine(15000)
medicine.name = "Medical supply reserves"
synths += medicine
var/obj/item/stack/medical/advanced/ointment/O = new /obj/item/stack/medical/advanced/ointment(src)
var/obj/item/stack/medical/advanced/bruise_pack/P = new /obj/item/stack/medical/advanced/bruise_pack(src)
var/obj/item/stack/medical/splint/S = new /obj/item/stack/medical/splint(src)
O.uses_charge = 1
O.charge_costs = list(1000)
O.synths = list(medicine)
P.uses_charge = 1
P.charge_costs = list(1000)
P.synths = list(medicine)
S.uses_charge = 1
S.charge_costs = list(1000)
S.synths = list(medicine)
src.modules += O
src.modules += P
src.modules += S
// End YW Edit
R.icon = 'icons/mob/widerobot_vr.dmi'
src.modules += new /obj/item/device/dogborg/pounce_module(src) //Pounce shit test
@@ -256,7 +280,7 @@
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/proc/shred_limb - YW Edit
R.verbs |= /mob/living/silicon/robot/proc/rest_style
..()
@@ -304,7 +328,7 @@
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/proc/shred_limb - YW Edit
R.verbs |= /mob/living/silicon/robot/proc/rest_style
..()
@@ -385,7 +409,7 @@
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/proc/shred_limb - YW Edit
R.verbs |= /mob/living/silicon/robot/proc/rest_style
..()
@@ -431,7 +455,7 @@
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/proc/shred_limb - YW Edit
R.verbs |= /mob/living/silicon/robot/proc/rest_style
..()
@@ -558,7 +582,7 @@
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/proc/shred_limb - YW Edit
R.verbs |= /mob/living/silicon/robot/proc/rest_style
..()
@@ -573,6 +597,6 @@
R.scrubbing = FALSE
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/proc/shred_limb - YW Edit
R.verbs -= /mob/living/silicon/robot/proc/rest_style
..()
@@ -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
@@ -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"
@@ -149,4 +149,4 @@
/mob/living/simple_mob/mechanical/technomancer_golem/special_post_animation(atom/A)
casting = FALSE
ranged_post_animation(A)
ranged_post_animation(A)
@@ -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.\
<br><br>\
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
@@ -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
@@ -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
@@ -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
@@ -527,7 +527,7 @@
..()
/mob/living/simple_mob/slime/xenobio/green/proc/irradiate()
radiation_repository.radiate(src, rads)
SSradiation.radiate(src, rads)
@@ -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. \
<br><br>\
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
can_breakthrough = TRUE
@@ -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!"
@@ -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!"
@@ -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."
@@ -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."
@@ -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."
@@ -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
@@ -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!"
@@ -21,4 +21,20 @@
/datum/computer_file/data/news_article/space/vol_one
filename = "SPACE Magazine vol. 1"
server_file_path = 'news_articles/space_magazine_1.html'
*/
*/
//YAWN ADDS - All from discord
/datum/computer_file/data/news_article/archives/vol_gwa_one
filename = "Galaxy Wide Archives"
server_file_path = 'news_articles/galaxy_wide_archived_1.html'
archived = 1
/datum/computer_file/data/news_article/archives/vol_tss_one
filename = "The Sleepy Sergal Archives vol. 1"
server_file_path = 'news_articles/the_sleepy_sergal_archived_1.html'
archived = 1
/datum/computer_file/data/news_article/tss/vol_one
filename = "The Sleepy Sergal Archived vol. 1"
server_file_path = 'news_articles/the_sleepy_sergal_1.html'
@@ -31,10 +31,24 @@
if(paper_title)
P.name = paper_title
P.update_icon()
P.fields = count_fields(P.info, P.fields)
P.updateinfolinks()
stored_paper--
return 1
/obj/item/weapon/computer_hardware/nano_printer/proc/count_fields(var/info, var/fields)
//Count the fields
var/t = info
var/laststart = 1
while(1)
var/i = findtext(t, "<span class=\"paper_field\">", laststart) //</span>
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)
+19
View File
@@ -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
+28 -11
View File
@@ -98,7 +98,6 @@
/obj/item/weapon/paper/alien/AltClick() // No airplanes for me.
return
//lipstick wiping is in code/game/objects/items/weapons/cosmetics.dm!
/obj/item/weapon/paper/New()
..()
@@ -208,21 +207,39 @@
"<span class='notice'> [user] holds up a paper and shows it to [M]. </span>")
M.examinate(src)
else if(user.zone_sel.selecting == O_MOUTH) // lipstick wiping
else if(user.zone_sel.selecting == O_MOUTH) // lipstick wiping and paper eating
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H == user)
user << "<span class='notice'>You wipe off the lipstick with [src].</span>"
H.lip_style = null
H.update_icons_body()
else
user.visible_message("<span class='warning'>[user] begins to wipe [H]'s lipstick off with \the [src].</span>", \
"<span class='notice'>You begin to wipe off [H]'s lipstick.</span>")
if(do_after(user, 10) && do_after(H, 10, 5, 0)) //user needs to keep their active hand, H does not.
user.visible_message("<span class='notice'>[user] wipes [H]'s lipstick off with \the [src].</span>", \
"<span class='notice'>You wipe off [H]'s lipstick.</span>")
if(icon_state == "scrap" && H.check_has_mouth()) //YW Edit Start
user << "<span class='warning'>You begin to stuff \the [src] into your mouth!</span>"
if(do_after(user, 30))
user << "<span class='warning'>You stuff \the [src] into your mouth!</span>"
H.ingested.add_reagent("paper", 10)
H.adjustOxyLoss(10)
qdel(src)
else
user << "<span class='notice'>You wipe off the lipstick with [src].</span>"
H.lip_style = null
H.update_icons_body()
else
if(icon_state == "scrap" && H.check_has_mouth())
user.visible_message("<span class='warning'>[user] begins to stuff \the [src] into [H]'s mouth!</span>", \
"<span class='warning'>You begin to stuff \the [src] into [H]'s mouth!</span>",)
if(do_after(user, 30, H))
user.visible_message("<span class='warning'>[user] stuffs \the [src] into [H]'s mouth!</span>",\
"<span class='warning'>You stuff \the [src] into [H]'s mouth!</span>")
H.ingested.add_reagent("paper", 10)
H.adjustOxyLoss(10)
qdel(src)
else
user.visible_message("<span class='warning'>[user] begins to wipe [H]'s lipstick off with \the [src].</span>", \
"<span class='notice'>You begin to wipe off [H]'s lipstick.</span>")
if(do_after(user, 10, H))
user.visible_message("<span class='notice'>[user] wipes [H]'s lipstick off with \the [src].</span>", \
"<span class='notice'>You wipe off [H]'s lipstick.</span>")
H.lip_style = null
H.update_icons_body() //YW Edit End
/obj/item/weapon/paper/proc/addtofield(var/id, var/text, var/links = 0)
var/locid = 0
+1 -1
View File
@@ -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))
+1 -1
View File
@@ -531,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))
+44 -6
View File
@@ -12,11 +12,11 @@
charge_amount = 5
matter = list("metal" = 350, "glass" = 50)
preserve_item = 1
/obj/item/weapon/cell/device/weapon
name = "weapon power cell"
desc = "A small power cell designed to power handheld weaponry."
icon_state = "wcell"
//Yawn changes
/obj/item/weapon/cell/device/weapon //Aka adv
name = "advanced device power cell"
desc = "A small upgraded power cell designed to power handheld devices."
icon_state = "acell"
maxcharge = 2400
charge_amount = 20
@@ -25,6 +25,31 @@
charge = 0
update_icon()
/obj/item/weapon/cell/device/super
name = "super device power cell"
desc = "A small upgraded power cell designed to power handheld devices."
icon_state = "uscell"
maxcharge = 3600
charge_amount = 20
/obj/item/weapon/cell/device/super/empty/Initialize()
. = ..()
charge = 0
update_icon()
/obj/item/weapon/cell/device/hyper
name = "hyper device power cell"
desc = "A small upgraded power cell designed to hold much more power for handheld devices."
icon_state = "wcell"
maxcharge = 4800
charge_amount = 20
/obj/item/weapon/cell/device/hyper/empty/Initialize()
. = ..()
charge = 0
update_icon()
//End of Yawn changes
/obj/item/weapon/cell/device/weapon/recharge
name = "self-charging weapon power cell"
desc = "A small power cell designed to power handheld weaponry. This one recharges itself."
@@ -63,4 +88,17 @@
origin_tech = list(TECH_POWER = 8, TECH_ENGINEERING = 6)
/obj/item/weapon/cell/device/weapon/recharge/alien/update_icon()
return // No overlays please.
return // No overlays please.
//YAWN Addtion
/obj/item/weapon/cell/device/weapon/recharge/alien/omni
name = "omni weapon power cell"
desc = "A mix bettewn alien technology and phoron tech. Seems to fit in almost any cell slot..."
charge_amount = 90 // 5%.
maxcharge = 1800
charge_delay = 50 SECONDS
origin_tech = list(TECH_POWER = 6, TECH_ENGINEERING = 4, TECH_PHORON = 3)
/obj/item/weapon/cell/device/weapon/recharge/alien/omni/empty/Initialize()
. = ..()
charge = 0
+2 -2
View File
@@ -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()
@@ -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)
@@ -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)
+2 -2
View File
@@ -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)
+1 -1
View File
@@ -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
@@ -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("<span class='warning'>\The [src] fizzles.</span>")
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
@@ -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 << "<span class=\"danger\">You hear an uneartly ringing, then what sounds like a shrilling kettle as you are washed with a wave of heat.</span>"
M << "<span class=\"danger\">You don't even have a moment to react as you are reduced to ashes by the intense radiation.</span>"
M.dust()
radiation_repository.radiate(src, rand(energy))
SSradiation.radiate(src, rand(energy))
return
/obj/singularity/proc/pulse()
@@ -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))
@@ -311,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
@@ -424,7 +424,7 @@
else
l.show_message("<span class=\"warning\">You hear an uneartly ringing and notice your skin is covered in fresh radiation burns.</span>", 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))
@@ -467,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)
+1 -1
View File
@@ -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)
+59
View File
@@ -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)
@@ -537,4 +537,15 @@
description = "A natural slurry that particularily appeals to fish."
taste_description = "earthy"
reagent_state = LIQUID
color = "#62764E"
color = "#62764E"
//YW Edit Start
/datum/reagent/nutriment/paper //Paper is made from cellulose. You can eat it. It doesn't fill you up very much at all.
name = "Paper"
id = "paper"
description = "Soggy, ground up paper"
taste_description = "paper"
reagent_state = SOLID
color = "e6e6e6" //not quite white
nutriment_factor = 2 // 5 times worse than nutriment
//YW Edit End
@@ -965,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
@@ -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("<span class='info'>[H] shudders briefly, then relaxes, faint movements stirring within.</span>")
H.chimera_regenerate()
else if (/mob/living/carbon/human/proc/hatch in H.verbs)// already reviving, check if they're ready to hatch
@@ -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,7 @@
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)
+34 -4
View File
@@ -61,11 +61,41 @@
category = "Misc"
sort_string = "BAABA"
/datum/design/item/powercell/weapon
name = "weapon"
//Yawn changes
/datum/design/item/powercell/advance
name = "advance"
build_type = PROTOLATHE
id = "weapon"
id = "advance"
materials = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 50)
build_path = /obj/item/weapon/cell/device/weapon
category = "Misc"
sort_string = "BAABB"
sort_string = "BAABB"
/datum/design/item/powercell/super
name = "super"
id = "super_cell"
req_tech = list(TECH_POWER = 3, TECH_MATERIAL = 2)
materials = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 70, "gold" = 50, "silver" = 20,)
build_path = /obj/item/weapon/cell/device/super
category = "Misc"
sort_string = "BAABC"
/datum/design/item/powercell/hyper
name = "hypery"
id = "hyper_cell"
req_tech = list(TECH_POWER = 5, TECH_MATERIAL = 4)
materials = list(DEFAULT_WALL_MATERIAL = 1400, "glass" = 1400, "gold" = 150, "silver" = 150)
build_path = /obj/item/weapon/cell/device/hyper
category = "Misc"
sort_string = "BAABD"
/datum/design/item/powercell/omni
name = "omni"
req_tech = list(TECH_POWER = 8, TECH_MATERIAL = 7, TECH_ARCANE = 2, TECH_PHORON = 4, TECH_PRECURSOR = 2)
build_type = PROTOLATHE
id = "omni"
materials = list(DEFAULT_WALL_MATERIAL = 1700, "glass" = 550, MAT_DURASTEEL = 230, MAT_MORPHIUM = 320, MAT_METALHYDROGEN = 600, MAT_URANIUM = 60, MAT_VERDANTIUM = 150, MAT_PHORON = 900)
build_path = /obj/item/weapon/cell/device/weapon/recharge/alien/omni
category = "Misc"
sort_string = "BAABE"
//End of Yawn add
@@ -1522,6 +1522,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"
@@ -1908,4 +1916,4 @@ Departamental Swimsuits, for general use
return 1
/obj/item/clothing/under/fluff/slime_skeleton/digest_act(var/atom/movable/item_storage = null)
return FALSE //Indigestible
return FALSE //Indigestible
@@ -133,6 +133,63 @@
from_suit = /obj/item/clothing/suit/storage/vest/officer
to_suit = /obj/item/clothing/suit/storage/vest/officer/fluff/nika
// *******
// Gozulio
// *******
//Glitterpaws
/obj/item/weapon/melee/goz_whitecane
name = "White Cane"
desc = "A telescoping white cane. They are commonly used by the blind or visually impaired as a mobility tool or as a courtesy to others."
icon = 'icons/vore/custom_items_yw.dmi'
icon_state = "goz_whitecane_0"
item_icons = list(
slot_l_hand_str = 'icons/vore/custom_items_left_hand_yw.dmi',
slot_r_hand_str = 'icons/vore/custom_items_right_hand_yw.dmi',
)
slot_flags = SLOT_BELT
w_class = ITEMSIZE_SMALL
force = 3
var/on = 0
/obj/item/weapon/melee/goz_whitecane/attack_self(mob/user as mob)
on = !on
if(on)
user.visible_message("<span class='notice'>\The [user] extends the white cane.</span>",\
"<span class='warning'>You extend the white cane.</span>",\
"You hear an ominous click.")
icon_state = "goz_whitecane_1"
item_state_slots = list(slot_r_hand_str = "goz_whitecane", slot_l_hand_str = "goz_whitecane")
w_class = ITEMSIZE_NORMAL
force = 5
attack_verb = list("smacked", "struck", "craked", "beaten")
else
user.visible_message("<span class='notice'>\The [user] collapses the white cane.</span>",\
"<span class='notice'>You collapse the white cane.</span>",\
"You hear a click.")
icon_state = "goz_whitecane_0"
item_state_slots = list(slot_r_hand_str = null, slot_l_hand_str = null)
w_class = ITEMSIZE_SMALL
force = 3
attack_verb = list("hit", "poked")
if(istype(user,/mob/living/carbon/human))
var/mob/living/carbon/human/H = user
H.update_inv_l_hand()
H.update_inv_r_hand()
playsound(src.loc, 'sound/weapons/empty.ogg', 50, 1)
add_fingerprint(user)
return
/obj/item/weapon/melee/goz_whitecane/attack(mob/M as mob, mob/user as mob)
if(user.a_intent == I_HELP)
user.visible_message("<span class='notice'>\The [user] has lightly tapped [M] on the ankle with their white cane!</span>")
return
else
..()
// *******
// Dawidoe
// *******
@@ -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
@@ -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)
+3 -1
View File
@@ -2,7 +2,7 @@ some~user - Species
911earlyarther - Xenomorph Hybrid
admiraldragon - Vox
aether_elemental - Daemon
aetherelemental - Daemon
arandomalien - Xenochimera
arokha - Protean
aruis - Diona
@@ -11,6 +11,7 @@ azmodan412 - Xenochimera
azmodan412 - Xenomorph Hybrid
bothnevarbackwards - Diona
cameron653 - Xenomorph Hybrid
crossexonar - Protean
funnyman2003 - Xenochimera
hawkerthegreat - Vox
hollifex - Diona
@@ -40,6 +41,7 @@ silvertalismen - Vox
silvertalismen - Xenochimera
singo - Gutter
tastypred - Xenochimera
timidvi - Diona
varonis - Xenochimera
verkister - Xenochimera
westfire - Xenomorph Hybrid
+37
View File
@@ -0,0 +1,37 @@
################################
# Example Changelog File
#
# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
#
# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
# When it is, any changes listed below will disappear.
#
# Valid Prefixes:
# bugfix
# wip (For works in progress)
# tweak
# soundadd
# sounddel
# rscadd (general adding of nice things)
# rscdel (general deleting of nice things)
# imageadd
# imagedel
# maptweak
# spellcheck (typo fixes)
# experiment
#################################
# Your name.
author: Woodrat
# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
delete-after: True
# Any changes you've made. See valid prefix list above.
# INDENT WITH TWO SPACES. NOT TABS. SPACES.
# SCREW THIS UP AND IT WON'T WORK.
# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
changes:
- rscdel: "Removed the old size modifier traits for mobs."
- rscadd: "Port and tweak of the size modifiers from World Server for mobs."

Some files were not shown because too many files have changed in this diff Show More