mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2026-08-30 08:39:12 +01:00
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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")
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
..()
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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"])
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
if(!total_radiation)
|
||||
return
|
||||
|
||||
radiation_repository.radiate(src, total_radiation)
|
||||
SSradiation.radiate(src, total_radiation)
|
||||
return total_radiation
|
||||
|
||||
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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."
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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))
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user