mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-08-22 19:47:47 +01:00
WIP fix of this PR
This commit is contained in:
@@ -1,5 +1,3 @@
|
||||
#define ADIABATIC_EXPONENT 0.667 //Actually adiabatic exponent - 1.
|
||||
|
||||
/obj/machinery/atmospherics/pipeturbine
|
||||
name = "turbine"
|
||||
desc = "A gas turbine. Converting pressure into energy since 1884."
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#define COLOR_MAROON "#800000"
|
||||
#define COLOR_PURPLE "#800080"
|
||||
#define COLOR_VIOLET "#9933ff"
|
||||
#define COLOR_OLIVE "#808000"
|
||||
#define COLOR_OLIVE "#52613b" // VOREStation Edit
|
||||
#define COLOR_BROWN_ORANGE "#824b28"
|
||||
#define COLOR_DARK_ORANGE "#b95a00"
|
||||
#define COLOR_GRAY40 "#666666"
|
||||
@@ -91,7 +91,6 @@
|
||||
#define COLOR_DARK_TEAL "#2db5b5"
|
||||
#define COLOR_LIGHT_VIOLET "#e7bfff"
|
||||
#define COLOR_SAN_MARINO_BLUE "#4b75ab"
|
||||
#define COLOR_OLIVE "#52613b" //VOREStation Addition
|
||||
#define COLOR_HALF_TRANSPARENT_BLACK "#0000007A"
|
||||
|
||||
#define PIPE_COLOR_GREY "#808080"
|
||||
|
||||
@@ -8,7 +8,8 @@
|
||||
|
||||
/// Signifies that this proc is used to handle signals.
|
||||
/// Every proc you pass to RegisterSignal must have this.
|
||||
#define SIGNAL_HANDLER SHOULD_NOT_SLEEP(TRUE)
|
||||
//#define SIGNAL_HANDLER SHOULD_NOT_SLEEP(TRUE)
|
||||
#define SIGNAL_HANDLER // Sigh
|
||||
|
||||
/// A wrapper for _AddElement that allows us to pretend we're using normal named arguments
|
||||
#define AddElement(arguments...) _AddElement(list(##arguments))
|
||||
|
||||
@@ -121,8 +121,6 @@
|
||||
///from obj/machinery/bsa/full/proc/fire(): ()
|
||||
#define COMSIG_ATOM_BSA_BEAM "atom_bsa_beam_pass"
|
||||
#define COMSIG_ATOM_BLOCKS_BSA_BEAM (1<<0)
|
||||
///from base of atom/set_light(): (l_range, l_power, l_color)
|
||||
#define COMSIG_ATOM_SET_LIGHT "atom_set_light"
|
||||
///from base of atom/setDir(): (old_dir, new_dir)
|
||||
#define COMSIG_ATOM_DIR_CHANGE "atom_dir_change"
|
||||
///from base of atom/handle_atom_del(): (atom/deleted)
|
||||
|
||||
@@ -1,4 +1,8 @@
|
||||
#undef LIGHT_COLOR_INCANDESCENT_TUBE
|
||||
#define LIGHT_COLOR_INCANDESCENT_TUBE "#E0EFF0"
|
||||
#undef LIGHT_COLOR_INCANDESCENT_BULB
|
||||
#define LIGHT_COLOR_INCANDESCENT_BULB "#FFFEB8"
|
||||
|
||||
//Fake ambient occlusion filter
|
||||
#undef AMBIENT_OCCLUSION
|
||||
#define AMBIENT_OCCLUSION filter(type="drop_shadow", x=0, y=-1, size=2, offset=2, color="#04080F55") //VOREStation Edit for prettier visuals.
|
||||
@@ -167,4 +167,4 @@ if (!(DATUM.datum_flags & DF_ISPROCESSING)) {\
|
||||
// Computer login types
|
||||
#define LOGIN_TYPE_NORMAL 1
|
||||
#define LOGIN_TYPE_AI 2
|
||||
#define LOGIN_TYPE_ROBOT 3
|
||||
#define LOGIN_TYPE_ROBOT 3
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
#define INIT_ORDER_HOLOMAPS -5 //VOREStation Add
|
||||
@@ -19,8 +19,5 @@
|
||||
#define isCardinal(x) (x == NORTH || x == SOUTH || x == EAST || x == WEST)
|
||||
#define isDiagonal(x) (x == NORTHEAST || x == SOUTHEAST || x == NORTHWEST || x == SOUTHWEST)
|
||||
|
||||
<<<<<<< HEAD
|
||||
#define IS_OPAQUE_TURF(turf) (turf.directional_opacity == ALL_CARDINALS)
|
||||
=======
|
||||
#define FOOTSTEP_SPRITE_AMT 2
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
|
||||
@@ -366,18 +366,14 @@ world
|
||||
. = list(r, g, b)
|
||||
if(usealpha) . += alpha
|
||||
|
||||
<<<<<<< HEAD
|
||||
proc/RGBdec2hex(var/list/values)
|
||||
/proc/RGBdec2hex(var/list/values)
|
||||
var/string = ""
|
||||
while(values.len)
|
||||
string = "[num2text(values[values.len], 2, 16)][string]"
|
||||
values.len--
|
||||
return "#[string]"
|
||||
|
||||
proc/ReadHSV(hsv)
|
||||
=======
|
||||
/proc/ReadHSV(hsv)
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
if(!hsv) return
|
||||
|
||||
// interpret the HSV or HSVA value
|
||||
|
||||
@@ -3,13 +3,9 @@ var/datum/controller/transfer_controller/transfer_controller
|
||||
/datum/controller/transfer_controller
|
||||
var/timerbuffer = 0 //buffer for time check
|
||||
var/currenttick = 0
|
||||
<<<<<<< HEAD
|
||||
var/shift_hard_end = 0 //VOREStation Edit
|
||||
var/shift_last_vote = 0 //VOREStation Edit
|
||||
datum/controller/transfer_controller/New()
|
||||
=======
|
||||
/datum/controller/transfer_controller/New()
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
timerbuffer = config.vote_autotransfer_initial
|
||||
shift_hard_end = config.vote_autotransfer_initial + (config.vote_autotransfer_interval * 0) //VOREStation Edit //Change this "1" to how many extend votes you want there to be.
|
||||
shift_last_vote = shift_hard_end - config.vote_autotransfer_interval //VOREStation Edit
|
||||
|
||||
@@ -192,14 +192,8 @@ var/list/ANTAG_FREQS = list(SYND_FREQ, RAID_FREQ)
|
||||
//Department channels, arranged lexically
|
||||
var/list/DEPT_FREQS = list(AI_FREQ, COMM_FREQ, ENG_FREQ, ENT_FREQ, MED_FREQ, SEC_FREQ, SCI_FREQ, SRV_FREQ, SUP_FREQ)
|
||||
|
||||
<<<<<<< HEAD
|
||||
var/list/OFFMAP_FREQS = list(TALON_FREQ) //VOREStation Add
|
||||
|
||||
#define TRANSMISSION_WIRE 0
|
||||
#define TRANSMISSION_RADIO 1
|
||||
|
||||
=======
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
/proc/frequency_span_class(var/frequency)
|
||||
// Antags!
|
||||
if (frequency in ANTAG_FREQS)
|
||||
|
||||
@@ -86,29 +86,6 @@ SUBSYSTEM_DEF(lighting)
|
||||
queue.Cut(1, i+1)
|
||||
|
||||
|
||||
<<<<<<< HEAD
|
||||
/datum/controller/subsystem/lighting/Recover()
|
||||
subsystem_initialized = SSlighting.subsystem_initialized
|
||||
..()
|
||||
=======
|
||||
DUAL_TICK_CHECK
|
||||
|
||||
/datum/controller/subsystem/lighting/stat_entry(msg_prefix)
|
||||
var/list/msg = list(msg_prefix)
|
||||
msg += "T:{"
|
||||
msg += "S [total_lighting_sources] | "
|
||||
msg += "C [total_lighting_corners] | "
|
||||
msg += "O [total_lighting_overlays]"
|
||||
msg += "}"
|
||||
msg += "C:{"
|
||||
msg += "S [round(cost_lights, 1)] | "
|
||||
msg += "C [round(cost_corners, 1)] | "
|
||||
msg += "O [round(cost_overlays, 1)]"
|
||||
msg += "}"
|
||||
..(msg.Join())
|
||||
|
||||
#undef DUAL_TICK_CHECK
|
||||
#undef SSLIGHTING_STAGE_LIGHTS
|
||||
#undef SSLIGHTING_STAGE_CORNERS
|
||||
#undef SSLIGHTING_STAGE_OVERLAYS
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
|
||||
@@ -22,9 +22,9 @@
|
||||
pda_type = /obj/item/device/pda/centcom
|
||||
flags = OUTFIT_EXTENDED_SURVIVAL|OUTFIT_COMPREHENSIVE_SURVIVAL
|
||||
|
||||
post_equip(var/mob/living/carbon/human/H)
|
||||
..()
|
||||
ert.add_antagonist(H.mind)
|
||||
/decl/hierarchy/outfit/job/emergency_responder/post_equip(var/mob/living/carbon/human/H)
|
||||
..()
|
||||
ert.add_antagonist(H.mind)
|
||||
|
||||
/decl/hierarchy/outfit/job/clown
|
||||
name = OUTFIT_JOB_NAME("Clown")
|
||||
@@ -47,7 +47,7 @@
|
||||
id_type = /obj/item/weapon/card/id/civilian/mime
|
||||
pda_type = /obj/item/device/pda/mime
|
||||
|
||||
post_equip(var/mob/living/carbon/human/H)
|
||||
..()
|
||||
if(H.backbag == 1)
|
||||
H.equip_to_slot_or_del(new /obj/item/weapon/pen/crayon/mime(H), slot_l_hand)
|
||||
/decl/hierarchy/outfit/job/mime/post_equip(var/mob/living/carbon/human/H)
|
||||
..()
|
||||
if(H.backbag == 1)
|
||||
H.equip_to_slot_or_del(new /obj/item/weapon/pen/crayon/mime(H), slot_l_hand)
|
||||
|
||||
@@ -85,7 +85,6 @@
|
||||
if(!istype(M,/mob/new_player) && !isdeaf(M))
|
||||
to_chat(M, command)
|
||||
|
||||
<<<<<<< HEAD
|
||||
/datum/announcement/priority/Message(var/message as text, var/message_title as text, var/list/zlevels)
|
||||
global_announcer.autosay("<span class='alert'>[message_title]:</span> [message]", announcer ? announcer : ANNOUNCER_NAME, channel = "Common", zlevels = zlevels)
|
||||
|
||||
@@ -96,13 +95,6 @@
|
||||
global_announcer.autosay("<span class='alert'>[message_title]:</span> [message]", ANNOUNCER_NAME, channel = "Common", zlevels = zlevels)
|
||||
|
||||
/datum/announcement/proc/NewsCast(var/message as text, var/message_title as text)
|
||||
=======
|
||||
/datum/announcement/priority/security/Message(message as text, message_title as text)
|
||||
to_world("<font size=4 color='red'>[message_title]</font>")
|
||||
to_world("<font color='red'>[message]</font>")
|
||||
|
||||
/datum/announcement/proc/NewsCast(message as text, message_title as text)
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
if(!newscast)
|
||||
return
|
||||
|
||||
@@ -115,19 +107,12 @@
|
||||
announce_newscaster_news(news)
|
||||
|
||||
/datum/announcement/proc/PlaySound(var/message_sound, var/list/zlevels)
|
||||
<<<<<<< HEAD
|
||||
=======
|
||||
if(!message_sound)
|
||||
return
|
||||
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
for(var/mob/M in player_list)
|
||||
if(zlevels && !(M.z in zlevels))
|
||||
continue
|
||||
if(!istype(M,/mob/new_player) && !isdeaf(M))
|
||||
M << 'sound/AI/preamble.ogg'
|
||||
|
||||
<<<<<<< HEAD
|
||||
if(!message_sound)
|
||||
return
|
||||
|
||||
@@ -140,17 +125,6 @@
|
||||
|
||||
/datum/announcement/proc/Sound(var/message_sound, var/list/zlevels)
|
||||
PlaySound(message_sound, zlevels)
|
||||
=======
|
||||
/datum/announcement/proc/Sound(var/message_sound, var/list/zlevels)
|
||||
PlaySound(message_sound, zlevels)
|
||||
|
||||
/datum/announcement/priority/Sound(var/message_sound)
|
||||
if(message_sound)
|
||||
world << message_sound
|
||||
|
||||
/datum/announcement/priority/command/Sound(var/message_sound)
|
||||
PlaySound(message_sound)
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
|
||||
/datum/announcement/proc/Log(message as text, message_title as text)
|
||||
if(log)
|
||||
|
||||
@@ -123,41 +123,6 @@ var/global/list/all_objectives = list()
|
||||
return 0
|
||||
return 0
|
||||
|
||||
<<<<<<< HEAD
|
||||
datum/objective/anti_revolution/demote
|
||||
find_target()
|
||||
..()
|
||||
if(target && target.current)
|
||||
var/datum/gender/T = gender_datums[target.current.get_visible_gender()]
|
||||
explanation_text = "[target.current.real_name], the [target.assigned_role] has been classified as harmful to [using_map.company_name]'s goals. Demote [T.him] to assistant."
|
||||
else
|
||||
explanation_text = "Free Objective"
|
||||
return target
|
||||
|
||||
find_target_by_role(role, role_type=0)
|
||||
..(role, role_type)
|
||||
if(target && target.current)
|
||||
var/datum/gender/T = gender_datums[target.current.get_visible_gender()]
|
||||
explanation_text = "[target.current.real_name], the [!role_type ? target.assigned_role : target.special_role] has been classified as harmful to [using_map.company_name]'s goals. Demote [T.him] to assistant."
|
||||
else
|
||||
explanation_text = "Free Objective"
|
||||
return target
|
||||
|
||||
check_completion()
|
||||
if(target && target.current && istype(target,/mob/living/carbon/human))
|
||||
var/obj/item/weapon/card/id/I = target.current:wear_id
|
||||
if(istype(I, /obj/item/device/pda))
|
||||
var/obj/item/device/pda/P = I
|
||||
I = P.id
|
||||
|
||||
if(!istype(I)) return 1
|
||||
|
||||
if(I.assignment == USELESS_JOB) //VOREStation Edit - Visitor not Assistant
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
return 1
|
||||
=======
|
||||
/datum/objective/anti_revolution/demote/find_target()
|
||||
..()
|
||||
if(target && target.current)
|
||||
@@ -166,7 +131,6 @@ datum/objective/anti_revolution/demote
|
||||
else
|
||||
explanation_text = "Free Objective"
|
||||
return target
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
|
||||
/datum/objective/anti_revolution/demote/find_target_by_role(role, role_type=0)
|
||||
..(role, role_type)
|
||||
@@ -186,7 +150,7 @@ datum/objective/anti_revolution/demote
|
||||
|
||||
if(!istype(I)) return 1
|
||||
|
||||
if(I.assignment == "Assistant")
|
||||
if(I.assignment == USELESS_JOB) //VOREStation Edit - Visitor not Assistant
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
|
||||
@@ -21,8 +21,8 @@
|
||||
|
||||
pto_type = PTO_CIVILIAN
|
||||
|
||||
get_access()
|
||||
return get_all_accesses().Copy()
|
||||
/datum/job/centcom_officer/get_access()
|
||||
return get_all_accesses().Copy()
|
||||
|
||||
/datum/job/emergency_responder //For staff managing/leading ERTs
|
||||
title = "Emergency Responder"
|
||||
@@ -47,8 +47,8 @@
|
||||
|
||||
pto_type = PTO_CIVILIAN
|
||||
|
||||
get_access()
|
||||
return get_all_accesses().Copy()
|
||||
/datum/job/emergency_responder/get_access()
|
||||
return get_all_accesses().Copy()
|
||||
|
||||
/datum/job/clown
|
||||
title = "Clown"
|
||||
|
||||
@@ -45,88 +45,13 @@ var/global/datum/controller/occupations/job_master
|
||||
if(J.title == rank) return J
|
||||
return null
|
||||
|
||||
<<<<<<< HEAD
|
||||
proc/AssignRole(var/mob/new_player/player, var/rank, var/latejoin = 0)
|
||||
Debug("Running AR, Player: [player], Rank: [rank], LJ: [latejoin]")
|
||||
if(player && player.mind && rank)
|
||||
var/datum/job/job = GetJob(rank)
|
||||
if(!job)
|
||||
return 0
|
||||
if(job.minimum_character_age && (player.client.prefs.age < job.minimum_character_age))
|
||||
return 0
|
||||
if(jobban_isbanned(player, rank))
|
||||
return 0
|
||||
if(!job.player_old_enough(player.client))
|
||||
return 0
|
||||
//VOREStation Add
|
||||
if(!job.player_has_enough_playtime(player.client))
|
||||
return 0
|
||||
if(!is_job_whitelisted(player, rank))
|
||||
return 0
|
||||
//VOREStation Add End
|
||||
|
||||
var/position_limit = job.total_positions
|
||||
if(!latejoin)
|
||||
position_limit = job.spawn_positions
|
||||
if((job.current_positions < position_limit) || position_limit == -1)
|
||||
Debug("Player: [player] is now Rank: [rank], JCP:[job.current_positions], JPL:[position_limit]")
|
||||
player.mind.assigned_role = rank
|
||||
player.mind.role_alt_title = GetPlayerAltTitle(player, rank)
|
||||
unassigned -= player
|
||||
job.current_positions++
|
||||
return 1
|
||||
Debug("AR has failed, Player: [player], Rank: [rank]")
|
||||
return 0
|
||||
=======
|
||||
/datum/controller/occupations/proc/GetPlayerAltTitle(mob/new_player/player, rank)
|
||||
return player.client.prefs.GetPlayerAltTitle(GetJob(rank))
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
|
||||
/datum/controller/occupations/proc/AssignRole(var/mob/new_player/player, var/rank, var/latejoin = 0)
|
||||
Debug("Running AR, Player: [player], Rank: [rank], LJ: [latejoin]")
|
||||
if(player && player.mind && rank)
|
||||
var/datum/job/job = GetJob(rank)
|
||||
<<<<<<< HEAD
|
||||
if(job && job.total_positions != -1)
|
||||
job.total_positions++
|
||||
return 1
|
||||
return 0
|
||||
|
||||
proc/FindOccupationCandidates(datum/job/job, level, flag)
|
||||
Debug("Running FOC, Job: [job], Level: [level], Flag: [flag]")
|
||||
var/list/candidates = list()
|
||||
for(var/mob/new_player/player in unassigned)
|
||||
if(jobban_isbanned(player, job.title))
|
||||
Debug("FOC isbanned failed, Player: [player]")
|
||||
continue
|
||||
if(!job.player_old_enough(player.client))
|
||||
Debug("FOC player not old enough, Player: [player]")
|
||||
continue
|
||||
if(job.minimum_character_age && (player.client.prefs.age < job.minimum_character_age))
|
||||
Debug("FOC character not old enough, Player: [player]")
|
||||
continue
|
||||
//VOREStation Code Start
|
||||
if(!job.player_has_enough_playtime(player.client))
|
||||
Debug("FOC character not enough playtime, Player: [player]")
|
||||
continue
|
||||
if(!is_job_whitelisted(player, job.title))
|
||||
Debug("FOC is_job_whitelisted failed, Player: [player]")
|
||||
continue
|
||||
//VOREStation Code End
|
||||
if(flag && !(player.client.prefs.be_special & flag))
|
||||
Debug("FOC flag failed, Player: [player], Flag: [flag], ")
|
||||
continue
|
||||
if(player.client.prefs.GetJobDepartment(job, level) & job.flag)
|
||||
Debug("FOC pass, Player: [player], Level:[level]")
|
||||
candidates += player
|
||||
return candidates
|
||||
|
||||
proc/GiveRandomJob(var/mob/new_player/player)
|
||||
Debug("GRJ Giving random job, Player: [player]")
|
||||
for(var/datum/job/job in shuffle(occupations))
|
||||
if(!job)
|
||||
continue
|
||||
=======
|
||||
if(!job)
|
||||
return 0
|
||||
if(job.minimum_character_age && (player.client.prefs.age < job.minimum_character_age))
|
||||
@@ -135,7 +60,12 @@ var/global/datum/controller/occupations/job_master
|
||||
return 0
|
||||
if(!job.player_old_enough(player.client))
|
||||
return 0
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
//VOREStation Add
|
||||
if(!job.player_has_enough_playtime(player.client))
|
||||
return 0
|
||||
if(!is_job_whitelisted(player, rank))
|
||||
return 0
|
||||
//VOREStation Add End
|
||||
|
||||
var/position_limit = job.total_positions
|
||||
if(!latejoin)
|
||||
@@ -150,10 +80,6 @@ var/global/datum/controller/occupations/job_master
|
||||
Debug("AR has failed, Player: [player], Rank: [rank]")
|
||||
return 0
|
||||
|
||||
<<<<<<< HEAD
|
||||
if(istype(job, GetJob(USELESS_JOB))) // We don't want to give him assistant, that's boring! //VOREStation Edit - Visitor not Assistant
|
||||
continue
|
||||
=======
|
||||
/datum/controller/occupations/proc/FreeRole(var/rank) //making additional slot on the fly
|
||||
var/datum/job/job = GetJob(rank)
|
||||
if(job && job.total_positions != -1)
|
||||
@@ -174,6 +100,14 @@ var/global/datum/controller/occupations/job_master
|
||||
if(job.minimum_character_age && (player.client.prefs.age < job.minimum_character_age))
|
||||
Debug("FOC character not old enough, Player: [player]")
|
||||
continue
|
||||
//VOREStation Code Start
|
||||
if(!job.player_has_enough_playtime(player.client))
|
||||
Debug("FOC character not enough playtime, Player: [player]")
|
||||
continue
|
||||
if(!is_job_whitelisted(player, job.title))
|
||||
Debug("FOC is_job_whitelisted failed, Player: [player]")
|
||||
continue
|
||||
//VOREStation Code End
|
||||
if(flag && !(player.client.prefs.be_special & flag))
|
||||
Debug("FOC flag failed, Player: [player], Flag: [flag], ")
|
||||
continue
|
||||
@@ -191,7 +125,7 @@ var/global/datum/controller/occupations/job_master
|
||||
if(job.minimum_character_age && (player.client.prefs.age < job.minimum_character_age))
|
||||
continue
|
||||
|
||||
if(istype(job, GetJob("Assistant"))) // We don't want to give him assistant, that's boring!
|
||||
if(istype(job, GetJob(USELESS_JOB))) // We don't want to give him assistant, that's boring! //VOREStation Edit - Visitor not Assistant
|
||||
continue
|
||||
|
||||
if(SSjob.is_job_in_department(job.title, DEPARTMENT_COMMAND)) //If you want a command position, select it!
|
||||
@@ -205,6 +139,15 @@ var/global/datum/controller/occupations/job_master
|
||||
Debug("GRJ player not old enough, Player: [player]")
|
||||
continue
|
||||
|
||||
//VOREStation Code Start
|
||||
if(!job.player_has_enough_playtime(player.client))
|
||||
Debug("GRJ player not enough playtime, Player: [player]")
|
||||
continue
|
||||
if(!is_job_whitelisted(player, job.title))
|
||||
Debug("GRJ player not whitelisted for this job, Player: [player], Job: [job.title]")
|
||||
continue
|
||||
//VOREStation Code End
|
||||
|
||||
if((job.current_positions < job.spawn_positions) || job.spawn_positions == -1)
|
||||
Debug("GRJ Random job given, Player: [player], Job: [job]")
|
||||
AssignRole(player, job.title)
|
||||
@@ -229,7 +172,6 @@ var/global/datum/controller/occupations/job_master
|
||||
if(!job) continue
|
||||
var/list/candidates = FindOccupationCandidates(job, level)
|
||||
if(!candidates.len) continue
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
|
||||
// Build a weighted list, weight by age.
|
||||
var/list/weightedCandidates = list()
|
||||
@@ -256,23 +198,6 @@ var/global/datum/controller/occupations/job_master
|
||||
// If there's ABSOLUTELY NOBODY ELSE
|
||||
if(candidates.len == 1) weightedCandidates[V] = 1
|
||||
|
||||
<<<<<<< HEAD
|
||||
//VOREStation Code Start
|
||||
if(!job.player_has_enough_playtime(player.client))
|
||||
Debug("GRJ player not enough playtime, Player: [player]")
|
||||
continue
|
||||
if(!is_job_whitelisted(player, job.title))
|
||||
Debug("GRJ player not whitelisted for this job, Player: [player], Job: [job.title]")
|
||||
continue
|
||||
//VOREStation Code End
|
||||
|
||||
if((job.current_positions < job.spawn_positions) || job.spawn_positions == -1)
|
||||
Debug("GRJ Random job given, Player: [player], Job: [job]")
|
||||
AssignRole(player, job.title)
|
||||
unassigned -= player
|
||||
break
|
||||
=======
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
|
||||
var/mob/new_player/candidate = pickweight(weightedCandidates)
|
||||
if(AssignRole(candidate, command_position))
|
||||
@@ -319,20 +244,7 @@ var/global/datum/controller/occupations/job_master
|
||||
//Shuffle players and jobs
|
||||
unassigned = shuffle(unassigned)
|
||||
|
||||
<<<<<<< HEAD
|
||||
//People who wants to be assistants, sure, go on.
|
||||
Debug("DO, Running Assistant Check 1")
|
||||
var/datum/job/assist = new DEFAULT_JOB_TYPE ()
|
||||
var/list/assistant_candidates = FindOccupationCandidates(assist, 3)
|
||||
Debug("AC1, Candidates: [assistant_candidates.len]")
|
||||
for(var/mob/new_player/player in assistant_candidates)
|
||||
Debug("AC1 pass, Player: [player]")
|
||||
AssignRole(player, USELESS_JOB) //VOREStation Edit - Visitor not Assistant
|
||||
assistant_candidates -= player
|
||||
Debug("DO, AC1 end")
|
||||
=======
|
||||
HandleFeedbackGathering()
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
|
||||
//People who wants to be assistants, sure, go on.
|
||||
Debug("DO, Running Assistant Check 1")
|
||||
@@ -341,7 +253,7 @@ var/global/datum/controller/occupations/job_master
|
||||
Debug("AC1, Candidates: [assistant_candidates.len]")
|
||||
for(var/mob/new_player/player in assistant_candidates)
|
||||
Debug("AC1 pass, Player: [player]")
|
||||
AssignRole(player, "Assistant")
|
||||
AssignRole(player, USELESS_JOB) //VOREStation Edit - Visitor not Assistant
|
||||
assistant_candidates -= player
|
||||
Debug("DO, AC1 end")
|
||||
|
||||
@@ -377,20 +289,15 @@ var/global/datum/controller/occupations/job_master
|
||||
Debug("DO isbanned failed, Player: [player], Job:[job.title]")
|
||||
continue
|
||||
|
||||
<<<<<<< HEAD
|
||||
//VOREStation Add
|
||||
if(!job.player_has_enough_playtime(player.client))
|
||||
Debug("DO player not enough playtime, Player: [player]")
|
||||
continue
|
||||
//VOREStation Add End
|
||||
|
||||
// If the player wants that job on this level, then try give it to him.
|
||||
if(player.client.prefs.GetJobDepartment(job, level) & job.flag)
|
||||
=======
|
||||
if(!job.player_old_enough(player.client))
|
||||
Debug("DO player not old enough, Player: [player], Job:[job.title]")
|
||||
continue
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
|
||||
//VOREStation Add
|
||||
if(!job.player_has_enough_playtime(player.client))
|
||||
Debug("DO player not enough playtime, Player: [player]")
|
||||
continue
|
||||
//VOREStation Add End
|
||||
|
||||
// If the player wants that job on this level, then try give it to him.
|
||||
if(player.client.prefs.GetJobDepartment(job, level) & job.flag)
|
||||
@@ -433,15 +340,8 @@ var/global/datum/controller/occupations/job_master
|
||||
for(var/mob/new_player/player in unassigned)
|
||||
if(player.client.prefs.alternate_option == BE_ASSISTANT)
|
||||
Debug("AC2 Assistant located, Player: [player]")
|
||||
AssignRole(player, "Assistant")
|
||||
AssignRole(player, USELESS_JOB) //VOREStation Edit - Visitor not Assistant
|
||||
|
||||
<<<<<<< HEAD
|
||||
// For those who wanted to be assistant if their preferences were filled, here you go.
|
||||
for(var/mob/new_player/player in unassigned)
|
||||
if(player.client.prefs.alternate_option == BE_ASSISTANT)
|
||||
Debug("AC2 Assistant located, Player: [player]")
|
||||
AssignRole(player, USELESS_JOB) //VOREStation Edit - Visitor not Assistant
|
||||
=======
|
||||
//For ones returning to lobby
|
||||
for(var/mob/new_player/player in unassigned)
|
||||
if(player.client.prefs.alternate_option == RETURN_TO_LOBBY)
|
||||
@@ -478,7 +378,6 @@ var/global/datum/controller/occupations/job_master
|
||||
return
|
||||
else
|
||||
H.forceMove(T)
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
|
||||
// Moving wheelchair if they have one
|
||||
if(H.buckled && istype(H.buckled, /obj/structure/bed/chair/wheelchair))
|
||||
@@ -488,7 +387,7 @@ var/global/datum/controller/occupations/job_master
|
||||
if(job)
|
||||
|
||||
//Equip custom gear loadout.
|
||||
var/list/custom_equip_slots = list() //If more than one item takes the same slot, all after the first one spawn in storage.
|
||||
var/list/custom_equip_slots = list()
|
||||
var/list/custom_equip_leftovers = list()
|
||||
if(H.client.prefs.gear && H.client.prefs.gear.len && !(job.mob_type & JOB_SILICON))
|
||||
for(var/thing in H.client.prefs.gear)
|
||||
@@ -521,53 +420,6 @@ var/global/datum/controller/occupations/job_master
|
||||
I.implant_loadout(H)
|
||||
continue
|
||||
|
||||
<<<<<<< HEAD
|
||||
//Equip custom gear loadout.
|
||||
var/list/custom_equip_slots = list()
|
||||
var/list/custom_equip_leftovers = list()
|
||||
if(H.client.prefs.gear && H.client.prefs.gear.len && !(job.mob_type & JOB_SILICON))
|
||||
for(var/thing in H.client.prefs.gear)
|
||||
var/datum/gear/G = gear_datums[thing]
|
||||
if(!G) //Not a real gear datum (maybe removed, as this is loaded from their savefile)
|
||||
continue
|
||||
|
||||
var/permitted
|
||||
// Check if it is restricted to certain roles
|
||||
if(G.allowed_roles)
|
||||
for(var/job_name in G.allowed_roles)
|
||||
if(job.title == job_name)
|
||||
permitted = 1
|
||||
else
|
||||
permitted = 1
|
||||
|
||||
// Check if they're whitelisted for this gear (in alien whitelist? seriously?)
|
||||
if(G.whitelisted && !is_alien_whitelisted(H, GLOB.all_species[G.whitelisted]))
|
||||
permitted = 0
|
||||
|
||||
// If they aren't, tell them
|
||||
if(!permitted)
|
||||
to_chat(H, "<span class='warning'>Your current species, job or whitelist status does not permit you to spawn with [thing]!</span>")
|
||||
continue
|
||||
|
||||
// Implants get special treatment
|
||||
if(G.slot == "implant")
|
||||
var/obj/item/weapon/implant/I = G.spawn_item(H, H.client.prefs.gear[G.display_name])
|
||||
I.invisibility = 100
|
||||
I.implant_loadout(H)
|
||||
continue
|
||||
|
||||
// Try desperately (and sorta poorly) to equip the item. Now with increased desperation!
|
||||
if(G.slot && !(G.slot in custom_equip_slots))
|
||||
var/metadata = H.client.prefs.gear[G.display_name]
|
||||
if(G.slot == slot_wear_mask || G.slot == slot_wear_suit || G.slot == slot_head)
|
||||
custom_equip_leftovers += thing
|
||||
else if(H.equip_to_slot_or_del(G.spawn_item(H, metadata), G.slot))
|
||||
to_chat(H, "<span class='notice'>Equipping you with \the [thing]!</span>")
|
||||
if(G.slot != slot_tie)
|
||||
custom_equip_slots.Add(G.slot)
|
||||
else
|
||||
custom_equip_leftovers.Add(thing)
|
||||
=======
|
||||
// Try desperately (and sorta poorly) to equip the item. Now with increased desperation!
|
||||
if(G.slot && !(G.slot in custom_equip_slots))
|
||||
var/metadata = H.client.prefs.gear[G.display_name]
|
||||
@@ -577,7 +429,6 @@ var/global/datum/controller/occupations/job_master
|
||||
to_chat(H, "<span class='notice'>Equipping you with \the [thing]!</span>")
|
||||
if(G.slot != slot_tie)
|
||||
custom_equip_slots.Add(G.slot)
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
else
|
||||
custom_equip_leftovers.Add(thing)
|
||||
else
|
||||
@@ -613,6 +464,7 @@ var/global/datum/controller/occupations/job_master
|
||||
|
||||
H.job = rank
|
||||
log_game("JOINED [key_name(H)] as \"[rank]\"")
|
||||
log_game("SPECIES [key_name(H)] is a: \"[H.species.name]\"") //VOREStation Add
|
||||
|
||||
// If they're head, give them the account info for their department
|
||||
if(H.mind && job.department_accounts)
|
||||
@@ -654,133 +506,6 @@ var/global/datum/controller/occupations/job_master
|
||||
to_chat(H, "<span class='notice'>Placing \the [thing] in your [B.name]!</span>")
|
||||
var/datum/gear/G = gear_datums[thing]
|
||||
var/metadata = H.client.prefs.gear[G.display_name]
|
||||
<<<<<<< HEAD
|
||||
if(H.equip_to_slot_or_del(G.spawn_item(H, metadata), G.slot))
|
||||
to_chat(H, "<span class='notice'>Equipping you with \the [thing]!</span>")
|
||||
custom_equip_slots.Add(G.slot)
|
||||
else
|
||||
spawn_in_storage += thing
|
||||
else
|
||||
to_chat(H, "Your job is [rank] and the game just can't handle it! Please report this bug to an administrator.")
|
||||
|
||||
H.job = rank
|
||||
log_game("JOINED [key_name(H)] as \"[rank]\"")
|
||||
log_game("SPECIES [key_name(H)] is a: \"[H.species.name]\"") //VOREStation Add
|
||||
|
||||
// If they're head, give them the account info for their department
|
||||
if(H.mind && job.department_accounts)
|
||||
var/remembered_info = ""
|
||||
for(var/D in job.department_accounts)
|
||||
var/datum/money_account/department_account = department_accounts[D]
|
||||
if(department_account)
|
||||
remembered_info += "<b>Department account number ([D]):</b> #[department_account.account_number]<br>"
|
||||
remembered_info += "<b>Department account pin ([D]):</b> [department_account.remote_access_pin]<br>"
|
||||
remembered_info += "<b>Department account funds ([D]):</b> $[department_account.money]<br>"
|
||||
|
||||
H.mind.store_memory(remembered_info)
|
||||
|
||||
var/alt_title = null
|
||||
if(H.mind)
|
||||
H.mind.assigned_role = rank
|
||||
alt_title = H.mind.role_alt_title
|
||||
|
||||
// If we're a silicon, we may be done at this point
|
||||
if(job.mob_type & JOB_SILICON_ROBOT)
|
||||
return H.Robotize()
|
||||
if(job.mob_type & JOB_SILICON_AI)
|
||||
return H
|
||||
|
||||
// TWEET PEEP
|
||||
if(rank == "Site Manager")
|
||||
var/sound/announce_sound = (ticker.current_state <= GAME_STATE_SETTING_UP) ? null : sound('sound/misc/boatswain.ogg', volume=20)
|
||||
captain_announcement.Announce("All hands, [alt_title ? alt_title : "Site Manager"] [H.real_name] on deck!", new_sound = announce_sound, zlevel = H.z)
|
||||
|
||||
//Deferred item spawning.
|
||||
if(spawn_in_storage && spawn_in_storage.len)
|
||||
var/obj/item/weapon/storage/B
|
||||
for(var/obj/item/weapon/storage/S in H.contents)
|
||||
B = S
|
||||
break
|
||||
|
||||
if(!isnull(B))
|
||||
for(var/thing in spawn_in_storage)
|
||||
to_chat(H, "<span class='notice'>Placing \the [thing] in your [B.name]!</span>")
|
||||
var/datum/gear/G = gear_datums[thing]
|
||||
var/metadata = H.client.prefs.gear[G.display_name]
|
||||
G.spawn_item(B, metadata)
|
||||
else
|
||||
to_chat(H, "<span class='danger'>Failed to locate a storage object on your mob, either you spawned with no arms and no backpack or this is a bug.</span>")
|
||||
|
||||
if(istype(H)) //give humans wheelchairs, if they need them.
|
||||
var/obj/item/organ/external/l_foot = H.get_organ("l_foot")
|
||||
var/obj/item/organ/external/r_foot = H.get_organ("r_foot")
|
||||
var/obj/item/weapon/storage/S = locate() in H.contents
|
||||
var/obj/item/wheelchair/R
|
||||
if(S)
|
||||
R = locate() in S.contents
|
||||
if(!l_foot || !r_foot || R)
|
||||
var/wheelchair_type = R?.unfolded_type || /obj/structure/bed/chair/wheelchair
|
||||
var/obj/structure/bed/chair/wheelchair/W = new wheelchair_type(H.loc)
|
||||
W.buckle_mob(H)
|
||||
H.update_canmove()
|
||||
W.set_dir(H.dir)
|
||||
W.add_fingerprint(H)
|
||||
if(R)
|
||||
W.color = R.color
|
||||
qdel(R)
|
||||
|
||||
to_chat(H, "<B>You are [job.total_positions == 1 ? "the" : "a"] [alt_title ? alt_title : rank].</B>")
|
||||
|
||||
if(job.supervisors)
|
||||
to_chat(H, "<b>As the [alt_title ? alt_title : rank] you answer directly to [job.supervisors]. Special circumstances may change this.</b>")
|
||||
if(job.has_headset)
|
||||
H.equip_to_slot_or_del(new /obj/item/device/radio/headset(H), slot_l_ear)
|
||||
to_chat(H, "<b>To speak on your department's radio channel use :h. For the use of other channels, examine your headset.</b>")
|
||||
|
||||
if(job.req_admin_notify)
|
||||
to_chat(H, "<b>You are playing a job that is important for Game Progression. If you have to disconnect, please notify the admins via adminhelp.</b>")
|
||||
|
||||
// EMAIL GENERATION
|
||||
// Email addresses will be created under this domain name. Mostly for the looks.
|
||||
var/domain = "freemail.nt"
|
||||
if(using_map && LAZYLEN(using_map.usable_email_tlds))
|
||||
domain = using_map.usable_email_tlds[1]
|
||||
var/sanitized_name = sanitize(replacetext(replacetext(lowertext(H.real_name), " ", "."), "'", ""))
|
||||
var/complete_login = "[sanitized_name]@[domain]"
|
||||
|
||||
// It is VERY unlikely that we'll have two players, in the same round, with the same name and branch, but still, this is here.
|
||||
// If such conflict is encountered, a random number will be appended to the email address. If this fails too, no email account will be created.
|
||||
if(ntnet_global.does_email_exist(complete_login))
|
||||
complete_login = "[sanitized_name][random_id(/datum/computer_file/data/email_account/, 100, 999)]@[domain]"
|
||||
|
||||
// If even fallback login generation failed, just don't give them an email. The chance of this happening is astronomically low.
|
||||
if(ntnet_global.does_email_exist(complete_login))
|
||||
to_chat(H, "You were not assigned an email address.")
|
||||
H.mind.store_memory("You were not assigned an email address.")
|
||||
else
|
||||
var/datum/computer_file/data/email_account/EA = new/datum/computer_file/data/email_account()
|
||||
EA.password = GenerateKey()
|
||||
EA.login = complete_login
|
||||
to_chat(H, "Your email account address is <b>[EA.login]</b> and the password is <b>[EA.password]</b>. This information has also been placed into your notes.")
|
||||
H.mind.store_memory("Your email account address is [EA.login] and the password is [EA.password].")
|
||||
// END EMAIL GENERATION
|
||||
|
||||
//Gives glasses to the vision impaired
|
||||
if(H.disabilities & NEARSIGHTED)
|
||||
var/equipped = H.equip_to_slot_or_del(new /obj/item/clothing/glasses/regular(H), slot_glasses)
|
||||
if(equipped != 1)
|
||||
var/obj/item/clothing/glasses/G = H.glasses
|
||||
G.prescription = 1
|
||||
|
||||
BITSET(H.hud_updateflag, ID_HUD)
|
||||
BITSET(H.hud_updateflag, IMPLOYAL_HUD)
|
||||
BITSET(H.hud_updateflag, SPECIALROLE_HUD)
|
||||
return H
|
||||
|
||||
proc/LoadJobs(jobsfile) //ran during round setup, reads info from jobs.txt -- Urist
|
||||
if(!config.load_jobs_from_txt)
|
||||
return 0
|
||||
=======
|
||||
G.spawn_item(B, metadata)
|
||||
else
|
||||
to_chat(H, "<span class='danger'>Failed to locate a storage object on your mob, either you spawned with no arms and no backpack or this is a bug.</span>")
|
||||
@@ -854,7 +579,6 @@ var/global/datum/controller/occupations/job_master
|
||||
/datum/controller/occupations/proc/LoadJobs(jobsfile) //ran during round setup, reads info from jobs.txt -- Urist
|
||||
if(!config.load_jobs_from_txt)
|
||||
return 0
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
|
||||
var/list/jobEntries = file2list(jobsfile)
|
||||
|
||||
@@ -887,42 +611,6 @@ var/global/datum/controller/occupations/job_master
|
||||
return 1
|
||||
|
||||
|
||||
<<<<<<< HEAD
|
||||
proc/HandleFeedbackGathering()
|
||||
for(var/datum/job/job in occupations)
|
||||
var/tmp_str = "|[job.title]|"
|
||||
|
||||
var/level1 = 0 //high
|
||||
var/level2 = 0 //medium
|
||||
var/level3 = 0 //low
|
||||
var/level4 = 0 //never
|
||||
var/level5 = 0 //banned
|
||||
var/level6 = 0 //account too young
|
||||
for(var/mob/new_player/player in player_list)
|
||||
if(!(player.ready && player.mind && !player.mind.assigned_role))
|
||||
continue //This player is not ready
|
||||
if(jobban_isbanned(player, job.title))
|
||||
level5++
|
||||
continue
|
||||
if(!job.player_old_enough(player.client))
|
||||
level6++
|
||||
continue
|
||||
//VOREStation Add
|
||||
if(!job.player_has_enough_playtime(player.client))
|
||||
level6++
|
||||
continue
|
||||
//VOREStation Add End
|
||||
if(player.client.prefs.GetJobDepartment(job, 1) & job.flag)
|
||||
level1++
|
||||
else if(player.client.prefs.GetJobDepartment(job, 2) & job.flag)
|
||||
level2++
|
||||
else if(player.client.prefs.GetJobDepartment(job, 3) & job.flag)
|
||||
level3++
|
||||
else level4++ //not selected
|
||||
|
||||
tmp_str += "HIGH=[level1]|MEDIUM=[level2]|LOW=[level3]|NEVER=[level4]|BANNED=[level5]|YOUNG=[level6]|-"
|
||||
feedback_add_details("job_preferences",tmp_str)
|
||||
=======
|
||||
/datum/controller/occupations/proc/HandleFeedbackGathering()
|
||||
for(var/datum/job/job in occupations)
|
||||
var/tmp_str = "|[job.title]|"
|
||||
@@ -942,6 +630,11 @@ var/global/datum/controller/occupations/job_master
|
||||
if(!job.player_old_enough(player.client))
|
||||
level6++
|
||||
continue
|
||||
//VOREStation Add
|
||||
if(!job.player_has_enough_playtime(player.client))
|
||||
level6++
|
||||
continue
|
||||
//VOREStation Add End
|
||||
if(player.client.prefs.GetJobDepartment(job, 1) & job.flag)
|
||||
level1++
|
||||
else if(player.client.prefs.GetJobDepartment(job, 2) & job.flag)
|
||||
@@ -952,7 +645,6 @@ var/global/datum/controller/occupations/job_master
|
||||
|
||||
tmp_str += "HIGH=[level1]|MEDIUM=[level2]|LOW=[level3]|NEVER=[level4]|BANNED=[level5]|YOUNG=[level6]|-"
|
||||
feedback_add_details("job_preferences",tmp_str)
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
|
||||
/datum/controller/occupations/proc/LateSpawn(var/client/C, var/rank)
|
||||
|
||||
|
||||
@@ -305,5 +305,3 @@
|
||||
|
||||
build_eff = man_rating
|
||||
eat_eff = bin_rating
|
||||
|
||||
#undef BIOGENITEM
|
||||
|
||||
@@ -8,14 +8,9 @@
|
||||
var/datum/radio_frequency/radio_connection
|
||||
var/cur_command = null //the command the door is currently attempting to complete
|
||||
|
||||
<<<<<<< HEAD
|
||||
obj/machinery/door/airlock/process()
|
||||
/obj/machinery/door/airlock/process()
|
||||
if (..() == PROCESS_KILL && !cur_command)
|
||||
. = PROCESS_KILL
|
||||
=======
|
||||
/obj/machinery/door/airlock/process()
|
||||
..()
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
if (arePowerSystemsOn())
|
||||
execute_current_command()
|
||||
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
//Handles the control of airlocks
|
||||
|
||||
#define STATE_IDLE 0
|
||||
#define STATE_PREPARE 1
|
||||
#define STATE_DEPRESSURIZE 2
|
||||
@@ -416,8 +415,10 @@ send an additional command to open the door again.
|
||||
signalDoor(doorTag, doorCommand)
|
||||
|
||||
#undef SKIPCYCLE_MARGIN
|
||||
#undef MIN_TARGET_PRESSURE
|
||||
|
||||
#undef STATE_IDLE
|
||||
#undef STATE_PREPARE
|
||||
#undef STATE_DEPRESSURIZE
|
||||
#undef STATE_PRESSURIZE
|
||||
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
<<<<<<< HEAD
|
||||
//
|
||||
// Media Player Jukebox
|
||||
// Rewritten by Leshana from existing Polaris code, merging in D2K5 and N3X15 work
|
||||
@@ -8,15 +7,6 @@
|
||||
#define JUKEMODE_RANDOM 2 // Not shuffle, randomly picks next each time.
|
||||
#define JUKEMODE_REPEAT_SONG 3 // Play the same song over and over
|
||||
#define JUKEMODE_PLAY_ONCE 4 // Play, then stop.
|
||||
=======
|
||||
/datum/track
|
||||
var/title
|
||||
var/sound
|
||||
|
||||
/datum/track/New(var/title_name, var/audio)
|
||||
title = title_name
|
||||
sound = audio
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
|
||||
/obj/machinery/media/jukebox
|
||||
name = "space jukebox"
|
||||
|
||||
@@ -8,63 +8,7 @@
|
||||
circuit = /obj/item/weapon/circuitboard/mecha_control
|
||||
var/list/located = list()
|
||||
var/screen = 0
|
||||
<<<<<<< HEAD
|
||||
var/list/stored_data
|
||||
=======
|
||||
var/stored_data
|
||||
|
||||
/obj/machinery/computer/mecha/attack_ai(var/mob/user as mob)
|
||||
return src.attack_hand(user)
|
||||
|
||||
/obj/machinery/computer/mecha/attack_hand(var/mob/user as mob)
|
||||
if(..())
|
||||
return
|
||||
user.set_machine(src)
|
||||
var/dat = "<html><head><title>[src.name]</title><style>h3 {margin: 0px; padding: 0px;}</style></head><body>"
|
||||
if(screen == 0)
|
||||
dat += "<h3>Tracking beacons data</h3>"
|
||||
for(var/obj/item/mecha_parts/mecha_tracking/TR in world)
|
||||
var/answer = TR.get_mecha_info()
|
||||
if(answer)
|
||||
dat += {"<hr>[answer]<br/>
|
||||
<a href='?src=\ref[src];send_message=\ref[TR]'>Send message</a><br/>
|
||||
<a href='?src=\ref[src];get_log=\ref[TR]'>Show exosuit log</a> | <a style='color: #f00;' href='?src=\ref[src];shock=\ref[TR]'>(EMP pulse)</a><br>"}
|
||||
|
||||
if(screen==1)
|
||||
dat += "<h3>Log contents</h3>"
|
||||
dat += "<a href='?src=\ref[src];return=1'>Return</a><hr>"
|
||||
dat += "[stored_data]"
|
||||
|
||||
dat += "<A href='?src=\ref[src];refresh=1'>(Refresh)</A><BR>"
|
||||
dat += "</body></html>"
|
||||
|
||||
user << browse(dat, "window=computer;size=400x500")
|
||||
onclose(user, "computer")
|
||||
return
|
||||
|
||||
/obj/machinery/computer/mecha/Topic(href, href_list)
|
||||
if(..())
|
||||
return
|
||||
var/datum/topic_input/top_filter = new /datum/topic_input(href,href_list)
|
||||
if(href_list["send_message"])
|
||||
var/obj/item/mecha_parts/mecha_tracking/MT = top_filter.getObj("send_message")
|
||||
var/message = sanitize(input(usr,"Input message","Transmit message") as text)
|
||||
var/obj/mecha/M = MT.in_mecha()
|
||||
if(message && M)
|
||||
M.occupant_message(message)
|
||||
return
|
||||
if(href_list["shock"])
|
||||
var/obj/item/mecha_parts/mecha_tracking/MT = top_filter.getObj("shock")
|
||||
MT.shock()
|
||||
if(href_list["get_log"])
|
||||
var/obj/item/mecha_parts/mecha_tracking/MT = top_filter.getObj("get_log")
|
||||
stored_data = MT.get_mecha_log()
|
||||
screen = 1
|
||||
if(href_list["return"])
|
||||
screen = 0
|
||||
src.updateUsrDialog()
|
||||
return
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
|
||||
/obj/machinery/computer/mecha/attack_ai(mob/user)
|
||||
return attack_hand(user)
|
||||
@@ -133,7 +77,6 @@
|
||||
icon_state = "motion2"
|
||||
origin_tech = list(TECH_DATA = 2, TECH_MAGNET = 2)
|
||||
|
||||
<<<<<<< HEAD
|
||||
/obj/item/mecha_parts/mecha_tracking/tgui_data(mob/user)
|
||||
var/list/data = ..()
|
||||
if(!in_mecha())
|
||||
@@ -159,25 +102,6 @@
|
||||
data["cargoMax"] = RM.cargo_capacity
|
||||
|
||||
return data
|
||||
=======
|
||||
/obj/item/mecha_parts/mecha_tracking/proc/get_mecha_info()
|
||||
if(!in_mecha())
|
||||
return 0
|
||||
var/obj/mecha/M = src.loc
|
||||
var/cell_charge = M.get_charge()
|
||||
var/answer = {"<b>Name:</b> [M.name]<br>
|
||||
<b>Integrity:</b> [M.health/initial(M.health)*100]%<br>
|
||||
<b>Cell charge:</b> [isnull(cell_charge)?"Not found":"[M.cell.percent()]%"]<br>
|
||||
<b>Airtank:</b> [M.return_pressure()]kPa<br>
|
||||
<b>Pilot:</b> [M.occupant||"None"]<br>
|
||||
<b>Location:</b> [get_area(M)||"Unknown"]<br>
|
||||
<b>Active equipment:</b> [M.selected||"None"]"}
|
||||
if(istype(M, /obj/mecha/working/ripley))
|
||||
var/obj/mecha/working/ripley/RM = M
|
||||
answer += "<b>Used cargo space:</b> [RM.cargo.len/RM.cargo_capacity*100]%<br>"
|
||||
|
||||
return answer
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
|
||||
/obj/item/mecha_parts/mecha_tracking/emp_act()
|
||||
qdel(src)
|
||||
@@ -188,13 +112,8 @@
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_tracking/proc/in_mecha()
|
||||
<<<<<<< HEAD
|
||||
if(istype(loc, /obj/mecha))
|
||||
return loc
|
||||
=======
|
||||
if(istype(src.loc, /obj/mecha))
|
||||
return src.loc
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
return 0
|
||||
|
||||
/obj/item/mecha_parts/mecha_tracking/proc/shock()
|
||||
@@ -204,32 +123,12 @@
|
||||
qdel(src)
|
||||
|
||||
/obj/item/mecha_parts/mecha_tracking/proc/get_mecha_log()
|
||||
<<<<<<< HEAD
|
||||
if(!in_mecha())
|
||||
return list()
|
||||
var/obj/mecha/M = loc
|
||||
return M.get_log_tgui()
|
||||
=======
|
||||
if(!src.in_mecha())
|
||||
return 0
|
||||
var/obj/mecha/M = src.loc
|
||||
return M.get_log_html()
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
|
||||
|
||||
/obj/item/weapon/storage/box/mechabeacons
|
||||
name = "Exosuit Tracking Beacons"
|
||||
<<<<<<< HEAD
|
||||
|
||||
/obj/item/weapon/storage/box/mechabeacons/New()
|
||||
..()
|
||||
new /obj/item/mecha_parts/mecha_tracking(src)
|
||||
new /obj/item/mecha_parts/mecha_tracking(src)
|
||||
new /obj/item/mecha_parts/mecha_tracking(src)
|
||||
new /obj/item/mecha_parts/mecha_tracking(src)
|
||||
new /obj/item/mecha_parts/mecha_tracking(src)
|
||||
new /obj/item/mecha_parts/mecha_tracking(src)
|
||||
new /obj/item/mecha_parts/mecha_tracking(src)
|
||||
=======
|
||||
starts_with = list(/obj/item/mecha_parts/mecha_tracking = 7)
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -7,26 +7,27 @@
|
||||
w_class = ITEMSIZE_NORMAL
|
||||
|
||||
|
||||
/obj/item/mecha_parts/micro/chassis/
|
||||
/obj/item/mecha_parts/micro/chassis
|
||||
name="Mecha Chassis"
|
||||
icon_state = "backbone"
|
||||
var/datum/construction/construct
|
||||
|
||||
attackby(obj/item/W as obj, mob/user as mob)
|
||||
if(!construct || !construct.action(W, user))
|
||||
..()
|
||||
return
|
||||
/obj/item/mecha_parts/micro/chassis/attackby(obj/item/W as obj, mob/user as mob)
|
||||
if(!construct || !construct.action(W, user))
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/micro/chassis/attack_hand()
|
||||
return
|
||||
|
||||
attack_hand()
|
||||
return
|
||||
//Gopher
|
||||
/obj/item/mecha_parts/micro/chassis/gopher
|
||||
name = "Gopher Chassis"
|
||||
icon_state = "gopher-chassis"
|
||||
|
||||
New()
|
||||
..()
|
||||
construct = new /datum/construction/mecha/gopher_chassis(src)
|
||||
/obj/item/mecha_parts/micro/chassis/gopher/New()
|
||||
..()
|
||||
construct = new /datum/construction/mecha/gopher_chassis(src)
|
||||
|
||||
/obj/item/mecha_parts/micro/part/gopher_torso
|
||||
name="Gopher Torso"
|
||||
@@ -62,9 +63,10 @@
|
||||
/obj/item/mecha_parts/micro/chassis/polecat
|
||||
name = "Polecat Chassis"
|
||||
icon_state = "polecat-chassis"
|
||||
New()
|
||||
..()
|
||||
construct = new /datum/construction/mecha/polecat_chassis(src)
|
||||
|
||||
/obj/item/mecha_parts/micro/chassis/polecat/New()
|
||||
..()
|
||||
construct = new /datum/construction/mecha/polecat_chassis(src)
|
||||
|
||||
/obj/item/mecha_parts/micro/part/polecat_torso
|
||||
name="Polecat Torso"
|
||||
@@ -100,9 +102,10 @@
|
||||
/obj/item/mecha_parts/micro/chassis/weasel
|
||||
name = "Weasel Chassis"
|
||||
icon_state = "weasel-chassis"
|
||||
New()
|
||||
..()
|
||||
construct = new /datum/construction/mecha/weasel_chassis(src)
|
||||
|
||||
/obj/item/mecha_parts/micro/chassis/weasel/New()
|
||||
..()
|
||||
construct = new /datum/construction/mecha/weasel_chassis(src)
|
||||
|
||||
/obj/item/mecha_parts/micro/part/weasel_torso
|
||||
name="Weasel Torso"
|
||||
|
||||
@@ -61,25 +61,25 @@
|
||||
equip_type = EQUIP_MICRO_WEAPON
|
||||
required_type = list(/obj/mecha/micro/sec)
|
||||
|
||||
Topic(href,href_list)
|
||||
..()
|
||||
if(href_list["mode"])
|
||||
mode = text2num(href_list["mode"])
|
||||
switch(mode)
|
||||
if(0)
|
||||
occupant_message("Now firing buckshot.")
|
||||
projectile = /obj/item/projectile/bullet/pellet/shotgun
|
||||
if(1)
|
||||
occupant_message("Now firing beanbags.")
|
||||
projectile = /obj/item/projectile/bullet/shotgun/beanbag
|
||||
if(2)
|
||||
occupant_message("Now firing slugs.")
|
||||
projectile = /obj/item/projectile/bullet/shotgun
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/microshotgun/Topic(href,href_list)
|
||||
..()
|
||||
if(href_list["mode"])
|
||||
mode = text2num(href_list["mode"])
|
||||
switch(mode)
|
||||
if(0)
|
||||
occupant_message("Now firing buckshot.")
|
||||
projectile = /obj/item/projectile/bullet/pellet/shotgun
|
||||
if(1)
|
||||
occupant_message("Now firing beanbags.")
|
||||
projectile = /obj/item/projectile/bullet/shotgun/beanbag
|
||||
if(2)
|
||||
occupant_message("Now firing slugs.")
|
||||
projectile = /obj/item/projectile/bullet/shotgun
|
||||
|
||||
return
|
||||
return
|
||||
|
||||
get_equip_info()
|
||||
return "[..()] \[<a href='?src=\ref[src];mode=0'>BS</a>|<a href='?src=\ref[src];mode=1'>BB</a>|<a href='?src=\ref[src];mode=2'>S</a>\]"
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/microshotgun/get_equip_info()
|
||||
return "[..()] \[<a href='?src=\ref[src];mode=0'>BS</a>|<a href='?src=\ref[src];mode=1'>BB</a>|<a href='?src=\ref[src];mode=2'>S</a>\]"
|
||||
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/grenade/microflashbang
|
||||
@@ -113,44 +113,44 @@
|
||||
equip_type = EQUIP_MICRO_UTILITY
|
||||
required_type = list(/obj/mecha/micro/utility)
|
||||
|
||||
action(atom/target)
|
||||
if(!action_checks(target)) return
|
||||
if(isobj(target))
|
||||
var/obj/target_obj = target
|
||||
if(!target_obj.vars.Find("unacidable") || target_obj.unacidable) return
|
||||
set_ready_state(0)
|
||||
chassis.use_power(energy_drain)
|
||||
chassis.visible_message("<span class='danger'>[chassis] starts to drill [target]</span>", "<span class='warning'>You hear the drill.</span>")
|
||||
occupant_message("<span class='danger'>You start to drill [target]</span>")
|
||||
var/T = chassis.loc
|
||||
var/C = target.loc //why are these backwards? we may never know -Pete
|
||||
if(do_after_cooldown(target))
|
||||
if(T == chassis.loc && src == chassis.selected)
|
||||
if(istype(target, /turf/simulated/wall))
|
||||
var/turf/simulated/wall/W = target
|
||||
if(W.reinf_material)
|
||||
occupant_message("<span class='warning'>[target] is too durable to drill through.</span>")
|
||||
else
|
||||
log_message("Drilled through [target]")
|
||||
target.ex_act(2)
|
||||
else if(istype(target, /turf/simulated/mineral))
|
||||
for(var/turf/simulated/mineral/M in range(chassis,1))
|
||||
if(get_dir(chassis,M)&chassis.dir)
|
||||
M.GetDrilled()
|
||||
log_message("Drilled through [target]")
|
||||
var/obj/item/mecha_parts/mecha_equipment/tool/micro/orescoop/ore_box = (locate(/obj/item/mecha_parts/mecha_equipment/tool/micro/orescoop) in chassis.equipment)
|
||||
if(ore_box)
|
||||
for(var/obj/item/weapon/ore/ore in range(chassis,1))
|
||||
if(get_dir(chassis,ore)&chassis.dir)
|
||||
if (ore_box.contents.len >= ore_box.orecapacity)
|
||||
occupant_message("<span class='warning'>The ore compartment is full.</span>")
|
||||
return 1
|
||||
else
|
||||
ore.forceMove(ore_box)
|
||||
else if(target.loc == C)
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/drill/micro/action(atom/target)
|
||||
if(!action_checks(target)) return
|
||||
if(isobj(target))
|
||||
var/obj/target_obj = target
|
||||
if(!target_obj.vars.Find("unacidable") || target_obj.unacidable) return
|
||||
set_ready_state(0)
|
||||
chassis.use_power(energy_drain)
|
||||
chassis.visible_message("<span class='danger'>[chassis] starts to drill [target]</span>", "<span class='warning'>You hear the drill.</span>")
|
||||
occupant_message("<span class='danger'>You start to drill [target]</span>")
|
||||
var/T = chassis.loc
|
||||
var/C = target.loc //why are these backwards? we may never know -Pete
|
||||
if(do_after_cooldown(target))
|
||||
if(T == chassis.loc && src == chassis.selected)
|
||||
if(istype(target, /turf/simulated/wall))
|
||||
var/turf/simulated/wall/W = target
|
||||
if(W.reinf_material)
|
||||
occupant_message("<span class='warning'>[target] is too durable to drill through.</span>")
|
||||
else
|
||||
log_message("Drilled through [target]")
|
||||
target.ex_act(2)
|
||||
return 1
|
||||
else if(istype(target, /turf/simulated/mineral))
|
||||
for(var/turf/simulated/mineral/M in range(chassis,1))
|
||||
if(get_dir(chassis,M)&chassis.dir)
|
||||
M.GetDrilled()
|
||||
log_message("Drilled through [target]")
|
||||
var/obj/item/mecha_parts/mecha_equipment/tool/micro/orescoop/ore_box = (locate(/obj/item/mecha_parts/mecha_equipment/tool/micro/orescoop) in chassis.equipment)
|
||||
if(ore_box)
|
||||
for(var/obj/item/weapon/ore/ore in range(chassis,1))
|
||||
if(get_dir(chassis,ore)&chassis.dir)
|
||||
if (ore_box.contents.len >= ore_box.orecapacity)
|
||||
occupant_message("<span class='warning'>The ore compartment is full.</span>")
|
||||
return 1
|
||||
else
|
||||
ore.forceMove(ore_box)
|
||||
else if(target.loc == C)
|
||||
log_message("Drilled through [target]")
|
||||
target.ex_act(2)
|
||||
return 1
|
||||
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/micro/orescoop
|
||||
@@ -165,38 +165,38 @@
|
||||
required_type = list(/obj/mecha/micro/utility)
|
||||
var/orecapacity = 500
|
||||
|
||||
action(atom/target)
|
||||
if(!action_checks(target)) return
|
||||
set_ready_state(0)
|
||||
chassis.use_power(energy_drain)
|
||||
chassis.visible_message("<span class='info'>[chassis] sweeps around with its ore scoop.</span>")
|
||||
occupant_message("<span class='info'>You sweep around the area with the scoop.</span>")
|
||||
var/T = chassis.loc
|
||||
//var/C = target.loc //why are these backwards? we may never know -Pete
|
||||
if(do_after_cooldown(target))
|
||||
if(T == chassis.loc && src == chassis.selected)
|
||||
for(var/obj/item/weapon/ore/ore in range(chassis,1))
|
||||
if(get_dir(chassis,ore)&chassis.dir)
|
||||
if (contents.len >= orecapacity)
|
||||
occupant_message("<span class='warning'>The ore compartment is full.</span>")
|
||||
return 1
|
||||
else
|
||||
ore.Move(src)
|
||||
return 1
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/micro/orescoop/action(atom/target)
|
||||
if(!action_checks(target)) return
|
||||
set_ready_state(0)
|
||||
chassis.use_power(energy_drain)
|
||||
chassis.visible_message("<span class='info'>[chassis] sweeps around with its ore scoop.</span>")
|
||||
occupant_message("<span class='info'>You sweep around the area with the scoop.</span>")
|
||||
var/T = chassis.loc
|
||||
//var/C = target.loc //why are these backwards? we may never know -Pete
|
||||
if(do_after_cooldown(target))
|
||||
if(T == chassis.loc && src == chassis.selected)
|
||||
for(var/obj/item/weapon/ore/ore in range(chassis,1))
|
||||
if(get_dir(chassis,ore)&chassis.dir)
|
||||
if (contents.len >= orecapacity)
|
||||
occupant_message("<span class='warning'>The ore compartment is full.</span>")
|
||||
return 1
|
||||
else
|
||||
ore.Move(src)
|
||||
return 1
|
||||
|
||||
Topic(href,href_list)
|
||||
..()
|
||||
if (href_list["empty_box"])
|
||||
if(contents.len < 1)
|
||||
occupant_message("The ore compartment is empty.")
|
||||
return
|
||||
for (var/obj/item/weapon/ore/O in contents)
|
||||
contents -= O
|
||||
O.loc = chassis.loc
|
||||
occupant_message("Ore compartment emptied.")
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/micro/orescoop/Topic(href,href_list)
|
||||
..()
|
||||
if (href_list["empty_box"])
|
||||
if(contents.len < 1)
|
||||
occupant_message("The ore compartment is empty.")
|
||||
return
|
||||
for (var/obj/item/weapon/ore/O in contents)
|
||||
contents -= O
|
||||
O.loc = chassis.loc
|
||||
occupant_message("Ore compartment emptied.")
|
||||
|
||||
get_equip_info()
|
||||
return "[..()] <br /><a href='?src=\ref[src];empty_box=1'>Empty ore compartment</a>"
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/micro/orescoop/get_equip_info()
|
||||
return "[..()] <br /><a href='?src=\ref[src];empty_box=1'>Empty ore compartment</a>"
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/tool/orescoop/verb/empty_box() //so you can still get the ore out if someone detaches it from the mech
|
||||
set name = "Empty Ore compartment"
|
||||
|
||||
@@ -10,33 +10,33 @@
|
||||
/datum/effect/effect/system/confetti_spread
|
||||
var/total_sparks = 0 // To stop it being spammed and lagging!
|
||||
|
||||
set_up(n = 3, c = 0, loca)
|
||||
if(n > 10)
|
||||
n = 10
|
||||
number = n
|
||||
cardinals = c
|
||||
if(istype(loca, /turf/))
|
||||
location = loca
|
||||
else
|
||||
location = get_turf(loca)
|
||||
/datum/effect/effect/system/confetti_spread/set_up(n = 3, c = 0, loca)
|
||||
if(n > 10)
|
||||
n = 10
|
||||
number = n
|
||||
cardinals = c
|
||||
if(istype(loca, /turf/))
|
||||
location = loca
|
||||
else
|
||||
location = get_turf(loca)
|
||||
|
||||
start()
|
||||
var/i = 0
|
||||
for(i=0, i<src.number, i++)
|
||||
if(src.total_sparks > 20)
|
||||
return
|
||||
spawn(0)
|
||||
if(holder)
|
||||
src.location = get_turf(holder)
|
||||
var/obj/effect/effect/sparks/confetti = new /obj/effect/effect/sparks/confetti(src.location)
|
||||
src.total_sparks++
|
||||
var/direction
|
||||
if(src.cardinals)
|
||||
direction = pick(cardinal)
|
||||
else
|
||||
direction = pick(alldirs)
|
||||
for(i=0, i<pick(1,2,3), i++)
|
||||
sleep(5)
|
||||
step(confetti,direction)
|
||||
spawn(20)
|
||||
src.total_sparks--
|
||||
/datum/effect/effect/system/confetti_spread/start()
|
||||
var/i = 0
|
||||
for(i=0, i<src.number, i++)
|
||||
if(src.total_sparks > 20)
|
||||
return
|
||||
spawn(0)
|
||||
if(holder)
|
||||
src.location = get_turf(holder)
|
||||
var/obj/effect/effect/sparks/confetti = new /obj/effect/effect/sparks/confetti(src.location)
|
||||
src.total_sparks++
|
||||
var/direction
|
||||
if(src.cardinals)
|
||||
direction = pick(cardinal)
|
||||
else
|
||||
direction = pick(alldirs)
|
||||
for(i=0, i<pick(1,2,3), i++)
|
||||
sleep(5)
|
||||
step(confetti,direction)
|
||||
spawn(20)
|
||||
src.total_sparks--
|
||||
@@ -72,88 +72,6 @@ var/global/list/image/fluidtrack_cache=list()
|
||||
* @param goingdir Direction tracks are going to (or 0).
|
||||
* @param bloodcolor Color of the blood when wet.
|
||||
*/
|
||||
<<<<<<< HEAD
|
||||
proc/AddTracks(var/list/DNA, var/comingdir, var/goingdir, var/bloodcolor="#A10808")
|
||||
var/updated=0
|
||||
// Shift our goingdir 4 spaces to the left so it's in the GOING bitblock.
|
||||
var/realgoing=goingdir<<4
|
||||
|
||||
// Current bit
|
||||
var/b=0
|
||||
|
||||
// When tracks will start to dry out
|
||||
var/t=world.time + TRACKS_CRUSTIFY_TIME
|
||||
|
||||
var/datum/fluidtrack/track
|
||||
|
||||
// Process 4 bits
|
||||
for(var/bi=0;bi<4;bi++)
|
||||
b=1<<bi
|
||||
// COMING BIT
|
||||
// If setting
|
||||
if(comingdir&b)
|
||||
// If not wet or not set
|
||||
if(dirs&b)
|
||||
var/sid=setdirs["[b]"]
|
||||
track=stack[sid]
|
||||
if(track.wet==t && track.basecolor==bloodcolor)
|
||||
continue
|
||||
// Remove existing stack entry
|
||||
stack.Remove(track)
|
||||
track=new /datum/fluidtrack(b,bloodcolor,t)
|
||||
stack.Add(track)
|
||||
setdirs["[b]"]=stack.Find(track)
|
||||
updatedtracks |= b
|
||||
updated=1
|
||||
|
||||
// GOING BIT (shift up 4)
|
||||
b=b<<4
|
||||
if(realgoing&b)
|
||||
// If not wet or not set
|
||||
if(dirs&b)
|
||||
var/sid=setdirs["[b]"]
|
||||
track=stack[sid]
|
||||
if(track.wet==t && track.basecolor==bloodcolor)
|
||||
continue
|
||||
// Remove existing stack entry
|
||||
stack.Remove(track)
|
||||
track=new /datum/fluidtrack(b,bloodcolor,t)
|
||||
stack.Add(track)
|
||||
setdirs["[b]"]=stack.Find(track)
|
||||
updatedtracks |= b
|
||||
updated=1
|
||||
|
||||
dirs |= comingdir|realgoing
|
||||
if(islist(blood_DNA))
|
||||
blood_DNA |= DNA.Copy()
|
||||
if(updated)
|
||||
update_icon()
|
||||
|
||||
update_icon()
|
||||
cut_overlays()
|
||||
color = "#FFFFFF"
|
||||
var/truedir=0
|
||||
|
||||
// Update ONLY the overlays that have changed.
|
||||
for(var/datum/fluidtrack/track in stack)
|
||||
var/stack_idx=setdirs["[track.direction]"]
|
||||
var/state=coming_state
|
||||
truedir=track.direction
|
||||
if(truedir&240) // Check if we're in the GOING block
|
||||
state=going_state
|
||||
truedir=truedir>>4
|
||||
|
||||
if(track.overlay)
|
||||
track.overlay=null
|
||||
var/image/I = image(icon, icon_state=state, dir=num2dir(truedir))
|
||||
I.color = track.basecolor
|
||||
|
||||
track.fresh=0
|
||||
track.overlay=I
|
||||
stack[stack_idx]=track
|
||||
add_overlay(I)
|
||||
updatedtracks=0 // Clear our memory of updated tracks.
|
||||
=======
|
||||
/obj/effect/decal/cleanable/blood/tracks/proc/AddTracks(var/list/DNA, var/comingdir, var/goingdir, var/bloodcolor="#A10808")
|
||||
var/updated=0
|
||||
// Shift our goingdir 4 spaces to the left so it's in the GOING bitblock.
|
||||
@@ -211,7 +129,7 @@ var/global/list/image/fluidtrack_cache=list()
|
||||
update_icon()
|
||||
|
||||
/obj/effect/decal/cleanable/blood/tracks/update_icon()
|
||||
overlays.Cut()
|
||||
cut_overlays()
|
||||
color = "#FFFFFF"
|
||||
var/truedir=0
|
||||
|
||||
@@ -232,9 +150,8 @@ var/global/list/image/fluidtrack_cache=list()
|
||||
track.fresh=0
|
||||
track.overlay=I
|
||||
stack[stack_idx]=track
|
||||
overlays += I
|
||||
add_overlay(I)
|
||||
updatedtracks=0 // Clear our memory of updated tracks.
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
|
||||
/obj/effect/decal/cleanable/blood/tracks/footprints
|
||||
name = "wet footprints"
|
||||
|
||||
@@ -24,12 +24,7 @@
|
||||
mainOverlay.Blend(main,ICON_ADD)
|
||||
shadeOverlay.Blend(shade,ICON_ADD)
|
||||
|
||||
<<<<<<< HEAD
|
||||
add_overlay(mainOverlay)
|
||||
add_overlay(shadeOverlay)
|
||||
=======
|
||||
overlays += mainOverlay
|
||||
overlays += shadeOverlay
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
add_overlay(mainOverlay)
|
||||
add_overlay(shadeOverlay)
|
||||
|
||||
add_hiddenprint(usr)
|
||||
@@ -436,5 +436,3 @@
|
||||
|
||||
if("newsfeed")
|
||||
newsfeed_channel = text2num(params["newsfeed"])
|
||||
|
||||
#undef DEFAULT_MAP_SIZE
|
||||
@@ -9,61 +9,6 @@
|
||||
var/icon/virtualIcon
|
||||
var/list/bulletholes = list()
|
||||
|
||||
<<<<<<< HEAD
|
||||
Destroy()
|
||||
// if a target is deleted and associated with a stake, force stake to forget
|
||||
for(var/obj/structure/target_stake/T in view(3,src))
|
||||
if(T.pinned_target == src)
|
||||
T.pinned_target = null
|
||||
T.density = 1
|
||||
break
|
||||
..() // delete target
|
||||
|
||||
Moved(atom/old_loc, direction, forced = FALSE)
|
||||
. = ..()
|
||||
// After target moves, check for nearby stakes. If associated, move to target
|
||||
for(var/obj/structure/target_stake/M in view(3,src))
|
||||
if(M.density == 0 && M.pinned_target == src)
|
||||
M.forceMove(loc)
|
||||
|
||||
// This may seem a little counter-intuitive but I assure you that's for a purpose.
|
||||
// Stakes are the ones that carry targets, yes, but in the stake code we set
|
||||
// a stake's density to 0 meaning it can't be pushed anymore. Instead of pushing
|
||||
// the stake now, we have to push the target.
|
||||
|
||||
|
||||
|
||||
attackby(obj/item/W as obj, mob/user as mob)
|
||||
if (istype(W, /obj/item/weapon/weldingtool))
|
||||
var/obj/item/weapon/weldingtool/WT = W
|
||||
if(WT.remove_fuel(0, user))
|
||||
cut_overlays()
|
||||
to_chat(usr, "You slice off [src]'s uneven chunks of aluminum and scorch marks.")
|
||||
return
|
||||
|
||||
|
||||
attack_hand(mob/user as mob)
|
||||
// taking pinned targets off!
|
||||
var/obj/structure/target_stake/stake
|
||||
for(var/obj/structure/target_stake/T in view(3,src))
|
||||
if(T.pinned_target == src)
|
||||
stake = T
|
||||
break
|
||||
|
||||
if(stake)
|
||||
if(stake.pinned_target)
|
||||
stake.density = 1
|
||||
density = 0
|
||||
layer = OBJ_LAYER
|
||||
|
||||
loc = user.loc
|
||||
if(ishuman(user))
|
||||
if(!user.get_active_hand())
|
||||
user.put_in_hands(src)
|
||||
to_chat(user, "You take the target out of the stake.")
|
||||
else
|
||||
src.loc = get_turf(user)
|
||||
=======
|
||||
/obj/item/target/Destroy()
|
||||
// if a target is deleted and associated with a stake, force stake to forget
|
||||
for(var/obj/structure/target_stake/T in view(3,src))
|
||||
@@ -91,7 +36,7 @@
|
||||
if (istype(W, /obj/item/weapon/weldingtool))
|
||||
var/obj/item/weapon/weldingtool/WT = W
|
||||
if(WT.remove_fuel(0, user))
|
||||
overlays.Cut()
|
||||
cut_overlays()
|
||||
to_chat(usr, "You slice off [src]'s uneven chunks of aluminum and scorch marks.")
|
||||
return
|
||||
|
||||
@@ -114,7 +59,6 @@
|
||||
if(ishuman(user))
|
||||
if(!user.get_active_hand())
|
||||
user.put_in_hands(src)
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
to_chat(user, "You take the target out of the stake.")
|
||||
else
|
||||
src.loc = get_turf(user)
|
||||
|
||||
@@ -430,6 +430,6 @@
|
||||
/datum/stack_recipe_list
|
||||
var/title = "ERROR"
|
||||
var/list/recipes = null
|
||||
New(title, recipes)
|
||||
src.title = title
|
||||
src.recipes = recipes
|
||||
/datum/stack_recipe_list/New(title, recipes)
|
||||
src.title = title
|
||||
src.recipes = recipes
|
||||
|
||||
@@ -10,13 +10,13 @@
|
||||
var/taurtype = /datum/sprite_accessory/tail/taur/horse //Acceptable taur type to be wearing this
|
||||
var/no_message = "You aren't the appropriate taur type to wear this!"
|
||||
|
||||
mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0)
|
||||
if(..())
|
||||
if(istype(H) && istype(H.tail_style, taurtype))
|
||||
return 1
|
||||
else
|
||||
to_chat(H, "<span class='warning'>[no_message]</span>")
|
||||
return 0
|
||||
/obj/item/weapon/storage/backpack/saddlebag/mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0)
|
||||
if(..())
|
||||
if(istype(H) && istype(H.tail_style, taurtype))
|
||||
return 1
|
||||
else
|
||||
to_chat(H, "<span class='warning'>[no_message]</span>")
|
||||
return 0
|
||||
|
||||
/* If anyone wants to make some... this is how you would.
|
||||
/obj/item/weapon/storage/backpack/saddlebag/spider
|
||||
@@ -38,15 +38,15 @@
|
||||
slowdown = 1 //And are slower, too...
|
||||
var/no_message = "You aren't the appropriate taur type to wear this!"
|
||||
|
||||
mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0)
|
||||
if(..())
|
||||
if(!istype(H))//Error, non HUMAN.
|
||||
log_runtime("[H] was not a valid human!")
|
||||
return
|
||||
/obj/item/weapon/storage/backpack/saddlebag_common/mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0)
|
||||
if(..())
|
||||
if(!istype(H))//Error, non HUMAN.
|
||||
log_runtime("[H] was not a valid human!")
|
||||
return
|
||||
|
||||
var/datum/sprite_accessory/tail/taur/TT = H.tail_style
|
||||
item_state = "[icon_base]_[TT.icon_sprite_tag]" //icon_sprite_tag is something like "deer"
|
||||
return 1
|
||||
var/datum/sprite_accessory/tail/taur/TT = H.tail_style
|
||||
item_state = "[icon_base]_[TT.icon_sprite_tag]" //icon_sprite_tag is something like "deer"
|
||||
return 1
|
||||
|
||||
|
||||
|
||||
|
||||
+121
-121
@@ -4,88 +4,88 @@
|
||||
icon = 'icons/obj/gun.dmi'
|
||||
icon_state = "p08"
|
||||
spawn_nothing_percentage = 50
|
||||
item_to_spawn()
|
||||
return pick(prob(11);/obj/random/ammo_all,\
|
||||
prob(11);/obj/item/weapon/gun/energy/laser,\
|
||||
prob(11);/obj/item/weapon/gun/projectile/pirate,\
|
||||
prob(10);/obj/item/weapon/material/twohanded/spear,\
|
||||
prob(10);/obj/item/weapon/gun/energy/stunrevolver,\
|
||||
prob(10);/obj/item/weapon/gun/energy/taser,\
|
||||
prob(10);/obj/item/weapon/gun/projectile/shotgun/doublebarrel/pellet,\
|
||||
prob(10);/obj/item/weapon/material/knife,\
|
||||
prob(10);/obj/item/weapon/gun/projectile/luger,\
|
||||
/* prob(10);/obj/item/weapon/gun/projectile/pipegun,\ */
|
||||
prob(10);/obj/item/weapon/gun/projectile/revolver/detective,\
|
||||
prob(10);/obj/item/weapon/gun/projectile/revolver/judge,\
|
||||
prob(10);/obj/item/weapon/gun/projectile/colt,\
|
||||
prob(10);/obj/item/weapon/gun/projectile/shotgun/pump,\
|
||||
prob(10);/obj/item/weapon/gun/projectile/shotgun/pump/rifle,\
|
||||
prob(10);/obj/item/weapon/melee/baton,\
|
||||
prob(10);/obj/item/weapon/melee/telebaton,\
|
||||
prob(10);/obj/item/weapon/melee/classic_baton,\
|
||||
prob(9);/obj/item/weapon/gun/projectile/automatic/wt550/lethal,\
|
||||
prob(9);/obj/item/weapon/gun/projectile/automatic/pdw,\
|
||||
prob(9);/obj/item/weapon/gun/projectile/automatic/sol, \
|
||||
prob(9);/obj/item/weapon/gun/energy/crossbow/largecrossbow,\
|
||||
prob(9);/obj/item/weapon/gun/projectile/pistol,\
|
||||
prob(9);/obj/item/weapon/gun/projectile/shotgun/pump,\
|
||||
prob(9);/obj/item/weapon/cane/concealed,\
|
||||
prob(9);/obj/item/weapon/gun/energy/gun,\
|
||||
prob(8);/obj/item/weapon/gun/energy/retro,\
|
||||
prob(8);/obj/item/weapon/gun/energy/gun/eluger,\
|
||||
prob(8);/obj/item/weapon/gun/energy/xray,\
|
||||
prob(8);/obj/item/weapon/gun/projectile/automatic/c20r,\
|
||||
prob(8);/obj/item/weapon/melee/energy/sword,\
|
||||
prob(8);/obj/item/weapon/gun/projectile/derringer,\
|
||||
prob(8);/obj/item/weapon/gun/projectile/revolver/lemat,\
|
||||
/* prob(8);/obj/item/weapon/gun/projectile/shotgun/pump/rifle/mosin,\ */
|
||||
/* prob(8);/obj/item/weapon/gun/projectile/automatic/m41a,\ */
|
||||
prob(7);/obj/item/weapon/material/butterfly,\
|
||||
prob(7);/obj/item/weapon/material/butterfly/switchblade,\
|
||||
prob(7);/obj/item/weapon/gun/projectile/giskard,\
|
||||
prob(7);/obj/item/weapon/gun/projectile/automatic/p90,\
|
||||
prob(7);/obj/item/weapon/gun/projectile/automatic/sts35,\
|
||||
prob(7);/obj/item/weapon/gun/projectile/shotgun/pump/combat,\
|
||||
prob(6);/obj/item/weapon/gun/energy/sniperrifle,\
|
||||
prob(6);/obj/item/weapon/gun/projectile/automatic/z8,\
|
||||
prob(6);/obj/item/weapon/gun/energy/captain,\
|
||||
prob(6);/obj/item/weapon/material/knife/tacknife,\
|
||||
prob(5);/obj/item/weapon/gun/projectile/shotgun/pump/USDF,\
|
||||
prob(5);/obj/item/weapon/gun/projectile/giskard/olivaw,\
|
||||
prob(5);/obj/item/weapon/gun/projectile/revolver/consul,\
|
||||
prob(5);/obj/item/weapon/gun/projectile/revolver/mateba,\
|
||||
prob(5);/obj/item/weapon/gun/projectile/revolver,\
|
||||
prob(4);/obj/item/weapon/gun/projectile/deagle,\
|
||||
prob(4);/obj/item/weapon/material/knife/tacknife/combatknife,\
|
||||
prob(4);/obj/item/weapon/melee/energy/sword,\
|
||||
prob(4);/obj/item/weapon/gun/projectile/automatic/mini_uzi,\
|
||||
prob(4);/obj/item/weapon/gun/projectile/contender,\
|
||||
prob(4);/obj/item/weapon/gun/projectile/contender/tacticool,\
|
||||
prob(3);/obj/item/weapon/gun/projectile/SVD,\
|
||||
prob(3);/obj/item/weapon/gun/energy/lasercannon,\
|
||||
prob(3);/obj/item/weapon/gun/projectile/shotgun/pump/rifle/lever,\
|
||||
prob(3);/obj/item/weapon/gun/projectile/automatic/bullpup,\
|
||||
prob(2);/obj/item/weapon/gun/energy/pulse_rifle,\
|
||||
prob(2);/obj/item/weapon/gun/energy/gun/nuclear,\
|
||||
prob(2);/obj/item/weapon/gun/projectile/automatic/l6_saw,\
|
||||
prob(2);/obj/item/weapon/gun/energy/gun/burst,\
|
||||
prob(2);/obj/item/weapon/storage/box/frags,\
|
||||
prob(2);/obj/item/weapon/twohanded/fireaxe,\
|
||||
prob(2);/obj/item/weapon/gun/projectile/luger/brown,\
|
||||
prob(2);/obj/item/weapon/gun/launcher/crossbow,\
|
||||
/* prob(1);/obj/item/weapon/gun/projectile/automatic/battlerifle,\ */ // Too OP
|
||||
prob(1);/obj/item/weapon/gun/projectile/deagle/gold,\
|
||||
prob(1);/obj/item/weapon/gun/energy/imperial,\
|
||||
prob(1);/obj/item/weapon/gun/projectile/automatic/as24,\
|
||||
prob(1);/obj/item/weapon/gun/launcher/rocket,\
|
||||
prob(1);/obj/item/weapon/gun/launcher/grenade,\
|
||||
prob(1);/obj/item/weapon/gun/projectile/gyropistol,\
|
||||
prob(1);/obj/item/weapon/gun/projectile/heavysniper,\
|
||||
prob(1);/obj/item/weapon/plastique,\
|
||||
prob(1);/obj/item/weapon/gun/energy/ionrifle,\
|
||||
prob(1);/obj/item/weapon/material/sword,\
|
||||
prob(1);/obj/item/weapon/cane/concealed,\
|
||||
prob(1);/obj/item/weapon/material/sword/katana)
|
||||
/obj/random/weapon/item_to_spawn()
|
||||
return pick(prob(11);/obj/random/ammo_all,\
|
||||
prob(11);/obj/item/weapon/gun/energy/laser,\
|
||||
prob(11);/obj/item/weapon/gun/projectile/pirate,\
|
||||
prob(10);/obj/item/weapon/material/twohanded/spear,\
|
||||
prob(10);/obj/item/weapon/gun/energy/stunrevolver,\
|
||||
prob(10);/obj/item/weapon/gun/energy/taser,\
|
||||
prob(10);/obj/item/weapon/gun/projectile/shotgun/doublebarrel/pellet,\
|
||||
prob(10);/obj/item/weapon/material/knife,\
|
||||
prob(10);/obj/item/weapon/gun/projectile/luger,\
|
||||
/* prob(10);/obj/item/weapon/gun/projectile/pipegun,\ */
|
||||
prob(10);/obj/item/weapon/gun/projectile/revolver/detective,\
|
||||
prob(10);/obj/item/weapon/gun/projectile/revolver/judge,\
|
||||
prob(10);/obj/item/weapon/gun/projectile/colt,\
|
||||
prob(10);/obj/item/weapon/gun/projectile/shotgun/pump,\
|
||||
prob(10);/obj/item/weapon/gun/projectile/shotgun/pump/rifle,\
|
||||
prob(10);/obj/item/weapon/melee/baton,\
|
||||
prob(10);/obj/item/weapon/melee/telebaton,\
|
||||
prob(10);/obj/item/weapon/melee/classic_baton,\
|
||||
prob(9);/obj/item/weapon/gun/projectile/automatic/wt550/lethal,\
|
||||
prob(9);/obj/item/weapon/gun/projectile/automatic/pdw,\
|
||||
prob(9);/obj/item/weapon/gun/projectile/automatic/sol, \
|
||||
prob(9);/obj/item/weapon/gun/energy/crossbow/largecrossbow,\
|
||||
prob(9);/obj/item/weapon/gun/projectile/pistol,\
|
||||
prob(9);/obj/item/weapon/gun/projectile/shotgun/pump,\
|
||||
prob(9);/obj/item/weapon/cane/concealed,\
|
||||
prob(9);/obj/item/weapon/gun/energy/gun,\
|
||||
prob(8);/obj/item/weapon/gun/energy/retro,\
|
||||
prob(8);/obj/item/weapon/gun/energy/gun/eluger,\
|
||||
prob(8);/obj/item/weapon/gun/energy/xray,\
|
||||
prob(8);/obj/item/weapon/gun/projectile/automatic/c20r,\
|
||||
prob(8);/obj/item/weapon/melee/energy/sword,\
|
||||
prob(8);/obj/item/weapon/gun/projectile/derringer,\
|
||||
prob(8);/obj/item/weapon/gun/projectile/revolver/lemat,\
|
||||
/* prob(8);/obj/item/weapon/gun/projectile/shotgun/pump/rifle/mosin,\ */
|
||||
/* prob(8);/obj/item/weapon/gun/projectile/automatic/m41a,\ */
|
||||
prob(7);/obj/item/weapon/material/butterfly,\
|
||||
prob(7);/obj/item/weapon/material/butterfly/switchblade,\
|
||||
prob(7);/obj/item/weapon/gun/projectile/giskard,\
|
||||
prob(7);/obj/item/weapon/gun/projectile/automatic/p90,\
|
||||
prob(7);/obj/item/weapon/gun/projectile/automatic/sts35,\
|
||||
prob(7);/obj/item/weapon/gun/projectile/shotgun/pump/combat,\
|
||||
prob(6);/obj/item/weapon/gun/energy/sniperrifle,\
|
||||
prob(6);/obj/item/weapon/gun/projectile/automatic/z8,\
|
||||
prob(6);/obj/item/weapon/gun/energy/captain,\
|
||||
prob(6);/obj/item/weapon/material/knife/tacknife,\
|
||||
prob(5);/obj/item/weapon/gun/projectile/shotgun/pump/USDF,\
|
||||
prob(5);/obj/item/weapon/gun/projectile/giskard/olivaw,\
|
||||
prob(5);/obj/item/weapon/gun/projectile/revolver/consul,\
|
||||
prob(5);/obj/item/weapon/gun/projectile/revolver/mateba,\
|
||||
prob(5);/obj/item/weapon/gun/projectile/revolver,\
|
||||
prob(4);/obj/item/weapon/gun/projectile/deagle,\
|
||||
prob(4);/obj/item/weapon/material/knife/tacknife/combatknife,\
|
||||
prob(4);/obj/item/weapon/melee/energy/sword,\
|
||||
prob(4);/obj/item/weapon/gun/projectile/automatic/mini_uzi,\
|
||||
prob(4);/obj/item/weapon/gun/projectile/contender,\
|
||||
prob(4);/obj/item/weapon/gun/projectile/contender/tacticool,\
|
||||
prob(3);/obj/item/weapon/gun/projectile/SVD,\
|
||||
prob(3);/obj/item/weapon/gun/energy/lasercannon,\
|
||||
prob(3);/obj/item/weapon/gun/projectile/shotgun/pump/rifle/lever,\
|
||||
prob(3);/obj/item/weapon/gun/projectile/automatic/bullpup,\
|
||||
prob(2);/obj/item/weapon/gun/energy/pulse_rifle,\
|
||||
prob(2);/obj/item/weapon/gun/energy/gun/nuclear,\
|
||||
prob(2);/obj/item/weapon/gun/projectile/automatic/l6_saw,\
|
||||
prob(2);/obj/item/weapon/gun/energy/gun/burst,\
|
||||
prob(2);/obj/item/weapon/storage/box/frags,\
|
||||
prob(2);/obj/item/weapon/twohanded/fireaxe,\
|
||||
prob(2);/obj/item/weapon/gun/projectile/luger/brown,\
|
||||
prob(2);/obj/item/weapon/gun/launcher/crossbow,\
|
||||
/* prob(1);/obj/item/weapon/gun/projectile/automatic/battlerifle,\ */ // Too OP
|
||||
prob(1);/obj/item/weapon/gun/projectile/deagle/gold,\
|
||||
prob(1);/obj/item/weapon/gun/energy/imperial,\
|
||||
prob(1);/obj/item/weapon/gun/projectile/automatic/as24,\
|
||||
prob(1);/obj/item/weapon/gun/launcher/rocket,\
|
||||
prob(1);/obj/item/weapon/gun/launcher/grenade,\
|
||||
prob(1);/obj/item/weapon/gun/projectile/gyropistol,\
|
||||
prob(1);/obj/item/weapon/gun/projectile/heavysniper,\
|
||||
prob(1);/obj/item/weapon/plastique,\
|
||||
prob(1);/obj/item/weapon/gun/energy/ionrifle,\
|
||||
prob(1);/obj/item/weapon/material/sword,\
|
||||
prob(1);/obj/item/weapon/cane/concealed,\
|
||||
prob(1);/obj/item/weapon/material/sword/katana)
|
||||
|
||||
/obj/random/weapon/guarenteed
|
||||
spawn_nothing_percentage = 0
|
||||
@@ -95,45 +95,45 @@
|
||||
desc = "This is random ammunition. Spawns all ammo types."
|
||||
icon = 'icons/obj/ammo.dmi'
|
||||
icon_state = "666"
|
||||
item_to_spawn()
|
||||
return pick(prob(5);/obj/item/weapon/storage/box/shotgunammo,\
|
||||
prob(5);/obj/item/weapon/storage/box/shotgunshells,\
|
||||
prob(5);/obj/item/ammo_magazine/clip/c762,\
|
||||
prob(5);/obj/item/ammo_magazine/m380,\
|
||||
prob(5);/obj/item/ammo_magazine/m45,\
|
||||
prob(5);/obj/item/ammo_magazine/m9mm,\
|
||||
prob(5);/obj/item/ammo_magazine/s38,\
|
||||
prob(4);/obj/item/ammo_magazine/clip/c45,\
|
||||
prob(4);/obj/item/ammo_magazine/clip/c9mm,\
|
||||
prob(4);/obj/item/ammo_magazine/m45uzi,\
|
||||
prob(4);/obj/item/ammo_magazine/m9mml,\
|
||||
prob(4);/obj/item/ammo_magazine/m9mmt,\
|
||||
prob(4);/obj/item/ammo_magazine/m9mmp90,\
|
||||
prob(4);/obj/item/ammo_magazine/m10mm,\
|
||||
prob(4);/obj/item/ammo_magazine/m545/small,\
|
||||
prob(3);/obj/item/ammo_magazine/clip/c10mm,\
|
||||
prob(3);/obj/item/ammo_magazine/clip/c44,\
|
||||
prob(3);/obj/item/ammo_magazine/s44,\
|
||||
prob(3);/obj/item/ammo_magazine/m762,\
|
||||
prob(3);/obj/item/ammo_magazine/m545,\
|
||||
prob(3);/obj/item/weapon/cell/device/weapon,\
|
||||
prob(2);/obj/item/ammo_magazine/m44,\
|
||||
prob(2);/obj/item/ammo_magazine/s357,\
|
||||
prob(2);/obj/item/ammo_magazine/m762m,\
|
||||
prob(2);/obj/item/ammo_magazine/clip/c12g,
|
||||
prob(2);/obj/item/ammo_magazine/clip/c12g/pellet,\
|
||||
prob(1);/obj/item/ammo_magazine/m45tommy,\
|
||||
/* prob(1);/obj/item/ammo_magazine/m95,\ */
|
||||
prob(1);/obj/item/ammo_casing/rocket,\
|
||||
prob(1);/obj/item/weapon/storage/box/sniperammo,\
|
||||
prob(1);/obj/item/weapon/storage/box/flashshells,\
|
||||
prob(1);/obj/item/weapon/storage/box/beanbags,\
|
||||
prob(1);/obj/item/weapon/storage/box/stunshells,\
|
||||
prob(1);/obj/item/ammo_magazine/mtg,\
|
||||
prob(1);/obj/item/ammo_magazine/m12gdrum,\
|
||||
prob(1);/obj/item/ammo_magazine/m12gdrum/pellet,\
|
||||
prob(1);/obj/item/ammo_magazine/m45tommydrum
|
||||
)
|
||||
/obj/random/ammo_all/item_to_spawn()
|
||||
return pick(prob(5);/obj/item/weapon/storage/box/shotgunammo,\
|
||||
prob(5);/obj/item/weapon/storage/box/shotgunshells,\
|
||||
prob(5);/obj/item/ammo_magazine/clip/c762,\
|
||||
prob(5);/obj/item/ammo_magazine/m380,\
|
||||
prob(5);/obj/item/ammo_magazine/m45,\
|
||||
prob(5);/obj/item/ammo_magazine/m9mm,\
|
||||
prob(5);/obj/item/ammo_magazine/s38,\
|
||||
prob(4);/obj/item/ammo_magazine/clip/c45,\
|
||||
prob(4);/obj/item/ammo_magazine/clip/c9mm,\
|
||||
prob(4);/obj/item/ammo_magazine/m45uzi,\
|
||||
prob(4);/obj/item/ammo_magazine/m9mml,\
|
||||
prob(4);/obj/item/ammo_magazine/m9mmt,\
|
||||
prob(4);/obj/item/ammo_magazine/m9mmp90,\
|
||||
prob(4);/obj/item/ammo_magazine/m10mm,\
|
||||
prob(4);/obj/item/ammo_magazine/m545/small,\
|
||||
prob(3);/obj/item/ammo_magazine/clip/c10mm,\
|
||||
prob(3);/obj/item/ammo_magazine/clip/c44,\
|
||||
prob(3);/obj/item/ammo_magazine/s44,\
|
||||
prob(3);/obj/item/ammo_magazine/m762,\
|
||||
prob(3);/obj/item/ammo_magazine/m545,\
|
||||
prob(3);/obj/item/weapon/cell/device/weapon,\
|
||||
prob(2);/obj/item/ammo_magazine/m44,\
|
||||
prob(2);/obj/item/ammo_magazine/s357,\
|
||||
prob(2);/obj/item/ammo_magazine/m762m,\
|
||||
prob(2);/obj/item/ammo_magazine/clip/c12g,
|
||||
prob(2);/obj/item/ammo_magazine/clip/c12g/pellet,\
|
||||
prob(1);/obj/item/ammo_magazine/m45tommy,\
|
||||
/* prob(1);/obj/item/ammo_magazine/m95,\ */
|
||||
prob(1);/obj/item/ammo_casing/rocket,\
|
||||
prob(1);/obj/item/weapon/storage/box/sniperammo,\
|
||||
prob(1);/obj/item/weapon/storage/box/flashshells,\
|
||||
prob(1);/obj/item/weapon/storage/box/beanbags,\
|
||||
prob(1);/obj/item/weapon/storage/box/stunshells,\
|
||||
prob(1);/obj/item/ammo_magazine/mtg,\
|
||||
prob(1);/obj/item/ammo_magazine/m12gdrum,\
|
||||
prob(1);/obj/item/ammo_magazine/m12gdrum/pellet,\
|
||||
prob(1);/obj/item/ammo_magazine/m45tommydrum
|
||||
)
|
||||
|
||||
/obj/random/cargopod
|
||||
name = "Random Cargo Item"
|
||||
|
||||
@@ -1,10 +1,5 @@
|
||||
<<<<<<< HEAD
|
||||
proc/createRandomZlevel()
|
||||
if(awaydestinations.len || UNIT_TEST) //crude, but it saves another var! //VOREStation Edit - No loading away missions during CI testing
|
||||
=======
|
||||
/proc/createRandomZlevel()
|
||||
if(awaydestinations.len) //crude, but it saves another var!
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
if(awaydestinations.len || UNIT_TEST) //crude, but it saves another var! //VOREStation Edit - No loading away missions during CI testing
|
||||
return
|
||||
|
||||
var/list/potentialRandomZlevels = list()
|
||||
|
||||
@@ -140,11 +140,7 @@
|
||||
return TOPIC_REFRESH
|
||||
|
||||
else if(href_list["metadata"])
|
||||
<<<<<<< HEAD
|
||||
var/new_metadata = sanitize(input(user, "Enter any information you'd like others to see, such as Roleplay-preferences:", "Game Preference" , html_decode(pref.metadata)) as message, extra = 0) //VOREStation Edit
|
||||
=======
|
||||
var/new_metadata = sanitize(input(user, "Enter any information you'd like others to see, such as Roleplay-preferences:", "Game Preference" , pref.metadata) as message|null)
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
var/new_metadata = sanitize(input(user, "Enter any information you'd like others to see, such as Roleplay-preferences:", "Game Preference" , html_decode(pref.metadata)) as message|null, extra = 0) //VOREStation Edit
|
||||
if(new_metadata && CanUseTopic(user))
|
||||
pref.metadata = new_metadata
|
||||
return TOPIC_REFRESH
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -135,10 +135,10 @@
|
||||
tgarscreen_path = /datum/tgui_module/crew_monitor/glasses
|
||||
enables_planes = list(VIS_CH_ID,VIS_CH_HEALTH_VR,VIS_CH_STATUS_R,VIS_CH_BACKUP,VIS_AUGMENTED)
|
||||
|
||||
ar_interact(var/mob/living/carbon/human/user)
|
||||
if(tgarscreen)
|
||||
tgarscreen.tgui_interact(user)
|
||||
return 1
|
||||
/obj/item/clothing/glasses/omnihud/med/ar_interact(var/mob/living/carbon/human/user)
|
||||
if(tgarscreen)
|
||||
tgarscreen.tgui_interact(user)
|
||||
return 1
|
||||
|
||||
/obj/item/clothing/glasses/omnihud/sec
|
||||
name = "\improper AR-S glasses"
|
||||
@@ -151,10 +151,10 @@
|
||||
tgarscreen_path = /datum/tgui_module/alarm_monitor/security/glasses
|
||||
enables_planes = list(VIS_CH_ID,VIS_CH_HEALTH_VR,VIS_CH_WANTED,VIS_AUGMENTED)
|
||||
|
||||
ar_interact(var/mob/living/carbon/human/user)
|
||||
if(tgarscreen)
|
||||
tgarscreen.tgui_interact(user)
|
||||
return 1
|
||||
/obj/item/clothing/glasses/omnihud/sec/ar_interact(var/mob/living/carbon/human/user)
|
||||
if(tgarscreen)
|
||||
tgarscreen.tgui_interact(user)
|
||||
return 1
|
||||
|
||||
/obj/item/clothing/glasses/omnihud/eng
|
||||
name = "\improper AR-E glasses"
|
||||
@@ -166,10 +166,10 @@
|
||||
action_button_name = "AR Console (Station Alerts)"
|
||||
tgarscreen_path = /datum/tgui_module/alarm_monitor/engineering/glasses
|
||||
|
||||
ar_interact(var/mob/living/carbon/human/user)
|
||||
if(tgarscreen)
|
||||
tgarscreen.tgui_interact(user)
|
||||
return 1
|
||||
/obj/item/clothing/glasses/omnihud/eng/ar_interact(var/mob/living/carbon/human/user)
|
||||
if(tgarscreen)
|
||||
tgarscreen.tgui_interact(user)
|
||||
return 1
|
||||
|
||||
/obj/item/clothing/glasses/omnihud/rnd
|
||||
name = "\improper AR-R glasses"
|
||||
@@ -226,10 +226,10 @@
|
||||
action_button_name = "AR Console (All Alerts)"
|
||||
tgarscreen_path = /datum/tgui_module/alarm_monitor/all/glasses
|
||||
|
||||
ar_interact(var/mob/living/carbon/human/user)
|
||||
if(tgarscreen)
|
||||
tgarscreen.tgui_interact(user)
|
||||
return 1
|
||||
/obj/item/clothing/glasses/omnihud/all/ar_interact(var/mob/living/carbon/human/user)
|
||||
if(tgarscreen)
|
||||
tgarscreen.tgui_interact(user)
|
||||
return 1
|
||||
|
||||
/obj/item/clothing/glasses/hud/security/eyepatch
|
||||
name = "Security Hudpatch"
|
||||
|
||||
@@ -114,7 +114,7 @@
|
||||
icon_state = "talon_captain_cap"
|
||||
item_state = "taloncaptaincap"
|
||||
|
||||
obj/item/clothing/head/beret/talon
|
||||
/obj/item/clothing/head/beret/talon
|
||||
name = "ITV beret"
|
||||
desc = "It's a basic baret colored to match ITV's uniforms."
|
||||
icon = 'icons/obj/clothing/hats_vr.dmi'
|
||||
@@ -122,7 +122,7 @@ obj/item/clothing/head/beret/talon
|
||||
icon_state = "beret_talon"
|
||||
item_state = "baret_talon"
|
||||
|
||||
obj/item/clothing/head/beret/talon/command
|
||||
/obj/item/clothing/head/beret/talon/command
|
||||
name = "ITV officer beret"
|
||||
desc = "It's a basic baret colored to match ITV's uniforms with a badge pinned on the front. Perfect for commanders."
|
||||
icon = 'icons/obj/clothing/hats_vr.dmi'
|
||||
|
||||
@@ -19,13 +19,13 @@
|
||||
icon = 'icons/mob/taursuits_wolf_vr.dmi'
|
||||
icon_state = "wolf_item"
|
||||
item_state = "heavy_wolf_armor"
|
||||
mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0)
|
||||
if(..())
|
||||
if(istype(H) && istype(H.tail_style, /datum/sprite_accessory/tail/taur/wolf))
|
||||
return ..()
|
||||
else
|
||||
to_chat(H,"<span class='warning'>You need to have a wolf-taur half to wear this.</span>")
|
||||
return 0
|
||||
/obj/item/clothing/suit/armor/vest/wolftaur/mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0)
|
||||
if(..())
|
||||
if(istype(H) && istype(H.tail_style, /datum/sprite_accessory/tail/taur/wolf))
|
||||
return ..()
|
||||
else
|
||||
to_chat(H,"<span class='warning'>You need to have a wolf-taur half to wear this.</span>")
|
||||
return 0
|
||||
|
||||
// HoS armor improved by Vorestation to be slightly better than normal security stuff.
|
||||
/obj/item/clothing/suit/storage/vest/hoscoat
|
||||
|
||||
@@ -104,12 +104,8 @@
|
||||
matter = list("glass" = 175)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass/on_reagent_change()
|
||||
<<<<<<< HEAD
|
||||
cut_overlays()
|
||||
=======
|
||||
overlays.Cut()
|
||||
name = "shot glass"
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
|
||||
if(!reagents.total_volume)
|
||||
return
|
||||
@@ -120,17 +116,9 @@
|
||||
if(4 to 7) filling.icon_state = "[icon_state]5"
|
||||
if(8 to INFINITY) filling.icon_state = "[icon_state]12"
|
||||
|
||||
<<<<<<< HEAD
|
||||
filling.color += reagents.get_color()
|
||||
add_overlay(filling)
|
||||
name = "shot glass of " + reagents.get_master_reagent_name() //No matter what, the glass will tell you the reagent's name. Might be too abusable in the future.
|
||||
else
|
||||
name = "shot glass"
|
||||
=======
|
||||
filling.color += reagents.get_color()
|
||||
overlays += filling
|
||||
add_overlay(filling)
|
||||
name += " of [reagents.get_master_reagent_name()]" //No matter what, the glass will tell you the reagent's name. Might be too abusable in the future.
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/fitnessflask
|
||||
name = "fitness shaker"
|
||||
|
||||
@@ -371,5 +371,4 @@
|
||||
#undef LUM_FALLOFF
|
||||
#undef REMOVE_CORNER
|
||||
#undef APPLY_CORNER
|
||||
#undef REMOVE_CORNER_SIMPLE
|
||||
#undef APPLY_CORNER_SIMPLE
|
||||
@@ -1,4 +1,3 @@
|
||||
<<<<<<< HEAD
|
||||
/mob/observer
|
||||
name = "observer"
|
||||
desc = "This shouldn't appear"
|
||||
@@ -838,7 +837,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
plane_holder.set_vis(VIS_FULLBRIGHT, !seedarkness) //Inversion, because "not seeing" the darkness is "seeing" the lighting plane master.
|
||||
plane_holder.set_vis(VIS_GHOSTS, ghostvision)
|
||||
|
||||
mob/observer/dead/MayRespawn(var/feedback = 0)
|
||||
/mob/observer/dead/MayRespawn(var/feedback = 0)
|
||||
if(!client)
|
||||
return 0
|
||||
if(mind && mind.current && mind.current.stat != DEAD && can_reenter_corpse)
|
||||
@@ -968,965 +967,3 @@ mob/observer/dead/MayRespawn(var/feedback = 0)
|
||||
set name = "Respawn"
|
||||
set category = "Ghost"
|
||||
src.abandon_mob()
|
||||
=======
|
||||
/mob/observer
|
||||
name = "observer"
|
||||
desc = "This shouldn't appear"
|
||||
density = 0
|
||||
|
||||
/mob/observer/dead
|
||||
name = "ghost"
|
||||
desc = "It's a g-g-g-g-ghooooost!" //jinkies!
|
||||
icon = 'icons/mob/ghost.dmi'
|
||||
icon_state = "ghost"
|
||||
stat = DEAD
|
||||
canmove = 0
|
||||
blinded = 0
|
||||
anchored = 1 // don't get pushed around
|
||||
|
||||
var/can_reenter_corpse
|
||||
var/datum/hud/living/carbon/hud = null // hud
|
||||
var/bootime = 0
|
||||
var/started_as_observer //This variable is set to 1 when you enter the game as an observer.
|
||||
//If you died in the game and are a ghsot - this will remain as null.
|
||||
//Note that this is not a reliable way to determine if admins started as observers, since they change mobs a lot.
|
||||
var/has_enabled_antagHUD = 0
|
||||
var/medHUD = 0
|
||||
var/secHUD = 0
|
||||
var/antagHUD = 0
|
||||
universal_speak = 1
|
||||
var/atom/movable/following = null
|
||||
var/admin_ghosted = 0
|
||||
var/anonsay = 0
|
||||
var/ghostvision = 1 //is the ghost able to see things humans can't?
|
||||
incorporeal_move = 1
|
||||
|
||||
var/is_manifest = 0 //If set to 1, the ghost is able to whisper. Usually only set if a cultist drags them through the veil.
|
||||
var/ghost_sprite = null
|
||||
var/global/list/possible_ghost_sprites = list(
|
||||
"Clear" = "blank",
|
||||
"Green Blob" = "otherthing",
|
||||
"Bland" = "ghost",
|
||||
"Robed-B" = "ghost1",
|
||||
"Robed-BAlt" = "ghost2",
|
||||
"King" = "ghostking",
|
||||
"Shade" = "shade",
|
||||
"Hecate" = "ghost-narsie",
|
||||
"Glowing Statue" = "armour",
|
||||
"Artificer" = "artificer",
|
||||
"Behemoth" = "behemoth",
|
||||
"Harvester" = "harvester",
|
||||
"Wraith" = "wraith",
|
||||
"Viscerator" = "viscerator",
|
||||
"Corgi" = "corgi",
|
||||
"Tamaskan" = "tamaskan",
|
||||
"Black Cat" = "blackcat",
|
||||
"Lizard" = "lizard",
|
||||
"Goat" = "goat",
|
||||
"Space Bear" = "bear",
|
||||
"Bats" = "bat",
|
||||
"Chicken" = "chicken_white",
|
||||
"Parrot"= "parrot_fly",
|
||||
"Goose" = "goose",
|
||||
"Penguin" = "penguin",
|
||||
"Brown Crab" = "crab",
|
||||
"Gray Crab" = "evilcrab",
|
||||
"Trout" = "trout-swim",
|
||||
"Salmon" = "salmon-swim",
|
||||
"Pike" = "pike-swim",
|
||||
"Koi" = "koi-swim",
|
||||
"Carp" = "carp",
|
||||
"Red Robes" = "robe_red",
|
||||
"Faithless" = "faithless",
|
||||
"Shadowform" = "forgotten",
|
||||
"Dark Ethereal" = "bloodguardian",
|
||||
"Holy Ethereal" = "lightguardian",
|
||||
"Red Elemental" = "magicRed",
|
||||
"Blue Elemental" = "magicBlue",
|
||||
"Pink Elemental" = "magicPink",
|
||||
"Orange Elemental" = "magicOrange",
|
||||
"Green Elemental" = "magicGreen",
|
||||
"Daemon" = "daemon",
|
||||
"Guard Spider" = "guard",
|
||||
"Hunter Spider" = "hunter",
|
||||
"Nurse Spider" = "nurse",
|
||||
"Rogue Drone" = "drone",
|
||||
"ED-209" = "ed209",
|
||||
"Beepsky" = "secbot"
|
||||
)
|
||||
var/last_revive_notification = null // world.time of last notification, used to avoid spamming players from defibs or cloners.
|
||||
var/cleanup_timer // Refernece to a timer that will delete this mob if no client returns
|
||||
|
||||
/mob/observer/dead/New(mob/body)
|
||||
|
||||
appearance = body
|
||||
invisibility = INVISIBILITY_OBSERVER
|
||||
layer = BELOW_MOB_LAYER
|
||||
plane = PLANE_GHOSTS
|
||||
alpha = 127
|
||||
|
||||
sight |= SEE_TURFS | SEE_MOBS | SEE_OBJS | SEE_SELF
|
||||
see_invisible = SEE_INVISIBLE_OBSERVER
|
||||
see_in_dark = world.view //I mean. I don't even know if byond has occlusion culling... but...
|
||||
verbs += /mob/observer/dead/proc/dead_tele
|
||||
|
||||
var/turf/T
|
||||
if(ismob(body))
|
||||
T = get_turf(body) //Where is the body located?
|
||||
attack_log = body.attack_log //preserve our attack logs by copying them to our ghost
|
||||
gender = body.gender
|
||||
if(body.mind && body.mind.name)
|
||||
name = body.mind.name
|
||||
else
|
||||
if(body.real_name)
|
||||
name = body.real_name
|
||||
else
|
||||
if(gender == MALE)
|
||||
name = capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names))
|
||||
else
|
||||
name = capitalize(pick(first_names_female)) + " " + capitalize(pick(last_names))
|
||||
|
||||
mind = body.mind //we don't transfer the mind but we keep a reference to it.
|
||||
|
||||
// Fix for naked ghosts.
|
||||
// Unclear why this isn't being grabbed by appearance.
|
||||
if(ishuman(body))
|
||||
var/mob/living/carbon/human/H = body
|
||||
add_overlay(H.overlays_standing)
|
||||
|
||||
if(!T) T = pick(latejoin) //Safety in case we cannot find the body's position
|
||||
forceMove(T)
|
||||
|
||||
if(!name) //To prevent nameless ghosts
|
||||
name = capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names))
|
||||
real_name = name
|
||||
animate(src, pixel_y = 2, time = 10, loop = -1)
|
||||
..()
|
||||
|
||||
/mob/observer/dead/Topic(href, href_list)
|
||||
if (href_list["track"])
|
||||
var/mob/target = locate(href_list["track"]) in mob_list
|
||||
if(target)
|
||||
ManualFollow(target)
|
||||
if(href_list["reenter"])
|
||||
reenter_corpse()
|
||||
return
|
||||
|
||||
/mob/observer/dead/attackby(obj/item/W, mob/user)
|
||||
if(istype(W,/obj/item/weapon/book/tome))
|
||||
var/mob/observer/dead/M = src
|
||||
M.manifest(user)
|
||||
|
||||
/mob/observer/dead/CanPass(atom/movable/mover, turf/target)
|
||||
return TRUE
|
||||
|
||||
/mob/observer/dead/set_stat(var/new_stat)
|
||||
if(new_stat != DEAD)
|
||||
CRASH("It is best if observers stay dead, thank you.")
|
||||
|
||||
/mob/observer/dead/examine_icon()
|
||||
var/icon/I = get_cached_examine_icon(src)
|
||||
if(!I)
|
||||
I = getFlatIcon(src, defdir = SOUTH, no_anim = TRUE)
|
||||
set_cached_examine_icon(src, I, 200 SECONDS)
|
||||
return I
|
||||
|
||||
/mob/observer/dead/examine(mob/user)
|
||||
. = ..()
|
||||
|
||||
if(is_admin(user))
|
||||
. += "\t><span class='admin'>[ADMIN_FULLMONTY(src)]</span>"
|
||||
|
||||
/*
|
||||
Transfer_mind is there to check if mob is being deleted/not going to have a body.
|
||||
Works together with spawning an observer, noted above.
|
||||
*/
|
||||
|
||||
/mob/observer/dead/Life()
|
||||
..()
|
||||
if(!loc) return
|
||||
if(!client) return 0
|
||||
|
||||
handle_regular_hud_updates()
|
||||
handle_vision()
|
||||
|
||||
/mob/proc/ghostize(var/can_reenter_corpse = 1)
|
||||
if(key)
|
||||
if(ishuman(src))
|
||||
var/mob/living/carbon/human/H = src
|
||||
if(H.vr_holder && !can_reenter_corpse)
|
||||
H.exit_vr()
|
||||
return 0
|
||||
var/mob/observer/dead/ghost = new(src) //Transfer safety to observer spawning proc.
|
||||
ghost.can_reenter_corpse = can_reenter_corpse
|
||||
ghost.timeofdeath = src.timeofdeath //BS12 EDIT
|
||||
ghost.key = key
|
||||
if(istype(loc, /obj/structure/morgue))
|
||||
var/obj/structure/morgue/M = loc
|
||||
M.update()
|
||||
else if(istype(loc, /obj/structure/closet/body_bag))
|
||||
var/obj/structure/closet/body_bag/B = loc
|
||||
B.update()
|
||||
if(ghost.client)
|
||||
ghost.client.time_died_as_mouse = ghost.timeofdeath
|
||||
if(ghost.client && !ghost.client.holder && !config.antag_hud_allowed) // For new ghosts we remove the verb from even showing up if it's not allowed.
|
||||
ghost.verbs -= /mob/observer/dead/verb/toggle_antagHUD // Poor guys, don't know what they are missing!
|
||||
return ghost
|
||||
|
||||
/*
|
||||
This is the proc mobs get to turn into a ghost. Forked from ghostize due to compatibility issues.
|
||||
*/
|
||||
/mob/living/verb/ghost()
|
||||
set category = "OOC"
|
||||
set name = "Ghost"
|
||||
set desc = "Relinquish your life and enter the land of the dead."
|
||||
|
||||
if(stat == DEAD && !forbid_seeing_deadchat)
|
||||
announce_ghost_joinleave(ghostize(1))
|
||||
else
|
||||
var/response
|
||||
if(src.client && src.client.holder)
|
||||
response = alert(src, "You have the ability to Admin-Ghost. The regular Ghost verb will announce your presence to dead chat. Both variants will allow you to return to your body using 'aghost'.\n\nWhat do you wish to do?", "Are you sure you want to ghost?", "Ghost", "Admin Ghost", "Stay in body")
|
||||
if(response == "Admin Ghost")
|
||||
if(!src.client)
|
||||
return
|
||||
src.client.admin_ghost()
|
||||
else
|
||||
response = alert(src, "Are you -sure- you want to ghost?\n(You are alive, or otherwise have the potential to become alive. If you ghost, you won't be able to play this round until you respawn as a new character! You can't change your mind so choose wisely!)", "Are you sure you want to ghost?", "Ghost", "Stay in body")
|
||||
if(response != "Ghost")
|
||||
return
|
||||
resting = 1
|
||||
var/turf/location = get_turf(src)
|
||||
var/special_role = check_special_role()
|
||||
if(!istype(loc,/obj/machinery/cryopod))
|
||||
log_and_message_admins("has ghosted outside cryo[special_role ? " as [special_role]" : ""]. (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[location.x];Y=[location.y];Z=[location.z]'>JMP</a>)",usr)
|
||||
else if(special_role)
|
||||
log_and_message_admins("has ghosted in cryo as [special_role]. (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[location.x];Y=[location.y];Z=[location.z]'>JMP</a>)",usr)
|
||||
var/mob/observer/dead/ghost = ghostize(0) // 0 parameter is so we can never re-enter our body, "Charlie, you can never come baaaack~" :3
|
||||
if(ghost)
|
||||
ghost.timeofdeath = world.time // Because the living mob won't have a time of death and we want the respawn timer to work properly.
|
||||
ghost.set_respawn_timer()
|
||||
announce_ghost_joinleave(ghost)
|
||||
|
||||
/mob/observer/dead/can_use_hands() return 0
|
||||
/mob/observer/dead/is_active() return 0
|
||||
|
||||
/mob/observer/dead/Stat()
|
||||
..()
|
||||
if(statpanel("Status"))
|
||||
if(emergency_shuttle)
|
||||
var/eta_status = emergency_shuttle.get_status_panel_eta()
|
||||
if(eta_status)
|
||||
stat(null, eta_status)
|
||||
|
||||
/mob/observer/dead/verb/reenter_corpse()
|
||||
set category = "Ghost"
|
||||
set name = "Re-enter Corpse"
|
||||
if(!client) return
|
||||
if(!(mind && mind.current && can_reenter_corpse))
|
||||
to_chat(src, "<span class='warning'>You have no body.</span>")
|
||||
return
|
||||
if(mind.current.key && copytext(mind.current.key,1,2)!="@") //makes sure we don't accidentally kick any clients
|
||||
to_chat(usr, "<span class='warning'>Another consciousness is in your body... it is resisting you.</span>")
|
||||
return
|
||||
if(mind.current.ajourn && mind.current.stat != DEAD) //check if the corpse is astral-journeying (it's client ghosted using a cultist rune).
|
||||
var/found_rune
|
||||
for(var/obj/effect/rune/R in mind.current.loc) //whilst corpse is alive, we can only reenter the body if it's on the rune
|
||||
if(R && R.word1 == cultwords["hell"] && R.word2 == cultwords["travel"] && R.word3 == cultwords["self"]) // Found an astral journey rune.
|
||||
found_rune = 1
|
||||
break
|
||||
if(!found_rune)
|
||||
to_chat(usr, "<span class='warning'>The astral cord that ties your body and your spirit has been severed. You are likely to wander the realm beyond until your body is finally dead and thus reunited with you.</span>")
|
||||
return
|
||||
mind.current.ajourn=0
|
||||
mind.current.key = key
|
||||
mind.current.teleop = null
|
||||
if(istype(mind.current.loc, /obj/structure/morgue))
|
||||
var/obj/structure/morgue/M = mind.current.loc
|
||||
M.update(1)
|
||||
else if(istype(mind.current.loc, /obj/structure/closet/body_bag))
|
||||
var/obj/structure/closet/body_bag/B = mind.current.loc
|
||||
B.update(1)
|
||||
if(!admin_ghosted)
|
||||
announce_ghost_joinleave(mind, 0, "They now occupy their body again.")
|
||||
return 1
|
||||
|
||||
/mob/observer/dead/verb/toggle_medHUD()
|
||||
set category = "Ghost"
|
||||
set name = "Toggle MedicHUD"
|
||||
set desc = "Toggles Medical HUD allowing you to see how everyone is doing"
|
||||
|
||||
medHUD = !medHUD
|
||||
plane_holder.set_vis(VIS_CH_HEALTH, medHUD)
|
||||
plane_holder.set_vis(VIS_CH_STATUS_OOC, medHUD)
|
||||
to_chat(src, "<font color='blue'><B>Medical HUD [medHUD ? "Enabled" : "Disabled"]</B></font>")
|
||||
|
||||
/mob/observer/dead/verb/toggle_secHUD()
|
||||
set category = "Ghost"
|
||||
set name = "Toggle Security HUD"
|
||||
set desc = "Toggles Security HUD allowing you to see people's displayed ID's job, wanted status, etc"
|
||||
|
||||
secHUD = !secHUD
|
||||
plane_holder.set_vis(VIS_CH_ID, secHUD)
|
||||
plane_holder.set_vis(VIS_CH_WANTED, secHUD)
|
||||
plane_holder.set_vis(VIS_CH_IMPTRACK, secHUD)
|
||||
plane_holder.set_vis(VIS_CH_IMPLOYAL, secHUD)
|
||||
plane_holder.set_vis(VIS_CH_IMPCHEM, secHUD)
|
||||
to_chat(src, "<font color='blue'><B>Security HUD [secHUD ? "Enabled" : "Disabled"]</B></font>")
|
||||
|
||||
/mob/observer/dead/verb/toggle_antagHUD()
|
||||
set category = "Ghost"
|
||||
set name = "Toggle AntagHUD"
|
||||
set desc = "Toggles AntagHUD allowing you to see who is the antagonist"
|
||||
|
||||
if(!config.antag_hud_allowed && !client.holder)
|
||||
to_chat(src, "<font color='red'>Admins have disabled this for this round.</font>")
|
||||
return
|
||||
if(jobban_isbanned(src, "AntagHUD"))
|
||||
to_chat(src, "<font color='red'><B>You have been banned from using this feature</B></font>")
|
||||
return
|
||||
if(config.antag_hud_restricted && !has_enabled_antagHUD && !client.holder)
|
||||
var/response = alert(src, "If you turn this on, you will not be able to take any part in the round.","Are you sure you want to turn this feature on?","Yes","No")
|
||||
if(response == "No") return
|
||||
can_reenter_corpse = FALSE
|
||||
set_respawn_timer(-1) // Foreeeever
|
||||
if(!has_enabled_antagHUD && !client.holder)
|
||||
has_enabled_antagHUD = TRUE
|
||||
|
||||
antagHUD = !antagHUD
|
||||
plane_holder.set_vis(VIS_CH_SPECIAL, antagHUD)
|
||||
to_chat(src, "<font color='blue'><B>AntagHUD [antagHUD ? "Enabled" : "Disabled"]</B></font>")
|
||||
|
||||
/mob/observer/dead/proc/jumpable_areas()
|
||||
var/list/areas = return_sorted_areas()
|
||||
if(client?.holder)
|
||||
return areas
|
||||
|
||||
for(var/area/A as anything in areas)
|
||||
if(A.z in using_map?.secret_levels)
|
||||
areas -= A
|
||||
return areas
|
||||
|
||||
/mob/observer/dead/proc/jumpable_mobs()
|
||||
var/list/mobs = getmobs()
|
||||
if(client?.holder)
|
||||
return mobs
|
||||
|
||||
for(var/key in mobs)
|
||||
var/mobz = get_z(mobs[key])
|
||||
if(mobz in using_map?.secret_levels)
|
||||
mobs -= key
|
||||
return mobs
|
||||
|
||||
/mob/observer/dead/proc/dead_tele(var/area/A in jumpable_areas())
|
||||
set category = "Ghost"
|
||||
set name = "Teleport"
|
||||
set desc = "Teleport to a location"
|
||||
|
||||
if(!istype(usr, /mob/observer/dead))
|
||||
to_chat(usr, "Not when you're not dead!")
|
||||
return
|
||||
|
||||
if(!A)
|
||||
A = input(usr, "Select an area:", "Ghost Teleport") as null|anything in jumpable_areas()
|
||||
if(!A)
|
||||
return
|
||||
|
||||
usr.forceMove(pick(get_area_turfs(A)))
|
||||
usr.on_mob_jump()
|
||||
|
||||
/mob/observer/dead/verb/follow(input in jumpable_mobs())
|
||||
set category = "Ghost"
|
||||
set name = "Follow" // "Haunt"
|
||||
set desc = "Follow and haunt a mob."
|
||||
|
||||
if(!input)
|
||||
input = input(usr, "Select a mob:", "Ghost Follow") as null|anything in jumpable_mobs()
|
||||
if(!input)
|
||||
return
|
||||
|
||||
var/target = jumpable_mobs()[input]
|
||||
if(!target) return
|
||||
ManualFollow(target)
|
||||
|
||||
/mob/observer/dead/forceMove(atom/destination)
|
||||
if(client?.holder)
|
||||
return ..()
|
||||
|
||||
if(get_z(destination) in using_map?.secret_levels)
|
||||
to_chat(src,SPAN_WARNING("Sorry, that z-level does not allow ghosts."))
|
||||
if(following)
|
||||
stop_following()
|
||||
return
|
||||
|
||||
return ..()
|
||||
|
||||
/mob/observer/dead/Move(atom/newloc, direct = 0, movetime)
|
||||
if(client?.holder)
|
||||
return ..()
|
||||
|
||||
if(get_z(newloc) in using_map?.secret_levels)
|
||||
to_chat(src,SPAN_WARNING("Sorry, that z-level does not allow ghosts."))
|
||||
if(following)
|
||||
stop_following()
|
||||
return
|
||||
|
||||
return ..()
|
||||
|
||||
// This is the ghost's follow verb with an argument
|
||||
/mob/observer/dead/proc/ManualFollow(var/atom/movable/target)
|
||||
if(!target)
|
||||
return
|
||||
|
||||
var/turf/targetloc = get_turf(target)
|
||||
if(check_holy(targetloc))
|
||||
to_chat(usr, "<span class='warning'>You cannot follow a mob standing on holy grounds!</span>")
|
||||
return
|
||||
if(get_z(target) in using_map?.secret_levels)
|
||||
to_chat(src, SPAN_WARNING("Sorry, that target is in an area that ghosts aren't allowed to go."))
|
||||
return
|
||||
if(target != src)
|
||||
if(following && following == target)
|
||||
return
|
||||
following = target
|
||||
to_chat(src, "<span class='notice'>Now following [target]</span>")
|
||||
if(ismob(target))
|
||||
forceMove(get_turf(target))
|
||||
var/mob/M = target
|
||||
M.following_mobs += src
|
||||
else
|
||||
spawn(0)
|
||||
while(target && following == target && client)
|
||||
var/turf/T = get_turf(target)
|
||||
if(!T)
|
||||
break
|
||||
// To stop the ghost flickering.
|
||||
if(loc != T)
|
||||
forceMove(T)
|
||||
sleep(15)
|
||||
|
||||
var/icon/I = icon(target.icon,target.icon_state,target.dir)
|
||||
|
||||
var/orbitsize = (I.Width()+I.Height())*0.5
|
||||
orbitsize -= (orbitsize/world.icon_size)*(world.icon_size*0.25)
|
||||
|
||||
var/rot_seg
|
||||
|
||||
/* We don't have this pref yet
|
||||
switch(ghost_orbit)
|
||||
if(GHOST_ORBIT_TRIANGLE)
|
||||
rot_seg = 3
|
||||
if(GHOST_ORBIT_SQUARE)
|
||||
rot_seg = 4
|
||||
if(GHOST_ORBIT_PENTAGON)
|
||||
rot_seg = 5
|
||||
if(GHOST_ORBIT_HEXAGON)
|
||||
rot_seg = 6
|
||||
else //Circular
|
||||
rot_seg = 36 //360/10 bby, smooth enough aproximation of a circle
|
||||
*/
|
||||
|
||||
orbit(target, orbitsize, FALSE, 20, rot_seg)
|
||||
|
||||
/mob/observer/dead/orbit()
|
||||
set_dir(2) //reset dir so the right directional sprites show up
|
||||
return ..()
|
||||
|
||||
/mob/observer/dead/stop_orbit()
|
||||
. = ..()
|
||||
//restart our floating animation after orbit is done.
|
||||
pixel_y = 0
|
||||
pixel_x = 0
|
||||
transform = null
|
||||
animate(src, pixel_y = 2, time = 10, loop = -1)
|
||||
|
||||
/mob/observer/dead/proc/stop_following()
|
||||
following = null
|
||||
stop_orbit()
|
||||
|
||||
/mob/proc/update_following()
|
||||
. = get_turf(src)
|
||||
for(var/mob/observer/dead/M in following_mobs)
|
||||
if(M.following != src)
|
||||
following_mobs -= M
|
||||
else
|
||||
if(M.loc != .)
|
||||
M.forceMove(.)
|
||||
|
||||
/mob
|
||||
var/list/following_mobs = list()
|
||||
|
||||
/mob/Destroy()
|
||||
for(var/mob/observer/dead/M in following_mobs)
|
||||
M.stop_following()
|
||||
following_mobs = null
|
||||
return ..()
|
||||
|
||||
/mob/observer/dead/Destroy()
|
||||
if(ismob(following))
|
||||
var/mob/M = following
|
||||
M.following_mobs -= src
|
||||
stop_following()
|
||||
return ..()
|
||||
|
||||
/mob/Moved(atom/old_loc, direction, forced = FALSE)
|
||||
. = ..()
|
||||
update_following()
|
||||
|
||||
/mob/Life()
|
||||
// to catch teleports etc which directly set loc
|
||||
update_following()
|
||||
return ..()
|
||||
|
||||
/mob/proc/check_holy(var/turf/T)
|
||||
return 0
|
||||
|
||||
/mob/observer/dead/check_holy(var/turf/T)
|
||||
if(check_rights(R_ADMIN|R_FUN|R_EVENT, 0, src))
|
||||
return 0
|
||||
|
||||
return (T && T.holy) && (is_manifest || (mind in cult.current_antagonists))
|
||||
|
||||
/mob/observer/dead/verb/jumptomob(input in jumpable_mobs()) //Moves the ghost instead of just changing the ghosts's eye -Nodrak
|
||||
set category = "Ghost"
|
||||
set name = "Jump to Mob"
|
||||
set desc = "Teleport to a mob"
|
||||
set popup_menu = FALSE
|
||||
|
||||
if(!istype(usr, /mob/observer/dead)) //Make sure they're an observer!
|
||||
return
|
||||
|
||||
if(!input)
|
||||
input = input(usr, "Select a mob:", "Ghost Jump") as null|anything in jumpable_mobs()
|
||||
if(!input)
|
||||
return
|
||||
|
||||
var/target = jumpable_mobs()[input]
|
||||
if (!target)//Make sure we actually have a target
|
||||
return
|
||||
else
|
||||
var/mob/M = target //Destination mob
|
||||
var/turf/T = get_turf(M) //Turf of the destination mob
|
||||
|
||||
if(T && isturf(T)) //Make sure the turf exists, then move the source to that destination.
|
||||
forceMove(T)
|
||||
stop_following()
|
||||
else
|
||||
to_chat(src, "This mob is not located in the game world.")
|
||||
|
||||
/mob/observer/dead/memory()
|
||||
set hidden = 1
|
||||
to_chat(src, "<font color='red'>You are dead! You have no mind to store memory!</font>")
|
||||
|
||||
/mob/observer/dead/add_memory()
|
||||
set hidden = 1
|
||||
to_chat(src, "<font color='red'>You are dead! You have no mind to store memory!</font>")
|
||||
|
||||
/mob/observer/dead/Post_Incorpmove()
|
||||
stop_following()
|
||||
|
||||
/mob/observer/dead/verb/analyze_air()
|
||||
set name = "Analyze Air"
|
||||
set category = "Ghost"
|
||||
|
||||
if(!istype(usr, /mob/observer/dead)) return
|
||||
|
||||
// Shamelessly copied from the Gas Analyzers
|
||||
if (!( istype(usr.loc, /turf) ))
|
||||
return
|
||||
|
||||
var/datum/gas_mixture/environment = usr.loc.return_air()
|
||||
|
||||
var/pressure = environment.return_pressure()
|
||||
var/total_moles = environment.total_moles
|
||||
|
||||
to_chat(src, "<font color='blue'><B>Results:</B></font>")
|
||||
if(abs(pressure - ONE_ATMOSPHERE) < 10)
|
||||
to_chat(src, "<font color='blue'>Pressure: [round(pressure,0.1)] kPa</font>")
|
||||
else
|
||||
to_chat(src, "<font color='red'>Pressure: [round(pressure,0.1)] kPa</font>")
|
||||
if(total_moles)
|
||||
for(var/g in environment.gas)
|
||||
to_chat(src, "<font color='blue'>[gas_data.name[g]]: [round((environment.gas[g] / total_moles) * 100)]% ([round(environment.gas[g], 0.01)] moles)</font>")
|
||||
to_chat(src, "<font color='blue'>Temperature: [round(environment.temperature-T0C,0.1)]°C ([round(environment.temperature,0.1)]K)</font>")
|
||||
to_chat(src, "<font color='blue'>Heat Capacity: [round(environment.heat_capacity(),0.1)]</font>")
|
||||
|
||||
/mob/observer/dead/verb/check_radiation()
|
||||
set name = "Check Radiation"
|
||||
set category = "Ghost"
|
||||
|
||||
var/turf/t = get_turf(src)
|
||||
if(t)
|
||||
var/rads = SSradiation.get_rads_at_turf(t)
|
||||
to_chat(src, "<span class='notice'>Radiation level: [rads ? rads : "0"] Bq.</span>")
|
||||
|
||||
|
||||
/mob/observer/dead/verb/become_mouse()
|
||||
set name = "Become mouse"
|
||||
set category = "Ghost"
|
||||
|
||||
if(config.disable_player_mice)
|
||||
to_chat(src, "<span class='warning'>Spawning as a mouse is currently disabled.</span>")
|
||||
return
|
||||
|
||||
if(!MayRespawn(1))
|
||||
return
|
||||
|
||||
var/turf/T = get_turf(src)
|
||||
if(!T || (T.z in using_map.admin_levels))
|
||||
to_chat(src, "<span class='warning'>You may not spawn as a mouse on this Z-level.</span>")
|
||||
return
|
||||
|
||||
var/timedifference = world.time - client.time_died_as_mouse
|
||||
if(client.time_died_as_mouse && timedifference <= mouse_respawn_time * 600)
|
||||
var/timedifference_text
|
||||
timedifference_text = time2text(mouse_respawn_time * 600 - timedifference,"mm:ss")
|
||||
to_chat(src, "<span class='warning'>You may only spawn again as a mouse more than [mouse_respawn_time] minutes after your death. You have [timedifference_text] left.</span>")
|
||||
return
|
||||
|
||||
var/response = alert(src, "Are you -sure- you want to become a mouse?","Are you sure you want to squeek?","Squeek!","Nope!")
|
||||
if(response != "Squeek!") return //Hit the wrong key...again.
|
||||
|
||||
|
||||
//find a viable mouse candidate
|
||||
var/mob/living/simple_mob/animal/passive/mouse/host
|
||||
var/obj/machinery/atmospherics/unary/vent_pump/vent_found
|
||||
var/list/found_vents = list()
|
||||
for(var/obj/machinery/atmospherics/unary/vent_pump/v in machines)
|
||||
if(!v.welded && v.z == T.z && v.network && v.network.normal_members.len > 20)
|
||||
found_vents.Add(v)
|
||||
if(found_vents.len)
|
||||
vent_found = pick(found_vents)
|
||||
host = new /mob/living/simple_mob/animal/passive/mouse(vent_found)
|
||||
else
|
||||
to_chat(src, "<span class='warning'>Unable to find any unwelded vents to spawn mice at.</span>")
|
||||
|
||||
if(host)
|
||||
if(config.uneducated_mice)
|
||||
host.universal_understand = 0
|
||||
announce_ghost_joinleave(src, 0, "They are now a mouse.")
|
||||
host.ckey = src.ckey
|
||||
host.add_ventcrawl(vent_found)
|
||||
to_chat(host, "<span class='info'>You are now a mouse. Try to avoid interaction with players, and do not give hints away that you are more than a simple rodent.</span>")
|
||||
|
||||
/mob/observer/dead/verb/view_manfiest()
|
||||
set name = "Show Crew Manifest"
|
||||
set category = "Ghost"
|
||||
|
||||
var/dat
|
||||
dat += "<h4>Crew Manifest</h4>"
|
||||
dat += data_core.get_manifest()
|
||||
|
||||
src << browse(dat, "window=manifest;size=370x420;can_close=1")
|
||||
|
||||
//This is called when a ghost is drag clicked to something.
|
||||
/mob/observer/dead/MouseDrop(atom/over)
|
||||
if(!usr || !over) return
|
||||
if (isobserver(usr) && usr.client && usr.client.holder && isliving(over))
|
||||
if (usr.client.holder.cmd_ghost_drag(src,over))
|
||||
return
|
||||
|
||||
return ..()
|
||||
|
||||
//Used for drawing on walls with blood puddles as a spooky ghost.
|
||||
/mob/observer/dead/verb/bloody_doodle()
|
||||
|
||||
set category = "Ghost"
|
||||
set name = "Write in blood"
|
||||
set desc = "If the round is sufficiently spooky, write a short message in blood on the floor or a wall. Remember, no IC in OOC or OOC in IC."
|
||||
|
||||
if(!(config.cult_ghostwriter))
|
||||
to_chat(src, "<font color='red'>That verb is not currently permitted.</font>")
|
||||
return
|
||||
|
||||
if (!src.stat)
|
||||
return
|
||||
|
||||
if (usr != src)
|
||||
return 0 //something is terribly wrong
|
||||
|
||||
var/ghosts_can_write
|
||||
if(ticker.mode.name == "cult")
|
||||
if(cult.current_antagonists.len > config.cult_ghostwriter_req_cultists)
|
||||
ghosts_can_write = 1
|
||||
|
||||
if(!ghosts_can_write && !check_rights(R_ADMIN|R_EVENT|R_FUN, 0)) //Let's allow for admins to write in blood for events and the such.
|
||||
to_chat(src, "<font color='red'>The veil is not thin enough for you to do that.</font>")
|
||||
return
|
||||
|
||||
var/list/choices = list()
|
||||
for(var/obj/effect/decal/cleanable/blood/B in view(1,src))
|
||||
if(B.amount > 0)
|
||||
choices += B
|
||||
|
||||
if(!choices.len)
|
||||
to_chat(src, "<span class = 'warning'>There is no blood to use nearby.</span>")
|
||||
return
|
||||
|
||||
var/obj/effect/decal/cleanable/blood/choice = input(src,"What blood would you like to use?") in null|choices
|
||||
|
||||
var/direction = input(src,"Which way?","Tile selection") as anything in list("Here","North","South","East","West")
|
||||
var/turf/simulated/T = src.loc
|
||||
if (direction != "Here")
|
||||
T = get_step(T,text2dir(direction))
|
||||
|
||||
if (!istype(T))
|
||||
to_chat(src, "<span class='warning'>You cannot doodle there.</span>")
|
||||
return
|
||||
|
||||
if(!choice || choice.amount == 0 || !(src.Adjacent(choice)))
|
||||
return
|
||||
|
||||
var/doodle_color = (choice.basecolor) ? choice.basecolor : "#A10808"
|
||||
|
||||
var/num_doodles = 0
|
||||
for (var/obj/effect/decal/cleanable/blood/writing/W in T)
|
||||
num_doodles++
|
||||
if (num_doodles > 4)
|
||||
to_chat(src, "<span class='warning'>There is no space to write on!</span>")
|
||||
return
|
||||
|
||||
var/max_length = 50
|
||||
|
||||
var/message = sanitize(input("Write a message. It cannot be longer than [max_length] characters.","Blood writing", ""))
|
||||
|
||||
if (message)
|
||||
|
||||
if (length(message) > max_length)
|
||||
message += "-"
|
||||
to_chat(src, "<span class='warning'>You ran out of blood to write with!</span>")
|
||||
|
||||
var/obj/effect/decal/cleanable/blood/writing/W = new(T)
|
||||
W.basecolor = doodle_color
|
||||
W.update_icon()
|
||||
W.message = message
|
||||
W.add_hiddenprint(src)
|
||||
W.visible_message("<font color='red'>Invisible fingers crudely paint something in blood on [T]...</font>")
|
||||
|
||||
/mob/observer/dead/pointed(atom/A as mob|obj|turf in view())
|
||||
if(!..())
|
||||
return 0
|
||||
usr.visible_message("<span class='deadsay'><b>[src]</b> points to [A]</span>")
|
||||
return 1
|
||||
|
||||
/mob/observer/dead/proc/manifest(mob/user)
|
||||
is_manifest = TRUE
|
||||
verbs |= /mob/observer/dead/proc/toggle_visibility
|
||||
verbs |= /mob/observer/dead/proc/ghost_whisper
|
||||
to_chat(src, "<font color='purple'>As you are now in the realm of the living, you can whisper to the living with the <b>Spectral Whisper</b> verb, inside the IC tab.</font>")
|
||||
if(plane != PLANE_WORLD)
|
||||
user.visible_message( \
|
||||
"<span class='warning'>\The [user] drags ghost, [src], to our plane of reality!</span>", \
|
||||
"<span class='warning'>You drag [src] to our plane of reality!</span>" \
|
||||
)
|
||||
toggle_visibility(TRUE)
|
||||
else
|
||||
var/datum/gender/T = gender_datums[user.get_visible_gender()]
|
||||
user.visible_message ( \
|
||||
"<span class='warning'>\The [user] just tried to smash [T.his] book into that ghost! It's not very effective.</span>", \
|
||||
"<span class='warning'>You get the feeling that the ghost can't become any more visible.</span>" \
|
||||
)
|
||||
|
||||
/mob/observer/dead/proc/toggle_icon(var/icon)
|
||||
if(!client)
|
||||
return
|
||||
|
||||
var/iconRemoved = 0
|
||||
for(var/image/I in client.images)
|
||||
if(I.icon_state == icon)
|
||||
iconRemoved = 1
|
||||
qdel(I)
|
||||
|
||||
if(!iconRemoved)
|
||||
var/image/J = image('icons/mob/mob.dmi', loc = src, icon_state = icon)
|
||||
client.images += J
|
||||
|
||||
/mob/observer/dead/proc/toggle_visibility(var/forced = 0)
|
||||
set category = "Ghost"
|
||||
set name = "Toggle Visibility"
|
||||
set desc = "Allows you to turn (in)visible (almost) at will."
|
||||
|
||||
var/toggled_invisible
|
||||
if(!forced && plane == PLANE_GHOSTS && world.time < toggled_invisible + 600)
|
||||
to_chat(src, "You must gather strength before you can turn visible again...")
|
||||
return
|
||||
|
||||
if(plane == PLANE_WORLD)
|
||||
toggled_invisible = world.time
|
||||
visible_message("<span class='emote'>It fades from sight...</span>", "<span class='info'>You are now invisible.</span>")
|
||||
else
|
||||
to_chat(src, "<span class='info'>You are now visible!</span>")
|
||||
|
||||
plane = (plane == PLANE_GHOSTS) ? PLANE_WORLD : PLANE_GHOSTS
|
||||
invisibility = (plane == PLANE_WORLD) ? 0 : INVISIBILITY_OBSERVER
|
||||
|
||||
// Give the ghost a cult icon which should be visible only to itself
|
||||
toggle_icon("cult")
|
||||
|
||||
/mob/observer/dead/verb/toggle_anonsay()
|
||||
set category = "Ghost"
|
||||
set name = "Toggle Anonymous Chat"
|
||||
set desc = "Toggles showing your key in dead chat."
|
||||
|
||||
src.anonsay = !src.anonsay
|
||||
if(anonsay)
|
||||
to_chat(src, "<span class='info'>Your key won't be shown when you speak in dead chat.</span>")
|
||||
else
|
||||
to_chat(src, "<span class='info'>Your key will be publicly visible again.</span>")
|
||||
|
||||
/mob/observer/dead/canface()
|
||||
return 1
|
||||
|
||||
/mob/observer/dead/proc/can_admin_interact()
|
||||
return check_rights(R_ADMIN|R_EVENT, 0, src)
|
||||
|
||||
/mob/observer/dead/verb/toggle_ghostsee()
|
||||
set name = "Toggle Ghost Vision"
|
||||
set desc = "Toggles your ability to see things only ghosts can see, like other ghosts"
|
||||
set category = "Ghost"
|
||||
ghostvision = !ghostvision
|
||||
updateghostsight()
|
||||
to_chat(src, "You [ghostvision ? "now" : "no longer"] have ghost vision.")
|
||||
|
||||
/mob/observer/dead/verb/toggle_darkness()
|
||||
set name = "Toggle Darkness"
|
||||
set desc = "Toggles your ability to see lighting overlays, and the darkness they create."
|
||||
set category = "Ghost"
|
||||
seedarkness = !seedarkness
|
||||
updateghostsight()
|
||||
to_chat(src, "You [seedarkness ? "now" : "no longer"] see darkness.")
|
||||
|
||||
/mob/observer/dead/proc/updateghostsight()
|
||||
plane_holder.set_vis(VIS_FULLBRIGHT, !seedarkness) //Inversion, because "not seeing" the darkness is "seeing" the lighting plane master.
|
||||
plane_holder.set_vis(VIS_GHOSTS, ghostvision)
|
||||
|
||||
/mob/observer/dead/MayRespawn(var/feedback = 0)
|
||||
if(!client)
|
||||
return 0
|
||||
if(mind && mind.current && mind.current.stat != DEAD && can_reenter_corpse)
|
||||
if(feedback)
|
||||
to_chat(src, "<span class='warning'>Your non-dead body prevent you from respawning.</span>")
|
||||
return 0
|
||||
if(config.antag_hud_restricted && has_enabled_antagHUD == 1)
|
||||
if(feedback)
|
||||
to_chat(src, "<span class='warning'>antagHUD restrictions prevent you from respawning.</span>")
|
||||
return 0
|
||||
return 1
|
||||
|
||||
/atom/proc/extra_ghost_link()
|
||||
return
|
||||
|
||||
/mob/extra_ghost_link(var/atom/ghost)
|
||||
if(client && eyeobj)
|
||||
return "|<a href='byond://?src=\ref[ghost];track=\ref[eyeobj]'>eye</a>"
|
||||
|
||||
/mob/observer/dead/extra_ghost_link(var/atom/ghost)
|
||||
if(mind && mind.current)
|
||||
return "|<a href='byond://?src=\ref[ghost];track=\ref[mind.current]'>body</a>"
|
||||
|
||||
/proc/ghost_follow_link(var/atom/target, var/atom/ghost)
|
||||
if((!target) || (!ghost)) return
|
||||
. = "<a href='byond://?src=\ref[ghost];track=\ref[target]'>follow</a>"
|
||||
. += target.extra_ghost_link(ghost)
|
||||
|
||||
//Culted Ghosts
|
||||
|
||||
/mob/observer/dead/proc/ghost_whisper()
|
||||
set name = "Spectral Whisper"
|
||||
set category = "IC"
|
||||
|
||||
if(is_manifest) //Only able to whisper if it's hit with a tome.
|
||||
var/list/options = list()
|
||||
for(var/mob/living/Ms in view(src))
|
||||
options += Ms
|
||||
var/mob/living/M = input(src, "Select who to whisper to:", "Whisper to?", null) as null|mob in options
|
||||
if(!M)
|
||||
return 0
|
||||
var/msg = sanitize(input(src, "Message:", "Spectral Whisper") as text|null)
|
||||
if(msg)
|
||||
log_say("(SPECWHISP to [key_name(M)]): [msg]", src)
|
||||
to_chat(M, "<span class='warning'> You hear a strange, unidentifiable voice in your head... <font color='purple'>[msg]</font></span>")
|
||||
to_chat(src, "<span class='warning'> You said: '[msg]' to [M].</span>")
|
||||
else
|
||||
return
|
||||
return 1
|
||||
else
|
||||
to_chat(src, "<span class='danger'>You have not been pulled past the veil!</span>")
|
||||
|
||||
/mob/observer/dead/verb/choose_ghost_sprite()
|
||||
set category = "Ghost"
|
||||
set name = "Choose Sprite"
|
||||
|
||||
var/choice
|
||||
var/previous_state
|
||||
var/finalized = "No"
|
||||
|
||||
while(finalized == "No" && src.client)
|
||||
choice = input(usr,"What would you like to use for your ghost sprite?") as null|anything in possible_ghost_sprites
|
||||
if(!choice)
|
||||
return
|
||||
|
||||
if(choice)
|
||||
icon = 'icons/mob/ghost.dmi'
|
||||
overlays.Cut()
|
||||
|
||||
if(icon_state && icon)
|
||||
previous_state = icon_state
|
||||
|
||||
icon_state = possible_ghost_sprites[choice]
|
||||
finalized = alert("Look at your sprite. Is this what you wish to use?",,"No","Yes")
|
||||
|
||||
ghost_sprite = possible_ghost_sprites[choice]
|
||||
|
||||
if(finalized == "No")
|
||||
icon_state = previous_state
|
||||
|
||||
/mob/observer/dead/is_blind()
|
||||
return FALSE
|
||||
|
||||
/mob/observer/dead/is_deaf()
|
||||
return FALSE
|
||||
|
||||
/mob/observer/dead/verb/paialert()
|
||||
set category = "Ghost"
|
||||
set name = "Blank pAI alert"
|
||||
set desc = "Flash an indicator light on available blank pAI devices for a smidgen of hope."
|
||||
|
||||
if(usr.client.prefs?.be_special & BE_PAI)
|
||||
var/count = 0
|
||||
for(var/obj/item/device/paicard/p in all_pai_cards)
|
||||
var/obj/item/device/paicard/PP = p
|
||||
if(PP.pai == null)
|
||||
count++
|
||||
PP.overlays += "pai-ghostalert"
|
||||
spawn(54)
|
||||
PP.overlays.Cut()
|
||||
to_chat(usr,"<span class='notice'>Flashing the displays of [count] unoccupied PAIs.</span>")
|
||||
else
|
||||
to_chat(usr,"<span class='warning'>You have 'Be pAI' disabled in your character prefs, so we can't help you.</span>")
|
||||
|
||||
/mob/observer/dead/speech_bubble_appearance()
|
||||
return "ghost"
|
||||
|
||||
// Lets a ghost know someone's trying to bring them back, and for them to get into their body.
|
||||
// Mostly the same as TG's sans the hud element, since we don't have TG huds.
|
||||
/mob/observer/dead/proc/notify_revive(var/message, var/sound, flashwindow = TRUE, var/atom/source)
|
||||
if((last_revive_notification + 2 MINUTES) > world.time)
|
||||
return
|
||||
last_revive_notification = world.time
|
||||
|
||||
if(flashwindow)
|
||||
window_flash(client)
|
||||
if(message)
|
||||
to_chat(src, "<span class='ghostalert'><font size=4>[message]</font></span>")
|
||||
if(source)
|
||||
throw_alert("\ref[source]_notify_revive", /obj/screen/alert/notify_cloning, new_master = source)
|
||||
to_chat(src, "<span class='ghostalert'><a href=?src=[REF(src)];reenter=1>(Click to re-enter)</a></span>")
|
||||
if(sound)
|
||||
SEND_SOUND(src, sound(sound))
|
||||
|
||||
/mob/observer/dead/verb/respawn()
|
||||
set name = "Respawn"
|
||||
set category = "Ghost"
|
||||
src.abandon_mob()
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
|
||||
@@ -336,7 +336,7 @@
|
||||
)
|
||||
wikilink="https://wiki.vore-station.net/Vox"
|
||||
|
||||
datum/species/harpy
|
||||
/datum/species/harpy
|
||||
name = SPECIES_RAPALA
|
||||
name_plural = "Rapalans"
|
||||
icobase = 'icons/mob/human_races/r_harpy_vr.dmi'
|
||||
|
||||
@@ -1,6 +1,3 @@
|
||||
#define ORGANICS 1
|
||||
#define SYNTHETICS 2
|
||||
|
||||
/datum/trait/negative
|
||||
category = -1
|
||||
|
||||
@@ -34,9 +31,9 @@
|
||||
cost = -2
|
||||
var_changes = list("total_health" = 75)
|
||||
|
||||
apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
..(S,H)
|
||||
H.setMaxHealth(S.total_health)
|
||||
/datum/trait/negative/endurance_low/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
..(S,H)
|
||||
H.setMaxHealth(S.total_health)
|
||||
|
||||
/datum/trait/negative/endurance_very_low
|
||||
name = "Extremely Low Endurance"
|
||||
@@ -44,9 +41,9 @@
|
||||
cost = -3 //Teshari HP. This makes the person a lot more suseptable to getting stunned, killed, etc.
|
||||
var_changes = list("total_health" = 50)
|
||||
|
||||
apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
..(S,H)
|
||||
H.setMaxHealth(S.total_health)
|
||||
/datum/trait/negative/endurance_very_low/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
..(S,H)
|
||||
H.setMaxHealth(S.total_health)
|
||||
|
||||
/datum/trait/negative/minor_brute_weak
|
||||
name = "Minor Brute Weakness"
|
||||
|
||||
@@ -1,6 +1,3 @@
|
||||
#define ORGANICS 1
|
||||
#define SYNTHETICS 2
|
||||
|
||||
/datum/trait/neutral
|
||||
|
||||
/datum/trait/neutral/metabolism_up
|
||||
@@ -174,7 +171,7 @@
|
||||
desc = "You're highly allergic to gluten proteins, which are found in most common grains."
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
var/allergen = GRAINS
|
||||
var/allergen = ALLERGEN_GRAINS
|
||||
|
||||
/datum/trait/neutral/allergy/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
S.allergens |= allergen
|
||||
@@ -185,63 +182,63 @@
|
||||
desc = "You're highly allergic to just about any form of meat. You're probably better off just sticking to vegetables. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance."
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
allergen = MEAT
|
||||
allergen = ALLERGEN_MEAT
|
||||
|
||||
/datum/trait/neutral/allergy/fish
|
||||
name = "Allergy: Fish"
|
||||
desc = "You're highly allergic to fish. It's probably best to avoid seafood in general. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance."
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
allergen = FISH
|
||||
allergen = ALLERGEN_FISH
|
||||
|
||||
/datum/trait/neutral/allergy/fruit
|
||||
name = "Allergy: Fruit"
|
||||
desc = "You're highly allergic to fruit. Vegetables are fine, but you should probably read up on how to tell the difference. Remember, tomatoes are a fruit. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance."
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
allergen = FRUIT
|
||||
allergen = ALLERGEN_FRUIT
|
||||
|
||||
/datum/trait/neutral/allergy/vegetable
|
||||
name = "Allergy: Vegetable"
|
||||
desc = "You're highly allergic to vegetables. Fruit are fine, but you should probably read up on how to tell the difference. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance."
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
allergen = VEGETABLE
|
||||
allergen = ALLERGEN_VEGETABLE
|
||||
|
||||
/datum/trait/neutral/allergy/nuts
|
||||
name = "Allergy: Nuts"
|
||||
desc = "You're highly allergic to hard-shell seeds, such as peanuts. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance."
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
allergen = SEEDS
|
||||
allergen = ALLERGEN_SEEDS
|
||||
|
||||
/datum/trait/neutral/allergy/soy
|
||||
name = "Allergy: Soy"
|
||||
desc = "You're highly allergic to soybeans, and some other kinds of bean. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance."
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
allergen = BEANS
|
||||
allergen = ALLERGEN_BEANS
|
||||
|
||||
/datum/trait/neutral/allergy/dairy
|
||||
name = "Allergy: Lactose"
|
||||
desc = "You're highly allergic to lactose, and consequently, just about all forms of dairy. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance."
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
allergen = DAIRY
|
||||
allergen = ALLERGEN_DAIRY
|
||||
|
||||
/datum/trait/neutral/allergy/fungi
|
||||
name = "Allergy: Fungi"
|
||||
desc = "You're highly allergic to fungi such as mushrooms. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance."
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
allergen = FUNGI
|
||||
allergen = ALLERGEN_FUNGI
|
||||
|
||||
/datum/trait/neutral/allergy/coffee
|
||||
name = "Allergy: Coffee"
|
||||
desc = "You're highly allergic to coffee in specific. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance."
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
allergen = COFFEE
|
||||
allergen = ALLERGEN_COFFEE
|
||||
|
||||
/datum/trait/neutral/allergen_reduced_effect
|
||||
name = "Reduced Allergen Reaction"
|
||||
|
||||
@@ -1,6 +1,3 @@
|
||||
#define ORGANICS 1
|
||||
#define SYNTHETICS 2
|
||||
|
||||
/datum/trait/positive
|
||||
category = 1
|
||||
|
||||
@@ -28,9 +25,9 @@
|
||||
cost = 4
|
||||
var_changes = list("total_health" = 125)
|
||||
|
||||
apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
..(S,H)
|
||||
H.setMaxHealth(S.total_health)
|
||||
/datum/trait/positive/endurance_high/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||
..(S,H)
|
||||
H.setMaxHealth(S.total_health)
|
||||
|
||||
/datum/trait/positive/nonconductive
|
||||
name = "Non-Conductive"
|
||||
|
||||
@@ -1,6 +1,3 @@
|
||||
#define ORGANICS 1
|
||||
#define SYNTHETICS 2
|
||||
|
||||
/datum/trait
|
||||
var/name
|
||||
var/desc = "Contact a developer if you see this trait."
|
||||
|
||||
@@ -79,7 +79,6 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
|
||||
#define SUIT_STORE_LAYER 17 //Suit storage-slot item
|
||||
#define BACK_LAYER 18 //Back-slot item
|
||||
#define HAIR_LAYER 19 //The human's hair
|
||||
<<<<<<< HEAD
|
||||
#define HAIR_ACCESSORY_LAYER 20 //VOREStation edit. Simply move this up a number if things are added.
|
||||
#define EARS_LAYER 21 //Both ear-slot items (combined image)
|
||||
#define EYES_LAYER 22 //Mob's eyes (used for glowing eyes)
|
||||
@@ -93,26 +92,9 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
|
||||
#define TAIL_LAYER_ALT 30 //Modified tail-sprite layer. Tend to be larger.
|
||||
#define MODIFIER_EFFECTS_LAYER 31 //Effects drawn by modifiers
|
||||
#define FIRE_LAYER 32 //'Mob on fire' overlay layer
|
||||
#define WATER_LAYER 33 //'Mob submerged' overlay layer
|
||||
#define MOB_WATER_LAYER 33 //'Mob submerged' overlay layer
|
||||
#define TARGETED_LAYER 34 //'Aimed at' overlay layer
|
||||
#define TOTAL_LAYERS 34 //VOREStation edit. <---- KEEP THIS UPDATED, should always equal the highest number here, used to initialize a list.
|
||||
=======
|
||||
#define EARS_LAYER 20 //Both ear-slot items (combined image)
|
||||
#define EYES_LAYER 21 //Mob's eyes (used for glowing eyes)
|
||||
#define FACEMASK_LAYER 22 //Mask-slot item
|
||||
#define HEAD_LAYER 23 //Head-slot item
|
||||
#define HANDCUFF_LAYER 24 //Handcuffs, if the human is handcuffed, in a secret inv slot
|
||||
#define LEGCUFF_LAYER 25 //Same as handcuffs, for legcuffs
|
||||
#define L_HAND_LAYER 26 //Left-hand item
|
||||
#define R_HAND_LAYER 27 //Right-hand item
|
||||
#define WING_LAYER 28 //Wings or protrusions over the suit.
|
||||
#define TAIL_LAYER_ALT 29 //Modified tail-sprite layer. Tend to be larger.
|
||||
#define MODIFIER_EFFECTS_LAYER 30 //Effects drawn by modifiers
|
||||
#define FIRE_LAYER 31 //'Mob on fire' overlay layer
|
||||
#define MOB_WATER_LAYER 32 //'Mob submerged' overlay layer
|
||||
#define TARGETED_LAYER 33 //'Aimed at' overlay layer
|
||||
#define TOTAL_LAYERS 33//<---- KEEP THIS UPDATED, should always equal the highest number here, used to initialize a list.
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
//////////////////////////////////
|
||||
|
||||
/mob/living/carbon/human
|
||||
@@ -1239,15 +1221,11 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
|
||||
tail_s.Blend(overlay, ICON_OVERLAY)
|
||||
qdel(overlay)
|
||||
|
||||
<<<<<<< HEAD
|
||||
var/image/working = image(tail_s)
|
||||
if(tail_style.em_block)
|
||||
working.overlays += em_block_image_generic(working) // Leaving this as overlays +=
|
||||
|
||||
if(isTaurTail(tail_style))
|
||||
=======
|
||||
if(istaurtail(tail_style))
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
var/datum/sprite_accessory/tail/taur/taurtype = tail_style
|
||||
working.pixel_x = -16
|
||||
if(taurtype.can_ride && !riding_datum)
|
||||
|
||||
@@ -235,7 +235,7 @@
|
||||
|
||||
var/mob/living/carbon/human/H = M
|
||||
|
||||
if(isTaurTail(H.tail_style))
|
||||
if(istaurtail(H.tail_style))
|
||||
to_chat(src, "<span class='warning'>Too many legs. TOO MANY LEGS!!</span>")
|
||||
return FALSE
|
||||
if(M.loc != src.loc)
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
#define NOT_WHILE_SHIFTED 1
|
||||
#define ONLY_WHILE_SHIFTED 2
|
||||
#define SHIFTED_OR_NOT 3
|
||||
|
||||
#define BLUE_EYES 1
|
||||
#define RED_EYES 2
|
||||
#define PURPLE_EYES 3
|
||||
#define YELLOW_EYES 4
|
||||
#define GREEN_EYES 5
|
||||
#define ORANGE_EYES 6
|
||||
|
||||
#define AB_PHASE_SHIFTED 0x1
|
||||
#define AB_SHADE_REGEN 0x2
|
||||
@@ -1,11 +0,0 @@
|
||||
#undef NOT_WHILE_SHIFTED
|
||||
#undef ONLY_WHILE_SHIFTED
|
||||
#undef SHIFTED_OR_NOT
|
||||
|
||||
#undef BLUE_EYES
|
||||
#undef RED_EYES
|
||||
#undef PURPLE_EYES
|
||||
#undef YELLOW_EYES
|
||||
|
||||
#undef AB_PHASE_SHIFTED
|
||||
#undef AB_SHADE_REGEN
|
||||
@@ -1038,7 +1038,7 @@
|
||||
pixel_x--
|
||||
is_shifted = TRUE
|
||||
|
||||
mob/verb/shifteast()
|
||||
/mob/verb/shifteast()
|
||||
set hidden = TRUE
|
||||
if(!canface())
|
||||
return FALSE
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -61,7 +61,7 @@
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
obj/machinery/computer/ship/disperser/proc/is_valid_setup()
|
||||
/obj/machinery/computer/ship/disperser/proc/is_valid_setup()
|
||||
if(front && middle && back)
|
||||
var/everything_in_range = (get_dist(src, front) < link_range) && (get_dist(src, middle) < link_range) && (get_dist(src, back) < link_range)
|
||||
var/everything_in_order = (middle.Adjacent(front) && middle.Adjacent(back)) && (front.dir == middle.dir && middle.dir == back.dir)
|
||||
|
||||
@@ -1,141 +0,0 @@
|
||||
/obj/machinery/power/generator_type2
|
||||
name = "thermoelectric generator"
|
||||
desc = "It's a high efficiency thermoelectric generator."
|
||||
icon_state = "teg"
|
||||
anchored = 1
|
||||
density = 1
|
||||
use_power = USE_POWER_OFF
|
||||
|
||||
var/obj/machinery/atmospherics/unary/generator_input/input1
|
||||
var/obj/machinery/atmospherics/unary/generator_input/input2
|
||||
|
||||
var/lastgen = 0
|
||||
var/lastgenlev = -1
|
||||
|
||||
|
||||
/obj/machinery/power/generator_type2/Initialize()
|
||||
. = ..()
|
||||
input1 = locate(/obj/machinery/atmospherics/unary/generator_input) in get_step(src,turn(dir, 90))
|
||||
input2 = locate(/obj/machinery/atmospherics/unary/generator_input) in get_step(src,turn(dir, -90))
|
||||
if(!input1 || !input2)
|
||||
stat |= BROKEN
|
||||
updateicon()
|
||||
|
||||
/obj/machinery/power/generator_type2/proc/updateicon()
|
||||
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
cut_overlays()
|
||||
else
|
||||
cut_overlays()
|
||||
|
||||
if(lastgenlev != 0)
|
||||
add_overlay("teg-op[lastgenlev]")
|
||||
|
||||
#define GENRATE 800 // generator output coefficient from Q
|
||||
|
||||
|
||||
/obj/machinery/power/generator_type2/process()
|
||||
if(!input1 || !input2)
|
||||
return
|
||||
|
||||
var/datum/gas_mixture/air1 = input1.return_exchange_air()
|
||||
var/datum/gas_mixture/air2 = input2.return_exchange_air()
|
||||
|
||||
|
||||
lastgen = 0
|
||||
|
||||
if(air1 && air2)
|
||||
var/datum/gas_mixture/hot_air = air1
|
||||
var/datum/gas_mixture/cold_air = air2
|
||||
if(hot_air.temperature < cold_air.temperature)
|
||||
hot_air = air2
|
||||
cold_air = air1
|
||||
|
||||
var/hot_air_heat_capacity = hot_air.heat_capacity()
|
||||
var/cold_air_heat_capacity = cold_air.heat_capacity()
|
||||
|
||||
var/delta_temperature = hot_air.temperature - cold_air.temperature
|
||||
|
||||
if(delta_temperature > 1 && cold_air_heat_capacity > 0.01 && hot_air_heat_capacity > 0.01)
|
||||
var/efficiency = (1 - cold_air.temperature/hot_air.temperature)*0.65 //65% of Carnot efficiency
|
||||
|
||||
var/energy_transfer = delta_temperature*hot_air_heat_capacity*cold_air_heat_capacity/(hot_air_heat_capacity+cold_air_heat_capacity)
|
||||
|
||||
var/heat = energy_transfer*(1-efficiency)
|
||||
lastgen = energy_transfer*efficiency
|
||||
|
||||
hot_air.temperature = hot_air.temperature - energy_transfer/hot_air_heat_capacity
|
||||
cold_air.temperature = cold_air.temperature + heat/cold_air_heat_capacity
|
||||
|
||||
//to_world("POWER: [lastgen] W generated at [efficiency*100]% efficiency and sinks sizes [cold_air_heat_capacity], [hot_air_heat_capacity]")
|
||||
|
||||
if(input1.network)
|
||||
input1.network.update = 1
|
||||
|
||||
if(input2.network)
|
||||
input2.network.update = 1
|
||||
|
||||
add_avail(lastgen)
|
||||
// update icon overlays only if displayed level has changed
|
||||
|
||||
var/genlev = max(0, min( round(11*lastgen / 100000), 11))
|
||||
if(genlev != lastgenlev)
|
||||
lastgenlev = genlev
|
||||
updateicon()
|
||||
|
||||
src.updateDialog()
|
||||
|
||||
|
||||
/obj/machinery/power/generator_type2/attack_ai(mob/user)
|
||||
if(stat & (BROKEN|NOPOWER)) return
|
||||
interact(user)
|
||||
|
||||
|
||||
/obj/machinery/power/generator_type2/attack_hand(mob/user)
|
||||
add_fingerprint(user)
|
||||
if(stat & (BROKEN|NOPOWER)) return
|
||||
interact(user)
|
||||
|
||||
|
||||
/obj/machinery/power/generator_type2/interact(mob/user)
|
||||
if ( (get_dist(src, user) > 1 ) && (!istype(user, /mob/living/silicon/ai)))
|
||||
user.unset_machine()
|
||||
user << browse(null, "window=teg")
|
||||
return
|
||||
|
||||
user.set_machine(src)
|
||||
|
||||
var/t = "<PRE><B>Thermo-Electric Generator</B><HR>"
|
||||
|
||||
t += "Output : [round(lastgen)] W<BR><BR>"
|
||||
|
||||
t += "<B>Cold loop</B><BR>"
|
||||
t += "Temperature: [round(input1.air_contents.temperature, 0.1)] K<BR>"
|
||||
t += "Pressure: [round(input1.air_contents.return_pressure(), 0.1)] kPa<BR>"
|
||||
|
||||
t += "<B>Hot loop</B><BR>"
|
||||
t += "Temperature: [round(input2.air_contents.temperature, 0.1)] K<BR>"
|
||||
t += "Pressure: [round(input2.air_contents.return_pressure(), 0.1)] kPa<BR>"
|
||||
|
||||
t += "<BR><HR><A href='?src=\ref[src];close=1'>Close</A>"
|
||||
|
||||
t += "</PRE>"
|
||||
user << browse(t, "window=teg;size=460x300")
|
||||
onclose(user, "teg")
|
||||
return 1
|
||||
|
||||
|
||||
/obj/machinery/power/generator_type2/Topic(href, href_list)
|
||||
..()
|
||||
|
||||
if( href_list["close"] )
|
||||
usr << browse(null, "window=teg")
|
||||
usr.unset_machine()
|
||||
return 0
|
||||
|
||||
return 1
|
||||
|
||||
|
||||
/obj/machinery/power/generator_type2/power_change()
|
||||
..()
|
||||
updateicon()
|
||||
@@ -200,36 +200,26 @@
|
||||
///////////////////////////////
|
||||
//SLIME CORES BELOW HERE///////
|
||||
///////////////////////////////
|
||||
|
||||
|
||||
|
||||
/decl/chemical_reaction/instant/slime_food
|
||||
name = "Slime Bork"
|
||||
id = "m_tele2"
|
||||
result = null
|
||||
required_reagents = list("phoron" = 10, "slimejelly" = 5, "nutriment" = 20)
|
||||
result_amount = 1
|
||||
on_reaction(var/datum/reagents/holder)
|
||||
|
||||
var/list/borks = typesof(/obj/item/weapon/reagent_containers/food/snacks) - /obj/item/weapon/reagent_containers/food/snacks // BORK BORK BORK
|
||||
|
||||
playsound(holder.my_atom, 'sound/effects/phasein.ogg', 100, 1)
|
||||
/* Removed at some point, unsure what to replace with
|
||||
for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null))
|
||||
if(M:eyecheck() <= 0)
|
||||
flick("e_flash", M.flash)
|
||||
*/
|
||||
for(var/i = 1, i <= 4 + rand(1,2), i++)
|
||||
var/chosen = pick(borks)
|
||||
var/obj/B = new chosen
|
||||
if(B)
|
||||
B.loc = get_turf(holder.my_atom)
|
||||
if(prob(50))
|
||||
for(var/j = 1, j <= rand(1, 3), j++)
|
||||
step(B, pick(NORTH,SOUTH,EAST,WEST))
|
||||
|
||||
/decl/chemical_reaction/instant/slime_food/on_reaction(var/datum/reagents/holder)
|
||||
var/list/borks = typesof(/obj/item/weapon/reagent_containers/food/snacks) - /obj/item/weapon/reagent_containers/food/snacks // BORK BORK BORK
|
||||
|
||||
playsound(holder.my_atom, 'sound/effects/phasein.ogg', 100, 1)
|
||||
|
||||
for(var/i = 1, i <= 4 + rand(1,2), i++)
|
||||
var/chosen = pick(borks)
|
||||
var/obj/B = new chosen
|
||||
if(B)
|
||||
B.loc = get_turf(holder.my_atom)
|
||||
if(prob(50))
|
||||
for(var/j = 1, j <= rand(1, 3), j++)
|
||||
step(B, pick(NORTH,SOUTH,EAST,WEST))
|
||||
|
||||
/decl/chemical_reaction/instant/materials
|
||||
name = "Slime materials"
|
||||
@@ -237,56 +227,52 @@
|
||||
result = null
|
||||
required_reagents = list("phoron" = 20, "slimejelly" = 40, "aluminum" = 20) //Woah there! You have the possibility of making diamonds! 8 ground up slimes required for one of these, and you still have a 10% chance for it to fail.
|
||||
result_amount = 1
|
||||
on_reaction(var/datum/reagents/holder)
|
||||
var/fail_chance = rand(1,1000)
|
||||
if(fail_chance == 1) // 0.1% chance of exploding, so scientists don't exclusively abuse this to obtain materials.
|
||||
for(var/mob/O in viewers(get_turf(holder.my_atom), null))
|
||||
O.show_message(text("<span class='warning'>The solution begins to vibrate violently!</span>"), 1) // It was at this moment, the Xenobiologist knew... he fucked up.
|
||||
sleep(30)
|
||||
playsound(holder.my_atom, 'sound/items/Welder2.ogg', 100, 1)
|
||||
for(var/mob/O in viewers(get_turf(holder.my_atom), null))
|
||||
O.show_message(text("<span class='warning'>The reaction begins to rapidly sizzle and swell outwards!</span>"), 1)
|
||||
sleep(20)
|
||||
explosion(get_turf(holder.my_atom), 0 ,4, 8) //Enough to cause severe damage in the area, but not so much that it'll instantly gib the person.
|
||||
empulse(get_turf(holder.my_atom), 3, 7) //Uh oh, it produced some uranium, too! EMP blast!
|
||||
return
|
||||
|
||||
if(fail_chance < 101) // 10% chance of it not working at all.
|
||||
playsound(holder.my_atom, 'sound/items/Welder.ogg', 100, 1)
|
||||
for(var/mob/O in viewers(get_turf(holder.my_atom), null))
|
||||
O.show_message(text("<span class='warning'>The slime core fizzles disappointingly.</span>"), 1)
|
||||
return
|
||||
/decl/chemical_reaction/instant/materials/on_reaction(var/datum/reagents/holder)
|
||||
var/fail_chance = rand(1,1000)
|
||||
if(fail_chance == 1) // 0.1% chance of exploding, so scientists don't exclusively abuse this to obtain materials.
|
||||
for(var/mob/O in viewers(get_turf(holder.my_atom), null))
|
||||
O.show_message(text("<span class='warning'>The solution begins to vibrate violently!</span>"), 1) // It was at this moment, the Xenobiologist knew... he fucked up.
|
||||
sleep(30)
|
||||
playsound(holder.my_atom, 'sound/items/Welder2.ogg', 100, 1)
|
||||
for(var/mob/O in viewers(get_turf(holder.my_atom), null))
|
||||
O.show_message(text("<span class='warning'>The reaction begins to rapidly sizzle and swell outwards!</span>"), 1)
|
||||
sleep(20)
|
||||
explosion(get_turf(holder.my_atom), 0 ,4, 8) //Enough to cause severe damage in the area, but not so much that it'll instantly gib the person.
|
||||
empulse(get_turf(holder.my_atom), 3, 7) //Uh oh, it produced some uranium, too! EMP blast!
|
||||
return
|
||||
|
||||
var/blocked = list(
|
||||
/obj/item/stack/material, //Technical stacks
|
||||
/obj/item/stack/hairlesshide, //Useless leather production steps
|
||||
/obj/item/stack/wetleather,
|
||||
/obj/item/stack/material/algae/ten) //Why is this one even a separate thing
|
||||
blocked += typesof(/obj/item/stack/material/cyborg) //Borg matter synths, should only exist in borgs
|
||||
blocked += typesof(/obj/item/stack/animalhide) //Hides which are only used for leather production anyway
|
||||
if(fail_chance < 101) // 10% chance of it not working at all.
|
||||
playsound(holder.my_atom, 'sound/items/Welder.ogg', 100, 1)
|
||||
for(var/mob/O in viewers(get_turf(holder.my_atom), null))
|
||||
O.show_message(text("<span class='warning'>The slime core fizzles disappointingly.</span>"), 1)
|
||||
return
|
||||
|
||||
var/rare_types = list(
|
||||
/obj/item/stack/material/morphium, //Complex materials requiring Particle Smasher to create
|
||||
/obj/item/stack/material/morphium/hull,
|
||||
/obj/item/stack/material/valhollide,
|
||||
/obj/item/stack/material/supermatter)
|
||||
var/blocked = list(
|
||||
/obj/item/stack/material, //Technical stacks
|
||||
/obj/item/stack/hairlesshide, //Useless leather production steps
|
||||
/obj/item/stack/wetleather,
|
||||
/obj/item/stack/material/algae/ten) //Why is this one even a separate thing
|
||||
blocked += typesof(/obj/item/stack/material/cyborg) //Borg matter synths, should only exist in borgs
|
||||
blocked += typesof(/obj/item/stack/animalhide) //Hides which are only used for leather production anyway
|
||||
|
||||
var/list/material = typesof(/obj/item/stack/material) - blocked
|
||||
var/rare_types = list(
|
||||
/obj/item/stack/material/morphium, //Complex materials requiring Particle Smasher to create
|
||||
/obj/item/stack/material/morphium/hull,
|
||||
/obj/item/stack/material/valhollide,
|
||||
/obj/item/stack/material/supermatter)
|
||||
|
||||
playsound(holder.my_atom, 'sound/effects/phasein.ogg', 100, 1)
|
||||
/* Removed at some point, unsure what to replace with
|
||||
for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null))
|
||||
if(M:eyecheck() <= 0)
|
||||
flick("e_flash", M.flash)
|
||||
*/
|
||||
var/spawn_amount = rand(1,50)
|
||||
var/chosen = pick(material)
|
||||
if(chosen in rare_types)
|
||||
spawn_amount = rand(1,15)
|
||||
var/obj/item/stack/material/C = new chosen
|
||||
C.amount = spawn_amount
|
||||
C.loc = get_turf(holder.my_atom)
|
||||
var/list/material = typesof(/obj/item/stack/material) - blocked
|
||||
|
||||
playsound(holder.my_atom, 'sound/effects/phasein.ogg', 100, 1)
|
||||
|
||||
var/spawn_amount = rand(1,50)
|
||||
var/chosen = pick(material)
|
||||
if(chosen in rare_types)
|
||||
spawn_amount = rand(1,15)
|
||||
var/obj/item/stack/material/C = new chosen
|
||||
C.amount = spawn_amount
|
||||
C.loc = get_turf(holder.my_atom)
|
||||
|
||||
/decl/chemical_reaction/instant/slimelight
|
||||
name = "Slime Glow"
|
||||
@@ -294,11 +280,12 @@
|
||||
result = null
|
||||
required_reagents = list("phoron" = 5, "slimejelly" = 5, "water" = 10) //Takes 10 water so it doesn't mess with the frost oil.
|
||||
result_amount = 1
|
||||
on_reaction(var/datum/reagents/holder)
|
||||
for(var/mob/O in viewers(get_turf(holder.my_atom), null))
|
||||
O.show_message(text("<span class='warning'> The contents of the slime core harden and begin to emit a warm, bright light.</span>"), 1)
|
||||
var/obj/item/device/flashlight/slime/F = new /obj/item/device/flashlight/slime
|
||||
F.loc = get_turf(holder.my_atom)
|
||||
|
||||
/decl/chemical_reaction/instant/slimelight/on_reaction(var/datum/reagents/holder)
|
||||
for(var/mob/O in viewers(get_turf(holder.my_atom), null))
|
||||
O.show_message(text("<span class='warning'> The contents of the slime core harden and begin to emit a warm, bright light.</span>"), 1)
|
||||
var/obj/item/device/flashlight/slime/F = new /obj/item/device/flashlight/slime
|
||||
F.loc = get_turf(holder.my_atom)
|
||||
|
||||
|
||||
/decl/chemical_reaction/instant/slimephoron
|
||||
@@ -307,10 +294,11 @@
|
||||
result = null
|
||||
required_reagents = list("phoron" = 20, "uranium" = 20, "slimejelly" = 20)
|
||||
result_amount = 1
|
||||
on_reaction(var/datum/reagents/holder)
|
||||
var/obj/item/stack/material/phoron/P = new /obj/item/stack/material/phoron
|
||||
P.amount = 10
|
||||
P.loc = get_turf(holder.my_atom)
|
||||
|
||||
/decl/chemical_reaction/instant/slimephoron/on_reaction(var/datum/reagents/holder)
|
||||
var/obj/item/stack/material/phoron/P = new /obj/item/stack/material/phoron
|
||||
P.amount = 10
|
||||
P.loc = get_turf(holder.my_atom)
|
||||
|
||||
/decl/chemical_reaction/instant/slimefreeze
|
||||
name = "Slime Freeze"
|
||||
@@ -318,17 +306,15 @@
|
||||
result = null
|
||||
required_reagents = list("phoron" = 10, "coolant" = 10, "slimejelly" = 10)
|
||||
result_amount = 1
|
||||
on_reaction(var/datum/reagents/holder)
|
||||
for(var/mob/O in viewers(get_turf(holder.my_atom), null))
|
||||
O.show_message(text("<span class='warning'>The slime extract begins to vibrate violently!</span>"), 1)
|
||||
sleep(50)
|
||||
playsound(holder.my_atom, 'sound/effects/phasein.ogg', 100, 1)
|
||||
for(var/mob/living/M in range (get_turf(holder.my_atom), 7))
|
||||
M.bodytemperature -= 140
|
||||
to_chat(M, "<span class='notice'> You suddenly feel a chill!</span>")
|
||||
|
||||
|
||||
|
||||
/decl/chemical_reaction/instant/slimefreeze/on_reaction(var/datum/reagents/holder)
|
||||
for(var/mob/O in viewers(get_turf(holder.my_atom), null))
|
||||
O.show_message(text("<span class='warning'>The slime extract begins to vibrate violently!</span>"), 1)
|
||||
sleep(50)
|
||||
playsound(holder.my_atom, 'sound/effects/phasein.ogg', 100, 1)
|
||||
for(var/mob/living/M in range (get_turf(holder.my_atom), 7))
|
||||
M.bodytemperature -= 140
|
||||
to_chat(M, "<span class='notice'> You suddenly feel a chill!</span>")
|
||||
|
||||
/decl/chemical_reaction/instant/slimefrost
|
||||
name = "Slime Frost Oil"
|
||||
@@ -337,24 +323,21 @@
|
||||
required_reagents = list("phoron" = 5, "slimejelly" = 5, "water" = 5, "coolant" = 5)
|
||||
result_amount = 10
|
||||
|
||||
|
||||
|
||||
|
||||
/decl/chemical_reaction/instant/slimefire
|
||||
name = "Slime fire"
|
||||
id = "m_fire"
|
||||
result = null
|
||||
required_reagents = list("phoron" = 60, "slimejelly" = 30, "potassium" = 30)
|
||||
result_amount = 1
|
||||
on_reaction(var/datum/reagents/holder)
|
||||
for(var/mob/O in viewers(get_turf(holder.my_atom), null))
|
||||
O.show_message(text("<span class='warning'>The slime extract begins to vibrate violently!</span>"), 1)
|
||||
sleep(50)
|
||||
var/turf/location = get_turf(holder.my_atom.loc)
|
||||
for(var/turf/simulated/floor/target_tile in range(0,location))
|
||||
target_tile.assume_gas("phoron", 25, 1400)
|
||||
spawn (0) target_tile.hotspot_expose(700, 400)
|
||||
|
||||
/decl/chemical_reaction/instant/slimefire/on_reaction(var/datum/reagents/holder)
|
||||
for(var/mob/O in viewers(get_turf(holder.my_atom), null))
|
||||
O.show_message(text("<span class='warning'>The slime extract begins to vibrate violently!</span>"), 1)
|
||||
sleep(50)
|
||||
var/turf/location = get_turf(holder.my_atom.loc)
|
||||
for(var/turf/simulated/floor/target_tile in range(0,location))
|
||||
target_tile.assume_gas("phoron", 25, 1400)
|
||||
spawn (0) target_tile.hotspot_expose(700, 400)
|
||||
|
||||
/decl/chemical_reaction/instant/slimeify
|
||||
name = "Advanced Mutation Toxin"
|
||||
@@ -363,25 +346,22 @@
|
||||
required_reagents = list("phoron" = 15, "slimejelly" = 15, "mutationtoxin" = 15) //In case a xenobiologist wants to become a fully fledged slime person.
|
||||
result_amount = 1
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/decl/chemical_reaction/instant/slimeheal //A slime healing mixture. Why not.
|
||||
name = "Slime Health"
|
||||
id = "slimeheal"
|
||||
result = "null"
|
||||
required_reagents = list("phoron" = 10, "bicaridine" = 10, "kelotane" = 10, "inaprovaline" = 10, "slimejelly" = 10)
|
||||
on_reaction(var/datum/reagents/holder, var/created_volume)
|
||||
for (var/mob/living/carbon/C in viewers(get_turf(holder.my_atom), null))
|
||||
to_chat(C, "<span class='notice'>A wave of energy suddenly invigorates you.</span>")
|
||||
C.adjustBruteLoss(-25)
|
||||
C.adjustFireLoss(-25)
|
||||
C.adjustToxLoss(-25)
|
||||
C.adjustOxyLoss(-25)
|
||||
C.adjustBrainLoss(-25)
|
||||
C.adjustCloneLoss(-25)
|
||||
C.updatehealth()
|
||||
|
||||
/decl/chemical_reaction/instant/slimeheal/on_reaction(var/datum/reagents/holder, var/created_volume)
|
||||
for (var/mob/living/carbon/C in viewers(get_turf(holder.my_atom), null))
|
||||
to_chat(C, "<span class='notice'>A wave of energy suddenly invigorates you.</span>")
|
||||
C.adjustBruteLoss(-25)
|
||||
C.adjustFireLoss(-25)
|
||||
C.adjustToxLoss(-25)
|
||||
C.adjustOxyLoss(-25)
|
||||
C.adjustBrainLoss(-25)
|
||||
C.adjustCloneLoss(-25)
|
||||
C.updatehealth()
|
||||
|
||||
/decl/chemical_reaction/instant/slimejelly
|
||||
name = "Slime Jam"
|
||||
@@ -396,62 +376,58 @@
|
||||
result = null
|
||||
required_reagents = list("phoron" = 20, "nutriment" = 20, "sugar" = 20, "mutationtoxin" = 20) //Can't do slime jelly as it'll conflict with another, but mutation toxin will do.
|
||||
result_amount = 1
|
||||
on_reaction(var/datum/reagents/holder)
|
||||
var/mob_path = /mob/living/simple_mob
|
||||
var/blocked = list( //List of things we do NOT want to spawn
|
||||
/mob/living/simple_mob, //Technical parent mobs
|
||||
/mob/living/simple_mob/animal,
|
||||
/mob/living/simple_mob/animal/passive,
|
||||
/mob/living/simple_mob/animal/space,
|
||||
/mob/living/simple_mob/blob,
|
||||
/mob/living/simple_mob/mechanical,
|
||||
/mob/living/simple_mob/mechanical/mecha,
|
||||
/mob/living/simple_mob/slime,
|
||||
/mob/living/simple_mob/vore,
|
||||
/mob/living/simple_mob/vore/aggressive,
|
||||
/mob/living/simple_mob/illusion, //Other technical mobs
|
||||
/mob/living/simple_mob/animal/passive/crab/Coffee, //Unique pets/named mobs
|
||||
/mob/living/simple_mob/animal/passive/cat/runtime,
|
||||
/mob/living/simple_mob/animal/passive/cat/bones,
|
||||
/mob/living/simple_mob/animal/passive/cat/tabiranth,
|
||||
/mob/living/simple_mob/animal/passive/dog/corgi/puppy/Bockscar,
|
||||
/mob/living/simple_mob/animal/passive/dog/corgi/Ian,
|
||||
/mob/living/simple_mob/animal/passive/dog/corgi/Lisa,
|
||||
/mob/living/simple_mob/animal/passive/dog/tamaskan/Spice,
|
||||
/mob/living/simple_mob/animal/passive/fox/renault,
|
||||
/mob/living/simple_mob/animal/passive/bird/azure_tit/tweeter,
|
||||
/mob/living/simple_mob/animal/passive/bird/parrot/poly,
|
||||
/mob/living/simple_mob/animal/sif/fluffy,
|
||||
/mob/living/simple_mob/animal/sif/fluffy/silky,
|
||||
/mob/living/simple_mob/animal/passive/snake/noodle,
|
||||
/mob/living/simple_mob/slime/xenobio/rainbow/kendrick,
|
||||
/mob/living/simple_mob/animal/space/space_worm, //Space Worm parts that aren't proper heads
|
||||
/mob/living/simple_mob/animal/space/space_worm/head/severed,
|
||||
/mob/living/simple_mob/animal/borer, //Event/player-control-only mobs
|
||||
/mob/living/simple_mob/vore/hostile/morph
|
||||
)//exclusion list for things you don't want the reaction to create.
|
||||
blocked += typesof(/mob/living/simple_mob/mechanical/ward) //Wards that should be created with ward items, are mobs mostly on technicalities
|
||||
blocked += typesof(/mob/living/simple_mob/construct) //Should only exist
|
||||
blocked += typesof(/mob/living/simple_mob/vore/demon) //as player-controlled
|
||||
blocked += typesof(/mob/living/simple_mob/shadekin) //and/or event things
|
||||
blocked += typesof(/mob/living/simple_mob/horror)
|
||||
var/list/voremobs = typesof(mob_path) - blocked // list of possible hostile mobs
|
||||
|
||||
playsound(holder.my_atom, 'sound/effects/phasein.ogg', 100, 1)
|
||||
/* Removed at some point, unsure what to replace with
|
||||
for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null))
|
||||
if(M:eyecheck() <= 0)
|
||||
flick("e_flash", M.flash)
|
||||
*/
|
||||
var/spawn_count = rand(1,3)
|
||||
for(var/i = 1, i <= spawn_count, i++)
|
||||
var/chosen = pick(voremobs)
|
||||
var/mob/living/simple_mob/C = new chosen
|
||||
C.faction = "slimesummon"
|
||||
C.loc = get_turf(holder.my_atom)
|
||||
if(prob(50))
|
||||
for(var/j = 1, j <= rand(1, 3), j++)
|
||||
step(C, pick(NORTH,SOUTH,EAST,WEST))
|
||||
/decl/chemical_reaction/instant/slimevore/on_reaction(var/datum/reagents/holder)
|
||||
var/mob_path = /mob/living/simple_mob
|
||||
var/blocked = list( //List of things we do NOT want to spawn
|
||||
/mob/living/simple_mob, //Technical parent mobs
|
||||
/mob/living/simple_mob/animal,
|
||||
/mob/living/simple_mob/animal/passive,
|
||||
/mob/living/simple_mob/animal/space,
|
||||
/mob/living/simple_mob/blob,
|
||||
/mob/living/simple_mob/mechanical,
|
||||
/mob/living/simple_mob/mechanical/mecha,
|
||||
/mob/living/simple_mob/slime,
|
||||
/mob/living/simple_mob/vore,
|
||||
/mob/living/simple_mob/vore/aggressive,
|
||||
/mob/living/simple_mob/illusion, //Other technical mobs
|
||||
/mob/living/simple_mob/animal/passive/crab/Coffee, //Unique pets/named mobs
|
||||
/mob/living/simple_mob/animal/passive/cat/runtime,
|
||||
/mob/living/simple_mob/animal/passive/cat/bones,
|
||||
/mob/living/simple_mob/animal/passive/cat/tabiranth,
|
||||
/mob/living/simple_mob/animal/passive/dog/corgi/puppy/Bockscar,
|
||||
/mob/living/simple_mob/animal/passive/dog/corgi/Ian,
|
||||
/mob/living/simple_mob/animal/passive/dog/corgi/Lisa,
|
||||
/mob/living/simple_mob/animal/passive/dog/tamaskan/Spice,
|
||||
/mob/living/simple_mob/animal/passive/fox/renault,
|
||||
/mob/living/simple_mob/animal/passive/bird/azure_tit/tweeter,
|
||||
/mob/living/simple_mob/animal/passive/bird/parrot/poly,
|
||||
/mob/living/simple_mob/animal/sif/fluffy,
|
||||
/mob/living/simple_mob/animal/sif/fluffy/silky,
|
||||
/mob/living/simple_mob/animal/passive/snake/noodle,
|
||||
/mob/living/simple_mob/slime/xenobio/rainbow/kendrick,
|
||||
/mob/living/simple_mob/animal/space/space_worm, //Space Worm parts that aren't proper heads
|
||||
/mob/living/simple_mob/animal/space/space_worm/head/severed,
|
||||
/mob/living/simple_mob/animal/borer, //Event/player-control-only mobs
|
||||
/mob/living/simple_mob/vore/hostile/morph
|
||||
)//exclusion list for things you don't want the reaction to create.
|
||||
blocked += typesof(/mob/living/simple_mob/mechanical/ward) //Wards that should be created with ward items, are mobs mostly on technicalities
|
||||
blocked += typesof(/mob/living/simple_mob/construct) //Should only exist
|
||||
blocked += typesof(/mob/living/simple_mob/vore/demon) //as player-controlled
|
||||
blocked += typesof(/mob/living/simple_mob/shadekin) //and/or event things
|
||||
blocked += typesof(/mob/living/simple_mob/horror)
|
||||
var/list/voremobs = typesof(mob_path) - blocked // list of possible hostile mobs
|
||||
|
||||
playsound(holder.my_atom, 'sound/effects/phasein.ogg', 100, 1)
|
||||
var/spawn_count = rand(1,3)
|
||||
for(var/i = 1, i <= spawn_count, i++)
|
||||
var/chosen = pick(voremobs)
|
||||
var/mob/living/simple_mob/C = new chosen
|
||||
C.faction = "slimesummon"
|
||||
C.loc = get_turf(holder.my_atom)
|
||||
if(prob(50))
|
||||
for(var/j = 1, j <= rand(1, 3), j++)
|
||||
step(C, pick(NORTH,SOUTH,EAST,WEST))
|
||||
|
||||
/decl/chemical_reaction/instant/slime/sapphire_mutation
|
||||
name = "Slime Mutation Toxins"
|
||||
|
||||
@@ -73,11 +73,7 @@
|
||||
return
|
||||
|
||||
/obj/structure/bigDelivery/update_icon()
|
||||
<<<<<<< HEAD
|
||||
cut_overlays()
|
||||
=======
|
||||
overlays = new()
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
if(nameset || examtext)
|
||||
var/image/I = new/image('icons/obj/storage.dmi',"delivery_label")
|
||||
if(icon_state == "deliverycloset")
|
||||
@@ -90,11 +86,7 @@
|
||||
label_x = rand(-8, 6)
|
||||
I.pixel_x = label_x
|
||||
I.pixel_y = -3
|
||||
<<<<<<< HEAD
|
||||
add_overlay(I)
|
||||
=======
|
||||
overlays += I
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
if(src.sortTag)
|
||||
var/image/I = new/image('icons/obj/storage.dmi',"delivery_tag")
|
||||
if(icon_state == "deliverycloset")
|
||||
@@ -107,11 +99,7 @@
|
||||
tag_x = rand(-8, 6)
|
||||
I.pixel_x = tag_x
|
||||
I.pixel_y = -3
|
||||
<<<<<<< HEAD
|
||||
add_overlay(I)
|
||||
=======
|
||||
overlays += I
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
|
||||
/obj/structure/bigDelivery/examine(mob/user)
|
||||
. = ..()
|
||||
@@ -197,20 +185,12 @@
|
||||
return
|
||||
|
||||
/obj/item/smallDelivery/update_icon()
|
||||
<<<<<<< HEAD
|
||||
cut_overlays()
|
||||
=======
|
||||
overlays = new()
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
if((nameset || examtext) && icon_state != "deliverycrate1")
|
||||
var/image/I = new/image('icons/obj/storage.dmi',"delivery_label")
|
||||
if(icon_state == "deliverycrate5")
|
||||
I.pixel_y = -1
|
||||
<<<<<<< HEAD
|
||||
add_overlay(I)
|
||||
=======
|
||||
overlays += I
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
if(src.sortTag)
|
||||
var/image/I = new/image('icons/obj/storage.dmi',"delivery_tag")
|
||||
switch(icon_state)
|
||||
@@ -227,11 +207,7 @@
|
||||
I.pixel_y = 3
|
||||
if("deliverycrate5")
|
||||
I.pixel_y = -3
|
||||
<<<<<<< HEAD
|
||||
add_overlay(I)
|
||||
=======
|
||||
overlays += I
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
|
||||
/obj/item/smallDelivery/examine(mob/user)
|
||||
. = ..()
|
||||
@@ -363,7 +339,6 @@
|
||||
item_state = "electronic"
|
||||
slot_flags = SLOT_BELT
|
||||
|
||||
<<<<<<< HEAD
|
||||
/obj/item/device/destTagger/tgui_state(mob/user)
|
||||
return GLOB.tgui_inventory_state
|
||||
|
||||
@@ -395,32 +370,6 @@
|
||||
return FALSE
|
||||
currTag = new_tag
|
||||
. = TRUE
|
||||
=======
|
||||
/obj/item/device/destTagger/proc/openwindow(mob/user as mob)
|
||||
var/dat = "<tt><center><h1><b>TagMaster 2.3</b></h1></center>"
|
||||
|
||||
dat += "<table style='width:100%; padding:4px;'><tr>"
|
||||
for(var/i = 1, i <= GLOB.tagger_locations.len, i++)
|
||||
dat += "<td><a href='?src=\ref[src];nextTag=[GLOB.tagger_locations[i]]'>[GLOB.tagger_locations[i]]</a></td>"
|
||||
|
||||
if (i%4==0)
|
||||
dat += "</tr><tr>"
|
||||
|
||||
dat += "</tr></table><br>Current Selection: [currTag ? currTag : "None"]</tt>"
|
||||
|
||||
user << browse(dat, "window=destTagScreen;size=450x350")
|
||||
onclose(user, "destTagScreen")
|
||||
|
||||
/obj/item/device/destTagger/attack_self(mob/user as mob)
|
||||
openwindow(user)
|
||||
return
|
||||
|
||||
/obj/item/device/destTagger/Topic(href, href_list)
|
||||
src.add_fingerprint(usr)
|
||||
if(href_list["nextTag"] && (href_list["nextTag"] in GLOB.tagger_locations))
|
||||
src.currTag = href_list["nextTag"]
|
||||
openwindow(usr)
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
|
||||
/obj/machinery/disposal/deliveryChute
|
||||
name = "Delivery chute"
|
||||
@@ -430,20 +379,11 @@
|
||||
|
||||
var/c_mode = 0
|
||||
|
||||
<<<<<<< HEAD
|
||||
/obj/machinery/disposal/deliveryChute/New()
|
||||
..()
|
||||
spawn(5)
|
||||
trunk = locate() in src.loc
|
||||
if(trunk)
|
||||
trunk.linked = src // link the pipe trunk to self
|
||||
=======
|
||||
/obj/machinery/disposal/deliveryChute/Initialize()
|
||||
. = ..()
|
||||
trunk = locate() in src.loc
|
||||
if(trunk)
|
||||
trunk.linked = src // link the pipe trunk to self
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
|
||||
/obj/machinery/disposal/deliveryChute/interact()
|
||||
return
|
||||
@@ -498,36 +438,6 @@
|
||||
return
|
||||
|
||||
if(I.is_screwdriver())
|
||||
<<<<<<< HEAD
|
||||
if(c_mode==0)
|
||||
c_mode=1
|
||||
playsound(src, I.usesound, 50, 1)
|
||||
to_chat(user, "You remove the screws around the power connection.")
|
||||
return
|
||||
else if(c_mode==1)
|
||||
c_mode=0
|
||||
playsound(src, I.usesound, 50, 1)
|
||||
to_chat(user, "You attach the screws around the power connection.")
|
||||
return
|
||||
else if(istype(I, /obj/item/weapon/weldingtool) && c_mode==1)
|
||||
var/obj/item/weapon/weldingtool/W = I
|
||||
if(W.remove_fuel(0,user))
|
||||
playsound(src, W.usesound, 50, 1)
|
||||
to_chat(user, "You start slicing the floorweld off the delivery chute.")
|
||||
if(do_after(user,20 * W.toolspeed))
|
||||
if(!src || !W.isOn()) return
|
||||
to_chat(user, "You sliced the floorweld off the delivery chute.")
|
||||
var/obj/structure/disposalconstruct/C = new (src.loc)
|
||||
C.ptype = 8 // 8 = Delivery chute
|
||||
C.update()
|
||||
C.anchored = 1
|
||||
C.density = 1
|
||||
qdel(src)
|
||||
return
|
||||
else
|
||||
to_chat(user, "You need more welding fuel to complete this task.")
|
||||
return
|
||||
=======
|
||||
c_mode = !c_mode
|
||||
playsound(src, I.usesound, 50, 1)
|
||||
to_chat(user, "You [c_mode ? "remove" : "attach"] the screws around the power connection.")
|
||||
@@ -549,7 +459,6 @@
|
||||
C.density = 1
|
||||
qdel(src)
|
||||
return
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
|
||||
/obj/machinery/disposal/deliveryChute/Destroy()
|
||||
if(trunk)
|
||||
|
||||
@@ -301,25 +301,25 @@
|
||||
ram_cost = 15
|
||||
id = "ar_hud"
|
||||
|
||||
toggle(mob/living/silicon/infomorph/user)
|
||||
user.arHUD = !user.arHUD
|
||||
if(user.plane_holder)
|
||||
user.plane_holder.set_vis(VIS_CH_ID,user.arHUD)
|
||||
user.plane_holder.set_vis(VIS_CH_HEALTH_VR,user.arHUD)
|
||||
/datum/infomorph_software/ar_hud/toggle(mob/living/silicon/infomorph/user)
|
||||
user.arHUD = !user.arHUD
|
||||
if(user.plane_holder)
|
||||
user.plane_holder.set_vis(VIS_CH_ID,user.arHUD)
|
||||
user.plane_holder.set_vis(VIS_CH_HEALTH_VR,user.arHUD)
|
||||
|
||||
is_active(mob/living/silicon/infomorph/user)
|
||||
return user.arHUD
|
||||
/datum/infomorph_software/ar_hud/is_active(mob/living/silicon/infomorph/user)
|
||||
return user.arHUD
|
||||
|
||||
/datum/infomorph_software/translator
|
||||
name = "Universal Translator"
|
||||
ram_cost = 15
|
||||
id = "translator"
|
||||
|
||||
toggle(mob/living/silicon/infomorph/user)
|
||||
user.translator.attack_self(user)
|
||||
/datum/infomorph_software/translator/toggle(mob/living/silicon/infomorph/user)
|
||||
user.translator.attack_self(user)
|
||||
|
||||
is_active(mob/living/silicon/infomorph/user)
|
||||
return user.translator.listening
|
||||
/datum/infomorph_software/translator/is_active(mob/living/silicon/infomorph/user)
|
||||
return user.translator.listening
|
||||
|
||||
|
||||
/datum/infomorph_software/signaller
|
||||
|
||||
@@ -92,28 +92,28 @@
|
||||
type_wall = /turf/simulated/wall
|
||||
type_under = /turf/simulated/floor/plating
|
||||
|
||||
New()
|
||||
..()
|
||||
spot_add(1,1,type_wall) //Bottom left corner
|
||||
spot_add(1,2,type_wall)
|
||||
spot_add(1,3,type_wall)
|
||||
spot_add(2,1,type_wall)
|
||||
spot_add(2,2,type_under) //Center floor
|
||||
spot_add(2,2,/obj/random/roguemineloot) //Loot!
|
||||
spot_add(2,3,type_wall)
|
||||
spot_add(3,1,type_wall)
|
||||
spot_add(3,2,type_wall)
|
||||
spot_add(3,3,type_wall) //Bottom right corner
|
||||
/datum/rogue/asteroid/predef/cargo/New()
|
||||
..()
|
||||
spot_add(1,1,type_wall) //Bottom left corner
|
||||
spot_add(1,2,type_wall)
|
||||
spot_add(1,3,type_wall)
|
||||
spot_add(2,1,type_wall)
|
||||
spot_add(2,2,type_under) //Center floor
|
||||
spot_add(2,2,/obj/random/roguemineloot) //Loot!
|
||||
spot_add(2,3,type_wall)
|
||||
spot_add(3,1,type_wall)
|
||||
spot_add(3,2,type_wall)
|
||||
spot_add(3,3,type_wall) //Bottom right corner
|
||||
|
||||
//Abandoned 1-tile hollow cargo box (ANGRY).
|
||||
/datum/rogue/asteroid/predef/cargo/angry
|
||||
type_wall = /turf/simulated/wall
|
||||
type_under = /turf/simulated/floor/plating
|
||||
|
||||
New()
|
||||
..()
|
||||
spot_add(2,2,/obj/random/roguemineloot) //EXTRA loot!
|
||||
spot_add(2,2,/mob/living/simple_mob/animal/space/alien) //GRRR
|
||||
/datum/rogue/asteroid/predef/cargo/angry/New()
|
||||
..()
|
||||
spot_add(2,2,/obj/random/roguemineloot) //EXTRA loot!
|
||||
spot_add(2,2,/mob/living/simple_mob/animal/space/alien) //GRRR
|
||||
|
||||
//Longer cargo container for higher difficulties
|
||||
/datum/rogue/asteroid/predef/cargo_large
|
||||
@@ -121,30 +121,30 @@
|
||||
type_wall = /turf/simulated/wall
|
||||
type_under = /turf/simulated/floor/plating
|
||||
|
||||
New()
|
||||
..()
|
||||
spot_add(1,2,type_wall) //--
|
||||
spot_add(1,3,type_wall) //Left end of cargo container
|
||||
spot_add(1,4,type_wall) //--
|
||||
/datum/rogue/asteroid/predef/cargo_large/New()
|
||||
..()
|
||||
spot_add(1,2,type_wall) //--
|
||||
spot_add(1,3,type_wall) //Left end of cargo container
|
||||
spot_add(1,4,type_wall) //--
|
||||
|
||||
spot_add(5,2,type_wall) //--
|
||||
spot_add(5,3,type_wall) //Right end of cargo container
|
||||
spot_add(5,4,type_wall) //--
|
||||
spot_add(5,2,type_wall) //--
|
||||
spot_add(5,3,type_wall) //Right end of cargo container
|
||||
spot_add(5,4,type_wall) //--
|
||||
|
||||
spot_add(2,4,type_wall) //--
|
||||
spot_add(3,4,type_wall) //Top and
|
||||
spot_add(4,4,type_wall) //bottom of
|
||||
spot_add(2,2,type_wall) //cargo
|
||||
spot_add(3,2,type_wall) //container
|
||||
spot_add(4,2,type_wall) //--
|
||||
spot_add(2,4,type_wall) //--
|
||||
spot_add(3,4,type_wall) //Top and
|
||||
spot_add(4,4,type_wall) //bottom of
|
||||
spot_add(2,2,type_wall) //cargo
|
||||
spot_add(3,2,type_wall) //container
|
||||
spot_add(4,2,type_wall) //--
|
||||
|
||||
spot_add(2,3,type_under) //Left floor
|
||||
spot_add(3,3,type_under) //Mid floor
|
||||
spot_add(4,3,type_under) //Right floor
|
||||
spot_add(2,3,type_under) //Left floor
|
||||
spot_add(3,3,type_under) //Mid floor
|
||||
spot_add(4,3,type_under) //Right floor
|
||||
|
||||
spot_add(2,3,/obj/random/roguemineloot) //Left loot
|
||||
spot_add(3,3,/obj/random/roguemineloot) //Mid loot
|
||||
spot_add(4,3,/obj/random/roguemineloot) //Right loot
|
||||
spot_add(2,3,/obj/random/roguemineloot) //Left loot
|
||||
spot_add(3,3,/obj/random/roguemineloot) //Mid loot
|
||||
spot_add(4,3,/obj/random/roguemineloot) //Right loot
|
||||
|
||||
if(prob(30))
|
||||
spot_add(3,3,/mob/living/simple_mob/animal/space/alien/sentinel/praetorian) //And maybe a big friend for big loot.
|
||||
if(prob(30))
|
||||
spot_add(3,3,/mob/living/simple_mob/animal/space/alien/sentinel/praetorian) //And maybe a big friend for big loot.
|
||||
|
||||
@@ -148,11 +148,6 @@
|
||||
build_path = /obj/machinery/computer/roguezones
|
||||
origin_tech = list(TECH_DATA = 3, TECH_BLUESPACE = 1)
|
||||
|
||||
// Undefine our constants to not pollute namespace
|
||||
#undef OUTPOST_Z
|
||||
#undef TRANSIT_Z
|
||||
#undef BELT_Z
|
||||
|
||||
/obj/item/weapon/paper/rogueminer
|
||||
name = "R-38 Scanner Console Guide"
|
||||
info = {"<h4>Getting Started</h4>
|
||||
|
||||
@@ -224,31 +224,6 @@
|
||||
return S.memory[address]
|
||||
|
||||
else
|
||||
<<<<<<< HEAD
|
||||
newsign.data["name"] = "<i>[html_encode(uppertext(source))]</i>"
|
||||
newsign.data["realname"] = newsign.data["name"]
|
||||
newsign.data["job"] = job
|
||||
newsign.data["compression"] = 0
|
||||
newsign.data["message"] = message_to_multilingual(message)
|
||||
newsign.data["type"] = 2 // artificial broadcast
|
||||
if(!isnum(freq))
|
||||
freq = text2num(freq)
|
||||
newsign.frequency = freq
|
||||
|
||||
var/datum/radio_frequency/connection = radio_controller.return_frequency(freq)
|
||||
newsign.data["connection"] = connection
|
||||
|
||||
|
||||
newsign.data["radio"] = hradio
|
||||
newsign.data["vmessage"] = message_to_multilingual(message)
|
||||
newsign.data["vname"] = source
|
||||
newsign.data["vmask"] = 0
|
||||
newsign.data["level"] = list()
|
||||
|
||||
var/pass = S.relay_information(newsign, "/obj/machinery/telecomms/hub")
|
||||
if(!pass)
|
||||
S.relay_information(newsign, "/obj/machinery/telecomms/broadcaster") // send this simple message to broadcasters
|
||||
=======
|
||||
S.memory[address] = value
|
||||
|
||||
|
||||
@@ -303,5 +278,4 @@
|
||||
var/pass = S.relay_information(newsign, "/obj/machinery/telecomms/hub")
|
||||
if(!pass)
|
||||
S.relay_information(newsign, "/obj/machinery/telecomms/broadcaster") // send this simple message to broadcasters
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
|
||||
|
||||
@@ -48,14 +48,8 @@
|
||||
var/datum/shuttle/autodock/ferry/escape_pod/pod
|
||||
valid_actions = list("toggle_override", "force_door")
|
||||
|
||||
<<<<<<< HEAD
|
||||
/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod/tgui_data(mob/user)
|
||||
var/datum/computer/file/embedded_program/docking/simple/docking_program = program // Cast to proper type
|
||||
=======
|
||||
/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
|
||||
var/data[0]
|
||||
var/datum/embedded_program/docking/simple/docking_program = program // Cast to proper type
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
|
||||
. = list(
|
||||
"docking_status" = docking_program.get_docking_status(),
|
||||
@@ -85,27 +79,15 @@
|
||||
//This controller is for the escape pod berth (station side)
|
||||
/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod_berth
|
||||
name = "escape pod berth controller"
|
||||
<<<<<<< HEAD
|
||||
program = /datum/computer/file/embedded_program/docking/simple/escape_pod_berth
|
||||
program = /datum/embedded_program/docking/simple/escape_pod_berth
|
||||
valid_actions = list("toggle_override", "force_door")
|
||||
|
||||
/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod_berth/tgui_data(mob/user)
|
||||
var/datum/computer/file/embedded_program/docking/simple/docking_program = program // Cast to proper type
|
||||
|
||||
var/armed = null
|
||||
if(istype(docking_program, /datum/computer/file/embedded_program/docking/simple/escape_pod_berth))
|
||||
var/datum/computer/file/embedded_program/docking/simple/escape_pod_berth/P = docking_program
|
||||
=======
|
||||
program = /datum/embedded_program/docking/simple/escape_pod_berth
|
||||
|
||||
/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod_berth/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
|
||||
var/data[0]
|
||||
var/datum/embedded_program/docking/simple/docking_program = program // Cast to proper type
|
||||
|
||||
var/armed = null
|
||||
if (istype(docking_program, /datum/embedded_program/docking/simple/escape_pod_berth))
|
||||
if(istype(docking_program, /datum/embedded_program/docking/simple/escape_pod_berth))
|
||||
var/datum/embedded_program/docking/simple/escape_pod_berth/P = docking_program
|
||||
>>>>>>> 593246b... Linter diagnostics + bans non-var relative pathing (#8150)
|
||||
armed = P.armed
|
||||
|
||||
. = list(
|
||||
|
||||
@@ -5,24 +5,25 @@
|
||||
name = "Mlemington's Syndrome"
|
||||
stage = 1
|
||||
chance_maxm = 25
|
||||
activate(var/mob/living/carbon/mob,var/multiplier)
|
||||
mob.say("[pick("Mlem.","MLEM!","Mlem?")]")
|
||||
|
||||
/datum/disease2/effect/mlem/activate(var/mob/living/carbon/mob,var/multiplier)
|
||||
mob.say("[pick("Mlem.","MLEM!","Mlem?")]")
|
||||
|
||||
/datum/disease2/effect/spin
|
||||
name = "Spyndrome"
|
||||
stage = 1
|
||||
chance_maxm = 7
|
||||
|
||||
var/list/directions = list(2,4,1,8,2,4,1,8,2,4,1,8,2,4,1,8,2,4,1,8)
|
||||
activate(var/mob/living/carbon/mob,var/multiplier)
|
||||
if(mob.buckled())
|
||||
to_chat(viewers(mob),"<span class='warning'>[mob.name] struggles violently against their restraints!</span>")
|
||||
else
|
||||
to_chat(viewers(mob),"<span class='warning'>[mob.name] spins around violently!</span>")
|
||||
for(var/D in directions)
|
||||
mob.dir = D
|
||||
sleep(1)
|
||||
mob.dir = pick(2,4,1,8) //For that added annoyance
|
||||
|
||||
/datum/disease2/effect/spin/activate(var/mob/living/carbon/mob,var/multiplier)
|
||||
if(mob.buckled())
|
||||
to_chat(viewers(mob),"<span class='warning'>[mob.name] struggles violently against their restraints!</span>")
|
||||
else
|
||||
to_chat(viewers(mob),"<span class='warning'>[mob.name] spins around violently!</span>")
|
||||
for(var/D in directions)
|
||||
mob.dir = D
|
||||
sleep(1)
|
||||
mob.dir = pick(2,4,1,8) //For that added annoyance
|
||||
|
||||
///////////////////////////////////////////////
|
||||
/////////////////// Stage 2 ///////////////////
|
||||
@@ -32,8 +33,8 @@
|
||||
stage = 2
|
||||
chance_maxm = 2
|
||||
|
||||
activate(var/mob/living/carbon/mob,var/multiplier)
|
||||
mob.set_default_language(pick(mob.languages))
|
||||
/datum/disease2/effect/lang/activate(var/mob/living/carbon/mob,var/multiplier)
|
||||
mob.set_default_language(pick(mob.languages))
|
||||
|
||||
///////////////////////////////////////////////
|
||||
/////////////////// Stage 3 ///////////////////
|
||||
@@ -43,20 +44,20 @@
|
||||
stage = 3
|
||||
chance_maxm = 1
|
||||
|
||||
activate(var/mob/living/carbon/mob,var/multiplier)
|
||||
var/newsize = rand (25, 200)
|
||||
mob.resize(newsize/100)
|
||||
to_chat(viewers(mob),"<span class='warning'>[mob.name] suddenly changes size!</span>")
|
||||
/datum/disease2/effect/size/activate(var/mob/living/carbon/mob,var/multiplier)
|
||||
var/newsize = rand (25, 200)
|
||||
mob.resize(newsize/100)
|
||||
to_chat(viewers(mob),"<span class='warning'>[mob.name] suddenly changes size!</span>")
|
||||
|
||||
/datum/disease2/effect/flip
|
||||
name = "Flipponov's Disease"
|
||||
stage = 3
|
||||
chance_maxm = 5
|
||||
|
||||
activate(var/mob/living/carbon/mob,var/multiplier) //Remind me why mob is carbon...?
|
||||
if(ishuman(mob))
|
||||
var/mob/living/carbon/human/H = mob
|
||||
H.emote("flip")
|
||||
else
|
||||
to_chat(viewers(mob),"<span class='warning'>[mob.name] does a backflip!</span>")
|
||||
mob.SpinAnimation(7,1)
|
||||
/datum/disease2/effect/flip/activate(var/mob/living/carbon/mob,var/multiplier) //Remind me why mob is carbon...?
|
||||
if(ishuman(mob))
|
||||
var/mob/living/carbon/human/H = mob
|
||||
H.emote("flip")
|
||||
else
|
||||
to_chat(viewers(mob),"<span class='warning'>[mob.name] does a backflip!</span>")
|
||||
mob.SpinAnimation(7,1)
|
||||
|
||||
@@ -100,13 +100,13 @@
|
||||
name = "Ivy's Courier"
|
||||
desc = "A bag resembling something used by college students. Contains items for ''MooMoo''."
|
||||
|
||||
New()
|
||||
..()
|
||||
new /obj/item/clothing/head/beretg(src)
|
||||
new /obj/item/device/fluff/id_kit_ivy(src)
|
||||
new /obj/item/weapon/storage/fancy/cigarettes/dromedaryco(src)
|
||||
new /obj/item/weapon/storage/box/matches(src)
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/sliceable/plaincake(src)
|
||||
/obj/item/weapon/storage/backpack/messenger/sec/fluff/ivymoomoo/New()
|
||||
..()
|
||||
new /obj/item/clothing/head/beretg(src)
|
||||
new /obj/item/device/fluff/id_kit_ivy(src)
|
||||
new /obj/item/weapon/storage/fancy/cigarettes/dromedaryco(src)
|
||||
new /obj/item/weapon/storage/box/matches(src)
|
||||
new /obj/item/weapon/reagent_containers/food/snacks/sliceable/plaincake(src)
|
||||
|
||||
// jemli:Cirra Mayhem
|
||||
/obj/item/weapon/storage/box/fluff/cirra
|
||||
@@ -139,16 +139,16 @@
|
||||
item_state = "duffle_med"
|
||||
slowdown = 0
|
||||
|
||||
New()
|
||||
..()
|
||||
new /obj/item/clothing/accessory/holster/hip(src)
|
||||
new /obj/item/clothing/suit/storage/fluff/modernfedcoat(src)
|
||||
new /obj/item/clothing/head/caphat/formal/fedcover(src)
|
||||
new /obj/item/clothing/suit/armor/det_suit(src)
|
||||
new /obj/item/weapon/flame/lighter/zippo/fluff/joan(src)
|
||||
new /obj/item/clothing/under/rank/internalaffairs/fluff/joan(src)
|
||||
new /obj/item/clothing/head/helmet/space/fluff/joan(src)
|
||||
new /obj/item/clothing/suit/space/fluff/joan(src)
|
||||
/obj/item/weapon/storage/backpack/dufflebag/sec/fluff/joanrisu/New()
|
||||
..()
|
||||
new /obj/item/clothing/accessory/holster/hip(src)
|
||||
new /obj/item/clothing/suit/storage/fluff/modernfedcoat(src)
|
||||
new /obj/item/clothing/head/caphat/formal/fedcover(src)
|
||||
new /obj/item/clothing/suit/armor/det_suit(src)
|
||||
new /obj/item/weapon/flame/lighter/zippo/fluff/joan(src)
|
||||
new /obj/item/clothing/under/rank/internalaffairs/fluff/joan(src)
|
||||
new /obj/item/clothing/head/helmet/space/fluff/joan(src)
|
||||
new /obj/item/clothing/suit/space/fluff/joan(src)
|
||||
|
||||
//joanrisu:Katarina Eine
|
||||
/obj/item/weapon/storage/backpack/dufflebag/sec/fluff/katarina
|
||||
@@ -156,14 +156,14 @@
|
||||
desc = "A duffle bag Katarina uses to carry her tools."
|
||||
slowdown = 0
|
||||
|
||||
New()
|
||||
..()
|
||||
new /obj/item/clothing/accessory/holster/hip(src)
|
||||
new /obj/item/clothing/suit/storage/fluff/fedcoat(src)
|
||||
new /obj/item/clothing/suit/armor/det_suit(src)
|
||||
new /obj/item/clothing/accessory/storage/black_vest(src)
|
||||
new /obj/item/weapon/material/knife/tacknife/combatknife/fluff/katarina(src)
|
||||
new /obj/item/clothing/under/rank/internalaffairs/fluff/joan(src)
|
||||
/obj/item/weapon/storage/backpack/dufflebag/sec/fluff/katarina/New()
|
||||
..()
|
||||
new /obj/item/clothing/accessory/holster/hip(src)
|
||||
new /obj/item/clothing/suit/storage/fluff/fedcoat(src)
|
||||
new /obj/item/clothing/suit/armor/det_suit(src)
|
||||
new /obj/item/clothing/accessory/storage/black_vest(src)
|
||||
new /obj/item/weapon/material/knife/tacknife/combatknife/fluff/katarina(src)
|
||||
new /obj/item/clothing/under/rank/internalaffairs/fluff/joan(src)
|
||||
|
||||
//Razerwing:Archer Maximus
|
||||
/obj/item/weapon/storage/box/fluff/archermaximus
|
||||
|
||||
@@ -1761,13 +1761,13 @@ Departamental Swimsuits, for general use
|
||||
item_state = "hasd_helm"
|
||||
species_restricted = null
|
||||
|
||||
mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0)
|
||||
if(..())
|
||||
if(H.ckey != "silencedmp5a5")
|
||||
to_chat(H, "<span class='warning'>...The faceplate is clearly not made for your anatomy, thus, does not fit.</span>")
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
/obj/item/clothing/head/helmet/space/void/security/hasd/mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0)
|
||||
if(..())
|
||||
if(H.ckey != "silencedmp5a5")
|
||||
to_chat(H, "<span class='warning'>...The faceplate is clearly not made for your anatomy, thus, does not fit.</span>")
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
|
||||
/obj/item/clothing/suit/space/void/security/hasd
|
||||
name = "HASD EVA bodyplates"
|
||||
@@ -1779,12 +1779,12 @@ Departamental Swimsuits, for general use
|
||||
item_state = "hasd_suit"
|
||||
pixel_x = -16
|
||||
|
||||
mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0)
|
||||
if(..() && istype(H) && H.ckey == "silencedmp5a5")
|
||||
return 1
|
||||
else
|
||||
to_chat(H, "<span class='warning'>This suit is not designed for you.</span>")
|
||||
return 0
|
||||
/obj/item/clothing/suit/space/void/security/hasd/mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0)
|
||||
if(..() && istype(H) && H.ckey == "silencedmp5a5")
|
||||
return 1
|
||||
else
|
||||
to_chat(H, "<span class='warning'>This suit is not designed for you.</span>")
|
||||
return 0
|
||||
|
||||
//Zigfe:Zaoozaoo Xrimxuqmqixzix
|
||||
/obj/item/clothing/head/fluff/zao
|
||||
|
||||
@@ -773,11 +773,12 @@
|
||||
icon_state = "dragor_dot"
|
||||
w_class = ITEMSIZE_SMALL
|
||||
|
||||
attack_self(mob/user as mob)
|
||||
if(user.ckey == "pontifexminimus")
|
||||
user.verbs |= /mob/living/carbon/human/proc/shapeshifter_select_gender
|
||||
else
|
||||
return
|
||||
/obj/item/weapon/fluff/dragor_dot/attack_self(mob/user as mob)
|
||||
if(user.ckey == "pontifexminimus")
|
||||
user.verbs |= /mob/living/carbon/human/proc/shapeshifter_select_gender
|
||||
else
|
||||
return
|
||||
|
||||
//LuminescentRing: Briana Moore
|
||||
/obj/item/weapon/storage/backpack/messenger/black/fluff/briana
|
||||
name = "2561 graduation bag"
|
||||
|
||||
@@ -213,7 +213,7 @@
|
||||
var/mob/living/carbon/human/H = src
|
||||
if(H.flying)
|
||||
return TRUE //Silently pass without a message.
|
||||
if(isTaurTail(H.tail_style))
|
||||
if(istaurtail(H.tail_style))
|
||||
var/datum/sprite_accessory/tail/taur/tail = H.tail_style
|
||||
src_message = tail.msg_owner_help_run
|
||||
tmob_message = tail.msg_prey_help_run
|
||||
@@ -223,7 +223,7 @@
|
||||
src_message = "You run between [tmob]'s legs."
|
||||
tmob_message = "[src] runs between your legs."
|
||||
var/mob/living/carbon/human/H = tmob
|
||||
if(isTaurTail(H.tail_style))
|
||||
if(istaurtail(H.tail_style))
|
||||
var/datum/sprite_accessory/tail/taur/tail = H.tail_style
|
||||
src_message = tail.msg_prey_stepunder
|
||||
tmob_message = tail.msg_owner_stepunder
|
||||
@@ -304,7 +304,7 @@
|
||||
var/message_pred = null
|
||||
var/message_prey = null
|
||||
var/datum/sprite_accessory/tail/taur/tail = null
|
||||
if(isTaurTail(pred.tail_style))
|
||||
if(istaurtail(pred.tail_style))
|
||||
tail = pred.tail_style
|
||||
|
||||
if(a_intent == I_GRAB)
|
||||
|
||||
Reference in New Issue
Block a user