Linter Introduction + Cleanup (#8085)

* Adds linter defines to repo.

* Uncomments linter defines already in the code.

* Resolves unreachable code linter errors.

* Nukes decade+ old syndie specops code except for computer since that's mapped in?????

* Resolves procs has no parent linter error.

* Proc signature fixes

* Bad comments

* "In" danger

* Type safety

* Implied nested list abuse

* Top level ..() usage

* Sleepy coder typos

* Invalid kwargs calls

* Pointless returns

* Linter hacks (see full message)

Byond doesn't care and it has no effect but linter doesn't like var/proc
for holding references to procs, despite that it's valid byond code.

Also, the linter seems to have serious issues figuring out relative
proc names. This commit is a sort of take-it-or-leave-it thing. It's not
required, it just cuts down on warnings, but this code is valid DM code.

* WHATEVER THIS IS

* Trick dreamchecker linter into ignoring this file's sins in it's weird use of vars

* Fix list decoration syntax - Its a list, not list of lists

- To declare that a var is a list you can `var/list/blah = list()` syntax or the `var/blah[0]` syntax.  Both do exactly the same thing. But if you do `var/list/blah[0]` that is just like doing `var/list/list/blah = list()`

* Hopefully stops the ai holder subtype folder from going quantum and sometimes changes capitalization over time, and incidentally causing 20+ linter errors.

* Fixes unwrapped negated object in list linter error.

* Resolves colon-like list accessing linter error.

* Turns linter on in linter config.

* Fixes closet indentation properly and cleans up suit storage unit switch.

Co-authored-by: Aronai Sieyes <arokha@arokha.com>
Co-authored-by: Leshana <Leshana@users.noreply.github.com>
This commit is contained in:
Neerti
2021-05-25 23:17:26 -04:00
committed by GitHub
parent 9667dad5ba
commit fdabe51ee8
201 changed files with 3551 additions and 3824 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -242,7 +242,6 @@
M.apply_damage(0.5 * damage, BRUTE, BP_R_ARM)
blood_splatter(src, M, 1)
..()
/mob/living/bot/mulebot/relaymove(var/mob/user, var/direction)
if(load == user)

View File

@@ -219,12 +219,4 @@
if(client && !client.adminobs)
reset_view(null)
return 1
if (stat != 2)
if (machine)
if (machine.check_eye(src) < 0)
reset_view(null)
else
if(client && !client.adminobs)
reset_view(null)
return 1

View File

@@ -141,7 +141,6 @@
set name = "Attach Limb"
set category = "Object"
set desc = "Attach a replacement limb."
set usr = src
var/obj/item/organ/external/E = get_active_hand()
if(!check_can_attach_modular_limb(E))
@@ -171,7 +170,6 @@
set name = "Remove Limb"
set category = "Object"
set desc = "Detach one of your limbs."
set usr = src
var/list/detachable_limbs = get_modular_limbs(return_first_found = FALSE, validate_proc = /obj/item/organ/external/proc/can_remove_modular_limb)
if(!length(detachable_limbs))

View File

@@ -166,7 +166,7 @@
if(istype(back, /obj/item/weapon/tank/jetpack))
return back
else if(istype(rig))
for(var/obj/item/rig_module/maneuvering_jets.module in rig.installed_modules)
for(var/obj/item/rig_module/maneuvering_jets/module in rig.installed_modules)
return module.jets
/mob/living/carbon/human/Process_Spacemove(var/check_drift = 0)

View File

@@ -19,7 +19,7 @@
else
var/list/datum/sprite_accessory/hair/valid_hairstyles = list()
for(var/hair_string in hair_styles_list)
var/list/datum/sprite_accessory/hair/test = hair_styles_list[hair_string]
var/datum/sprite_accessory/hair/test = hair_styles_list[hair_string]
if(test.flags & HAIR_TIEABLE)
valid_hairstyles.Add(hair_string)
selected_string = input("Select a new hairstyle", "Your hairstyle", hair_style) as null|anything in valid_hairstyles

View File

@@ -67,7 +67,6 @@
/mob/living/carbon/human/proc/can_break_straight_jacket()
if((HULK in mutations) || species.can_shred(src,1))
return 1
return ..()
/mob/living/carbon/human/proc/break_straight_jacket()
visible_message(

View File

@@ -646,7 +646,8 @@
var/obj/mecha/M = loc
loc_temp = M.return_temperature()
else if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell))
loc_temp = loc:air_contents.temperature
var/obj/machinery/atmospherics/unary/cryo_cell/cc = loc
loc_temp = cc.air_contents.temperature
else
loc_temp = environment.temperature

View File

@@ -145,15 +145,13 @@
P.old_style_target(A)
P.fire()
playsound(src, 'sound/weapons/pierce.ogg', 25, 0)
else
..()
/mob/living/carbon/human/proc/corrosive_acid(O as obj|turf in oview(1)) //If they right click to corrode, an error will flash if its an invalid target./N
set name = "Corrosive Acid (200)"
set desc = "Drench an object in acid, destroying it over time."
set category = "Abilities"
if(!O in oview(1))
if(!(O in oview(1)))
to_chat(src, "<span class='alium'>[O] is too far away.</span>")
return

View File

@@ -533,7 +533,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
standing.underlays += underlay
for(var/mut in mutations)
if(LASER)
if(mut == LASER)
standing.overlays += "lasereyes_s" //TODO
overlays_standing[MUTATIONS_LAYER] = standing

View File

@@ -229,32 +229,33 @@
/datum/inventory_panel/tgui_data(mob/user, datum/tgui/ui, datum/tgui_state/state)
var/list/data = ..()
data["slots"] = list()
data["slots"].Add(list(list(
var/list/slots = list()
slots.Add(list(list(
"name" = "Head (Mask)",
"item" = host.wear_mask,
"act" = "mask",
)))
data["slots"].Add(list(list(
slots.Add(list(list(
"name" = "Left Hand",
"item" = host.l_hand,
"act" = "l_hand",
)))
data["slots"].Add(list(list(
slots.Add(list(list(
"name" = "Right Hand",
"item" = host.r_hand,
"act" = "r_hand",
)))
data["slots"].Add(list(list(
slots.Add(list(list(
"name" = "Back",
"item" = host.back,
"act" = "back",
)))
data["slots"].Add(list(list(
slots.Add(list(list(
"name" = "Pockets",
"item" = "Empty Pockets",
"act" = "pockets",
)))
data["slots"] = slots
data["internals"] = host.internals
data["internalsValid"] = istype(host.wear_mask, /obj/item/clothing/mask) && istype(host.back, /obj/item/weapon/tank)
@@ -300,33 +301,37 @@
if(istype(H.w_uniform, /obj/item/clothing/under))
suit = H.w_uniform
data["slots"] = list()
var/list/slots = list()
for(var/entry in H.species.hud.gear)
var/list/slot_ref = H.species.hud.gear[entry]
if((slot_ref["slot"] in list(slot_l_store, slot_r_store)))
continue
var/obj/item/thing_in_slot = H.get_equipped_item(slot_ref["slot"])
data["slots"].Add(list(list(
slots.Add(list(list(
"name" = slot_ref["name"],
"item" = thing_in_slot,
"act" = "targetSlot",
"params" = list("slot" = slot_ref["slot"]),
)))
data["slots"] = slots
data["specialSlots"] = list()
var/list/specialSlots = list()
if(H.species.hud.has_hands)
data["specialSlots"].Add(list(list(
specialSlots.Add(list(list(
"name" = "Left Hand",
"item" = H.l_hand,
"act" = "targetSlot",
"params" = list("slot" = slot_l_hand),
)))
data["specialSlots"].Add(list(list(
specialSlots.Add(list(list(
"name" = "Right Hand",
"item" = H.r_hand,
"act" = "targetSlot",
"params" = list("slot" = slot_r_hand),
)))
data["specialSlots"] = specialSlots
data["internals"] = H.internals
data["internalsValid"] = (istype(H.wear_mask, /obj/item/clothing/mask) || istype(H.head, /obj/item/clothing/head/helmet/space)) && (istype(H.back, /obj/item/weapon/tank) || istype(H.belt, /obj/item/weapon/tank) || istype(H.s_store, /obj/item/weapon/tank))

File diff suppressed because it is too large Load Diff

View File

@@ -34,14 +34,14 @@
/obj/machinery/computer/drone_control/tgui_data(mob/user)
var/list/data = list()
data["drones"] = list()
var/list/drones = list()
for(var/mob/living/silicon/robot/drone/D in mob_list)
if(D.z != z)
continue
if(D.foreign_droid)
continue
data["drones"].Add(list(list(
drones.Add(list(list(
"name" = D.real_name,
"active" = D.stat != 2,
"charge" = D.cell.charge,
@@ -49,6 +49,7 @@
"loc" = "[get_area(D)]",
"ref" = "\ref[D]",
)))
data["drones"] = drones
data["fabricator"] = dronefab
data["fabPower"] = dronefab?.produce_drones

View File

@@ -95,7 +95,6 @@
return 1
else
return 0
updateicon()
// This one takes an object's type instead of an instance, as above.
/mob/living/silicon/robot/proc/has_active_type(var/type_to_compare)

View File

@@ -1,419 +1,419 @@
/mob/living/silicon
gender = NEUTER
voice_name = "synthesized voice"
var/syndicate = 0
var/const/MAIN_CHANNEL = "Main Frequency"
var/lawchannel = MAIN_CHANNEL // Default channel on which to state laws
var/list/stating_laws = list()// Channels laws are currently being stated on
var/obj/item/device/radio/common_radio
has_huds = TRUE
var/list/speech_synthesizer_langs = list() //which languages can be vocalized by the speech synthesizer
//Used in say.dm.
var/speak_statement = "states"
var/speak_exclamation = "declares"
var/speak_query = "queries"
var/pose //Yes, now AIs can pose too.
var/obj/item/device/camera/siliconcam/aiCamera = null //photography
var/local_transmit //If set, can only speak to others of the same type within a short range.
var/next_alarm_notice
var/list/datum/alarm/queued_alarms = new()
var/list/access_rights
var/obj/item/weapon/card/id/idcard
var/idcard_type = /obj/item/weapon/card/id/synthetic
var/hudmode = null
/mob/living/silicon/New()
silicon_mob_list |= src
..()
add_language(LANGUAGE_GALCOM)
set_default_language(GLOB.all_languages[LANGUAGE_GALCOM])
init_id()
init_subsystems()
/mob/living/silicon/Destroy()
silicon_mob_list -= src
for(var/datum/alarm_handler/AH in SSalarm.all_handlers)
AH.unregister_alarm(src)
return ..()
/mob/living/silicon/proc/init_id()
if(idcard)
return
idcard = new idcard_type(src)
set_id_info(idcard)
/mob/living/silicon/proc/SetName(pickedName as text)
real_name = pickedName
name = real_name
/mob/living/silicon/proc/show_laws()
return
/mob/living/silicon/drop_item()
return
/mob/living/silicon/emp_act(severity)
switch(severity)
if(1)
src.take_organ_damage(0,20,emp=1)
Confuse(5)
if(2)
src.take_organ_damage(0,15,emp=1)
Confuse(4)
if(3)
src.take_organ_damage(0,10,emp=1)
Confuse(3)
if(4)
src.take_organ_damage(0,5,emp=1)
Confuse(2)
flash_eyes(affect_silicon = 1)
to_chat(src, "<span class='danger'><B>*BZZZT*</B></span>")
to_chat(src, "<span class='danger'>Warning: Electromagnetic pulse detected.</span>")
..()
/mob/living/silicon/stun_effect_act(var/stun_amount, var/agony_amount)
return //immune
/mob/living/silicon/electrocute_act(var/shock_damage, var/obj/source, var/siemens_coeff = 0.0)
if(shock_damage > 0)
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(5, 1, loc)
s.start()
shock_damage *= siemens_coeff //take reduced damage
take_overall_damage(0, shock_damage)
visible_message("<span class='warning'>[src] was shocked by \the [source]!</span>", \
"<span class='danger'>Energy pulse detected, system damaged!</span>", \
"<span class='warning'>You hear an electrical crack.</span>")
if(prob(20))
Stun(2)
return
/mob/living/silicon/proc/damage_mob(var/brute = 0, var/fire = 0, var/tox = 0)
return
/mob/living/silicon/IsAdvancedToolUser()
return 1
/mob/living/silicon/bullet_act(var/obj/item/projectile/Proj)
if(!Proj.nodamage)
switch(Proj.damage_type)
if(BRUTE)
adjustBruteLoss(Proj.damage)
if(BURN)
adjustFireLoss(Proj.damage)
Proj.on_hit(src,2)
updatehealth()
return 2
/mob/living/silicon/apply_effect(var/effect = 0,var/effecttype = STUN, var/blocked = 0)
return 0//The only effect that can hit them atm is flashes and they still directly edit so this works for now
/proc/islinked(var/mob/living/silicon/robot/bot, var/mob/living/silicon/ai/ai)
if(!istype(bot) || !istype(ai))
return 0
if (bot.connected_ai == ai)
return 1
return 0
// this function shows the health of the AI in the Status panel
/mob/living/silicon/proc/show_system_integrity()
if(!src.stat)
stat(null, text("System integrity: [round((health/getMaxHealth())*100)]%"))
else
stat(null, text("Systems nonfunctional"))
// This is a pure virtual function, it should be overwritten by all subclasses
/mob/living/silicon/proc/show_malf_ai()
return 0
// this function displays the shuttles ETA in the status panel if the shuttle has been called
/mob/living/silicon/proc/show_emergency_shuttle_eta()
if(emergency_shuttle)
var/eta_status = emergency_shuttle.get_status_panel_eta()
if(eta_status)
stat(null, eta_status)
// This adds the basic clock, shuttle recall timer, and malf_ai info to all silicon lifeforms
/mob/living/silicon/Stat()
if(statpanel("Status"))
show_emergency_shuttle_eta()
show_system_integrity()
show_malf_ai()
..()
// this function displays the stations manifest in a separate window
/mob/living/silicon/proc/show_station_manifest()
var/dat = "<div align='center'>"
if(!data_core)
to_chat(src, "<span class='notice'>There is no data to form a manifest with. Contact your Nanotrasen administrator.</span>")
return
dat += data_core.get_manifest(1) //The 1 makes it monochrome.
var/datum/browser/popup = new(src, "Crew Manifest", "Crew Manifest", 370, 420, src)
popup.set_content(dat)
popup.open()
//can't inject synths
/mob/living/silicon/can_inject(var/mob/user, var/error_msg)
if(error_msg)
to_chat(user, "<span class='alert'>The armoured plating is too tough.</span>")
return 0
//Silicon mob language procs
/mob/living/silicon/can_speak(datum/language/speaking)
if(universal_speak)
return TRUE
//need speech synthesizer support to vocalize a language
if(speaking in speech_synthesizer_langs)
return TRUE
if(speaking && speaking.flags & INNATE)
return TRUE
return FALSE
/mob/living/silicon/add_language(var/language, var/can_speak=1)
var/var/datum/language/added_language = GLOB.all_languages[language]
if(!added_language)
return
. = ..(language)
if (can_speak && (added_language in languages) && !(added_language in speech_synthesizer_langs))
speech_synthesizer_langs += added_language
return 1
/mob/living/silicon/remove_language(var/rem_language)
var/var/datum/language/removed_language = GLOB.all_languages[rem_language]
if(!removed_language)
return
..(rem_language)
speech_synthesizer_langs -= removed_language
/mob/living/silicon/check_lang_data()
. = ""
if(default_language)
. += "Current default language: [default_language] - <a href='byond://?src=\ref[src];default_lang=reset'>reset</a><br><br>"
for(var/datum/language/L in languages)
if(!(L.flags & NONGLOBAL))
var/default_str
if(L == default_language)
default_str = " - default - <a href='byond://?src=\ref[src];default_lang=reset'>reset</a>"
else
default_str = " - <a href='byond://?src=\ref[src];default_lang=\ref[L]'>set default</a>"
var/synth = (L in speech_synthesizer_langs)
. += "<b>[L.name] ([get_language_prefix()][L.key])</b>[synth ? default_str : null]<br>Speech Synthesizer: <i>[synth ? "YES" : "NOT SUPPORTED"]</i><br>[L.desc]<br><br>"
/mob/living/silicon/proc/toggle_sensor_mode()
var/sensor_type = input("Please select sensor type.", "Sensor Integration", null) in list("Security","Medical","Disable")
switch(sensor_type)
if ("Security")
if(plane_holder)
//Enable Security planes
plane_holder.set_vis(VIS_CH_ID,TRUE)
plane_holder.set_vis(VIS_CH_WANTED,TRUE)
plane_holder.set_vis(VIS_CH_IMPLOYAL,TRUE)
plane_holder.set_vis(VIS_CH_IMPTRACK,TRUE)
plane_holder.set_vis(VIS_CH_IMPCHEM,TRUE)
//Disable Medical planes
plane_holder.set_vis(VIS_CH_STATUS,FALSE)
plane_holder.set_vis(VIS_CH_HEALTH,FALSE)
to_chat(src, "<span class='notice'>Security records overlay enabled.</span>")
if ("Medical")
if(plane_holder)
//Disable Security planes
plane_holder.set_vis(VIS_CH_ID,FALSE)
plane_holder.set_vis(VIS_CH_WANTED,FALSE)
plane_holder.set_vis(VIS_CH_IMPLOYAL,FALSE)
plane_holder.set_vis(VIS_CH_IMPTRACK,FALSE)
plane_holder.set_vis(VIS_CH_IMPCHEM,FALSE)
//Enable Medical planes
plane_holder.set_vis(VIS_CH_STATUS,TRUE)
plane_holder.set_vis(VIS_CH_HEALTH,TRUE)
to_chat(src, "<span class='notice'>Life signs monitor overlay enabled.</span>")
if ("Disable")
if(plane_holder)
//Disable Security planes
plane_holder.set_vis(VIS_CH_ID,FALSE)
plane_holder.set_vis(VIS_CH_WANTED,FALSE)
plane_holder.set_vis(VIS_CH_IMPLOYAL,FALSE)
plane_holder.set_vis(VIS_CH_IMPTRACK,FALSE)
plane_holder.set_vis(VIS_CH_IMPCHEM,FALSE)
//Disable Medical planes
plane_holder.set_vis(VIS_CH_STATUS,FALSE)
plane_holder.set_vis(VIS_CH_HEALTH,FALSE)
to_chat(src, "Sensor augmentations disabled.")
hudmode = sensor_type //This is checked in examine.dm on humans, so they can see medical/security records depending on mode
/mob/living/silicon/verb/pose()
set name = "Set Pose"
set desc = "Sets a description which will be shown when someone examines you."
set category = "IC"
pose = sanitize(input(usr, "This is [src]. It is...", "Pose", null) as text)
/mob/living/silicon/verb/set_flavor()
set name = "Set Flavour Text"
set desc = "Sets an extended description of your character's features."
set category = "IC"
flavor_text = sanitize(input(usr, "Please enter your new flavour text.", "Flavour text", null) as text)
/mob/living/silicon/binarycheck()
return 1
/mob/living/silicon/ex_act(severity)
if(!blinded)
flash_eyes()
for(var/datum/modifier/M in modifiers)
if(!isnull(M.explosion_modifier))
severity = CLAMP(severity + M.explosion_modifier, 1, 4)
severity = round(severity)
if(severity > 3)
return
switch(severity)
if(1.0)
if (stat != 2)
adjustBruteLoss(100)
adjustFireLoss(100)
if(!anchored)
gib()
if(2.0)
if (stat != 2)
adjustBruteLoss(60)
adjustFireLoss(60)
if(3.0)
if (stat != 2)
adjustBruteLoss(30)
updatehealth()
/mob/living/silicon/proc/receive_alarm(var/datum/alarm_handler/alarm_handler, var/datum/alarm/alarm, was_raised)
if(!next_alarm_notice)
next_alarm_notice = world.time + SecondsToTicks(10)
if(alarm.hidden)
return
if(alarm.origin && !(get_z(alarm.origin) in using_map.get_map_levels(get_z(src), TRUE, om_range = DEFAULT_OVERMAP_RANGE)))
return
var/list/alarms = queued_alarms[alarm_handler]
if(was_raised)
// Raised alarms are always set
alarms[alarm] = 1
else
// Alarms that were raised but then cleared before the next notice are instead removed
if(alarm in alarms)
alarms -= alarm
// And alarms that have only been cleared thus far are set as such
else
alarms[alarm] = -1
/mob/living/silicon/proc/process_queued_alarms()
if(next_alarm_notice && (world.time > next_alarm_notice))
next_alarm_notice = 0
var/alarm_raised = 0
for(var/datum/alarm_handler/AH in queued_alarms)
var/list/alarms = queued_alarms[AH]
var/reported = 0
for(var/datum/alarm/A in alarms)
if(alarms[A] == 1)
alarm_raised = 1
if(!reported)
reported = 1
to_chat(src, "<span class='warning'>--- [AH.category] Detected ---</span>")
raised_alarm(A)
for(var/datum/alarm_handler/AH in queued_alarms)
var/list/alarms = queued_alarms[AH]
var/reported = 0
for(var/datum/alarm/A in alarms)
if(alarms[A] == -1)
if(!reported)
reported = 1
to_chat(src, "<span class='notice'>--- [AH.category] Cleared ---</span>")
to_chat(src, "\The [A.alarm_name()].")
if(alarm_raised)
to_chat(src, "<A HREF=?src=\ref[src];showalerts=1>\[Show Alerts\]</A>")
for(var/datum/alarm_handler/AH in queued_alarms)
var/list/alarms = queued_alarms[AH]
alarms.Cut()
/mob/living/silicon/proc/raised_alarm(var/datum/alarm/A)
to_chat(src, "[A.alarm_name()]!")
/mob/living/silicon/ai/raised_alarm(var/datum/alarm/A)
var/cameratext = ""
for(var/obj/machinery/camera/C in A.cameras())
cameratext += "[(cameratext == "")? "" : "|"]<A HREF=?src=\ref[src];switchcamera=\ref[C]>[C.c_tag]</A>"
to_chat(src, "[A.alarm_name()]! ([(cameratext)? cameratext : "No Camera"])")
/mob/living/silicon/proc/is_traitor()
return mind && (mind in traitors.current_antagonists)
/mob/living/silicon/proc/is_malf()
return mind && (mind in malf.current_antagonists)
/mob/living/silicon/proc/is_malf_or_traitor()
return is_traitor() || is_malf()
/mob/living/silicon/adjustEarDamage()
return
/mob/living/silicon/setEarDamage()
return
/mob/living/silicon/reset_view()
. = ..()
if(cameraFollow)
cameraFollow = null
/mob/living/silicon/flash_eyes(intensity = FLASH_PROTECTION_MODERATE, override_blindness_check = FALSE, affect_silicon = FALSE, visual = FALSE, type = /obj/screen/fullscreen/flash)
if(affect_silicon)
return ..()
/mob/living/silicon/proc/clear_client()
//Handle job slot/tater cleanup.
var/job = mind.assigned_role
job_master.FreeRole(job)
if(mind.objectives.len)
qdel(mind.objectives)
mind.special_role = null
clear_antag_roles(mind)
ghostize(0)
qdel(src)
/mob/living/silicon/has_vision()
return 0 //NOT REAL EYES
/mob/living/silicon
gender = NEUTER
voice_name = "synthesized voice"
var/syndicate = 0
var/const/MAIN_CHANNEL = "Main Frequency"
var/lawchannel = MAIN_CHANNEL // Default channel on which to state laws
var/list/stating_laws = list()// Channels laws are currently being stated on
var/obj/item/device/radio/common_radio
has_huds = TRUE
var/list/speech_synthesizer_langs = list() //which languages can be vocalized by the speech synthesizer
//Used in say.dm.
var/speak_statement = "states"
var/speak_exclamation = "declares"
var/speak_query = "queries"
var/pose //Yes, now AIs can pose too.
var/obj/item/device/camera/siliconcam/aiCamera = null //photography
var/local_transmit //If set, can only speak to others of the same type within a short range.
var/next_alarm_notice
var/list/datum/alarm/queued_alarms = new()
var/list/access_rights
var/obj/item/weapon/card/id/idcard
var/idcard_type = /obj/item/weapon/card/id/synthetic
var/hudmode = null
/mob/living/silicon/New()
silicon_mob_list |= src
..()
add_language(LANGUAGE_GALCOM)
set_default_language(GLOB.all_languages[LANGUAGE_GALCOM])
init_id()
init_subsystems()
/mob/living/silicon/Destroy()
silicon_mob_list -= src
for(var/datum/alarm_handler/AH in SSalarm.all_handlers)
AH.unregister_alarm(src)
return ..()
/mob/living/silicon/proc/init_id()
if(idcard)
return
idcard = new idcard_type(src)
set_id_info(idcard)
/mob/living/silicon/proc/SetName(pickedName as text)
real_name = pickedName
name = real_name
/mob/living/silicon/proc/show_laws()
return
/mob/living/silicon/drop_item()
return
/mob/living/silicon/emp_act(severity)
switch(severity)
if(1)
src.take_organ_damage(0,20,emp=1)
Confuse(5)
if(2)
src.take_organ_damage(0,15,emp=1)
Confuse(4)
if(3)
src.take_organ_damage(0,10,emp=1)
Confuse(3)
if(4)
src.take_organ_damage(0,5,emp=1)
Confuse(2)
flash_eyes(affect_silicon = 1)
to_chat(src, "<span class='danger'><B>*BZZZT*</B></span>")
to_chat(src, "<span class='danger'>Warning: Electromagnetic pulse detected.</span>")
..()
/mob/living/silicon/stun_effect_act(var/stun_amount, var/agony_amount)
return //immune
/mob/living/silicon/electrocute_act(var/shock_damage, var/obj/source, var/siemens_coeff = 0.0, var/def_zone = null, var/stun = 1)
if(shock_damage > 0)
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(5, 1, loc)
s.start()
shock_damage *= siemens_coeff //take reduced damage
take_overall_damage(0, shock_damage)
visible_message("<span class='warning'>[src] was shocked by \the [source]!</span>", \
"<span class='danger'>Energy pulse detected, system damaged!</span>", \
"<span class='warning'>You hear an electrical crack.</span>")
if(prob(20))
Stun(2)
return
/mob/living/silicon/proc/damage_mob(var/brute = 0, var/fire = 0, var/tox = 0)
return
/mob/living/silicon/IsAdvancedToolUser()
return 1
/mob/living/silicon/bullet_act(var/obj/item/projectile/Proj)
if(!Proj.nodamage)
switch(Proj.damage_type)
if(BRUTE)
adjustBruteLoss(Proj.damage)
if(BURN)
adjustFireLoss(Proj.damage)
Proj.on_hit(src,2)
updatehealth()
return 2
/mob/living/silicon/apply_effect(var/effect = 0,var/effecttype = STUN, var/blocked = 0, var/check_protection = 1)
return 0//The only effect that can hit them atm is flashes and they still directly edit so this works for now
/proc/islinked(var/mob/living/silicon/robot/bot, var/mob/living/silicon/ai/ai)
if(!istype(bot) || !istype(ai))
return 0
if (bot.connected_ai == ai)
return 1
return 0
// this function shows the health of the AI in the Status panel
/mob/living/silicon/proc/show_system_integrity()
if(!src.stat)
stat(null, text("System integrity: [round((health/getMaxHealth())*100)]%"))
else
stat(null, text("Systems nonfunctional"))
// This is a pure virtual function, it should be overwritten by all subclasses
/mob/living/silicon/proc/show_malf_ai()
return 0
// this function displays the shuttles ETA in the status panel if the shuttle has been called
/mob/living/silicon/proc/show_emergency_shuttle_eta()
if(emergency_shuttle)
var/eta_status = emergency_shuttle.get_status_panel_eta()
if(eta_status)
stat(null, eta_status)
// This adds the basic clock, shuttle recall timer, and malf_ai info to all silicon lifeforms
/mob/living/silicon/Stat()
if(statpanel("Status"))
show_emergency_shuttle_eta()
show_system_integrity()
show_malf_ai()
..()
// this function displays the stations manifest in a separate window
/mob/living/silicon/proc/show_station_manifest()
var/dat = "<div align='center'>"
if(!data_core)
to_chat(src, "<span class='notice'>There is no data to form a manifest with. Contact your Nanotrasen administrator.</span>")
return
dat += data_core.get_manifest(1) //The 1 makes it monochrome.
var/datum/browser/popup = new(src, "Crew Manifest", "Crew Manifest", 370, 420, src)
popup.set_content(dat)
popup.open()
//can't inject synths
/mob/living/silicon/can_inject(var/mob/user, var/error_msg, var/target_zone, var/ignore_thickness = FALSE)
if(error_msg)
to_chat(user, "<span class='alert'>The armoured plating is too tough.</span>")
return 0
//Silicon mob language procs
/mob/living/silicon/can_speak(datum/language/speaking)
if(universal_speak)
return TRUE
//need speech synthesizer support to vocalize a language
if(speaking in speech_synthesizer_langs)
return TRUE
if(speaking && speaking.flags & INNATE)
return TRUE
return FALSE
/mob/living/silicon/add_language(var/language, var/can_speak=1)
var/datum/language/added_language = GLOB.all_languages[language]
if(!added_language)
return
. = ..(language)
if (can_speak && (added_language in languages) && !(added_language in speech_synthesizer_langs))
speech_synthesizer_langs += added_language
return 1
/mob/living/silicon/remove_language(var/rem_language)
var/datum/language/removed_language = GLOB.all_languages[rem_language]
if(!removed_language)
return
..(rem_language)
speech_synthesizer_langs -= removed_language
/mob/living/silicon/check_lang_data()
. = ""
if(default_language)
. += "Current default language: [default_language] - <a href='byond://?src=\ref[src];default_lang=reset'>reset</a><br><br>"
for(var/datum/language/L in languages)
if(!(L.flags & NONGLOBAL))
var/default_str
if(L == default_language)
default_str = " - default - <a href='byond://?src=\ref[src];default_lang=reset'>reset</a>"
else
default_str = " - <a href='byond://?src=\ref[src];default_lang=\ref[L]'>set default</a>"
var/synth = (L in speech_synthesizer_langs)
. += "<b>[L.name] ([get_language_prefix()][L.key])</b>[synth ? default_str : null]<br>Speech Synthesizer: <i>[synth ? "YES" : "NOT SUPPORTED"]</i><br>[L.desc]<br><br>"
/mob/living/silicon/proc/toggle_sensor_mode()
var/sensor_type = input("Please select sensor type.", "Sensor Integration", null) in list("Security","Medical","Disable")
switch(sensor_type)
if ("Security")
if(plane_holder)
//Enable Security planes
plane_holder.set_vis(VIS_CH_ID,TRUE)
plane_holder.set_vis(VIS_CH_WANTED,TRUE)
plane_holder.set_vis(VIS_CH_IMPLOYAL,TRUE)
plane_holder.set_vis(VIS_CH_IMPTRACK,TRUE)
plane_holder.set_vis(VIS_CH_IMPCHEM,TRUE)
//Disable Medical planes
plane_holder.set_vis(VIS_CH_STATUS,FALSE)
plane_holder.set_vis(VIS_CH_HEALTH,FALSE)
to_chat(src, "<span class='notice'>Security records overlay enabled.</span>")
if ("Medical")
if(plane_holder)
//Disable Security planes
plane_holder.set_vis(VIS_CH_ID,FALSE)
plane_holder.set_vis(VIS_CH_WANTED,FALSE)
plane_holder.set_vis(VIS_CH_IMPLOYAL,FALSE)
plane_holder.set_vis(VIS_CH_IMPTRACK,FALSE)
plane_holder.set_vis(VIS_CH_IMPCHEM,FALSE)
//Enable Medical planes
plane_holder.set_vis(VIS_CH_STATUS,TRUE)
plane_holder.set_vis(VIS_CH_HEALTH,TRUE)
to_chat(src, "<span class='notice'>Life signs monitor overlay enabled.</span>")
if ("Disable")
if(plane_holder)
//Disable Security planes
plane_holder.set_vis(VIS_CH_ID,FALSE)
plane_holder.set_vis(VIS_CH_WANTED,FALSE)
plane_holder.set_vis(VIS_CH_IMPLOYAL,FALSE)
plane_holder.set_vis(VIS_CH_IMPTRACK,FALSE)
plane_holder.set_vis(VIS_CH_IMPCHEM,FALSE)
//Disable Medical planes
plane_holder.set_vis(VIS_CH_STATUS,FALSE)
plane_holder.set_vis(VIS_CH_HEALTH,FALSE)
to_chat(src, "Sensor augmentations disabled.")
hudmode = sensor_type //This is checked in examine.dm on humans, so they can see medical/security records depending on mode
/mob/living/silicon/verb/pose()
set name = "Set Pose"
set desc = "Sets a description which will be shown when someone examines you."
set category = "IC"
pose = sanitize(input(usr, "This is [src]. It is...", "Pose", null) as text)
/mob/living/silicon/verb/set_flavor()
set name = "Set Flavour Text"
set desc = "Sets an extended description of your character's features."
set category = "IC"
flavor_text = sanitize(input(usr, "Please enter your new flavour text.", "Flavour text", null) as text)
/mob/living/silicon/binarycheck()
return 1
/mob/living/silicon/ex_act(severity)
if(!blinded)
flash_eyes()
for(var/datum/modifier/M in modifiers)
if(!isnull(M.explosion_modifier))
severity = CLAMP(severity + M.explosion_modifier, 1, 4)
severity = round(severity)
if(severity > 3)
return
switch(severity)
if(1.0)
if (stat != 2)
adjustBruteLoss(100)
adjustFireLoss(100)
if(!anchored)
gib()
if(2.0)
if (stat != 2)
adjustBruteLoss(60)
adjustFireLoss(60)
if(3.0)
if (stat != 2)
adjustBruteLoss(30)
updatehealth()
/mob/living/silicon/proc/receive_alarm(var/datum/alarm_handler/alarm_handler, var/datum/alarm/alarm, was_raised)
if(!next_alarm_notice)
next_alarm_notice = world.time + SecondsToTicks(10)
if(alarm.hidden)
return
if(alarm.origin && !(get_z(alarm.origin) in using_map.get_map_levels(get_z(src), TRUE, om_range = DEFAULT_OVERMAP_RANGE)))
return
var/list/alarms = queued_alarms[alarm_handler]
if(was_raised)
// Raised alarms are always set
alarms[alarm] = 1
else
// Alarms that were raised but then cleared before the next notice are instead removed
if(alarm in alarms)
alarms -= alarm
// And alarms that have only been cleared thus far are set as such
else
alarms[alarm] = -1
/mob/living/silicon/proc/process_queued_alarms()
if(next_alarm_notice && (world.time > next_alarm_notice))
next_alarm_notice = 0
var/alarm_raised = 0
for(var/datum/alarm_handler/AH in queued_alarms)
var/list/alarms = queued_alarms[AH]
var/reported = 0
for(var/datum/alarm/A in alarms)
if(alarms[A] == 1)
alarm_raised = 1
if(!reported)
reported = 1
to_chat(src, "<span class='warning'>--- [AH.category] Detected ---</span>")
raised_alarm(A)
for(var/datum/alarm_handler/AH in queued_alarms)
var/list/alarms = queued_alarms[AH]
var/reported = 0
for(var/datum/alarm/A in alarms)
if(alarms[A] == -1)
if(!reported)
reported = 1
to_chat(src, "<span class='notice'>--- [AH.category] Cleared ---</span>")
to_chat(src, "\The [A.alarm_name()].")
if(alarm_raised)
to_chat(src, "<A HREF=?src=\ref[src];showalerts=1>\[Show Alerts\]</A>")
for(var/datum/alarm_handler/AH in queued_alarms)
var/list/alarms = queued_alarms[AH]
alarms.Cut()
/mob/living/silicon/proc/raised_alarm(var/datum/alarm/A)
to_chat(src, "[A.alarm_name()]!")
/mob/living/silicon/ai/raised_alarm(var/datum/alarm/A)
var/cameratext = ""
for(var/obj/machinery/camera/C in A.cameras())
cameratext += "[(cameratext == "")? "" : "|"]<A HREF=?src=\ref[src];switchcamera=\ref[C]>[C.c_tag]</A>"
to_chat(src, "[A.alarm_name()]! ([(cameratext)? cameratext : "No Camera"])")
/mob/living/silicon/proc/is_traitor()
return mind && (mind in traitors.current_antagonists)
/mob/living/silicon/proc/is_malf()
return mind && (mind in malf.current_antagonists)
/mob/living/silicon/proc/is_malf_or_traitor()
return is_traitor() || is_malf()
/mob/living/silicon/adjustEarDamage()
return
/mob/living/silicon/setEarDamage()
return
/mob/living/silicon/reset_view()
. = ..()
if(cameraFollow)
cameraFollow = null
/mob/living/silicon/flash_eyes(intensity = FLASH_PROTECTION_MODERATE, override_blindness_check = FALSE, affect_silicon = FALSE, visual = FALSE, type = /obj/screen/fullscreen/flash)
if(affect_silicon)
return ..()
/mob/living/silicon/proc/clear_client()
//Handle job slot/tater cleanup.
var/job = mind.assigned_role
job_master.FreeRole(job)
if(mind.objectives.len)
qdel(mind.objectives)
mind.special_role = null
clear_antag_roles(mind)
ghostize(0)
qdel(src)
/mob/living/silicon/has_vision()
return 0 //NOT REAL EYES

View File

@@ -43,7 +43,7 @@
default_pixel_y = rand(-6, 10)
// Makes the AI unable to willingly go on land.
/mob/living/simple_mob/animal/passive/fish/IMove(newloc)
/mob/living/simple_mob/animal/passive/fish/IMove(turf/newloc, safety = TRUE)
if(is_type_in_list(newloc, suitable_turf_types))
return ..() // Procede as normal.
return MOVEMENT_FAILED // Don't leave the water!

View File

@@ -192,7 +192,7 @@
chemicals -= 30
if(host.getToxLoss() >= 30 && chemicals > 50)
var/randomchem = pickweight("tramadol" = 7, "anti_toxin" = 15, "frostoil" = 3)
var/randomchem = pickweight(list("tramadol" = 7, "anti_toxin" = 15, "frostoil" = 3))
host.reagents.add_reagent(randomchem, 5)
chemicals -= 50
@@ -330,10 +330,6 @@
if(!host)
return
if(ai_holder)
ai_holder.hostile = initial(ai_holder.hostile)
ai_holder.lose_target()
host_bodypart.implants -= src
host_bodypart = null

View File

@@ -89,7 +89,7 @@
// Close to mid-ranged shooter that arcs over other things, ideal if allies are in front of it.
// Difference from siege hivebots is that siege hivebots have limited charges for their attacks, are very long range, and \
// Difference from siege hivebots is that siege hivebots have limited charges for their attacks, are very long range, and
// the projectiles have an AoE component, where as backline hivebots do not.
/mob/living/simple_mob/mechanical/hivebot/ranged_damage/backline
name = "backline hivebot"

View File

@@ -89,7 +89,7 @@
return L.assess_perp(src, FALSE, FALSE, TRUE, FALSE) <= 3
// Variant that has high armor pen. Slightly slower attack speed and movement. Meant to be dispersed in groups with other ones
/mob/living/simple_mob/mechanical/viscerator/piercing.
/mob/living/simple_mob/mechanical/viscerator/piercing
attack_armor_pen = 20
base_attack_cooldown = 10 // One attack a second or so.
movement_cooldown = 0.5

File diff suppressed because it is too large Load Diff

View File

@@ -169,7 +169,7 @@
var/mob/living/carbon/LAssailant = null
//Wizard mode, but can be used in other modes thanks to the brand new "Give Spell" badmin button
var/spell/list/spell_list = list()
var/list/spell/spell_list = list()
//Changlings, but can be used in other modes
// var/obj/effect/proc_holder/changpower/list/power_list = list()

View File

@@ -82,7 +82,7 @@
if(PM.sub_planes)
var/list/subplanes = PM.sub_planes
for(var/SP in subplanes)
set_vis(which = SP, new_alpha = new_alpha)
set_vis(which = SP, state = !!new_alpha)
/datum/plane_holder/proc/set_ao(var/which = null, var/enabled = FALSE)
ASSERT(which)

View File

@@ -10,5 +10,3 @@
return 0
else
return fail_chance * 2 ** (factor*(SKILL_BASIC - points))
return FALSE // We don't actually have a skills system, so never fail.