@@ -93,7 +93,6 @@
|
||||
#define BANTYPE_ADMIN_TEMP 8
|
||||
#define BANTYPE_ANY_JOB 9 //used to remove jobbans
|
||||
|
||||
//Please don't edit these values without speaking to Errorage first ~Carn
|
||||
//Admin Permissions
|
||||
#define R_BUILDMODE 1
|
||||
#define R_ADMIN 2
|
||||
@@ -113,7 +112,7 @@
|
||||
#error Remove the flag below , its been long enough
|
||||
#endif
|
||||
//legacy , remove post 512, it was replaced by R_POLL
|
||||
#define R_REJUVINATE 2
|
||||
#define R_REJUVINATE 2
|
||||
|
||||
#define R_MAXPERMISSION 4096 //This holds the maximum value for a permission. It is used in iteration, so keep it updated.
|
||||
|
||||
|
||||
@@ -118,8 +118,8 @@
|
||||
|
||||
|
||||
#define PRESSURE_DAMAGE_COEFFICIENT 4 //The amount of pressure damage someone takes is equal to (pressure / HAZARD_HIGH_PRESSURE)*PRESSURE_DAMAGE_COEFFICIENT, with the maximum of MAX_PRESSURE_DAMAGE
|
||||
#define MAX_HIGH_PRESSURE_DAMAGE 4 //This used to be 20... I got this much random rage for some retarded decision by polymorph?! Polymorph now lies in a pool of blood with a katana jammed in his spleen. ~Errorage --PS: The katana did less than 20 damage to him :(
|
||||
#define LOW_PRESSURE_DAMAGE 2 //The amounb of damage someone takes when in a low pressure area (The pressure threshold is so low that it doesn't make sense to do any calculations, so it just applies this flat value).
|
||||
#define MAX_HIGH_PRESSURE_DAMAGE 4
|
||||
#define LOW_PRESSURE_DAMAGE 2 //The amount of damage someone takes when in a low pressure area (The pressure threshold is so low that it doesn't make sense to do any calculations, so it just applies this flat value).
|
||||
|
||||
#define COLD_SLOWDOWN_FACTOR 20 //Humans are slowed by the difference between bodytemp and BODYTEMP_COLD_DAMAGE_LIMIT divided by this
|
||||
|
||||
@@ -175,4 +175,12 @@
|
||||
#define LAVALAND_EQUIPMENT_EFFECT_PRESSURE 50 //what pressure you have to be under to increase the effect of equipment meant for lavaland
|
||||
#define LAVALAND_DEFAULT_ATMOS "o2=14;n2=23;TEMP=300"
|
||||
|
||||
#define THERMAL_ENERGY(gas) (gas.temperature * gas.heat_capacity())
|
||||
#define THERMAL_ENERGY(gas) (gas.temperature * gas.heat_capacity())
|
||||
|
||||
#define ADD_GAS(gas_id, out_list)\
|
||||
var/list/tmp_gaslist = GLOB.gaslist_cache[gas_id];\
|
||||
out_list[gas_id] = tmp_gaslist.Copy();
|
||||
|
||||
//ASSERT_GAS(gas_id, gas_mixture) - used to guarantee that the gas list for this id exists in gas_mixture.gases.
|
||||
//Must be used before adding to a gas. May be used before reading from a gas.
|
||||
#define ASSERT_GAS(gas_id, gas_mixture) if (!gas_mixture.gases[gas_id]) { ADD_GAS(gas_id, gas_mixture.gases) };
|
||||
|
||||
@@ -70,4 +70,4 @@
|
||||
|
||||
#define ADMIN_MARKREAD(client) "(<a href='?_src_=holder;markedread=\ref[client]'>MARK READ</a>)"//marks an adminhelp as read and under investigation
|
||||
#define ADMIN_IC(client) "(<a href='?_src_=holder;icissue=\ref[client]'>IC</a>)"//marks and adminhelp as an IC issue
|
||||
#define ADMIN_REJECT(client) "(<a href='?_src_=holder;rejectadminhelp=\ref[client]'>REJT</a>)"//Rejects an adminhelp for being unclear or otherwise unhelpful. resets their adminhelp timer
|
||||
#define ADMIN_REJECT(client) "(<a href='?_src_=holder;rejectadminhelp=\ref[client]'>REJT</a>)"//Rejects an adminhelp for being unclear or otherwise unhelpful. resets their adminhelp timer
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#define CONFIG_DEF(X) /datum/config_entry/##X { resident_file = CURRENT_RESIDENT_FILE }; /datum/config_entry/##X
|
||||
#define CONFIG_GET(X) global.config.Get(/datum/config_entry/##X)
|
||||
#define CONFIG_SET(X, Y) global.config.Set(/datum/config_entry/##X, ##Y)
|
||||
#define CONFIG_TWEAK(X) /datum/config_entry/##X
|
||||
|
||||
#define CONFIG_MAPS_FILE "maps.txt"
|
||||
|
||||
|
||||
@@ -133,6 +133,8 @@
|
||||
|
||||
#define isovermind(A) (istype(A, /mob/camera/blob))
|
||||
|
||||
#define iscameramob(A) (istype(A, /mob/camera))
|
||||
|
||||
//Objects
|
||||
#define isobj(A) istype(A, /obj) //override the byond proc because it returns true on children of /atom/movable that aren't objs
|
||||
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
#define ROLE_SERVANT_OF_RATVAR "servant of Ratvar"
|
||||
#define ROLE_BORER "borer"
|
||||
#define ROLE_BROTHER "blood brother"
|
||||
#define ROLE_MISCREANT "miscreant"
|
||||
|
||||
//Missing assignment means it's not a gamemode specific role, IT'S NOT A BUG OR ERROR.
|
||||
//The gamemode specific ones are just so the gamemodes can query whether a player is old enough
|
||||
@@ -46,7 +47,8 @@ GLOBAL_LIST_INIT(special_roles, list(
|
||||
ROLE_ABDUCTOR = /datum/game_mode/abduction,
|
||||
ROLE_DEVIL = /datum/game_mode/devil,
|
||||
ROLE_BORER,
|
||||
ROLE_SERVANT_OF_RATVAR = /datum/game_mode/clockwork_cult
|
||||
ROLE_SERVANT_OF_RATVAR = /datum/game_mode/clockwork_cult,
|
||||
ROLE_MISCREANT
|
||||
))
|
||||
|
||||
//Job defines for what happens when you fail to qualify for any job during job selection
|
||||
|
||||
@@ -289,7 +289,7 @@ Turf and target are separate in case you want to teleport some distance from a t
|
||||
var/list/pois = list()
|
||||
for(var/mob/M in mobs)
|
||||
if(skip_mindless && (!M.mind && !M.ckey))
|
||||
if(!isbot(M) && !istype(M, /mob/camera) && !ismegafauna(M))
|
||||
if(!isbot(M) && !iscameramob(M) && !ismegafauna(M))
|
||||
continue
|
||||
if(M.client && M.client.holder && M.client.holder.fakekey) //stealthmins
|
||||
continue
|
||||
|
||||
@@ -7,13 +7,6 @@ GLOBAL_LIST_INIT(cardinals, list(NORTH, SOUTH, EAST, WEST))
|
||||
GLOBAL_LIST_INIT(alldirs, list(NORTH, SOUTH, EAST, WEST, NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST))
|
||||
GLOBAL_LIST_INIT(diagonals, list(NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST))
|
||||
|
||||
//This list contains the z-level numbers which can be accessed via space travel and the percentile chances to get there.
|
||||
//(Exceptions: extended, sandbox and nuke) -Errorage
|
||||
//Was list("3" = 30, "4" = 70).
|
||||
//Spacing should be a reliable method of getting rid of a body -- Urist.
|
||||
//Go away Urist, I'm restoring this to the longer list. ~Errorage
|
||||
GLOBAL_LIST_INIT(accessable_z_levels, list(1,3,4,5,6,7)) //Keep this to six maps, repeating z-levels is ok if needed
|
||||
|
||||
GLOBAL_LIST_INIT(station_z_levels, list(ZLEVEL_STATION_PRIMARY))
|
||||
|
||||
GLOBAL_LIST(global_map)
|
||||
|
||||
@@ -196,7 +196,8 @@
|
||||
plane = HUD_PLANE
|
||||
|
||||
/obj/screen/drop/Click()
|
||||
usr.drop_item_v()
|
||||
if(usr.stat == CONSCIOUS)
|
||||
usr.dropItemToGround(usr.get_active_held_item())
|
||||
|
||||
/obj/screen/act_intent
|
||||
name = "intent"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/datum/controller/subsystem/ticker/proc/generate_crew_objectives()
|
||||
for(var/datum/mind/crewMind in SSticker.minds)
|
||||
if(prob(2) && !issilicon(crewMind.current) && !jobban_isbanned(crewMind, "Syndicate") && GLOB.miscreants_allowed)
|
||||
if(prob(2) && !issilicon(crewMind.current) && !jobban_isbanned(crewMind, "Syndicate") && GLOB.miscreants_allowed && ROLE_MISCREANT in crewMind.current.client.prefs.be_special)
|
||||
generate_miscreant_objectives(crewMind)
|
||||
else
|
||||
if(CONFIG_GET(flag/allow_crew_objectives))
|
||||
@@ -25,7 +25,8 @@
|
||||
return
|
||||
newObjective.owner = crewMind
|
||||
crewMind.objectives += newObjective
|
||||
to_chat(crewMind, "<B>Your objective:</B> [newObjective.explanation_text]")
|
||||
to_chat(crewMind, "<B>As a part of Nanotrasen's anti-tide efforts, you have been assigned an optional objective. It will be checked at the end of the shift. <font color=red>Performing traitorous acts in pursuit of your objective may result in termination of your employment.</font></B>")
|
||||
to_chat(crewMind, "<B>Your optional objective:</B> [newObjective.explanation_text]")
|
||||
|
||||
/datum/controller/subsystem/ticker/proc/get_valid_crew_objs(var/job = "")//taken from old hippie with adjustments
|
||||
var/list/objpaths = typesof(/datum/objective/crew)
|
||||
|
||||
@@ -7,6 +7,8 @@
|
||||
return
|
||||
if(!crewMind.assigned_role)
|
||||
return
|
||||
if(ROLE_MISCREANT in crewMind.current.client.prefs.be_special)
|
||||
return
|
||||
if(jobban_isbanned(crewMind, "Syndicate"))
|
||||
return
|
||||
var/list/objectiveTypes = typesof(/datum/objective/miscreant) - /datum/objective/miscreant
|
||||
@@ -58,4 +60,7 @@
|
||||
explanation_text = "Act as out of character as you possibly can."
|
||||
|
||||
/datum/objective/miscreant/racism
|
||||
explanation_text = "Attempt to establish superiority of your race."
|
||||
explanation_text = "Attempt to establish superiority of your species."
|
||||
|
||||
/datum/objective/miscreant/cargonia
|
||||
explanation_text = "Attempt to establish independence of your department."
|
||||
|
||||
@@ -185,29 +185,6 @@
|
||||
else
|
||||
return FALSE
|
||||
|
||||
/datum/objective/crew/departmentclothes
|
||||
var/obj/item/clothing/under/rank/targetuniform
|
||||
explanation_text = "Be wearing a (Yo, this objective broke. report this to citadels discord via the development channel) at the end of the shift."
|
||||
jobs = "assistant"
|
||||
|
||||
/datum/objective/crew/departmentclothes/New()
|
||||
. = ..()
|
||||
var/list/blacklist = list(/obj/item/clothing/under/rank, /obj/item/clothing/under/rank/miner, /obj/item/clothing/under/rank/medical/blue, /obj/item/clothing/under/rank/medical/green, /obj/item/clothing/under/rank/medical/purple, /obj/item/clothing/under/rank/security/grey, /obj/item/clothing/under/rank/warden/grey, /obj/item/clothing/under/rank/head_of_security/grey, /obj/item/clothing/under/rank/mailman, /obj/item/clothing/under/rank/psyche, /obj/item/clothing/under/rank/clown/sexy, /obj/item/clothing/under/rank/centcom_officer, /obj/item/clothing/under/rank/centcom_commander, /obj/item/clothing/under/rank/security/navyblue/russian, /obj/item/clothing/under/rank/security/blueshirt)
|
||||
var/list/validclothes = typesof(/obj/item/clothing/under/rank) - blacklist
|
||||
targetuniform = pick(validclothes)
|
||||
update_explanation_text()
|
||||
|
||||
/datum/objective/crew/departmentclothes/update_explanation_text()
|
||||
. = ..()
|
||||
explanation_text = "Be wearing a [initial(targetuniform.name)] at the end of the shift."
|
||||
|
||||
/datum/objective/crew/departmentclothes/check_completion()
|
||||
if(owner && owner.current)
|
||||
var/mob/living/carbon/human/H = owner.current
|
||||
if(istype(H.w_uniform, targetuniform))
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/datum/objective/crew/pwrgame //ported from Goon with adjustments
|
||||
var/obj/item/clothing/targettidegarb
|
||||
explanation_text = "Get your grubby hands on a (Dear god something broke. Report this to Citadel's development dicussion channel)."
|
||||
@@ -215,7 +192,9 @@
|
||||
|
||||
/datum/objective/crew/pwrgame/New()
|
||||
. = ..()
|
||||
var/list/muhvalids = list(/obj/item/clothing/mask/gas, /obj/item/clothing/head/welding, /obj/item/clothing/head/ushanka, /obj/item/clothing/gloves/color/yellow, /obj/item/clothing/mask/gas/owl_mask, /obj/item/clothing/suit/space)
|
||||
var/list/muhvalids = list(/obj/item/clothing/mask/gas, /obj/item/clothing/head/welding, /obj/item/clothing/head/ushanka, /obj/item/clothing/gloves/color/yellow, /obj/item/clothing/mask/gas/owl_mask)
|
||||
if(prob(10))
|
||||
muhvalids += list(/obj/item/clothing/suit/space)
|
||||
targettidegarb = pick(muhvalids)
|
||||
update_explanation_text()
|
||||
|
||||
|
||||
@@ -74,7 +74,7 @@
|
||||
return FALSE
|
||||
|
||||
/datum/objective/crew/noinfections
|
||||
explanation_text = "Ensure no living crew members are infected with harmful viruses at the end of the shift"
|
||||
explanation_text = "Make sure there are no crew members with harmful diseases at the end of the shift."
|
||||
jobs = "virologist"
|
||||
|
||||
/datum/objective/crew/noinfections/check_completion()
|
||||
|
||||
@@ -56,7 +56,6 @@ CONFIG_DEF(flag/log_twitter) // log certain expliotable parrots and other such f
|
||||
CONFIG_DEF(flag/log_world_topic) // log all world.Topic() calls
|
||||
|
||||
CONFIG_DEF(flag/allow_admin_ooccolor) // Allows admins with relevant permissions to have their own ooc colour
|
||||
protection = CONFIG_ENTRY_LOCKED
|
||||
|
||||
CONFIG_DEF(flag/allow_vote_restart) // allow votes to restart
|
||||
|
||||
@@ -351,4 +350,26 @@ CONFIG_DEF(number/error_msg_delay) // How long to wait between messaging admins
|
||||
|
||||
CONFIG_DEF(flag/irc_announce_new_game)
|
||||
|
||||
CONFIG_DEF(flag/debug_admin_hrefs)
|
||||
CONFIG_DEF(flag/debug_admin_hrefs)
|
||||
|
||||
CONFIG_DEF(number/mc_tick_rate/base_mc_tick_rate)
|
||||
integer = FALSE
|
||||
value = 1
|
||||
|
||||
CONFIG_DEF(number/mc_tick_rate/high_pop_mc_tick_rate)
|
||||
integer = FALSE
|
||||
value = 1.1
|
||||
|
||||
CONFIG_DEF(number/mc_tick_rate/high_pop_mc_mode_amount)
|
||||
value = 65
|
||||
|
||||
CONFIG_DEF(number/mc_tick_rate/disable_high_pop_mc_mode_amount)
|
||||
value = 60
|
||||
|
||||
CONFIG_TWEAK(number/mc_tick_rate)
|
||||
abstract_type = /datum/config_entry/number/mc_tick_rate
|
||||
|
||||
CONFIG_TWEAK(number/mc_tick_rate/ValidateAndSet(str_val))
|
||||
. = ..()
|
||||
if (.)
|
||||
Master.UpdateTickRate()
|
||||
|
||||
@@ -573,3 +573,13 @@ GLOBAL_REAL(Master, /datum/controller/master) = new
|
||||
for(var/S in subsystems)
|
||||
var/datum/controller/subsystem/SS = S
|
||||
SS.StopLoadingMap()
|
||||
|
||||
|
||||
/datum/controller/master/proc/UpdateTickRate()
|
||||
if (!processing)
|
||||
return
|
||||
var/client_count = length(GLOB.clients)
|
||||
if (client_count < CONFIG_GET(number/mc_tick_rate/disable_high_pop_mc_mode_amount))
|
||||
processing = CONFIG_GET(number/mc_tick_rate/base_mc_tick_rate)
|
||||
else if (client_count > CONFIG_GET(number/mc_tick_rate/high_pop_mc_mode_amount))
|
||||
processing = CONFIG_GET(number/mc_tick_rate/high_pop_mc_tick_rate)
|
||||
@@ -68,10 +68,57 @@ SUBSYSTEM_DEF(ticker)
|
||||
|
||||
/datum/controller/subsystem/ticker/Initialize(timeofday)
|
||||
load_mode()
|
||||
var/list/music = world.file2list(ROUND_START_MUSIC_LIST, "\n")
|
||||
|
||||
var/list/byond_sound_formats = list(
|
||||
"mid" = TRUE,
|
||||
"midi" = TRUE,
|
||||
"mod" = TRUE,
|
||||
"it" = TRUE,
|
||||
"s3m" = TRUE,
|
||||
"xm" = TRUE,
|
||||
"oxm" = TRUE,
|
||||
"wav" = TRUE,
|
||||
"ogg" = TRUE,
|
||||
"raw" = TRUE,
|
||||
"wma" = TRUE,
|
||||
"aiff" = TRUE
|
||||
)
|
||||
|
||||
var/list/provisional_title_music = flist("config/title_music/sounds/")
|
||||
var/list/music = list()
|
||||
var/use_rare_music = prob(1)
|
||||
|
||||
for(var/S in provisional_title_music)
|
||||
var/lower = lowertext(S)
|
||||
var/list/L = splittext(lower,"+")
|
||||
switch(L.len)
|
||||
if(3) //rare+MAP+sound.ogg or MAP+rare.sound.ogg -- Rare Map-specific sounds
|
||||
if(use_rare_music)
|
||||
if(L[1] == "rare" && L[2] == SSmapping.config.map_name)
|
||||
music += S
|
||||
else if(L[2] == "rare" && L[1] == SSmapping.config.map_name)
|
||||
music += S
|
||||
if(2) //rare+sound.ogg or MAP+sound.ogg -- Rare sounds or Map-specific sounds
|
||||
if((use_rare_music && L[1] == "rare") || (L[1] == SSmapping.config.map_name))
|
||||
music += S
|
||||
if(1) //sound.ogg -- common sound
|
||||
music += S
|
||||
|
||||
var/old_login_music = trim(file2text("data/last_round_lobby_music.txt"))
|
||||
if(music.len > 1)
|
||||
music -= old_login_music
|
||||
|
||||
for(var/S in music)
|
||||
var/list/L = splittext(S,".")
|
||||
if(L.len >= 2)
|
||||
var/ext = lowertext(L[L.len]) //pick the real extension, no 'honk.ogg.exe' nonsense here
|
||||
if(byond_sound_formats[ext])
|
||||
continue
|
||||
music -= S
|
||||
|
||||
if(isemptylist(music))
|
||||
music = world.file2list(ROUND_START_MUSIC_LIST, "\n")
|
||||
|
||||
login_music = pick(music)
|
||||
|
||||
if(!GLOB.syndicate_code_phrase)
|
||||
@@ -258,7 +305,7 @@ SUBSYSTEM_DEF(ticker)
|
||||
//Deleting Startpoints but we need the ai point to AI-ize people later
|
||||
if(S.name != "AI")
|
||||
qdel(S)
|
||||
|
||||
|
||||
//assign crew objectives and generate miscreants
|
||||
if(CONFIG_GET(flag/allow_extended_miscreants) && GLOB.master_mode == "extended")
|
||||
GLOB.miscreants_allowed = TRUE
|
||||
@@ -282,7 +329,7 @@ SUBSYSTEM_DEF(ticker)
|
||||
qdel(bomb)
|
||||
if(epi)
|
||||
explosion(epi, 0, 256, 512, 0, TRUE, TRUE, 0, TRUE)
|
||||
|
||||
|
||||
/datum/controller/subsystem/ticker/proc/create_characters()
|
||||
for(var/mob/dead/new_player/player in GLOB.player_list)
|
||||
if(player.ready == PLAYER_READY_TO_PLAY && player.mind)
|
||||
@@ -472,13 +519,13 @@ SUBSYSTEM_DEF(ticker)
|
||||
if(!crewMind.current || !crewMind.objectives.len)
|
||||
continue
|
||||
for(var/datum/objective/miscreant/MO in crewMind.objectives)
|
||||
miscreants += "<B>[crewMind.current.real_name]</B> (Played by: <B>[crewMind.key]</B>). <B>Objective</B>: [MO.explanation_text]"
|
||||
miscreants += "<B>[crewMind.current.real_name]</B> (Played by: <B>[crewMind.key]</B>)<BR><B>Objective</B>: [MO.explanation_text] <font color='grey'>(Optional)</font><BR>"
|
||||
for(var/datum/objective/crew/CO in crewMind.objectives)
|
||||
if(CO.check_completion())
|
||||
to_chat(crewMind.current, "<br><B>Your objective</B>: [CO.explanation_text] <font color='green'><B>Success!</B></font>")
|
||||
successfulCrew += "<B>[crewMind.current.real_name]</B> (Played by: <B>[crewMind.key]</B>). <B>Objective</B>: [CO.explanation_text]"
|
||||
to_chat(crewMind.current, "<br><B>Your optional objective</B>: [CO.explanation_text] <font color='green'><B>Success!</B></font>")
|
||||
successfulCrew += "<B>[crewMind.current.real_name]</B> (Played by: <B>[crewMind.key]</B>)<BR><B>Objective</B>: [CO.explanation_text] <font color='green'><B>Success!</B></font> <font color='grey'>(Optional)</font><BR>"
|
||||
else
|
||||
to_chat(crewMind.current, "<br><B>Your objective</B>: [CO.explanation_text] <font color='red'><B>Failed.</B></font>")
|
||||
to_chat(crewMind.current, "<br><B>Your optional objective</B>: [CO.explanation_text] <font color='red'><B>Failed.</B></font>")
|
||||
|
||||
if (successfulCrew.len)
|
||||
var/completedObjectives = "<B>The following crew members completed their Crew Objectives:</B><BR>"
|
||||
|
||||
@@ -290,9 +290,10 @@
|
||||
if(!id)
|
||||
var/list/L = list()
|
||||
for(var/datum/symptom/S in symptoms)
|
||||
L += S.id
|
||||
if(S.neutered)
|
||||
L += "N"
|
||||
L += "[S.id]N"
|
||||
else
|
||||
L += S.id
|
||||
L = sortList(L) // Sort the list so it doesn't matter which order the symptoms are in.
|
||||
var/result = jointext(L, ":")
|
||||
id = result
|
||||
|
||||
@@ -1,74 +1,74 @@
|
||||
/*
|
||||
//////////////////////////////////////
|
||||
|
||||
Coughing
|
||||
|
||||
Noticable.
|
||||
Little Resistance.
|
||||
Doesn't increase stage speed much.
|
||||
Transmittable.
|
||||
Low Level.
|
||||
|
||||
BONUS
|
||||
Will force the affected mob to drop small items!
|
||||
|
||||
//////////////////////////////////////
|
||||
*/
|
||||
|
||||
/datum/symptom/cough
|
||||
|
||||
name = "Cough"
|
||||
/*
|
||||
//////////////////////////////////////
|
||||
|
||||
Coughing
|
||||
|
||||
Noticable.
|
||||
Little Resistance.
|
||||
Doesn't increase stage speed much.
|
||||
Transmittable.
|
||||
Low Level.
|
||||
|
||||
BONUS
|
||||
Will force the affected mob to drop small items!
|
||||
|
||||
//////////////////////////////////////
|
||||
*/
|
||||
|
||||
/datum/symptom/cough
|
||||
|
||||
name = "Cough"
|
||||
desc = "The virus irritates the throat of the host, causing occasional coughing."
|
||||
stealth = -1
|
||||
resistance = 3
|
||||
stage_speed = 1
|
||||
transmittable = 2
|
||||
level = 1
|
||||
severity = 1
|
||||
base_message_chance = 15
|
||||
symptom_delay_min = 2
|
||||
symptom_delay_max = 15
|
||||
var/infective = FALSE
|
||||
stealth = -1
|
||||
resistance = 3
|
||||
stage_speed = 1
|
||||
transmittable = 2
|
||||
level = 1
|
||||
severity = 1
|
||||
base_message_chance = 15
|
||||
symptom_delay_min = 2
|
||||
symptom_delay_max = 15
|
||||
var/infective = FALSE
|
||||
threshold_desc = "<b>Resistance 3:</b> Host will drop small items when coughing.<br>\
|
||||
<b>Resistance 10:</b> Occasionally causes coughing fits that stun the host.<br>\
|
||||
<b>Stage Speed 6:</b> Increases cough frequency.<br>\
|
||||
<b>If Airborne:</b> Coughing will infect bystanders.<br>\
|
||||
<b>Stealth 4:</b> The symptom remains hidden until active."
|
||||
|
||||
/datum/symptom/cough/Start(datum/disease/advance/A)
|
||||
..()
|
||||
if(A.properties["stealth"] >= 4)
|
||||
suppress_warning = TRUE
|
||||
if(A.spread_flags &= AIRBORNE) //infect bystanders
|
||||
infective = TRUE
|
||||
if(A.properties["resistance"] >= 3) //strong enough to drop items
|
||||
power = 1.5
|
||||
if(A.properties["resistance"] >= 10) //strong enough to stun (rarely)
|
||||
power = 2
|
||||
if(A.properties["stage_rate"] >= 6) //cough more often
|
||||
symptom_delay_max = 10
|
||||
|
||||
/datum/symptom/cough/Activate(datum/disease/advance/A)
|
||||
if(!..())
|
||||
return
|
||||
var/mob/living/M = A.affected_mob
|
||||
switch(A.stage)
|
||||
if(1, 2, 3)
|
||||
if(prob(base_message_chance) && !suppress_warning)
|
||||
to_chat(M, "<span notice='warning'>[pick("You swallow excess mucus.", "You lightly cough.")]</span>")
|
||||
else
|
||||
M.emote("cough")
|
||||
if(power >= 1.5)
|
||||
var/obj/item/I = M.get_active_held_item()
|
||||
if(I && I.w_class == WEIGHT_CLASS_TINY)
|
||||
M.drop_item()
|
||||
if(power >= 2 && prob(10))
|
||||
to_chat(M, "<span notice='userdanger'>[pick("You have a coughing fit!", "You can't stop coughing!")]</span>")
|
||||
M.Stun(20)
|
||||
M.emote("cough")
|
||||
addtimer(CALLBACK(M, /mob/.proc/emote, "cough"), 6)
|
||||
addtimer(CALLBACK(M, /mob/.proc/emote, "cough"), 12)
|
||||
addtimer(CALLBACK(M, /mob/.proc/emote, "cough"), 18)
|
||||
if(infective)
|
||||
A.spread(1)
|
||||
|
||||
|
||||
/datum/symptom/cough/Start(datum/disease/advance/A)
|
||||
..()
|
||||
if(A.properties["stealth"] >= 4)
|
||||
suppress_warning = TRUE
|
||||
if(A.spread_flags &= AIRBORNE) //infect bystanders
|
||||
infective = TRUE
|
||||
if(A.properties["resistance"] >= 3) //strong enough to drop items
|
||||
power = 1.5
|
||||
if(A.properties["resistance"] >= 10) //strong enough to stun (rarely)
|
||||
power = 2
|
||||
if(A.properties["stage_rate"] >= 6) //cough more often
|
||||
symptom_delay_max = 10
|
||||
|
||||
/datum/symptom/cough/Activate(datum/disease/advance/A)
|
||||
if(!..())
|
||||
return
|
||||
var/mob/living/M = A.affected_mob
|
||||
switch(A.stage)
|
||||
if(1, 2, 3)
|
||||
if(prob(base_message_chance) && !suppress_warning)
|
||||
to_chat(M, "<span notice='warning'>[pick("You swallow excess mucus.", "You lightly cough.")]</span>")
|
||||
else
|
||||
M.emote("cough")
|
||||
if(power >= 1.5)
|
||||
var/obj/item/I = M.get_active_held_item()
|
||||
if(I && I.w_class == WEIGHT_CLASS_TINY)
|
||||
M.dropItemToGround(I)
|
||||
if(power >= 2 && prob(10))
|
||||
to_chat(M, "<span notice='userdanger'>[pick("You have a coughing fit!", "You can't stop coughing!")]</span>")
|
||||
M.Stun(20)
|
||||
M.emote("cough")
|
||||
addtimer(CALLBACK(M, /mob/.proc/emote, "cough"), 6)
|
||||
addtimer(CALLBACK(M, /mob/.proc/emote, "cough"), 12)
|
||||
addtimer(CALLBACK(M, /mob/.proc/emote, "cough"), 18)
|
||||
if(infective)
|
||||
A.spread(1)
|
||||
|
||||
|
||||
@@ -85,7 +85,7 @@
|
||||
"<span class='userdanger'>[A] strikes your abdomen, neck and back consecutively!</span>")
|
||||
playsound(get_turf(D), 'sound/weapons/cqchit2.ogg', 50, 1, -1)
|
||||
var/obj/item/I = D.get_active_held_item()
|
||||
if(I && D.drop_item())
|
||||
if(I && D.temporarilyRemoveItemFromInventory(I))
|
||||
A.put_in_hands(I)
|
||||
D.adjustStaminaLoss(50)
|
||||
D.apply_damage(25, BRUTE)
|
||||
@@ -145,7 +145,7 @@
|
||||
D.visible_message("<span class='warning'>[A] strikes [D]'s jaw with their hand!</span>", \
|
||||
"<span class='userdanger'>[A] strikes your jaw, disorienting you!</span>")
|
||||
playsound(get_turf(D), 'sound/weapons/cqchit1.ogg', 50, 1, -1)
|
||||
if(I && D.drop_item())
|
||||
if(I && D.temporarilyRemoveItemFromInventory(I))
|
||||
A.put_in_hands(I)
|
||||
D.Jitter(2)
|
||||
D.apply_damage(5, BRUTE)
|
||||
@@ -193,7 +193,6 @@
|
||||
to_chat(user, "<span class='boldannounce'>You remember the basics of CQC.</span>")
|
||||
var/datum/martial_art/cqc/D = new(null)
|
||||
D.teach(user)
|
||||
user.drop_item()
|
||||
visible_message("<span class='warning'>[src] beeps ominously, and a moment later it bursts up in flames.</span>")
|
||||
new /obj/effect/decal/cleanable/ash(get_turf(src))
|
||||
qdel(src)
|
||||
new /obj/effect/decal/cleanable/ash(user.drop_location())
|
||||
|
||||
@@ -150,7 +150,7 @@
|
||||
if(prob(60))
|
||||
I = D.get_active_held_item()
|
||||
if(I)
|
||||
if(D.drop_item())
|
||||
if(D.temporarilyRemoveItemFromInventory(I))
|
||||
A.put_in_hands(I)
|
||||
D.visible_message("<span class='danger'>[A] has disarmed [D]!</span>", \
|
||||
"<span class='userdanger'>[A] has disarmed [D]!</span>")
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
"<span class='userdanger'>[A] grabs your wrist and violently wrenches it to the side!</span>")
|
||||
playsound(get_turf(A), 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
|
||||
D.emote("scream")
|
||||
D.drop_item()
|
||||
D.dropItemToGround(D.get_active_held_item())
|
||||
D.apply_damage(5, BRUTE, pick("l_arm", "r_arm"))
|
||||
D.Stun(60)
|
||||
return 1
|
||||
@@ -79,7 +79,7 @@
|
||||
D.visible_message("<span class='warning'>[A] kicks [D] in the head!</span>", \
|
||||
"<span class='userdanger'>[A] kicks you in the jaw!</span>")
|
||||
D.apply_damage(20, BRUTE, "head")
|
||||
D.drop_item()
|
||||
D.drop_all_held_items()
|
||||
playsound(get_turf(D), 'sound/weapons/punch1.ogg', 50, 1, -1)
|
||||
D.Stun(80)
|
||||
return 1
|
||||
@@ -168,10 +168,9 @@
|
||||
to_chat(user, message)
|
||||
var/datum/martial_art/the_sleeping_carp/theSleepingCarp = new(null)
|
||||
theSleepingCarp.teach(user)
|
||||
user.drop_item()
|
||||
visible_message("<span class='warning'>[src] lights up in fire and quickly burns to ash.</span>")
|
||||
new /obj/effect/decal/cleanable/ash(get_turf(src))
|
||||
qdel(src)
|
||||
visible_message("<span class='warning'>[src] lights up in fire and quickly burns to ash.</span>")
|
||||
new /obj/effect/decal/cleanable/ash(user.drop_location())
|
||||
|
||||
/obj/item/twohanded/bostaff
|
||||
name = "bo staff"
|
||||
|
||||
@@ -270,7 +270,7 @@ GLOBAL_LIST_EMPTY(mutations_list)
|
||||
|
||||
/datum/mutation/human/cough/on_life(mob/living/carbon/human/owner)
|
||||
if(prob(5) && owner.stat == CONSCIOUS)
|
||||
owner.drop_item()
|
||||
owner.drop_all_held_items()
|
||||
owner.emote("cough")
|
||||
|
||||
/datum/mutation/human/dwarfism
|
||||
|
||||
@@ -250,9 +250,10 @@
|
||||
if(istype(I, /obj/item/device/assembly))
|
||||
var/obj/item/device/assembly/A = I
|
||||
if(A.attachable)
|
||||
if(!L.drop_item())
|
||||
if(!L.temporarilyRemoveItemFromInventory(A))
|
||||
return
|
||||
attach_assembly(target_wire, A)
|
||||
if(!attach_assembly(target_wire, A))
|
||||
A.forceMove(L.drop_location())
|
||||
. = TRUE
|
||||
else
|
||||
to_chat(L, "<span class='warning'>You need an attachable assembly!</span>")
|
||||
|
||||
@@ -36,8 +36,6 @@
|
||||
if(GLOB.use_preloader && (src.type == GLOB._preloader.target_path))//in case the instanciated atom is creating other atoms in New()
|
||||
GLOB._preloader.load(src)
|
||||
|
||||
//. = ..() //uncomment if you are dumb enough to add a /datum/New() proc
|
||||
|
||||
var/do_initialize = SSatoms.initialized
|
||||
if(do_initialize > INITIALIZATION_INSSATOMS)
|
||||
args[1] = do_initialize == INITIALIZATION_INNEW_MAPLOAD
|
||||
|
||||
@@ -90,7 +90,7 @@
|
||||
if("healing")
|
||||
M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/charge(null))
|
||||
M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/forcewall(null))
|
||||
M.put_in_hands_or_del(new /obj/item/gun/magic/staff/healing(M))
|
||||
M.put_in_hands(new /obj/item/gun/magic/staff/healing(M), TRUE)
|
||||
to_chat(M, "<B>Your service has not gone unrewarded, however. Studying under [wizard_name], you have learned livesaving survival spells. You are able to cast charge and forcewall.")
|
||||
if("robeless")
|
||||
M.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/knock(null))
|
||||
|
||||
@@ -37,8 +37,9 @@
|
||||
return 1
|
||||
|
||||
/obj/effect/proc_holder/changeling/weapon/sting_action(mob/living/user)
|
||||
if(!user.drop_item())
|
||||
to_chat(user, "<span class='warning'>The [user.get_active_held_item()] is stuck to your hand, you cannot grow a [weapon_name_simple] over it!</span>")
|
||||
var/obj/item/held = user.get_active_held_item()
|
||||
if(held && !user.dropItemToGround(held))
|
||||
to_chat(user, "<span class='warning'>[held] is stuck to your hand, you cannot grow a [weapon_name_simple] over it!</span>")
|
||||
return
|
||||
var/limb_regen = 0
|
||||
if(user.active_hand_index % 2 == 0) //we regen the arm before changing it into the weapon
|
||||
@@ -338,7 +339,7 @@
|
||||
if(INTENT_DISARM)
|
||||
var/obj/item/I = C.get_active_held_item()
|
||||
if(I)
|
||||
if(C.drop_item())
|
||||
if(C.dropItemToGround(I))
|
||||
C.visible_message("<span class='danger'>[I] is yanked off [C]'s hand by [src]!</span>","<span class='userdanger'>A tentacle pulls [I] away from you!</span>")
|
||||
on_hit(I) //grab the item as if you had hit it directly with the tentacle
|
||||
return 1
|
||||
|
||||
@@ -127,8 +127,9 @@
|
||||
/obj/effect/proc_holder/changeling/sting/false_armblade/sting_action(mob/user, mob/target)
|
||||
add_logs(user, target, "stung", object="falso armblade sting")
|
||||
|
||||
if(!target.drop_item())
|
||||
to_chat(user, "<span class='warning'>The [target.get_active_held_item()] is stuck to their hand, you cannot grow a false armblade over it!</span>")
|
||||
var/obj/item/held = target.get_active_held_item()
|
||||
if(held && !target.dropItemToGround(held))
|
||||
to_chat(user, "<span class='warning'>[held] is stuck to their hand, you cannot grow a false armblade over it!</span>")
|
||||
return
|
||||
|
||||
if(ismonkey(target))
|
||||
|
||||
@@ -88,7 +88,7 @@
|
||||
if(istype(I, /obj/item/clockwork/slab))
|
||||
to_chat(user, "<span class='heavy_brass'>\"I don't think you want to drop your slab into that.\"\n\"If you really want to, try throwing it.\"</span>")
|
||||
return TRUE
|
||||
if(user.drop_item() && uses)
|
||||
if(uses && user.dropItemToGround(I))
|
||||
user.visible_message("<span class='warning'>[user] drops [I] into [src]!</span>", "<span class='danger'>You drop [I] into [src]!</span>")
|
||||
pass_through_gateway(I, TRUE)
|
||||
return TRUE
|
||||
|
||||
@@ -20,7 +20,6 @@
|
||||
"<span class='alloy'>You crush [src], capturing its escaping energy for use as power.</span>")
|
||||
playsound(user, 'sound/effects/pop_expl.ogg', 50, TRUE)
|
||||
adjust_clockwork_power(POWER_WALL_TOTAL)
|
||||
user.drop_item()
|
||||
qdel(src)
|
||||
|
||||
/obj/item/clockwork/component/pickup(mob/living/user)
|
||||
|
||||
@@ -28,7 +28,6 @@
|
||||
if(weapon.loc == owner)
|
||||
owner.visible_message("<span class='danger'>[owner]'s [weapon.name] flickers and disappears!</span>")
|
||||
to_chat(owner, "<span class='brass'>You dismiss [weapon].</span>")
|
||||
owner.drop_item()
|
||||
QDEL_NULL(weapon)
|
||||
weapon_reset(RATVARIAN_SPEAR_COOLDOWN * 0.5)
|
||||
return
|
||||
|
||||
@@ -136,7 +136,7 @@
|
||||
to_chat(user, "<span class='heavy_brass'>\"You reek of blood. You've got a lot of nerve to even look at that slab.\"</span>")
|
||||
user.visible_message("<span class='warning'>A sizzling sound comes from [user]'s hands!</span>", "<span class='userdanger'>[src] suddenly grows extremely hot in your hands!</span>")
|
||||
playsound(get_turf(user), 'sound/weapons/sear.ogg', 50, 1)
|
||||
user.drop_item()
|
||||
user.dropItemToGround(src)
|
||||
user.emote("scream")
|
||||
user.apply_damage(5, BURN, "l_arm")
|
||||
user.apply_damage(5, BURN, "r_arm")
|
||||
|
||||
@@ -12,6 +12,7 @@ Applications: 8 servants, 3 caches, and 100 CV
|
||||
var/name = "scripture"
|
||||
var/desc = "Ancient Ratvarian lore. This piece seems particularly mundane."
|
||||
var/list/invocations = list() //Spoken over time in the ancient language of Ratvar. See clock_unsorted.dm for more details on the language and how to make it.
|
||||
var/chanting = FALSE //If the invocation's words are being spoken
|
||||
var/channel_time = 10 //In deciseconds, how long a ritual takes to chant
|
||||
var/power_cost = 5 //In watts, how much a scripture takes to invoke
|
||||
var/special_power_text //If the scripture can use additional power to have a unique function, use this; put POWERCOST here to display the special power cost.
|
||||
@@ -145,18 +146,29 @@ Applications: 8 servants, 3 caches, and 100 CV
|
||||
to_chat(invoker, "<span class='brass'>You [channel_time <= 0 ? "recite" : "begin reciting"] a piece of scripture entitled \"[name]\".</span>")
|
||||
if(!channel_time)
|
||||
return TRUE
|
||||
chant()
|
||||
if(!do_after(invoker, channel_time, target = invoker, extra_checks = CALLBACK(src, .proc/check_special_requirements)))
|
||||
slab.busy = null
|
||||
chanting = FALSE
|
||||
scripture_fail()
|
||||
chanting = FALSE
|
||||
return
|
||||
chanting = FALSE
|
||||
return TRUE
|
||||
|
||||
/datum/clockwork_scripture/proc/chant()
|
||||
set waitfor = FALSE
|
||||
chanting = TRUE
|
||||
for(var/invocation in invocations)
|
||||
if(!do_after(invoker, channel_time / invocations.len, target = invoker, extra_checks = CALLBACK(src, .proc/check_special_requirements)))
|
||||
slab.busy = null
|
||||
scripture_fail()
|
||||
return FALSE
|
||||
sleep(channel_time / invocations.len)
|
||||
if(QDELETED(src) || QDELETED(slab) || !chanting)
|
||||
return
|
||||
if(multiple_invokers_used)
|
||||
for(var/mob/living/L in range(1, get_turf(invoker)))
|
||||
if(can_recite_scripture(L))
|
||||
clockwork_say(L, text2ratvar(invocation), whispered)
|
||||
else
|
||||
clockwork_say(invoker, text2ratvar(invocation), whispered)
|
||||
return TRUE
|
||||
|
||||
/datum/clockwork_scripture/proc/scripture_effects() //The actual effects of the recital after its conclusion
|
||||
|
||||
|
||||
@@ -21,7 +21,6 @@
|
||||
if(invoke(user))
|
||||
uses--
|
||||
if(uses <= 0)
|
||||
user.drop_item()
|
||||
qdel(src)
|
||||
|
||||
/obj/item/paper/talisman/proc/invoke(mob/living/user, successfuluse = 1)
|
||||
@@ -182,7 +181,6 @@
|
||||
C.Jitter(15)
|
||||
if(is_servant_of_ratvar(target))
|
||||
target.adjustBruteLoss(15)
|
||||
user.drop_item()
|
||||
qdel(src)
|
||||
return
|
||||
..()
|
||||
@@ -204,13 +202,13 @@
|
||||
user.equip_to_slot_or_del(new /obj/item/clothing/suit/cultrobes/alt(user), slot_wear_suit)
|
||||
user.equip_to_slot_or_del(new /obj/item/clothing/shoes/cult/alt(user), slot_shoes)
|
||||
user.equip_to_slot_or_del(new /obj/item/storage/backpack/cultpack(user), slot_back)
|
||||
user.drop_item()
|
||||
user.dropItemToGround(src)
|
||||
user.put_in_hands(new /obj/item/melee/cultblade(user))
|
||||
user.put_in_hands(new /obj/item/restraints/legcuffs/bola/cult(user))
|
||||
|
||||
/obj/item/paper/talisman/armor/attack(mob/living/target, mob/living/user)
|
||||
if(iscultist(user) && iscultist(target))
|
||||
user.drop_item()
|
||||
user.temporarilyRemoveItemFromInventory(src)
|
||||
invoke(target)
|
||||
qdel(src)
|
||||
return
|
||||
@@ -335,7 +333,6 @@
|
||||
else
|
||||
to_chat(user, "<span class='warning'>[C] is already bound.</span>")
|
||||
if(uses <= 0)
|
||||
user.drop_item()
|
||||
qdel(src)
|
||||
|
||||
/obj/item/restraints/handcuffs/energy/cult //For the talisman of shackling
|
||||
|
||||
@@ -184,7 +184,7 @@
|
||||
"<span class='userdanger'>[M] has pushed down [src]!</span>")
|
||||
else
|
||||
if (prob(25))
|
||||
drop_item()
|
||||
dropItemToGround(get_active_held_item())
|
||||
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
|
||||
visible_message("<span class='danger'>[M] has disarmed [src]!</span>", \
|
||||
"<span class='userdanger'>[M] has disarmed [src]!</span>")
|
||||
|
||||
@@ -49,7 +49,7 @@
|
||||
|
||||
/datum/surgery_step/gland_insert/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
user.visible_message("[user] inserts [tool] into [target].", "<span class ='notice'>You insert [tool] into [target].</span>")
|
||||
user.drop_item()
|
||||
user.temporarilyRemoveItemFromInventory(tool, TRUE)
|
||||
var/obj/item/organ/heart/gland/gland = tool
|
||||
gland.Insert(target, 2)
|
||||
return 1
|
||||
|
||||
@@ -353,7 +353,7 @@
|
||||
return ..()
|
||||
user.visible_message("<span class='notice'>[user] scatters [src] in all directions.</span>", \
|
||||
"<span class='notice'>You scatter [src] across the area. The particles slowly fade away.</span>")
|
||||
user.drop_item()
|
||||
user.dropItemToGround(src)
|
||||
scatter()
|
||||
|
||||
/obj/item/ectoplasm/revenant/throw_impact(atom/hit_atom)
|
||||
|
||||
@@ -97,7 +97,7 @@
|
||||
return
|
||||
user.visible_message("<span class='warning'>[user]'s eyes flare a deep crimson!</span>", \
|
||||
"<span class='userdanger'>You feel a strange power seep into your body... you have absorbed the demon's blood-travelling powers!</span>")
|
||||
user.drop_item()
|
||||
user.temporarilyRemoveItemFromInventory(src, TRUE)
|
||||
src.Insert(user) //Consuming the heart literally replaces your heart with a demon heart. H A R D C O R E
|
||||
|
||||
/obj/item/organ/heart/demon/Insert(mob/living/carbon/M, special = 0)
|
||||
|
||||
@@ -91,7 +91,7 @@
|
||||
to_chat(synd_mind.current, "<B>In your hand you will find a special item capable of triggering a greater challenge for your team. Examine it carefully and consult with your fellow operatives before activating it.</B>")
|
||||
|
||||
var/obj/item/device/nuclear_challenge/challenge = new /obj/item/device/nuclear_challenge
|
||||
synd_mind.current.put_in_hands_or_del(challenge)
|
||||
synd_mind.current.put_in_hands(challenge, TRUE)
|
||||
|
||||
var/list/foundIDs = synd_mind.current.search_contents_for(/obj/item/card/id)
|
||||
if(foundIDs.len)
|
||||
@@ -110,8 +110,7 @@
|
||||
P.info = "The nuclear authorization code is: <b>[nuke_code]</b>"
|
||||
P.name = "nuclear bomb code"
|
||||
var/mob/living/carbon/human/H = synd_mind.current
|
||||
P.forceMove(H.drop_location())
|
||||
H.put_in_hands_or_del(P)
|
||||
H.put_in_hands(P, TRUE)
|
||||
H.update_icons()
|
||||
else
|
||||
nuke_code = "code will be provided later"
|
||||
|
||||
@@ -105,9 +105,8 @@
|
||||
|
||||
/obj/machinery/nuclearbomb/attackby(obj/item/I, mob/user, params)
|
||||
if (istype(I, /obj/item/disk/nuclear))
|
||||
if(!user.drop_item())
|
||||
if(!user.transferItemToLoc(I, src))
|
||||
return
|
||||
I.forceMove(src)
|
||||
auth = I
|
||||
add_fingerprint(user)
|
||||
return
|
||||
@@ -309,10 +308,8 @@
|
||||
. = TRUE
|
||||
if("insert_disk")
|
||||
if(!auth)
|
||||
var/obj/item/I = usr.get_active_held_item()
|
||||
if(istype(I, /obj/item/disk/nuclear))
|
||||
usr.drop_item()
|
||||
I.forceMove(src)
|
||||
var/obj/item/I = usr.is_holding_item_of_type(/obj/item/disk/nuclear)
|
||||
if(I && usr.transferItemToLoc(I, src))
|
||||
auth = I
|
||||
. = TRUE
|
||||
if("keypad")
|
||||
|
||||
@@ -193,8 +193,8 @@
|
||||
H.equip_to_slot_or_del(new hat(H), slot_head)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/under/roman(H), slot_w_uniform)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/roman(H), slot_shoes)
|
||||
H.put_in_hands_or_del(new /obj/item/shield/riot/roman(H))
|
||||
H.put_in_hands_or_del(new /obj/item/claymore(H))
|
||||
H.put_in_hands(new /obj/item/shield/riot/roman(H), TRUE)
|
||||
H.put_in_hands(new /obj/item/claymore(H), TRUE)
|
||||
H.equip_to_slot_or_del(new /obj/item/twohanded/spear(H), slot_back)
|
||||
|
||||
|
||||
|
||||
@@ -159,7 +159,7 @@
|
||||
wizard_mob.equip_to_slot_or_del(new /obj/item/teleportation_scroll(wizard_mob), slot_r_store)
|
||||
var/obj/item/spellbook/spellbook = new /obj/item/spellbook(wizard_mob)
|
||||
spellbook.owner = wizard_mob
|
||||
wizard_mob.put_in_hands_or_del(spellbook)
|
||||
wizard_mob.put_in_hands(spellbook, TRUE)
|
||||
|
||||
to_chat(wizard_mob, "You will find a list of available spells in your spell book. Choose your magic arsenal carefully.")
|
||||
to_chat(wizard_mob, "The spellbook is bound to you, and others cannot use it.")
|
||||
|
||||
+132
-136
@@ -1,32 +1,32 @@
|
||||
/obj/machinery/pdapainter
|
||||
name = "\improper PDA painter"
|
||||
desc = "A PDA painting machine. To use, simply insert your PDA and choose the desired preset paint scheme."
|
||||
icon = 'icons/obj/pda.dmi'
|
||||
icon_state = "pdapainter"
|
||||
/obj/machinery/pdapainter
|
||||
name = "\improper PDA painter"
|
||||
desc = "A PDA painting machine. To use, simply insert your PDA and choose the desired preset paint scheme."
|
||||
icon = 'icons/obj/pda.dmi'
|
||||
icon_state = "pdapainter"
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
var/obj/item/device/pda/storedpda = null
|
||||
var/list/colorlist = list()
|
||||
max_integrity = 200
|
||||
|
||||
|
||||
/obj/machinery/pdapainter/update_icon()
|
||||
cut_overlays()
|
||||
|
||||
if(stat & BROKEN)
|
||||
icon_state = "[initial(icon_state)]-broken"
|
||||
return
|
||||
|
||||
if(storedpda)
|
||||
add_overlay("[initial(icon_state)]-closed")
|
||||
|
||||
if(powered())
|
||||
icon_state = initial(icon_state)
|
||||
else
|
||||
icon_state = "[initial(icon_state)]-off"
|
||||
|
||||
return
|
||||
|
||||
var/obj/item/device/pda/storedpda = null
|
||||
var/list/colorlist = list()
|
||||
max_integrity = 200
|
||||
|
||||
|
||||
/obj/machinery/pdapainter/update_icon()
|
||||
cut_overlays()
|
||||
|
||||
if(stat & BROKEN)
|
||||
icon_state = "[initial(icon_state)]-broken"
|
||||
return
|
||||
|
||||
if(storedpda)
|
||||
add_overlay("[initial(icon_state)]-closed")
|
||||
|
||||
if(powered())
|
||||
icon_state = initial(icon_state)
|
||||
else
|
||||
icon_state = "[initial(icon_state)]-off"
|
||||
|
||||
return
|
||||
|
||||
/obj/machinery/pdapainter/Initialize()
|
||||
. = ..()
|
||||
var/list/blocked = list(
|
||||
@@ -37,114 +37,110 @@
|
||||
/obj/item/device/pda/syndicate)
|
||||
|
||||
for(var/P in typesof(/obj/item/device/pda) - blocked)
|
||||
var/obj/item/device/pda/D = new P
|
||||
|
||||
//D.name = "PDA Style [colorlist.len+1]" //Gotta set the name, otherwise it all comes up as "PDA"
|
||||
D.name = D.icon_state //PDAs don't have unique names, but using the sprite names works.
|
||||
|
||||
src.colorlist += D
|
||||
|
||||
/obj/machinery/pdapainter/Destroy()
|
||||
var/obj/item/device/pda/D = new P
|
||||
|
||||
//D.name = "PDA Style [colorlist.len+1]" //Gotta set the name, otherwise it all comes up as "PDA"
|
||||
D.name = D.icon_state //PDAs don't have unique names, but using the sprite names works.
|
||||
|
||||
src.colorlist += D
|
||||
|
||||
/obj/machinery/pdapainter/Destroy()
|
||||
QDEL_NULL(storedpda)
|
||||
return ..()
|
||||
|
||||
/obj/machinery/pdapainter/on_deconstruction()
|
||||
if(storedpda)
|
||||
storedpda.forceMove(loc)
|
||||
storedpda = null
|
||||
|
||||
/obj/machinery/pdapainter/contents_explosion(severity, target)
|
||||
if(storedpda)
|
||||
storedpda.ex_act(severity, target)
|
||||
|
||||
/obj/machinery/pdapainter/handle_atom_del(atom/A)
|
||||
if(A == storedpda)
|
||||
storedpda = null
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/pdapainter/attackby(obj/item/O, mob/user, params)
|
||||
if(default_unfasten_wrench(user, O))
|
||||
power_change()
|
||||
return
|
||||
|
||||
else if(istype(O, /obj/item/device/pda))
|
||||
if(storedpda)
|
||||
to_chat(user, "<span class='warning'>There is already a PDA inside!</span>")
|
||||
return
|
||||
else
|
||||
var/obj/item/device/pda/P = user.get_active_held_item()
|
||||
if(istype(P))
|
||||
if(!user.drop_item())
|
||||
return
|
||||
storedpda = P
|
||||
P.loc = src
|
||||
P.add_fingerprint(user)
|
||||
update_icon()
|
||||
|
||||
else if(istype(O, /obj/item/weldingtool) && user.a_intent != INTENT_HARM)
|
||||
var/obj/item/weldingtool/WT = O
|
||||
if(stat & BROKEN)
|
||||
if(WT.remove_fuel(0,user))
|
||||
user.visible_message("[user] is repairing [src].", \
|
||||
"<span class='notice'>You begin repairing [src]...</span>", \
|
||||
"<span class='italics'>You hear welding.</span>")
|
||||
playsound(loc, WT.usesound, 40, 1)
|
||||
if(do_after(user,40*WT.toolspeed, 1, target = src))
|
||||
if(!WT.isOn() || !(stat & BROKEN))
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You repair [src].</span>")
|
||||
playsound(loc, 'sound/items/welder2.ogg', 50, 1)
|
||||
stat &= ~BROKEN
|
||||
obj_integrity = max_integrity
|
||||
update_icon()
|
||||
else
|
||||
to_chat(user, "<span class='notice'>[src] does not need repairs.</span>")
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/machinery/pdapainter/deconstruct(disassembled = TRUE)
|
||||
return ..()
|
||||
|
||||
/obj/machinery/pdapainter/on_deconstruction()
|
||||
if(storedpda)
|
||||
storedpda.forceMove(loc)
|
||||
storedpda = null
|
||||
|
||||
/obj/machinery/pdapainter/contents_explosion(severity, target)
|
||||
if(storedpda)
|
||||
storedpda.ex_act(severity, target)
|
||||
|
||||
/obj/machinery/pdapainter/handle_atom_del(atom/A)
|
||||
if(A == storedpda)
|
||||
storedpda = null
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/pdapainter/attackby(obj/item/O, mob/user, params)
|
||||
if(default_unfasten_wrench(user, O))
|
||||
power_change()
|
||||
return
|
||||
|
||||
else if(istype(O, /obj/item/device/pda))
|
||||
if(storedpda)
|
||||
to_chat(user, "<span class='warning'>There is already a PDA inside!</span>")
|
||||
return
|
||||
else if(!user.transferItemToLoc(O, src))
|
||||
return
|
||||
storedpda = O
|
||||
O.add_fingerprint(user)
|
||||
update_icon()
|
||||
|
||||
else if(istype(O, /obj/item/weldingtool) && user.a_intent != INTENT_HARM)
|
||||
var/obj/item/weldingtool/WT = O
|
||||
if(stat & BROKEN)
|
||||
if(WT.remove_fuel(0,user))
|
||||
user.visible_message("[user] is repairing [src].", \
|
||||
"<span class='notice'>You begin repairing [src]...</span>", \
|
||||
"<span class='italics'>You hear welding.</span>")
|
||||
playsound(loc, WT.usesound, 40, 1)
|
||||
if(do_after(user,40*WT.toolspeed, 1, target = src))
|
||||
if(!WT.isOn() || !(stat & BROKEN))
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You repair [src].</span>")
|
||||
playsound(loc, 'sound/items/welder2.ogg', 50, 1)
|
||||
stat &= ~BROKEN
|
||||
obj_integrity = max_integrity
|
||||
update_icon()
|
||||
else
|
||||
to_chat(user, "<span class='notice'>[src] does not need repairs.</span>")
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/machinery/pdapainter/deconstruct(disassembled = TRUE)
|
||||
if(!(flags_1 & NODECONSTRUCT_1))
|
||||
if(!(stat & BROKEN))
|
||||
stat |= BROKEN
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/pdapainter/attack_hand(mob/user)
|
||||
if(!..())
|
||||
add_fingerprint(user)
|
||||
|
||||
if(storedpda)
|
||||
var/obj/item/device/pda/P
|
||||
P = input(user, "Select your color!", "PDA Painting") as null|anything in colorlist
|
||||
if(!P)
|
||||
return
|
||||
if(!in_range(src, user))
|
||||
return
|
||||
if(!storedpda)//is the pda still there?
|
||||
return
|
||||
storedpda.icon_state = P.icon_state
|
||||
storedpda.desc = P.desc
|
||||
ejectpda()
|
||||
|
||||
else
|
||||
to_chat(user, "<span class='notice'>\The [src] is empty.</span>")
|
||||
|
||||
|
||||
/obj/machinery/pdapainter/verb/ejectpda()
|
||||
set name = "Eject PDA"
|
||||
set category = "Object"
|
||||
set src in oview(1)
|
||||
|
||||
if(usr.stat || usr.restrained() || !usr.canmove)
|
||||
return
|
||||
|
||||
if(storedpda)
|
||||
storedpda.loc = get_turf(src.loc)
|
||||
storedpda = null
|
||||
update_icon()
|
||||
else
|
||||
to_chat(usr, "<span class='notice'>The [src] is empty.</span>")
|
||||
|
||||
|
||||
/obj/machinery/pdapainter/power_change()
|
||||
..()
|
||||
update_icon()
|
||||
if(!(stat & BROKEN))
|
||||
stat |= BROKEN
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/pdapainter/attack_hand(mob/user)
|
||||
if(!..())
|
||||
add_fingerprint(user)
|
||||
|
||||
if(storedpda)
|
||||
var/obj/item/device/pda/P
|
||||
P = input(user, "Select your color!", "PDA Painting") as null|anything in colorlist
|
||||
if(!P)
|
||||
return
|
||||
if(!in_range(src, user))
|
||||
return
|
||||
if(!storedpda)//is the pda still there?
|
||||
return
|
||||
storedpda.icon_state = P.icon_state
|
||||
storedpda.desc = P.desc
|
||||
ejectpda()
|
||||
|
||||
else
|
||||
to_chat(user, "<span class='notice'>\The [src] is empty.</span>")
|
||||
|
||||
|
||||
/obj/machinery/pdapainter/verb/ejectpda()
|
||||
set name = "Eject PDA"
|
||||
set category = "Object"
|
||||
set src in oview(1)
|
||||
|
||||
if(usr.stat || usr.restrained() || !usr.canmove)
|
||||
return
|
||||
|
||||
if(storedpda)
|
||||
storedpda.loc = get_turf(src.loc)
|
||||
storedpda = null
|
||||
update_icon()
|
||||
else
|
||||
to_chat(usr, "<span class='notice'>The [src] is empty.</span>")
|
||||
|
||||
|
||||
/obj/machinery/pdapainter/power_change()
|
||||
..()
|
||||
update_icon()
|
||||
|
||||
@@ -149,10 +149,10 @@
|
||||
|
||||
else if(istype(W, /obj/item/device/analyzer))
|
||||
if(!isXRay())
|
||||
if(!user.drop_item(W))
|
||||
if(!user.temporarilyRemoveItemFromInventory(W))
|
||||
return
|
||||
upgradeXRay()
|
||||
qdel(W)
|
||||
upgradeXRay()
|
||||
to_chat(user, "[msg]")
|
||||
else
|
||||
to_chat(user, "[msg2]")
|
||||
|
||||
@@ -109,11 +109,10 @@
|
||||
|
||||
// Upgrades!
|
||||
if(is_type_in_typecache(W, possible_upgrades) && !is_type_in_list(W, upgrades)) // Is a possible upgrade and isn't in the camera already.
|
||||
if(!user.drop_item(W))
|
||||
if(!user.transferItemToLoc(W, src))
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You attach \the [W] into the assembly inner circuits.</span>")
|
||||
upgrades += W
|
||||
W.forceMove(src)
|
||||
return
|
||||
|
||||
// Taking out upgrades
|
||||
|
||||
@@ -92,18 +92,13 @@
|
||||
beacon = findbeacon()
|
||||
if("handle_id")
|
||||
if(id)
|
||||
if(!usr.get_active_held_item())
|
||||
usr.put_in_hands(id)
|
||||
id = null
|
||||
else
|
||||
id.forceMove(get_turf(src))
|
||||
id = null
|
||||
usr.put_in_hands(id)
|
||||
id = null
|
||||
else
|
||||
var/obj/item/I = usr.get_active_held_item()
|
||||
if(istype(I, /obj/item/card/id/prisoner))
|
||||
if(!usr.drop_item())
|
||||
var/obj/item/I = usr.is_holding_item_of_type(/obj/item/card/id/prisoner)
|
||||
if(I)
|
||||
if(!usr.transferItemToLoc(I, src))
|
||||
return
|
||||
I.forceMove(src)
|
||||
id = I
|
||||
if("set_goal")
|
||||
var/new_goal = input("Set the amount of points:", "Points", id.goal) as num|null
|
||||
|
||||
@@ -27,9 +27,8 @@
|
||||
|
||||
/obj/machinery/computer/med_data/attackby(obj/item/O, mob/user, params)
|
||||
if(istype(O, /obj/item/card/id) && !scan)
|
||||
if(!user.drop_item())
|
||||
if(!user.transferItemToLoc(O, src))
|
||||
return
|
||||
O.loc = src
|
||||
scan = O
|
||||
to_chat(user, "<span class='notice'>You insert [O].</span>")
|
||||
else
|
||||
@@ -215,17 +214,13 @@
|
||||
src.temp = null
|
||||
if(href_list["scan"])
|
||||
if(src.scan)
|
||||
if(ishuman(usr) && !usr.get_active_held_item())
|
||||
usr.put_in_hands(scan)
|
||||
else
|
||||
scan.loc = get_turf(src)
|
||||
src.scan = null
|
||||
usr.put_in_hands(scan)
|
||||
scan = null
|
||||
else
|
||||
var/obj/item/I = usr.get_active_held_item()
|
||||
if(istype(I, /obj/item/card/id))
|
||||
if(!usr.drop_item())
|
||||
var/obj/item/I = usr.is_holding_item_of_type(/obj/item/card/id)
|
||||
if(I)
|
||||
if(!usr.transferItemToLoc(I, src))
|
||||
return
|
||||
I.loc = src
|
||||
src.scan = I
|
||||
else if(href_list["logout"])
|
||||
src.authenticated = null
|
||||
|
||||
@@ -90,11 +90,10 @@
|
||||
|
||||
if(href_list["id"])
|
||||
if(href_list["id"] =="insert" && !inserted_id)
|
||||
var/obj/item/card/id/prisoner/I = usr.get_active_held_item()
|
||||
if(istype(I))
|
||||
if(!usr.drop_item())
|
||||
var/obj/item/card/id/prisoner/I = usr.is_holding_item_of_type(/obj/item/card/id/prisoner)
|
||||
if(I)
|
||||
if(!usr.transferItemToLoc(I, src))
|
||||
return
|
||||
I.loc = src
|
||||
inserted_id = I
|
||||
else to_chat(usr, "<span class='danger'>No valid ID.</span>")
|
||||
else if(inserted_id)
|
||||
|
||||
@@ -37,9 +37,8 @@
|
||||
/obj/machinery/computer/secure_data/attackby(obj/item/O, mob/user, params)
|
||||
if(istype(O, /obj/item/card/id))
|
||||
if(!scan)
|
||||
if(!user.drop_item())
|
||||
if(!user.transferItemToLoc(O, src))
|
||||
return
|
||||
O.loc = src
|
||||
scan = O
|
||||
to_chat(user, "<span class='notice'>You insert [O].</span>")
|
||||
else
|
||||
@@ -303,17 +302,13 @@ What a mess.*/
|
||||
|
||||
if("Confirm Identity")
|
||||
if(scan)
|
||||
if(ishuman(usr) && !usr.get_active_held_item())
|
||||
usr.put_in_hands(scan)
|
||||
else
|
||||
scan.loc = get_turf(src)
|
||||
usr.put_in_hands(scan)
|
||||
scan = null
|
||||
else
|
||||
var/obj/item/I = usr.get_active_held_item()
|
||||
if(istype(I, /obj/item/card/id))
|
||||
if(!usr.drop_item())
|
||||
var/obj/item/I = usr.is_holding_item_of_type(/obj/item/card/id)
|
||||
if(I)
|
||||
if(!usr.transferItemToLoc(I, src))
|
||||
return
|
||||
I.loc = src
|
||||
scan = I
|
||||
|
||||
if("Log Out")
|
||||
|
||||
@@ -29,21 +29,19 @@ GLOBAL_LIST_INIT(possible_uplinker_IDs, list("Alfa","Bravo","Charlie","Delta","E
|
||||
ID = rand(1,999)
|
||||
name = "[name] [ID]"
|
||||
|
||||
/obj/machinery/computer/telecrystals/uplinker/attackby(obj/item/O, mob/user, params)
|
||||
/obj/machinery/computer/telecrystals/uplinker/attackby(obj/item/I, mob/user, params)
|
||||
if(uplinkholder)
|
||||
to_chat(user, "<span class='notice'>The [src] already has an uplink in it.</span>")
|
||||
return
|
||||
if(O.hidden_uplink)
|
||||
var/obj/item/I = user.get_active_held_item()
|
||||
if(!user.drop_item())
|
||||
if(I.hidden_uplink)
|
||||
if(!user.transferItemToLoc(I, src))
|
||||
return
|
||||
uplinkholder = I
|
||||
I.loc = src
|
||||
I.add_fingerprint(user)
|
||||
update_icon()
|
||||
updateUsrDialog()
|
||||
else
|
||||
to_chat(user, "<span class='notice'>The [O] doesn't appear to be an uplink...</span>")
|
||||
to_chat(user, "<span class='notice'>[I] doesn't appear to be an uplink...</span>")
|
||||
|
||||
/obj/machinery/computer/telecrystals/uplinker/update_icon()
|
||||
..()
|
||||
|
||||
@@ -1,262 +1,260 @@
|
||||
/obj/structure/frame
|
||||
name = "frame"
|
||||
icon = 'icons/obj/stock_parts.dmi'
|
||||
icon_state = "box_0"
|
||||
/obj/structure/frame
|
||||
name = "frame"
|
||||
icon = 'icons/obj/stock_parts.dmi'
|
||||
icon_state = "box_0"
|
||||
density = TRUE
|
||||
max_integrity = 250
|
||||
var/obj/item/circuitboard/circuit = null
|
||||
var/state = 1
|
||||
|
||||
/obj/structure/frame/examine(user)
|
||||
..()
|
||||
if(circuit)
|
||||
to_chat(user, "It has \a [circuit] installed.")
|
||||
|
||||
|
||||
/obj/structure/frame/deconstruct(disassembled = TRUE)
|
||||
max_integrity = 250
|
||||
var/obj/item/circuitboard/circuit = null
|
||||
var/state = 1
|
||||
|
||||
/obj/structure/frame/examine(user)
|
||||
..()
|
||||
if(circuit)
|
||||
to_chat(user, "It has \a [circuit] installed.")
|
||||
|
||||
|
||||
/obj/structure/frame/deconstruct(disassembled = TRUE)
|
||||
if(!(flags_1 & NODECONSTRUCT_1))
|
||||
new /obj/item/stack/sheet/metal(loc, 5)
|
||||
if(circuit)
|
||||
circuit.forceMove(loc)
|
||||
circuit = null
|
||||
qdel(src)
|
||||
|
||||
|
||||
/obj/structure/frame/machine
|
||||
name = "machine frame"
|
||||
var/list/components = null
|
||||
var/list/req_components = null
|
||||
var/list/req_component_names = null // user-friendly names of components
|
||||
|
||||
/obj/structure/frame/machine/examine(user)
|
||||
..()
|
||||
if(state == 3 && req_components && req_component_names)
|
||||
var/hasContent = 0
|
||||
var/requires = "It requires"
|
||||
|
||||
for(var/i = 1 to req_components.len)
|
||||
var/tname = req_components[i]
|
||||
var/amt = req_components[tname]
|
||||
if(amt == 0)
|
||||
continue
|
||||
var/use_and = i == req_components.len
|
||||
requires += "[(hasContent ? (use_and ? ", and" : ",") : "")] [amt] [amt == 1 ? req_component_names[tname] : "[req_component_names[tname]]\s"]"
|
||||
hasContent = 1
|
||||
|
||||
if(hasContent)
|
||||
to_chat(user, requires + ".")
|
||||
else
|
||||
to_chat(user, "It does not require any more components.")
|
||||
|
||||
/obj/structure/frame/machine/proc/update_namelist()
|
||||
if(!req_components)
|
||||
return
|
||||
|
||||
req_component_names = new()
|
||||
for(var/tname in req_components)
|
||||
if(ispath(tname, /obj/item/stack))
|
||||
var/obj/item/stack/S = tname
|
||||
var/singular_name = initial(S.singular_name)
|
||||
if(singular_name)
|
||||
req_component_names[tname] = singular_name
|
||||
else
|
||||
req_component_names[tname] = initial(S.name)
|
||||
else
|
||||
var/obj/O = tname
|
||||
req_component_names[tname] = initial(O.name)
|
||||
|
||||
/obj/structure/frame/machine/proc/get_req_components_amt()
|
||||
var/amt = 0
|
||||
for(var/path in req_components)
|
||||
amt += req_components[path]
|
||||
return amt
|
||||
|
||||
/obj/structure/frame/machine/attackby(obj/item/P, mob/user, params)
|
||||
switch(state)
|
||||
if(1)
|
||||
if(istype(P, /obj/item/circuitboard/machine))
|
||||
to_chat(user, "<span class='warning'>The frame needs wiring first!</span>")
|
||||
return
|
||||
else if(istype(P, /obj/item/circuitboard))
|
||||
to_chat(user, "<span class='warning'>This frame does not accept circuit boards of this type!</span>")
|
||||
return
|
||||
if(istype(P, /obj/item/stack/cable_coil))
|
||||
var/obj/item/stack/cable_coil/C = P
|
||||
if(C.get_amount() >= 5)
|
||||
playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1)
|
||||
to_chat(user, "<span class='notice'>You start to add cables to the frame...</span>")
|
||||
if(do_after(user, 20*P.toolspeed, target = src))
|
||||
if(C.get_amount() >= 5 && state == 1)
|
||||
C.use(5)
|
||||
to_chat(user, "<span class='notice'>You add cables to the frame.</span>")
|
||||
state = 2
|
||||
icon_state = "box_1"
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You need five length of cable to wire the frame!</span>")
|
||||
return
|
||||
if(istype(P, /obj/item/screwdriver) && !anchored)
|
||||
playsound(src.loc, P.usesound, 50, 1)
|
||||
user.visible_message("<span class='warning'>[user] disassembles the frame.</span>", \
|
||||
"<span class='notice'>You start to disassemble the frame...</span>", "You hear banging and clanking.")
|
||||
if(do_after(user, 40*P.toolspeed, target = src))
|
||||
if(state == 1)
|
||||
to_chat(user, "<span class='notice'>You disassemble the frame.</span>")
|
||||
var/obj/item/stack/sheet/metal/M = new (loc, 5)
|
||||
M.add_fingerprint(user)
|
||||
qdel(src)
|
||||
return
|
||||
if(istype(P, /obj/item/wrench))
|
||||
to_chat(user, "<span class='notice'>You start [anchored ? "un" : ""]securing [name]...</span>")
|
||||
playsound(src.loc, P.usesound, 75, 1)
|
||||
if(do_after(user, 40*P.toolspeed, target = src))
|
||||
if(state == 1)
|
||||
to_chat(user, "<span class='notice'>You [anchored ? "un" : ""]secure [name].</span>")
|
||||
anchored = !anchored
|
||||
return
|
||||
|
||||
if(2)
|
||||
if(istype(P, /obj/item/wrench))
|
||||
to_chat(user, "<span class='notice'>You start [anchored ? "un" : ""]securing [name]...</span>")
|
||||
playsound(src.loc, P.usesound, 75, 1)
|
||||
if(do_after(user, 40*P.toolspeed, target = src))
|
||||
to_chat(user, "<span class='notice'>You [anchored ? "un" : ""]secure [name].</span>")
|
||||
anchored = !anchored
|
||||
return
|
||||
|
||||
if(istype(P, /obj/item/circuitboard/machine))
|
||||
if(!anchored)
|
||||
to_chat(user, "<span class='warning'>The frame needs to be secured first!</span>")
|
||||
return
|
||||
var/obj/item/circuitboard/machine/B = P
|
||||
if(!user.drop_item())
|
||||
return
|
||||
playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1)
|
||||
to_chat(user, "<span class='notice'>You add the circuit board to the frame.</span>")
|
||||
circuit = B
|
||||
B.loc = src
|
||||
icon_state = "box_2"
|
||||
state = 3
|
||||
components = list()
|
||||
req_components = B.req_components.Copy()
|
||||
update_namelist()
|
||||
return
|
||||
|
||||
else if(istype(P, /obj/item/circuitboard))
|
||||
to_chat(user, "<span class='warning'>This frame does not accept circuit boards of this type!</span>")
|
||||
return
|
||||
|
||||
if(istype(P, /obj/item/wirecutters))
|
||||
playsound(src.loc, P.usesound, 50, 1)
|
||||
to_chat(user, "<span class='notice'>You remove the cables.</span>")
|
||||
state = 1
|
||||
icon_state = "box_0"
|
||||
var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( src.loc )
|
||||
A.amount = 5
|
||||
return
|
||||
|
||||
if(3)
|
||||
if(istype(P, /obj/item/crowbar))
|
||||
playsound(src.loc, P.usesound, 50, 1)
|
||||
state = 2
|
||||
circuit.loc = src.loc
|
||||
components.Remove(circuit)
|
||||
circuit = null
|
||||
if(components.len == 0)
|
||||
to_chat(user, "<span class='notice'>You remove the circuit board.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You remove the circuit board and other components.</span>")
|
||||
for(var/atom/movable/A in components)
|
||||
A.loc = src.loc
|
||||
desc = initial(desc)
|
||||
req_components = null
|
||||
components = null
|
||||
icon_state = "box_1"
|
||||
return
|
||||
|
||||
if(istype(P, /obj/item/screwdriver))
|
||||
var/component_check = 1
|
||||
for(var/R in req_components)
|
||||
if(req_components[R] > 0)
|
||||
component_check = 0
|
||||
break
|
||||
if(component_check)
|
||||
playsound(src.loc, P.usesound, 50, 1)
|
||||
var/obj/machinery/new_machine = new src.circuit.build_path(src.loc, 1)
|
||||
new_machine.on_construction()
|
||||
for(var/obj/O in new_machine.component_parts)
|
||||
qdel(O)
|
||||
new_machine.component_parts = list()
|
||||
for(var/obj/O in src)
|
||||
O.loc = null
|
||||
new_machine.component_parts += O
|
||||
circuit.loc = null
|
||||
new_machine.RefreshParts()
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
if(istype(P, /obj/item/storage/part_replacer) && P.contents.len && get_req_components_amt())
|
||||
var/obj/item/storage/part_replacer/replacer = P
|
||||
var/list/added_components = list()
|
||||
var/list/part_list = list()
|
||||
|
||||
//Assemble a list of current parts, then sort them by their rating!
|
||||
for(var/obj/item/stock_parts/co in replacer)
|
||||
part_list += co
|
||||
//Sort the parts. This ensures that higher tier items are applied first.
|
||||
part_list = sortTim(part_list, /proc/cmp_rped_sort)
|
||||
|
||||
for(var/path in req_components)
|
||||
while(req_components[path] > 0 && (locate(path) in part_list))
|
||||
var/obj/item/part = (locate(path) in part_list)
|
||||
added_components[part] = path
|
||||
replacer.remove_from_storage(part, src)
|
||||
req_components[path]--
|
||||
part_list -= part
|
||||
|
||||
for(var/obj/item/stock_parts/part in added_components)
|
||||
components += part
|
||||
to_chat(user, "<span class='notice'>[part.name] applied.</span>")
|
||||
if(added_components.len)
|
||||
replacer.play_rped_sound()
|
||||
return
|
||||
|
||||
if(isitem(P) && get_req_components_amt())
|
||||
for(var/I in req_components)
|
||||
if(istype(P, I) && (req_components[I] > 0))
|
||||
if(istype(P, /obj/item/stack))
|
||||
var/obj/item/stack/S = P
|
||||
var/used_amt = min(round(S.get_amount()), req_components[I])
|
||||
|
||||
if(used_amt && S.use(used_amt))
|
||||
var/obj/item/stack/NS = locate(S.merge_type) in components
|
||||
|
||||
if(!NS)
|
||||
NS = new S.merge_type(src, used_amt)
|
||||
components += NS
|
||||
else
|
||||
NS.add(used_amt)
|
||||
|
||||
req_components[I] -= used_amt
|
||||
to_chat(user, "<span class='notice'>You add [P] to [src].</span>")
|
||||
return
|
||||
if(!user.drop_item())
|
||||
break
|
||||
to_chat(user, "<span class='notice'>You add [P] to [src].</span>")
|
||||
P.forceMove(src)
|
||||
components += P
|
||||
req_components[I]--
|
||||
return 1
|
||||
to_chat(user, "<span class='warning'>You cannot add that to the machine!</span>")
|
||||
return 0
|
||||
if(user.a_intent == INTENT_HARM)
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/structure/frame/machine/deconstruct(disassembled = TRUE)
|
||||
new /obj/item/stack/sheet/metal(loc, 5)
|
||||
if(circuit)
|
||||
circuit.forceMove(loc)
|
||||
circuit = null
|
||||
qdel(src)
|
||||
|
||||
|
||||
/obj/structure/frame/machine
|
||||
name = "machine frame"
|
||||
var/list/components = null
|
||||
var/list/req_components = null
|
||||
var/list/req_component_names = null // user-friendly names of components
|
||||
|
||||
/obj/structure/frame/machine/examine(user)
|
||||
..()
|
||||
if(state == 3 && req_components && req_component_names)
|
||||
var/hasContent = 0
|
||||
var/requires = "It requires"
|
||||
|
||||
for(var/i = 1 to req_components.len)
|
||||
var/tname = req_components[i]
|
||||
var/amt = req_components[tname]
|
||||
if(amt == 0)
|
||||
continue
|
||||
var/use_and = i == req_components.len
|
||||
requires += "[(hasContent ? (use_and ? ", and" : ",") : "")] [amt] [amt == 1 ? req_component_names[tname] : "[req_component_names[tname]]\s"]"
|
||||
hasContent = 1
|
||||
|
||||
if(hasContent)
|
||||
to_chat(user, requires + ".")
|
||||
else
|
||||
to_chat(user, "It does not require any more components.")
|
||||
|
||||
/obj/structure/frame/machine/proc/update_namelist()
|
||||
if(!req_components)
|
||||
return
|
||||
|
||||
req_component_names = new()
|
||||
for(var/tname in req_components)
|
||||
if(ispath(tname, /obj/item/stack))
|
||||
var/obj/item/stack/S = tname
|
||||
var/singular_name = initial(S.singular_name)
|
||||
if(singular_name)
|
||||
req_component_names[tname] = singular_name
|
||||
else
|
||||
req_component_names[tname] = initial(S.name)
|
||||
else
|
||||
var/obj/O = tname
|
||||
req_component_names[tname] = initial(O.name)
|
||||
|
||||
/obj/structure/frame/machine/proc/get_req_components_amt()
|
||||
var/amt = 0
|
||||
for(var/path in req_components)
|
||||
amt += req_components[path]
|
||||
return amt
|
||||
|
||||
/obj/structure/frame/machine/attackby(obj/item/P, mob/user, params)
|
||||
switch(state)
|
||||
if(1)
|
||||
if(istype(P, /obj/item/circuitboard/machine))
|
||||
to_chat(user, "<span class='warning'>The frame needs wiring first!</span>")
|
||||
return
|
||||
else if(istype(P, /obj/item/circuitboard))
|
||||
to_chat(user, "<span class='warning'>This frame does not accept circuit boards of this type!</span>")
|
||||
return
|
||||
if(istype(P, /obj/item/stack/cable_coil))
|
||||
var/obj/item/stack/cable_coil/C = P
|
||||
if(C.get_amount() >= 5)
|
||||
playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1)
|
||||
to_chat(user, "<span class='notice'>You start to add cables to the frame...</span>")
|
||||
if(do_after(user, 20*P.toolspeed, target = src))
|
||||
if(C.get_amount() >= 5 && state == 1)
|
||||
C.use(5)
|
||||
to_chat(user, "<span class='notice'>You add cables to the frame.</span>")
|
||||
state = 2
|
||||
icon_state = "box_1"
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You need five length of cable to wire the frame!</span>")
|
||||
return
|
||||
if(istype(P, /obj/item/screwdriver) && !anchored)
|
||||
playsound(src.loc, P.usesound, 50, 1)
|
||||
user.visible_message("<span class='warning'>[user] disassembles the frame.</span>", \
|
||||
"<span class='notice'>You start to disassemble the frame...</span>", "You hear banging and clanking.")
|
||||
if(do_after(user, 40*P.toolspeed, target = src))
|
||||
if(state == 1)
|
||||
to_chat(user, "<span class='notice'>You disassemble the frame.</span>")
|
||||
var/obj/item/stack/sheet/metal/M = new (loc, 5)
|
||||
M.add_fingerprint(user)
|
||||
qdel(src)
|
||||
return
|
||||
if(istype(P, /obj/item/wrench))
|
||||
to_chat(user, "<span class='notice'>You start [anchored ? "un" : ""]securing [name]...</span>")
|
||||
playsound(src.loc, P.usesound, 75, 1)
|
||||
if(do_after(user, 40*P.toolspeed, target = src))
|
||||
if(state == 1)
|
||||
to_chat(user, "<span class='notice'>You [anchored ? "un" : ""]secure [name].</span>")
|
||||
anchored = !anchored
|
||||
return
|
||||
|
||||
if(2)
|
||||
if(istype(P, /obj/item/wrench))
|
||||
to_chat(user, "<span class='notice'>You start [anchored ? "un" : ""]securing [name]...</span>")
|
||||
playsound(src.loc, P.usesound, 75, 1)
|
||||
if(do_after(user, 40*P.toolspeed, target = src))
|
||||
to_chat(user, "<span class='notice'>You [anchored ? "un" : ""]secure [name].</span>")
|
||||
anchored = !anchored
|
||||
return
|
||||
|
||||
if(istype(P, /obj/item/circuitboard/machine))
|
||||
if(!anchored)
|
||||
to_chat(user, "<span class='warning'>The frame needs to be secured first!</span>")
|
||||
return
|
||||
var/obj/item/circuitboard/machine/B = P
|
||||
if(!user.transferItemToLoc(B, src))
|
||||
return
|
||||
playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1)
|
||||
to_chat(user, "<span class='notice'>You add the circuit board to the frame.</span>")
|
||||
circuit = B
|
||||
icon_state = "box_2"
|
||||
state = 3
|
||||
components = list()
|
||||
req_components = B.req_components.Copy()
|
||||
update_namelist()
|
||||
return
|
||||
|
||||
else if(istype(P, /obj/item/circuitboard))
|
||||
to_chat(user, "<span class='warning'>This frame does not accept circuit boards of this type!</span>")
|
||||
return
|
||||
|
||||
if(istype(P, /obj/item/wirecutters))
|
||||
playsound(src.loc, P.usesound, 50, 1)
|
||||
to_chat(user, "<span class='notice'>You remove the cables.</span>")
|
||||
state = 1
|
||||
icon_state = "box_0"
|
||||
var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( src.loc )
|
||||
A.amount = 5
|
||||
return
|
||||
|
||||
if(3)
|
||||
if(istype(P, /obj/item/crowbar))
|
||||
playsound(src.loc, P.usesound, 50, 1)
|
||||
state = 2
|
||||
circuit.loc = src.loc
|
||||
components.Remove(circuit)
|
||||
circuit = null
|
||||
if(components.len == 0)
|
||||
to_chat(user, "<span class='notice'>You remove the circuit board.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You remove the circuit board and other components.</span>")
|
||||
for(var/atom/movable/A in components)
|
||||
A.loc = src.loc
|
||||
desc = initial(desc)
|
||||
req_components = null
|
||||
components = null
|
||||
icon_state = "box_1"
|
||||
return
|
||||
|
||||
if(istype(P, /obj/item/screwdriver))
|
||||
var/component_check = 1
|
||||
for(var/R in req_components)
|
||||
if(req_components[R] > 0)
|
||||
component_check = 0
|
||||
break
|
||||
if(component_check)
|
||||
playsound(src.loc, P.usesound, 50, 1)
|
||||
var/obj/machinery/new_machine = new src.circuit.build_path(src.loc, 1)
|
||||
new_machine.on_construction()
|
||||
for(var/obj/O in new_machine.component_parts)
|
||||
qdel(O)
|
||||
new_machine.component_parts = list()
|
||||
for(var/obj/O in src)
|
||||
O.loc = null
|
||||
new_machine.component_parts += O
|
||||
circuit.loc = null
|
||||
new_machine.RefreshParts()
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
if(istype(P, /obj/item/storage/part_replacer) && P.contents.len && get_req_components_amt())
|
||||
var/obj/item/storage/part_replacer/replacer = P
|
||||
var/list/added_components = list()
|
||||
var/list/part_list = list()
|
||||
|
||||
//Assemble a list of current parts, then sort them by their rating!
|
||||
for(var/obj/item/stock_parts/co in replacer)
|
||||
part_list += co
|
||||
//Sort the parts. This ensures that higher tier items are applied first.
|
||||
part_list = sortTim(part_list, /proc/cmp_rped_sort)
|
||||
|
||||
for(var/path in req_components)
|
||||
while(req_components[path] > 0 && (locate(path) in part_list))
|
||||
var/obj/item/part = (locate(path) in part_list)
|
||||
added_components[part] = path
|
||||
replacer.remove_from_storage(part, src)
|
||||
req_components[path]--
|
||||
part_list -= part
|
||||
|
||||
for(var/obj/item/stock_parts/part in added_components)
|
||||
components += part
|
||||
to_chat(user, "<span class='notice'>[part.name] applied.</span>")
|
||||
if(added_components.len)
|
||||
replacer.play_rped_sound()
|
||||
return
|
||||
|
||||
if(isitem(P) && get_req_components_amt())
|
||||
for(var/I in req_components)
|
||||
if(istype(P, I) && (req_components[I] > 0))
|
||||
if(istype(P, /obj/item/stack))
|
||||
var/obj/item/stack/S = P
|
||||
var/used_amt = min(round(S.get_amount()), req_components[I])
|
||||
|
||||
if(used_amt && S.use(used_amt))
|
||||
var/obj/item/stack/NS = locate(S.merge_type) in components
|
||||
|
||||
if(!NS)
|
||||
NS = new S.merge_type(src, used_amt)
|
||||
components += NS
|
||||
else
|
||||
NS.add(used_amt)
|
||||
|
||||
req_components[I] -= used_amt
|
||||
to_chat(user, "<span class='notice'>You add [P] to [src].</span>")
|
||||
return
|
||||
if(!user.transferItemToLoc(P, src))
|
||||
break
|
||||
to_chat(user, "<span class='notice'>You add [P] to [src].</span>")
|
||||
components += P
|
||||
req_components[I]--
|
||||
return 1
|
||||
to_chat(user, "<span class='warning'>You cannot add that to the machine!</span>")
|
||||
return 0
|
||||
if(user.a_intent == INTENT_HARM)
|
||||
return ..()
|
||||
|
||||
|
||||
/obj/structure/frame/machine/deconstruct(disassembled = TRUE)
|
||||
if(!(flags_1 & NODECONSTRUCT_1))
|
||||
if(state >= 2)
|
||||
new /obj/item/stack/cable_coil(loc , 5)
|
||||
for(var/X in components)
|
||||
var/obj/item/I = X
|
||||
I.forceMove(loc)
|
||||
..()
|
||||
if(state >= 2)
|
||||
new /obj/item/stack/cable_coil(loc , 5)
|
||||
for(var/X in components)
|
||||
var/obj/item/I = X
|
||||
I.forceMove(loc)
|
||||
..()
|
||||
|
||||
@@ -127,7 +127,6 @@
|
||||
here.ChangeTurf(T.type)
|
||||
return INITIALIZE_HINT_QDEL
|
||||
here.ChangeTurf(/turf/closed/wall)
|
||||
return INITIALIZE_HINT_QDEL
|
||||
if(9 to 11)
|
||||
lights = FALSE
|
||||
locked = TRUE
|
||||
@@ -1170,10 +1169,9 @@
|
||||
to_chat(user, "<span class='warning'>The maintenance panel is destroyed!</span>")
|
||||
return
|
||||
to_chat(user, "<span class='warning'>You apply [C]. Next time someone opens the door, it will explode.</span>")
|
||||
user.drop_item()
|
||||
panel_open = FALSE
|
||||
update_icon()
|
||||
C.forceMove(src)
|
||||
user.transferItemToLoc(C, src, TRUE)
|
||||
charge = C
|
||||
else if(istype(C, /obj/item/paper) || istype(C, /obj/item/photo))
|
||||
if(note)
|
||||
|
||||
@@ -426,7 +426,6 @@
|
||||
return
|
||||
if(constructionStep != CONSTRUCTION_NOCIRCUIT)
|
||||
return
|
||||
user.drop_item()
|
||||
qdel(C)
|
||||
user.visible_message("<span class='notice'>[user] adds a circuit to [src].</span>", \
|
||||
"<span class='notice'>You insert and secure [C].</span>")
|
||||
|
||||
@@ -63,10 +63,9 @@
|
||||
|
||||
else if (istype(W, /obj/item/device/assembly/flash/handheld))
|
||||
if (!bulb)
|
||||
if(!user.drop_item())
|
||||
if(!user.transferItemToLoc(W, src))
|
||||
return
|
||||
user.visible_message("[user] installs [W] into [src].", "<span class='notice'>You install [W] into [src].</span>")
|
||||
W.forceMove(src)
|
||||
bulb = W
|
||||
power_change()
|
||||
else
|
||||
|
||||
@@ -33,9 +33,8 @@
|
||||
/obj/machinery/gulag_item_reclaimer/attackby(obj/item/I, mob/user)
|
||||
if(istype(I, /obj/item/card/id/prisoner))
|
||||
if(!inserted_id)
|
||||
if(!user.drop_item())
|
||||
if(!user.transferItemToLoc(I, src))
|
||||
return
|
||||
I.forceMove(src)
|
||||
inserted_id = I
|
||||
to_chat(user, "<span class='notice'>You insert [I].</span>")
|
||||
return
|
||||
@@ -82,18 +81,13 @@
|
||||
switch(action)
|
||||
if("handle_id")
|
||||
if(inserted_id)
|
||||
if(!usr.get_active_held_item())
|
||||
usr.put_in_hands(inserted_id)
|
||||
inserted_id = null
|
||||
else
|
||||
inserted_id.forceMove(get_turf(src))
|
||||
inserted_id = null
|
||||
usr.put_in_hands(inserted_id)
|
||||
inserted_id = null
|
||||
else
|
||||
var/obj/item/I = usr.get_active_held_item()
|
||||
if(istype(I, /obj/item/card/id/prisoner))
|
||||
if(!usr.drop_item())
|
||||
var/obj/item/I = usr.is_holding_item_of_type(/obj/item/card/id/prisoner)
|
||||
if(I)
|
||||
if(!usr.transferItemToLoc(I, src))
|
||||
return
|
||||
I.forceMove(src)
|
||||
inserted_id = I
|
||||
if("release_items")
|
||||
var/mob/M = locate(params["mobref"])
|
||||
|
||||
@@ -95,10 +95,8 @@
|
||||
if(beaker)
|
||||
to_chat(user, "<span class='warning'>There is already a reagent container loaded!</span>")
|
||||
return
|
||||
if(!user.drop_item())
|
||||
if(!user.transferItemToLoc(W, src))
|
||||
return
|
||||
|
||||
W.forceMove(src)
|
||||
beaker = W
|
||||
to_chat(user, "<span class='notice'>You attach [W] to [src].</span>")
|
||||
update_icon()
|
||||
|
||||
@@ -786,11 +786,9 @@ GLOBAL_LIST_EMPTY(allCasters)
|
||||
else
|
||||
qdel(photo)
|
||||
photo = null
|
||||
if(istype(user.get_active_held_item(), /obj/item/photo))
|
||||
photo = user.get_active_held_item()
|
||||
if(!user.drop_item())
|
||||
return
|
||||
photo.loc = src
|
||||
photo = user.is_holding_item_of_type(/obj/item/photo)
|
||||
if(photo && !user.transferItemToLoc(photo, src))
|
||||
photo = null
|
||||
if(issilicon(user))
|
||||
var/list/nametemp = list()
|
||||
var/find
|
||||
|
||||
@@ -71,8 +71,6 @@
|
||||
add_fingerprint(user)
|
||||
if (istype(W, /obj/item/pipe) || istype(W, /obj/item/pipe_meter))
|
||||
to_chat(usr, "<span class='notice'>You put [W] back into [src].</span>")
|
||||
if(!user.drop_item())
|
||||
return
|
||||
qdel(W)
|
||||
return
|
||||
else if (istype(W, /obj/item/wrench))
|
||||
|
||||
@@ -84,9 +84,8 @@
|
||||
if(PTURRET_INTERNAL_ARMOUR_ON)
|
||||
if(istype(I, /obj/item/gun/energy)) //the gun installation part
|
||||
var/obj/item/gun/energy/E = I
|
||||
if(!user.drop_item())
|
||||
if(!user.transferItemToLoc(E, src))
|
||||
return
|
||||
E.forceMove(src)
|
||||
installed_gun = E
|
||||
to_chat(user, "<span class='notice'>You add [I] to the turret.</span>")
|
||||
build_step = PTURRET_GUN_EQUIPPED
|
||||
@@ -101,7 +100,7 @@
|
||||
if(PTURRET_GUN_EQUIPPED)
|
||||
if(isprox(I))
|
||||
build_step = PTURRET_SENSORS_ON
|
||||
if(!user.drop_item())
|
||||
if(!user.temporarilyRemoveItemFromInventory(I))
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You add the proximity sensor to the turret.</span>")
|
||||
qdel(I)
|
||||
|
||||
@@ -50,9 +50,8 @@
|
||||
to_chat(user, "<span class='notice'>Your gun has no external power connector.</span>")
|
||||
return 1
|
||||
|
||||
if(!user.drop_item())
|
||||
if(!user.transferItemToLoc(G, src))
|
||||
return 1
|
||||
G.loc = src
|
||||
charging = G
|
||||
use_power = ACTIVE_POWER_USE
|
||||
update_icon(scan = TRUE)
|
||||
|
||||
@@ -83,16 +83,15 @@
|
||||
if(istype(I, /obj/item/coin))
|
||||
var/obj/item/coin/C = I
|
||||
if(prob(2))
|
||||
if(!user.drop_item())
|
||||
if(!user.transferItemToLoc(C, drop_location()))
|
||||
return
|
||||
C.loc = loc
|
||||
C.throw_at(user, 3, 10)
|
||||
if(prob(10))
|
||||
balance = max(balance - SPIN_PRICE, 0)
|
||||
to_chat(user, "<span class='warning'>[src] spits your coin back out!</span>")
|
||||
|
||||
else
|
||||
if(!user.drop_item())
|
||||
if(!user.temporarilyRemoveItemFromInventory(C))
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You insert a [C.cmineral] coin into [src]'s slot!</span>")
|
||||
balance += C.value
|
||||
|
||||
@@ -140,18 +140,13 @@
|
||||
if(cell)
|
||||
to_chat(user, "<span class='warning'>There is already a power cell inside!</span>")
|
||||
return
|
||||
else
|
||||
// insert cell
|
||||
var/obj/item/stock_parts/cell/C = usr.get_active_held_item()
|
||||
if(istype(C))
|
||||
if(!user.drop_item())
|
||||
return
|
||||
cell = C
|
||||
C.loc = src
|
||||
C.add_fingerprint(usr)
|
||||
else if(!user.transferItemToLoc(I, src))
|
||||
return
|
||||
cell = I
|
||||
I.add_fingerprint(usr)
|
||||
|
||||
user.visible_message("\The [user] inserts a power cell into \the [src].", "<span class='notice'>You insert the power cell into \the [src].</span>")
|
||||
SStgui.update_uis(src)
|
||||
user.visible_message("\The [user] inserts a power cell into \the [src].", "<span class='notice'>You insert the power cell into \the [src].</span>")
|
||||
SStgui.update_uis(src)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>The hatch must be open to insert a power cell!</span>")
|
||||
return
|
||||
|
||||
@@ -298,32 +298,31 @@
|
||||
if(suit)
|
||||
to_chat(user, "<span class='warning'>The unit already contains a suit!.</span>")
|
||||
return
|
||||
if(!user.drop_item())
|
||||
if(!user.transferItemToLoc(I, src))
|
||||
return
|
||||
suit = I
|
||||
else if(istype(I, /obj/item/clothing/head/helmet))
|
||||
if(helmet)
|
||||
to_chat(user, "<span class='warning'>The unit already contains a helmet!</span>")
|
||||
return
|
||||
if(!user.drop_item())
|
||||
if(!user.transferItemToLoc(I, src))
|
||||
return
|
||||
helmet = I
|
||||
else if(istype(I, /obj/item/clothing/mask))
|
||||
if(mask)
|
||||
to_chat(user, "<span class='warning'>The unit already contains a mask!</span>")
|
||||
return
|
||||
if(!user.drop_item())
|
||||
if(!user.transferItemToLoc(I, src))
|
||||
return
|
||||
mask = I
|
||||
else
|
||||
if(storage)
|
||||
to_chat(user, "<span class='warning'>The auxiliary storage compartment is full!</span>")
|
||||
return
|
||||
if(!user.drop_item())
|
||||
if(!user.transferItemToLoc(I, src))
|
||||
return
|
||||
storage = I
|
||||
|
||||
I.loc = src
|
||||
visible_message("<span class='notice'>[user] inserts [I] into [src]</span>", "<span class='notice'>You load [I] into [src].</span>")
|
||||
update_icon()
|
||||
return
|
||||
|
||||
@@ -150,11 +150,10 @@
|
||||
to_chat(user, "<span class='warning'>The cover is screwed on, it won't pry off!</span>")
|
||||
else if(istype(I, /obj/item/bombcore))
|
||||
if(!payload)
|
||||
if(!user.drop_item())
|
||||
if(!user.transferItemToLoc(I, src))
|
||||
return
|
||||
payload = I
|
||||
to_chat(user, "<span class='notice'>You place [payload] into [src].</span>")
|
||||
payload.loc = src
|
||||
else
|
||||
to_chat(user, "<span class='warning'>[payload] is already loaded into [src]! You'll have to remove it first.</span>")
|
||||
else if(istype(I, /obj/item/weldingtool))
|
||||
@@ -463,11 +462,10 @@
|
||||
return
|
||||
else if(istype(I, /obj/item/reagent_containers/glass/beaker) || istype(I, /obj/item/reagent_containers/glass/bottle))
|
||||
if(beakers.len < max_beakers)
|
||||
if(!user.drop_item())
|
||||
if(!user.transferItemToLoc(I, src))
|
||||
return
|
||||
beakers += I
|
||||
to_chat(user, "<span class='notice'>You load [src] with [I].</span>")
|
||||
I.loc = src
|
||||
else
|
||||
to_chat(user, "<span class='warning'>The [I] wont fit! The [src] can only hold up to [max_beakers] containers.</span>")
|
||||
return
|
||||
|
||||
@@ -189,9 +189,8 @@
|
||||
var/obj/item/reagent_containers/food/snacks/S = W
|
||||
if(!S.junkiness)
|
||||
if(!iscompartmentfull(user))
|
||||
if(!user.drop_item())
|
||||
if(!user.transferItemToLoc(W, src))
|
||||
return
|
||||
W.loc = src
|
||||
food_load(W)
|
||||
to_chat(user, "<span class='notice'>You insert [W] into [src]'s chef compartment.</span>")
|
||||
else
|
||||
@@ -279,9 +278,8 @@
|
||||
if(!premium.len)
|
||||
to_chat(user, "<span class='warning'>[src] doesn't have a coin slot.</span>")
|
||||
return
|
||||
if(!user.drop_item())
|
||||
if(!user.transferItemToLoc(W, src))
|
||||
return
|
||||
W.loc = src
|
||||
coin = W
|
||||
to_chat(user, "<span class='notice'>You insert [W] into [src].</span>")
|
||||
return
|
||||
|
||||
@@ -426,7 +426,7 @@
|
||||
if(!istype(T))
|
||||
return
|
||||
var/datum/gas_mixture/GM = new
|
||||
GM.assert_gas("plasma")
|
||||
ASSERT_GAS("plasma", GM)
|
||||
if(prob(10))
|
||||
GM.gases["plasma"][MOLES] += 100
|
||||
GM.temperature = 1500+T0C //should be enough to start a fire
|
||||
|
||||
@@ -161,7 +161,7 @@
|
||||
var/obj/item/mecha_parts/mecha_equipment/E = W
|
||||
spawn()
|
||||
if(E.can_attach(src))
|
||||
if(!user.drop_item())
|
||||
if(!user.temporarilyRemoveItemFromInventory(W))
|
||||
return
|
||||
E.attach(src)
|
||||
user.visible_message("[user] attaches [W] to [src].", "<span class='notice'>You attach [W] to [src].</span>")
|
||||
@@ -226,11 +226,10 @@
|
||||
else if(istype(W, /obj/item/stock_parts/cell))
|
||||
if(state==4)
|
||||
if(!cell)
|
||||
if(!user.drop_item())
|
||||
if(!user.transferItemToLoc(W, src))
|
||||
return
|
||||
var/obj/item/stock_parts/cell/C = W
|
||||
to_chat(user, "<span class='notice'>You install the powercell.</span>")
|
||||
C.forceMove(src)
|
||||
cell = C
|
||||
log_message("Powercell installed")
|
||||
else
|
||||
|
||||
@@ -128,7 +128,7 @@
|
||||
|
||||
/obj/effect/particle_effect/smoke/bad/smoke_mob(mob/living/carbon/M)
|
||||
if(..())
|
||||
M.drop_item()
|
||||
M.drop_all_held_items()
|
||||
M.adjustOxyLoss(1)
|
||||
M.emote("cough")
|
||||
return 1
|
||||
@@ -169,7 +169,7 @@
|
||||
qdel(H)
|
||||
var/list/G_gases = G.gases
|
||||
if(G_gases["plasma"])
|
||||
G.assert_gas("n2")
|
||||
ASSERT_GAS("n2", G)
|
||||
G_gases["n2"][MOLES] += (G_gases["plasma"][MOLES])
|
||||
G_gases["plasma"][MOLES] = 0
|
||||
G.garbage_collect()
|
||||
@@ -205,7 +205,6 @@
|
||||
|
||||
/obj/effect/particle_effect/smoke/sleeping/smoke_mob(mob/living/carbon/M)
|
||||
if(..())
|
||||
M.drop_item()
|
||||
M.Sleeping(200)
|
||||
M.emote("cough")
|
||||
return 1
|
||||
|
||||
@@ -531,7 +531,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
|
||||
to_chat(M, "<span class='danger'>You become nearsighted!</span>")
|
||||
if(prob(50))
|
||||
if(M.stat != DEAD)
|
||||
if(M.drop_item())
|
||||
if(M.drop_all_held_items())
|
||||
to_chat(M, "<span class='danger'>You drop what you're holding and clutch at your eyes!</span>")
|
||||
M.adjust_blurriness(10)
|
||||
M.Unconscious(20)
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
origin_tech = "materials=1;engineering=1"
|
||||
|
||||
/obj/item/device/transfer_valve/IsAssemblyHolder()
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/obj/item/device/transfer_valve/attackby(obj/item/item, mob/user, params)
|
||||
if(istype(item, /obj/item/tank))
|
||||
@@ -76,47 +76,46 @@
|
||||
|
||||
/obj/item/device/transfer_valve/Topic(href, href_list)
|
||||
..()
|
||||
if ( usr.stat || usr.restrained() )
|
||||
if(!usr.canUseTopic(src))
|
||||
return
|
||||
if (src.loc == usr)
|
||||
if(tank_one && href_list["tankone"])
|
||||
split_gases()
|
||||
valve_open = FALSE
|
||||
tank_one.loc = get_turf(src)
|
||||
tank_one = null
|
||||
if(tank_one && href_list["tankone"])
|
||||
split_gases()
|
||||
valve_open = FALSE
|
||||
tank_one.forceMove(drop_location())
|
||||
tank_one = null
|
||||
update_icon()
|
||||
if((!tank_two || tank_two.w_class < WEIGHT_CLASS_BULKY) && (w_class > WEIGHT_CLASS_NORMAL))
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
else if(tank_two && href_list["tanktwo"])
|
||||
split_gases()
|
||||
valve_open = FALSE
|
||||
tank_two.forceMove(drop_location())
|
||||
tank_two = null
|
||||
update_icon()
|
||||
if((!tank_one || tank_one.w_class < WEIGHT_CLASS_BULKY) && (w_class > WEIGHT_CLASS_NORMAL))
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
else if(href_list["open"])
|
||||
toggle_valve()
|
||||
else if(attached_device)
|
||||
if(href_list["rem_device"])
|
||||
attached_device.forceMove(drop_location())
|
||||
attached_device.holder = null
|
||||
attached_device = null
|
||||
update_icon()
|
||||
if((!tank_two || tank_two.w_class < WEIGHT_CLASS_BULKY) && (w_class > WEIGHT_CLASS_NORMAL))
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
else if(tank_two && href_list["tanktwo"])
|
||||
split_gases()
|
||||
valve_open = FALSE
|
||||
tank_two.loc = get_turf(src)
|
||||
tank_two = null
|
||||
update_icon()
|
||||
if((!tank_one || tank_one.w_class < WEIGHT_CLASS_BULKY) && (w_class > WEIGHT_CLASS_NORMAL))
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
else if(href_list["open"])
|
||||
toggle_valve()
|
||||
else if(attached_device)
|
||||
if(href_list["rem_device"])
|
||||
attached_device.forceMove(get_turf(src))
|
||||
attached_device.holder = null
|
||||
attached_device = null
|
||||
update_icon()
|
||||
if(href_list["device"])
|
||||
attached_device.attack_self(usr)
|
||||
if(href_list["device"])
|
||||
attached_device.attack_self(usr)
|
||||
|
||||
src.attack_self(usr)
|
||||
src.add_fingerprint(usr)
|
||||
return
|
||||
return
|
||||
attack_self(usr)
|
||||
add_fingerprint(usr)
|
||||
|
||||
/obj/item/device/transfer_valve/proc/process_activation(obj/item/device/D)
|
||||
if(toggle)
|
||||
toggle = 0
|
||||
toggle = FALSE
|
||||
toggle_valve()
|
||||
spawn(50) // To stop a signal being spammed from a proxy sensor constantly going off or whatever
|
||||
toggle = 1
|
||||
addtimer(CALLBACK(src, .proc/toggle_off), 5) //To stop a signal being spammed from a proxy sensor constantly going off or whatever
|
||||
|
||||
/obj/item/device/transfer_valve/proc/toggle_off()
|
||||
toggle = TRUE
|
||||
|
||||
/obj/item/device/transfer_valve/update_icon()
|
||||
cut_overlays()
|
||||
@@ -196,16 +195,13 @@
|
||||
message_admins(bomb_message, 0, 1)
|
||||
log_game("[log_str1] [A.name][COORD(bombturf)] [log_str2] [log_str3]")
|
||||
merge_gases()
|
||||
spawn(20) // In case one tank bursts
|
||||
for (var/i=0,i<5,i++)
|
||||
src.update_icon()
|
||||
sleep(10)
|
||||
src.update_icon()
|
||||
for(var/i in 1 to 6)
|
||||
addtimer(CALLBACK(src, .proc/update_icon), 20 + (i - 1) * 10)
|
||||
|
||||
else if(valve_open && tank_one && tank_two)
|
||||
split_gases()
|
||||
valve_open = FALSE
|
||||
src.update_icon()
|
||||
update_icon()
|
||||
|
||||
// this doesn't do anything but the timer etc. expects it to be here
|
||||
// eventually maybe have it update icon to show state (timer, prox etc.) like old bombs
|
||||
|
||||
@@ -1,372 +1,373 @@
|
||||
/obj/item/restraints
|
||||
breakouttime = 600
|
||||
|
||||
//Handcuffs
|
||||
|
||||
/obj/item/restraints/handcuffs
|
||||
name = "handcuffs"
|
||||
desc = "Use this to keep prisoners in line."
|
||||
gender = PLURAL
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
icon_state = "handcuff"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
|
||||
flags_1 = CONDUCT_1
|
||||
slot_flags = SLOT_BELT
|
||||
throwforce = 0
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
throw_speed = 3
|
||||
throw_range = 5
|
||||
materials = list(MAT_METAL=500)
|
||||
origin_tech = "engineering=3;combat=3"
|
||||
breakouttime = 600 //Deciseconds = 60s = 1 minute
|
||||
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 50)
|
||||
var/cuffsound = 'sound/weapons/handcuffs.ogg'
|
||||
var/trashtype = null //for disposable cuffs
|
||||
|
||||
/obj/item/restraints/handcuffs/attack(mob/living/carbon/C, mob/living/carbon/human/user)
|
||||
if(!istype(C))
|
||||
return
|
||||
if(user.disabilities & CLUMSY && prob(50))
|
||||
to_chat(user, "<span class='warning'>Uh... how do those things work?!</span>")
|
||||
apply_cuffs(user,user)
|
||||
return
|
||||
|
||||
// chance of monkey retaliation
|
||||
if(ismonkey(C) && prob(MONKEY_CUFF_RETALIATION_PROB))
|
||||
var/mob/living/carbon/monkey/M
|
||||
M = C
|
||||
M.retaliate(user)
|
||||
|
||||
if(!C.handcuffed)
|
||||
if(C.get_num_arms() >= 2 || C.get_arm_ignore())
|
||||
C.visible_message("<span class='danger'>[user] is trying to put [src.name] on [C]!</span>", \
|
||||
"<span class='userdanger'>[user] is trying to put [src.name] on [C]!</span>")
|
||||
|
||||
playsound(loc, cuffsound, 30, 1, -2)
|
||||
if(do_mob(user, C, 30) && (C.get_num_arms() >= 2 || C.get_arm_ignore()))
|
||||
apply_cuffs(C,user)
|
||||
to_chat(user, "<span class='notice'>You handcuff [C].</span>")
|
||||
SSblackbox.add_details("handcuffs","[type]")
|
||||
|
||||
add_logs(user, C, "handcuffed")
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You fail to handcuff [C]!</span>")
|
||||
else
|
||||
to_chat(user, "<span class='warning'>[C] doesn't have two hands...</span>")
|
||||
|
||||
/obj/item/restraints/handcuffs/proc/apply_cuffs(mob/living/carbon/target, mob/user, var/dispense = 0)
|
||||
if(target.handcuffed)
|
||||
return
|
||||
|
||||
if(!user.drop_item() && !dispense)
|
||||
return
|
||||
|
||||
var/obj/item/restraints/handcuffs/cuffs = src
|
||||
if(trashtype)
|
||||
cuffs = new trashtype()
|
||||
else if(dispense)
|
||||
cuffs = new type()
|
||||
|
||||
cuffs.loc = target
|
||||
target.handcuffed = cuffs
|
||||
|
||||
target.update_handcuffed()
|
||||
if(trashtype && !dispense)
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
/obj/item/restraints/handcuffs/sinew
|
||||
name = "sinew restraints"
|
||||
desc = "A pair of restraints fashioned from long strands of flesh."
|
||||
icon = 'icons/obj/mining.dmi'
|
||||
icon_state = "sinewcuff"
|
||||
item_state = "sinewcuff"
|
||||
breakouttime = 300 //Deciseconds = 30s
|
||||
cuffsound = 'sound/weapons/cablecuff.ogg'
|
||||
|
||||
/obj/item/restraints/handcuffs/cable
|
||||
name = "cable restraints"
|
||||
desc = "Looks like some cables tied together. Could be used to tie something up."
|
||||
icon_state = "cuff_red"
|
||||
item_state = "coil_red"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
|
||||
materials = list(MAT_METAL=150, MAT_GLASS=75)
|
||||
origin_tech = "engineering=2"
|
||||
breakouttime = 300 //Deciseconds = 30s
|
||||
cuffsound = 'sound/weapons/cablecuff.ogg'
|
||||
var/datum/robot_energy_storage/wirestorage = null
|
||||
|
||||
/obj/item/restraints/handcuffs/cable/attack(mob/living/carbon/C, mob/living/carbon/human/user)
|
||||
if(!istype(C))
|
||||
return
|
||||
if(wirestorage && wirestorage.energy < 15)
|
||||
to_chat(user, "<span class='warning'>You need at least 15 wire to restrain [C]!</span>")
|
||||
return
|
||||
return ..()
|
||||
|
||||
/obj/item/restraints/handcuffs/cable/apply_cuffs(mob/living/carbon/target, mob/user, var/dispense = 0)
|
||||
if(wirestorage)
|
||||
if(!wirestorage.use_charge(15))
|
||||
to_chat(user, "<span class='warning'>You need at least 15 wire to restrain [target]!</span>")
|
||||
return
|
||||
return ..(target, user, 1)
|
||||
|
||||
return ..()
|
||||
|
||||
/obj/item/restraints/handcuffs/cable/red
|
||||
icon_state = "cuff_red"
|
||||
item_state = "coil_red"
|
||||
|
||||
/obj/item/restraints/handcuffs/cable/yellow
|
||||
icon_state = "cuff_yellow"
|
||||
item_state = "coil_yellow"
|
||||
|
||||
/obj/item/restraints/handcuffs/cable/blue
|
||||
icon_state = "cuff_blue"
|
||||
item_state = "coil_blue"
|
||||
|
||||
/obj/item/restraints/handcuffs/cable/green
|
||||
icon_state = "cuff_green"
|
||||
item_state = "coil_green"
|
||||
|
||||
/obj/item/restraints/handcuffs/cable/pink
|
||||
icon_state = "cuff_pink"
|
||||
item_state = "coil_pink"
|
||||
|
||||
/obj/item/restraints/handcuffs/cable/orange
|
||||
icon_state = "cuff_orange"
|
||||
item_state = "coil_orange"
|
||||
|
||||
/obj/item/restraints/handcuffs/cable/cyan
|
||||
icon_state = "cuff_cyan"
|
||||
item_state = "coil_cyan"
|
||||
|
||||
/obj/item/restraints/handcuffs/cable/white
|
||||
icon_state = "cuff_white"
|
||||
item_state = "coil_white"
|
||||
|
||||
/obj/item/restraints/handcuffs/alien
|
||||
icon_state = "handcuffAlien"
|
||||
|
||||
/obj/item/restraints/handcuffs/fake
|
||||
name = "fake handcuffs"
|
||||
desc = "Fake handcuffs meant for gag purposes."
|
||||
breakouttime = 10 //Deciseconds = 1s
|
||||
|
||||
/obj/item/restraints/handcuffs/fake/kinky
|
||||
name = "kinky handcuffs"
|
||||
desc = "Fake handcuffs meant for erotic roleplay."
|
||||
icon_state = "handcuffGag"
|
||||
|
||||
/obj/item/restraints/handcuffs/cable/attackby(obj/item/I, mob/user, params)
|
||||
..()
|
||||
if(istype(I, /obj/item/stack/rods))
|
||||
var/obj/item/stack/rods/R = I
|
||||
if (R.use(1))
|
||||
var/obj/item/wirerod/W = new /obj/item/wirerod
|
||||
remove_item_from_storage(user)
|
||||
user.put_in_hands(W)
|
||||
to_chat(user, "<span class='notice'>You wrap the cable restraint around the top of the rod.</span>")
|
||||
qdel(src)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You need one rod to make a wired rod!</span>")
|
||||
return
|
||||
else if(istype(I, /obj/item/stack/sheet/metal))
|
||||
var/obj/item/stack/sheet/metal/M = I
|
||||
if(M.get_amount() < 6)
|
||||
to_chat(user, "<span class='warning'>You need at least six metal sheets to make good enough weights!</span>")
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You begin to apply [I] to [src]...</span>")
|
||||
if(do_after(user, 35, target = src))
|
||||
if(M.get_amount() < 6 || !M)
|
||||
return
|
||||
var/obj/item/restraints/legcuffs/bola/S = new /obj/item/restraints/legcuffs/bola
|
||||
M.use(6)
|
||||
user.put_in_hands(S)
|
||||
to_chat(user, "<span class='notice'>You make some weights out of [I] and tie them to [src].</span>")
|
||||
remove_item_from_storage(user)
|
||||
qdel(src)
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/restraints/handcuffs/cable/zipties/cyborg/attack(mob/living/carbon/C, mob/user)
|
||||
if(iscyborg(user))
|
||||
if(!C.handcuffed)
|
||||
playsound(loc, 'sound/weapons/cablecuff.ogg', 30, 1, -2)
|
||||
C.visible_message("<span class='danger'>[user] is trying to put zipties on [C]!</span>", \
|
||||
"<span class='userdanger'>[user] is trying to put zipties on [C]!</span>")
|
||||
if(do_mob(user, C, 30))
|
||||
if(!C.handcuffed)
|
||||
C.handcuffed = new /obj/item/restraints/handcuffs/cable/zipties/used(C)
|
||||
C.update_handcuffed()
|
||||
to_chat(user, "<span class='notice'>You handcuff [C].</span>")
|
||||
add_logs(user, C, "handcuffed")
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You fail to handcuff [C]!</span>")
|
||||
|
||||
/obj/item/restraints/handcuffs/cable/zipties
|
||||
name = "zipties"
|
||||
desc = "Plastic, disposable zipties that can be used to restrain temporarily but are destroyed after use."
|
||||
icon_state = "cuff_white"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
|
||||
materials = list()
|
||||
breakouttime = 450 //Deciseconds = 45s
|
||||
trashtype = /obj/item/restraints/handcuffs/cable/zipties/used
|
||||
|
||||
/obj/item/restraints/handcuffs/cable/zipties/used
|
||||
desc = "A pair of broken zipties."
|
||||
icon_state = "cuff_white_used"
|
||||
item_state = "cuff_white"
|
||||
|
||||
/obj/item/restraints/handcuffs/cable/zipties/used/attack()
|
||||
return
|
||||
|
||||
|
||||
//Legcuffs
|
||||
|
||||
/obj/item/restraints/legcuffs
|
||||
name = "leg cuffs"
|
||||
desc = "Use this to keep prisoners in line."
|
||||
gender = PLURAL
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
icon_state = "handcuff"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
|
||||
flags_1 = CONDUCT_1
|
||||
throwforce = 0
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
origin_tech = "engineering=3;combat=3"
|
||||
slowdown = 7
|
||||
breakouttime = 300 //Deciseconds = 30s = 0.5 minute
|
||||
|
||||
/obj/item/restraints/legcuffs/beartrap
|
||||
name = "bear trap"
|
||||
throw_speed = 1
|
||||
throw_range = 1
|
||||
icon_state = "beartrap"
|
||||
desc = "A trap used to catch bears and other legged creatures."
|
||||
origin_tech = "engineering=4"
|
||||
var/armed = 0
|
||||
var/trap_damage = 20
|
||||
|
||||
/obj/item/restraints/legcuffs/beartrap/Initialize()
|
||||
. = ..()
|
||||
icon_state = "[initial(icon_state)][armed]"
|
||||
|
||||
/obj/item/restraints/legcuffs/beartrap/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] is sticking [user.p_their()] head in the [src.name]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
|
||||
playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
|
||||
return (BRUTELOSS)
|
||||
|
||||
/obj/item/restraints/legcuffs/beartrap/attack_self(mob/user)
|
||||
..()
|
||||
if(ishuman(user) && !user.stat && !user.restrained())
|
||||
armed = !armed
|
||||
icon_state = "[initial(icon_state)][armed]"
|
||||
to_chat(user, "<span class='notice'>[src] is now [armed ? "armed" : "disarmed"]</span>")
|
||||
|
||||
/obj/item/restraints/legcuffs/beartrap/Crossed(AM as mob|obj)
|
||||
if(armed && isturf(src.loc))
|
||||
if(isliving(AM))
|
||||
var/mob/living/L = AM
|
||||
var/snap = 0
|
||||
var/def_zone = "chest"
|
||||
if(iscarbon(L))
|
||||
var/mob/living/carbon/C = L
|
||||
snap = 1
|
||||
if(!C.lying)
|
||||
def_zone = pick("l_leg", "r_leg")
|
||||
if(!C.legcuffed && C.get_num_legs() >= 2) //beartrap can't cuff your leg if there's already a beartrap or legcuffs, or you don't have two legs.
|
||||
C.legcuffed = src
|
||||
src.loc = C
|
||||
C.update_inv_legcuffed()
|
||||
SSblackbox.add_details("handcuffs","[type]")
|
||||
else if(isanimal(L))
|
||||
var/mob/living/simple_animal/SA = L
|
||||
if(SA.mob_size > MOB_SIZE_TINY)
|
||||
snap = 1
|
||||
if(L.movement_type & FLYING)
|
||||
snap = 0
|
||||
if(snap)
|
||||
armed = 0
|
||||
icon_state = "[initial(icon_state)][armed]"
|
||||
playsound(src.loc, 'sound/effects/snap.ogg', 50, 1)
|
||||
L.visible_message("<span class='danger'>[L] triggers \the [src].</span>", \
|
||||
"<span class='userdanger'>You trigger \the [src]!</span>")
|
||||
L.apply_damage(trap_damage,BRUTE, def_zone)
|
||||
..()
|
||||
|
||||
/obj/item/restraints/legcuffs/beartrap/energy
|
||||
name = "energy snare"
|
||||
armed = 1
|
||||
icon_state = "e_snare"
|
||||
trap_damage = 0
|
||||
flags_1 = DROPDEL_1
|
||||
|
||||
/obj/item/restraints/legcuffs/beartrap/energy/New()
|
||||
..()
|
||||
addtimer(CALLBACK(src, .proc/dissipate), 100)
|
||||
|
||||
/obj/item/restraints/legcuffs/beartrap/energy/proc/dissipate()
|
||||
if(!ismob(loc))
|
||||
do_sparks(1, TRUE, src)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/restraints/legcuffs/beartrap/energy/attack_hand(mob/user)
|
||||
Crossed(user) //honk
|
||||
|
||||
/obj/item/restraints/legcuffs/beartrap/energy/cyborg
|
||||
breakouttime = 20 // Cyborgs shouldn't have a strong restraint
|
||||
|
||||
/obj/item/restraints/legcuffs/bola
|
||||
name = "bola"
|
||||
desc = "A restraining device designed to be thrown at the target. Upon connecting with said target, it will wrap around their legs, making it difficult for them to move quickly."
|
||||
icon_state = "bola"
|
||||
breakouttime = 35//easy to apply, easy to break out of
|
||||
gender = NEUTER
|
||||
origin_tech = "engineering=3;combat=1"
|
||||
var/knockdown = 0
|
||||
|
||||
/obj/item/restraints/legcuffs/bola/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback)
|
||||
if(!..())
|
||||
return
|
||||
playsound(src.loc,'sound/weapons/bolathrow.ogg', 75, 1)
|
||||
|
||||
/obj/item/restraints/legcuffs/bola/throw_impact(atom/hit_atom)
|
||||
if(..() || !iscarbon(hit_atom))//if it gets caught or the target can't be cuffed,
|
||||
return//abort
|
||||
var/mob/living/carbon/C = hit_atom
|
||||
if(!C.legcuffed && C.get_num_legs() >= 2)
|
||||
visible_message("<span class='danger'>\The [src] ensnares [C]!</span>")
|
||||
C.legcuffed = src
|
||||
src.loc = C
|
||||
C.update_inv_legcuffed()
|
||||
SSblackbox.add_details("handcuffs","[type]")
|
||||
to_chat(C, "<span class='userdanger'>\The [src] ensnares you!</span>")
|
||||
C.Knockdown(knockdown)
|
||||
|
||||
/obj/item/restraints/legcuffs/bola/tactical//traitor variant
|
||||
name = "reinforced bola"
|
||||
desc = "A strong bola, made with a long steel chain. It looks heavy, enough so that it could trip somebody."
|
||||
icon_state = "bola_r"
|
||||
breakouttime = 70
|
||||
origin_tech = "engineering=4;combat=3"
|
||||
knockdown = 20
|
||||
|
||||
/obj/item/restraints/legcuffs/bola/energy //For Security
|
||||
name = "energy bola"
|
||||
desc = "A specialized hard-light bola designed to ensnare fleeing criminals and aid in arrests."
|
||||
icon_state = "ebola"
|
||||
hitsound = 'sound/weapons/taserhit.ogg'
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
breakouttime = 60
|
||||
|
||||
/obj/item/restraints/legcuffs/bola/energy/throw_impact(atom/hit_atom)
|
||||
if(iscarbon(hit_atom))
|
||||
var/obj/item/restraints/legcuffs/beartrap/B = new /obj/item/restraints/legcuffs/beartrap/energy/cyborg(get_turf(hit_atom))
|
||||
B.Crossed(hit_atom)
|
||||
qdel(src)
|
||||
..()
|
||||
/obj/item/restraints
|
||||
breakouttime = 600
|
||||
|
||||
//Handcuffs
|
||||
|
||||
/obj/item/restraints/handcuffs
|
||||
name = "handcuffs"
|
||||
desc = "Use this to keep prisoners in line."
|
||||
gender = PLURAL
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
icon_state = "handcuff"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
|
||||
flags_1 = CONDUCT_1
|
||||
slot_flags = SLOT_BELT
|
||||
throwforce = 0
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
throw_speed = 3
|
||||
throw_range = 5
|
||||
materials = list(MAT_METAL=500)
|
||||
origin_tech = "engineering=3;combat=3"
|
||||
breakouttime = 600 //Deciseconds = 60s = 1 minute
|
||||
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 50)
|
||||
var/cuffsound = 'sound/weapons/handcuffs.ogg'
|
||||
var/trashtype = null //for disposable cuffs
|
||||
|
||||
/obj/item/restraints/handcuffs/attack(mob/living/carbon/C, mob/living/carbon/human/user)
|
||||
if(!istype(C))
|
||||
return
|
||||
if(user.disabilities & CLUMSY && prob(50))
|
||||
to_chat(user, "<span class='warning'>Uh... how do those things work?!</span>")
|
||||
apply_cuffs(user,user)
|
||||
return
|
||||
|
||||
// chance of monkey retaliation
|
||||
if(ismonkey(C) && prob(MONKEY_CUFF_RETALIATION_PROB))
|
||||
var/mob/living/carbon/monkey/M
|
||||
M = C
|
||||
M.retaliate(user)
|
||||
|
||||
if(!C.handcuffed)
|
||||
if(C.get_num_arms() >= 2 || C.get_arm_ignore())
|
||||
C.visible_message("<span class='danger'>[user] is trying to put [src.name] on [C]!</span>", \
|
||||
"<span class='userdanger'>[user] is trying to put [src.name] on [C]!</span>")
|
||||
|
||||
playsound(loc, cuffsound, 30, 1, -2)
|
||||
if(do_mob(user, C, 30) && (C.get_num_arms() >= 2 || C.get_arm_ignore()))
|
||||
apply_cuffs(C,user)
|
||||
to_chat(user, "<span class='notice'>You handcuff [C].</span>")
|
||||
SSblackbox.add_details("handcuffs","[type]")
|
||||
|
||||
add_logs(user, C, "handcuffed")
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You fail to handcuff [C]!</span>")
|
||||
else
|
||||
to_chat(user, "<span class='warning'>[C] doesn't have two hands...</span>")
|
||||
|
||||
/obj/item/restraints/handcuffs/proc/apply_cuffs(mob/living/carbon/target, mob/user, var/dispense = 0)
|
||||
if(target.handcuffed)
|
||||
return
|
||||
|
||||
if(!user.temporarilyRemoveItemFromInventory(src) && !dispense)
|
||||
return
|
||||
|
||||
var/obj/item/restraints/handcuffs/cuffs = src
|
||||
if(trashtype)
|
||||
cuffs = new trashtype()
|
||||
else if(dispense)
|
||||
cuffs = new type()
|
||||
|
||||
cuffs.forceMove(target)
|
||||
target.handcuffed = cuffs
|
||||
|
||||
target.update_handcuffed()
|
||||
if(trashtype && !dispense)
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
/obj/item/restraints/handcuffs/sinew
|
||||
name = "sinew restraints"
|
||||
desc = "A pair of restraints fashioned from long strands of flesh."
|
||||
icon = 'icons/obj/mining.dmi'
|
||||
icon_state = "sinewcuff"
|
||||
item_state = "sinewcuff"
|
||||
breakouttime = 300 //Deciseconds = 30s
|
||||
cuffsound = 'sound/weapons/cablecuff.ogg'
|
||||
|
||||
/obj/item/restraints/handcuffs/cable
|
||||
name = "cable restraints"
|
||||
desc = "Looks like some cables tied together. Could be used to tie something up."
|
||||
icon_state = "cuff_red"
|
||||
item_state = "coil_red"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
|
||||
materials = list(MAT_METAL=150, MAT_GLASS=75)
|
||||
origin_tech = "engineering=2"
|
||||
breakouttime = 300 //Deciseconds = 30s
|
||||
cuffsound = 'sound/weapons/cablecuff.ogg'
|
||||
var/datum/robot_energy_storage/wirestorage = null
|
||||
|
||||
/obj/item/restraints/handcuffs/cable/attack(mob/living/carbon/C, mob/living/carbon/human/user)
|
||||
if(!istype(C))
|
||||
return
|
||||
if(wirestorage && wirestorage.energy < 15)
|
||||
to_chat(user, "<span class='warning'>You need at least 15 wire to restrain [C]!</span>")
|
||||
return
|
||||
return ..()
|
||||
|
||||
/obj/item/restraints/handcuffs/cable/apply_cuffs(mob/living/carbon/target, mob/user, var/dispense = 0)
|
||||
if(wirestorage)
|
||||
if(!wirestorage.use_charge(15))
|
||||
to_chat(user, "<span class='warning'>You need at least 15 wire to restrain [target]!</span>")
|
||||
return
|
||||
return ..(target, user, 1)
|
||||
|
||||
return ..()
|
||||
|
||||
/obj/item/restraints/handcuffs/cable/red
|
||||
icon_state = "cuff_red"
|
||||
item_state = "coil_red"
|
||||
|
||||
/obj/item/restraints/handcuffs/cable/yellow
|
||||
icon_state = "cuff_yellow"
|
||||
item_state = "coil_yellow"
|
||||
|
||||
/obj/item/restraints/handcuffs/cable/blue
|
||||
icon_state = "cuff_blue"
|
||||
item_state = "coil_blue"
|
||||
|
||||
/obj/item/restraints/handcuffs/cable/green
|
||||
icon_state = "cuff_green"
|
||||
item_state = "coil_green"
|
||||
|
||||
/obj/item/restraints/handcuffs/cable/pink
|
||||
icon_state = "cuff_pink"
|
||||
item_state = "coil_pink"
|
||||
|
||||
/obj/item/restraints/handcuffs/cable/orange
|
||||
icon_state = "cuff_orange"
|
||||
item_state = "coil_orange"
|
||||
|
||||
/obj/item/restraints/handcuffs/cable/cyan
|
||||
icon_state = "cuff_cyan"
|
||||
item_state = "coil_cyan"
|
||||
|
||||
/obj/item/restraints/handcuffs/cable/white
|
||||
icon_state = "cuff_white"
|
||||
item_state = "coil_white"
|
||||
|
||||
/obj/item/restraints/handcuffs/alien
|
||||
icon_state = "handcuffAlien"
|
||||
|
||||
/obj/item/restraints/handcuffs/fake
|
||||
name = "fake handcuffs"
|
||||
desc = "Fake handcuffs meant for gag purposes."
|
||||
breakouttime = 10 //Deciseconds = 1s
|
||||
|
||||
/obj/item/restraints/handcuffs/fake/kinky
|
||||
name = "kinky handcuffs"
|
||||
desc = "Fake handcuffs meant for erotic roleplay."
|
||||
icon_state = "handcuffGag"
|
||||
|
||||
/obj/item/restraints/handcuffs/cable/attackby(obj/item/I, mob/user, params)
|
||||
..()
|
||||
if(istype(I, /obj/item/stack/rods))
|
||||
var/obj/item/stack/rods/R = I
|
||||
if (R.use(1))
|
||||
var/obj/item/wirerod/W = new /obj/item/wirerod
|
||||
remove_item_from_storage(user)
|
||||
user.put_in_hands(W)
|
||||
to_chat(user, "<span class='notice'>You wrap the cable restraint around the top of the rod.</span>")
|
||||
qdel(src)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You need one rod to make a wired rod!</span>")
|
||||
return
|
||||
else if(istype(I, /obj/item/stack/sheet/metal))
|
||||
var/obj/item/stack/sheet/metal/M = I
|
||||
if(M.get_amount() < 6)
|
||||
to_chat(user, "<span class='warning'>You need at least six metal sheets to make good enough weights!</span>")
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You begin to apply [I] to [src]...</span>")
|
||||
if(do_after(user, 35, target = src))
|
||||
if(M.get_amount() < 6 || !M)
|
||||
return
|
||||
var/obj/item/restraints/legcuffs/bola/S = new /obj/item/restraints/legcuffs/bola
|
||||
M.use(6)
|
||||
user.put_in_hands(S)
|
||||
to_chat(user, "<span class='notice'>You make some weights out of [I] and tie them to [src].</span>")
|
||||
remove_item_from_storage(user)
|
||||
qdel(src)
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/restraints/handcuffs/cable/zipties/cyborg/attack(mob/living/carbon/C, mob/user)
|
||||
if(iscyborg(user))
|
||||
if(!C.handcuffed)
|
||||
playsound(loc, 'sound/weapons/cablecuff.ogg', 30, 1, -2)
|
||||
C.visible_message("<span class='danger'>[user] is trying to put zipties on [C]!</span>", \
|
||||
"<span class='userdanger'>[user] is trying to put zipties on [C]!</span>")
|
||||
if(do_mob(user, C, 30))
|
||||
if(!C.handcuffed)
|
||||
C.handcuffed = new /obj/item/restraints/handcuffs/cable/zipties/used(C)
|
||||
C.update_handcuffed()
|
||||
to_chat(user, "<span class='notice'>You handcuff [C].</span>")
|
||||
add_logs(user, C, "handcuffed")
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You fail to handcuff [C]!</span>")
|
||||
|
||||
/obj/item/restraints/handcuffs/cable/zipties
|
||||
name = "zipties"
|
||||
desc = "Plastic, disposable zipties that can be used to restrain temporarily but are destroyed after use."
|
||||
icon_state = "cuff_white"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
|
||||
materials = list()
|
||||
breakouttime = 450 //Deciseconds = 45s
|
||||
trashtype = /obj/item/restraints/handcuffs/cable/zipties/used
|
||||
|
||||
/obj/item/restraints/handcuffs/cable/zipties/used
|
||||
desc = "A pair of broken zipties."
|
||||
icon_state = "cuff_white_used"
|
||||
item_state = "cuff_white"
|
||||
|
||||
/obj/item/restraints/handcuffs/cable/zipties/used/attack()
|
||||
return
|
||||
|
||||
|
||||
//Legcuffs
|
||||
|
||||
/obj/item/restraints/legcuffs
|
||||
name = "leg cuffs"
|
||||
desc = "Use this to keep prisoners in line."
|
||||
gender = PLURAL
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
icon_state = "handcuff"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
|
||||
flags_1 = CONDUCT_1
|
||||
throwforce = 0
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
origin_tech = "engineering=3;combat=3"
|
||||
slowdown = 7
|
||||
breakouttime = 300 //Deciseconds = 30s = 0.5 minute
|
||||
|
||||
/obj/item/restraints/legcuffs/beartrap
|
||||
name = "bear trap"
|
||||
throw_speed = 1
|
||||
throw_range = 1
|
||||
icon_state = "beartrap"
|
||||
desc = "A trap used to catch bears and other legged creatures."
|
||||
origin_tech = "engineering=4"
|
||||
var/armed = 0
|
||||
var/trap_damage = 20
|
||||
|
||||
/obj/item/restraints/legcuffs/beartrap/Initialize()
|
||||
. = ..()
|
||||
icon_state = "[initial(icon_state)][armed]"
|
||||
|
||||
/obj/item/restraints/legcuffs/beartrap/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] is sticking [user.p_their()] head in the [src.name]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
|
||||
playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
|
||||
return (BRUTELOSS)
|
||||
|
||||
/obj/item/restraints/legcuffs/beartrap/attack_self(mob/user)
|
||||
..()
|
||||
if(ishuman(user) && !user.stat && !user.restrained())
|
||||
armed = !armed
|
||||
icon_state = "[initial(icon_state)][armed]"
|
||||
to_chat(user, "<span class='notice'>[src] is now [armed ? "armed" : "disarmed"]</span>")
|
||||
|
||||
/obj/item/restraints/legcuffs/beartrap/Crossed(AM as mob|obj)
|
||||
if(armed && isturf(src.loc))
|
||||
if(isliving(AM))
|
||||
var/mob/living/L = AM
|
||||
var/snap = 0
|
||||
var/def_zone = "chest"
|
||||
if(iscarbon(L))
|
||||
var/mob/living/carbon/C = L
|
||||
snap = 1
|
||||
if(!C.lying)
|
||||
def_zone = pick("l_leg", "r_leg")
|
||||
if(!C.legcuffed && C.get_num_legs() >= 2) //beartrap can't cuff your leg if there's already a beartrap or legcuffs, or you don't have two legs.
|
||||
C.legcuffed = src
|
||||
src.loc = C
|
||||
C.update_inv_legcuffed()
|
||||
SSblackbox.add_details("handcuffs","[type]")
|
||||
else if(isanimal(L))
|
||||
var/mob/living/simple_animal/SA = L
|
||||
if(SA.mob_size > MOB_SIZE_TINY)
|
||||
snap = 1
|
||||
if(L.movement_type & FLYING)
|
||||
snap = 0
|
||||
if(snap)
|
||||
armed = 0
|
||||
icon_state = "[initial(icon_state)][armed]"
|
||||
playsound(src.loc, 'sound/effects/snap.ogg', 50, 1)
|
||||
L.visible_message("<span class='danger'>[L] triggers \the [src].</span>", \
|
||||
"<span class='userdanger'>You trigger \the [src]!</span>")
|
||||
L.apply_damage(trap_damage,BRUTE, def_zone)
|
||||
..()
|
||||
|
||||
/obj/item/restraints/legcuffs/beartrap/energy
|
||||
name = "energy snare"
|
||||
armed = 1
|
||||
icon_state = "e_snare"
|
||||
trap_damage = 0
|
||||
flags_1 = DROPDEL_1
|
||||
|
||||
/obj/item/restraints/legcuffs/beartrap/energy/New()
|
||||
..()
|
||||
addtimer(CALLBACK(src, .proc/dissipate), 100)
|
||||
|
||||
/obj/item/restraints/legcuffs/beartrap/energy/proc/dissipate()
|
||||
if(!ismob(loc))
|
||||
do_sparks(1, TRUE, src)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/restraints/legcuffs/beartrap/energy/attack_hand(mob/user)
|
||||
Crossed(user) //honk
|
||||
|
||||
/obj/item/restraints/legcuffs/beartrap/energy/cyborg
|
||||
breakouttime = 20 // Cyborgs shouldn't have a strong restraint
|
||||
|
||||
/obj/item/restraints/legcuffs/bola
|
||||
name = "bola"
|
||||
desc = "A restraining device designed to be thrown at the target. Upon connecting with said target, it will wrap around their legs, making it difficult for them to move quickly."
|
||||
icon_state = "bola"
|
||||
breakouttime = 35//easy to apply, easy to break out of
|
||||
gender = NEUTER
|
||||
origin_tech = "engineering=3;combat=1"
|
||||
var/knockdown = 0
|
||||
|
||||
/obj/item/restraints/legcuffs/bola/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback)
|
||||
if(!..())
|
||||
return
|
||||
playsound(src.loc,'sound/weapons/bolathrow.ogg', 75, 1)
|
||||
|
||||
/obj/item/restraints/legcuffs/bola/throw_impact(atom/hit_atom)
|
||||
if(..() || !iscarbon(hit_atom))//if it gets caught or the target can't be cuffed,
|
||||
return//abort
|
||||
var/mob/living/carbon/C = hit_atom
|
||||
if(!C.legcuffed && C.get_num_legs() >= 2)
|
||||
visible_message("<span class='danger'>\The [src] ensnares [C]!</span>")
|
||||
C.legcuffed = src
|
||||
src.loc = C
|
||||
C.update_inv_legcuffed()
|
||||
SSblackbox.add_details("handcuffs","[type]")
|
||||
to_chat(C, "<span class='userdanger'>\The [src] ensnares you!</span>")
|
||||
C.Knockdown(knockdown)
|
||||
|
||||
/obj/item/restraints/legcuffs/bola/tactical//traitor variant
|
||||
name = "reinforced bola"
|
||||
desc = "A strong bola, made with a long steel chain. It looks heavy, enough so that it could trip somebody."
|
||||
icon_state = "bola_r"
|
||||
breakouttime = 70
|
||||
origin_tech = "engineering=4;combat=3"
|
||||
knockdown = 20
|
||||
|
||||
/obj/item/restraints/legcuffs/bola/energy //For Security
|
||||
name = "energy bola"
|
||||
desc = "A specialized hard-light bola designed to ensnare fleeing criminals and aid in arrests."
|
||||
icon_state = "ebola"
|
||||
hitsound = 'sound/weapons/taserhit.ogg'
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
breakouttime = 60
|
||||
|
||||
/obj/item/restraints/legcuffs/bola/energy/throw_impact(atom/hit_atom)
|
||||
if(iscarbon(hit_atom))
|
||||
var/obj/item/restraints/legcuffs/beartrap/B = new /obj/item/restraints/legcuffs/beartrap/energy/cyborg(get_turf(hit_atom))
|
||||
B.Crossed(hit_atom)
|
||||
qdel(src)
|
||||
..()
|
||||
|
||||
|
||||
@@ -233,7 +233,7 @@
|
||||
|
||||
/obj/item/melee/supermatter_sword/afterattack(target, mob/user, proximity_flag)
|
||||
if(user && target == user)
|
||||
user.drop_item()
|
||||
user.dropItemToGround(src)
|
||||
if(proximity_flag)
|
||||
consume_everything(target)
|
||||
..()
|
||||
@@ -243,7 +243,7 @@
|
||||
if(ismob(target))
|
||||
var/mob/M
|
||||
if(src.loc == M)
|
||||
M.drop_item()
|
||||
M.dropItemToGround(src)
|
||||
consume_everything(target)
|
||||
|
||||
/obj/item/melee/supermatter_sword/pickup(user)
|
||||
@@ -267,7 +267,7 @@
|
||||
|
||||
/obj/item/melee/supermatter_sword/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] touches [src]'s blade. It looks like [user.p_theyre()] tired of waiting for the radiation to kill [user.p_them()]!</span>")
|
||||
user.drop_item()
|
||||
user.dropItemToGround(src, TRUE)
|
||||
shard.CollidedWith(user)
|
||||
|
||||
/obj/item/melee/supermatter_sword/proc/consume_everything(target)
|
||||
|
||||
@@ -1,14 +1,13 @@
|
||||
/obj/item/pai_cable
|
||||
desc = "A flexible coated cable with a universal jack on one end."
|
||||
name = "data cable"
|
||||
icon = 'icons/obj/power.dmi'
|
||||
icon_state = "wire1"
|
||||
flags_1 = NOBLUDGEON_1
|
||||
var/obj/machinery/machine
|
||||
|
||||
/obj/item/pai_cable/proc/plugin(obj/machinery/M, mob/living/user)
|
||||
if(!user.drop_item())
|
||||
return
|
||||
user.visible_message("[user] inserts [src] into a data port on [M].", "<span class='notice'>You insert [src] into a data port on [M].</span>", "<span class='italics'>You hear the satisfying click of a wire jack fastening into place.</span>")
|
||||
src.loc = M
|
||||
machine = M
|
||||
/obj/item/pai_cable
|
||||
desc = "A flexible coated cable with a universal jack on one end."
|
||||
name = "data cable"
|
||||
icon = 'icons/obj/power.dmi'
|
||||
icon_state = "wire1"
|
||||
flags_1 = NOBLUDGEON_1
|
||||
var/obj/machinery/machine
|
||||
|
||||
/obj/item/pai_cable/proc/plugin(obj/machinery/M, mob/living/user)
|
||||
if(!user.transferItemToLoc(src, M))
|
||||
return
|
||||
user.visible_message("[user] inserts [src] into a data port on [M].", "<span class='notice'>You insert [src] into a data port on [M].</span>", "<span class='italics'>You hear the satisfying click of a wire jack fastening into place.</span>")
|
||||
machine = M
|
||||
|
||||
@@ -122,7 +122,7 @@
|
||||
return
|
||||
if(user.disabilities & CLUMSY && prob(75) && clumsyCheck)
|
||||
user.visible_message("<span class='warning'>[user] loses their grip on [src], causing it to go off!</span>", "<span class='userdanger'>[src] slips out of your hands and goes off!</span>")
|
||||
user.drop_item()
|
||||
user.dropItemToGround(src, TRUE)
|
||||
if(prob(10))
|
||||
target = get_turf(user)
|
||||
else
|
||||
|
||||
@@ -254,7 +254,7 @@
|
||||
if(!isturf(loc))
|
||||
to_chat(user, "<span class='warning'>You cannot install[M], the frame has to be standing on the ground to be perfectly precise!</span>")
|
||||
return
|
||||
if(!user.drop_item())
|
||||
if(!user.temporarilyRemoveItemFromInventory(M))
|
||||
to_chat(user, "<span class='warning'>[M] is stuck to your hand!</span>")
|
||||
return
|
||||
qdel(M)
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
/obj/item/stack/wrapping_paper
|
||||
name = "wrapping paper"
|
||||
desc = "Wrap packages with this festive paper to make gifts."
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
icon = 'icons/obj/stack_objects.dmi'
|
||||
icon_state = "wrap_paper"
|
||||
flags_1 = NOBLUDGEON_1
|
||||
amount = 25
|
||||
@@ -28,7 +28,7 @@
|
||||
/obj/item/stack/packageWrap
|
||||
name = "package wrapper"
|
||||
desc = "You can use this to wrap items in."
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
icon = 'icons/obj/stack_objects.dmi'
|
||||
icon_state = "deliveryPaper"
|
||||
flags_1 = NOBLUDGEON_1
|
||||
amount = 25
|
||||
@@ -109,7 +109,7 @@
|
||||
/obj/item/c_tube
|
||||
name = "cardboard tube"
|
||||
desc = "A tube... of cardboard."
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
icon = 'icons/obj/stack_objects.dmi'
|
||||
icon_state = "c_tube"
|
||||
throwforce = 0
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
|
||||
/obj/item/storage/backpack/holding/suicide_act(mob/living/user)
|
||||
user.visible_message("<span class='suicide'>[user] is jumping into [src]! It looks like [user.p_theyre()] trying to commit suicide.</span>")
|
||||
user.drop_item()
|
||||
user.dropItemToGround(src, TRUE)
|
||||
user.Stun(100, ignore_canstun = TRUE)
|
||||
sleep(20)
|
||||
playsound(src, "rustle", 50, 1, -5)
|
||||
|
||||
@@ -57,11 +57,9 @@
|
||||
close_all()
|
||||
|
||||
to_chat(user, "<span class='notice'>You fold [src] flat.</span>")
|
||||
var/obj/item/I = new foldable(get_turf(src))
|
||||
user.drop_item()
|
||||
user.put_in_hands(I)
|
||||
user.update_inv_hands()
|
||||
var/obj/item/I = new foldable
|
||||
qdel(src)
|
||||
user.put_in_hands(I)
|
||||
|
||||
/obj/item/storage/box/attackby(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/stack/packageWrap))
|
||||
|
||||
@@ -58,7 +58,9 @@
|
||||
|
||||
/obj/item/storage/fancy/remove_from_storage(obj/item/W, atom/new_location, burn = 0)
|
||||
fancy_open = TRUE
|
||||
return ..()
|
||||
. = ..()
|
||||
//Recall update icon with the fancy item snowflake arg (ugh)
|
||||
update_icon(1)
|
||||
|
||||
/*
|
||||
* Donut Box
|
||||
|
||||
@@ -359,35 +359,43 @@
|
||||
return 1
|
||||
|
||||
|
||||
//Call this proc to handle the removal of an item from the storage item. The item will be moved to the atom sent as new_target
|
||||
//Call this proc to handle the removal of an item from the storage item. The item will be moved to the new_location target, if that is null it's being deleted
|
||||
/obj/item/storage/proc/remove_from_storage(obj/item/W, atom/new_location)
|
||||
if(!istype(W))
|
||||
return 0
|
||||
|
||||
if(istype(src, /obj/item/storage/fancy))
|
||||
var/obj/item/storage/fancy/F = src
|
||||
F.update_icon(1)
|
||||
|
||||
for(var/mob/M in can_see_contents())
|
||||
if(M.client)
|
||||
M.client.screen -= W
|
||||
//Cache this as it should be reusable down the bottom, will not apply if anyone adds a sleep to dropped
|
||||
//or moving objects, things that should never happen
|
||||
var/list/seeing_mobs = can_see_contents()
|
||||
for(var/mob/M in seeing_mobs)
|
||||
M.client.screen -= W
|
||||
|
||||
if(ismob(loc))
|
||||
var/mob/M = loc
|
||||
W.dropped(M)
|
||||
W.layer = initial(W.layer)
|
||||
W.plane = initial(W.plane)
|
||||
W.forceMove(new_location)
|
||||
|
||||
|
||||
for(var/mob/M in can_see_contents())
|
||||
if(new_location)
|
||||
W.forceMove(new_location)
|
||||
//Reset the items values
|
||||
W.layer = initial(W.layer)
|
||||
W.plane = initial(W.plane)
|
||||
W.mouse_opacity = initial(W.mouse_opacity)
|
||||
if(W.maptext)
|
||||
W.maptext = ""
|
||||
//We don't want to call this if the item is being destroyed
|
||||
W.on_exit_storage(src)
|
||||
|
||||
else
|
||||
//Being destroyed, just move to nullspace now (so it's not in contents for the icon update)
|
||||
W.moveToNullspace()
|
||||
|
||||
|
||||
for(var/mob/M in seeing_mobs)
|
||||
orient2hud(M)
|
||||
show_to(M)
|
||||
|
||||
if(W.maptext)
|
||||
W.maptext = ""
|
||||
W.on_exit_storage(src)
|
||||
update_icon()
|
||||
W.mouse_opacity = initial(W.mouse_opacity)
|
||||
return 1
|
||||
|
||||
/obj/item/storage/deconstruct(disassembled = TRUE)
|
||||
|
||||
@@ -1,211 +1,211 @@
|
||||
/obj/item/tank/jetpack
|
||||
name = "jetpack (empty)"
|
||||
desc = "A tank of compressed gas for use as propulsion in zero-gravity areas. Use with caution."
|
||||
icon_state = "jetpack"
|
||||
item_state = "jetpack"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/jetpacks_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/jetpacks_righthand.dmi'
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
distribute_pressure = ONE_ATMOSPHERE * O2STANDARD
|
||||
actions_types = list(/datum/action/item_action/set_internals, /datum/action/item_action/toggle_jetpack, /datum/action/item_action/jetpack_stabilization)
|
||||
var/gas_type = "o2"
|
||||
var/on = FALSE
|
||||
var/stabilizers = FALSE
|
||||
var/full_speed = TRUE // If the jetpack will have a speedboost in space/nograv or not
|
||||
var/datum/effect_system/trail_follow/ion/ion_trail
|
||||
|
||||
/obj/item/tank/jetpack/New()
|
||||
..()
|
||||
if(gas_type)
|
||||
air_contents.assert_gas(gas_type)
|
||||
air_contents.gases[gas_type][MOLES] = (6 * ONE_ATMOSPHERE) * volume / (R_IDEAL_GAS_EQUATION * T20C)
|
||||
|
||||
ion_trail = new
|
||||
ion_trail.set_up(src)
|
||||
|
||||
/obj/item/tank/jetpack/ui_action_click(mob/user, action)
|
||||
if(istype(action, /datum/action/item_action/toggle_jetpack))
|
||||
cycle(user)
|
||||
else if(istype(action, /datum/action/item_action/jetpack_stabilization))
|
||||
if(on)
|
||||
stabilizers = !stabilizers
|
||||
to_chat(user, "<span class='notice'>You turn the jetpack stabilization [stabilizers ? "on" : "off"].</span>")
|
||||
else
|
||||
toggle_internals(user)
|
||||
|
||||
|
||||
/obj/item/tank/jetpack/proc/cycle(mob/user)
|
||||
if(user.incapacitated())
|
||||
return
|
||||
|
||||
if(!on)
|
||||
turn_on()
|
||||
to_chat(user, "<span class='notice'>You turn the jetpack on.</span>")
|
||||
else
|
||||
turn_off()
|
||||
to_chat(user, "<span class='notice'>You turn the jetpack off.</span>")
|
||||
for(var/X in actions)
|
||||
var/datum/action/A = X
|
||||
A.UpdateButtonIcon()
|
||||
|
||||
|
||||
/obj/item/tank/jetpack/proc/turn_on()
|
||||
on = TRUE
|
||||
icon_state = "[initial(icon_state)]-on"
|
||||
ion_trail.start()
|
||||
|
||||
/obj/item/tank/jetpack/proc/turn_off()
|
||||
on = FALSE
|
||||
stabilizers = FALSE
|
||||
icon_state = initial(icon_state)
|
||||
ion_trail.stop()
|
||||
|
||||
/obj/item/tank/jetpack/proc/allow_thrust(num, mob/living/user)
|
||||
if(!on)
|
||||
return
|
||||
if((num < 0.005 || air_contents.total_moles() < num))
|
||||
turn_off()
|
||||
return
|
||||
|
||||
var/datum/gas_mixture/removed = air_contents.remove(num)
|
||||
if(removed.total_moles() < 0.005)
|
||||
turn_off()
|
||||
return
|
||||
|
||||
var/turf/T = get_turf(user)
|
||||
T.assume_air(removed)
|
||||
|
||||
return 1
|
||||
|
||||
/obj/item/tank/jetpack/suicide_act(mob/user)
|
||||
if (istype(user, /mob/living/carbon/human/))
|
||||
var/mob/living/carbon/human/H = user
|
||||
H.forcesay("WHAT THE FUCK IS CARBON DIOXIDE?")
|
||||
H.visible_message("<span class='suicide'>[user] is suffocating [user.p_them()]self with [src]! It looks like [user.p_they()] didn't read what that jetpack says!</span>")
|
||||
return (OXYLOSS)
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/item/tank/jetpack/void
|
||||
name = "void jetpack (oxygen)"
|
||||
desc = "It works well in a void."
|
||||
icon_state = "jetpack-void"
|
||||
item_state = "jetpack-void"
|
||||
|
||||
/obj/item/tank/jetpack/oxygen
|
||||
name = "jetpack (oxygen)"
|
||||
desc = "A tank of compressed oxygen for use as propulsion in zero-gravity areas. Use with caution."
|
||||
icon_state = "jetpack"
|
||||
item_state = "jetpack"
|
||||
|
||||
/obj/item/tank/jetpack/oxygen/harness
|
||||
name = "jet harness (oxygen)"
|
||||
desc = "A lightweight tactical harness, used by those who don't want to be weighed down by traditional jetpacks."
|
||||
icon_state = "jetpack-mini"
|
||||
item_state = "jetpack-mini"
|
||||
volume = 40
|
||||
throw_range = 7
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
|
||||
/obj/item/tank/jetpack/oxygen/captain
|
||||
name = "\improper Captain's jetpack"
|
||||
desc = "A compact, lightweight jetpack containing a high amount of compressed oxygen."
|
||||
icon_state = "jetpack-captain"
|
||||
item_state = "jetpack-captain"
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
volume = 90
|
||||
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF //steal objective items are hard to destroy.
|
||||
|
||||
/obj/item/tank/jetpack/oxygen/security
|
||||
name = "security jetpack (oxygen)"
|
||||
desc = "A tank of compressed oxygen for use as propulsion in zero-gravity areas by security forces."
|
||||
icon_state = "jetpack-sec"
|
||||
item_state = "jetpack-sec"
|
||||
|
||||
/obj/item/tank/jetpack/carbondioxide
|
||||
name = "jetpack (carbon dioxide)"
|
||||
desc = "A tank of compressed carbon dioxide for use as propulsion in zero-gravity areas. Painted black to indicate that it should not be used as a source for internals."
|
||||
icon_state = "jetpack-black"
|
||||
item_state = "jetpack-black"
|
||||
distribute_pressure = 0
|
||||
gas_type = "co2"
|
||||
|
||||
|
||||
/obj/item/tank/jetpack/suit
|
||||
name = "hardsuit jetpack upgrade"
|
||||
desc = "A modular, compact set of thrusters designed to integrate with a hardsuit. It is fueled by a tank inserted into the suit's storage compartment."
|
||||
origin_tech = "materials=4;magnets=4;engineering=5"
|
||||
icon_state = "jetpack-mining"
|
||||
item_state = "jetpack-black"
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
actions_types = list(/datum/action/item_action/toggle_jetpack, /datum/action/item_action/jetpack_stabilization)
|
||||
volume = 1
|
||||
slot_flags = null
|
||||
gas_type = null
|
||||
full_speed = FALSE
|
||||
var/datum/gas_mixture/temp_air_contents
|
||||
var/obj/item/tank/internals/tank = null
|
||||
|
||||
/obj/item/tank/jetpack/suit/New()
|
||||
..()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
temp_air_contents = air_contents
|
||||
|
||||
/obj/item/tank/jetpack/suit/attack_self()
|
||||
return
|
||||
|
||||
/obj/item/tank/jetpack/suit/cycle(mob/user)
|
||||
if(!istype(loc, /obj/item/clothing/suit/space/hardsuit))
|
||||
to_chat(user, "<span class='warning'>\The [src] must be connected to a hardsuit!</span>")
|
||||
return
|
||||
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(!istype(H.s_store, /obj/item/tank/internals))
|
||||
to_chat(user, "<span class='warning'>You need a tank in your suit storage!</span>")
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/tank/jetpack/suit/turn_on()
|
||||
if(!istype(loc, /obj/item/clothing/suit/space/hardsuit) || !ishuman(loc.loc))
|
||||
return
|
||||
var/mob/living/carbon/human/H = loc.loc
|
||||
tank = H.s_store
|
||||
air_contents = tank.air_contents
|
||||
START_PROCESSING(SSobj, src)
|
||||
..()
|
||||
|
||||
/obj/item/tank/jetpack/suit/turn_off()
|
||||
tank = null
|
||||
air_contents = temp_air_contents
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
..()
|
||||
|
||||
/obj/item/tank/jetpack/suit/process()
|
||||
if(!istype(loc, /obj/item/clothing/suit/space/hardsuit) || !ishuman(loc.loc))
|
||||
turn_off()
|
||||
return
|
||||
var/mob/living/carbon/human/H = loc.loc
|
||||
if(!tank || tank != H.s_store)
|
||||
turn_off()
|
||||
return
|
||||
..()
|
||||
|
||||
|
||||
//Return a jetpack that the mob can use
|
||||
//Back worn jetpacks, hardsuit internal packs, and so on.
|
||||
//Used in Process_Spacemove() and wherever you want to check for/get a jetpack
|
||||
|
||||
/mob/proc/get_jetpack()
|
||||
return
|
||||
|
||||
/mob/living/carbon/get_jetpack()
|
||||
var/obj/item/tank/jetpack/J = back
|
||||
if(istype(J))
|
||||
return J
|
||||
|
||||
/mob/living/carbon/human/get_jetpack()
|
||||
var/obj/item/tank/jetpack/J = ..()
|
||||
if(!istype(J) && istype(wear_suit, /obj/item/clothing/suit/space/hardsuit))
|
||||
var/obj/item/clothing/suit/space/hardsuit/C = wear_suit
|
||||
J = C.jetpack
|
||||
return J
|
||||
/obj/item/tank/jetpack
|
||||
name = "jetpack (empty)"
|
||||
desc = "A tank of compressed gas for use as propulsion in zero-gravity areas. Use with caution."
|
||||
icon_state = "jetpack"
|
||||
item_state = "jetpack"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/jetpacks_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/jetpacks_righthand.dmi'
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
distribute_pressure = ONE_ATMOSPHERE * O2STANDARD
|
||||
actions_types = list(/datum/action/item_action/set_internals, /datum/action/item_action/toggle_jetpack, /datum/action/item_action/jetpack_stabilization)
|
||||
var/gas_type = "o2"
|
||||
var/on = FALSE
|
||||
var/stabilizers = FALSE
|
||||
var/full_speed = TRUE // If the jetpack will have a speedboost in space/nograv or not
|
||||
var/datum/effect_system/trail_follow/ion/ion_trail
|
||||
|
||||
/obj/item/tank/jetpack/New()
|
||||
..()
|
||||
if(gas_type)
|
||||
ASSERT_GAS(gas_type,air_contents)
|
||||
air_contents.gases[gas_type][MOLES] = (6 * ONE_ATMOSPHERE) * volume / (R_IDEAL_GAS_EQUATION * T20C)
|
||||
|
||||
ion_trail = new
|
||||
ion_trail.set_up(src)
|
||||
|
||||
/obj/item/tank/jetpack/ui_action_click(mob/user, action)
|
||||
if(istype(action, /datum/action/item_action/toggle_jetpack))
|
||||
cycle(user)
|
||||
else if(istype(action, /datum/action/item_action/jetpack_stabilization))
|
||||
if(on)
|
||||
stabilizers = !stabilizers
|
||||
to_chat(user, "<span class='notice'>You turn the jetpack stabilization [stabilizers ? "on" : "off"].</span>")
|
||||
else
|
||||
toggle_internals(user)
|
||||
|
||||
|
||||
/obj/item/tank/jetpack/proc/cycle(mob/user)
|
||||
if(user.incapacitated())
|
||||
return
|
||||
|
||||
if(!on)
|
||||
turn_on()
|
||||
to_chat(user, "<span class='notice'>You turn the jetpack on.</span>")
|
||||
else
|
||||
turn_off()
|
||||
to_chat(user, "<span class='notice'>You turn the jetpack off.</span>")
|
||||
for(var/X in actions)
|
||||
var/datum/action/A = X
|
||||
A.UpdateButtonIcon()
|
||||
|
||||
|
||||
/obj/item/tank/jetpack/proc/turn_on()
|
||||
on = TRUE
|
||||
icon_state = "[initial(icon_state)]-on"
|
||||
ion_trail.start()
|
||||
|
||||
/obj/item/tank/jetpack/proc/turn_off()
|
||||
on = FALSE
|
||||
stabilizers = FALSE
|
||||
icon_state = initial(icon_state)
|
||||
ion_trail.stop()
|
||||
|
||||
/obj/item/tank/jetpack/proc/allow_thrust(num, mob/living/user)
|
||||
if(!on)
|
||||
return
|
||||
if((num < 0.005 || air_contents.total_moles() < num))
|
||||
turn_off()
|
||||
return
|
||||
|
||||
var/datum/gas_mixture/removed = air_contents.remove(num)
|
||||
if(removed.total_moles() < 0.005)
|
||||
turn_off()
|
||||
return
|
||||
|
||||
var/turf/T = get_turf(user)
|
||||
T.assume_air(removed)
|
||||
|
||||
return 1
|
||||
|
||||
/obj/item/tank/jetpack/suicide_act(mob/user)
|
||||
if (istype(user, /mob/living/carbon/human/))
|
||||
var/mob/living/carbon/human/H = user
|
||||
H.forcesay("WHAT THE FUCK IS CARBON DIOXIDE?")
|
||||
H.visible_message("<span class='suicide'>[user] is suffocating [user.p_them()]self with [src]! It looks like [user.p_they()] didn't read what that jetpack says!</span>")
|
||||
return (OXYLOSS)
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/item/tank/jetpack/void
|
||||
name = "void jetpack (oxygen)"
|
||||
desc = "It works well in a void."
|
||||
icon_state = "jetpack-void"
|
||||
item_state = "jetpack-void"
|
||||
|
||||
/obj/item/tank/jetpack/oxygen
|
||||
name = "jetpack (oxygen)"
|
||||
desc = "A tank of compressed oxygen for use as propulsion in zero-gravity areas. Use with caution."
|
||||
icon_state = "jetpack"
|
||||
item_state = "jetpack"
|
||||
|
||||
/obj/item/tank/jetpack/oxygen/harness
|
||||
name = "jet harness (oxygen)"
|
||||
desc = "A lightweight tactical harness, used by those who don't want to be weighed down by traditional jetpacks."
|
||||
icon_state = "jetpack-mini"
|
||||
item_state = "jetpack-mini"
|
||||
volume = 40
|
||||
throw_range = 7
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
|
||||
/obj/item/tank/jetpack/oxygen/captain
|
||||
name = "\improper Captain's jetpack"
|
||||
desc = "A compact, lightweight jetpack containing a high amount of compressed oxygen."
|
||||
icon_state = "jetpack-captain"
|
||||
item_state = "jetpack-captain"
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
volume = 90
|
||||
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF //steal objective items are hard to destroy.
|
||||
|
||||
/obj/item/tank/jetpack/oxygen/security
|
||||
name = "security jetpack (oxygen)"
|
||||
desc = "A tank of compressed oxygen for use as propulsion in zero-gravity areas by security forces."
|
||||
icon_state = "jetpack-sec"
|
||||
item_state = "jetpack-sec"
|
||||
|
||||
/obj/item/tank/jetpack/carbondioxide
|
||||
name = "jetpack (carbon dioxide)"
|
||||
desc = "A tank of compressed carbon dioxide for use as propulsion in zero-gravity areas. Painted black to indicate that it should not be used as a source for internals."
|
||||
icon_state = "jetpack-black"
|
||||
item_state = "jetpack-black"
|
||||
distribute_pressure = 0
|
||||
gas_type = "co2"
|
||||
|
||||
|
||||
/obj/item/tank/jetpack/suit
|
||||
name = "hardsuit jetpack upgrade"
|
||||
desc = "A modular, compact set of thrusters designed to integrate with a hardsuit. It is fueled by a tank inserted into the suit's storage compartment."
|
||||
origin_tech = "materials=4;magnets=4;engineering=5"
|
||||
icon_state = "jetpack-mining"
|
||||
item_state = "jetpack-black"
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
actions_types = list(/datum/action/item_action/toggle_jetpack, /datum/action/item_action/jetpack_stabilization)
|
||||
volume = 1
|
||||
slot_flags = null
|
||||
gas_type = null
|
||||
full_speed = FALSE
|
||||
var/datum/gas_mixture/temp_air_contents
|
||||
var/obj/item/tank/internals/tank = null
|
||||
|
||||
/obj/item/tank/jetpack/suit/New()
|
||||
..()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
temp_air_contents = air_contents
|
||||
|
||||
/obj/item/tank/jetpack/suit/attack_self()
|
||||
return
|
||||
|
||||
/obj/item/tank/jetpack/suit/cycle(mob/user)
|
||||
if(!istype(loc, /obj/item/clothing/suit/space/hardsuit))
|
||||
to_chat(user, "<span class='warning'>\The [src] must be connected to a hardsuit!</span>")
|
||||
return
|
||||
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(!istype(H.s_store, /obj/item/tank/internals))
|
||||
to_chat(user, "<span class='warning'>You need a tank in your suit storage!</span>")
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/tank/jetpack/suit/turn_on()
|
||||
if(!istype(loc, /obj/item/clothing/suit/space/hardsuit) || !ishuman(loc.loc))
|
||||
return
|
||||
var/mob/living/carbon/human/H = loc.loc
|
||||
tank = H.s_store
|
||||
air_contents = tank.air_contents
|
||||
START_PROCESSING(SSobj, src)
|
||||
..()
|
||||
|
||||
/obj/item/tank/jetpack/suit/turn_off()
|
||||
tank = null
|
||||
air_contents = temp_air_contents
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
..()
|
||||
|
||||
/obj/item/tank/jetpack/suit/process()
|
||||
if(!istype(loc, /obj/item/clothing/suit/space/hardsuit) || !ishuman(loc.loc))
|
||||
turn_off()
|
||||
return
|
||||
var/mob/living/carbon/human/H = loc.loc
|
||||
if(!tank || tank != H.s_store)
|
||||
turn_off()
|
||||
return
|
||||
..()
|
||||
|
||||
|
||||
//Return a jetpack that the mob can use
|
||||
//Back worn jetpacks, hardsuit internal packs, and so on.
|
||||
//Used in Process_Spacemove() and wherever you want to check for/get a jetpack
|
||||
|
||||
/mob/proc/get_jetpack()
|
||||
return
|
||||
|
||||
/mob/living/carbon/get_jetpack()
|
||||
var/obj/item/tank/jetpack/J = back
|
||||
if(istype(J))
|
||||
return J
|
||||
|
||||
/mob/living/carbon/human/get_jetpack()
|
||||
var/obj/item/tank/jetpack/J = ..()
|
||||
if(!istype(J) && istype(wear_suit, /obj/item/clothing/suit/space/hardsuit))
|
||||
var/obj/item/clothing/suit/space/hardsuit/C = wear_suit
|
||||
J = C.jetpack
|
||||
return J
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
|
||||
/obj/item/tank/internals/oxygen/New()
|
||||
..()
|
||||
air_contents.assert_gas("o2")
|
||||
ASSERT_GAS("o2", air_contents)
|
||||
air_contents.gases["o2"][MOLES] = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
|
||||
return
|
||||
|
||||
@@ -87,7 +87,7 @@
|
||||
|
||||
/obj/item/tank/internals/plasma/New()
|
||||
..()
|
||||
air_contents.assert_gas("plasma")
|
||||
ASSERT_GAS("plasma", air_contents)
|
||||
air_contents.gases["plasma"][MOLES] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
|
||||
return
|
||||
|
||||
@@ -105,8 +105,7 @@
|
||||
return ..()
|
||||
|
||||
/obj/item/tank/internals/plasma/full/New()
|
||||
..()
|
||||
air_contents.assert_gas("plasma")
|
||||
..() // Plasma asserted in parent
|
||||
air_contents.gases["plasma"][MOLES] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
|
||||
return
|
||||
|
||||
@@ -125,13 +124,12 @@
|
||||
|
||||
/obj/item/tank/internals/plasmaman/New()
|
||||
..()
|
||||
air_contents.assert_gas("plasma")
|
||||
ASSERT_GAS("plasma", air_contents)
|
||||
air_contents.gases["plasma"][MOLES] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
|
||||
return
|
||||
|
||||
/obj/item/tank/internals/plasmaman/full/New()
|
||||
..()
|
||||
air_contents.assert_gas("plasma")
|
||||
..() // Plasma asserted in parent
|
||||
air_contents.gases["plasma"][MOLES] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
|
||||
return
|
||||
|
||||
@@ -145,8 +143,7 @@
|
||||
w_class = WEIGHT_CLASS_SMALL //thanks i forgot this
|
||||
|
||||
/obj/item/tank/internals/plasmaman/belt/full/New()
|
||||
..()
|
||||
air_contents.assert_gas("plasma")
|
||||
..() // Plasma asserted in parent
|
||||
air_contents.gases["plasma"][MOLES] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
|
||||
return
|
||||
|
||||
@@ -169,7 +166,7 @@
|
||||
|
||||
/obj/item/tank/internals/emergency_oxygen/New()
|
||||
..()
|
||||
air_contents.assert_gas("o2")
|
||||
ASSERT_GAS("o2", air_contents)
|
||||
air_contents.gases["o2"][MOLES] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
|
||||
return
|
||||
|
||||
|
||||
@@ -1022,8 +1022,8 @@
|
||||
throwforce = 12 //pelt your enemies to death with lumps of snow
|
||||
|
||||
/obj/item/toy/snowball/afterattack(atom/target as mob|obj|turf|area, mob/user)
|
||||
user.drop_item()
|
||||
src.throw_at(target, throw_range, throw_speed)
|
||||
if(user.dropItemToGround(src))
|
||||
throw_at(target, throw_range, throw_speed)
|
||||
|
||||
/obj/item/toy/snowball/throw_impact(atom/hit_atom)
|
||||
if(!..())
|
||||
@@ -1041,8 +1041,8 @@
|
||||
w_class = WEIGHT_CLASS_BULKY //Stops people from hiding it in their bags/pockets
|
||||
|
||||
/obj/item/toy/beach_ball/afterattack(atom/target as mob|obj|turf|area, mob/user)
|
||||
user.drop_item()
|
||||
src.throw_at(target, throw_range, throw_speed)
|
||||
if(user.dropItemToGround(src))
|
||||
throw_at(target, throw_range, throw_speed)
|
||||
|
||||
/*
|
||||
* Xenomorph action figure
|
||||
|
||||
+107
-107
@@ -1,111 +1,111 @@
|
||||
/obj/structure
|
||||
icon = 'icons/obj/structures.dmi'
|
||||
pressure_resistance = 8
|
||||
max_integrity = 300
|
||||
var/climb_time = 20
|
||||
var/climb_stun = 20
|
||||
var/climbable = FALSE
|
||||
var/mob/living/structureclimber
|
||||
var/broken = 0 //similar to machinery's stat BROKEN
|
||||
|
||||
/obj/structure/Initialize()
|
||||
if (!armor)
|
||||
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 50)
|
||||
. = ..()
|
||||
if(smooth)
|
||||
queue_smooth(src)
|
||||
queue_smooth_neighbors(src)
|
||||
icon_state = ""
|
||||
/obj/structure
|
||||
icon = 'icons/obj/structures.dmi'
|
||||
pressure_resistance = 8
|
||||
max_integrity = 300
|
||||
var/climb_time = 20
|
||||
var/climb_stun = 20
|
||||
var/climbable = FALSE
|
||||
var/mob/living/structureclimber
|
||||
var/broken = 0 //similar to machinery's stat BROKEN
|
||||
|
||||
/obj/structure/Initialize()
|
||||
if (!armor)
|
||||
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 50)
|
||||
. = ..()
|
||||
if(smooth)
|
||||
queue_smooth(src)
|
||||
queue_smooth_neighbors(src)
|
||||
icon_state = ""
|
||||
GLOB.cameranet.updateVisibility(src)
|
||||
|
||||
/obj/structure/Destroy()
|
||||
|
||||
/obj/structure/Destroy()
|
||||
GLOB.cameranet.updateVisibility(src)
|
||||
if(smooth)
|
||||
queue_smooth_neighbors(src)
|
||||
return ..()
|
||||
|
||||
/obj/structure/attack_hand(mob/user)
|
||||
. = ..()
|
||||
add_fingerprint(user)
|
||||
if(structureclimber && structureclimber != user)
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
user.do_attack_animation(src)
|
||||
structureclimber.Knockdown(40)
|
||||
structureclimber.visible_message("<span class='warning'>[structureclimber.name] has been knocked off the [src]", "You're knocked off the [src]!", "You see [structureclimber.name] get knocked off the [src]</span>")
|
||||
interact(user)
|
||||
|
||||
/obj/structure/interact(mob/user)
|
||||
ui_interact(user)
|
||||
|
||||
/obj/structure/ui_act(action, params)
|
||||
..()
|
||||
add_fingerprint(usr)
|
||||
|
||||
/obj/structure/MouseDrop_T(atom/movable/O, mob/user)
|
||||
. = ..()
|
||||
if(!climbable)
|
||||
return
|
||||
if(user == O && iscarbon(O))
|
||||
if(user.canmove)
|
||||
climb_structure(user)
|
||||
return
|
||||
if ((!( istype(O, /obj/item/weapon) ) || user.get_active_held_item() != O))
|
||||
return
|
||||
if(iscyborg(user))
|
||||
return
|
||||
if(!user.drop_item())
|
||||
return
|
||||
if (O.loc != src.loc)
|
||||
step(O, get_dir(O, src))
|
||||
return
|
||||
|
||||
/obj/structure/proc/do_climb(atom/movable/A)
|
||||
if(climbable)
|
||||
if(smooth)
|
||||
queue_smooth_neighbors(src)
|
||||
return ..()
|
||||
|
||||
/obj/structure/attack_hand(mob/user)
|
||||
. = ..()
|
||||
add_fingerprint(user)
|
||||
if(structureclimber && structureclimber != user)
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
user.do_attack_animation(src)
|
||||
structureclimber.Knockdown(40)
|
||||
structureclimber.visible_message("<span class='warning'>[structureclimber.name] has been knocked off the [src]", "You're knocked off the [src]!", "You see [structureclimber.name] get knocked off the [src]</span>")
|
||||
interact(user)
|
||||
|
||||
/obj/structure/interact(mob/user)
|
||||
ui_interact(user)
|
||||
|
||||
/obj/structure/ui_act(action, params)
|
||||
..()
|
||||
add_fingerprint(usr)
|
||||
|
||||
/obj/structure/MouseDrop_T(atom/movable/O, mob/user)
|
||||
. = ..()
|
||||
if(!climbable)
|
||||
return
|
||||
if(user == O && iscarbon(O))
|
||||
if(user.canmove)
|
||||
climb_structure(user)
|
||||
return
|
||||
if ((!( istype(O, /obj/item) ) || user.get_active_held_item() != O))
|
||||
return
|
||||
if(iscyborg(user))
|
||||
return
|
||||
if(!user.drop_all_held_items())
|
||||
return
|
||||
if (O.loc != src.loc)
|
||||
step(O, get_dir(O, src))
|
||||
return
|
||||
|
||||
/obj/structure/proc/do_climb(atom/movable/A)
|
||||
if(climbable)
|
||||
density = FALSE
|
||||
. = step(A,get_dir(A,src.loc))
|
||||
. = step(A,get_dir(A,src.loc))
|
||||
density = TRUE
|
||||
|
||||
/obj/structure/proc/climb_structure(mob/living/user)
|
||||
src.add_fingerprint(user)
|
||||
user.visible_message("<span class='warning'>[user] starts climbing onto [src].</span>", \
|
||||
"<span class='notice'>You start climbing onto [src]...</span>")
|
||||
var/adjusted_climb_time = climb_time
|
||||
if(user.restrained()) //climbing takes twice as long when restrained.
|
||||
adjusted_climb_time *= 2
|
||||
if(isalien(user))
|
||||
adjusted_climb_time *= 0.25 //aliens are terrifyingly fast
|
||||
structureclimber = user
|
||||
if(do_mob(user, user, adjusted_climb_time))
|
||||
if(src.loc) //Checking if structure has been destroyed
|
||||
if(do_climb(user))
|
||||
user.visible_message("<span class='warning'>[user] climbs onto [src].</span>", \
|
||||
"<span class='notice'>You climb onto [src].</span>")
|
||||
add_logs(user, src, "climbed onto")
|
||||
if(climb_stun)
|
||||
user.Stun(climb_stun)
|
||||
. = 1
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You fail to climb onto [src].</span>")
|
||||
structureclimber = null
|
||||
|
||||
/obj/structure/examine(mob/user)
|
||||
..()
|
||||
if(!(resistance_flags & INDESTRUCTIBLE))
|
||||
if(resistance_flags & ON_FIRE)
|
||||
to_chat(user, "<span class='warning'>It's on fire!</span>")
|
||||
if(broken)
|
||||
to_chat(user, "<span class='notice'>It appears to be broken.</span>")
|
||||
var/examine_status = examine_status(user)
|
||||
if(examine_status)
|
||||
to_chat(user, examine_status)
|
||||
|
||||
/obj/structure/proc/examine_status(mob/user) //An overridable proc, mostly for falsewalls.
|
||||
var/healthpercent = (obj_integrity/max_integrity) * 100
|
||||
switch(healthpercent)
|
||||
if(50 to 99)
|
||||
return "It looks slightly damaged."
|
||||
if(25 to 50)
|
||||
return "It appears heavily damaged."
|
||||
if(0 to 25)
|
||||
if(!broken)
|
||||
return "<span class='warning'>It's falling apart!</span>"
|
||||
|
||||
/obj/structure/proc/climb_structure(mob/living/user)
|
||||
src.add_fingerprint(user)
|
||||
user.visible_message("<span class='warning'>[user] starts climbing onto [src].</span>", \
|
||||
"<span class='notice'>You start climbing onto [src]...</span>")
|
||||
var/adjusted_climb_time = climb_time
|
||||
if(user.restrained()) //climbing takes twice as long when restrained.
|
||||
adjusted_climb_time *= 2
|
||||
if(isalien(user))
|
||||
adjusted_climb_time *= 0.25 //aliens are terrifyingly fast
|
||||
structureclimber = user
|
||||
if(do_mob(user, user, adjusted_climb_time))
|
||||
if(src.loc) //Checking if structure has been destroyed
|
||||
if(do_climb(user))
|
||||
user.visible_message("<span class='warning'>[user] climbs onto [src].</span>", \
|
||||
"<span class='notice'>You climb onto [src].</span>")
|
||||
add_logs(user, src, "climbed onto")
|
||||
if(climb_stun)
|
||||
user.Stun(climb_stun)
|
||||
. = 1
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You fail to climb onto [src].</span>")
|
||||
structureclimber = null
|
||||
|
||||
/obj/structure/examine(mob/user)
|
||||
..()
|
||||
if(!(resistance_flags & INDESTRUCTIBLE))
|
||||
if(resistance_flags & ON_FIRE)
|
||||
to_chat(user, "<span class='warning'>It's on fire!</span>")
|
||||
if(broken)
|
||||
to_chat(user, "<span class='notice'>It appears to be broken.</span>")
|
||||
var/examine_status = examine_status(user)
|
||||
if(examine_status)
|
||||
to_chat(user, examine_status)
|
||||
|
||||
/obj/structure/proc/examine_status(mob/user) //An overridable proc, mostly for falsewalls.
|
||||
var/healthpercent = (obj_integrity/max_integrity) * 100
|
||||
switch(healthpercent)
|
||||
if(50 to 99)
|
||||
return "It looks slightly damaged."
|
||||
if(25 to 50)
|
||||
return "It appears heavily damaged."
|
||||
if(0 to 25)
|
||||
if(!broken)
|
||||
return "<span class='warning'>It's falling apart!</span>"
|
||||
|
||||
@@ -58,14 +58,14 @@
|
||||
playsound(src.loc, W.usesound, 50, 1)
|
||||
deconstruct()
|
||||
else if(istype(W, /obj/item/assembly/shock_kit))
|
||||
if(!user.drop_item())
|
||||
if(!user.temporarilyRemoveItemFromInventory(W))
|
||||
return
|
||||
var/obj/item/assembly/shock_kit/SK = W
|
||||
var/obj/structure/chair/e_chair/E = new /obj/structure/chair/e_chair(src.loc)
|
||||
playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1)
|
||||
E.setDir(dir)
|
||||
E.part = SK
|
||||
SK.loc = E
|
||||
SK.forceMove(E)
|
||||
SK.master = E
|
||||
qdel(src)
|
||||
else
|
||||
|
||||
@@ -27,7 +27,8 @@ LINEN BINS
|
||||
..()
|
||||
|
||||
/obj/item/bedsheet/attack_self(mob/user)
|
||||
user.drop_item()
|
||||
if(!user.dropItemToGround(src))
|
||||
return
|
||||
if(layer == initial(layer))
|
||||
layer = ABOVE_MOB_LAYER
|
||||
to_chat(user, "<span class='notice'>You cover yourself with [src].</span>")
|
||||
@@ -275,18 +276,16 @@ LINEN BINS
|
||||
|
||||
/obj/structure/bedsheetbin/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/bedsheet))
|
||||
if(!user.drop_item())
|
||||
if(!user.transferItemToLoc(I, src))
|
||||
return
|
||||
I.loc = src
|
||||
sheets.Add(I)
|
||||
amount++
|
||||
to_chat(user, "<span class='notice'>You put [I] in [src].</span>")
|
||||
update_icon()
|
||||
else if(amount && !hidden && I.w_class < WEIGHT_CLASS_BULKY) //make sure there's sheets to hide it among, make sure nothing else is hidden in there.
|
||||
if(!user.drop_item())
|
||||
if(!user.transferItemToLoc(I, src))
|
||||
to_chat(user, "<span class='warning'>\The [I] is stuck to your hand, you cannot hide it among the sheets!</span>")
|
||||
return
|
||||
I.loc = src
|
||||
hidden = I
|
||||
to_chat(user, "<span class='notice'>You hide [I] among the sheets.</span>")
|
||||
|
||||
|
||||
@@ -229,8 +229,7 @@
|
||||
"<span class='notice'>You cut \the [src] apart with \the [W].</span>")
|
||||
deconstruct(TRUE)
|
||||
return 0
|
||||
if(user.drop_item()) // so we put in unlit welder too
|
||||
W.forceMove(loc)
|
||||
if(user.transferItemToLoc(W, drop_location())) // so we put in unlit welder too
|
||||
return 1
|
||||
else if(istype(W, /obj/item/weldingtool) && can_weld_shut)
|
||||
var/obj/item/weldingtool/WT = W
|
||||
|
||||
@@ -602,10 +602,9 @@
|
||||
if(do_after(user, 40, target = src))
|
||||
if( src.state != 1 )
|
||||
return
|
||||
if(!user.drop_item())
|
||||
if(!user.transferItemToLoc(W, src))
|
||||
return
|
||||
|
||||
W.loc = src
|
||||
to_chat(user, "<span class='notice'>You install the airlock electronics.</span>")
|
||||
src.state = 2
|
||||
src.name = "near finished airlock assembly"
|
||||
|
||||
@@ -54,9 +54,8 @@
|
||||
return
|
||||
if(istype(I, /obj/item/extinguisher))
|
||||
if(!stored_extinguisher && opened)
|
||||
if(!user.drop_item())
|
||||
if(!user.transferItemToLoc(I, src))
|
||||
return
|
||||
contents += I
|
||||
stored_extinguisher = I
|
||||
to_chat(user, "<span class='notice'>You place [I] in [src].</span>")
|
||||
update_icon()
|
||||
|
||||
@@ -53,10 +53,9 @@
|
||||
if(F.wielded)
|
||||
to_chat(user, "<span class='warning'>Unwield the [F.name] first.</span>")
|
||||
return
|
||||
if(!user.drop_item())
|
||||
if(!user.transferItemToLoc(F, src))
|
||||
return
|
||||
fireaxe = F
|
||||
F.forceMove(src)
|
||||
to_chat(user, "<span class='caution'>You place the [F.name] back in the [name].</span>")
|
||||
update_icon()
|
||||
return
|
||||
|
||||
@@ -259,9 +259,8 @@
|
||||
else if(istype(W, /obj/item/pipe))
|
||||
var/obj/item/pipe/P = W
|
||||
if (P.pipe_type in list(0, 1, 5)) //simple pipes, simple bends, and simple manifolds.
|
||||
if(!user.drop_item())
|
||||
if(!user.transferItemToLoc(P, drop_location()))
|
||||
return
|
||||
P.loc = src.loc
|
||||
to_chat(user, "<span class='notice'>You fit the pipe into \the [src].</span>")
|
||||
else
|
||||
return ..()
|
||||
|
||||
@@ -39,9 +39,8 @@
|
||||
return
|
||||
if(istype(I, gun_category) && open)
|
||||
if(LAZYLEN(contents) < capacity)
|
||||
if(!user.drop_item())
|
||||
if(!user.transferItemToLoc(I, src))
|
||||
return
|
||||
I.forceMove(src)
|
||||
to_chat(user, "<span class='notice'>You place [I] in [src].</span>")
|
||||
update_icon()
|
||||
else
|
||||
|
||||
@@ -32,9 +32,8 @@
|
||||
return 1
|
||||
|
||||
/obj/structure/janitorialcart/proc/put_in_cart(obj/item/I, mob/user)
|
||||
if(!user.drop_item())
|
||||
if(!user.transferItemToLoc(I, src))
|
||||
return
|
||||
I.loc = src
|
||||
updateUsrDialog()
|
||||
to_chat(user, "<span class='notice'>You put [I] into [src].</span>")
|
||||
return
|
||||
|
||||
@@ -159,10 +159,9 @@ FLOOR SAFES
|
||||
. = 1 //no afterattack
|
||||
if(I.w_class + space <= maxspace)
|
||||
space += I.w_class
|
||||
if(!user.drop_item())
|
||||
if(!user.transferItemToLoc(I, src))
|
||||
to_chat(user, "<span class='warning'>\The [I] is stuck to your hand, you cannot put it in the safe!</span>")
|
||||
return
|
||||
I.forceMove(src)
|
||||
to_chat(user, "<span class='notice'>You put [I] in [src].</span>")
|
||||
updateUsrDialog()
|
||||
return
|
||||
|
||||
@@ -104,7 +104,6 @@
|
||||
"<span class='notice'>You attach the sign to [T].</span>")
|
||||
playsound(T, 'sound/items/deconstruct.ogg', 50, 1)
|
||||
new sign_path(T)
|
||||
user.drop_item()
|
||||
qdel(src)
|
||||
else
|
||||
return ..()
|
||||
|
||||
@@ -131,8 +131,7 @@
|
||||
// If the tray IS empty, continue on (tray will be placed on the table like other items)
|
||||
|
||||
if(user.a_intent != INTENT_HARM && !(I.flags_1 & ABSTRACT_1))
|
||||
if(user.drop_item())
|
||||
I.Move(loc)
|
||||
if(user.transferItemToLoc(I, drop_location()))
|
||||
var/list/click_params = params2list(params)
|
||||
//Center the icon where the user clicked.
|
||||
if(!click_params || !click_params["icon-x"] || !click_params["icon-y"])
|
||||
@@ -439,7 +438,7 @@
|
||||
/obj/structure/rack/MouseDrop_T(obj/O, mob/user)
|
||||
if ((!( istype(O, /obj/item) ) || user.get_active_held_item() != O))
|
||||
return
|
||||
if(!user.drop_item())
|
||||
if(!user.dropItemToGround(O))
|
||||
return
|
||||
if(O.loc != src.loc)
|
||||
step(O, get_dir(O, src))
|
||||
@@ -452,8 +451,7 @@
|
||||
return
|
||||
if(user.a_intent == INTENT_HARM)
|
||||
return ..()
|
||||
if(user.drop_item())
|
||||
W.Move(loc)
|
||||
if(user.transferItemToLoc(W, drop_location()))
|
||||
return 1
|
||||
|
||||
/obj/structure/rack/attack_paw(mob/living/user)
|
||||
@@ -516,7 +514,7 @@
|
||||
building = TRUE
|
||||
to_chat(user, "<span class='notice'>You start constructing a rack...</span>")
|
||||
if(do_after(user, 50, target = user, progress=TRUE))
|
||||
if(!user.drop_item())
|
||||
if(!user.temporarilyRemoveItemFromInventory(src))
|
||||
return
|
||||
var/obj/structure/rack/R = new /obj/structure/rack(user.loc)
|
||||
user.visible_message("<span class='notice'>[user] assembles \a [R].\
|
||||
|
||||
@@ -62,9 +62,8 @@
|
||||
to_chat(user, "<span class='notice'>[src] can't hold any more of [I].</span>")
|
||||
return
|
||||
|
||||
if(!user.drop_item())
|
||||
if(!user.transferItemToLoc(I, src))
|
||||
return
|
||||
I.loc = src
|
||||
to_chat(user, "<span class='notice'>You put [I] in [src].</span>")
|
||||
update_icon()
|
||||
|
||||
|
||||
@@ -1,55 +1,54 @@
|
||||
/obj/structure/target_stake
|
||||
name = "target stake"
|
||||
desc = "A thin platform with negatively-magnetized wheels."
|
||||
icon = 'icons/obj/objects.dmi'
|
||||
icon_state = "target_stake"
|
||||
/obj/structure/target_stake
|
||||
name = "target stake"
|
||||
desc = "A thin platform with negatively-magnetized wheels."
|
||||
icon = 'icons/obj/objects.dmi'
|
||||
icon_state = "target_stake"
|
||||
density = TRUE
|
||||
flags_1 = CONDUCT_1
|
||||
var/obj/item/target/pinned_target
|
||||
|
||||
/obj/structure/target_stake/Destroy()
|
||||
if(pinned_target)
|
||||
pinned_target.nullPinnedLoc()
|
||||
return ..()
|
||||
|
||||
/obj/structure/target_stake/proc/nullPinnedTarget()
|
||||
pinned_target = null
|
||||
|
||||
/obj/structure/target_stake/Move()
|
||||
..()
|
||||
if(pinned_target)
|
||||
pinned_target.loc = loc
|
||||
|
||||
/obj/structure/target_stake/attackby(obj/item/target/T, mob/user)
|
||||
if(pinned_target)
|
||||
return
|
||||
if(istype(T) && user.drop_item())
|
||||
pinned_target = T
|
||||
T.pinnedLoc = src
|
||||
var/obj/item/target/pinned_target
|
||||
|
||||
/obj/structure/target_stake/Destroy()
|
||||
if(pinned_target)
|
||||
pinned_target.nullPinnedLoc()
|
||||
return ..()
|
||||
|
||||
/obj/structure/target_stake/proc/nullPinnedTarget()
|
||||
pinned_target = null
|
||||
|
||||
/obj/structure/target_stake/Move()
|
||||
..()
|
||||
if(pinned_target)
|
||||
pinned_target.loc = loc
|
||||
|
||||
/obj/structure/target_stake/attackby(obj/item/target/T, mob/user)
|
||||
if(pinned_target)
|
||||
return
|
||||
if(istype(T) && user.transferItemToLoc(T, drop_location()))
|
||||
pinned_target = T
|
||||
T.pinnedLoc = src
|
||||
T.density = TRUE
|
||||
T.layer = OBJ_LAYER + 0.01
|
||||
T.loc = loc
|
||||
to_chat(user, "<span class='notice'>You slide the target into the stake.</span>")
|
||||
|
||||
/obj/structure/target_stake/attack_hand(mob/user)
|
||||
if(pinned_target)
|
||||
removeTarget(user)
|
||||
|
||||
/obj/structure/target_stake/proc/removeTarget(mob/user)
|
||||
pinned_target.layer = OBJ_LAYER
|
||||
pinned_target.loc = user.loc
|
||||
pinned_target.nullPinnedLoc()
|
||||
nullPinnedTarget()
|
||||
if(ishuman(user))
|
||||
if(!user.get_active_held_item())
|
||||
user.put_in_hands(pinned_target)
|
||||
to_chat(user, "<span class='notice'>You take the target out of the stake.</span>")
|
||||
else
|
||||
pinned_target.loc = get_turf(user)
|
||||
to_chat(user, "<span class='notice'>You take the target out of the stake.</span>")
|
||||
|
||||
/obj/structure/target_stake/bullet_act(obj/item/projectile/P)
|
||||
if(pinned_target)
|
||||
pinned_target.bullet_act(P)
|
||||
else
|
||||
..()
|
||||
T.layer = OBJ_LAYER + 0.01
|
||||
to_chat(user, "<span class='notice'>You slide the target into the stake.</span>")
|
||||
|
||||
/obj/structure/target_stake/attack_hand(mob/user)
|
||||
if(pinned_target)
|
||||
removeTarget(user)
|
||||
|
||||
/obj/structure/target_stake/proc/removeTarget(mob/user)
|
||||
pinned_target.layer = OBJ_LAYER
|
||||
pinned_target.loc = user.loc
|
||||
pinned_target.nullPinnedLoc()
|
||||
nullPinnedTarget()
|
||||
if(ishuman(user))
|
||||
if(!user.get_active_held_item())
|
||||
user.put_in_hands(pinned_target)
|
||||
to_chat(user, "<span class='notice'>You take the target out of the stake.</span>")
|
||||
else
|
||||
pinned_target.loc = get_turf(user)
|
||||
to_chat(user, "<span class='notice'>You take the target out of the stake.</span>")
|
||||
|
||||
/obj/structure/target_stake/bullet_act(obj/item/projectile/P)
|
||||
if(pinned_target)
|
||||
pinned_target.bullet_act(P)
|
||||
else
|
||||
..()
|
||||
|
||||
@@ -88,10 +88,9 @@
|
||||
if(w_items + I.w_class > WEIGHT_CLASS_HUGE)
|
||||
to_chat(user, "<span class='warning'>The cistern is full!</span>")
|
||||
return
|
||||
if(!user.drop_item())
|
||||
if(!user.transferItemToLoc(I, src))
|
||||
to_chat(user, "<span class='warning'>\The [I] is stuck to your hand, you cannot put it in the cistern!</span>")
|
||||
return
|
||||
I.loc = src
|
||||
w_items += I.w_class
|
||||
to_chat(user, "<span class='notice'>You carefully place [I] into the cistern.</span>")
|
||||
|
||||
@@ -173,10 +172,9 @@
|
||||
if(I.w_class > 1)
|
||||
to_chat(user, "<span class='warning'>[I] is too large for the drain enclosure.</span>")
|
||||
return
|
||||
if(!user.drop_item())
|
||||
if(!user.transferItemToLoc(I, src))
|
||||
to_chat(user, "<span class='warning'>\[I] is stuck to your hand, you cannot put it in the drain enclosure!</span>")
|
||||
return
|
||||
I.forceMove(src)
|
||||
hiddenitem = I
|
||||
to_chat(user, "<span class='notice'>You place [I] into the drain enclosure.</span>")
|
||||
|
||||
|
||||
@@ -208,11 +208,10 @@
|
||||
|
||||
//Adding airlock electronics for access. Step 6 complete.
|
||||
else if(istype(W, /obj/item/electronics/airlock))
|
||||
if(!user.drop_item())
|
||||
if(!user.transferItemToLoc(W, src))
|
||||
return
|
||||
playsound(loc, W.usesound, 100, 1)
|
||||
user.visible_message("[user] installs the electronics into the airlock assembly.", "<span class='notice'>You start to install electronics into the airlock assembly...</span>")
|
||||
W.loc = src
|
||||
|
||||
if(do_after(user, 40, target = src))
|
||||
if(!src || electronics)
|
||||
|
||||
@@ -72,7 +72,7 @@
|
||||
if(..())
|
||||
return
|
||||
if(istype(C, /obj/item/light/bulb)) //only for light tiles
|
||||
if(state && user.drop_item())
|
||||
if(state && user.temporarilyRemoveItemFromInventory(C))
|
||||
qdel(C)
|
||||
state = 0 //fixing it by bashing it with a light bulb, fun eh?
|
||||
update_icon()
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user