Merge remote-tracking branch 'origin/master' into perlin-genny
@@ -18,8 +18,8 @@
|
||||
|
||||
/// Integrity defines for clothing (not flags but close enough)
|
||||
#define CLOTHING_PRISTINE 0 // We have no damage on the clothing
|
||||
#define CLOTHING_DAMAGED 1 // There's some damage on the clothing but it still has at least one functioning bodypart and can be equipped
|
||||
#define CLOTHING_SHREDDED 2 // The clothing is useless and cannot be equipped unless repaired first
|
||||
#define CLOTHING_DAMAGED 1 // There's some damage on the clothing but it still has at least one functioning bodypart
|
||||
#define CLOTHING_SHREDDED 2 // The clothing is near useless and has their sensors broken
|
||||
|
||||
// If you add new ones, be sure to add them to /obj/Initialize as well for complete mapping support
|
||||
|
||||
|
||||
@@ -1,18 +1,35 @@
|
||||
/// Transparent, let beams pass
|
||||
#define SHIELD_TRANSPARENT (1<<0)
|
||||
|
||||
/// Flammable, takes more damage from fire
|
||||
#define SHIELD_ENERGY_WEAK (1<<1)
|
||||
/// Fragile, takes more damage from brute
|
||||
#define SHIELD_KINETIC_WEAK (1<<2)
|
||||
/// Strong against kinetic, weak against energy
|
||||
#define SHIELD_KINETIC_STRONG (1<<3)
|
||||
/// Strong against energy, weak against kinetic
|
||||
#define SHIELD_ENERGY_STRONG (1<<4)
|
||||
/// Disabler and other stamina based energy weapons boost the damage done to the sheld
|
||||
#define SHIELD_DISABLER_DISRUPTED (1<<5)
|
||||
|
||||
/// Doesn't block ranged attacks whatsoever
|
||||
#define SHIELD_NO_RANGED (1<<6)
|
||||
/// Doesn't block melee attacks whatsoever
|
||||
#define SHIELD_NO_MELEE (1<<7)
|
||||
|
||||
/// Can shield bash
|
||||
#define SHIELD_CAN_BASH (1<<1)
|
||||
#define SHIELD_CAN_BASH (1<<8)
|
||||
/// Shield bash knockdown on wall hit
|
||||
#define SHIELD_BASH_WALL_KNOCKDOWN (1<<2)
|
||||
#define SHIELD_BASH_WALL_KNOCKDOWN (1<<9)
|
||||
/// Shield bash always knockdown
|
||||
#define SHIELD_BASH_ALWAYS_KNOCKDOWN (1<<3)
|
||||
#define SHIELD_BASH_ALWAYS_KNOCKDOWN (1<<10)
|
||||
/// Shield bash disarm on wall hit
|
||||
#define SHIELD_BASH_WALL_DISARM (1<<4)
|
||||
#define SHIELD_BASH_WALL_DISARM (1<<11)
|
||||
/// Shield bash always disarm
|
||||
#define SHIELD_BASH_ALWAYS_DISARM (1<<5)
|
||||
#define SHIELD_BASH_ALWAYS_DISARM (1<<12)
|
||||
/// You can shieldbash target someone on the ground for ground slam
|
||||
#define SHIELD_BASH_GROUND_SLAM (1<<6)
|
||||
#define SHIELD_BASH_GROUND_SLAM (1<<13)
|
||||
/// Shield bashing someone on the ground will disarm
|
||||
#define SHIELD_BASH_GROUND_SLAM_DISARM (1<<7)
|
||||
#define SHIELD_BASH_GROUND_SLAM_DISARM (1<<14)
|
||||
|
||||
#define SHIELD_FLAGS_DEFAULT (SHIELD_CAN_BASH | SHIELD_BASH_WALL_KNOCKDOWN | SHIELD_BASH_WALL_DISARM | SHIELD_BASH_GROUND_SLAM)
|
||||
|
||||
@@ -24,6 +24,10 @@
|
||||
// signals from globally accessible objects
|
||||
/// from SSsun when the sun changes position : (primary_sun, suns)
|
||||
#define COMSIG_SUN_MOVED "sun_moved"
|
||||
|
||||
/// from SSactivity for things that add threat but aren't "global" (e.g. phylacteries)
|
||||
#define COMSIG_THREAT_CALC "threat_calculation"
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
// /datum signals
|
||||
|
||||
@@ -82,3 +82,12 @@
|
||||
#define LOADOUT_CAN_NAME (1<<0) //renaming items
|
||||
#define LOADOUT_CAN_DESCRIPTION (1<<1) //adding a custom description to items
|
||||
#define LOADOUT_CAN_COLOR_POLYCHROMIC (1<<2)
|
||||
|
||||
//the names of the customization tabs
|
||||
#define SETTINGS_TAB 0
|
||||
#define GAME_PREFERENCES_TAB 1
|
||||
#define APPEARANCE_TAB 2
|
||||
#define SPEECH_TAB 3
|
||||
#define LOADOUT_TAB 4
|
||||
#define CONTENT_PREFERENCES_TAB 5
|
||||
#define KEYBINDINGS_TAB 6
|
||||
|
||||
@@ -173,8 +173,18 @@ GLOBAL_LIST_EMPTY(bloody_footprints_cache)
|
||||
|
||||
#define BROKEN_SENSORS -1
|
||||
#define NO_SENSORS 0
|
||||
#define HAS_SENSORS 1
|
||||
#define LOCKED_SENSORS 2
|
||||
#define DAMAGED_SENSORS_LIVING 1
|
||||
#define DAMAGED_SENSORS_VITALS 2
|
||||
#define HAS_SENSORS 3
|
||||
|
||||
//suit sensor flags: sensor_flag defines
|
||||
#define SENSOR_RANDOM (1<<0)
|
||||
#define SENSOR_LOCKED (1<<1)
|
||||
|
||||
//suit sensor integrity percentage threshold defines
|
||||
#define SENSOR_INTEGRITY_COORDS 0.2
|
||||
#define SENSOR_INTEGRITY_VITALS 0.6
|
||||
#define SENSOR_INTEGRITY_BINARY 1
|
||||
|
||||
//Wet floor type flags. Stronger ones should be higher in number.
|
||||
#define TURF_DRY (0)
|
||||
|
||||
@@ -152,6 +152,7 @@
|
||||
// If the subsystem isn't listed here it's either DEFAULT or PROCESS (if it's a processing subsystem child)
|
||||
|
||||
#define FIRE_PRIORITY_VORE 5
|
||||
#define FIRE_PRIORITY_ACTIVITY 10
|
||||
#define FIRE_PRIORITY_IDLE_NPC 10
|
||||
#define FIRE_PRIORITY_SERVER_MAINT 10
|
||||
#define FIRE_PRIORITY_RESEARCH 10
|
||||
|
||||
@@ -386,12 +386,15 @@
|
||||
//ignore this comment, it fixes the broken sytax parsing caused by the " above
|
||||
else
|
||||
parts += "[FOURSPACES]<i>Nobody died this shift!</i>"
|
||||
var/avg_threat = SSactivity.get_average_threat()
|
||||
var/max_threat = SSactivity.get_max_threat()
|
||||
parts += "[FOURSPACES]Threat at round end: [SSactivity.current_threat]"
|
||||
parts += "[FOURSPACES]Average threat: [avg_threat]"
|
||||
parts += "[FOURSPACES]Max threat: [max_threat]"
|
||||
if(istype(SSticker.mode, /datum/game_mode/dynamic))
|
||||
var/datum/game_mode/dynamic/mode = SSticker.mode
|
||||
mode.update_playercounts() // ?
|
||||
parts += "[FOURSPACES]Threat level: [mode.threat_level]"
|
||||
parts += "[FOURSPACES]Threat left: [mode.threat]"
|
||||
parts += "[FOURSPACES]Average threat: [mode.threat_average]"
|
||||
parts += "[FOURSPACES]Target threat: [mode.threat_level]"
|
||||
parts += "[FOURSPACES]Executed rules:"
|
||||
for(var/datum/dynamic_ruleset/rule in mode.executed_rules)
|
||||
parts += "[FOURSPACES][FOURSPACES][rule.ruletype] - <b>[rule.name]</b>: -[rule.cost + rule.scaled_times * rule.scaling_cost] threat"
|
||||
@@ -400,8 +403,10 @@
|
||||
parts += "[FOURSPACES][FOURSPACES][str]"
|
||||
for(var/entry in mode.threat_tallies)
|
||||
parts += "[FOURSPACES][FOURSPACES][entry] added [mode.threat_tallies[entry]]"
|
||||
SSblackbox.record_feedback("tally","dynamic_threat",mode.threat_level,"Final threat level")
|
||||
SSblackbox.record_feedback("tally","dynamic_threat",mode.threat,"Final Threat")
|
||||
SSblackbox.record_feedback("tally","threat",mode.threat_level,"Target threat")
|
||||
SSblackbox.record_feedback("tally","threat",SSactivity.current_threat,"Final Threat")
|
||||
SSblackbox.record_feedback("tally","threat",avg_threat,"Average Threat")
|
||||
SSblackbox.record_feedback("tally","threat",max_threat,"Max Threat")
|
||||
return parts.Join("<br>")
|
||||
|
||||
/client/proc/roundend_report_file()
|
||||
|
||||
@@ -259,6 +259,13 @@ GLOBAL_LIST_INIT(bitfields, list(
|
||||
),
|
||||
"shield_flags" = list(
|
||||
"SHIELD_TRANSPARENT" = SHIELD_TRANSPARENT,
|
||||
"SHIELD_ENERGY_WEAK" = SHIELD_ENERGY_WEAK,
|
||||
"SHIELD_KINETIC_WEAK" = SHIELD_KINETIC_WEAK,
|
||||
"SHIELD_KINETIC_STRONG" = SHIELD_KINETIC_STRONG,
|
||||
"SHIELD_ENERGY_STRONG" = SHIELD_ENERGY_STRONG,
|
||||
"SHIELD_DISABLER_DISRUPTED" = SHIELD_DISABLER_DISRUPTED,
|
||||
"SHIELD_NO_RANGED" = SHIELD_NO_RANGED,
|
||||
"SHIELD_NO_MELEE" = SHIELD_NO_MELEE,
|
||||
"SHIELD_CAN_BASH" = SHIELD_CAN_BASH,
|
||||
"SHIELD_BASH_WALL_KNOCKDOWN" = SHIELD_BASH_WALL_KNOCKDOWN,
|
||||
"SHIELD_BASH_ALWAYS_KNOCKDOWN" = SHIELD_BASH_ALWAYS_KNOCKDOWN,
|
||||
|
||||
@@ -169,5 +169,9 @@
|
||||
A.attack_robot(src)
|
||||
|
||||
/atom/proc/attack_robot(mob/user)
|
||||
if((isturf(src) || istype(src, /obj/structure/table) || istype(src, /obj/machinery/conveyor)) && get_dist(user, src) <= 1)
|
||||
user.Move_Pulled(src)
|
||||
return
|
||||
|
||||
attack_ai(user)
|
||||
return
|
||||
|
||||
@@ -361,7 +361,7 @@
|
||||
/obj/screen/mov_intent/update_icon_state()
|
||||
switch(hud?.mymob?.m_intent)
|
||||
if(MOVE_INTENT_WALK)
|
||||
icon_state = "walking"
|
||||
icon_state = CONFIG_GET(flag/sprint_enabled)? "walking" : "walking_nosprint"
|
||||
if(MOVE_INTENT_RUN)
|
||||
icon_state = CONFIG_GET(flag/sprint_enabled)? "running" : "running_nosprint"
|
||||
|
||||
|
||||
@@ -404,9 +404,9 @@ Example config:
|
||||
if(!Get(/datum/config_entry/flag/no_storyteller_threat_removal))
|
||||
var/min_chaos = (probabilities in storyteller_min_chaos) ? storyteller_min_chaos[config_tag] : initial(S.min_chaos)
|
||||
var/max_chaos = (probabilities in storyteller_max_chaos) ? storyteller_max_chaos[config_tag] : initial(S.max_chaos)
|
||||
if(SSpersistence.average_dynamic_threat < min_chaos)
|
||||
if(SSpersistence.average_threat + 50 < min_chaos)
|
||||
continue
|
||||
if(SSpersistence.average_dynamic_threat > max_chaos)
|
||||
if(SSpersistence.average_threat + 50 > max_chaos)
|
||||
continue
|
||||
if(SSpersistence.saved_storytellers.len == repeated_mode_adjust.len)
|
||||
var/name = initial(S.name)
|
||||
|
||||
@@ -0,0 +1,75 @@
|
||||
SUBSYSTEM_DEF(activity)
|
||||
name = "Activity tracking"
|
||||
flags = SS_BACKGROUND | SS_NO_TICK_CHECK
|
||||
priority = FIRE_PRIORITY_ACTIVITY
|
||||
wait = 1 MINUTES
|
||||
var/list/deferred_threats = list()
|
||||
var/current_threat = 0
|
||||
var/list/threat_history = list()
|
||||
var/list/threats = list()
|
||||
|
||||
/datum/controller/subsystem/activity/Initialize(timeofday)
|
||||
RegisterSignal(SSdcs,COMSIG_GLOB_EXPLOSION,.proc/on_explosion)
|
||||
RegisterSignal(SSdcs,COMSIG_GLOB_MOB_DEATH,.proc/on_death)
|
||||
|
||||
/datum/controller/subsystem/activity/fire(resumed = 0)
|
||||
calculate_threat()
|
||||
|
||||
/datum/controller/subsystem/activity/proc/calculate_threat()
|
||||
threats = deferred_threats.Copy()
|
||||
deferred_threats.Cut()
|
||||
threats["antagonists"] = 0
|
||||
for(var/datum/antagonist/A in GLOB.antagonists)
|
||||
if(A?.owner?.current && A.owner.current.stat != DEAD)
|
||||
threats["antagonists"] += A.threat()
|
||||
threats["events"] = 0
|
||||
for(var/r in SSevents.running)
|
||||
var/datum/round_event/R = r
|
||||
threats["events"] += R.threat()
|
||||
threats["players"] = 0
|
||||
SEND_SIGNAL(src, COMSIG_THREAT_CALC, threats)
|
||||
for(var/m in GLOB.player_list)
|
||||
var/mob/M = m
|
||||
if (M?.mind?.assigned_role && M.stat != DEAD)
|
||||
var/datum/job/J = SSjob.GetJob(M.mind.assigned_role)
|
||||
if(J)
|
||||
if(length(M.mind.antag_datums))
|
||||
threats["players"] += J.GetThreat()
|
||||
else
|
||||
threats["players"] -= J.GetThreat()
|
||||
else if(M?.stat == DEAD && !M.voluntary_ghosted)
|
||||
threats["dead_players"] += 1
|
||||
current_threat = 0
|
||||
for(var/threat_type in threats)
|
||||
current_threat += threats[threat_type]
|
||||
threat_history += "[world.time]"
|
||||
threat_history["[world.time]"] = current_threat
|
||||
|
||||
/datum/controller/subsystem/activity/proc/get_average_threat()
|
||||
if(!length(threat_history))
|
||||
return 0
|
||||
var/total_weight = 0
|
||||
var/total_amt = 0
|
||||
for(var/i in 1 to threat_history.len-1)
|
||||
var/weight = (text2num(threat_history[i+1])-text2num(threat_history[i]))
|
||||
total_weight += weight
|
||||
total_amt += weight * (threat_history[threat_history[i]])
|
||||
return round(total_amt / total_weight,0.1)
|
||||
|
||||
/datum/controller/subsystem/activity/proc/get_max_threat()
|
||||
. = 0
|
||||
for(var/threat in threat_history)
|
||||
. = max(threat_history[threat], .)
|
||||
|
||||
/datum/controller/subsystem/activity/proc/on_explosion(atom/epicenter, devastation_range, heavy_impact_range, light_impact_range, took, orig_dev_range, orig_heavy_range, orig_light_range)
|
||||
if(!("explosions" in deferred_threats))
|
||||
deferred_threats["explosions"] = 0
|
||||
var/area/A = get_area(epicenter)
|
||||
if(is_station_level(epicenter.z) && A.blob_allowed && !istype(A, /area/asteroid))
|
||||
deferred_threats["explosions"] += devastation_range**2 + heavy_impact_range**2 / 4 + light_impact_range**2 / 8 // 75 for a maxcap
|
||||
|
||||
/datum/controller/subsystem/activity/proc/on_death(mob/M, gibbed)
|
||||
if(!("crew_deaths" in deferred_threats))
|
||||
deferred_threats["crew_deaths"] = 0
|
||||
if(M?.mind && SSjob.GetJob(M.mind.assigned_role))
|
||||
deferred_threats["crew_deaths"] += 1
|
||||
@@ -6,7 +6,7 @@
|
||||
var/list/saved_chaos = list(5,5,5)
|
||||
var/list/saved_dynamic_rules = list(list(),list(),list())
|
||||
var/list/saved_storytellers = list("foo","bar","baz")
|
||||
var/list/average_dynamic_threat = 50
|
||||
var/average_threat = 50
|
||||
var/list/saved_maps
|
||||
|
||||
/datum/controller/subsystem/persistence/SaveServerPersistence()
|
||||
@@ -38,9 +38,10 @@
|
||||
saved_chaos[3] = saved_chaos[2]
|
||||
saved_chaos[2] = saved_chaos[1]
|
||||
saved_chaos[1] = SSticker.mode.get_chaos()
|
||||
average_threat = (SSactivity.get_average_threat() + average_threat) / 2
|
||||
json_file = file("data/RecentChaos.json")
|
||||
file_data = list()
|
||||
file_data["data"] = saved_chaos
|
||||
file_data["data"] = saved_chaos + average_threat
|
||||
fdel(json_file)
|
||||
WRITE_FILE(json_file, json_encode(file_data))
|
||||
|
||||
@@ -49,10 +50,9 @@
|
||||
saved_storytellers[3] = saved_storytellers[2]
|
||||
saved_storytellers[2] = saved_storytellers[1]
|
||||
saved_storytellers[1] = mode.storyteller.name
|
||||
average_dynamic_threat = (mode.max_threat + average_dynamic_threat) / 2
|
||||
var/json_file = file("data/RecentStorytellers.json")
|
||||
var/list/file_data = list()
|
||||
file_data["data"] = saved_storytellers + average_dynamic_threat
|
||||
file_data["data"] = saved_storytellers
|
||||
fdel(json_file)
|
||||
WRITE_FILE(json_file, json_encode(file_data))
|
||||
|
||||
@@ -94,6 +94,9 @@
|
||||
if(!json)
|
||||
return
|
||||
saved_chaos = json["data"]
|
||||
if(saved_chaos.len > 3)
|
||||
average_threat = saved_chaos[4]
|
||||
saved_chaos.len = 3
|
||||
|
||||
/datum/controller/subsystem/persistence/proc/LoadRecentRulesets()
|
||||
var/json_file = file("data/RecentRulesets.json")
|
||||
@@ -112,9 +115,6 @@
|
||||
if(!json)
|
||||
return
|
||||
saved_storytellers = json["data"]
|
||||
if(saved_storytellers.len > 3)
|
||||
average_dynamic_threat = saved_storytellers[4]
|
||||
saved_storytellers.len = 3
|
||||
|
||||
/datum/controller/subsystem/persistence/proc/LoadRecentMaps()
|
||||
var/json_file = file("data/RecentMaps.json")
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
|
||||
/datum/crafting_recipe/strobeshield
|
||||
name = "Strobe Shield"
|
||||
result = /obj/item/assembly/flash/shield
|
||||
result = /obj/item/shield/riot/flash
|
||||
reqs = list(/obj/item/wallframe/flasher = 1,
|
||||
/obj/item/assembly/flash/handheld = 1,
|
||||
/obj/item/shield/riot = 1)
|
||||
|
||||
@@ -317,6 +317,8 @@ GLOBAL_LIST_EMPTY(explosions)
|
||||
|
||||
var/took = (REALTIMEOFDAY - started_at) / 10
|
||||
|
||||
SEND_GLOBAL_SIGNAL(COMSIG_GLOB_EXPLOSION,epicenter, devastation_range, heavy_impact_range, light_impact_range, took, orig_dev_range, orig_heavy_range, orig_light_range)
|
||||
|
||||
//You need to press the DebugGame verb to see these now....they were getting annoying and we've collected a fair bit of data. Just -test- changes to explosion code using this please so we can compare
|
||||
if(GLOB.Debug2)
|
||||
log_world("## DEBUG: Explosion([x0],[y0],[z0])(d[devastation_range],h[heavy_impact_range],l[light_impact_range]): Took [took] seconds.")
|
||||
|
||||
@@ -52,7 +52,7 @@ Unless you know what you're doing, only use the first three numbers. They're in
|
||||
name = "diamond"
|
||||
desc = "Highly pressurized carbon"
|
||||
color = list(48/255, 272/255, 301/255,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0)
|
||||
strength_modifier = 1.1
|
||||
strength_modifier = 1.2
|
||||
alpha = 132
|
||||
categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE)
|
||||
sheet_type = /obj/item/stack/sheet/mineral/diamond
|
||||
@@ -85,6 +85,7 @@ Unless you know what you're doing, only use the first three numbers. They're in
|
||||
name = "plasma"
|
||||
desc = "Isn't plasma a state of matter? Oh whatever."
|
||||
color = list(298/255, 46/255, 352/255,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0)
|
||||
strength_modifier = 0.7
|
||||
categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE)
|
||||
sheet_type = /obj/item/stack/sheet/mineral/plasma
|
||||
value_per_unit = 0.1
|
||||
|
||||
@@ -58,14 +58,6 @@ GLOBAL_VAR_INIT(dynamic_forced_storyteller, null)
|
||||
var/threat_level = 0
|
||||
/// The current antag threat. Recalculated every time a ruletype starts or ends.
|
||||
var/threat = 0
|
||||
/// Threat average over the course of the round, for endgame logs.
|
||||
var/threat_average = 0
|
||||
/// Number of times threat average has been calculated, for calculating above.
|
||||
var/threat_average_weight = 0
|
||||
/// Last time a threat average sample was taken. Used for weighting the rolling average.
|
||||
var/last_threat_sample_time = 0
|
||||
/// Maximum threat recorded so far, for cross-round chaos adjustment.
|
||||
var/max_threat = 0
|
||||
/// Things that cause a rolling threat adjustment to be displayed at roundend.
|
||||
var/list/threat_tallies = list()
|
||||
/// Running information about the threat. Can store text or datum entries.
|
||||
@@ -745,17 +737,7 @@ GLOBAL_VAR_INIT(dynamic_forced_storyteller, null)
|
||||
continue
|
||||
if(!M.voluntary_ghosted)
|
||||
current_players[CURRENT_DEAD_PLAYERS].Add(M) // Players who actually died (and admins who ghosted, would be nice to avoid counting them somehow)
|
||||
threat = storyteller.calculate_threat() + added_threat
|
||||
max_threat = max(max_threat,threat)
|
||||
if(threat_average_weight)
|
||||
var/cur_sample_weight = world.time - last_threat_sample_time
|
||||
threat_average = ((threat_average * threat_average_weight) + (threat * cur_sample_weight)) / (threat_average_weight + cur_sample_weight)
|
||||
threat_average_weight += cur_sample_weight
|
||||
last_threat_sample_time = world.time
|
||||
else
|
||||
threat_average = threat
|
||||
threat_average_weight++
|
||||
last_threat_sample_time = world.time
|
||||
threat = (SSactivity.current_threat * 0.6 + SSactivity.get_max_threat() * 0.2 + SSactivity.get_average_threat() * 0.2) + added_threat
|
||||
|
||||
/// Removes type from the list
|
||||
/datum/game_mode/dynamic/proc/remove_from_list(list/type_list, type)
|
||||
|
||||
@@ -45,27 +45,6 @@ Property weights are added to the config weight of the ruleset. They are:
|
||||
var/midround_injection_cooldown_middle = 0.5*(GLOB.dynamic_first_midround_delay_min + GLOB.dynamic_first_midround_delay_max)
|
||||
mode.midround_injection_cooldown = round(clamp(EXP_DISTRIBUTION(midround_injection_cooldown_middle), GLOB.dynamic_first_midround_delay_min, GLOB.dynamic_first_midround_delay_max)) + world.time
|
||||
|
||||
/datum/dynamic_storyteller/proc/calculate_threat()
|
||||
var/threat = 0
|
||||
for(var/datum/antagonist/A in GLOB.antagonists)
|
||||
if(A?.owner?.current && A.owner.current.stat != DEAD)
|
||||
threat += A.threat()
|
||||
for(var/r in SSevents.running)
|
||||
var/datum/round_event/R = r
|
||||
threat += R.threat()
|
||||
for(var/obj/item/phylactery/P in GLOB.poi_list)
|
||||
threat += 25 // can't be giving them too much of a break
|
||||
for (var/mob/M in mode.current_players[CURRENT_LIVING_PLAYERS])
|
||||
if (M?.mind?.assigned_role && M.stat != DEAD)
|
||||
var/datum/job/J = SSjob.GetJob(M.mind.assigned_role)
|
||||
if(J)
|
||||
if(length(M.mind.antag_datums))
|
||||
threat += J.GetThreat()
|
||||
else
|
||||
threat -= J.GetThreat()
|
||||
threat += (mode.current_players[CURRENT_DEAD_PLAYERS].len)*dead_player_weight
|
||||
return round(threat,0.1)
|
||||
|
||||
/datum/dynamic_storyteller/proc/do_process()
|
||||
return
|
||||
|
||||
@@ -95,7 +74,7 @@ Property weights are added to the config weight of the ruleset. They are:
|
||||
if(voters)
|
||||
GLOB.dynamic_curve_centre += (mean/voters)
|
||||
if(flags & USE_PREV_ROUND_WEIGHTS)
|
||||
GLOB.dynamic_curve_centre += (50 - SSpersistence.average_dynamic_threat) / 10
|
||||
GLOB.dynamic_curve_centre += (SSpersistence.average_threat) / 10
|
||||
GLOB.dynamic_forced_threat_level = forced_threat_level
|
||||
|
||||
/datum/dynamic_storyteller/proc/get_midround_cooldown()
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
icon_state = "0"
|
||||
state = 0
|
||||
|
||||
/obj/structure/frame/computer/attackby(obj/item/P, mob/user, params)
|
||||
/obj/structure/frame/computer/attackby(obj/item/P, mob/living/user, params)
|
||||
add_fingerprint(user)
|
||||
switch(state)
|
||||
if(0)
|
||||
@@ -11,7 +11,7 @@
|
||||
to_chat(user, "<span class='notice'>You start wrenching the frame into place...</span>")
|
||||
if(P.use_tool(src, user, 20, volume=50))
|
||||
to_chat(user, "<span class='notice'>You wrench the frame into place.</span>")
|
||||
setAnchored(TRUE)
|
||||
set_anchored(TRUE)
|
||||
state = 1
|
||||
return
|
||||
if(P.tool_behaviour == TOOL_WELDER)
|
||||
@@ -19,7 +19,7 @@
|
||||
return
|
||||
|
||||
to_chat(user, "<span class='notice'>You start deconstructing the frame...</span>")
|
||||
if(P.use_tool(src, user, 20, volume=50) && state == 0)
|
||||
if(P.use_tool(src, user, 20, volume=50))
|
||||
to_chat(user, "<span class='notice'>You deconstruct the frame.</span>")
|
||||
var/obj/item/stack/sheet/metal/M = new (drop_location(), 5)
|
||||
M.add_fingerprint(user)
|
||||
@@ -28,15 +28,15 @@
|
||||
if(1)
|
||||
if(P.tool_behaviour == TOOL_WRENCH)
|
||||
to_chat(user, "<span class='notice'>You start to unfasten the frame...</span>")
|
||||
if(P.use_tool(src, user, 20, volume=50) && state == 1)
|
||||
if(P.use_tool(src, user, 20, volume=50))
|
||||
to_chat(user, "<span class='notice'>You unfasten the frame.</span>")
|
||||
setAnchored(FALSE)
|
||||
set_anchored(FALSE)
|
||||
state = 0
|
||||
return
|
||||
if(istype(P, /obj/item/circuitboard/computer) && !circuit)
|
||||
if(!user.transferItemToLoc(P, src))
|
||||
return
|
||||
playsound(src, 'sound/items/deconstruct.ogg', 50, 1)
|
||||
playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE)
|
||||
to_chat(user, "<span class='notice'>You place [P] inside the frame.</span>")
|
||||
icon_state = "1"
|
||||
circuit = P
|
||||
@@ -71,8 +71,10 @@
|
||||
if(istype(P, /obj/item/stack/cable_coil))
|
||||
if(!P.tool_start_check(user, amount=5))
|
||||
return
|
||||
if(state != 2)
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You start adding cables to the frame...</span>")
|
||||
if(P.use_tool(src, user, 20, 5, 50, CALLBACK(src, .proc/check_state, 2)))
|
||||
if(P.use_tool(src, user, 20, volume=50, amount=5))
|
||||
to_chat(user, "<span class='notice'>You add cables to the frame.</span>")
|
||||
state = 3
|
||||
icon_state = "3"
|
||||
@@ -90,9 +92,11 @@
|
||||
if(istype(P, /obj/item/stack/sheet/glass))
|
||||
if(!P.tool_start_check(user, amount=2))
|
||||
return
|
||||
playsound(src, 'sound/items/deconstruct.ogg', 50, 1)
|
||||
if(state != 3)
|
||||
return
|
||||
playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE)
|
||||
to_chat(user, "<span class='notice'>You start to put in the glass panel...</span>")
|
||||
if(P.use_tool(src, user, 20, 2, 0, CALLBACK(src, .proc/check_state, 3)))
|
||||
if(P.use_tool(src, user, 20, amount=2))
|
||||
to_chat(user, "<span class='notice'>You put in the glass panel.</span>")
|
||||
state = 4
|
||||
src.icon_state = "4"
|
||||
@@ -109,14 +113,51 @@
|
||||
if(P.tool_behaviour == TOOL_SCREWDRIVER)
|
||||
P.play_tool_sound(src)
|
||||
to_chat(user, "<span class='notice'>You connect the monitor.</span>")
|
||||
var/obj/B = new circuit.build_path (loc, circuit)
|
||||
B.setDir(dir)
|
||||
transfer_fingerprints_to(B)
|
||||
|
||||
var/obj/machinery/new_machine = new circuit.build_path(loc)
|
||||
new_machine.setDir(dir)
|
||||
transfer_fingerprints_to(new_machine)
|
||||
|
||||
if(istype(new_machine, /obj/machinery/computer))
|
||||
var/obj/machinery/computer/new_computer = new_machine
|
||||
|
||||
// Machines will init with a set of default components.
|
||||
// Triggering handle_atom_del will make the machine realise it has lost a component_parts and then deconstruct.
|
||||
// Move to nullspace so we don't trigger handle_atom_del, then qdel.
|
||||
// Finally, replace new machine's parts with this frame's parts.
|
||||
if(new_computer.circuit)
|
||||
// Move to nullspace and delete.
|
||||
new_computer.circuit.moveToNullspace()
|
||||
QDEL_NULL(new_computer.circuit)
|
||||
for(var/old_part in new_computer.component_parts)
|
||||
var/atom/movable/movable_part = old_part
|
||||
// Move to nullspace and delete.
|
||||
movable_part.moveToNullspace()
|
||||
qdel(movable_part)
|
||||
|
||||
// Set anchor state and move the frame's parts over to the new machine.
|
||||
// Then refresh parts and call on_construction().
|
||||
new_computer.set_anchored(anchored)
|
||||
new_computer.component_parts = list()
|
||||
|
||||
circuit.forceMove(new_computer)
|
||||
new_computer.component_parts += circuit
|
||||
new_computer.circuit = circuit
|
||||
|
||||
for(var/new_part in src)
|
||||
var/atom/movable/movable_part = new_part
|
||||
movable_part.forceMove(new_computer)
|
||||
new_computer.component_parts += movable_part
|
||||
|
||||
new_computer.RefreshParts()
|
||||
new_computer.on_construction()
|
||||
|
||||
qdel(src)
|
||||
return
|
||||
if(user.a_intent == INTENT_HARM)
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/structure/frame/computer/deconstruct(disassembled = TRUE)
|
||||
if(!(flags_1 & NODECONSTRUCT_1))
|
||||
if(state == 4)
|
||||
@@ -127,13 +168,12 @@
|
||||
..()
|
||||
|
||||
/obj/structure/frame/computer/AltClick(mob/user)
|
||||
. = ..()
|
||||
if(!isliving(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
|
||||
..()
|
||||
if(!user.canUseTopic(src, BE_CLOSE, TRUE, FALSE))
|
||||
return
|
||||
|
||||
if(anchored)
|
||||
to_chat(usr, "<span class='warning'>You must unwrench [src] before rotating it!</span>")
|
||||
return TRUE
|
||||
return
|
||||
|
||||
setDir(turn(dir, -90))
|
||||
return TRUE
|
||||
|
||||
@@ -51,6 +51,11 @@
|
||||
return FALSE
|
||||
return ACCESS_CAPTAIN in authorize_access
|
||||
|
||||
/obj/machinery/computer/communications/proc/authenticated_as_non_silicon_command(mob/user)
|
||||
if (issilicon(user))
|
||||
return FALSE
|
||||
return ACCESS_HEADS in authorize_access //Should always be the case if authorized as it usually needs head access to log in, buut lets be sure.
|
||||
|
||||
/// Are we a silicon, OR we're logged in as the captain?
|
||||
/obj/machinery/computer/communications/proc/authenticated_as_silicon_or_captain(mob/user)
|
||||
if (issilicon(user))
|
||||
@@ -160,7 +165,7 @@
|
||||
return
|
||||
make_announcement(usr)
|
||||
if ("messageAssociates")
|
||||
if (!authenticated_as_non_silicon_captain(usr))
|
||||
if (!authenticated_as_non_silicon_command(usr))
|
||||
return
|
||||
if (!COOLDOWN_FINISHED(src, important_action_cooldown))
|
||||
return
|
||||
@@ -361,9 +366,9 @@
|
||||
data["shuttleCanEvacOrFailReason"] = SSshuttle.canEvac(user, TRUE)
|
||||
|
||||
if (authenticated_as_non_silicon_captain(user))
|
||||
data["canMessageAssociates"] = TRUE
|
||||
data["canRequestNuke"] = TRUE
|
||||
|
||||
if (authenticated_as_non_silicon_command(user))
|
||||
data["canMessageAssociates"] = TRUE
|
||||
if (can_send_messages_to_other_sectors(user))
|
||||
data["canSendToSectors"] = TRUE
|
||||
|
||||
|
||||
@@ -217,6 +217,8 @@
|
||||
new_machine.RefreshParts()
|
||||
|
||||
new_machine.on_construction()
|
||||
// TODO: make sleepers not shit out parts PROPERLY THIS TIME.
|
||||
new_machine.circuit.moveToNullspace()
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
|
||||
@@ -409,7 +409,10 @@
|
||||
visible_message("<span class='notice'>\The [src] hums and hisses as it moves [mob_occupant.real_name] into storage.</span>")
|
||||
|
||||
// Ghost and delete the mob.
|
||||
if(!mob_occupant.get_ghost(1))
|
||||
var/mob/dead/observer/G = mob_occupant.get_ghost(TRUE)
|
||||
if(G)
|
||||
G.voluntary_ghosted = TRUE
|
||||
else
|
||||
mob_occupant.ghostize(FALSE, penalize = TRUE, voluntary = TRUE, cryo = TRUE)
|
||||
|
||||
QDEL_NULL(occupant)
|
||||
|
||||
@@ -178,6 +178,7 @@
|
||||
limb.update_icon_dropped()
|
||||
limb.name = "\improper synthetic [lowertext(selected.name)] [limb.name]"
|
||||
limb.desc = "A synthetic [selected_category] limb that will morph on its first use in surgery. This one is for the [parse_zone(limb.body_zone)]."
|
||||
limb.forcereplace = TRUE
|
||||
for(var/obj/item/bodypart/BP in limb)
|
||||
BP.base_bp_icon = selected.icon_limbs || DEFAULT_BODYPART_ICON_ORGANIC
|
||||
BP.species_id = selected.limbs_id
|
||||
|
||||
@@ -69,8 +69,7 @@ effective or pretty fucking useless.
|
||||
*/
|
||||
|
||||
/obj/item/healthanalyzer/rad_laser
|
||||
custom_materials = list(/datum/material/iron=400)
|
||||
var/irradiate = 1
|
||||
var/irradiate = TRUE
|
||||
var/intensity = 10 // how much damage the radiation does
|
||||
var/wavelength = 10 // time it takes for the radiation to kick in, in seconds
|
||||
var/used = 0 // is it cooling down?
|
||||
@@ -92,16 +91,16 @@ effective or pretty fucking useless.
|
||||
addtimer(VARSET_CALLBACK(src, used, FALSE), cooldown)
|
||||
addtimer(VARSET_CALLBACK(src, icon_state, "health"), cooldown)
|
||||
to_chat(user, "<span class='warning'>Successfully irradiated [M].</span>")
|
||||
addtimer(CALLBACK(src, .proc/radiation_aftereffect, M), (wavelength+(intensity*4))*5)
|
||||
addtimer(CALLBACK(src, .proc/radiation_aftereffect, M, intensity), (wavelength+(intensity*4))*5)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>The radioactive microlaser is still recharging.</span>")
|
||||
|
||||
/obj/item/healthanalyzer/rad_laser/proc/radiation_aftereffect(mob/living/M)
|
||||
if(QDELETED(M))
|
||||
/obj/item/healthanalyzer/rad_laser/proc/radiation_aftereffect(mob/living/M, passed_intensity)
|
||||
if(QDELETED(M) || !ishuman(M) || HAS_TRAIT(M, TRAIT_RADIMMUNE))
|
||||
return
|
||||
if(intensity >= 5)
|
||||
M.apply_effect(round(intensity/0.075), EFFECT_UNCONSCIOUS)
|
||||
M.rad_act(intensity*10)
|
||||
if(passed_intensity >= 5)
|
||||
M.apply_effect(round(passed_intensity/0.075), EFFECT_UNCONSCIOUS) //to save you some math, this is a round(intensity * (4/3)) second long knockout
|
||||
M.rad_act(passed_intensity*10)
|
||||
|
||||
/obj/item/healthanalyzer/rad_laser/proc/get_cooldown()
|
||||
return round(max(10, (stealth*30 + intensity*5 - wavelength/4)))
|
||||
|
||||
@@ -174,6 +174,10 @@
|
||||
var/atom/movable/AM = object
|
||||
if(CHECK_BITFIELD(shield_flags, SHIELD_TRANSPARENT) && (AM.pass_flags & PASSGLASS))
|
||||
return BLOCK_NONE
|
||||
if(CHECK_BITFIELD(shield_flags, SHIELD_NO_RANGED) && (attack_type & ATTACK_TYPE_PROJECTILE))
|
||||
return BLOCK_NONE
|
||||
if(CHECK_BITFIELD(shield_flags, SHIELD_NO_MELEE) && (attack_type & ATTACK_TYPE_MELEE))
|
||||
return BLOCK_NONE
|
||||
if(attack_type & ATTACK_TYPE_THROWN)
|
||||
final_block_chance += 30
|
||||
if(attack_type & ATTACK_TYPE_TACKLE)
|
||||
@@ -238,30 +242,75 @@
|
||||
new /obj/item/shard((get_turf(src)))
|
||||
|
||||
/obj/item/shield/riot/on_shield_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return)
|
||||
var/final_damage = damage
|
||||
|
||||
if(attack_type & ATTACK_TYPE_MELEE)
|
||||
var/obj/hittingthing = object
|
||||
if(hittingthing.damtype == BURN)
|
||||
if(CHECK_BITFIELD(shield_flags, SHIELD_ENERGY_WEAK))
|
||||
final_damage *= 2
|
||||
else if(CHECK_BITFIELD(shield_flags, SHIELD_ENERGY_STRONG))
|
||||
final_damage *= 0.5
|
||||
|
||||
if(hittingthing.damtype == BRUTE)
|
||||
if(CHECK_BITFIELD(shield_flags, SHIELD_KINETIC_WEAK))
|
||||
final_damage *= 2
|
||||
else if(CHECK_BITFIELD(shield_flags, SHIELD_KINETIC_STRONG))
|
||||
final_damage *= 0.5
|
||||
|
||||
if(hittingthing.damtype == STAMINA || hittingthing.damtype == TOX || hittingthing.damtype == CLONE || hittingthing.damtype == BRAIN || hittingthing.damtype == OXY)
|
||||
final_damage = 0
|
||||
|
||||
if(attack_type & ATTACK_TYPE_PROJECTILE)
|
||||
var/obj/item/projectile/shootingthing = object
|
||||
if(is_energy_reflectable_projectile(shootingthing))
|
||||
if(CHECK_BITFIELD(shield_flags, SHIELD_ENERGY_WEAK))
|
||||
final_damage *= 2
|
||||
else if(CHECK_BITFIELD(shield_flags, SHIELD_ENERGY_STRONG))
|
||||
final_damage *= 0.5
|
||||
|
||||
if(!is_energy_reflectable_projectile(object))
|
||||
if(CHECK_BITFIELD(shield_flags, SHIELD_KINETIC_WEAK))
|
||||
final_damage *= 2
|
||||
else if(CHECK_BITFIELD(shield_flags, SHIELD_KINETIC_STRONG))
|
||||
final_damage *= 0.5
|
||||
|
||||
if(shootingthing.damage_type == STAMINA)
|
||||
if(CHECK_BITFIELD(shield_flags, SHIELD_DISABLER_DISRUPTED))
|
||||
final_damage *= 3 //disablers melt these kinds of shields. Really meant more for holoshields.
|
||||
else
|
||||
final_damage = 0
|
||||
|
||||
if(shootingthing.damage_type == TOX || shootingthing.damage_type == CLONE || shootingthing.damage_type == BRAIN || shootingthing.damage_type == OXY)
|
||||
final_damage = 0
|
||||
|
||||
if(can_shatter && (obj_integrity <= damage))
|
||||
var/turf/T = get_turf(owner)
|
||||
T.visible_message("<span class='warning'>[attack_text] destroys [src]!</span>")
|
||||
shatter(owner)
|
||||
qdel(src)
|
||||
return FALSE
|
||||
take_damage(damage)
|
||||
take_damage(final_damage)
|
||||
return ..()
|
||||
|
||||
/obj/item/shield/riot/laser_proof
|
||||
name = "laser resistant shield"
|
||||
desc = "A far more frail shield made of dark glass meant to block lasers but suffers from being being weak to ballistic projectiles."
|
||||
/obj/item/shield/riot/energy_proof
|
||||
name = "energy resistant shield"
|
||||
desc = "An ablative shield designed to absorb and disperse energy attacks. This comes at significant cost to its ability to withstand ballistics and kinetics, breaking apart easily."
|
||||
armor = list("melee" = 30, "bullet" = -10, "laser" = 80, "energy" = 80, "bomb" = -40, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 50)
|
||||
icon_state = "riot_laser"
|
||||
item_state = "riot_laser"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi'
|
||||
shield_flags = SHIELD_FLAGS_DEFAULT
|
||||
shield_flags = SHIELD_FLAGS_DEFAULT | SHIELD_ENERGY_STRONG | SHIELD_KINETIC_WEAK
|
||||
max_integrity = 300
|
||||
|
||||
/obj/item/shield/riot/bullet_proof
|
||||
name = "bullet resistant shield"
|
||||
desc = "A far more frail shield made of resistant plastics and kevlar meant to block ballistics."
|
||||
/obj/item/shield/riot/kinetic_proof
|
||||
name = "kinetic resistant shield"
|
||||
desc = "A polymer and ceramic shield designed to absorb ballistic projectiles and kinetic force. It doesn't do very well into energy attacks, especially from weapons that inflict burns."
|
||||
armor = list("melee" = 30, "bullet" = 80, "laser" = 0, "energy" = 0, "bomb" = -40, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 50)
|
||||
icon_state = "riot_bullet"
|
||||
item_state = "riot_bullet"
|
||||
shield_flags = SHIELD_FLAGS_DEFAULT | SHIELD_KINETIC_STRONG | SHIELD_ENERGY_WEAK
|
||||
max_integrity = 300
|
||||
|
||||
/obj/item/shield/riot/roman
|
||||
@@ -277,8 +326,8 @@
|
||||
|
||||
/obj/item/shield/riot/roman/fake
|
||||
desc = "Bears an inscription on the inside: <i>\"Romanes venio domus\"</i>. It appears to be a bit flimsy."
|
||||
block_chance = 0
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
|
||||
shield_flags = SHIELD_ENERGY_WEAK | SHIELD_KINETIC_WEAK | SHIELD_NO_RANGED
|
||||
max_integrity = 40
|
||||
|
||||
/obj/item/shield/riot/roman/shatter(mob/living/carbon/human/owner)
|
||||
@@ -295,14 +344,80 @@
|
||||
custom_materials = list(/datum/material/wood = MINERAL_MATERIAL_AMOUNT * 10)
|
||||
resistance_flags = FLAMMABLE
|
||||
repair_material = /obj/item/stack/sheet/mineral/wood
|
||||
block_chance = 30
|
||||
shield_flags = SHIELD_FLAGS_DEFAULT
|
||||
shield_flags = SHIELD_FLAGS_DEFAULT | SHIELD_ENERGY_WEAK
|
||||
max_integrity = 150
|
||||
|
||||
/obj/item/shield/riot/buckler/shatter(mob/living/carbon/human/owner)
|
||||
playsound(owner, 'sound/effects/bang.ogg', 50)
|
||||
new /obj/item/stack/sheet/mineral/wood(get_turf(src))
|
||||
|
||||
/obj/item/shield/riot/flash
|
||||
name = "strobe shield"
|
||||
desc = "A shield with a built in, high intensity light capable of blinding and disorienting suspects. Takes regular handheld flashes as bulbs."
|
||||
icon_state = "flashshield"
|
||||
item_state = "flashshield"
|
||||
var/obj/item/assembly/flash/handheld/embedded_flash
|
||||
|
||||
/obj/item/shield/riot/flash/Initialize()
|
||||
. = ..()
|
||||
embedded_flash = new(src)
|
||||
|
||||
/obj/item/shield/riot/flash/ComponentInitialize()
|
||||
. = .. ()
|
||||
AddElement(/datum/element/update_icon_updates_onmob)
|
||||
|
||||
/obj/item/shield/riot/flash/attack(mob/living/M, mob/user)
|
||||
. = embedded_flash.attack(M, user)
|
||||
update_icon()
|
||||
|
||||
/obj/item/shield/riot/flash/attack_self(mob/living/carbon/user)
|
||||
. = embedded_flash.attack_self(user)
|
||||
update_icon()
|
||||
|
||||
/obj/item/shield/riot/flash/on_shield_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return)
|
||||
. = ..()
|
||||
if (. && !embedded_flash.crit_fail)
|
||||
embedded_flash.activate()
|
||||
update_icon()
|
||||
|
||||
|
||||
/obj/item/shield/riot/flash/attackby(obj/item/W, mob/user)
|
||||
if(istype(W, /obj/item/assembly/flash/handheld))
|
||||
var/obj/item/assembly/flash/handheld/flash = W
|
||||
if(flash.crit_fail)
|
||||
to_chat(user, "<span class='warning'>No sense replacing it with a broken bulb!</span>")
|
||||
return
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You begin to replace the bulb...</span>")
|
||||
if(do_after(user, 20, target = user))
|
||||
if(flash.crit_fail || !flash || QDELETED(flash))
|
||||
return
|
||||
playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE)
|
||||
qdel(embedded_flash)
|
||||
embedded_flash = flash
|
||||
flash.forceMove(src)
|
||||
update_icon()
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/shield/riot/flash/emp_act(severity)
|
||||
. = ..()
|
||||
embedded_flash.emp_act(severity)
|
||||
update_icon()
|
||||
|
||||
/obj/item/shield/riot/flash/update_icon_state()
|
||||
if(!embedded_flash || embedded_flash.crit_fail)
|
||||
icon_state = "riot"
|
||||
item_state = "riot"
|
||||
else
|
||||
icon_state = "flashshield"
|
||||
item_state = "flashshield"
|
||||
|
||||
/obj/item/shield/riot/flash/examine(mob/user)
|
||||
. = ..()
|
||||
if (embedded_flash?.crit_fail)
|
||||
. += "<span class='info'>The mounted bulb has burnt out. You can try replacing it with a new one.</span>"
|
||||
|
||||
/obj/item/shield/riot/tele
|
||||
name = "telescopic shield"
|
||||
desc = "An advanced riot shield made of lightweight materials that collapses for easy storage."
|
||||
@@ -348,7 +463,7 @@
|
||||
|
||||
/obj/item/shield/makeshift
|
||||
name = "metal shield"
|
||||
desc = "A large shield made of wired and welded sheets of metal. The handle is made of cloth and leather making it unwieldy."
|
||||
desc = "A large shield made of wired and welded sheets of metal. The handle is made of cloth and leather, making it unwieldy."
|
||||
armor = list("melee" = 25, "bullet" = 25, "laser" = 5, "energy" = 0, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 80)
|
||||
lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi'
|
||||
@@ -362,33 +477,34 @@
|
||||
|
||||
/obj/item/shield/riot/tower
|
||||
name = "tower shield"
|
||||
desc = "A massive shield that can block a lot of attacks, can take a lot of abuse before braking."
|
||||
desc = "An immense tower shield. Designed to ensure maximum protection to the user, at the expense of mobility."
|
||||
armor = list("melee" = 95, "bullet" = 95, "laser" = 75, "energy" = 60, "bomb" = 90, "bio" = 90, "rad" = 0, "fire" = 90, "acid" = 10) //Armor for the item, dosnt transfer to user
|
||||
item_state = "metal"
|
||||
icon_state = "metal"
|
||||
force = 16
|
||||
slowdown = 2
|
||||
throwforce = 15 //Massive pice of metal
|
||||
throwforce = 15 //Massive piece of metal
|
||||
max_integrity = 600
|
||||
w_class = WEIGHT_CLASS_HUGE
|
||||
item_flags = SLOWS_WHILE_IN_HAND
|
||||
item_flags = SLOWS_WHILE_IN_HAND | ITEM_CAN_BLOCK
|
||||
shield_flags = SHIELD_FLAGS_DEFAULT
|
||||
|
||||
/obj/item/shield/riot/tower/swat
|
||||
name = "swat shield"
|
||||
desc = "A massive, heavy shield that can block a lot of attacks, can take a lot of abuse before breaking."
|
||||
max_integrity = 250
|
||||
|
||||
/obj/item/shield/riot/implant
|
||||
name = "telescoping shield implant"
|
||||
desc = "A compact, arm-mounted telescopic shield. While nigh-indestructible when powered by a host user, it will eventually overload from damage. Recharges while inside its implant."
|
||||
item_state = "metal"
|
||||
icon_state = "metal"
|
||||
name = "hardlight shield implant"
|
||||
desc = "A hardlight plane of force projected from the implant. While it is capable of withstanding immense amounts of abuse, it will eventually overload from sustained impacts, especially against energy attacks. Recharges while retracted."
|
||||
item_state = "holoshield"
|
||||
icon_state = "holoshield"
|
||||
slowdown = 1
|
||||
shield_flags = SHIELD_FLAGS_DEFAULT
|
||||
max_integrity = 100
|
||||
obj_integrity = 100
|
||||
can_shatter = FALSE
|
||||
item_flags = SLOWS_WHILE_IN_HAND | ITEM_CAN_BLOCK
|
||||
item_flags = ITEM_CAN_BLOCK
|
||||
shield_flags = SHIELD_FLAGS_DEFAULT | SHIELD_KINETIC_STRONG | SHIELD_DISABLER_DISRUPTED
|
||||
var/recharge_timerid
|
||||
var/recharge_delay = 15 SECONDS
|
||||
|
||||
@@ -400,7 +516,7 @@
|
||||
if(obj_integrity == 0)
|
||||
if(ismob(loc))
|
||||
var/mob/living/L = loc
|
||||
playsound(src, 'sound/effects/glassbr3.ogg', 100)
|
||||
playsound(src, "sparks", 100, TRUE)
|
||||
L.visible_message("<span class='boldwarning'>[src] overloads from the damage sustained!</span>")
|
||||
L.dropItemToGround(src) //implant component catch hook will grab it.
|
||||
|
||||
|
||||
@@ -117,8 +117,8 @@ GLOBAL_LIST_INIT(diamond_recipes, list ( \
|
||||
new/datum/stack_recipe("Captain Statue", /obj/structure/statue/diamond/captain, 5, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("AI Hologram Statue", /obj/structure/statue/diamond/ai1, 5, one_per_turf = 1, on_floor = 1), \
|
||||
new/datum/stack_recipe("AI Core Statue", /obj/structure/statue/diamond/ai2, 5, one_per_turf = 1, on_floor = 1), \
|
||||
// new/datum/stack_recipe("diamond brick", /obj/item/ingot/diamond, 6, time = 100), \ not yet
|
||||
))
|
||||
new/datum/stack_recipe("diamond ingot", /obj/item/ingot/diamond, 6, time = 100), \
|
||||
))
|
||||
|
||||
/obj/item/stack/sheet/mineral/diamond/get_main_recipes()
|
||||
. = ..()
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/obj/item/storage/box/syndicate
|
||||
|
||||
/obj/item/storage/box/syndicate/PopulateContents()
|
||||
switch (pickweight(list("bloodyspai" = 3, "stealth" = 2, "bond" = 2, "screwed" = 2, "sabotage" = 3, "guns" = 2, "murder" = 2, "baseball" = 1, "implant" = 1, "hacker" = 3, "darklord" = 1, "sniper" = 1, "metaops" = 1, "ninja" = 1)))
|
||||
switch (pickweight(list("bloodyspai" = 3, "stealth" = 2, "bond" = 2, "screwed" = 2, "sabotage" = 3, "guns" = 2, "murder" = 2, "baseball" = 1, "implant" = 1, "hacker" = 3, "darklord" = 1, "sniper" = 1, "metaops" = 1, "ninja" = 1, "ancient" = 1)))
|
||||
if("bloodyspai") // 30 tc now this is more right
|
||||
new /obj/item/clothing/under/chameleon(src) // 2 tc since it's not the full set
|
||||
new /obj/item/clothing/mask/chameleon(src) // Goes with above
|
||||
@@ -154,6 +154,20 @@
|
||||
new /obj/item/storage/belt/chameleon(src) // Unique but worth at least 2 tc
|
||||
new /obj/item/card/id/syndicate(src) // 2 tc
|
||||
new /obj/item/chameleon(src) // 7 tc
|
||||
|
||||
if("ancient") //A kit so old, it's probably older than you. //This bundle is filled with the entire unlink contents traitors had access to in 2006, from OpenSS13. Notably the esword was not a choice but existed in code.
|
||||
new /obj/item/storage/toolbox/emergency/old/ancientbundle(src) //Items fit neatly into a classic toolbox just to remind you what the theme is.
|
||||
|
||||
/obj/item/storage/toolbox/emergency/old/ancientbundle //So the subtype works
|
||||
|
||||
/obj/item/storage/toolbox/emergency/old/ancientbundle/PopulateContents()
|
||||
new /obj/item/card/emag(src)
|
||||
new /obj/item/pen/sleepy(src)
|
||||
new /obj/item/reagent_containers/pill/cyanide(src)
|
||||
new /obj/item/chameleon(src) //its not the original cloaking device, but it will do.
|
||||
new /obj/item/gun/ballistic/revolver(src)
|
||||
new /obj/item/implanter/freedom(src)
|
||||
new /obj/item/stack/telecrystal(src) //The failsafe/self destruct isn't an item we can physically include in the kit, but 1 TC is technically enough to buy the equivalent.
|
||||
|
||||
/obj/item/storage/box/syndie_kit
|
||||
name = "box"
|
||||
|
||||
@@ -662,6 +662,72 @@
|
||||
to_chat(M,"<span class='notice'>You're once again longer hearing deadchat.</span>")
|
||||
|
||||
|
||||
/datum/action/disguise
|
||||
name = "Disguise"
|
||||
button_icon_state = "ling_transform"
|
||||
icon_icon = 'icons/mob/actions/actions_changeling.dmi'
|
||||
background_icon_state = "bg_mime"
|
||||
var/currently_disguised = FALSE
|
||||
var/static/list/mob_blacklist = typecacheof(list(
|
||||
/mob/living/simple_animal/pet,
|
||||
/mob/living/simple_animal/hostile/retaliate/goose,
|
||||
/mob/living/simple_animal/hostile/poison,
|
||||
/mob/living/simple_animal/hostile/retaliate/goat,
|
||||
/mob/living/simple_animal/cow,
|
||||
/mob/living/simple_animal/chick,
|
||||
/mob/living/simple_animal/chicken,
|
||||
/mob/living/simple_animal/kiwi,
|
||||
/mob/living/simple_animal/babyKiwi,
|
||||
/mob/living/simple_animal/deer,
|
||||
/mob/living/simple_animal/parrot,
|
||||
/mob/living/simple_animal/hostile/lizard,
|
||||
/mob/living/simple_animal/crab,
|
||||
/mob/living/simple_animal/cockroach,
|
||||
/mob/living/simple_animal/butterfly,
|
||||
/mob/living/simple_animal/mouse,
|
||||
/mob/living/simple_animal/sloth,
|
||||
/mob/living/simple_animal/opossum,
|
||||
/mob/living/simple_animal/hostile/bear,
|
||||
/mob/living/simple_animal/hostile/asteroid/polarbear,
|
||||
/mob/living/simple_animal/hostile/asteroid/wolf,
|
||||
/mob/living/carbon/monkey,
|
||||
/mob/living/simple_animal/hostile/gorilla,
|
||||
/mob/living/carbon/alien/larva,
|
||||
/mob/living/simple_animal/hostile/retaliate/frog
|
||||
))
|
||||
|
||||
|
||||
/datum/action/disguise/Trigger()
|
||||
var/mob/living/carbon/human/H = owner
|
||||
if(!currently_disguised)
|
||||
var/user_object_type = input(H, "Disguising as OBJECT or MOB?") as null|anything in list("OBJECT", "MOB")
|
||||
if(user_object_type)
|
||||
var/search_term = stripped_input(H, "Enter the search term")
|
||||
if(search_term)
|
||||
var/list_to_search
|
||||
if(user_object_type == "MOB")
|
||||
list_to_search = subtypesof(/mob) - mob_blacklist
|
||||
else
|
||||
list_to_search = subtypesof(/obj)
|
||||
var/list/filtered_results = list()
|
||||
for(var/some_search_item in list_to_search)
|
||||
if(findtext("[some_search_item]", search_term))
|
||||
filtered_results += some_search_item
|
||||
if(!length(filtered_results))
|
||||
to_chat(H, "Nothing matched your search query!")
|
||||
else
|
||||
var/disguise_selection = input("Select item to disguise as") as null|anything in filtered_results
|
||||
if(disguise_selection)
|
||||
var/atom/disguise_item = disguise_selection
|
||||
var/image/I = image(icon = initial(disguise_item.icon), icon_state = initial(disguise_item.icon_state), loc = H)
|
||||
I.override = TRUE
|
||||
I.layer = ABOVE_MOB_LAYER
|
||||
H.add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/everyone, "ghost_cafe_disguise", I)
|
||||
currently_disguised = TRUE
|
||||
else
|
||||
H.remove_alt_appearance("ghost_cafe_disguise")
|
||||
currently_disguised = FALSE
|
||||
|
||||
/obj/effect/mob_spawn/human/ghostcafe/special(mob/living/carbon/human/new_spawn)
|
||||
if(new_spawn.client)
|
||||
new_spawn.client.prefs.copy_to(new_spawn)
|
||||
@@ -679,6 +745,8 @@
|
||||
to_chat(new_spawn,"<span class='boldwarning'>Ghosting is free!</span>")
|
||||
var/datum/action/toggle_dead_chat_mob/D = new(new_spawn)
|
||||
D.Grant(new_spawn)
|
||||
var/datum/action/disguise/disguise_action = new(new_spawn)
|
||||
disguise_action.Grant(new_spawn)
|
||||
|
||||
/datum/outfit/ghostcafe
|
||||
name = "ID, jumpsuit and shoes"
|
||||
|
||||
@@ -93,6 +93,9 @@
|
||||
user.stop_pulling()
|
||||
return ..()
|
||||
|
||||
/obj/structure/table/attack_robot(mob/user)
|
||||
on_attack_hand(user)
|
||||
|
||||
/obj/structure/table/attack_tk()
|
||||
return FALSE
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
desc = "A resilient shield made out of brass.. It feels warm to the touch."
|
||||
var/clockwork_desc = "A powerful shield of ratvarian making. It absorbs blocked attacks to charge devastating bashes."
|
||||
armor = list("melee" = 80, "bullet" = 70, "laser" = -10, "energy" = -20, "bomb" = 60, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
|
||||
shield_flags = SHIELD_FLAGS_DEFAULT
|
||||
shield_flags = SHIELD_FLAGS_DEFAULT | SHIELD_KINETIC_STRONG | SHIELD_ENERGY_WEAK
|
||||
max_integrity = 300 //High integrity, extremely strong against melee / bullets, but still quite easy to destroy with lasers and energy
|
||||
repair_material = /obj/item/stack/tile/brass
|
||||
var/dam_absorbed = 0
|
||||
|
||||
@@ -69,7 +69,7 @@
|
||||
/datum/action/innate/heretic_shatter/Activate()
|
||||
if(do_after(holder,10, target = holder))
|
||||
var/turf/safe_turf = find_safe_turf(zlevels = sword.z, extended_safety_checks = TRUE)
|
||||
do_teleport(holder,safe_turf,forceMove = TRUE)
|
||||
do_teleport(holder,safe_turf,forceMove = TRUE,channel=TELEPORT_CHANNEL_MAGIC)
|
||||
to_chat(holder,"<span class='warning'>You feel a gust of energy flow through your body... the Rusted Hills heard your call...</span>")
|
||||
qdel(sword)
|
||||
|
||||
|
||||
@@ -178,7 +178,7 @@
|
||||
/datum/eldritch_knowledge/summon/stalker
|
||||
name = "Lonely Ritual"
|
||||
gain_text = "I was able to combine my greed and desires to summon an eldritch beast I had never seen before. An ever shapeshifting mass of flesh, it knew well my goals."
|
||||
desc = "You can now summon a Stalker by transmutating a pair of eyes, a candle, a pen and a piece of paper. Stalkers can shapeshift into harmless animals to get close to the victim."
|
||||
desc = "You can now summon a Stalker by transmutating a kitchen knife, a candle, a pen and a piece of paper. Stalkers can shapeshift into harmless animals to get close to the victim."
|
||||
cost = 1
|
||||
required_atoms = list(/obj/item/kitchen/knife,/obj/item/candle,/obj/item/pen,/obj/item/paper)
|
||||
mob_to_summon = /mob/living/simple_animal/hostile/eldritch/stalker
|
||||
|
||||
@@ -7,7 +7,21 @@
|
||||
earliest_start = 1 HOURS
|
||||
min_players = 20
|
||||
|
||||
|
||||
/datum/round_event_control/slaughter/canSpawnEvent()
|
||||
weight = initial(src.weight)
|
||||
var/list/allowed_turf_typecache = typecacheof(/turf/open) - typecacheof(/turf/open/space)
|
||||
var/list/allowed_z_cache = list()
|
||||
for(var/z in SSmapping.levels_by_trait(ZTRAIT_STATION))
|
||||
allowed_z_cache[num2text(z)] = TRUE
|
||||
for(var/obj/effect/decal/cleanable/C in world)
|
||||
if(!C.loc || QDELETED(C))
|
||||
continue
|
||||
if(!C.can_bloodcrawl_in())
|
||||
continue
|
||||
if(!SSpersistence.IsValidDebrisLocation(C.loc, allowed_turf_typecache, allowed_z_cache, C.type, FALSE))
|
||||
continue
|
||||
weight += 0.05
|
||||
return ..()
|
||||
|
||||
/datum/round_event/ghost_role/slaughter
|
||||
minimum_required = 1
|
||||
|
||||
@@ -262,70 +262,6 @@
|
||||
/obj/item/assembly/flash/armimplant/proc/cooldown()
|
||||
overheat = FALSE
|
||||
|
||||
/obj/item/assembly/flash/shield
|
||||
name = "strobe shield"
|
||||
desc = "A shield with a built in, high intensity light capable of blinding and disorienting suspects. Takes regular handheld flashes as bulbs."
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
icon_state = "flashshield"
|
||||
item_state = "flashshield"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi'
|
||||
slot_flags = ITEM_SLOT_BACK
|
||||
force = 10
|
||||
throwforce = 5
|
||||
throw_speed = 2
|
||||
throw_range = 3
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
custom_materials = list(/datum/material/glass=7500, /datum/material/iron=1000)
|
||||
attack_verb = list("shoved", "bashed")
|
||||
block_chance = 50
|
||||
armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 0, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 70)
|
||||
|
||||
/obj/item/assembly/flash/shield/flash_recharge(interval=10)
|
||||
if(times_used >= 4)
|
||||
burn_out()
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/obj/item/assembly/flash/shield/attackby(obj/item/W, mob/user)
|
||||
if(istype(W, /obj/item/assembly/flash/handheld))
|
||||
var/obj/item/assembly/flash/handheld/flash = W
|
||||
if(flash.crit_fail)
|
||||
to_chat(user, "No sense replacing it with a broken bulb.")
|
||||
return
|
||||
else
|
||||
to_chat(user, "You begin to replace the bulb.")
|
||||
if(do_after(user, 20, target = src))
|
||||
if(flash.crit_fail || !flash || QDELETED(flash))
|
||||
return
|
||||
crit_fail = FALSE
|
||||
times_used = 0
|
||||
playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE)
|
||||
update_icon()
|
||||
flash.crit_fail = TRUE
|
||||
flash.update_icon()
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/assembly/flash/shield/update_icon(flash = FALSE)
|
||||
icon_state = "flashshield"
|
||||
item_state = "flashshield"
|
||||
|
||||
if(crit_fail)
|
||||
icon_state = "riot"
|
||||
item_state = "riot"
|
||||
else if(flash)
|
||||
icon_state = "flashshield_flash"
|
||||
item_state = "flashshield_flash"
|
||||
addtimer(CALLBACK(src, /atom/.proc/update_icon), 5)
|
||||
|
||||
if(holder)
|
||||
holder.update_icon()
|
||||
|
||||
/obj/item/assembly/flash/shield/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return)
|
||||
activate()
|
||||
return ..()
|
||||
|
||||
//ported from tg - check to make sure it can't appear where it's not supposed to.
|
||||
/obj/item/assembly/flash/hypnotic
|
||||
desc = "A modified flash device, programmed to emit a sequence of subliminal flashes that can send a vulnerable target into a hypnotic trance."
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
|
||||
/datum/blackmarket_item/New()
|
||||
if(isnull(price))
|
||||
price = rand(price_min, price_max)
|
||||
price = round(rand(price_min, price_max), 5)
|
||||
if(isnull(stock))
|
||||
stock = rand(stock_min, stock_max)
|
||||
|
||||
|
||||
@@ -51,5 +51,30 @@
|
||||
item = /obj/item/clothing/head/chameleon/broken
|
||||
price_min = 100
|
||||
price_max = 200
|
||||
stock_max = 2
|
||||
availability_prob = 70
|
||||
stock_min = 3
|
||||
stock_max = 7
|
||||
availability_prob = 100
|
||||
|
||||
/datum/blackmarket_item/clothing/earmuffs
|
||||
name = "Earmuffs"
|
||||
desc = "Protect your precious ears from security's flashbangs with this handy device."
|
||||
item = /obj/item/clothing/ears/earmuffs
|
||||
price_min = 100
|
||||
price_max = 200
|
||||
stock_min = 3
|
||||
stock_max = 7
|
||||
availability_prob = 100
|
||||
|
||||
/* commented out until someone wants to port the actual boots
|
||||
* i am unsure they are in accordance with server design ideals
|
||||
|
||||
/datum/blackmarket_item/clothing/rocket_boots
|
||||
name = "Rocket Boots"
|
||||
desc = "We found a pair of jump boots and overclocked the hell out of them. No liability for grevious harm to or with a body."
|
||||
item = /obj/item/clothing/shoes/bhop/rocket
|
||||
price_min = 1500
|
||||
price_max = 3000
|
||||
stock_max = 1
|
||||
availability_prob = 30
|
||||
|
||||
*/
|
||||
|
||||
@@ -14,11 +14,11 @@
|
||||
name = "Box of Donk Pockets"
|
||||
desc = "A well packaged box containing the favourite snack of every spacefarer."
|
||||
item = /obj/item/storage/box/donkpockets
|
||||
stock_min = 2
|
||||
stock_max = 5
|
||||
price_min = 325
|
||||
price_max = 400
|
||||
availability_prob = 80
|
||||
stock_min = 5
|
||||
stock_max = 10
|
||||
price_min = 250
|
||||
price_max = 350
|
||||
availability_prob = 100
|
||||
|
||||
/datum/blackmarket_item/consumable/suspicious_pills
|
||||
name = "Bottle of Suspicious Pills"
|
||||
@@ -46,13 +46,43 @@
|
||||
stock_max = 35
|
||||
price_min = 10
|
||||
price_max = 60
|
||||
availability_prob = 50
|
||||
availability_prob = 70
|
||||
|
||||
/datum/blackmarket_item/consumable/pumpup
|
||||
name = "Shoddy Stimulants"
|
||||
desc = "Feel the energy inside each needle!"
|
||||
item = /obj/item/reagent_containers/hypospray/medipen/stimpack
|
||||
stock_max = 5
|
||||
price_min = 50
|
||||
price_max = 150
|
||||
availability_prob = 90
|
||||
price_min = 80
|
||||
price_max = 170
|
||||
availability_prob = 70
|
||||
|
||||
/datum/blackmarket_item/consumable/stray_drink
|
||||
name = "A random drink"
|
||||
desc = "A surprise drink direcly from the counter. No refunds if the glass breaks." // it will always break if it's launched at the station
|
||||
item = /obj/item/reagent_containers/food/drinks/drinkingglass
|
||||
stock_min = 10
|
||||
stock_max = 15
|
||||
price_min = 100
|
||||
price_max = 200
|
||||
availability_prob = 100
|
||||
// add new drinks here
|
||||
var/list/counter = list(
|
||||
/datum/reagent/consumable/ethanol/gintonic,
|
||||
/datum/reagent/consumable/ethanol/cuba_libre,
|
||||
/datum/reagent/consumable/ethanol/martini,
|
||||
/datum/reagent/consumable/ethanol/b52,
|
||||
/datum/reagent/consumable/ethanol/manhattan,
|
||||
/datum/reagent/consumable/ethanol/bahama_mama,
|
||||
/datum/reagent/consumable/ethanol/syndicatebomb,
|
||||
/datum/reagent/consumable/ethanol/quadruple_sec
|
||||
)
|
||||
|
||||
// i found no other way to fill a glass with a random reagent at runtime. and i definitely was not going to do the same done in bottle.dm
|
||||
/datum/blackmarket_item/consumable/stray_drink/spawn_item(loc)
|
||||
var/obj/item/reagent_containers/food/drinks/drinkingglass/drink = new item(loc)
|
||||
var/picked = pick(counter)
|
||||
drink.list_reagents = list()
|
||||
drink.list_reagents[picked] = 50
|
||||
drink.add_initial_reagents()
|
||||
return drink
|
||||
|
||||
@@ -10,6 +10,15 @@
|
||||
stock_max = 6
|
||||
availability_prob = 80
|
||||
|
||||
/datum/blackmarket_item/misc/clear_pda
|
||||
name = "Clear PDA"
|
||||
desc = "Show off your style with this limited edition clear PDA!."
|
||||
item = /obj/item/pda/clear
|
||||
price_min = 250
|
||||
price_max = 600
|
||||
stock_max = 4
|
||||
availability_prob = 50
|
||||
|
||||
/datum/blackmarket_item/misc/shoulder_holster
|
||||
name = "Shoulder holster"
|
||||
desc = "Yeehaw, hardboiled friends! This holster is the first step in your dream of becoming a detective and being allowed to shoot real guns!"
|
||||
@@ -37,11 +46,11 @@
|
||||
name = "Strange Seeds"
|
||||
desc = "An Exotic Variety of seed that can contain anything from glow to acid."
|
||||
item = /obj/item/seeds/random
|
||||
price_min = 320
|
||||
price_max = 360
|
||||
price_min = 450
|
||||
price_max = 650
|
||||
stock_min = 2
|
||||
stock_max = 5
|
||||
availability_prob = 50
|
||||
availability_prob = 100
|
||||
|
||||
/datum/blackmarket_item/misc/smugglers_satchel
|
||||
name = "Smuggler's Satchel"
|
||||
@@ -51,3 +60,14 @@
|
||||
price_max = 1000
|
||||
stock_max = 2
|
||||
availability_prob = 30
|
||||
|
||||
/datum/blackmarket_item/misc/internals_box
|
||||
name = "Internals Box"
|
||||
desc = "The same one Nanotrasen gives you before starting the shift. Totally not stolen from a dead space-man floating in space."
|
||||
item = /obj/item/storage/box/survival
|
||||
price_min = 250
|
||||
price_max = 350
|
||||
stock_min = 3
|
||||
stock_max = 6
|
||||
availability_prob = 100
|
||||
|
||||
|
||||
@@ -59,7 +59,7 @@
|
||||
name = "Thermite Bottle"
|
||||
desc = "30 units of Thermite to assist in creating a quick access point or get away!"
|
||||
item = /obj/item/reagent_containers/glass/bottle/thermite
|
||||
price_min = 500
|
||||
price_min = 750
|
||||
price_max = 1500
|
||||
stock_max = 3
|
||||
availability_prob = 30
|
||||
@@ -68,7 +68,18 @@
|
||||
name = "Science Goggles"
|
||||
desc = "These glasses scan the contents of containers and projects their contents to the user in an easy-to-read format."
|
||||
item = /obj/item/clothing/glasses/science
|
||||
price_min = 150
|
||||
price_max = 200
|
||||
stock_max = 3
|
||||
availability_prob = 50
|
||||
price_min = 200
|
||||
price_max = 300
|
||||
stock_min = 3
|
||||
stock_max = 7
|
||||
availability_prob = 100
|
||||
|
||||
/datum/blackmarket_item/tool/meson_goggles
|
||||
name = "Meson Goggles"
|
||||
desc = "These let you see through walls and inspect other structures."
|
||||
item = /obj/item/clothing/glasses/meson
|
||||
price_min = 200
|
||||
price_max = 300
|
||||
stock_min = 3
|
||||
stock_max = 7
|
||||
availability_prob = 100
|
||||
|
||||
@@ -28,14 +28,23 @@
|
||||
item = /obj/item/spear/bonespear
|
||||
price_min = 200
|
||||
price_max = 300
|
||||
stock_max = 3
|
||||
availability_prob = 60
|
||||
stock_max = 0
|
||||
availability_prob = 0
|
||||
|
||||
/datum/blackmarket_item/weapon/emp_grenade
|
||||
name = "EMP Grenade"
|
||||
desc = "Use this grenade for SHOCKING results!"
|
||||
item = /obj/item/grenade/empgrenade
|
||||
price_min = 100
|
||||
price_max = 400
|
||||
price_min = 300
|
||||
price_max = 600
|
||||
stock_max = 2
|
||||
availability_prob = 50
|
||||
availability_prob = 20
|
||||
|
||||
/datum/blackmarket_item/weapon/smoke_grenade
|
||||
name = "Smoke Grenade"
|
||||
desc = "Used for obcuring a large area with thick smoke."
|
||||
item = /obj/item/grenade/smokebomb
|
||||
price_min = 100
|
||||
price_max = 300
|
||||
stock_max = 3
|
||||
availability_prob = 40
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
/obj/item/blackmarket_uplink
|
||||
name = "Black Market Uplink"
|
||||
desc = "A mishmash of a subspace amplifier, a radio, and an analyzer. Somehow able to access the black market, with a variable inventory in limited stock at inflated prices. No refunds, customer responsible for pick-ups."
|
||||
icon = 'icons/obj/blackmarket.dmi'
|
||||
icon_state = "uplink"
|
||||
// UI variables.
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
name = "Strobe Shield"
|
||||
description = "One of our Emergency Response Agents thinks there's vampires in a local station. Send him something to help with his fear of the dark and protect him, too."
|
||||
reward = 3000
|
||||
wanted_types = list(/obj/item/assembly/flash/shield)
|
||||
wanted_types = list(/obj/item/shield/riot/flash)
|
||||
|
||||
/datum/bounty/item/security/sechuds
|
||||
name = "Sec HUDs"
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
/datum/export/weapon/riot_shield
|
||||
cost = 70
|
||||
unit_name = "flash shield"
|
||||
export_types = list(/obj/item/assembly/flash/shield)
|
||||
export_types = list(/obj/item/shield/riot/flash)
|
||||
|
||||
/datum/export/weapon/tele_shield
|
||||
cost = 100
|
||||
@@ -138,7 +138,7 @@
|
||||
export_types = list(/obj/item/gun/energy/xray)
|
||||
|
||||
/datum/export/weapon/ioncarbine
|
||||
cost = 200
|
||||
cost = 200
|
||||
unit_name = "ion carbine"
|
||||
export_types = list(/obj/item/gun/energy/ionrifle/carbine)
|
||||
|
||||
|
||||
@@ -171,7 +171,7 @@
|
||||
|
||||
/datum/supply_pack/service/replacementdb
|
||||
name = "Replacement Defensive Bar Shotgun"
|
||||
desc = "Someone stole the Bartender's twin-barreled possession? Give them another one at a significant markup. Comes with one unused double-barrel shotgun, shells not included. Requires bartender access to open."
|
||||
desc = "Someone stole the Bartender's twin-barreled possession? Give them another one at a significant markup. Comes with one unused double-barrel shotgun, additional shells not included. Requires bartender access to open."
|
||||
cost = 2200
|
||||
access = ACCESS_BAR
|
||||
contraband = TRUE
|
||||
|
||||
@@ -148,11 +148,11 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
//Job preferences 2.0 - indexed by job title , no key or value implies never
|
||||
var/list/job_preferences = list()
|
||||
|
||||
// Want randomjob if preferences already filled - Donkie
|
||||
// Want randomjob if preferences already filled - Donkie
|
||||
var/joblessrole = BERANDOMJOB //defaults to 1 for fewer assistants
|
||||
|
||||
// 0 = character settings, 1 = game preferences
|
||||
var/current_tab = 0
|
||||
var/current_tab = SETTINGS_TAB
|
||||
|
||||
var/unlock_content = 0
|
||||
|
||||
@@ -274,13 +274,13 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
update_preview_icon(current_tab)
|
||||
var/list/dat = list("<center>")
|
||||
|
||||
dat += "<a href='?_src_=prefs;preference=tab;tab=0' [current_tab == 0 ? "class='linkOn'" : ""]>Character Settings</a>"
|
||||
dat += "<a href='?_src_=prefs;preference=tab;tab=2' [current_tab == 2 ? "class='linkOn'" : ""]>Character Appearance</a>"
|
||||
dat += "<a href='?_src_=prefs;preference=tab;tab=3' [current_tab == 3 ? "class='linkOn'" : ""]>Character Speech</a>"
|
||||
dat += "<a href='?_src_=prefs;preference=tab;tab=4' [current_tab == 4 ? "class='linkOn'" : ""]>Loadout</a>"
|
||||
dat += "<a href='?_src_=prefs;preference=tab;tab=1' [current_tab == 1 ? "class='linkOn'" : ""]>Game Preferences</a>"
|
||||
dat += "<a href='?_src_=prefs;preference=tab;tab=5' [current_tab == 5 ? "class='linkOn'" : ""]>Content Preferences</a>"
|
||||
dat += "<a href='?_src_=prefs;preference=tab;tab=6' [current_tab == 6 ? "class='linkOn'" : ""]>Keybindings</a>"
|
||||
dat += "<a href='?_src_=prefs;preference=tab;tab=[SETTINGS_TAB]' [current_tab == SETTINGS_TAB ? "class='linkOn'" : ""]>Character Settings</a>"
|
||||
dat += "<a href='?_src_=prefs;preference=tab;tab=[APPEARANCE_TAB]' [current_tab == APPEARANCE_TAB ? "class='linkOn'" : ""]>Character Appearance</a>"
|
||||
dat += "<a href='?_src_=prefs;preference=tab;tab=[SPEECH_TAB]' [current_tab == SPEECH_TAB ? "class='linkOn'" : ""]>Character Speech</a>"
|
||||
dat += "<a href='?_src_=prefs;preference=tab;tab=[LOADOUT_TAB]' [current_tab == LOADOUT_TAB ? "class='linkOn'" : ""]>Loadout</a>"
|
||||
dat += "<a href='?_src_=prefs;preference=tab;tab=[GAME_PREFERENCES_TAB]' [current_tab == GAME_PREFERENCES_TAB ? "class='linkOn'" : ""]>Game Preferences</a>"
|
||||
dat += "<a href='?_src_=prefs;preference=tab;tab=[CONTENT_PREFERENCES_TAB]' [current_tab == CONTENT_PREFERENCES_TAB ? "class='linkOn'" : ""]>Content Preferences</a>"
|
||||
dat += "<a href='?_src_=prefs;preference=tab;tab=[KEYBINDINGS_TAB]' [current_tab == KEYBINDINGS_TAB ? "class='linkOn'" : ""]>Keybindings</a>"
|
||||
|
||||
if(!path)
|
||||
dat += "<div class='notice'>Please create an account to save your preferences</div>"
|
||||
@@ -290,7 +290,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
dat += "<HR>"
|
||||
|
||||
switch(current_tab)
|
||||
if (0) // Character Settings#
|
||||
if(SETTINGS_TAB) // Character Settings#
|
||||
if(path)
|
||||
var/savefile/S = new /savefile(path)
|
||||
if(S)
|
||||
@@ -366,7 +366,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
dat += "</tr></table>"
|
||||
|
||||
//Character Appearance
|
||||
if(2)
|
||||
if(APPEARANCE_TAB)
|
||||
if(path)
|
||||
var/savefile/S = new /savefile(path)
|
||||
if(S)
|
||||
@@ -670,7 +670,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
dat += "</td>"
|
||||
dat += "</tr></table>"
|
||||
|
||||
if(3)
|
||||
if(SPEECH_TAB)
|
||||
if(path)
|
||||
var/savefile/S = new /savefile(path)
|
||||
if(S)
|
||||
@@ -700,7 +700,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
dat += "</td>"
|
||||
dat += "</tr></table>"
|
||||
|
||||
if (1) // Game Preferences
|
||||
if(GAME_PREFERENCES_TAB) // Game Preferences
|
||||
dat += "<table><tr><td width='340px' height='300px' valign='top'>"
|
||||
dat += "<h2>General Settings</h2>"
|
||||
dat += "<b>UI Style:</b> <a href='?_src_=prefs;task=input;preference=ui'>[UI_style]</a><br>"
|
||||
@@ -871,7 +871,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
|
||||
dat += "<br>"
|
||||
|
||||
if(4)
|
||||
if(LOADOUT_TAB)
|
||||
//calculate your gear points from the chosen item
|
||||
gear_points = CONFIG_GET(number/initial_gear_points)
|
||||
var/list/chosen_gear = loadout_data["SAVE_[loadout_slot]"]
|
||||
@@ -990,7 +990,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
dat += "</td><td><font size=2><i>[loadout_item ? (loadout_item[LOADOUT_CUSTOM_DESCRIPTION] ? loadout_item[LOADOUT_CUSTOM_DESCRIPTION] : gear.description) : gear.description] Progress: [min(progress_made, unlockable.progress_required)]/[unlockable.progress_required]</i></font></td></tr>"
|
||||
|
||||
dat += "</table>"
|
||||
if(5) // Content preferences
|
||||
if(CONTENT_PREFERENCES_TAB) // Content preferences
|
||||
dat += "<table><tr><td width='340px' height='300px' valign='top'>"
|
||||
dat += "<h2>Fetish content prefs</h2>"
|
||||
dat += "<b>Arousal:</b><a href='?_src_=prefs;preference=arousable'>[arousable == TRUE ? "Enabled" : "Disabled"]</a><BR>"
|
||||
@@ -1014,7 +1014,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
dat += "<b>Automatic Wagging:</b> <a href='?_src_=prefs;preference=auto_wag'>[(cit_toggles & NO_AUTO_WAG) ? "Disabled" : "Enabled"]</a><br>"
|
||||
dat += "</tr></table>"
|
||||
dat += "<br>"
|
||||
if(6) // Custom keybindings
|
||||
if(KEYBINDINGS_TAB) // Custom keybindings
|
||||
dat += "<b>Keybindings:</b> <a href='?_src_=prefs;preference=hotkeys'>[(hotkeys) ? "Hotkeys" : "Input"]</a><br>"
|
||||
dat += "Keybindings mode controls how the game behaves with tab and map/input focus.<br>If it is on <b>Hotkeys</b>, the game will always attempt to force you to map focus, meaning keypresses are sent \
|
||||
directly to the map instead of the input. You will still be able to use the command bar, but you need to tab to do it every time you click on the game map.<br>\
|
||||
@@ -2721,7 +2721,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
save_character()
|
||||
|
||||
if("tab")
|
||||
if (href_list["tab"])
|
||||
if(href_list["tab"])
|
||||
current_tab = text2num(href_list["tab"])
|
||||
if(href_list["preference"] == "gear")
|
||||
if(href_list["clear_loadout"])
|
||||
|
||||
@@ -277,7 +277,7 @@ CHAMELEON_CLOTHING_DEFINE(/obj/item/clothing/under/chameleon)
|
||||
item_state = "bl_suit"
|
||||
desc = "It's a plain jumpsuit. It has a small dial on the wrist."
|
||||
sensor_mode = SENSOR_OFF //Hey who's this guy on the Syndicate Shuttle??
|
||||
random_sensor = FALSE
|
||||
sensor_flags = NONE
|
||||
resistance_flags = NONE
|
||||
can_adjust = FALSE
|
||||
armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
|
||||
|
||||
@@ -233,7 +233,7 @@
|
||||
/obj/item/clothing/examine(mob/user)
|
||||
. = ..()
|
||||
if(damaged_clothes == CLOTHING_SHREDDED)
|
||||
. += "<span class='warning'><b>It is completely shredded and requires mending before it can be worn again!</b></span>"
|
||||
. += "<span class='warning'><b>It is completely shredded and requires mending!</b></span>"
|
||||
return
|
||||
for(var/zone in damage_by_parts)
|
||||
var/pct_damage_part = damage_by_parts[zone] / limb_integrity * 100
|
||||
@@ -437,12 +437,10 @@ BLIND // can't see anything
|
||||
damaged_clothes = CLOTHING_SHREDDED
|
||||
body_parts_covered = NONE
|
||||
name = "shredded [initial(name)]"
|
||||
slot_flags = NONE
|
||||
update_clothes_damaged_state()
|
||||
update_clothes_damaged_state(CLOTHING_SHREDDED)
|
||||
if(ismob(loc))
|
||||
var/mob/M = loc
|
||||
M.visible_message("<span class='danger'>[M]'s [src.name] falls off, completely shredded!</span>", "<span class='warning'><b>Your [src.name] falls off, completely shredded!</b></span>", vision_distance = COMBAT_MESSAGE_RANGE)
|
||||
M.dropItemToGround(src)
|
||||
M.visible_message("<span class='danger'>[M]'s [src.name] is completely shredded!</span>", "<span class='userdanger'>Your [src.name] is completely shredded!</span>", vision_distance = COMBAT_MESSAGE_RANGE)
|
||||
else
|
||||
..()
|
||||
|
||||
|
||||
@@ -78,10 +78,40 @@
|
||||
speech_args[SPEECH_MESSAGE] = trim(message)
|
||||
|
||||
/obj/item/clothing/mask/joy
|
||||
name = "joy mask"
|
||||
desc = "Express your happiness or hide your sorrows with this laughing face with crying tears of joy cutout."
|
||||
name = "Emotional Mask"
|
||||
desc = "Express your happiness or hide your sorrows with this modular cutout."
|
||||
icon_state = "joy"
|
||||
clothing_flags = ALLOWINTERNALS
|
||||
mutantrace_variation = STYLE_MUZZLE
|
||||
actions_types = list(/datum/action/item_action/adjust)
|
||||
var/static/list/joymask_designs = list()
|
||||
|
||||
|
||||
/obj/item/clothing/mask/joy/Initialize(mapload)
|
||||
. = ..()
|
||||
joymask_designs = list(
|
||||
"Joy" = image(icon = src.icon, icon_state = "joy"),
|
||||
"Flushed" = image(icon = src.icon, icon_state = "flushed"),
|
||||
"Pensive" = image(icon = src.icon, icon_state = "pensive"),
|
||||
"Angry" = image(icon = src.icon, icon_state = "angry"),
|
||||
)
|
||||
|
||||
/obj/item/clothing/mask/joy/ui_action_click(mob/user)
|
||||
if(!istype(user) || user.incapacitated())
|
||||
return
|
||||
|
||||
var/static/list/options = list("Joy" = "joy", "Flushed" = "flushed", "Pensive" = "pensive","Angry" ="angry")
|
||||
|
||||
var/choice = show_radial_menu(user, src, joymask_designs, custom_check = FALSE, radius = 36, require_near = TRUE)
|
||||
|
||||
if(src && choice && !user.incapacitated() && in_range(user,src))
|
||||
icon_state = options[choice]
|
||||
user.update_inv_wear_mask()
|
||||
for(var/X in actions)
|
||||
var/datum/action/A = X
|
||||
A.UpdateButtonIcon()
|
||||
to_chat(user, "<span class='notice'>Your Joy mask now has a [choice] Emotion!</span>")
|
||||
return 1
|
||||
|
||||
/obj/item/clothing/mask/pig
|
||||
name = "pig mask"
|
||||
|
||||
@@ -7,11 +7,14 @@
|
||||
slot_flags = ITEM_SLOT_ICLOTHING
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0, "wound" = 5)
|
||||
mutantrace_variation = STYLE_DIGITIGRADE|USE_TAUR_CLIP_MASK
|
||||
limb_integrity = 30
|
||||
limb_integrity = 120
|
||||
var/fitted = FEMALE_UNIFORM_FULL // For use in alternate clothing styles for women
|
||||
var/has_sensor = HAS_SENSORS // For the crew computer
|
||||
var/random_sensor = TRUE
|
||||
var/sensor_flags = SENSOR_RANDOM
|
||||
var/sensor_mode = NO_SENSORS
|
||||
var/sensor_mode_intended = NO_SENSORS //if sensors become damaged and are repaired later, it will revert to the user's intended preferences
|
||||
var/sensormaxintegrity = 200 //if this is zero, then our sensors can only be destroyed by shredded clothing
|
||||
var/sensordamage = 0 //how much damage did our sensors take?
|
||||
var/can_adjust = TRUE
|
||||
var/adjusted = NORMAL_STYLE
|
||||
var/alt_covers_chest = FALSE // for adjusted/rolled-down jumpsuits, FALSE = exposes chest and arms, TRUE = exposes arms only
|
||||
@@ -31,30 +34,76 @@
|
||||
. += accessory_overlay
|
||||
|
||||
/obj/item/clothing/under/attackby(obj/item/I, mob/user, params)
|
||||
if((has_sensor == BROKEN_SENSORS) && istype(I, /obj/item/stack/cable_coil))
|
||||
if(damaged_clothes)
|
||||
to_chat(user,"<span class='warning'>You should repair the damage done to [src] first.</span>")
|
||||
if((sensordamage || (has_sensor < HAS_SENSORS && has_sensor != NO_SENSORS)) && istype(I, /obj/item/stack/cable_coil))
|
||||
if(damaged_clothes == CLOTHING_SHREDDED)
|
||||
to_chat(user,"<span class='warning'>[src] is too damaged to have its suit sensors repaired! Repair it first.</span>")
|
||||
return 0
|
||||
var/obj/item/stack/cable_coil/C = I
|
||||
I.use_tool(src, user, 0, 1)
|
||||
has_sensor = HAS_SENSORS
|
||||
sensordamage = 0
|
||||
sensor_mode = sensor_mode_intended
|
||||
to_chat(user,"<span class='notice'>You repair the suit sensors on [src] with [C].</span>")
|
||||
return 1
|
||||
|
||||
if(!attach_accessory(I, user))
|
||||
return ..()
|
||||
|
||||
/obj/item/clothing/under/take_damage_zone(def_zone, damage_amount, damage_type, armour_penetration)
|
||||
..()
|
||||
if(sensormaxintegrity == 0 || has_sensor == NO_SENSORS || sensordamage >= sensormaxintegrity) return //sensors are invincible if max integrity is 0
|
||||
var/damage_dealt = take_damage(damage_amount * 0.1, damage_type, armour_penetration, FALSE) * 10 // only deal 10% of the damage to the general integrity damage, then multiply it by 10 so we know how much to deal to limb
|
||||
sensordamage += damage_dealt
|
||||
var/integ = has_sensor
|
||||
var/newinteg = sensorintegrity()
|
||||
if(newinteg != integ)
|
||||
if(newinteg < integ && iscarbon(src.loc)) //the first check is to see if for some inexplicable reason the attack healed our suit sensors
|
||||
var/mob/living/carbon/C = src.loc
|
||||
switch(newinteg)
|
||||
if(DAMAGED_SENSORS_VITALS)
|
||||
to_chat(C,"<span class='warning'>Your tracking beacon on your suit sensors have shorted out!</span>")
|
||||
if(DAMAGED_SENSORS_LIVING)
|
||||
to_chat(C,"<span class='warning'>Your vital tracker on your suit sensors have shorted out!</span>")
|
||||
if(BROKEN_SENSORS)
|
||||
to_chat(C,"<span class='userdanger'>Your suit sensors have shorted out completely!</span>")
|
||||
updatesensorintegrity(newinteg)
|
||||
|
||||
|
||||
/obj/item/clothing/under/proc/sensorintegrity()
|
||||
var/percentage = sensordamage/sensormaxintegrity //calculate the percentage of how much damage taken
|
||||
if(percentage < SENSOR_INTEGRITY_COORDS) return HAS_SENSORS
|
||||
else if(percentage < SENSOR_INTEGRITY_VITALS) return DAMAGED_SENSORS_VITALS
|
||||
else if(percentage < SENSOR_INTEGRITY_BINARY) return DAMAGED_SENSORS_LIVING
|
||||
else return BROKEN_SENSORS
|
||||
|
||||
/obj/item/clothing/under/proc/updatesensorintegrity(integ = HAS_SENSORS)
|
||||
if(sensormaxintegrity == 0 || has_sensor == NO_SENSORS) return //sanity check
|
||||
has_sensor = integ
|
||||
switch(has_sensor)
|
||||
if(HAS_SENSORS)
|
||||
sensor_mode = sensor_mode_intended
|
||||
if(DAMAGED_SENSORS_VITALS)
|
||||
if(sensor_mode > SENSOR_VITALS) sensor_mode = SENSOR_VITALS
|
||||
if(DAMAGED_SENSORS_LIVING)
|
||||
if(sensor_mode > SENSOR_LIVING) sensor_mode = SENSOR_LIVING
|
||||
if(BROKEN_SENSORS)
|
||||
sensor_mode = NO_SENSORS
|
||||
|
||||
|
||||
/obj/item/clothing/under/update_clothes_damaged_state()
|
||||
..()
|
||||
if(ismob(loc))
|
||||
var/mob/M = loc
|
||||
M.update_inv_w_uniform()
|
||||
if(has_sensor > NO_SENSORS)
|
||||
if(has_sensor > NO_SENSORS && damaged_clothes == CLOTHING_SHREDDED)
|
||||
has_sensor = BROKEN_SENSORS
|
||||
sensordamage = sensormaxintegrity
|
||||
|
||||
/obj/item/clothing/under/New()
|
||||
if(random_sensor)
|
||||
if(sensor_flags & SENSOR_RANDOM)
|
||||
//make the sensor mode favor higher levels, except coords.
|
||||
sensor_mode = pick(SENSOR_OFF, SENSOR_LIVING, SENSOR_LIVING, SENSOR_VITALS, SENSOR_VITALS, SENSOR_VITALS, SENSOR_COORDS, SENSOR_COORDS)
|
||||
sensor_mode_intended = sensor_mode
|
||||
..()
|
||||
|
||||
/obj/item/clothing/under/equipped(mob/user, slot)
|
||||
@@ -143,9 +192,14 @@
|
||||
. += "Alt-click on [src] to wear it normally."
|
||||
else
|
||||
. += "Alt-click on [src] to wear it casually."
|
||||
if (has_sensor == BROKEN_SENSORS)
|
||||
. += "Its sensors appear to be shorted out."
|
||||
else if(has_sensor > NO_SENSORS)
|
||||
switch(has_sensor)
|
||||
if(BROKEN_SENSORS)
|
||||
. += "<span class='warning'>Its sensors appear to be shorted out completely. It can be repaired using cable.</span>"
|
||||
if(DAMAGED_SENSORS_LIVING)
|
||||
. += "<span class='warning'>Its sensors appear to have its tracking beacon and vital tracker broken. It can be repaired using cable.</span>"
|
||||
if(DAMAGED_SENSORS_VITALS)
|
||||
. += "<span class='warning'>Its sensors appear to have its tracking beacon broken. It can be repaired using cable.</span>"
|
||||
if(has_sensor > NO_SENSORS)
|
||||
switch(sensor_mode)
|
||||
if(SENSOR_OFF)
|
||||
. += "Its sensors appear to be disabled."
|
||||
@@ -167,12 +221,12 @@
|
||||
return
|
||||
if (!can_use(M))
|
||||
return
|
||||
if(src.has_sensor == LOCKED_SENSORS)
|
||||
to_chat(usr, "The controls are locked.")
|
||||
return 0
|
||||
if(src.has_sensor == BROKEN_SENSORS)
|
||||
to_chat(usr, "The sensors have shorted out!")
|
||||
return 0
|
||||
if(src.sensor_flags & SENSOR_LOCKED)
|
||||
to_chat(usr, "The controls are locked.")
|
||||
return 0
|
||||
if(src.has_sensor <= NO_SENSORS)
|
||||
to_chat(usr, "This suit does not have any sensors.")
|
||||
return 0
|
||||
@@ -182,18 +236,34 @@
|
||||
if(get_dist(usr, src) > 1)
|
||||
to_chat(usr, "<span class='warning'>You have moved too far away!</span>")
|
||||
return
|
||||
sensor_mode = modes.Find(switchMode) - 1
|
||||
sensor_mode_intended = modes.Find(switchMode) - 1
|
||||
|
||||
if (src.loc == usr)
|
||||
switch(sensor_mode)
|
||||
switch(sensor_mode_intended)
|
||||
if(0)
|
||||
to_chat(usr, "<span class='notice'>You disable your suit's remote sensing equipment.</span>")
|
||||
sensor_mode = sensor_mode_intended
|
||||
if(1)
|
||||
to_chat(usr, "<span class='notice'>Your suit will now only report whether you are alive or dead.</span>")
|
||||
sensor_mode = sensor_mode_intended
|
||||
if(2)
|
||||
to_chat(usr, "<span class='notice'>Your suit will now only report your exact vital lifesigns.</span>")
|
||||
if(src.has_sensor == DAMAGED_SENSORS_LIVING)
|
||||
to_chat(usr, "<span class='warning'>Your suit's vital tracker is broken, so it will only report whether you are alive or dead.</span>")
|
||||
sensor_mode = SENSOR_LIVING
|
||||
else
|
||||
to_chat(usr, "<span class='notice'>Your suit will now only report your exact vital lifesigns.</span>")
|
||||
sensor_mode = sensor_mode_intended
|
||||
if(3)
|
||||
to_chat(usr, "<span class='notice'>Your suit will now report your exact vital lifesigns as well as your coordinate position.</span>")
|
||||
switch(src.has_sensor)
|
||||
if(DAMAGED_SENSORS_LIVING)
|
||||
to_chat(usr, "<span class='warning'>Your suit's tracking beacon and vital tracker is broken, so it will only report whether you are alive or dead.</span>")
|
||||
sensor_mode = SENSOR_LIVING
|
||||
if(DAMAGED_SENSORS_VITALS)
|
||||
to_chat(usr, "<span class='warning'>Your suit's tracking beacon is broken, so it will only report your vital lifesigns.</span>")
|
||||
sensor_mode = SENSOR_VITALS
|
||||
if(HAS_SENSORS)
|
||||
to_chat(usr, "<span class='notice'>Your suit will now report your exact vital lifesigns as well as your coordinate position.</span>")
|
||||
sensor_mode = sensor_mode_intended
|
||||
|
||||
if(ishuman(loc))
|
||||
var/mob/living/carbon/human/H = loc
|
||||
@@ -210,19 +280,28 @@
|
||||
if(!isliving(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
|
||||
return
|
||||
|
||||
if(has_sensor == LOCKED_SENSORS)
|
||||
to_chat(user, "The controls are locked.")
|
||||
return
|
||||
if(has_sensor == BROKEN_SENSORS)
|
||||
to_chat(user, "The sensors have shorted out!")
|
||||
return
|
||||
if(src.has_sensor == BROKEN_SENSORS)
|
||||
to_chat(usr, "The sensors have shorted out!")
|
||||
return 0
|
||||
if(src.sensor_flags & SENSOR_LOCKED)
|
||||
to_chat(usr, "The controls are locked.")
|
||||
return 0
|
||||
if(has_sensor <= NO_SENSORS)
|
||||
to_chat(user, "This suit does not have any sensors.")
|
||||
return
|
||||
|
||||
sensor_mode = SENSOR_COORDS
|
||||
sensor_mode_intended = SENSOR_COORDS
|
||||
|
||||
to_chat(user, "<span class='notice'>Your suit will now report your exact vital lifesigns as well as your coordinate position.</span>")
|
||||
switch(src.has_sensor)
|
||||
if(DAMAGED_SENSORS_LIVING)
|
||||
to_chat(usr, "<span class='warning'>Your suit's tracking beacon and vital tracker is broken, so it will only report whether you are alive or dead.</span>")
|
||||
sensor_mode = SENSOR_LIVING
|
||||
if(DAMAGED_SENSORS_VITALS)
|
||||
to_chat(usr, "<span class='warning'>Your suit's tracking beacon is broken, so it will only report your vital lifesigns.</span>")
|
||||
sensor_mode = SENSOR_VITALS
|
||||
if(HAS_SENSORS)
|
||||
to_chat(usr, "<span class='notice'>Your suit will now report your exact vital lifesigns as well as your coordinate position.</span>")
|
||||
sensor_mode = sensor_mode_intended
|
||||
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
|
||||
@@ -59,7 +59,7 @@
|
||||
item_state = "captain_envirosuit"
|
||||
armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 95, "acid" = 95, "wound" = 15)
|
||||
sensor_mode = SENSOR_COORDS
|
||||
random_sensor = FALSE
|
||||
sensor_flags = NONE
|
||||
|
||||
/obj/item/clothing/under/plasmaman/mime
|
||||
name = "mime envirosuit"
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
item_state = "security_envirosuit"
|
||||
armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 95, "acid" = 95, "wound" = 10)
|
||||
sensor_mode = SENSOR_COORDS
|
||||
random_sensor = FALSE
|
||||
sensor_flags = NONE
|
||||
|
||||
/obj/item/clothing/under/plasmaman/security/warden
|
||||
name = "warden plasma envirosuit"
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
item_state = "b_suit"
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0, "wound" = 15)
|
||||
sensor_mode = SENSOR_COORDS
|
||||
random_sensor = FALSE
|
||||
sensor_flags = NONE
|
||||
|
||||
/obj/item/clothing/under/rank/captain/util
|
||||
name = "command utility uniform"
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
strip_delay = 50
|
||||
alt_covers_chest = TRUE
|
||||
sensor_mode = SENSOR_COORDS
|
||||
random_sensor = FALSE
|
||||
sensor_flags = NONE
|
||||
|
||||
/obj/item/clothing/under/rank/security/officer
|
||||
name = "security jumpsuit"
|
||||
|
||||
@@ -23,16 +23,15 @@
|
||||
name = "prison jumpsuit"
|
||||
desc = "It's standardised Nanotrasen prisoner-wear. Its suit sensors are stuck in the \"Fully On\" position."
|
||||
icon_state = "prisoner"
|
||||
item_state = "o_suit"
|
||||
has_sensor = LOCKED_SENSORS
|
||||
item_state = "prisoner"
|
||||
sensor_mode = SENSOR_COORDS
|
||||
random_sensor = FALSE
|
||||
sensor_flags = SENSOR_LOCKED
|
||||
|
||||
/obj/item/clothing/under/rank/prisoner/skirt
|
||||
name = "prison jumpskirt"
|
||||
desc = "It's standardised Nanotrasen prisoner-wear. Its suit sensors are stuck in the \"Fully On\" position."
|
||||
icon_state = "prisoner_skirt"
|
||||
item_state = "o_suit"
|
||||
item_state = "prisoner_skirt"
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
can_adjust = FALSE
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
@@ -166,6 +165,7 @@
|
||||
/obj/item/clothing/under/misc/gear_harness
|
||||
name = "gear harness"
|
||||
desc = "A simple, inconspicuous harness replacement for a jumpsuit."
|
||||
limb_integrity = 180
|
||||
icon_state = "gear_harness"
|
||||
item_state = "gear_harness"
|
||||
can_adjust = TRUE
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
supernova.power_mod = 0
|
||||
|
||||
/datum/round_event/supernova/announce()
|
||||
var/message = "Our tachyon-doppler array has detected a supernova in your vicinity. Peak flux from the supernova estimated to be [round(power,0.1)] times current solar flux. [power > 4 ? "Short burts of radiation may be possible, so please prepare accordingly." : ""]"
|
||||
var/message = "Our tachyon-doppler array has detected a supernova in your vicinity. Peak flux from the supernova estimated to be [round(power,0.1)] times current solar flux. [power > 1 ? "Short burts of radiation may be possible, so please prepare accordingly." : ""]"
|
||||
if(prob(power * 25))
|
||||
priority_announce(message)
|
||||
else
|
||||
@@ -47,12 +47,11 @@
|
||||
|
||||
/datum/round_event/supernova/tick()
|
||||
var/midpoint = round((endWhen-startWhen)/2)
|
||||
switch(activeFor)
|
||||
if(startWhen to midpoint)
|
||||
supernova.power_mod = min(supernova.power_mod*1.2, power)
|
||||
if(endWhen-10 to endWhen)
|
||||
supernova.power_mod /= 4
|
||||
if(prob(round(supernova.power_mod / 2)) && storm_count < 4 && !SSweather.get_weather_by_type(/datum/weather/rad_storm))
|
||||
if(activeFor < midpoint)
|
||||
supernova.power_mod = min(supernova.power_mod*1.2, power)
|
||||
if(activeFor > endWhen-10)
|
||||
supernova.power_mod /= 4
|
||||
if(prob(round(supernova.power_mod)) && prob(5) && storm_count < 5 && !SSweather.get_weather_by_type(/datum/weather/rad_storm))
|
||||
SSweather.run_weather(/datum/weather/rad_storm/supernova)
|
||||
storm_count++
|
||||
|
||||
@@ -63,5 +62,7 @@
|
||||
/datum/weather/rad_storm/supernova
|
||||
weather_duration_lower = 50
|
||||
weather_duration_upper = 100
|
||||
telegraph_duration = 100
|
||||
radiation_intensity = 50
|
||||
telegraph_duration = 200
|
||||
radiation_intensity = 1000
|
||||
weather_sound = null
|
||||
telegraph_message = "<span class='userdanger'>The air begins to grow very warm!</span>"
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
desc = "It's watching you suspiciously."
|
||||
|
||||
/obj/structure/closet/crate/necropolis/tendril/magic/PopulateContents()
|
||||
var/loot = rand(1,10)
|
||||
var/loot = rand(1,9)
|
||||
switch(loot)
|
||||
if(1)
|
||||
new /obj/item/soulstone/anybody(src)
|
||||
@@ -57,10 +57,6 @@
|
||||
new /obj/item/immortality_talisman(src)
|
||||
if(9)
|
||||
new /obj/item/gun/magic/wand/book/healing(src)
|
||||
if(10)
|
||||
new /obj/item/reagent_containers/glass/bottle/ichor/red(src)
|
||||
new /obj/item/reagent_containers/glass/bottle/ichor/blue(src)
|
||||
new /obj/item/reagent_containers/glass/bottle/ichor/green(src)
|
||||
|
||||
/obj/structure/closet/crate/necropolis/tendril/weapon_armor/PopulateContents()
|
||||
var/loot = rand(1,11)
|
||||
@@ -132,7 +128,7 @@
|
||||
new /obj/item/disk/design_disk/modkit_disc/rapid_repeater(src)
|
||||
|
||||
/obj/structure/closet/crate/necropolis/tendril/all/PopulateContents()
|
||||
var/loot = rand(1,29)
|
||||
var/loot = rand(1,28)
|
||||
switch(loot)
|
||||
if(1)
|
||||
new /obj/item/shared_storage/red(src)
|
||||
@@ -196,10 +192,6 @@
|
||||
new /obj/item/immortality_talisman(src)
|
||||
if(28)
|
||||
new /obj/item/gun/magic/wand/book/healing(src)
|
||||
if(29)
|
||||
new /obj/item/reagent_containers/glass/bottle/ichor/red(src)
|
||||
new /obj/item/reagent_containers/glass/bottle/ichor/blue(src)
|
||||
new /obj/item/reagent_containers/glass/bottle/ichor/green(src)
|
||||
|
||||
//KA modkit design discs
|
||||
/obj/item/disk/design_disk/modkit_disc
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
age = rand(AGE_MIN,AGE_MAX)
|
||||
|
||||
/datum/preferences/proc/update_preview_icon(current_tab)
|
||||
var/equip_job = (current_tab != 2)
|
||||
var/equip_job = (current_tab != APPEARANCE_TAB)
|
||||
// Determine what job is marked as 'High' priority, and dress them up as such.
|
||||
var/datum/job/previewJob = get_highest_job()
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
mannequin.add_overlay(mutable_appearance('modular_citadel/icons/ui/backgrounds.dmi', bgstate, layer = SPACE_LAYER))
|
||||
copy_to(mannequin, initial_spawn = TRUE)
|
||||
|
||||
if(current_tab == 3)
|
||||
if(current_tab == LOADOUT_TAB)
|
||||
//give it its loadout if not on the appearance tab
|
||||
SSjob.equip_loadout(parent.mob, mannequin, FALSE, bypass_prereqs = TRUE, can_drop = FALSE)
|
||||
else
|
||||
|
||||
@@ -514,6 +514,20 @@
|
||||
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
|
||||
matrixed_sections = MATRIX_RED_GREEN
|
||||
|
||||
/datum/sprite_accessory/tails/human/triple_kitsune
|
||||
name = "Triple Kitsune Tails"
|
||||
icon_state = "3sune"
|
||||
color_src = MATRIXED
|
||||
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
|
||||
matrixed_sections = MATRIX_RED_GREEN
|
||||
|
||||
/datum/sprite_accessory/tails_animated/human/triple_kitsune
|
||||
name = "Triple Kitsune Tails"
|
||||
icon_state = "3sune"
|
||||
color_src = MATRIXED
|
||||
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
|
||||
matrixed_sections = MATRIX_RED_GREEN
|
||||
|
||||
/datum/sprite_accessory/tails/human/tentacle
|
||||
name = "Tentacle"
|
||||
icon_state = "tentacle"
|
||||
@@ -965,6 +979,16 @@
|
||||
icon_state = "9sune"
|
||||
matrixed_sections = MATRIX_RED_GREEN
|
||||
|
||||
/datum/sprite_accessory/tails/mam_tails/triple_kitsune
|
||||
name = "Triple Kitsune Tails"
|
||||
icon_state = "3sune"
|
||||
matrixed_sections = MATRIX_RED_GREEN
|
||||
|
||||
/datum/sprite_accessory/tails_animated/mam_tails_animated/triple_kitsune
|
||||
name = "Triple Kitsune Tails"
|
||||
icon_state = "3sune"
|
||||
matrixed_sections = MATRIX_RED_GREEN
|
||||
|
||||
/datum/sprite_accessory/tails/mam_tails/tentacle
|
||||
name = "Tentacle"
|
||||
icon_state = "tentacle"
|
||||
|
||||
@@ -87,7 +87,7 @@
|
||||
addtimer(CALLBACK(src, .proc/med_hud_set_status), (DEFIB_TIME_LIMIT * 10) + 1)
|
||||
stop_pulling()
|
||||
|
||||
var/signal = SEND_SIGNAL(src, COMSIG_MOB_DEATH, gibbed)
|
||||
var/signal = SEND_SIGNAL(src, COMSIG_MOB_DEATH, gibbed) | SEND_GLOBAL_SIGNAL(COMSIG_GLOB_MOB_DEATH, src, gibbed)
|
||||
|
||||
var/turf/T = get_turf(src)
|
||||
if(mind && mind.name && mind.active && !istype(T.loc, /area/ctf) && !(signal & COMPONENT_BLOCK_DEATH_BROADCAST))
|
||||
|
||||
@@ -55,3 +55,9 @@
|
||||
name = "triple-barrel shotgun internal magazine"
|
||||
ammo_type = /obj/item/ammo_casing/shotgun/incapacitate
|
||||
max_ammo = 3
|
||||
|
||||
/obj/item/ammo_box/magazine/internal/shot/levergun
|
||||
name = "levergun internal magazine"
|
||||
ammo_type = /obj/item/ammo_casing/c38 // they're rubber by default, i guess
|
||||
caliber = "38"
|
||||
max_ammo = 7
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
var/obj/item/ammo_box/magazine/magazine
|
||||
var/casing_ejector = TRUE //whether the gun ejects the chambered casing
|
||||
var/magazine_wording = "magazine"
|
||||
var/sawn_item_state = "gun"
|
||||
|
||||
/obj/item/gun/ballistic/Initialize()
|
||||
. = ..()
|
||||
@@ -198,13 +199,17 @@
|
||||
name = "sawn-off [src.name]"
|
||||
desc = sawn_desc
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
item_state = "gun"
|
||||
item_state = sawn_item_state
|
||||
slot_flags &= ~ITEM_SLOT_BACK //you can't sling it on your back
|
||||
slot_flags |= ITEM_SLOT_BELT //but you can wear it on your belt (poorly concealed under a trenchcoat, ideally)
|
||||
sawn_off = TRUE
|
||||
update_icon()
|
||||
return 1
|
||||
|
||||
/// is something supposed to happen here?
|
||||
/obj/item/gun/ballistic/proc/on_sawoff(mob/user)
|
||||
return
|
||||
|
||||
// Sawing guns related proc
|
||||
/obj/item/gun/ballistic/proc/blow_up(mob/user)
|
||||
. = 0
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
casing_ejector = FALSE
|
||||
var/recentpump = 0 // to prevent spammage
|
||||
weapon_weight = WEAPON_HEAVY
|
||||
sawn_item_state = "sawnshotgun"
|
||||
|
||||
/obj/item/gun/ballistic/shotgun/attackby(obj/item/A, mob/user, params)
|
||||
. = ..()
|
||||
@@ -335,3 +336,34 @@
|
||||
//our hook gun!
|
||||
var/obj/item/gun/magic/hook/bounty/hook
|
||||
var/toggled = FALSE
|
||||
|
||||
// hey you kids like
|
||||
// LEVER GUNS?
|
||||
|
||||
/obj/item/gun/ballistic/shotgun/leveraction
|
||||
name = "lever-action rifle"
|
||||
desc = "While lever-actions have been horribly out of date for hundreds of years now, \
|
||||
the reported potential versatility of .38 Special is worth paying attention to."
|
||||
fire_sound = "sound/weapons/revolvershot.ogg"
|
||||
mag_type = /obj/item/ammo_box/magazine/internal/shot/levergun
|
||||
icon_state = "levercarabine"
|
||||
item_state = "leveraction"
|
||||
sawn_item_state = "maresleg"
|
||||
|
||||
/obj/item/gun/ballistic/shotgun/leveraction/attackby(obj/item/A, mob/user, params)
|
||||
..()
|
||||
if(A.tool_behaviour == TOOL_SAW || istype(A, /obj/item/gun/energy/plasmacutter))
|
||||
sawoff(user)
|
||||
if(istype(A, /obj/item/melee/transforming/energy))
|
||||
var/obj/item/melee/transforming/energy/W = A
|
||||
if(W.active)
|
||||
sawoff(user)
|
||||
|
||||
/obj/item/gun/ballistic/shotgun/leveraction/on_sawoff(mob/user)
|
||||
magazine.max_ammo-- // sawing off drops from 7+1 to 6+1
|
||||
|
||||
/obj/item/gun/ballistic/shotgun/leveraction/update_icon_state()
|
||||
if(current_skin)
|
||||
icon_state = "[unique_reskin[current_skin]][sawn_off ? "-sawn" : ""][chambered ? "" : "-e"]"
|
||||
else
|
||||
icon_state = "[initial(icon_state)][sawn_off ? "-sawn" : ""][chambered ? "" : "-e"]"
|
||||
|
||||
@@ -85,7 +85,7 @@
|
||||
name = "Machine Design (Automatic Hydroponics Tray Board)"
|
||||
desc = "The circuit board for an automatic hydroponics tray. GIVE ME THE PLANT, CAPTAIN."
|
||||
id = "autohydrotray"
|
||||
build_path = /obj/machinery/hydroponics/constructable/automagic
|
||||
build_path = /obj/item/circuitboard/machine/hydroponics/automagic
|
||||
category = list ("Hydroponics Machinery")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_SERVICE | DEPARTMENTAL_FLAG_MEDICAL
|
||||
|
||||
|
||||
@@ -457,23 +457,23 @@
|
||||
category = list("Weapons")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
|
||||
|
||||
/datum/design/laser_shield
|
||||
name = "Laser Resistant Riot Shield"
|
||||
desc = "An advanced riot shield made of darker glasses to prevent laser fire from passing through."
|
||||
/datum/design/energy_shield
|
||||
name = "Energy Resistant Shield"
|
||||
desc = "An ablative shield designed to stop energy-based attacks dead in their tracks, but shatter easily against kinetic blows."
|
||||
id = "laser_shield"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(/datum/material/iron = 4000, /datum/material/glass = 1000, /datum/material/plastic = 4000, /datum/material/silver = 800, /datum/material/titanium = 600, /datum/material/plasma = 5000)
|
||||
build_path = /obj/item/shield/riot/laser_proof
|
||||
build_path = /obj/item/shield/riot/energy_proof
|
||||
category = list("Weapons")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
|
||||
|
||||
/datum/design/bullet_shield
|
||||
name = "Bullet Resistant Riot Shield"
|
||||
desc = "An advanced riot shield made bullet resistant plastics and heavy metals to protect against projectile harm."
|
||||
/datum/design/kinetic_shield
|
||||
name = "Kinetic Resistant Shield"
|
||||
desc = "An advanced polymer shield designed to stop kinetic-based attacks with ease, but splinter apart against energy-based attacks."
|
||||
id = "bullet_shield"
|
||||
build_type = PROTOLATHE
|
||||
materials = list(/datum/material/iron = 4000, /datum/material/glass = 1000, /datum/material/silver = 2000, /datum/material/titanium = 1200, /datum/material/plastic = 2500)
|
||||
build_path = /obj/item/shield/riot/bullet_proof
|
||||
build_path = /obj/item/shield/riot/kinetic_proof
|
||||
category = list("Weapons")
|
||||
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
|
||||
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
custom_materials = list(/datum/material/iron=12000)
|
||||
|
||||
/obj/item/ingot/diamond
|
||||
custom_materials = list(/datum/material/diamond=12000) //yeah ok
|
||||
custom_materials = list(/datum/material/diamond=12000)
|
||||
|
||||
/obj/item/ingot/uranium
|
||||
custom_materials = list(/datum/material/uranium=12000)
|
||||
|
||||
@@ -93,12 +93,14 @@
|
||||
active_phylacteries++
|
||||
GLOB.poi_list |= src
|
||||
START_PROCESSING(SSobj, src)
|
||||
RegisterSignal(SSactivity, COMSIG_THREAT_CALC, .proc/get_threat)
|
||||
set_light(lon_range)
|
||||
if(initial(SSticker.mode.round_ends_with_antag_death))
|
||||
SSticker.mode.round_ends_with_antag_death = FALSE
|
||||
|
||||
/obj/item/phylactery/Destroy(force=FALSE)
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
UnregisterSignal(SSactivity, COMSIG_THREAT_CALC)
|
||||
active_phylacteries--
|
||||
GLOB.poi_list -= src
|
||||
if(!active_phylacteries)
|
||||
@@ -113,6 +115,12 @@
|
||||
if(!mind.current || (mind.current && mind.current.stat == DEAD))
|
||||
addtimer(CALLBACK(src, .proc/rise), respawn_time, TIMER_UNIQUE)
|
||||
|
||||
/obj/item/phylactery/proc/get_threat(list/threat_list)
|
||||
if(mind?.current?.stat == DEAD)
|
||||
if(!("phylactery" in threat_list))
|
||||
threat_list["phylactery"] = 0
|
||||
threat_list["phylactery"] += 25
|
||||
|
||||
/obj/item/phylactery/proc/rise()
|
||||
if(mind.current && mind.current.stat != DEAD)
|
||||
return "[mind] already has a living body: [mind.current]"
|
||||
|
||||
@@ -99,6 +99,9 @@
|
||||
var/generic_bleedstacks
|
||||
/// If we have a gauze wrapping currently applied (not including splints)
|
||||
var/obj/item/stack/current_gauze
|
||||
/// does this limb have replacement capability, despite probably not being robotic?
|
||||
// see code\modules\surgery\limb_augmentation.dm, or code\game\machinery\limbgrower.dm
|
||||
var/forcereplace = FALSE
|
||||
|
||||
/obj/item/bodypart/examine(mob/user)
|
||||
. = ..()
|
||||
@@ -240,7 +243,13 @@
|
||||
wounding_dmg *= (easy_dismember ? 1 : 0.75)
|
||||
if((mangled_state & BODYPART_MANGLED_BONE) && try_dismember(wounding_type, wounding_dmg, wound_bonus, bare_wound_bonus))
|
||||
return
|
||||
// note that there's no handling for BIO_JUST_FLESH since we don't have any that are that right now (slimepeople maybe someday)
|
||||
// if we're flesh only, all blunt attacks become weakened slashes in terms of wound damage
|
||||
if(BIO_JUST_FLESH)
|
||||
if(wounding_type == WOUND_BLUNT)
|
||||
wounding_type = WOUND_SLASH
|
||||
wounding_dmg *= (easy_dismember ? 1 : 0.3)
|
||||
if((mangled_state & BODYPART_MANGLED_FLESH) && try_dismember(wounding_type, wounding_dmg, wound_bonus, bare_wound_bonus))
|
||||
return
|
||||
// standard humanoids
|
||||
if(BIO_FLESH_BONE)
|
||||
// if we've already mangled the skin (critical slash or piercing wound), then the bone is exposed, and we can damage it with sharp weapons at a reduced rate
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
if(istype(tool, /obj/item/organ_storage) && istype(tool.contents[1], /obj/item/bodypart))
|
||||
tool = tool.contents[1]
|
||||
var/obj/item/bodypart/aug = tool
|
||||
if(!aug.is_robotic_limb())
|
||||
if(!aug.is_robotic_limb() && !aug.forcereplace) // forcereplace used here to allow for replacing limbs with synthflesh variants
|
||||
to_chat(user, "<span class='warning'>That's not an augment, silly!</span>")
|
||||
return -1
|
||||
if(aug.body_zone != target_zone)
|
||||
@@ -18,9 +18,14 @@
|
||||
return -1
|
||||
L = surgery.operated_bodypart
|
||||
if(L)
|
||||
display_results(user, target, "<span class ='notice'>You begin to augment [target]'s [parse_zone(user.zone_selected)]...</span>",
|
||||
"[user] begins to augment [target]'s [parse_zone(user.zone_selected)] with [aug].",
|
||||
"[user] begins to augment [target]'s [parse_zone(user.zone_selected)].")
|
||||
if(aug.is_robotic_limb())
|
||||
display_results(user, target, "<span class ='notice'>You begin to augment [target]'s [parse_zone(user.zone_selected)]...</span>",
|
||||
"[user] begins to augment [target]'s [parse_zone(user.zone_selected)] with [aug].",
|
||||
"[user] begins to augment [target]'s [parse_zone(user.zone_selected)].")
|
||||
else
|
||||
display_results(user, target, "<span class ='notice'>You begin to replace [target]'s [parse_zone(user.zone_selected)]...</span>",
|
||||
"[user] begins to replace [target]'s [parse_zone(user.zone_selected)] with [aug].",
|
||||
"[user] begins to replace [target]'s [parse_zone(user.zone_selected)].")
|
||||
else
|
||||
user.visible_message("[user] looks for [target]'s [parse_zone(user.zone_selected)].", "<span class ='notice'>You look for [target]'s [parse_zone(user.zone_selected)]...</span>")
|
||||
|
||||
@@ -47,10 +52,15 @@
|
||||
tool = tool.contents[1]
|
||||
if(istype(tool) && user.temporarilyRemoveItemFromInventory(tool))
|
||||
tool.replace_limb(target, TRUE)
|
||||
display_results(user, target, "<span class='notice'>You successfully augment [target]'s [parse_zone(target_zone)].</span>",
|
||||
"[user] successfully augments [target]'s [parse_zone(target_zone)] with [tool]!",
|
||||
"[user] successfully augments [target]'s [parse_zone(target_zone)]!")
|
||||
log_combat(user, target, "augmented", addition="by giving him new [parse_zone(target_zone)] INTENT: [uppertext(user.a_intent)]")
|
||||
if(tool.is_robotic_limb())
|
||||
display_results(user, target, "<span class='notice'>You successfully augment [target]'s [parse_zone(target_zone)].</span>",
|
||||
"[user] successfully augments [target]'s [parse_zone(target_zone)] with [tool]!",
|
||||
"[user] successfully augments [target]'s [parse_zone(target_zone)]!")
|
||||
else
|
||||
display_results(user, target, "<span class='notice'>You successfully replace [target]'s [parse_zone(target_zone)].</span>",
|
||||
"[user] successfully replaces [target]'s [parse_zone(target_zone)] with [tool]!",
|
||||
"[user] successfully replaces [target]'s [parse_zone(target_zone)]!")
|
||||
log_combat(user, target, "augmented", addition="by giving them a new [parse_zone(target_zone)] INTENT: [uppertext(user.a_intent)]")
|
||||
else
|
||||
to_chat(user, "<span class='warning'>[target] has no organic [parse_zone(target_zone)] there!</span>")
|
||||
return TRUE
|
||||
|
||||
@@ -50,6 +50,114 @@
|
||||
-->
|
||||
<div class="commit sansserif">
|
||||
|
||||
<h2 class="date">29 March 2021</h2>
|
||||
<h3 class="author">BlueWildrose updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">Fixed being unable to fix suit sensors if damaged at all unless destroyed completely</li>
|
||||
</ul>
|
||||
<h3 class="author">YakumoChen updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">A less-than-new Syndicate bundle that reminds you of the good old days when we didn't need all those newfangled traitor items the young-uns get. We had 6 items in the uplink and we had Monkey in rotation and by god we made do.</li>
|
||||
</ul>
|
||||
<h3 class="author">qweq12yt updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">Added Earmuffs</li>
|
||||
<li class="rscadd">Added Random Drink</li>
|
||||
<li class="rscadd">Added Clear PDA</li>
|
||||
<li class="rscadd">Added Internals Box</li>
|
||||
<li class="rscadd">Added Meson Goggles</li>
|
||||
<li class="rscadd">Added Smoke Grenade</li>
|
||||
</ul>
|
||||
<h3 class="author">silicons updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">automated hydroponics system design now works properly</li>
|
||||
</ul>
|
||||
|
||||
<h2 class="date">28 March 2021</h2>
|
||||
<h3 class="author">CuteMoff updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="balance">Changed Strength Modifier from the default (1.0) too .7</li>
|
||||
</ul>
|
||||
<h3 class="author">Hatterhat updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">As a heretic, shattering your blade no longer interferes with bluespace.</li>
|
||||
</ul>
|
||||
<h3 class="author">Putnam3145 updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">Threat tracking is now universal, rather than dynamic-only</li>
|
||||
<li class="rscadd">Slaughter demon event now increases weight based on how much blood there is.</li>
|
||||
</ul>
|
||||
<h3 class="author">R3dtail updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscdel">Removed ichor creates</li>
|
||||
<li class="balance">Removed ichor crates and adjusted crate rolling appropriately</li>
|
||||
<li class="balance">Removed the bonespear from the blackmarket uplink, and made EMP grenades harder to get from the same item.</li>
|
||||
<li class="rscadd">Added a description to the black market uplink</li>
|
||||
</ul>
|
||||
<h3 class="author">Shadow-Quill updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="imageadd">Added small versions of the walk icon for all hud styles, except Retro.</li>
|
||||
</ul>
|
||||
<h3 class="author">dzahlus updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">Added radial menu to joy mask for alt reskins</li>
|
||||
<li class="imageadd">added pensive, angry and flushed sprites to joy mask</li>
|
||||
</ul>
|
||||
<h3 class="author">keronshb updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="balance">Radioactive microlasers can no longer knock out creatures who are immune to the effects of radiation.</li>
|
||||
<li class="bugfix">The radioactive microlaser now calculates the strength of its delay effect using the intensity setting it had when you initially used it on your victim, not the intensity setting it currently has. This prevents people from "cheating out" its intensity 20 effect with only a 2 second delay and a 1 second cooldown.</li>
|
||||
<li class="balance">Radioactive microlasers no longer contain twice as much metal as normal health analyzers do.</li>
|
||||
</ul>
|
||||
<h3 class="author">necromanceranne updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">Replaces the useless bullet and laser shields with new Kinetic and Ablative shields, which do as they advertise.</li>
|
||||
<li class="rscadd">Replaces the shield implants shield with a hardlight shield that can take large amounts of brute damage, but disintegrates when shot with disablers.</li>
|
||||
<li class="bugfix">Fixes Fake Roman Shields being able to be used as normal riot shields.</li>
|
||||
<li class="bugfix">Fixes nonlethal/non-physical damage types destroying shields. (stamina, toxins, oxygen, clone, brain)</li>
|
||||
<li class="bugfix">Fixes tower shields not doing anything, while also giving them intergrity to match their advertised durability.</li>
|
||||
<li class="bugfix">Uses additional flags to determine what kind effects work well and what works poorly against various shields.</li>
|
||||
</ul>
|
||||
<h3 class="author">timothyteakettle updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">ghost cafe residents can now disguise themselves as any mob or object</li>
|
||||
<li class="bugfix">fixes character preview not updating when selecting the loadout tab</li>
|
||||
</ul>
|
||||
<h3 class="author">zeroisthebiggay updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">triple kitsune tail</li>
|
||||
</ul>
|
||||
|
||||
<h2 class="date">26 March 2021</h2>
|
||||
<h3 class="author">BlueWildrose updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="balance">Clothing no longer drops when shredded. It just becomes useless.</li>
|
||||
<li class="balance">Suit sensors are guaranteed to short out when the clothes become shredded, not damaged now.</li>
|
||||
<li class="balance">Uniform limb integrity increased from 30 to 120.</li>
|
||||
<li class="balance">Suit sensor damage has been added. The more damaged your suit sensors get, the less features that will be available from these suit sensors. It takes two e-sword hits to ruin your tracking beacon for instance. tweak: Examine text on uniforms is now more clear about needing cable coil to repair your suit sensors.</li>
|
||||
<li class="bugfix">Fixed prisoner uniform sprite paths</li>
|
||||
</ul>
|
||||
<h3 class="author">CuteMoff updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="balance">Diamond's forcemod was changed from 1.1x to 1.2x</li>
|
||||
</ul>
|
||||
<h3 class="author">Hatterhat updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">Lever-action rifles, chambered in .38, are now sitting in the code. They might be buyable from Cargo or the Black Market soon. Watch this space.</li>
|
||||
<li class="rscadd">Sawed-off shotguns now look like shotguns, but short, when inhand, instead of "generic gun".</li>
|
||||
</ul>
|
||||
<h3 class="author">timothyteakettle updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">slimes can be delimbed</li>
|
||||
<li class="bugfix">the loadout now colours pet collars correctly</li>
|
||||
</ul>
|
||||
|
||||
<h2 class="date">25 March 2021</h2>
|
||||
<h3 class="author">zeroisthebiggay updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="balance">strained muscles isn't free</li>
|
||||
</ul>
|
||||
|
||||
<h2 class="date">24 March 2021</h2>
|
||||
<h3 class="author">BlueWildrose updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
@@ -824,748 +932,6 @@
|
||||
<li class="rscadd">colormates can now paint some mobs.</li>
|
||||
<li class="bugfix">1 dev explosions shouldn't delete brains anymore</li>
|
||||
</ul>
|
||||
|
||||
<h2 class="date">27 January 2021</h2>
|
||||
<h3 class="author">ArcaneMusic, ported by Hatterhat updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">Strike a hydroponics tray with a fully-charged floral somatoray to lock in a mutation.</li>
|
||||
<li class="rscadd">Floral somatorays now have the ability to force a mutation in a plant. This should drain the cell in a single shot, but we'll see.</li>
|
||||
<li class="balance">Somatorays now take uranium to craft instead of radium.</li>
|
||||
</ul>
|
||||
<h3 class="author">Arturlang updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">Actually adds a right click give option</li>
|
||||
<li class="rscadd">Revenants can now clickdrag to throw stuff at people, with some items doing various things at the same time.</li>
|
||||
</ul>
|
||||
<h3 class="author">DeltaFire15 updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">The woundmending rite no longer causes runtimes.</li>
|
||||
<li class="bugfix">Ratvarian borgs can now use their tier-0 spells.</li>
|
||||
<li class="balance">Ratvarian borgs can always use their assigned spells, if there is enough power.</li>
|
||||
<li class="admin">The heretic antag panel now shows their sacrifices & current sacrifice targets.</li>
|
||||
<li class="tweak">The heretic roundend report now shows their sacrifices and nonsacrificed targets.</li>
|
||||
<li class="bugfix">Living hearts can no longer select the same target as another living heart, removing a certain problem.</li>
|
||||
</ul>
|
||||
<h3 class="author">Hatterhat updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="tweak">Department budget cards have been readded. TO THE CODE. NOT LOCKERS.</li>
|
||||
<li class="tweak">Also budget cards now look more like every other ID - see tgstation#55001.</li>
|
||||
<li class="balance">One of the contractor tablet's payouts has been raised from a small payout to a medium payout.</li>
|
||||
<li class="balance">The free golem ship's GPSes no longer start on. They were never meant to, but they did.</li>
|
||||
<li class="rscdel">Headsets can't be found on most legion corpses now.</li>
|
||||
<li class="rscdel">The flash on the assistant corpse is gone, too.</li>
|
||||
</ul>
|
||||
<h3 class="author">MrJWhit updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="tweak">Remaps some air alarms for sanity.</li>
|
||||
</ul>
|
||||
<h3 class="author">SandPoot updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">The drop circuit can no longer drop things that are not inside it.</li>
|
||||
</ul>
|
||||
<h3 class="author">raspy-on-osu updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">bespoke ventcrawling element not detaching due to malformed call</li>
|
||||
</ul>
|
||||
<h3 class="author">shellspeed1 updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">Floorbots had had a software update, preventing them from dogpiling on their target as easily as they did before.</li>
|
||||
<li class="soundadd">Floorbots will now play a small chime when stacked on top of each other to indicate that they're moving apart.</li>
|
||||
</ul>
|
||||
<h3 class="author">timothyteakettle updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">blobs can use the 'me' verb</li>
|
||||
<li class="admin">adminhelps and pms only sanitize once instead of twice</li>
|
||||
</ul>
|
||||
|
||||
<h2 class="date">25 January 2021</h2>
|
||||
<h3 class="author">MrJWhit updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">Alien radio code</li>
|
||||
<li class="rscadd">Microwave can now be cleaned by a damp rag as well as soap.</li>
|
||||
<li class="bugfix">Removes some unused code, and improves some other code.</li>
|
||||
<li class="rscadd">The AI has a verb to look up and down z-levels</li>
|
||||
<li class="bugfix">Making a monkey into a human doesn't unanchor random things on the tile</li>
|
||||
<li class="bugfix">Makes a few slight improvements to drinking code</li>
|
||||
<li class="tweak">Makes encryption keys be put in the hands of the user when able instead of being dropped on the floor when removed from headsets</li>
|
||||
</ul>
|
||||
<h3 class="author">raspy-on-osu updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="refactor">ventcrawling</li>
|
||||
</ul>
|
||||
<h3 class="author">silicons updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="tweak">you can now shove yourself up in any intent, not just help.</li>
|
||||
</ul>
|
||||
|
||||
<h2 class="date">22 January 2021</h2>
|
||||
<h3 class="author">Arturlang updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">Adds a way to give items to people, you can combat mode rightclick to offer it to one person, right click on people without mode and click the give verb, or use the hotkey CTRL G to offer it to everyone around you</li>
|
||||
</ul>
|
||||
|
||||
<h2 class="date">21 January 2021</h2>
|
||||
<h3 class="author">Acer202 updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">Main mining shuttle should no longer look at the public mining shuttle and attempt to dock ontop of it. Monastery shuttle should now function again.</li>
|
||||
</ul>
|
||||
<h3 class="author">Acer202, with minor help from The0bserver updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">After internal deliberation, CentCom has decided to run a limited reinstatement of public mining shuttles for use in more tried and true station classes. CentCom would like to remind you that this privilege is easily revoked, and that abuse may result in immediate detonation.</li>
|
||||
<li class="rscadd">Restores the mining shuttle on Pubby, Box, Delta, Meta, and Lambda Station.</li>
|
||||
</ul>
|
||||
<h3 class="author">ArcaneMusic, The0bserver-sys updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">New from Hydrowear LLC: The Botanical Belt! This handy yellow belt lets you hold most of your botany gear, and a few beakers for reduced bag and floor clutter!</li>
|
||||
<li class="tweak">Gives Hydrotrays plumbing pipes automatically, allowing you to make a self sustaining tray via plumbing.</li>
|
||||
<li class="tweak">Gives Service access to Bluespace Beakers, at last, gives Cargo, Science, and Medical the ability to construct reinforced plungers for use on lavaland.</li>
|
||||
</ul>
|
||||
<h3 class="author">ArchieBeepBoop updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">Upgraded Advanced RTG Machine Preset</li>
|
||||
<li class="bugfix">Outlet Injector Mapping Asset Layer Fix</li>
|
||||
<li class="bugfix">Jacqueen and the Christmas tree should no longer spawn abstract things that can cause shittons of runtimes.</li>
|
||||
</ul>
|
||||
<h3 class="author">Arturlang updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">You can't tackle in nograv anymore</li>
|
||||
<li class="tweak">You cannot spam drink from blood bags anymore</li>
|
||||
<li class="bugfix">Blood bag drinking inefficiency is now the right way, so you loose some of the blood drinking it straight</li>
|
||||
<li class="bugfix">Handles more edge cases with construct soul returning</li>
|
||||
<li class="tweak">Being sacrificed by the cult no longer removes all hope of rescue.</li>
|
||||
<li class="bugfix">Makes construct mind returning more robust</li>
|
||||
<li class="tweak">Prayers to admins now do a wee ding sound for all prayers, instead of just chaplains</li>
|
||||
<li class="bugfix">Fixes the mint machine's UI</li>
|
||||
<li class="bugfix">Hopefully fixes whitescreen issues for TGUI UI's by giving assets more time to get to the client</li>
|
||||
<li class="bugfix">Fixes hijack implant APC UI, again</li>
|
||||
<li class="code_imp">Comments out spaceman dmm do not sleeps for mob/proc/CommonClickOn, atom/proc/attack_hand, datum/proc/keyLoop and mob/living/proc/Life</li>
|
||||
<li class="bugfix">Bloodsuckers tresspass ability can no longer work while they are not awake.</li>
|
||||
<li class="tweak">The cursed heart now only takes away half as much blood every loop, and can be used as long as you are alive, instead if only you are awake/able to use your hands</li>
|
||||
</ul>
|
||||
<h3 class="author">Bhijn updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="tweak">Changeling loudness is now determined as an average of all their abilities, rather than the sum</li>
|
||||
<li class="tweak">To compensate for this, blood tests now require a loudness value of 1 or higher to detect ling blood. Additionally, blood test explosions are now triggered only when the loudness value is higher than 2.</li>
|
||||
</ul>
|
||||
<h3 class="author">BlackMajor updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="tweak">Cyborg hypospray no longer injects if it means OD'ing while on help intent.</li>
|
||||
</ul>
|
||||
<h3 class="author">BlueWildrose updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="tweak">Nyctophobia quirk now has some light lag compensation.</li>
|
||||
<li class="bugfix">Fixes cloning computer UI not updating when pressing certain buttons - also adds extra check for names to update a message</li>
|
||||
<li class="rscdel">Removes oversized genitalia analysis from medical scanners, since huge dick and titty are no longer a problem anymore thanks to advancements in that kind of technology when it comes to chemical fun times growth.</li>
|
||||
<li class="bugfix">Fixed species-specific drinks not giving a mood boost if you are that species.</li>
|
||||
<li class="tweak">You will now only unbuckle fireman-carried/piggybacked people on disarm or harm intent.</li>
|
||||
<li class="balance">The traitor AI can no longer activate the doomsday device while carded.</li>
|
||||
<li class="bugfix">Fixes noodle size appearance for 12+ inch members.</li>
|
||||
<li class="bugfix">Fixed the subtle hotkey being weird with its input prompts.</li>
|
||||
<li class="rscadd">Adds a subtler anti-ghost hotkey. Default key is 6.</li>
|
||||
<li class="tweak">No more straining when your cock or breasts are growing via incubus draft or succubus milk.</li>
|
||||
<li class="rscadd">PubbyStation now has two Christmas Tree spawners.</li>
|
||||
<li class="tweak">You can now have a max-roundstart-dicksize-config inch long johnson before you start suffering blood loss and slowdowns instead of a 20 inch one.</li>
|
||||
<li class="rscadd">Color Mates have been added to all stations (except Snaxi). Enjoy coloring your attire without having to bug science!</li>
|
||||
<li class="bugfix">Polychromic hoodies that were obtained from the loadout have functional colorable hoods now.</li>
|
||||
<li class="rscadd">Adds in timid woman/man costumes. Available at your autodrobe! Also adds in garters as some new socks.</li>
|
||||
<li class="spellcheck">Corrected the capitalization in gasmask concealment examine text</li>
|
||||
</ul>
|
||||
<h3 class="author">Chiirno updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">Added the paramedics EVA suit as a purchase from the cargo console.</li>
|
||||
<li class="rscadd">Paramedics office and Surgery Storage Room</li>
|
||||
<li class="tweak">Remodeled the surgery room, as well as shrunk Morgue and Starboard Emergency Storage. Fiddled with some areas for better map edit clarity and fixed one runtime in Vacant Office A.</li>
|
||||
<li class="imageadd">Added the paramedic closet sprite, a paramedic colored medical3 closet.</li>
|
||||
<li class="code_imp">Added a paramedic closet, which is the standard medical3 closet with their suit, a pinpointer, and a crew monitor added.</li>
|
||||
<li class="tweak">Nightmare now deals additional damage to most light sources.</li>
|
||||
<li class="bugfix">Nightmare now one-shots miners beacons and glowshrooms</li>
|
||||
<li class="bugfix">Portable Chem Mixer now researchable from biotech node.</li>
|
||||
<li class="tweak">Chem masters can now dispense 20 instances of its outputs instead of 10.</li>
|
||||
</ul>
|
||||
<h3 class="author">Delams-The-SM updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">Added 3 new emotes *hiss *purr *meow</li>
|
||||
<li class="soundadd">ported sounds from Citadel RP for *purr and *meow</li>
|
||||
<li class="bugfix">fixed randomization of colors for things like mulligan and Stabilized green slime extract for matrixed body parts</li>
|
||||
</ul>
|
||||
<h3 class="author">DeltaFire15 updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="balance">Biomechanical (hybrid) bodyparts now have access to wound-fixing surgeries.</li>
|
||||
<li class="tweak">A wound being fixed no longer just qdel()s surgeries connected to it.</li>
|
||||
<li class="tweak">Some robotic surgery steps are now a bit more clear.</li>
|
||||
<li class="bugfix">Organs no longer get fed to people after successfully being inserted into them.</li>
|
||||
<li class="tweak">Not completing the do_after of a surgery no longer causes you to attack the target with whatever you were holding.</li>
|
||||
<li class="rscadd">IPC cells & power cords are now printable after they are researched.</li>
|
||||
<li class="rscadd">A new surgery, allowing revival of synths without a defib at hand.</li>
|
||||
<li class="balance">Semi-permanent damage of Synth limbs caused by passing the damage threshold: 10 <- 15.</li>
|
||||
<li class="tweak">The embed removal surgery now has a version for Synths.</li>
|
||||
<li class="balance">EMPs no longer hardstun Synths.</li>
|
||||
<li class="bugfix">Portals no longer runtime because of incorrect args.</li>
|
||||
<li class="tweak">Abductors now can use experimental organ replacement surgery on robots / synthetics.</li>
|
||||
<li class="bugfix">Fixes a minor incorrectness in ratvarian borg slabs (ratvar_act -> ui_act)</li>
|
||||
<li class="bugfix">Changelings no longer double-deathgasp when activating the regen stasis ability while not dead.</li>
|
||||
<li class="bugfix">People installing KA modkits in miner borgs is no longer broken.</li>
|
||||
<li class="bugfix">Fixes the tail entwine messages displaying incorrectly.</li>
|
||||
<li class="bugfix">Antagging / Deantagging Heretics now properly sets their special role.</li>
|
||||
<li class="bugfix">The borg VTEC ability now actually gets removed when the upgrade is removed.</li>
|
||||
<li class="bugfix">Supplypods shouldn't cause runtimes anymore, and shrapnel (pelletclouds) should work for them.</li>
|
||||
<li class="rscadd">Robots (anyone with the robotic_organism trait) have toxins damage replaced with system corruption. See the PR for details.</li>
|
||||
<li class="code_imp">Clockwork rites now support hiding specific rites from neutered servants.</li>
|
||||
<li class="tweak">AIs now only have to kill people once instead of permanently.</li>
|
||||
<li class="bugfix">Scripture no longer sometimes eats part of its invocation.</li>
|
||||
<li class="balance">APCs and silicons are now more susceptible to powerdrains (by the power_drain() proc, which is rare)</li>
|
||||
<li class="balance">Void Volt has been modified from a chant to a singular pulse.</li>
|
||||
<li class="balance">Robotpeople are now fully immune to the effects of alcohol (drunkness etc.)</li>
|
||||
<li class="tweak">Renames the alcohol intolerance trait in the code to make what it does more clear.</li>
|
||||
<li class="bugfix">Self-fueling weldingtools recharge fuel properly again.</li>
|
||||
<li class="bugfix">Brass welders now actually recharge faster than experimental ones.</li>
|
||||
<li class="bugfix">Repeatable surgery steps can no longer cause an infinite loop if not completing the do_after</li>
|
||||
<li class="bugfix">The Revenant self-revive ability is no longer broken.</li>
|
||||
<li class="bugfix">Loot items mobs drop are no longer always failing to initialize.</li>
|
||||
<li class="tweak">Instant summons can no longer do wacky stuff with disposals (and nukes).</li>
|
||||
<li class="bugfix">Objectives are no longer very broken.</li>
|
||||
<li class="bugfix">Bloodcult stunhands now work against clockies like they were supposed to instead of hardstunning.</li>
|
||||
<li class="balance">zeolites are now actual fermichems instead of being incredibly easy to make.</li>
|
||||
<li class="bugfix">Using syringes / droppers on chem heaters with beakers in them works again.</li>
|
||||
<li class="bugfix">Some edge cases causing issues with system corruption shouldn't be able to occur anymore.</li>
|
||||
<li class="bugfix">Cyborg B.o.r.i.s. installation now checks for if the chest has a cell, just like how it does with MMIs.</li>
|
||||
<li class="bugfix">The 'Your body is in a cloner' notification works again</li>
|
||||
<li class="bugfix">Hijack implants should work properly again (or, at least better)</li>
|
||||
<li class="bugfix">Liches are now good skeletons again instead of weak ones</li>
|
||||
<li class="bugfix">The piratepad control cannot be destroyed again.</li>
|
||||
<li class="bugfix">Pirates have received new supplies of jetpacks instead of useless oxygen tanks</li>
|
||||
<li class="bugfix">Ratvarian AIs are once again able to show their linked borgs Ratvar's light</li>
|
||||
<li class="bugfix">Hijackers are once again unable to detonate borgs without being adjacent to the console</li>
|
||||
<li class="bugfix">Automated annoucement systems and gulag ore consoles no longer waste emag charges</li>
|
||||
<li class="bugfix">Automated announcement systems once again can be remote controlled by non-AIs with silicon access</li>
|
||||
<li class="bugfix">APCs being hijacked multiple times at once is no longer possible, preventing some issues</li>
|
||||
<li class="bugfix">Recharging APCs no longer use 0.2% of the power they should be using.</li>
|
||||
<li class="bugfix">APCs no longer always use as much power as they can for their cell, even if it is full.</li>
|
||||
<li class="bugfix">Vampire shapeshifting should now behave as intended</li>
|
||||
<li class="balance">Some synth damage stuff has been a bit rebalanced, see the PR for details.</li>
|
||||
<li class="rscadd">Nanogel, available at medical and robotics, which fixes internal damage in sufficiently repaired robotic limbs.</li>
|
||||
<li class="balance">Robotic Limbs now each have their own damage threshhold values</li>
|
||||
<li class="balance">Robotic Limb damage threshholds are now seperated into threshhold itself and mindamage when passed balance; Hybrid limbs can now be injected with hypos, but not sprayed (Still not healed by chems)</li>
|
||||
<li class="tweak">Brain surgery has been tweaked back to allowing robotic limbs, blacklisting IPC brains instead.</li>
|
||||
<li class="tweak">Robot brain surgery can now be used on organic heads, if there is a IPC brain in them somehow.</li>
|
||||
<li class="tweak">The robot limb heal surgery can now be used even if the target's torso is not robotic, as long as they have robotic limbs</li>
|
||||
<li class="refactor">BODYPART_ROBOTIC / BODYPART_ORGANIC checks replaced with helper-procs whereever possible.</li>
|
||||
<li class="code_imp">Added a BODYPART_HYBRID define for robotic bodyparts that behave organic in some regards.</li>
|
||||
<li class="bugfix">The transmission sigil power drain works now</li>
|
||||
<li class="bugfix">A certain lizard (totally not me) being stupid is no longer going to break regenerate_bodyparts</li>
|
||||
<li class="bugfix">Combat mode now will not stay permanently disabled due to status effects not working as intended.</li>
|
||||
<li class="bugfix">Attacking some certain objects no longer has no clickdelay.</li>
|
||||
<li class="bugfix">the blacksmithing skill now works properly</li>
|
||||
<li class="tweak">Anvils cannot be interacted with with hammers whilst they are already being used</li>
|
||||
<li class="tweak">If someone has no gloves when interacting with heated ingots, they no longer ignore their effects.</li>
|
||||
<li class="bugfix">A runtime caused by hallucinations is gone.</li>
|
||||
<li class="bugfix">Cargo packs marked as 'no private buying' now actually register as such.</li>
|
||||
<li class="balance">Fleshmend, Anatomic Panacea and bloodsucker healing now work for Synths / IPCs.</li>
|
||||
<li class="tweak">Medibots now ignore people they cannot help due to their biology.</li>
|
||||
<li class="bugfix">get_damaged_bodyparts() is no longer broken.</li>
|
||||
<li class="bugfix">Your target cryoing will no longer give you a free greentext.</li>
|
||||
<li class="bugfix">Sleeper UI interactiveness now behaves correctly.</li>
|
||||
</ul>
|
||||
<h3 class="author">Detective-Google updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">arcade carpet</li>
|
||||
<li class="rscadd">explosions now get broadcasted to deadchat.</li>
|
||||
<li class="rscadd">Lick radial</li>
|
||||
<li class="bugfix">Hilbert's jukebox works</li>
|
||||
<li class="bugfix">arcade carpets now actually work</li>
|
||||
<li class="tweak">the snow taxi is no longer the slow taxi</li>
|
||||
</ul>
|
||||
<h3 class="author">ERP mains updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">Subtler Around Table is now a verb</li>
|
||||
</ul>
|
||||
<h3 class="author">EdgeLordExe, MoonFalcon updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="balance">Ported a bunch of heretic-related tweaks and changes from tg</li>
|
||||
</ul>
|
||||
<h3 class="author">EmeraldSundisk updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">Adds a few new area designations primarily for CogStation, incorporates them into said map</li>
|
||||
<li class="tweak">Reorganizes some area designations for ease of use, along with renaming the central "Router" to "Routing Depot"</li>
|
||||
<li class="bugfix">Fixes an incorrectly designated area in CogStation</li>
|
||||
<li class="bugfix">Changes the area designations to be not varedited since the code didn't like that anymore</li>
|
||||
<li class="bugfix">The cargo bay conveyor belts not only work with the shuttle now but go in the right direction to boot</li>
|
||||
<li class="tweak">Slight visual adjustments to cargo in light of this</li>
|
||||
<li class="rscadd">The arcade's got RAD carpet now</li>
|
||||
<li class="bugfix">Fixes the conveyor belt issues in Delta Station's cargo wing</li>
|
||||
<li class="rscdel">Removes some of the dirt around the affected area (presumably they would have cleaned it up while working on it)</li>
|
||||
<li class="rscadd">Adds a floor light to fix the "dark spot" cargo had</li>
|
||||
<li class="rscadd">Adds a new "Computer Core" area designation for CogStation</li>
|
||||
<li class="bugfix">Fixes some missing area strings</li>
|
||||
<li class="tweak">Replaces some firelocks with directional ones as to ensure desks/counters can still be accessed</li>
|
||||
<li class="balance">The "Skelter ruin" now has stechkins as opposed to M1911s</li>
|
||||
<li class="tweak">Skelter's decorative bullet casings replaced to factor in the change in caliber</li>
|
||||
<li class="rscadd">Skelter now has a combat knife and fluff note</li>
|
||||
</ul>
|
||||
<h3 class="author">Ghommie updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">You can access the mime / clown mask skins radial menu once again.</li>
|
||||
<li class="bugfix">Dice bags no longer act like cardboard boxes.</li>
|
||||
<li class="bugfix">Abductors should be no longer mute.</li>
|
||||
<li class="bugfix">Item action buttons should now properly show the item current overlays, most times.</li>
|
||||
<li class="bugfix">The blackbox should now go into your hand slot when pried out, rather than tumbling on the ground everytime.</li>
|
||||
<li class="tweak">The Quick Equip hotkey is now usable by all living mobs (so long they have hands and equipment slots)</li>
|
||||
</ul>
|
||||
<h3 class="author">Ghommie, porting PRs by MMMiracles and pireamaineach, credits to BlueWildrose too. updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">You can now draw on plasmaman helmets with a crayon to turn their frown upside-down.</li>
|
||||
<li class="balance">Plasmaman helmets no longer hide your identity when worn by themselves.</li>
|
||||
<li class="balance">Plasmaman helmets now have welding visors, which can't stack with their torches in the helmet and are visible.</li>
|
||||
</ul>
|
||||
<h3 class="author">Hatterhat updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">Energy sabre reskin for the energy sword - access via alt-click.</li>
|
||||
<li class="bugfix">Alt-click reskins are fixed.</li>
|
||||
<li class="tweak">Defibrillators and their many, many overlays were moved to another .dmi.</li>
|
||||
<li class="tweak">You can now change the color of an energy sword via multitool. Not deswords. Yet.</li>
|
||||
<li class="imageadd">The Syndicate appear to be issuing new revolver variants.</li>
|
||||
<li class="rscadd">Basic sticky technology is now a roundstart tech. Advanced sticky technology is BEPIS-locked, though. Theoretically.</li>
|
||||
<li class="tweak">Non-smithed katanas (including the temporal katana) can now fit in the twin sheath.</li>
|
||||
<li class="tweak">Cotton and durathread processing by hand now acts like grass. Stand on a pile of cotton (or durathread) and use a single bundle from it.</li>
|
||||
<li class="spellcheck">Utility uniforms now comply with the "nonproper equipment names" thing.</li>
|
||||
<li class="bugfix">The CapDrobe now allows the captain to get his own clothes for free. Probably.</li>
|
||||
<li class="tweak">All captains' clothes now offer 15 woundarmor, up from the 5. Because apparently only the suit and tie and its suitskirt subtype have this wound armor, which is dumb.</li>
|
||||
<li class="rscadd">The nature interaction shuttle with the monkeys now has tiny fans on the airlocks in, because that's apparently a feature that was missing.</li>
|
||||
<li class="rscadd">More bags have been added to department vendors.</li>
|
||||
<li class="balance">Every roundstart species (and also ash walkers) now has flesh and bone that can be wounded.</li>
|
||||
<li class="balance">Recipes for sutures, regen mesh, and sterilized gauze have been adjusted to be easier, mostly.</li>
|
||||
<li class="balance">Sterilized gauze is better at absorbing blood and being a splint.</li>
|
||||
<li class="bugfix">Energy sabres now have an off inhand.</li>
|
||||
<li class="balance">The bone gauntlets should be slightly less murderously punchy on the fast punches mode.</li>
|
||||
<li class="tweak">RPEDs now drop their lowest part tier first when quick-emptied (used inhand).</li>
|
||||
<li class="tweak">Improvised gauzes can now be crafted in stacks up to 10, like their maximum stacksize implies they should be capable of doing.</li>
|
||||
<li class="bugfix">Pouring sterilizine on gauze now takes the proper 5u per sterilized gauze instead of 10u.</li>
|
||||
<li class="bugfix">Cryogenics now screams on common again when your fuckbuddy heads out.</li>
|
||||
<li class="rscadd">Survival daggers! A slightly more expensive survival knife that comes with a brighter flashlight. On the blade.</li>
|
||||
<li class="tweak">Luxury pod capsules look different from normal capsules.</li>
|
||||
<li class="rscadd">The wastes of Lavaland and the icy caverns of Snow Taxi rumble in unison.</li>
|
||||
<li class="tweak">Exosuits sold on the Supply shuttle no longer leave wreckages.</li>
|
||||
<li class="rscdel">Apparently, shrink rays were buyable again, despite a PR having been made a while ago specifically for removing shrink rays. They're gone again.</li>
|
||||
<li class="rscadd">Changeling bone gauntlets! They punch the shit out of people really good.</li>
|
||||
<li class="tweak">Guerilla gloves and gorilla gloves inherit the strip modifiers of their predecessors, because apparently they had those.</li>
|
||||
<li class="balance">Pugilists now always hit the targeted limb and never miss.</li>
|
||||
<li class="rscadd">The dock-silver standard set by Box and Meta has been enforced across maps in rotation (Delta, Pubby, Lambda).</li>
|
||||
<li class="bugfix">The Box whiteship now has its missing tiny fan back.</li>
|
||||
<li class="bugfix">The survival dagger light on the sprite now actually turns on and off.</li>
|
||||
<li class="balance">The survival dagger in the glaive kit that can also be bought by itself is now better at butchering things.</li>
|
||||
</ul>
|
||||
<h3 class="author">HeroWithYay updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">Changed description of Necrotizing Fasciitis symptom.</li>
|
||||
<li class="tweak">Wormhole Projector and Gravity Gun now require anomaly cores to function instead of firing pins.</li>
|
||||
</ul>
|
||||
<h3 class="author">KeRSedChaplain updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="imageadd">Resprited the brass claw</li>
|
||||
</ul>
|
||||
<h3 class="author">LetterN updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">2 more ways to get up from z1</li>
|
||||
<li class="tweak">tweaked the z2 garden to be less blank</li>
|
||||
<li class="bugfix">fixed telecomms pda log</li>
|
||||
<li class="rscadd">Coin & Holochip support for slot machine</li>
|
||||
<li class="admin">Stickybans are now saved in the DB too</li>
|
||||
<li class="soundadd">Immersive ™ audio reverbs. (also adds multiz audio)</li>
|
||||
<li class="code_imp">Semi-hardsync from TG</li>
|
||||
<li class="code_imp">Updates rust-g</li>
|
||||
<li class="code_imp">Uses git CI instead of travis/appveyor now</li>
|
||||
<li class="code_imp">Updates git and build tests.</li>
|
||||
<li class="bugfix">minimap text</li>
|
||||
<li class="code_imp">ports cinematic upgrades</li>
|
||||
</ul>
|
||||
<h3 class="author">Linzolle updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">entertainment monitors no longer invisible</li>
|
||||
<li class="rscadd">entertainment monitors now light up and display text when motion is detected in thunderdome</li>
|
||||
<li class="bugfix">lizard snouts are no longer *slightly* lighter than they are supposed to be.</li>
|
||||
</ul>
|
||||
<h3 class="author">MrJWhit updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">Expanded space hermit base</li>
|
||||
<li class="tweak">Replaced engineering fuel tank with a large fuel tank</li>
|
||||
<li class="tweak">Changed access to sec suit storage from armory access in every map to other security access</li>
|
||||
<li class="rscadd">Adds a space loop to every map in toxins</li>
|
||||
<li class="rscadd"></li>
|
||||
<li class="tweak">Added the ability for cargo to buy a large welding tank</li>
|
||||
<li class="imageadd">Tweaked large tank reagent sprites to /tg/'s</li>
|
||||
<li class="tweak">Gives metastation toxins storage a scrubber and a vent</li>
|
||||
<li class="tweak">Updates suit storage info on Tip Of the Round.</li>
|
||||
<li class="tweak">Increased christmas event from 22th to 27th to 10th to 27th</li>
|
||||
<li class="tweak">Removes an opposum from the wall</li>
|
||||
<li class="tweak">Donut boxes show what's inside of them now</li>
|
||||
<li class="tweak">Updated meat icons</li>
|
||||
<li class="admin">Canceling events gives more time to stop from 10 to 30</li>
|
||||
<li class="tweak">Fixes two chairs on one table</li>
|
||||
<li class="tweak">Removed the wires connecting the AI from the rest of the station on cogstation.</li>
|
||||
<li class="tweak">Fixes experimenter on cogstation.</li>
|
||||
<li class="tweak">Less pipes in the overall area in toxins on cogstation</li>
|
||||
<li class="tweak">Small fixes on security on boxstation</li>
|
||||
<li class="tweak">Updated jukebox sprite.</li>
|
||||
<li class="tweak">Fixes maint area in boxstation</li>
|
||||
<li class="tweak">Christmas starts on the 18th now</li>
|
||||
<li class="rscadd">Adds a goose bar sign</li>
|
||||
<li class="bugfix">Effects can no longer trigger landmines</li>
|
||||
<li class="rscdel">Removes the screen flashing on climax.</li>
|
||||
<li class="rscadd">Makes gas sensors fireproof.</li>
|
||||
<li class="tweak">A small bucket of random fixes,</li>
|
||||
<li class="tweak">Minor fixes to kilo</li>
|
||||
<li class="tweak">Porting garbage collection tweak from /tg/</li>
|
||||
<li class="tweak">Updates our dark gygax sprites to /tg/'s</li>
|
||||
<li class="tweak">Bugfix of a morph becoming an AI eye</li>
|
||||
<li class="tweak">Mining station oxygen locker on the cycling airlock starts out wrenched.</li>
|
||||
<li class="balance">Nerf combat knife damage</li>
|
||||
<li class="bugfix">Code improvement on ventcrawling</li>
|
||||
</ul>
|
||||
<h3 class="author">NT Cleaning Crews On Break updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">Most kinds of dirt, grime, and debris are now persistent. Get to work, jannies.</li>
|
||||
<li class="rscadd">Dirt can now be removed by tile replacements. Other cleanable decals can't, though.</li>
|
||||
</ul>
|
||||
<h3 class="author">Putnam3145 updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="tweak">Replaces majority judgement with usual judgement.</li>
|
||||
<li class="bugfix">Toilet loot spawners don't lag the server on server start with forced hard dels.</li>
|
||||
<li class="bugfix">vore prefs save now</li>
|
||||
<li class="tweak">gear harness no longer magically covers up the body mechanically despite covering up nothing visually</li>
|
||||
<li class="balance">Regen coma now puts into a coma even from crit or while unconscious.</li>
|
||||
<li class="bugfix">Regen coma now properly weakens while asleep.</li>
|
||||
<li class="bugfix">Multi-surgery unit test no longer fails at random.</li>
|
||||
<li class="refactor">Dwarf speech is no longer absolutely paranoid about word replacement.</li>
|
||||
<li class="balance">Spontaneous brain trauma now requires minimum 5 players</li>
|
||||
<li class="tweak">Grab bag works as advertised.</li>
|
||||
<li class="balance">Xeno threat in dynamic tripled.</li>
|
||||
<li class="code_imp">Vote system #defines are now strings</li>
|
||||
<li class="rscadd">Stat panel UI for ranked choice votes</li>
|
||||
<li class="rscadd">A fallback for dynamic antag rolling that allows for it to just try between traitor, blood brothers, heretics, changeling, bloodsucker and devil until there are enough roundstart antags. This can also happen randomly anyway. Blood brothers and devil are disabled for now, but the code is there to enable them.</li>
|
||||
<li class="rscadd">A new storyteller, "Grab Bag", that forces the above round type.</li>
|
||||
<li class="bugfix">atmos subsystem no longer dies if there's too many gases</li>
|
||||
<li class="bugfix">Emotes can properly be filtered for in TGUI.</li>
|
||||
<li class="bugfix">Holofirelocks work now.</li>
|
||||
<li class="bugfix">adminhelping no longer removes entire admin tab</li>
|
||||
<li class="bugfix">end of round no longer removes entire admin tab</li>
|
||||
<li class="bugfix">Fixed a runtime in every healing nanite program.</li>
|
||||
<li class="bugfix">removed a unit test causing master to fail</li>
|
||||
<li class="tweak">Planetary atmos no longer does superconduction.</li>
|
||||
<li class="bugfix">Dynamic vote no longer shows the none-storyteller.</li>
|
||||
<li class="tweak">You can now exit polycircuit input</li>
|
||||
<li class="bugfix">Polycircuits now check for range</li>
|
||||
<li class="bugfix">gear harness alt-click is now sane</li>
|
||||
<li class="code_imp">rolldown() and toggle_jumpsuit_adjust() now no longer mix behavior-that-should-be-overridden and behavior-that-shouldn't-be-overridden in ways that make no sense.</li>
|
||||
<li class="tweak">Gear harness now covers nothing.</li>
|
||||
<li class="bugfix">Chemical stuff now displays fermichem stuff properly</li>
|
||||
<li class="balance">Rad collectors now get 1.25x as much energy from radiation</li>
|
||||
<li class="balance">Rad collectors now put out 1.25x as much stored energy per tick</li>
|
||||
<li class="balance">Above two rad collector changes give a total 56.25% power output increase</li>
|
||||
<li class="balance">Zeolites now only generate 1/5 the heat when reacting and don't require a catalyst.</li>
|
||||
</ul>
|
||||
<h3 class="author">Ryll/Shaps updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="admin">Fixed an issue with player logs becoming confused when someone triggers multiple events within one second (like being attacked by two people at the same time) that would cause holes in the logs</li>
|
||||
</ul>
|
||||
<h3 class="author">SandPoot updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="tweak">You can attack a pile of money on the floor with your id to put it all in quickly.</li>
|
||||
<li class="refactor">Changes the limb grower a lot.</li>
|
||||
<li class="bugfix">"Limb" costs on limbgrower are actually displayed like it was meant to all along.</li>
|
||||
<li class="code_imp">Swaps the gift static blacklist with a global list one.</li>
|
||||
</ul>
|
||||
<h3 class="author">SiliconMain updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="tweak">Engi department has gas masks in loadout</li>
|
||||
<li class="tweak">hololocks (which haven't worked for god knows how long) commented out until auxmos is merged</li>
|
||||
</ul>
|
||||
<h3 class="author">Sonic121x updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">alarm ert hardsuit sprite for naga and canine</li>
|
||||
<li class="tweak">adjust the naga ert hardsuit to cover the hand</li>
|
||||
<li class="bugfix">cydonia hardsuit helmet</li>
|
||||
<li class="rscadd">digi sprite uniform</li>
|
||||
<li class="bugfix">digi leg suit</li>
|
||||
</ul>
|
||||
<h3 class="author">SpaceManiac updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">Fixed the maphook</li>
|
||||
</ul>
|
||||
<h3 class="author">Thalpy updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">fixes some bugs in jacqs code from edits to the codebase</li>
|
||||
</ul>
|
||||
<h3 class="author">The Grinch updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscdel">infinite presents from hilbert hotel</li>
|
||||
</ul>
|
||||
<h3 class="author">TheObserver updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">Re-adds the rifle stock, and sets the improv shotgun to be as it was.</li>
|
||||
<li class="rscdel">The maintenance rifle has been shelved - for now. Watch this space.</li>
|
||||
</ul>
|
||||
<h3 class="author">TheObserver-sys updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">Drake? Where's the dead fairygrass sprite?</li>
|
||||
</ul>
|
||||
<h3 class="author">TheSpaghetti updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">no more tumor bread double punctuation</li>
|
||||
</ul>
|
||||
<h3 class="author">Trilbyspaceclone updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="tweak">Zeolites now use gold rather then uranium for catalyst</li>
|
||||
<li class="tweak">Zeolites are not as hard to make ph wise</li>
|
||||
<li class="tweak">Making Zeolites heats up the beaker less allowing for better control</li>
|
||||
<li class="tweak">ASP 9mm and M1911 can now have suppressers added</li>
|
||||
<li class="balance">Brass welders are 50% faster at refueling</li>
|
||||
<li class="code_imp">redoes self fueling welders in the code to be less speggie</li>
|
||||
<li class="rscadd">the corporate unifoms can now be gotton in the clothing mate vender</li>
|
||||
</ul>
|
||||
<h3 class="author">TripleShades updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">Firelock to Surgery Bay drapes change: Swapped Nanomed and Fire Alarm button locations in both Surgery Bays change: Removes the double mirror in both Surgery Bays to be a singular mirror change: Moved an intercom to not be doorstuck below Paramedical Office remove: One Surgery Observation Fire Alarm button</li>
|
||||
<li class="rscadd">New Paramedic Office next to Genetics where the old Genetics Reception used to be change: Surgery, Surgery Observation, and Recovery Hall layout revamped drastically change: Maints below Surgery lowered by one tile to recover lost tile space from Surgery expansion</li>
|
||||
</ul>
|
||||
<h3 class="author">Tupinambis updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">Arachnids (spider people) with limited night vision, flash vulnerability, and webbing.</li>
|
||||
</ul>
|
||||
<h3 class="author">Vynzill updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">new gateway mission mapadd: jungleresort map</li>
|
||||
<li class="bugfix">fixes high luminosity eyes</li>
|
||||
</ul>
|
||||
<h3 class="author">Xantholne updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">Fixed new birds changing back to basic parrot when sitting</li>
|
||||
<li class="rscadd">New parrots from the RP server, can be found in Bird Crate in Cargo</li>
|
||||
<li class="rscadd">You can now tuck disky into bed</li>
|
||||
<li class="rscadd">You can now make beds by applying a bed sheet to them</li>
|
||||
<li class="rscadd">You can now tuck in pai cards into bed</li>
|
||||
<li class="rscadd">Added bed tucking element, can be added to any held object to allow tucking into beds</li>
|
||||
<li class="bugfix">Twin Sword Sheaths have an equipment icon and icon when worn now and make a sound when sheathed/unsheathed</li>
|
||||
</ul>
|
||||
<h3 class="author">Yakumo Chen updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="balance">Slime Jelly is no longer obtainable from slimepeople. Go ask Xenobio</li>
|
||||
</ul>
|
||||
<h3 class="author">YakumoChen updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="balance">To lower production costs, Buzz Fuzz is now manufactured with Real™️ Synthetic honey.</li>
|
||||
</ul>
|
||||
<h3 class="author">Zandario updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="code_imp">Added some framework for future species expansions, including clothing refitting.</li>
|
||||
<li class="refactor">Made majority of the relevant Species IDs and Categories pre-defined, also for easier expansion and use.</li>
|
||||
<li class="bugfix">lum slime sprites work again</li>
|
||||
<li class="code_imp">Slapped the Species Defines where relevant</li>
|
||||
</ul>
|
||||
<h3 class="author">corin9090 updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="tweak">The chaplain's prayer beads can now be worn on your belt slot</li>
|
||||
</ul>
|
||||
<h3 class="author">kappa-sama updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">super saiyan</li>
|
||||
<li class="tweak">ishotgun crafting recipe no longer requires plasteel and is slightly more convenient</li>
|
||||
<li class="balance">ishotgun does 45 damage now instead of 40.5</li>
|
||||
<li class="rscadd">s</li>
|
||||
<li class="rscadd">A new spell for the wizard and his martial apprentices, the Inner Mantra technique. It makes you punch people really good and makes you durable, but drains your energy while it's active.</li>
|
||||
<li class="rscadd">A self-buffing spell for valiant bubblegum slayers that is ultimately useless on lavaland and probably overpowered for miner antagonists. Go figure. At least all it does is let you punch hard while draining your health every second.</li>
|
||||
<li class="balance">bubblegum now drops a book that makes you into an abusive father instead of a shotgun that plays like pre-nerf shotguns</li>
|
||||
<li class="soundadd">a powerup and powerdown sound effect</li>
|
||||
<li class="imageadd">two icons for two buff spells</li>
|
||||
</ul>
|
||||
<h3 class="author">keronshb updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">Allows Energy Bola to be caught</li>
|
||||
<li class="balance">This also allows them to be dropped/picked up.</li>
|
||||
<li class="rscadd">Adds a reduced stamina buffer for SCarp users</li>
|
||||
<li class="rscadd">Gives SCarp users a better parry</li>
|
||||
<li class="rscadd">Adds the SCarp bundle which includes a bo staff</li>
|
||||
<li class="rscadd">Lets Carp costumes carry Bo Staffs</li>
|
||||
<li class="balance">reduces the stamina damage of scarp slightly</li>
|
||||
<li class="balance">reduced the blockchance of the bo staff</li>
|
||||
<li class="rscadd">Adds more room to northwest maint</li>
|
||||
<li class="rscadd">Adds a bridge between Atmos and the Turbine.</li>
|
||||
<li class="balance">Blob Resource Tower to 2 points per instead of 1 point per.</li>
|
||||
<li class="balance">Blob Factory Towers can be placed 5 tiles apart instead of 7.</li>
|
||||
<li class="bugfix">Fixes Blobbernaut Factories consuming Factories if no naut is chosen.</li>
|
||||
<li class="bugfix">Fixes Reflective Blobs</li>
|
||||
<li class="rscadd">Re-adds the Clown Car to the clown uplink</li>
|
||||
<li class="balance">15 >16 TC cost</li>
|
||||
<li class="balance">bonks on external airlocks</li>
|
||||
<li class="bugfix">Fixes the parry data for scarp</li>
|
||||
</ul>
|
||||
<h3 class="author">kittycat2002 updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">set the name of /datum/reagent/consumable/ethanol/species_drink to Species Drink</li>
|
||||
</ul>
|
||||
<h3 class="author">kiwedespars updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="balance">balanced bone gauntlets.</li>
|
||||
<li class="rscadd">the robust dildo weapon now has sound.</li>
|
||||
</ul>
|
||||
<h3 class="author">necromanceranne updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">Fixes various sprites for bokken, as well as being unable to craft certain parts and duplicate entries.</li>
|
||||
<li class="rscadd">Bokken now come in two lengths; full and wakizashi, and two varieties: wood and ironwood. They have different stats for all four.</li>
|
||||
<li class="rscadd">Bokken require menu crafting and part construction, as well as more complicated materials.</li>
|
||||
<li class="tweak">Bokken (long and short) require wood, cloth and leather to craft with a hatchet and screwdriver.</li>
|
||||
<li class="tweak">Ironwood bokken (long and short) require ironcap logs, cloth and leather to craft with a hatchet, screwdriver and welder.</li>
|
||||
<li class="balance">Twin sheathes can only fit a pair of blades (longsword + shortsword) or they can fit two shortswords.</li>
|
||||
<li class="bugfix">Fixed a twin sheath runtime.</li>
|
||||
<li class="imageadd">A lot of bokken related sprites received an overhaul. Added overlay sprites for weapons sheathed in the twin sheathes.</li>
|
||||
<li class="imageadd">The extradimensional blade received improved sprites for inhands/back sprites.</li>
|
||||
<li class="bugfix">You can now make all the variants of the bokken.</li>
|
||||
<li class="bugfix">Removes a duplicate sprite.</li>
|
||||
<li class="tweak">Renames all instances of 'ironwood' to 'steelwood'.</li>
|
||||
<li class="rscadd">Adds new roboticist labcoat sprites!</li>
|
||||
</ul>
|
||||
<h3 class="author">qwertyquerty updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">Flash the screen on climax</li>
|
||||
</ul>
|
||||
<h3 class="author">raspy-on-osu updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="spellcheck">salicylic acid</li>
|
||||
<li class="tweak">space heater heating range and power</li>
|
||||
<li class="tweak">windoor open length</li>
|
||||
</ul>
|
||||
<h3 class="author">shellspeed1 updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">Wings from Cit RP have been ported over</li>
|
||||
<li class="rscadd">Moth wings from cit have been ported over</li>
|
||||
<li class="bugfix">Cleaned up some pixels on existing moth wings.</li>
|
||||
<li class="tweak">Organized the lists for wings by if they are for moths or not and than by alphabetical.</li>
|
||||
<li class="balance">Lings now have infinite space for DNA.</li>
|
||||
<li class="rscadd">All xenomorph types have been added as corpses for mapping purposes</li>
|
||||
<li class="balance">The dead xenomorphs in the lavaland xenomorph hive now have more variety.</li>
|
||||
<li class="tweak">Floor bots are now buildable with all toolboxes.</li>
|
||||
<li class="rscadd">Xenomorph hybrids can now select wings ~~add: Xenomorph hybrids can now speak xenomorph~~</li>
|
||||
<li class="rscadd">Xenomorph tongues are available for customization.</li>
|
||||
<li class="rscadd">Mining borgs can claim points again</li>
|
||||
<li class="rscadd">Construction bags have been added, use them to carry all sorts of construction bits.</li>
|
||||
<li class="rscadd">A recipe has been added to cloth stacks to make material and construction bags.</li>
|
||||
<li class="balance">Material bags and construction bags are now available in engineering lockers.</li>
|
||||
<li class="rscadd">Adds the disposable sentry gun from tg for 11tc each.</li>
|
||||
<li class="rscadd">The exofab can now print prosthetic limbs</li>
|
||||
<li class="bugfix">The exofab was missing access to multiple cybernetic organs. This has now been rectified.</li>
|
||||
<li class="rscadd">A new recipe for a spicy has been given to us by a strange business man.</li>
|
||||
<li class="rscadd">The bluespace navigation gigabeacon design has been added to shuttle research for those wanting to take their ships around space more.</li>
|
||||
<li class="tweak">Xenomorph powers now list plasma cost in their description.</li>
|
||||
</ul>
|
||||
<h3 class="author">silicons updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="tweak">nanite resistances tweaked</li>
|
||||
<li class="rscadd">new nanite programs added for locking the user out from being modified by consoles or antivirals.</li>
|
||||
<li class="rscdel">anomalies no longer spawn in walls</li>
|
||||
<li class="rscadd">Twitch Plays: Clown Car</li>
|
||||
<li class="rscadd">pugilists can now parry</li>
|
||||
<li class="balance">c4 can no longer gib mobs</li>
|
||||
<li class="tweak">medium screens are better now</li>
|
||||
<li class="tweak">text formatting now uses one character instead of two around the text to emphasize.</li>
|
||||
<li class="rscadd">colormates</li>
|
||||
<li class="balance">shoving yourself up now costs 50% more</li>
|
||||
<li class="bugfix">dullahans enabled</li>
|
||||
<li class="rscadd">tailed individuals can now target groin to intertwine tails on grab intent.</li>
|
||||
<li class="rscadd">Clowns now have unpredictable effects on supermatter crystals when dusting from contact.</li>
|
||||
<li class="tweak">anyone new to the server is lucky enough to have their sprint default to toggle instead of hold</li>
|
||||
<li class="balance">stamina crit is only removed when at or under 100 stamina, rather than 140. stamina crit threshold is still at 140.</li>
|
||||
<li class="tweak">luxury shuttle no longer has noteleport</li>
|
||||
<li class="rscdel">now only poly gets a headset on spawn, not all birds.</li>
|
||||
<li class="tweak">the warp implant now actually warps you back 10 seconds. leaves a trail, though. now unlimited us.</li>
|
||||
<li class="bugfix">things in DEATHCOMA do not deathgasp on death</li>
|
||||
<li class="tweak">Meth and changeling adrenals no longer ignore all slowdowns, rather damage slowdowns.</li>
|
||||
<li class="rscadd">you can now be an angel using a magic mirror again</li>
|
||||
<li class="tweak">command headsets are 120% instead of 160%</li>
|
||||
<li class="bugfix">no more emote italics</li>
|
||||
<li class="rscadd">players can now respawn/return to lobby as a ghost after a 15 minute (default) delay and rejoin on another character with some/many restrictions</li>
|
||||
<li class="rscadd">cryo now preserves everything</li>
|
||||
<li class="bugfix">Magrifle ammo no longer glows.</li>
|
||||
<li class="tweak">temperature slowdown divisor nerfed to 35 from 20.</li>
|
||||
<li class="balance">dna melt drops all items being destroying you</li>
|
||||
<li class="bugfix">keybinds generate anti-collision bindings where necessary automatically now</li>
|
||||
<li class="balance">changeling combat mutations rebalanced. most of them take chemicals to upkeep now.</li>
|
||||
<li class="rscadd">set-pose has been added</li>
|
||||
<li class="tweak">temporary flavor text renamed to set pose, fully visible in examine</li>
|
||||
<li class="bugfix">ninja gloves no longer hardstun</li>
|
||||
<li class="balance">ninja gloves now cost half as much to use to compensate</li>
|
||||
<li class="bugfix">simple mobs are now immune to radioactive contamination</li>
|
||||
</ul>
|
||||
<h3 class="author">timothyteakettle updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">time for memory loss message to show up when being revived is now correctly 300 seconds, instead of 30</li>
|
||||
<li class="bugfix">the load away mission verb won't crash the server now</li>
|
||||
<li class="rscadd">roundstart slimes can turn into puddles now</li>
|
||||
<li class="rscadd">all gas masks (but welding + glass) can be alt clicked to show/hide identity</li>
|
||||
<li class="tweak">autosurgeons from travelling trader rewards now only have one use</li>
|
||||
<li class="bugfix">fixes held items proccing crossed when passing someone</li>
|
||||
<li class="tweak">you can now get a family heirlooms based off your species instead of job</li>
|
||||
<li class="tweak">changeling stings retract upon turning into a slime puddle</li>
|
||||
<li class="tweak">you cannot transform into a slime puddle with a no drop item in your hands</li>
|
||||
<li class="tweak">slime puddles are now transparent and their colour looks more natural in comparison to the user</li>
|
||||
<li class="tweak">slime puddles are now even slower</li>
|
||||
<li class="tweak">slime puddles now get no protection from worn clothing</li>
|
||||
<li class="rscdel">removes two debug messages left in from my prior eye customization pr</li>
|
||||
<li class="rscadd">adds unlockable loadout items, corresponding category in loadouts, etc</li>
|
||||
<li class="rscadd">added in-game age verification as an alternative to access requests</li>
|
||||
<li class="bugfix">disabling adminhelp noises no longer disables looc</li>
|
||||
<li class="bugfix">apids render now</li>
|
||||
<li class="bugfix">you can now only entwine tails with people who have a tail</li>
|
||||
<li class="bugfix">custom eyes and tongues now properly carry across cloning</li>
|
||||
<li class="rscadd">re-adds the holoform verb for people who want to use it over going through the char list</li>
|
||||
<li class="bugfix">eye sprites should look normal once more</li>
|
||||
<li class="rscadd">licking people washes pie off their face</li>
|
||||
<li class="rscadd">you can now pick your eye sprites from customization</li>
|
||||
<li class="tweak">looking at loadout equips loadout items on your preview image instead of job items</li>
|
||||
<li class="tweak">custom holoforms are now accessible through an action instead of through verbs</li>
|
||||
<li class="tweak">AI holoforms can now emote</li>
|
||||
<li class="tweak">cloning now correctly copies your blood colour, body sprite type and eye type</li>
|
||||
<li class="bugfix">species with NOTRANSSTING cannot have envy's knife used on them</li>
|
||||
<li class="rscadd">avian/digitigrade legs have been added for slimes</li>
|
||||
<li class="rscadd">you can teleport bread</li>
|
||||
<li class="tweak">slime puddles are no longer layered down one layer</li>
|
||||
<li class="tweak">you cannot tackle with two paralysed arms</li>
|
||||
<li class="tweak">tackling with a single paralysed arm lowers your tackle roll by 2</li>
|
||||
<li class="bugfix">circuits get pin data proc is sanitized when text is returned as data</li>
|
||||
<li class="rscadd">loadout now has save slot support and colour choosing/saving for polychromic items</li>
|
||||
<li class="rscadd">polychromic maid outfit</li>
|
||||
<li class="rscadd">you can rebind communication hotkeys and they're the default now</li>
|
||||
<li class="rscadd">you can now customize your size from 90% to 130%, going below 100% makes you have 10 less max health</li>
|
||||
<li class="rscadd">*squeak</li>
|
||||
<li class="rscadd">anthromorphic synth species</li>
|
||||
<li class="rscadd">improvements to the automatic age gate</li>
|
||||
<li class="tweak">antag items are now of critical importance and wont fail to be placed on the character</li>
|
||||
<li class="bugfix">a tonne of fixes to colourisation of parts, too many to name, including some sprite fixes</li>
|
||||
<li class="rscadd">things now have their own individual primary/(secondary)/(tertiary) colours as required, and these can be modified by you</li>
|
||||
</ul>
|
||||
<h3 class="author">uomo91 updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">Fixed "Show All" tab in player panel logs being broken.</li>
|
||||
<li class="bugfix">Whispers, OOC, and various other things display differently in logs, visually distinguishing them from say logs.</li>
|
||||
<li class="refactor">Player panel logs will now show all logs chronologically, so you'll see commingled say and attack logs if you're on the "Show All" tab, etc...</li>
|
||||
</ul>
|
||||
<h3 class="author">yorii updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">fixed botany rounding error that caused grass and other plants to misbehave</li>
|
||||
</ul>
|
||||
<h3 class="author">zeroisthebiggay updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="bugfix">legion now drops chests</li>
|
||||
<li class="rscadd">Traitor assistants can now purchase the patented POGBox! Put TC into it for even higher damage!</li>
|
||||
<li class="balance">MEGAFAUNA DROPS ARE LAVAPROOF</li>
|
||||
<li class="imageadd">cool codex cicatrix inhands</li>
|
||||
<li class="rscadd">gravitokinetic stands from tg</li>
|
||||
<li class="balance">buffs stands overall</li>
|
||||
<li class="bugfix">protector stands no longer become tposing invisible apes sometimes</li>
|
||||
<li class="bugfix">jacqueline spawns on boxstation</li>
|
||||
<li class="rscadd">secsheath for your cool stunsword at your local security vendor. you gotta hack it first though.</li>
|
||||
<li class="imageadd">fuck the r*d cr*ss</li>
|
||||
<li class="rscadd">The legion megafauna has been reworked. The fight should now be both slightly harder and faster.</li>
|
||||
<li class="balance">You can no longer cheese the colossus by being a sand golem and simply being immune.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<b>GoonStation 13 Development Team</b>
|
||||
|
||||
@@ -28851,3 +28851,90 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
|
||||
will show properly when the LTSRBT is built
|
||||
zeroisthebiggay:
|
||||
- rscadd: biodegrade works on legcuffs
|
||||
2021-03-25:
|
||||
zeroisthebiggay:
|
||||
- balance: strained muscles isn't free
|
||||
2021-03-26:
|
||||
BlueWildrose:
|
||||
- balance: Clothing no longer drops when shredded. It just becomes useless.
|
||||
- balance: Suit sensors are guaranteed to short out when the clothes become shredded,
|
||||
not damaged now.
|
||||
- balance: Uniform limb integrity increased from 30 to 120.
|
||||
- balance: 'Suit sensor damage has been added. The more damaged your suit sensors
|
||||
get, the less features that will be available from these suit sensors. It takes
|
||||
two e-sword hits to ruin your tracking beacon for instance. tweak: Examine text
|
||||
on uniforms is now more clear about needing cable coil to repair your suit sensors.'
|
||||
- bugfix: Fixed prisoner uniform sprite paths
|
||||
CuteMoff:
|
||||
- balance: Diamond's forcemod was changed from 1.1x to 1.2x
|
||||
Hatterhat:
|
||||
- rscadd: Lever-action rifles, chambered in .38, are now sitting in the code. They
|
||||
might be buyable from Cargo or the Black Market soon. Watch this space.
|
||||
- rscadd: Sawed-off shotguns now look like shotguns, but short, when inhand, instead
|
||||
of "generic gun".
|
||||
timothyteakettle:
|
||||
- bugfix: slimes can be delimbed
|
||||
- bugfix: the loadout now colours pet collars correctly
|
||||
2021-03-28:
|
||||
CuteMoff:
|
||||
- balance: Changed Strength Modifier from the default (1.0) too .7
|
||||
Hatterhat:
|
||||
- bugfix: As a heretic, shattering your blade no longer interferes with bluespace.
|
||||
Putnam3145:
|
||||
- rscadd: Threat tracking is now universal, rather than dynamic-only
|
||||
- rscadd: Slaughter demon event now increases weight based on how much blood there
|
||||
is.
|
||||
R3dtail:
|
||||
- rscdel: Removed ichor creates
|
||||
- balance: Removed ichor crates and adjusted crate rolling appropriately
|
||||
- balance: Removed the bonespear from the blackmarket uplink, and made EMP grenades
|
||||
harder to get from the same item.
|
||||
- rscadd: Added a description to the black market uplink
|
||||
Shadow-Quill:
|
||||
- imageadd: Added small versions of the walk icon for all hud styles, except Retro.
|
||||
dzahlus:
|
||||
- rscadd: Added radial menu to joy mask for alt reskins
|
||||
- imageadd: added pensive, angry and flushed sprites to joy mask
|
||||
keronshb:
|
||||
- balance: Radioactive microlasers can no longer knock out creatures who are immune
|
||||
to the effects of radiation.
|
||||
- bugfix: The radioactive microlaser now calculates the strength of its delay effect
|
||||
using the intensity setting it had when you initially used it on your victim,
|
||||
not the intensity setting it currently has. This prevents people from "cheating
|
||||
out" its intensity 20 effect with only a 2 second delay and a 1 second cooldown.
|
||||
- balance: Radioactive microlasers no longer contain twice as much metal as normal
|
||||
health analyzers do.
|
||||
necromanceranne:
|
||||
- rscadd: Replaces the useless bullet and laser shields with new Kinetic and Ablative
|
||||
shields, which do as they advertise.
|
||||
- rscadd: Replaces the shield implants shield with a hardlight shield that can take
|
||||
large amounts of brute damage, but disintegrates when shot with disablers.
|
||||
- bugfix: Fixes Fake Roman Shields being able to be used as normal riot shields.
|
||||
- bugfix: Fixes nonlethal/non-physical damage types destroying shields. (stamina,
|
||||
toxins, oxygen, clone, brain)
|
||||
- bugfix: Fixes tower shields not doing anything, while also giving them intergrity
|
||||
to match their advertised durability.
|
||||
- bugfix: Uses additional flags to determine what kind effects work well and what
|
||||
works poorly against various shields.
|
||||
timothyteakettle:
|
||||
- rscadd: ghost cafe residents can now disguise themselves as any mob or object
|
||||
- bugfix: fixes character preview not updating when selecting the loadout tab
|
||||
zeroisthebiggay:
|
||||
- rscadd: triple kitsune tail
|
||||
2021-03-29:
|
||||
BlueWildrose:
|
||||
- bugfix: Fixed being unable to fix suit sensors if damaged at all unless destroyed
|
||||
completely
|
||||
YakumoChen:
|
||||
- rscadd: A less-than-new Syndicate bundle that reminds you of the good old days
|
||||
when we didn't need all those newfangled traitor items the young-uns get. We
|
||||
had 6 items in the uplink and we had Monkey in rotation and by god we made do.
|
||||
qweq12yt:
|
||||
- rscadd: Added Earmuffs
|
||||
- rscadd: Added Random Drink
|
||||
- rscadd: Added Clear PDA
|
||||
- rscadd: Added Internals Box
|
||||
- rscadd: Added Meson Goggles
|
||||
- rscadd: Added Smoke Grenade
|
||||
silicons:
|
||||
- bugfix: automated hydroponics system design now works properly
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
author: "zeroisthebiggay"
|
||||
delete-after: True
|
||||
changes:
|
||||
- balance: "strained muscles isn't free"
|
||||
|
Before Width: | Height: | Size: 51 KiB After Width: | Height: | Size: 50 KiB |
|
Before Width: | Height: | Size: 49 KiB After Width: | Height: | Size: 50 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 60 KiB |
|
Before Width: | Height: | Size: 63 KiB After Width: | Height: | Size: 64 KiB |
|
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 40 KiB |
|
Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 48 KiB |
|
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 5.7 KiB |
@@ -21,6 +21,8 @@
|
||||
/datum/gear/neck/collar
|
||||
name = "Collar"
|
||||
path = /obj/item/clothing/neck/petcollar
|
||||
loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC
|
||||
loadout_initial_colors = list("#00BBBB")
|
||||
|
||||
/datum/gear/neck/leathercollar
|
||||
name = "Leather collar"
|
||||
|
||||
|
Before Width: | Height: | Size: 68 KiB After Width: | Height: | Size: 69 KiB |
|
Before Width: | Height: | Size: 4.6 KiB After Width: | Height: | Size: 5.1 KiB |
|
Before Width: | Height: | Size: 7.1 KiB After Width: | Height: | Size: 7.2 KiB |
|
Before Width: | Height: | Size: 6.8 KiB After Width: | Height: | Size: 6.9 KiB |
|
Before Width: | Height: | Size: 6.3 KiB After Width: | Height: | Size: 6.4 KiB |
|
Before Width: | Height: | Size: 6.0 KiB After Width: | Height: | Size: 6.2 KiB |
@@ -90,7 +90,7 @@ As the Chief Engineer, you can rename areas or create entirely new ones using yo
|
||||
As the Chief Engineer, your hardsuit is significantly better than everybody else's. It has the best features of both engineering and atmospherics hardsuits - boasting nigh-invulnerability to radiation and all atmospheric conditions.
|
||||
As the Chief Engineer, you can spy on and even forge PDA communications with the message monitor console! The key is in your office.
|
||||
As the Chief Engineer, your locker contains a jetpack upgrade that can be attached to hardsuits.
|
||||
As the Chief Engineer, the power flow control console in your office will show you APC infos and lets you control them remotely.
|
||||
As the Chief Engineer, the power flow control console in your office will show you APC infos and lets you control them remotely.
|
||||
As an Engineer, the supermatter shard is an extremely dangerous piece of equipment: touching it will disintegrate you.
|
||||
As an Engineer, you can electrify grilles by placing wire "nodes" beneath them: the big seemingly unconnected bulges from a half completed wiring job.
|
||||
As an Engineer, return to Engineering once in a while to check on the engine and SMES cells. It's always a good idea to make sure containment isn't compromised.
|
||||
@@ -112,7 +112,7 @@ As an Atmospheric Technician, your backpack firefighter tank can launch resin. T
|
||||
As an Atmospheric Technician, your ATMOS holofan projectors can blocks gases and heat while allowing objects to pass through. With it, you can quickly contain gas spills, fires and hull breaches. Or, use it to create a plasmaman friendly lounge.
|
||||
As an Atmospheric Technician, burning a plasma/oxygen mix inside the incinerator will not only produce power, but also gases such as tritium and water vapor.
|
||||
As an Atmospheric Technician, you can change the layer of a pipe by clicking with it on a wrenched pipe or other atmos component of the desired layer.
|
||||
As an Atmospheric Technician, you can take a few cans worth of N2/N2O and cool it down at local freezers. This is a good idea when dealing with (or preparing for) a supermatter meltdown.
|
||||
As an Atmospheric Technician, you can take a few cans worth of N2/N2O and cool it down at local freezers. This is a good idea when dealing with (or preparing for) a supermatter meltdown.
|
||||
As the Head of Security, you are expected to coordinate your security force to handle any threat that comes to the station. Sometimes it means making use of the armory to handle a blob, sometimes it means being ruthless during a revolution or cult.
|
||||
As the Head of Security, you can call for executions or forced cyborgization, but may require the Captain's approval.
|
||||
As the Head of Security, don't let the power go to your head. You may have high access, great equipment, and a miniature army at your side, but being a terrible person without a good reason is grounds for banning.
|
||||
@@ -121,14 +121,14 @@ As the Warden, keep a close eye on the armory at all times, as it is a favored s
|
||||
As the Warden, if a prisoner's crimes are heinous enough you can put them in permabrig or the gulag. Make sure to check on them once in a while!
|
||||
As the Warden, never underestimate the power of tech slugs! Scattershot fires a cone of weaker lasers with little damage fall off, Ion slugs fires EMPs that only effect the tiles they hit, and Pulse slugs fire a singular laser that can one-hit almost any wall!
|
||||
As the Warden, you can use a surgical saw on riot shotguns to shorten the barrel, making them able to fit in your backpack. Make sure to empty them prior lest you blast yourself in the face!
|
||||
As the Warden, you can implant criminals you suspect might re-offend with devices that will track their location and allow you to remotely inject them with disabling chemicals.
|
||||
As the Warden, you can implant criminals you suspect might re-offend with devices that will track their location and allow you to remotely inject them with disabling chemicals.
|
||||
As the Warden, you can use handcuffs on orange prisoner shoes to turn them into cuffed shoes, forcing prisoners to walk and potentially thwarting an escape.
|
||||
As the Warden, tracker implants can be used on crewmembers. Doing this will let you track their person even without suit sensors and even instantly teleport to them at the local teleporter, although the implant will biodegrade after 5 minutes if its holder ever expires.
|
||||
As the Warden, cryostasis shotgun darts hold 10u of chemicals that will not react until it hits someone.
|
||||
As the Warden, chemical implants can be loaded with a cocktail of healing or combat chems, perfect for the HoS or other security officers to make use of in a pinch. Be sure to keep a eye on them though, as they cannot be injected without the prisoner management console! EMPs or starvation might lead to the chemical implant going off preemptively.
|
||||
As the Warden, tracker implants can be used on your security officers. Doing this will let you be able to message them when telecomms are out, or when you suspect comms are compromised. This is also good against rogue AIs as the prisoner tracker doesn't leave logs or alarms for the AI.
|
||||
As a Security Officer, remember that correlation does not equal causation. Someone may have just been at the wrong place at the wrong time!
|
||||
As a Security Officer, remember that your belt can hold more than one stun baton.
|
||||
As a Security Officer, remember that your belt can hold more than one stun baton.
|
||||
As a Security Officer, remember harm beating someone in the head with a blunt object can deconvert them form a being a revolutionary! This sadly doesn't work against either cult, nor does this protect them from getting reconverted unlike a mindshield implant.
|
||||
As a Security Officer, remember that you can attach a seclite to your taser or your helmet!
|
||||
As a Security Officer, communicate and coordinate with your fellow officers using the security channel (:s) to avoid confusion.
|
||||
@@ -283,7 +283,7 @@ As a Ghost, you can double click on just about anything to follow it. Or just wa
|
||||
As a Ghost, there's a button in the OOC tab labeled Observe, it lets you see through someone's eyes as if you were the one who's playing them.
|
||||
As a Devil, you gain power for every three souls you control, however you also become more obvious.
|
||||
As a Devil, as long as you control at least one other soul, you will automatically resurrect, as long as a banishment ritual is not performed.
|
||||
At which time a Devil's nameth is spake on the tongue of man, the Devil may appeareth.
|
||||
At which time a Devil's nameth is spake on the tongue of man, the Devil may appeareth.
|
||||
You can swap floor tiles by holding a crowbar in one hand and a stack of tiles in the other.
|
||||
When hacking doors, cutting and mending a "test light wire" will restore power to the door.
|
||||
When crafting most items, you can either manually combine parts or use the crafting menu.
|
||||
@@ -301,3 +301,5 @@ Being out of combat mode makes makes you deal less damage to people and objects
|
||||
Resting makes you deal less damage to people and objects when attacking. This stacks with the penalty incurred by being out of combat mode.
|
||||
You do not regenerate as much stamina while in combat mode. Resting (being on the ground) makes you regenerate stamina faster.
|
||||
Keybinds can be reassigned in character setup on the keybindings tab. This is extremely useful, especially if you know how to use independent binds.
|
||||
If your suit sensors have been shorted out, you can use cable coil to fix them by using the coil on your suit. Your suit needs to be in proper condition, however.
|
||||
Most clothing when damaged can be repaired using cloth, but there may be some clothes out there that will require different stacks of materials.
|
||||
|
||||
@@ -303,6 +303,7 @@
|
||||
#include "code\controllers\configuration\entries\stamina_combat.dm"
|
||||
#include "code\controllers\subsystem\achievements.dm"
|
||||
#include "code\controllers\subsystem\acid.dm"
|
||||
#include "code\controllers\subsystem\activity.dm"
|
||||
#include "code\controllers\subsystem\adjacent_air.dm"
|
||||
#include "code\controllers\subsystem\air.dm"
|
||||
#include "code\controllers\subsystem\air_turfs.dm"
|
||||
|
||||
@@ -323,12 +323,14 @@ function handle_pr($payload) {
|
||||
set_labels($payload, $labels, $remove);
|
||||
if($no_changelog)
|
||||
check_dismiss_changelog_review($payload);
|
||||
/*
|
||||
if(get_pr_code_friendliness($payload) <= 0){
|
||||
$balances = pr_balances();
|
||||
$author = $payload['pull_request']['user']['login'];
|
||||
if(isset($balances[$author]) && $balances[$author] < 0 && !is_maintainer($payload, $author))
|
||||
create_comment($payload, 'You currently have a negative Fix/Feature pull request delta of ' . $balances[$author] . '. Maintainers may close this PR at will. Fixing issues or improving the codebase will improve this score.');
|
||||
}
|
||||
*/
|
||||
break;
|
||||
case 'edited':
|
||||
check_dismiss_changelog_review($payload);
|
||||
|
||||
@@ -3,5 +3,5 @@ bidict==0.13.1
|
||||
Pillow==8.1.1
|
||||
|
||||
# changelogs
|
||||
PyYaml==5.3.1
|
||||
PyYaml==5.4
|
||||
beautifulsoup4==4.9.3
|
||||
|
||||