Merge branch 'master' of https://github.com/Citadel-Station-13/Citadel-Station-13 into the-fuck-am-i-doing
This commit is contained in:
@@ -153,18 +153,20 @@ GLOBAL_LIST_INIT(ai_core_display_screens, list(
|
||||
"Yes-Man"
|
||||
))
|
||||
|
||||
/proc/resolve_ai_icon(input)
|
||||
/proc/resolve_ai_icon(input, radial_preview = FALSE)
|
||||
if(!input || !(input in GLOB.ai_core_display_screens))
|
||||
return "ai"
|
||||
else
|
||||
if(input == "Random")
|
||||
input = pick(GLOB.ai_core_display_screens - "Random")
|
||||
if(input == "Portrait")
|
||||
var/datum/portrait_picker/tgui = new(usr)//create the datum
|
||||
tgui.ui_interact(usr)//datum has a tgui component, here we open the window
|
||||
return "ai-portrait" //just take this until they decide
|
||||
if(radial_preview)
|
||||
return "ai-[lowertext(input)]"
|
||||
|
||||
if(input == "Random")
|
||||
input = pick(GLOB.ai_core_display_screens - "Random")
|
||||
if(input == "Portrait")
|
||||
var/datum/portrait_picker/tgui = new(usr)//create the datum
|
||||
tgui.ui_interact(usr)//datum has a tgui component, here we open the window
|
||||
return "ai-portrait" //just take this until they decide
|
||||
return "ai-[lowertext(input)]"
|
||||
|
||||
GLOBAL_LIST_INIT(security_depts_prefs, list(SEC_DEPT_RANDOM, SEC_DEPT_NONE, SEC_DEPT_ENGINEERING, SEC_DEPT_MEDICAL, SEC_DEPT_SCIENCE, SEC_DEPT_SUPPLY))
|
||||
|
||||
//Backpacks
|
||||
|
||||
@@ -425,6 +425,7 @@ Example config:
|
||||
var/list/min_pop = Get(/datum/config_entry/keyed_list/min_pop)
|
||||
var/list/max_pop = Get(/datum/config_entry/keyed_list/max_pop)
|
||||
var/list/repeated_mode_adjust = Get(/datum/config_entry/number_list/repeated_mode_adjust)
|
||||
var/desired_chaos_level = 9 - SSpersistence.get_recent_chaos()
|
||||
for(var/T in gamemode_cache)
|
||||
var/datum/game_mode/M = new T()
|
||||
if(!(M.config_tag in modes))
|
||||
@@ -449,6 +450,17 @@ Example config:
|
||||
adjustment += repeated_mode_adjust[recent_round]
|
||||
recent_round = SSpersistence.saved_modes.Find(M.config_tag,recent_round+1,0)
|
||||
final_weight *= max(0,((100-adjustment)/100))
|
||||
if(Get(/datum/config_entry/flag/weigh_by_recent_chaos))
|
||||
var/chaos_level = M.get_chaos()
|
||||
var/exponent = Get(/datum/config_entry/number/chaos_exponent)
|
||||
var/delta = chaos_level - desired_chaos_level
|
||||
if(desired_chaos_level > 5)
|
||||
delta = abs(min(delta, 0))
|
||||
else if(desired_chaos_level < 5)
|
||||
delta = max(delta, 0)
|
||||
else
|
||||
delta = abs(delta)
|
||||
final_weight /= (delta + 1) ** exponent
|
||||
runnable_modes[M] = final_weight
|
||||
return runnable_modes
|
||||
|
||||
|
||||
@@ -7,6 +7,13 @@
|
||||
/datum/config_entry/keyed_list/probability/ValidateListEntry(key_name)
|
||||
return key_name in config.modes
|
||||
|
||||
/datum/config_entry/keyed_list/chaos_level
|
||||
key_mode = KEY_MODE_TEXT
|
||||
value_mode = VALUE_MODE_NUM
|
||||
|
||||
/datum/config_entry/keyed_list/chaos_level/ValidateListEntry(key_name)
|
||||
return key_name in config.modes
|
||||
|
||||
/datum/config_entry/keyed_list/max_pop
|
||||
key_mode = KEY_MODE_TEXT
|
||||
value_mode = VALUE_MODE_NUM
|
||||
@@ -596,3 +603,8 @@
|
||||
/// Dirtyness multiplier for making turfs dirty
|
||||
/datum/config_entry/number/turf_dirty_multiplier
|
||||
config_entry_value = 1
|
||||
|
||||
/datum/config_entry/flag/weigh_by_recent_chaos
|
||||
|
||||
/datum/config_entry/number/chaos_exponent
|
||||
config_entry_value = 1
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
*/
|
||||
/datum/controller/subsystem/persistence
|
||||
var/list/saved_modes = list(1,2,3)
|
||||
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
|
||||
@@ -20,6 +21,7 @@
|
||||
/datum/controller/subsystem/persistence/LoadServerPersistence()
|
||||
. = ..()
|
||||
LoadRecentModes()
|
||||
LoadRecentChaos()
|
||||
LoadRecentStorytellers()
|
||||
LoadRecentRulesets()
|
||||
LoadRecentMaps()
|
||||
@@ -33,6 +35,14 @@
|
||||
file_data["data"] = saved_modes
|
||||
fdel(json_file)
|
||||
WRITE_FILE(json_file, json_encode(file_data))
|
||||
saved_chaos[3] = saved_chaos[2]
|
||||
saved_chaos[2] = saved_chaos[1]
|
||||
saved_chaos[1] = SSticker.mode.get_chaos()
|
||||
json_file = file("data/RecentChaos.json")
|
||||
file_data = list()
|
||||
file_data["data"] = saved_chaos
|
||||
fdel(json_file)
|
||||
WRITE_FILE(json_file, json_encode(file_data))
|
||||
|
||||
/datum/controller/subsystem/persistence/proc/CollectStoryteller(var/datum/game_mode/dynamic/mode)
|
||||
saved_storytellers.len = 3
|
||||
@@ -76,6 +86,15 @@
|
||||
return
|
||||
saved_modes = json["data"]
|
||||
|
||||
/datum/controller/subsystem/persistence/proc/LoadRecentChaos()
|
||||
var/json_file = file("data/RecentChaos.json")
|
||||
if(!fexists(json_file))
|
||||
return
|
||||
var/list/json = json_decode(file2text(json_file))
|
||||
if(!json)
|
||||
return
|
||||
saved_chaos = json["data"]
|
||||
|
||||
/datum/controller/subsystem/persistence/proc/LoadRecentRulesets()
|
||||
var/json_file = file("data/RecentRulesets.json")
|
||||
if(!fexists(json_file))
|
||||
@@ -105,3 +124,9 @@
|
||||
if(!json)
|
||||
return
|
||||
saved_maps = json["maps"]
|
||||
|
||||
/datum/controller/subsystem/persistence/proc/get_recent_chaos()
|
||||
var/sum = 0
|
||||
for(var/n in saved_chaos)
|
||||
sum += n
|
||||
return sum/length(saved_chaos)
|
||||
|
||||
@@ -153,7 +153,7 @@ GLOBAL_LIST_EMPTY(family_heirlooms)
|
||||
name = "Light Sensitivity"
|
||||
desc = "Bright lights irritate you. Your eyes start to water, your skin feels itchy against the photon radiation, and your hair gets dry and frizzy. Maybe it's a medical condition. If only Nanotrasen was more considerate of your needs..."
|
||||
value = -1
|
||||
gain_text = "<span class='danger'>The safty of light feels off...</span>"
|
||||
gain_text = "<span class='danger'>Bright lights seem irritating.</span>"
|
||||
lose_text = "<span class='notice'>Enlightening.</span>"
|
||||
medical_record_text = "Despite my warnings, the patient refuses turn on the lights, only to end up rolling down a full flight of stairs and into the cellar."
|
||||
|
||||
|
||||
@@ -331,6 +331,7 @@
|
||||
return
|
||||
. = anchored
|
||||
anchored = anchorvalue
|
||||
SEND_SIGNAL(src, COMSIG_OBJ_SETANCHORED, anchorvalue)
|
||||
// SEND_SIGNAL(src, COMSIG_MOVABLE_SET_ANCHORED, anchorvalue)
|
||||
|
||||
/atom/movable/proc/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
traitor_name = "Bloodsucker"
|
||||
antag_flag = ROLE_BLOODSUCKER
|
||||
false_report_weight = 1
|
||||
chaos = 4
|
||||
restricted_jobs = list("AI","Cyborg")
|
||||
protected_jobs = list("Chaplain", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster")
|
||||
required_players = 20
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
name = "traitor+brothers"
|
||||
config_tag = "traitorbro"
|
||||
required_players = 25
|
||||
chaos = 5
|
||||
restricted_jobs = list("AI", "Cyborg")
|
||||
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster")
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@ GLOBAL_VAR(changeling_team_objective_type) //If this is not null, we hand our th
|
||||
config_tag = "changeling"
|
||||
antag_flag = ROLE_CHANGELING
|
||||
false_report_weight = 10
|
||||
chaos = 5
|
||||
restricted_jobs = list("AI", "Cyborg")
|
||||
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster") //citadel change - adds HoP, CE, CMO, and RD to ling role blacklist
|
||||
required_players = 15
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
name = "traitor+changeling"
|
||||
config_tag = "traitorchan"
|
||||
false_report_weight = 10
|
||||
chaos = 6
|
||||
traitors_possible = 3 //hard limit on traitors if scaling is turned off
|
||||
restricted_jobs = list("AI", "Cyborg")
|
||||
required_players = 25
|
||||
|
||||
@@ -134,6 +134,7 @@ Credit where due:
|
||||
config_tag = "clockwork_cult"
|
||||
antag_flag = ROLE_SERVANT_OF_RATVAR
|
||||
false_report_weight = 10
|
||||
chaos = 8
|
||||
required_players = 24 //Fixing this directly for now since apparently config machine for forcing modes broke.
|
||||
required_enemies = 3
|
||||
recommended_enemies = 5
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/datum/game_mode/nuclear/clown_ops
|
||||
name = "clown ops"
|
||||
config_tag = "clownops"
|
||||
|
||||
chaos = 8
|
||||
announce_span = "danger"
|
||||
announce_text = "Clown empire forces are approaching the station in an attempt to HONK it!\n\
|
||||
<span class='danger'>Operatives</span>: Secure the nuclear authentication disk and use your bananium fission explosive to HONK the station.\n\
|
||||
|
||||
@@ -38,6 +38,7 @@
|
||||
config_tag = "cult"
|
||||
antag_flag = ROLE_CULTIST
|
||||
false_report_weight = 10
|
||||
chaos = 8
|
||||
restricted_jobs = list("AI", "Cyborg")
|
||||
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster")
|
||||
required_players = 30
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
/datum/game_mode/devil/devil_agents
|
||||
name = "Devil Agents"
|
||||
config_tag = "devil_agents"
|
||||
chaos = 5
|
||||
required_players = 25
|
||||
required_enemies = 3
|
||||
recommended_enemies = 8
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
config_tag = "devil"
|
||||
antag_flag = ROLE_DEVIL
|
||||
false_report_weight = 1
|
||||
chaos = 3
|
||||
protected_jobs = list("Lawyer", "Curator", "Chaplain", "Head of Security", "Captain", "AI")
|
||||
required_players = 0
|
||||
required_enemies = 1
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
config_tag = "heresy"
|
||||
antag_flag = ROLE_HERETIC
|
||||
false_report_weight = 5
|
||||
chaos = 5
|
||||
restricted_jobs = list("AI", "Cyborg")
|
||||
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster") //citadel change - adds HoP, CE, CMO, and RD to heretic role blacklist
|
||||
required_players = 15
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
config_tag = "secret_extended"
|
||||
false_report_weight = 5
|
||||
required_players = 0
|
||||
chaos = 0
|
||||
|
||||
announce_span = "notice"
|
||||
announce_text = "Just have fun and enjoy the game!"
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
var/config_tag = null
|
||||
var/votable = 1
|
||||
var/probability = 0
|
||||
var/chaos = 5 // 0-9, used for weighting round-to-round
|
||||
var/false_report_weight = 0 //How often will this show up incorrectly in a centcom report?
|
||||
var/station_was_nuked = 0 //see nuclearbomb.dm and malfunction.dm
|
||||
var/nuke_off_station = 0 //Used for tracking where the nuke hit
|
||||
@@ -623,3 +624,10 @@
|
||||
/// Mode specific info for ghost game_info
|
||||
/datum/game_mode/proc/ghost_info()
|
||||
return
|
||||
|
||||
/datum/game_mode/proc/get_chaos()
|
||||
var/chaos_levels = CONFIG_GET(keyed_list/chaos_level)
|
||||
if(config_tag in chaos_levels)
|
||||
return chaos_levels[config_tag]
|
||||
else
|
||||
return chaos
|
||||
|
||||
@@ -6,6 +6,7 @@ GLOBAL_LIST_EMPTY(gangs)
|
||||
name = "gang war"
|
||||
config_tag = "gang"
|
||||
antag_flag = ROLE_GANG
|
||||
chaos = 9
|
||||
restricted_jobs = list("AI", "Cyborg")
|
||||
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster")
|
||||
required_players = 15
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
name = "meteor"
|
||||
config_tag = "meteor"
|
||||
false_report_weight = 1
|
||||
chaos = 9
|
||||
var/meteordelay = 2000
|
||||
var/nometeors = 0
|
||||
var/rampupdelta = 5
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
required_players = 20
|
||||
required_enemies = 1
|
||||
recommended_enemies = 1
|
||||
chaos = 9
|
||||
|
||||
restricted_jobs = list("Cyborg", "AI")
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
name = "nuclear emergency"
|
||||
config_tag = "nuclear"
|
||||
false_report_weight = 10
|
||||
chaos = 9
|
||||
required_players = 28 // 30 players - 3 players to be the nuke ops = 25 players remaining
|
||||
required_enemies = 2
|
||||
recommended_enemies = 5
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
name = "overthrow"
|
||||
config_tag = "overthrow"
|
||||
antag_flag = ROLE_OVERTHROW
|
||||
chaos = 5
|
||||
restricted_jobs = list("AI", "Cyborg")
|
||||
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster")
|
||||
required_players = 20 // the core idea is of a swift, bloodless coup, so it shouldn't be as chaotic as revs.
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
config_tag = "revolution"
|
||||
antag_flag = ROLE_REV
|
||||
false_report_weight = 10
|
||||
chaos = 8
|
||||
restricted_jobs = list("AI", "Cyborg")
|
||||
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster")
|
||||
required_players = 20
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
required_enemies = 5
|
||||
recommended_enemies = 8
|
||||
reroll_friendly = 0
|
||||
chaos = 7
|
||||
traitor_name = "Nanotrasen Internal Affairs Agent"
|
||||
antag_flag = ROLE_INTERNAL_AFFAIRS
|
||||
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
recommended_enemies = 4
|
||||
reroll_friendly = 1
|
||||
enemy_minimum_age = 0
|
||||
chaos = 2
|
||||
|
||||
announce_span = "danger"
|
||||
announce_text = "There are Syndicate agents on the station!\n\
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
recommended_enemies = 1
|
||||
enemy_minimum_age = 7
|
||||
round_ends_with_antag_death = 1
|
||||
chaos = 9
|
||||
announce_span = "danger"
|
||||
announce_text = "There is a space wizard attacking the station!\n\
|
||||
<span class='danger'>Wizard</span>: Accomplish your objectives and cause mayhem on the station.\n\
|
||||
|
||||
@@ -137,7 +137,7 @@ Class Procs:
|
||||
GLOB.machines += src
|
||||
|
||||
if(ispath(circuit, /obj/item/circuitboard))
|
||||
circuit = new circuit
|
||||
circuit = new circuit(src)
|
||||
circuit.apply_default_parts(src)
|
||||
|
||||
if(!speed_process && init_process)
|
||||
@@ -361,11 +361,11 @@ Class Procs:
|
||||
/obj/machinery/deconstruct(disassembled = TRUE)
|
||||
if(!(flags_1 & NODECONSTRUCT_1))
|
||||
on_deconstruction()
|
||||
if(component_parts && component_parts.len)
|
||||
if(LAZYLEN(component_parts))
|
||||
spawn_frame(disassembled)
|
||||
for(var/obj/item/I in component_parts)
|
||||
I.forceMove(loc)
|
||||
component_parts.Cut()
|
||||
LAZYCLEARLIST(component_parts)
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/proc/spawn_frame(disassembled)
|
||||
@@ -539,12 +539,17 @@ Class Procs:
|
||||
|
||||
/obj/machinery/Exited(atom/movable/AM, atom/newloc)
|
||||
. = ..()
|
||||
// if(AM == occupant)
|
||||
// set_occupant(null)
|
||||
if (AM == occupant)
|
||||
SEND_SIGNAL(src, COMSIG_MACHINE_EJECT_OCCUPANT, occupant)
|
||||
occupant = null
|
||||
if(AM == circuit && circuit.loc != src)
|
||||
component_parts -= AM //TODO: make the cmp part functions use lazyX
|
||||
circuit = null
|
||||
|
||||
/obj/machinery/proc/adjust_item_drop_location(atom/movable/AM) // Adjust item drop location to a 3x3 grid inside the tile, returns slot id from 0 to 8
|
||||
var/md5 = md5(AM.name) // Oh, and it's deterministic too. A specific item will always drop from the same slot.
|
||||
/obj/machinery/proc/adjust_item_drop_location(atom/movable/AM) // Adjust item drop location to a 3x3 grid inside the tile, returns slot id from 0 to 8
|
||||
var/md5 = md5(AM.name) // Oh, and it's deterministic too. A specific item will always drop from the same slot.
|
||||
for (var/i in 1 to 32)
|
||||
. += hex2num(md5[i])
|
||||
. = . % 9
|
||||
|
||||
@@ -17,20 +17,16 @@
|
||||
|
||||
/obj/machinery/computer/Initialize(mapload, obj/item/circuitboard/C)
|
||||
. = ..()
|
||||
|
||||
power_change()
|
||||
if(!QDELETED(C))
|
||||
qdel(circuit)
|
||||
circuit = C
|
||||
C.moveToNullspace()
|
||||
|
||||
/obj/machinery/computer/Destroy()
|
||||
QDEL_NULL(circuit)
|
||||
return ..()
|
||||
. = ..()
|
||||
|
||||
/obj/machinery/computer/process()
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
return 0
|
||||
return 1
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/computer/ratvar_act()
|
||||
if(!clockwork)
|
||||
@@ -87,25 +83,32 @@
|
||||
switch(damage_type)
|
||||
if(BRUTE)
|
||||
if(stat & BROKEN)
|
||||
playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1)
|
||||
playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 70, TRUE)
|
||||
else
|
||||
playsound(src.loc, 'sound/effects/glasshit.ogg', 75, 1)
|
||||
playsound(src.loc, 'sound/effects/glasshit.ogg', 75, TRUE)
|
||||
if(BURN)
|
||||
playsound(src.loc, 'sound/items/welder.ogg', 100, 1)
|
||||
playsound(src.loc, 'sound/items/welder.ogg', 100, TRUE)
|
||||
|
||||
/obj/machinery/computer/obj_break(damage_flag)
|
||||
if(circuit && !(flags_1 & NODECONSTRUCT_1)) //no circuit, no breaking
|
||||
if(!(stat & BROKEN))
|
||||
playsound(loc, 'sound/effects/glassbr3.ogg', 100, 1)
|
||||
stat |= BROKEN
|
||||
update_icon()
|
||||
set_light(0)
|
||||
if(!circuit) //no circuit, no breaking
|
||||
return
|
||||
. = ..()
|
||||
if(. && !(stat & BROKEN))
|
||||
stat |= BROKEN
|
||||
playsound(loc, 'sound/effects/glassbr3.ogg', 100, TRUE)
|
||||
set_light(0)
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/computer/emp_act(severity)
|
||||
. = ..()
|
||||
if (!(. & EMP_PROTECT_SELF))
|
||||
if(prob(severity/1.8))
|
||||
obj_break("energy")
|
||||
switch(severity)
|
||||
if(1)
|
||||
if(prob(50))
|
||||
obj_break("energy")
|
||||
if(2)
|
||||
if(prob(10))
|
||||
obj_break("energy")
|
||||
|
||||
/obj/machinery/computer/deconstruct(disassembled = TRUE, mob/user)
|
||||
on_deconstruction()
|
||||
@@ -114,12 +117,14 @@
|
||||
var/obj/structure/frame/computer/A = new /obj/structure/frame/computer(src.loc)
|
||||
A.setDir(dir)
|
||||
A.circuit = circuit
|
||||
A.setAnchored(TRUE)
|
||||
// Circuit removal code is handled in /obj/machinery/Exited()
|
||||
circuit.forceMove(A)
|
||||
A.set_anchored(TRUE)
|
||||
if(stat & BROKEN)
|
||||
if(user)
|
||||
to_chat(user, "<span class='notice'>The broken glass falls out.</span>")
|
||||
else
|
||||
playsound(src, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1)
|
||||
playsound(src, 'sound/effects/hit_on_shattered_glass.ogg', 70, TRUE)
|
||||
new /obj/item/shard(drop_location())
|
||||
new /obj/item/shard(drop_location())
|
||||
A.state = 3
|
||||
@@ -129,8 +134,11 @@
|
||||
to_chat(user, "<span class='notice'>You disconnect the monitor.</span>")
|
||||
A.state = 4
|
||||
A.icon_state = "4"
|
||||
circuit = null
|
||||
for(var/obj/C in src)
|
||||
C.forceMove(loc)
|
||||
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/computer/AltClick(mob/user)
|
||||
. = ..()
|
||||
if(!user.canUseTopic(src, !issilicon(user)) || !(stat & (NOPOWER|BROKEN)))
|
||||
return
|
||||
|
||||
@@ -243,13 +243,14 @@
|
||||
|
||||
// Check if the user can use it.
|
||||
/obj/machinery/telecomms/proc/canInteract(mob/user)
|
||||
var/get = user.get_active_held_item()
|
||||
var/obj/item/I = get
|
||||
if(I.tool_behaviour == TOOL_MULTITOOL)
|
||||
return TRUE
|
||||
var/obj/item/I = user.get_active_held_item()
|
||||
if(!issilicon(user) && I)
|
||||
if(I.tool_behaviour == TOOL_MULTITOOL)
|
||||
return TRUE
|
||||
if(hasSiliconAccessInArea(user))
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
// Check if the user is nearby and has a multitool.
|
||||
/obj/machinery/telecomms/proc/canAccess(mob/user)
|
||||
if((canInteract(user) && in_range(user, src)) || hasSiliconAccessInArea(user))
|
||||
@@ -262,14 +263,13 @@
|
||||
return null
|
||||
var/obj/item/P = user.get_active_held_item()
|
||||
// Is the ref not a null? and is it the actual type?
|
||||
if(P.tool_behaviour == TOOL_MULTITOOL)
|
||||
return P
|
||||
else if(isAI(user))
|
||||
if(isAI(user))
|
||||
var/mob/living/silicon/ai/U = user
|
||||
P = U.aiMulti
|
||||
else if(iscyborg(user) && in_range(user, src))
|
||||
var/get = user.get_active_held_item()
|
||||
var/obj/item/I = get
|
||||
if(I.tool_behaviour == TOOL_MULTITOOL)
|
||||
I = user.get_active_held_item()
|
||||
else if(iscyborg(user) && !in_range(user, src))
|
||||
return null
|
||||
if(!P)
|
||||
return null
|
||||
else if(P.tool_behaviour == TOOL_MULTITOOL)
|
||||
return P
|
||||
return P
|
||||
|
||||
@@ -132,7 +132,6 @@
|
||||
events = new
|
||||
icon_state += "-open"
|
||||
add_radio()
|
||||
add_cabin()
|
||||
spark_system.set_up(2, 0, src)
|
||||
spark_system.attach(src)
|
||||
smoke_system.set_up(3, src)
|
||||
@@ -153,6 +152,7 @@
|
||||
/obj/mecha/LateInitialize()
|
||||
. = ..()
|
||||
add_airtank()
|
||||
add_cabin()
|
||||
|
||||
/obj/mecha/get_cell()
|
||||
return cell
|
||||
@@ -255,9 +255,8 @@
|
||||
cell = new /obj/item/stock_parts/cell/high/plus(src)
|
||||
|
||||
/obj/mecha/proc/add_cabin()
|
||||
cabin_air = new
|
||||
cabin_air = new(200)
|
||||
cabin_air.set_temperature(T20C)
|
||||
cabin_air.set_volume(200)
|
||||
cabin_air.set_moles(/datum/gas/oxygen,O2STANDARD*cabin_air.return_volume()/(R_IDEAL_GAS_EQUATION*cabin_air.return_temperature()))
|
||||
cabin_air.set_moles(/datum/gas/nitrogen,N2STANDARD*cabin_air.return_volume()/(R_IDEAL_GAS_EQUATION*cabin_air.return_temperature()))
|
||||
return cabin_air
|
||||
|
||||
@@ -721,24 +721,24 @@
|
||||
|
||||
/obj/item/disk/medical/defib_heal
|
||||
name = "Defibrillator Healing Disk"
|
||||
desc = "An upgrade which increases the healing power of the defibrillator"
|
||||
desc = "An upgrade which increases the healing power of the defibrillator."
|
||||
icon_state = "heal_disk"
|
||||
custom_materials = list(/datum/material/iron=16000, /datum/material/glass = 18000, /datum/material/gold = 6000, /datum/material/silver = 6000)
|
||||
|
||||
/obj/item/disk/medical/defib_shock
|
||||
name = "Defibrillator Anti-Shock Disk"
|
||||
desc = "A safety upgrade that guarantees only the patient will get shocked"
|
||||
desc = "A safety upgrade that guarantees only the patient will get shocked."
|
||||
icon_state = "zap_disk"
|
||||
custom_materials = list(/datum/material/iron=16000, /datum/material/glass = 18000, /datum/material/gold = 6000, /datum/material/silver = 6000)
|
||||
|
||||
/obj/item/disk/medical/defib_decay
|
||||
name = "Defibrillator Body-Decay Extender Disk"
|
||||
desc = "An upgrade allowing the defibrillator to work on more decayed bodies"
|
||||
desc = "An upgrade allowing the defibrillator to work on bodies that have decayed further."
|
||||
icon_state = "body_disk"
|
||||
custom_materials = list(/datum/material/iron=16000, /datum/material/glass = 18000, /datum/material/gold = 16000, /datum/material/silver = 6000, /datum/material/titanium = 2000)
|
||||
|
||||
/obj/item/disk/medical/defib_speed
|
||||
name = "Defibrillator Fast Charge Disk"
|
||||
desc = "An upgrade to the defibrillator capacitors, which let it charge faster"
|
||||
desc = "An upgrade to the defibrillator capacitors, which lets it charge faster."
|
||||
icon_state = "fast_disk"
|
||||
custom_materials = list(/datum/material/iron=16000, /datum/material/glass = 8000, /datum/material/gold = 26000, /datum/material/silver = 26000)
|
||||
|
||||
@@ -58,7 +58,6 @@
|
||||
/obj/item/tank/internals/air
|
||||
name = "air tank"
|
||||
desc = "Mixed anyone?"
|
||||
icon_state = "air"
|
||||
item_state = "air"
|
||||
force = 10
|
||||
dog_fashion = /datum/dog_fashion/back
|
||||
|
||||
@@ -80,9 +80,9 @@
|
||||
SStgui.close_uis(src)
|
||||
. = ..()
|
||||
|
||||
/// @depricated DO NOT USE
|
||||
/obj/proc/setAnchored(anchorvalue)
|
||||
SEND_SIGNAL(src, COMSIG_OBJ_SETANCHORED, anchorvalue)
|
||||
anchored = anchorvalue
|
||||
set_anchored(anchorvalue)
|
||||
|
||||
/obj/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, force, messy_throw = TRUE)
|
||||
. = ..()
|
||||
|
||||
@@ -16,12 +16,12 @@
|
||||
//Adding canvases
|
||||
/obj/structure/easel/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/canvas))
|
||||
var/obj/item/canvas/C = I
|
||||
user.dropItemToGround(C)
|
||||
painting = C
|
||||
C.forceMove(get_turf(src))
|
||||
C.layer = layer+0.1
|
||||
user.visible_message("<span class='notice'>[user] puts \the [C] on \the [src].</span>","<span class='notice'>You place \the [C] on \the [src].</span>")
|
||||
var/obj/item/canvas/canvas = I
|
||||
user.dropItemToGround(canvas)
|
||||
painting = canvas
|
||||
canvas.forceMove(get_turf(src))
|
||||
canvas.layer = layer+0.1
|
||||
user.visible_message("<span class='notice'>[user] puts \the [canvas] on \the [src].</span>","<span class='notice'>You place \the [canvas] on \the [src].</span>")
|
||||
else
|
||||
return ..()
|
||||
|
||||
@@ -40,13 +40,14 @@
|
||||
desc = "Draw out your soul on this canvas!"
|
||||
icon = 'icons/obj/artstuff.dmi'
|
||||
icon_state = "11x11"
|
||||
// flags_1 = UNPAINTABLE_1
|
||||
resistance_flags = FLAMMABLE
|
||||
var/width = 11
|
||||
var/height = 11
|
||||
var/list/grid
|
||||
var/canvas_color = "#ffffff" //empty canvas color
|
||||
var/used = FALSE
|
||||
var/painting_name //Painting name, this is set after framing.
|
||||
var/painting_name = "Untitled Artwork" //Painting name, this is set after framing.
|
||||
var/finalized = FALSE //Blocks edits
|
||||
var/author_ckey
|
||||
var/icon_generated = FALSE
|
||||
@@ -132,17 +133,19 @@
|
||||
|
||||
/obj/item/canvas/update_overlays()
|
||||
. = ..()
|
||||
if(!icon_generated)
|
||||
if(used)
|
||||
var/mutable_appearance/detail = mutable_appearance(icon,"[icon_state]wip")
|
||||
detail.pixel_x = 1
|
||||
detail.pixel_y = 1
|
||||
. += detail
|
||||
else
|
||||
if(icon_generated)
|
||||
var/mutable_appearance/detail = mutable_appearance(generated_icon)
|
||||
detail.pixel_x = 1
|
||||
detail.pixel_y = 1
|
||||
. += detail
|
||||
return
|
||||
if(!used)
|
||||
return
|
||||
|
||||
var/mutable_appearance/detail = mutable_appearance(icon, "[icon_state]wip")
|
||||
detail.pixel_x = 1
|
||||
detail.pixel_y = 1
|
||||
. += detail
|
||||
|
||||
/obj/item/canvas/proc/generate_proper_overlay()
|
||||
if(icon_generated)
|
||||
@@ -167,8 +170,8 @@
|
||||
if(!I)
|
||||
return
|
||||
if(istype(I, /obj/item/toy/crayon))
|
||||
var/obj/item/toy/crayon/C = I
|
||||
return C.paint_color
|
||||
var/obj/item/toy/crayon/crayon = I
|
||||
return crayon.paint_color
|
||||
else if(istype(I, /obj/item/pen))
|
||||
var/obj/item/pen/P = I
|
||||
switch(P.colour)
|
||||
@@ -184,7 +187,7 @@
|
||||
|
||||
/obj/item/canvas/proc/try_rename(mob/user)
|
||||
var/new_name = stripped_input(user,"What do you want to name the painting?")
|
||||
if(!painting_name && new_name && user.canUseTopic(src,BE_CLOSE))
|
||||
if(new_name != painting_name && new_name && user.canUseTopic(src,BE_CLOSE))
|
||||
painting_name = new_name
|
||||
SStgui.update_uis(src)
|
||||
|
||||
@@ -215,12 +218,23 @@
|
||||
framed_offset_x = 5
|
||||
framed_offset_y = 6
|
||||
|
||||
/obj/item/canvas/twentyfour_twentyfour
|
||||
name = "ai universal standard canvas"
|
||||
desc = "Besides being very large, the AI can accept these as a display from their internal database after you've hung it up."
|
||||
icon_state = "24x24"
|
||||
width = 24
|
||||
height = 24
|
||||
pixel_x = 2
|
||||
pixel_y = 1
|
||||
framed_offset_x = 4
|
||||
framed_offset_y = 5
|
||||
|
||||
/obj/item/wallframe/painting
|
||||
name = "painting frame"
|
||||
desc = "The perfect showcase for your favorite deathtrap memories."
|
||||
icon = 'icons/obj/decals.dmi'
|
||||
custom_materials = null
|
||||
flags_1 = 0
|
||||
custom_materials = list(/datum/material/wood = 2000)
|
||||
flags_1 = NONE
|
||||
icon_state = "frame-empty"
|
||||
result_path = /obj/structure/sign/painting
|
||||
|
||||
@@ -229,8 +243,13 @@
|
||||
desc = "Art or \"Art\"? You decide."
|
||||
icon = 'icons/obj/decals.dmi'
|
||||
icon_state = "frame-empty"
|
||||
// base_icon_state = "frame"
|
||||
custom_materials = list(/datum/material/wood = 2000)
|
||||
buildable_sign = FALSE
|
||||
var/obj/item/canvas/C
|
||||
///Canvas we're currently displaying.
|
||||
var/obj/item/canvas/current_canvas
|
||||
///Description set when canvas is added.
|
||||
var/desc_with_canvas
|
||||
var/persistence_id
|
||||
|
||||
/obj/structure/sign/painting/Initialize(mapload, dir, building)
|
||||
@@ -242,64 +261,78 @@
|
||||
if(building)
|
||||
pixel_x = (dir & 3)? 0 : (dir == 4 ? -30 : 30)
|
||||
pixel_y = (dir & 3)? (dir ==1 ? -30 : 30) : 0
|
||||
desc = current_canvas ? desc_with_canvas : initial(desc)
|
||||
|
||||
/obj/structure/sign/painting/Destroy()
|
||||
. = ..()
|
||||
SSpersistence.painting_frames -= src
|
||||
|
||||
/obj/structure/sign/painting/attackby(obj/item/I, mob/user, params)
|
||||
if(!C && istype(I, /obj/item/canvas))
|
||||
if(!current_canvas && istype(I, /obj/item/canvas))
|
||||
frame_canvas(user,I)
|
||||
else if(C && !C.painting_name && istype(I,/obj/item/pen))
|
||||
else if(current_canvas && current_canvas.painting_name == initial(current_canvas.painting_name) && istype(I,/obj/item/pen))
|
||||
try_rename(user)
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/structure/sign/painting/examine(mob/user)
|
||||
. = ..()
|
||||
if(C)
|
||||
C.ui_interact(user)
|
||||
if(persistence_id)
|
||||
. += "<span class='notice'>Any painting placed here will be archived at the end of the shift.</span>"
|
||||
if(current_canvas)
|
||||
current_canvas.ui_interact(user)
|
||||
. += "<span class='notice'>Use wirecutters to remove the painting.</span>"
|
||||
|
||||
/obj/structure/sign/painting/wirecutter_act(mob/living/user, obj/item/I)
|
||||
. = ..()
|
||||
if(C)
|
||||
C.forceMove(drop_location())
|
||||
C = null
|
||||
if(current_canvas)
|
||||
current_canvas.forceMove(drop_location())
|
||||
current_canvas = null
|
||||
to_chat(user, "<span class='notice'>You remove the painting from the frame.</span>")
|
||||
update_icon()
|
||||
return TRUE
|
||||
|
||||
/obj/structure/sign/painting/proc/frame_canvas(mob/user,obj/item/canvas/new_canvas)
|
||||
if(user.transferItemToLoc(new_canvas,src))
|
||||
C = new_canvas
|
||||
if(!C.finalized)
|
||||
C.finalize(user)
|
||||
to_chat(user,"<span class='notice'>You frame [C].</span>")
|
||||
current_canvas = new_canvas
|
||||
if(!current_canvas.finalized)
|
||||
current_canvas.finalize(user)
|
||||
to_chat(user,"<span class='notice'>You frame [current_canvas].</span>")
|
||||
update_icon()
|
||||
|
||||
/obj/structure/sign/painting/proc/try_rename(mob/user)
|
||||
if(!C.painting_name)
|
||||
C.try_rename(user)
|
||||
if(current_canvas.painting_name == initial(current_canvas.painting_name))
|
||||
current_canvas.try_rename(user)
|
||||
|
||||
// /obj/structure/sign/painting/update_name(updates)
|
||||
// name = current_canvas ? "painting - [current_canvas.painting_name]" : initial(name)
|
||||
// return ..()
|
||||
|
||||
// /obj/structure/sign/painting/update_desc(updates)
|
||||
// desc = current_canvas ? desc_with_canvas : initial(desc)
|
||||
// return ..()
|
||||
|
||||
/obj/structure/sign/painting/update_icon_state()
|
||||
. = ..()
|
||||
if(C && C.generated_icon)
|
||||
icon_state = null
|
||||
else
|
||||
// icon_state = "[base_icon_state]-[current_canvas?.generated_icon ? "overlay" : "empty"]"
|
||||
if(current_canvas?.generated_icon)
|
||||
icon_state = "frame-empty"
|
||||
|
||||
else
|
||||
icon_state = null // or "frame-empty"
|
||||
return ..()
|
||||
|
||||
/obj/structure/sign/painting/update_overlays()
|
||||
. = ..()
|
||||
if(C && C.generated_icon)
|
||||
var/mutable_appearance/MA = mutable_appearance(C.generated_icon)
|
||||
MA.pixel_x = C.framed_offset_x
|
||||
MA.pixel_y = C.framed_offset_y
|
||||
. += MA
|
||||
var/mutable_appearance/frame = mutable_appearance(C.icon,"[C.icon_state]frame")
|
||||
frame.pixel_x = C.framed_offset_x - 1
|
||||
frame.pixel_y = C.framed_offset_y - 1
|
||||
. += frame
|
||||
if(!current_canvas?.generated_icon)
|
||||
return
|
||||
|
||||
var/mutable_appearance/MA = mutable_appearance(current_canvas.generated_icon)
|
||||
MA.pixel_x = current_canvas.framed_offset_x
|
||||
MA.pixel_y = current_canvas.framed_offset_y
|
||||
. += MA
|
||||
var/mutable_appearance/frame = mutable_appearance(current_canvas.icon,"[current_canvas.icon_state]frame")
|
||||
frame.pixel_x = current_canvas.framed_offset_x - 1
|
||||
frame.pixel_y = current_canvas.framed_offset_y - 1
|
||||
. += frame
|
||||
|
||||
/obj/structure/sign/painting/proc/load_persistent()
|
||||
if(!persistence_id)
|
||||
@@ -310,6 +343,10 @@
|
||||
var/title = chosen["title"]
|
||||
var/author = chosen["ckey"]
|
||||
var/png = "data/paintings/[persistence_id]/[chosen["md5"]].png"
|
||||
if(!title)
|
||||
title = "Untitled Artwork" //Should prevent NULL named art from loading as NULL, if you're still getting the admin log chances are persistence is broken
|
||||
if(!title)
|
||||
message_admins("<span class='notice'>Painting with NO TITLE loaded on a [persistence_id] frame in [get_area(src)]. Please delete it, it is saved in the database with no name and will create bad assets.</span>")
|
||||
if(!fexists(png))
|
||||
stack_trace("Persistent painting [chosen["md5"]].png was not found in [persistence_id] directory.")
|
||||
return
|
||||
@@ -328,17 +365,20 @@
|
||||
new_canvas.finalized = TRUE
|
||||
new_canvas.painting_name = title
|
||||
new_canvas.author_ckey = author
|
||||
C = new_canvas
|
||||
new_canvas.name = "painting - [title]"
|
||||
current_canvas = new_canvas
|
||||
update_icon()
|
||||
|
||||
/obj/structure/sign/painting/proc/save_persistent()
|
||||
if(!persistence_id || !C)
|
||||
if(!persistence_id || !current_canvas)
|
||||
return
|
||||
if(sanitize_filename(persistence_id) != persistence_id)
|
||||
stack_trace("Invalid persistence_id - [persistence_id]")
|
||||
return
|
||||
var/data = C.get_data_string()
|
||||
var/md5 = md5(data)
|
||||
if(!current_canvas.painting_name)
|
||||
current_canvas.painting_name = "Untitled Artwork"
|
||||
var/data = current_canvas.get_data_string()
|
||||
var/md5 = md5(lowertext(data))
|
||||
var/list/current = SSpersistence.paintings[persistence_id]
|
||||
if(!current)
|
||||
current = list()
|
||||
@@ -347,10 +387,10 @@
|
||||
return
|
||||
var/png_directory = "data/paintings/[persistence_id]/"
|
||||
var/png_path = png_directory + "[md5].png"
|
||||
var/result = rustg_dmi_create_png(png_path,"[C.width]","[C.height]",data)
|
||||
var/result = rustg_dmi_create_png(png_path,"[current_canvas.width]","[current_canvas.height]",data)
|
||||
if(result)
|
||||
CRASH("Error saving persistent painting: [result]")
|
||||
current += list(list("title" = C.painting_name , "md5" = md5, "ckey" = C.author_ckey))
|
||||
current += list(list("title" = current_canvas.painting_name , "md5" = md5, "ckey" = current_canvas.author_ckey))
|
||||
SSpersistence.paintings[persistence_id] = current
|
||||
|
||||
/obj/item/canvas/proc/fill_grid_from_icon(icon/I)
|
||||
@@ -361,12 +401,21 @@
|
||||
|
||||
//Presets for art gallery mapping, for paintings to be shared across stations
|
||||
/obj/structure/sign/painting/library
|
||||
name = "\improper Public Painting Exhibit mounting"
|
||||
desc = "For art pieces hung by the public."
|
||||
desc_with_canvas = "A piece of art (or \"art\"). Anyone could've hung it."
|
||||
persistence_id = "library"
|
||||
|
||||
/obj/structure/sign/painting/library_secure
|
||||
name = "\improper Curated Painting Exhibit mounting"
|
||||
desc = "For masterpieces hand-picked by the curator."
|
||||
desc_with_canvas = "A masterpiece hand-picked by the curator, supposedly."
|
||||
persistence_id = "library_secure"
|
||||
|
||||
/obj/structure/sign/painting/library_private // keep your smut away from prying eyes, or non-librarians at least
|
||||
name = "\improper Private Painting Exhibit mounting"
|
||||
desc = "For art pieces deemed too subversive or too illegal to be shared outside of curators."
|
||||
desc_with_canvas = "A painting hung away from lesser minds."
|
||||
persistence_id = "library_private"
|
||||
|
||||
/obj/structure/sign/painting/vv_get_dropdown()
|
||||
@@ -379,11 +428,11 @@
|
||||
if(!check_rights(NONE))
|
||||
return
|
||||
var/mob/user = usr
|
||||
if(!persistence_id || !C)
|
||||
if(!persistence_id || !current_canvas)
|
||||
to_chat(user,"<span class='warning'>This is not a persistent painting.</span>")
|
||||
return
|
||||
var/md5 = md5(C.get_data_string())
|
||||
var/author = C.author_ckey
|
||||
var/md5 = md5(lowertext(current_canvas.get_data_string()))
|
||||
var/author = current_canvas.author_ckey
|
||||
var/list/current = SSpersistence.paintings[persistence_id]
|
||||
if(current)
|
||||
for(var/list/entry in current)
|
||||
@@ -392,7 +441,8 @@
|
||||
var/png = "data/paintings/[persistence_id]/[md5].png"
|
||||
fdel(png)
|
||||
for(var/obj/structure/sign/painting/P in SSpersistence.painting_frames)
|
||||
if(P.C && md5(P.C.get_data_string()) == md5)
|
||||
QDEL_NULL(P.C)
|
||||
if(P.current_canvas && md5(P.current_canvas.get_data_string()) == md5)
|
||||
QDEL_NULL(P.current_canvas)
|
||||
P.update_icon()
|
||||
log_admin("[key_name(user)] has deleted a persistent painting made by [author].")
|
||||
message_admins("<span class='notice'>[key_name_admin(user)] has deleted persistent painting made by [author].</span>")
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
announceWhen = rand(4, 60)
|
||||
supernova = new
|
||||
SSsun.suns += supernova
|
||||
if(prob(50))
|
||||
if(prob(20))
|
||||
power = rand(5,100) / 100
|
||||
else
|
||||
power = rand(5,5000) / 100
|
||||
@@ -33,9 +33,9 @@
|
||||
|
||||
|
||||
/datum/round_event/supernova/start()
|
||||
supernova.power_mod = 0.00000002 * power
|
||||
supernova.power_mod = 0.001 * power
|
||||
var/explosion_size = rand(1000000000, 999999999)
|
||||
var/turf/epicenter = get_turf_in_angle(supernova.azimuth, SSmapping.get_station_center(), world.maxx / 2)
|
||||
var/turf/epicenter = get_turf_in_angle(supernova.azimuth, SSmapping.get_station_center(), round(world.maxx * 0.45))
|
||||
for(var/array in GLOB.doppler_arrays)
|
||||
var/obj/machinery/doppler_array/A = array
|
||||
A.sense_explosion(epicenter, explosion_size/2, explosion_size, 0, 107000000 / power, explosion_size/2, explosion_size, 0)
|
||||
@@ -46,13 +46,13 @@
|
||||
sucker_light.give_home_power()
|
||||
|
||||
/datum/round_event/supernova/tick()
|
||||
var/midpoint = (endWhen-startWhen)/2
|
||||
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 < 3 && !SSweather.get_weather_by_type(/datum/weather/rad_storm))
|
||||
if(prob(round(supernova.power_mod / 2)) && storm_count < 4 && !SSweather.get_weather_by_type(/datum/weather/rad_storm))
|
||||
SSweather.run_weather(/datum/weather/rad_storm/supernova)
|
||||
storm_count++
|
||||
|
||||
@@ -62,6 +62,6 @@
|
||||
|
||||
/datum/weather/rad_storm/supernova
|
||||
weather_duration_lower = 50
|
||||
weather_duration_lower = 100
|
||||
weather_duration_upper = 100
|
||||
telegraph_duration = 100
|
||||
radiation_intensity = 50
|
||||
|
||||
@@ -477,6 +477,10 @@
|
||||
name = "Messy"
|
||||
icon_state = "hair_messy"
|
||||
|
||||
/datum/sprite_accessory/hair/messy2
|
||||
name = "Messy2"
|
||||
icon_state = "hair_messy2"
|
||||
|
||||
/datum/sprite_accessory/hair/modern
|
||||
name = "Modern"
|
||||
icon_state = "hair_modern"
|
||||
|
||||
@@ -200,7 +200,7 @@
|
||||
if(option == "Random")
|
||||
iconstates[option] = image(icon = src.icon, icon_state = "ai-random")
|
||||
continue
|
||||
iconstates[option] = image(icon = src.icon, icon_state = resolve_ai_icon(option))
|
||||
iconstates[option] = image(icon = src.icon, icon_state = resolve_ai_icon(option, radial_preview = TRUE))
|
||||
|
||||
view_core()
|
||||
var/ai_core_icon = show_radial_menu(src, src , iconstates, radius = 42)
|
||||
|
||||
@@ -23,13 +23,17 @@
|
||||
if(module.cyborg_base_icon == "robot")
|
||||
icon = 'icons/mob/robots.dmi'
|
||||
pixel_x = initial(pixel_x)
|
||||
if(stat != DEAD && !(IsUnconscious() ||IsStun() || IsKnockdown() || IsParalyzed() || low_power_mode)) //Not dead, not stunned.
|
||||
if(stat != DEAD && !(IsUnconscious() || IsStun() || IsParalyzed() || low_power_mode)) //Not dead, not stunned.
|
||||
if(!eye_lights)
|
||||
eye_lights = new()
|
||||
if(lamp_intensity > 2)
|
||||
if(lamp_enabled || lamp_doom)
|
||||
eye_lights.icon_state = "[module.special_light_key ? "[module.special_light_key]":"[module.cyborg_base_icon]"]_l"
|
||||
eye_lights.color = lamp_doom? COLOR_RED : lamp_color
|
||||
eye_lights.plane = 19 //glowy eyes
|
||||
else
|
||||
eye_lights.icon_state = "[module.special_light_key ? "[module.special_light_key]":"[module.cyborg_base_icon]"]_e[is_servant_of_ratvar(src) ? "_r" : ""]"
|
||||
eye_lights.color = COLOR_WHITE
|
||||
eye_lights.plane = -1
|
||||
eye_lights.icon = icon
|
||||
add_overlay(eye_lights)
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
var/datum/boss_active_timed_battle/atb
|
||||
var/point_regen_delay = 20
|
||||
var/point_regen_amount = 1
|
||||
|
||||
sentience_type = SENTIENCE_BOSS
|
||||
|
||||
/mob/living/simple_animal/hostile/boss/Initialize()
|
||||
. = ..()
|
||||
|
||||
@@ -88,9 +88,9 @@
|
||||
mix_message = "The mixture boils off a yellow, smelly vapor..."//Sulfur burns off, leaving the camphor
|
||||
|
||||
/datum/chemical_reaction/anaphroplus
|
||||
name = "pentacamphor"
|
||||
name = "hexacamphor"
|
||||
id = /datum/reagent/drug/anaphrodisiacplus
|
||||
results = list(/datum/reagent/drug/anaphrodisiacplus = 1)
|
||||
required_reagents = list(/datum/reagent/drug/aphrodisiac = 5, /datum/reagent/acetone = 1)
|
||||
required_temp = 300
|
||||
required_reagents = list(/datum/reagent/drug/anaphrodisiac = 6, /datum/reagent/acetone = 1)
|
||||
required_temp = 400
|
||||
mix_message = "The mixture thickens and heats up slighty..."
|
||||
|
||||
@@ -809,22 +809,22 @@
|
||||
research_icon_state = "surgery_chest"
|
||||
|
||||
/datum/design/surgery/healing/brute_upgrade
|
||||
name = "Tend Wounds (Brute) Upgrade"
|
||||
name = "Tend Wounds (Brute) Upgrade I"
|
||||
surgery = /datum/surgery/healing/brute/upgraded
|
||||
id = "surgery_heal_brute_upgrade"
|
||||
|
||||
/datum/design/surgery/healing/brute_upgrade_2
|
||||
name = "Tend Wounds (Brute) Upgrade"
|
||||
name = "Tend Wounds (Brute) Upgrade II"
|
||||
surgery = /datum/surgery/healing/brute/upgraded/femto
|
||||
id = "surgery_heal_brute_upgrade_femto"
|
||||
|
||||
/datum/design/surgery/healing/burn_upgrade
|
||||
name = "Tend Wounds (Burn) Upgrade"
|
||||
name = "Tend Wounds (Burn) Upgrade I"
|
||||
surgery = /datum/surgery/healing/burn/upgraded
|
||||
id = "surgery_heal_burn_upgrade"
|
||||
|
||||
/datum/design/surgery/healing/burn_upgrade_2
|
||||
name = "Tend Wounds (Burn) Upgrade"
|
||||
name = "Tend Wounds (Burn) Upgrade II"
|
||||
surgery = /datum/surgery/healing/brute/upgraded/femto
|
||||
id = "surgery_heal_burn_upgrade_femto"
|
||||
|
||||
@@ -835,16 +835,26 @@
|
||||
id = "surgery_heal_combo"
|
||||
|
||||
/datum/design/surgery/healing/combo_upgrade
|
||||
name = "Tend Wounds (Mixture) Upgrade"
|
||||
name = "Tend Wounds (Mixture) Upgrade I"
|
||||
surgery = /datum/surgery/healing/combo/upgraded
|
||||
id = "surgery_heal_combo_upgrade"
|
||||
|
||||
/datum/design/surgery/healing/combo_upgrade_2
|
||||
name = "Tend Wounds (Mixture) Upgrade"
|
||||
name = "Tend Wounds (Mixture) Upgrade II"
|
||||
desc = "A surgical procedure that repairs both bruises and burns faster than their individual counterparts. It is more effective than both the individual surgeries."
|
||||
surgery = /datum/surgery/healing/combo/upgraded/femto
|
||||
id = "surgery_heal_combo_upgrade_femto"
|
||||
|
||||
/datum/design/surgery/healing/robot_upgrade
|
||||
name = "Repair Robotic Limbs Upgrade"
|
||||
surgery = /datum/surgery/robot_healing/upgraded
|
||||
id = "surgery_heal_robo_upgrade"
|
||||
|
||||
/datum/design/surgery/healing/robot_upgrade_2
|
||||
name = "Repair Robotic Limbs Upgrade II"
|
||||
surgery = /datum/surgery/robot_healing/upgraded/femto
|
||||
id = "surgery_heal_robo_upgrade_femto"
|
||||
|
||||
/datum/design/surgery/surgery_toxinhealing
|
||||
name = "Body Rejuvenation"
|
||||
desc = "A surgical procedure that helps deal with oxygen deprecation, and treat toxic damaged. Works on corpses and alive alike without chemicals."
|
||||
|
||||
@@ -43,7 +43,7 @@ If you create T5+ please take a pass at gene_modder.dm [L40]. Max_values MUST fi
|
||||
|
||||
/obj/item/storage/part_replacer/bluespace
|
||||
name = "bluespace rapid part exchange device"
|
||||
desc = "A version of the RPED that allows for replacement of parts and scanning from a distance, along with higher capacity for parts. Definitely not just a BSRPED painted orange."
|
||||
desc = "A version of the RPED that allows for replacement of parts and scanning from a distance, along with higher capacity for parts."
|
||||
icon_state = "BS_RPED"
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
works_from_distance = TRUE
|
||||
@@ -109,6 +109,7 @@ If you create T5+ please take a pass at gene_modder.dm [L40]. Max_values MUST fi
|
||||
icon_state = "borgrped"
|
||||
|
||||
/obj/item/storage/part_replacer/bluespace/cyborg
|
||||
desc = "A version of the RPED that allows for replacement of parts and scanning from a distance, along with higher capacity for parts. Definitely not just a BSRPED painted orange."
|
||||
icon_state = "borg_BS_RPED"
|
||||
|
||||
/proc/cmp_rped_sort(obj/item/A, obj/item/B)
|
||||
|
||||
@@ -116,6 +116,14 @@
|
||||
design_ids = list("surgery_heal_brute_upgrade","surgery_heal_burn_upgrade")
|
||||
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000)
|
||||
|
||||
/datum/techweb_node/adv_surgery
|
||||
id = "adv_surgery"
|
||||
display_name = "Advanced Surgery"
|
||||
description = "When simple medicine doesn't cut it."
|
||||
prereq_ids = list("imp_wt_surgery")
|
||||
design_ids = list("surgery_revival", "surgery_lobotomy", "surgery_heal_brute_upgrade_femto","surgery_heal_burn_upgrade_femto","surgery_heal_robo_upgrade","surgery_heal_combo", "surgery_toxinhealing", "organbox", "surgery_adv_dissection")
|
||||
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
|
||||
|
||||
/datum/techweb_node/advance_surgerytools
|
||||
id = "advance_surgerytools"
|
||||
display_name = "Advanced Surgery Tools"
|
||||
@@ -124,20 +132,12 @@
|
||||
design_ids = list("drapes", "retractor_adv", "surgicaldrill_adv", "scalpel_adv", "bonesetter", "surgical_tape")
|
||||
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
|
||||
|
||||
/datum/techweb_node/adv_surgery
|
||||
id = "adv_surgery"
|
||||
display_name = "Advanced Surgery"
|
||||
description = "When simple medicine doesn't cut it."
|
||||
prereq_ids = list("imp_wt_surgery")
|
||||
design_ids = list("surgery_revival", "surgery_lobotomy", "surgery_heal_brute_upgrade_femto","surgery_heal_burn_upgrade_femto", "surgery_heal_combo", "surgery_toxinhealing", "organbox", "surgery_adv_dissection")
|
||||
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
|
||||
|
||||
/datum/techweb_node/exp_surgery
|
||||
id = "exp_surgery"
|
||||
display_name = "Experimental Surgery"
|
||||
description = "When evolution isn't fast enough."
|
||||
prereq_ids = list("adv_surgery")
|
||||
design_ids = list("surgery_pacify","surgery_vein_thread","surgery_muscled_veins","surgery_nerve_splice","surgery_nerve_ground","surgery_ligament_hook","surgery_ligament_reinforcement","surgery_viral_bond", "surgery_exp_dissection", "surgery_heal_combo_upgrade")
|
||||
design_ids = list("surgery_pacify","surgery_vein_thread","surgery_muscled_veins","surgery_nerve_splice","surgery_nerve_ground","surgery_ligament_hook","surgery_ligament_reinforcement","surgery_viral_bond", "surgery_exp_dissection","surgery_heal_robo_upgrade_femto","surgery_heal_combo_upgrade")
|
||||
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000)
|
||||
|
||||
/datum/techweb_node/alien_surgery
|
||||
|
||||
@@ -394,7 +394,7 @@
|
||||
name = "smithed katana blade"
|
||||
finishingitem = /obj/item/swordhandle
|
||||
finalitem = /obj/item/melee/smith/twohand/katana
|
||||
icon_state = "katana"
|
||||
icon_state = "katana-s"
|
||||
|
||||
|
||||
/obj/item/smithing/katanablade/startfinish()
|
||||
|
||||
@@ -169,7 +169,6 @@
|
||||
/***************************COMBO***************************/
|
||||
/datum/surgery/healing/combo
|
||||
|
||||
|
||||
/datum/surgery/healing/combo
|
||||
name = "Tend Wounds (Mixture, Basic)"
|
||||
replaced_by = /datum/surgery/healing/combo/upgraded
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
//Almost copypaste of tend wounds, with some changes
|
||||
|
||||
/datum/surgery/robot_healing
|
||||
name = "Repair robotic limbs (basic)"
|
||||
name = "Repair Robotic Limbs"
|
||||
desc = "A surgical procedure that provides repairs and maintenance to robotic limbs. Is slightly more efficient when the patient is severely damaged."
|
||||
|
||||
replaced_by = /datum/surgery
|
||||
steps = list(/datum/surgery_step/mechanic_open,
|
||||
/datum/surgery_step/pry_off_plating,
|
||||
/datum/surgery_step/cut_wires,
|
||||
@@ -14,8 +14,28 @@
|
||||
possible_locs = list(BODY_ZONE_CHEST)
|
||||
requires_bodypart_type = 0 //You can do this on anyone, but it won't really be useful on people without augments.
|
||||
ignore_clothes = TRUE
|
||||
var/healing_step_type
|
||||
var/antispam = FALSE
|
||||
var/healing_step_type = /datum/surgery_step/robot_heal/basic
|
||||
|
||||
/datum/surgery/robot_healing/basic
|
||||
name = "Repair Robotic Limbs (Basic)"
|
||||
replaced_by = /datum/surgery/robot_healing/upgraded
|
||||
healing_step_type = /datum/surgery_step/robot_heal/basic
|
||||
desc = "A surgical procedure that provides basic repairs and maintenance to a patient's robotic limbs. Heals slightly more when the patient is severely injured."
|
||||
|
||||
/datum/surgery/robot_healing/upgraded
|
||||
name = "Repair Robotic Limbs (Adv.)"
|
||||
requires_tech = TRUE
|
||||
replaced_by = /datum/surgery/robot_healing/upgraded/femto
|
||||
healing_step_type = /datum/surgery_step/robot_heal/upgraded
|
||||
desc = "A surgical procedure that provides advanced repairs and maintenance to a patient's robotic limbs. Heals more when the patient is severely injured."
|
||||
|
||||
/datum/surgery/robot_healing/upgraded/femto
|
||||
name = "Repair Robotic Limbs (Exp.)"
|
||||
requires_tech = TRUE
|
||||
replaced_by = null // as good as it gets
|
||||
healing_step_type = /datum/surgery_step/robot_heal/upgraded/femto
|
||||
desc = "A surgical procedure that provides experimental repairs and maintenance to a patient's robotic limbs. Heals considerably more when the patient is severely injured."
|
||||
|
||||
/datum/surgery/robot_healing/New(surgery_target, surgery_location, surgery_bodypart)
|
||||
..()
|
||||
@@ -35,26 +55,21 @@
|
||||
var/healsburn = FALSE
|
||||
var/brutehealing = 0
|
||||
var/burnhealing = 0
|
||||
var/missinghpbonus = 0 //heals an extra point of damager per X missing damage of type (burn damage for burn healing, brute for brute). Smaller Number = More Healing!
|
||||
var/missinghpbonus = 0 //heals an extra point of damage per X missing damage of type (burn damage for burn healing, brute for brute). Smaller Number = More Healing!
|
||||
|
||||
/datum/surgery_step/robot_heal/tool_check(mob/user, obj/item/tool)
|
||||
if(implement_type == TOOL_WELDER && !tool.tool_use_check(user, 1))
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/datum/surgery/robot_healing/can_start(mob/user, mob/living/carbon/target, obj/item/tool)
|
||||
var/possible = FALSE
|
||||
/datum/surgery/robot_healing/can_start(mob/user, mob/living/carbon/target, obj/item/tool) // hey delta? why is the check for this all the way down here
|
||||
for(var/obj/item/bodypart/B in target.bodyparts)
|
||||
if(B.is_robotic_limb())
|
||||
possible = TRUE
|
||||
break
|
||||
if(!possible)
|
||||
return FALSE
|
||||
return TRUE
|
||||
return ..()
|
||||
|
||||
/datum/surgery_step/robot_heal/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
var/woundtype
|
||||
if(implement_type == TOOL_WELDER)
|
||||
if(implement_type == TOOL_WELDER)
|
||||
healsbrute = TRUE
|
||||
healsburn = FALSE
|
||||
woundtype = "dents"
|
||||
@@ -133,3 +148,13 @@
|
||||
brutehealing = 10
|
||||
burnhealing = 10
|
||||
missinghpbonus = 15
|
||||
|
||||
/datum/surgery_step/robot_heal/upgraded
|
||||
brutehealing = 10
|
||||
burnhealing = 10
|
||||
missinghpbonus = 10
|
||||
|
||||
/datum/surgery_step/robot_heal/upgraded/femto
|
||||
brutehealing = 10
|
||||
burnhealing = 10
|
||||
missinghpbonus = 5
|
||||
|
||||
Reference in New Issue
Block a user