[MANUAL MIRROR] Port OD Pragma Lints (#17171) (#10255)

Co-authored-by: Drathek <76988376+Drulikar@users.noreply.github.com>
This commit is contained in:
Selis
2025-03-01 22:14:20 +01:00
committed by GitHub
parent f05bc462ed
commit ed43b73661
118 changed files with 428 additions and 237 deletions

View File

@@ -108,6 +108,22 @@ jobs:
with:
outputFile: output-annotations.txt
odlint:
name: Lint with OpenDream
runs-on: ubuntu-22.04
steps:
- uses: actions/setup-dotnet@v4
with:
dotnet-version: 9
- uses: actions/checkout@v4
- uses: robinraju/release-downloader@v1.9
with:
repository: "OpenDreamProject/OpenDream"
tag: "latest"
fileName: "DMCompiler_linux-x64.tar.gz"
extract: true
- run: ./DMCompiler_linux-x64/DMCompiler --suppress-unimplemented vorestation.dme
unit_tests:
timeout-minutes: 30
if: ( !contains(github.event.head_commit.message, '[ci skip]') )

View File

@@ -118,7 +118,7 @@
heat_limit = H.species.heat_level_3
if(pipe_air.temperature > heat_limit + 1)
L.apply_damage(4 * log(pipe_air.temperature - heat_limit), BURN, BP_TORSO, used_weapon = "Excessive Heat")
L.apply_damage(4 * log(pipe_air.temperature - heat_limit), BURN, BP_TORSO)
//fancy radiation glowing
if(pipe_air.temperature && (icon_temperature > 500 || pipe_air.temperature > 500)) //start glowing at 500K

View File

@@ -123,15 +123,15 @@ Contains helper procs for airflow, handled in /connection_group.
var/blocked = run_armor_check(BP_HEAD,"melee")
var/soaked = get_armor_soak(BP_HEAD,"melee")
apply_damage(b_loss/3, BRUTE, BP_HEAD, blocked, soaked, 0, "Airflow")
apply_damage(b_loss/3, BRUTE, BP_HEAD, blocked, soaked, 0)
blocked = run_armor_check(BP_TORSO,"melee")
soaked = get_armor_soak(BP_TORSO,"melee")
apply_damage(b_loss/3, BRUTE, BP_TORSO, blocked, soaked, 0, "Airflow")
apply_damage(b_loss/3, BRUTE, BP_TORSO, blocked, soaked, 0)
blocked = run_armor_check(BP_GROIN,"melee")
soaked = get_armor_soak(BP_GROIN,"melee")
apply_damage(b_loss/3, BRUTE, BP_GROIN, blocked, soaked, 0, "Airflow")
apply_damage(b_loss/3, BRUTE, BP_GROIN, blocked, soaked, 0)
if(airflow_speed > 10)
Paralyse(round(airflow_speed * vsc.airflow_stun))

View File

@@ -436,10 +436,10 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin
//Always check these damage procs first if fire damage isn't working. They're probably what's wrong.
apply_damage(2.5*mx*head_exposure, BURN, BP_HEAD, 0, 0, "Fire")
apply_damage(2.5*mx*chest_exposure, BURN, BP_TORSO, 0, 0, "Fire")
apply_damage(2.0*mx*groin_exposure, BURN, BP_GROIN, 0, 0, "Fire")
apply_damage(0.6*mx*legs_exposure, BURN, BP_L_LEG, 0, 0, "Fire")
apply_damage(0.6*mx*legs_exposure, BURN, BP_R_LEG, 0, 0, "Fire")
apply_damage(0.4*mx*arms_exposure, BURN, BP_L_ARM, 0, 0, "Fire")
apply_damage(0.4*mx*arms_exposure, BURN, BP_R_ARM, 0, 0, "Fire")
apply_damage(2.5*mx*head_exposure, BURN, BP_HEAD, 0, 0)
apply_damage(2.5*mx*chest_exposure, BURN, BP_TORSO, 0, 0)
apply_damage(2.0*mx*groin_exposure, BURN, BP_GROIN, 0, 0)
apply_damage(0.6*mx*legs_exposure, BURN, BP_L_LEG, 0, 0)
apply_damage(0.6*mx*legs_exposure, BURN, BP_R_LEG, 0, 0)
apply_damage(0.4*mx*arms_exposure, BURN, BP_L_ARM, 0, 0)
apply_damage(0.4*mx*arms_exposure, BURN, BP_R_ARM, 0, 0)

View File

@@ -5,11 +5,13 @@
#define ATAN2(x, y) arctan(x, y)
#define between(x, y, z) clamp(y, x, z)
// Update this whenever you need to take advantage of more recent byond features
// This file contains defines allowing targeting byond versions newer than the supported
//Update this whenever you need to take advantage of more recent byond features
#define MIN_COMPILER_VERSION 515
#define MIN_COMPILER_BUILD 1590
#if (DM_VERSION < MIN_COMPILER_VERSION || DM_BUILD < MIN_COMPILER_BUILD) && !defined(SPACEMAN_DMM)
// Don't forget to update this part
#if (DM_VERSION < MIN_COMPILER_VERSION || DM_BUILD < MIN_COMPILER_BUILD) && !defined(SPACEMAN_DMM) && !defined(OPENDREAM)
//Don't forget to update this part
#error Your version of BYOND is too out-of-date to compile this project. Go to https://secure.byond.com/download and update.
#error You need version 515.1590 or higher
#endif

View File

@@ -1,7 +1,7 @@
//
// Defines used for advanced performance profiling of subsystems.
// Currently used only by SSoverlays (2018-02-24 ~Leshana)
//
//
#define STAT_ENTRY_TIME 1
#define STAT_ENTRY_COUNT 2
#define STAT_ENTRY_LENGTH 2
@@ -14,4 +14,4 @@
var/STAT_INCR_AMOUNT = min(1, 2**round((STAT_ENTRY[STAT_ENTRY_COUNT] || 0)/SHORT_REAL_LIMIT));\
if (STAT_INCR_AMOUNT == 1 || prob(100/STAT_INCR_AMOUNT)) {\
STAT_ENTRY[STAT_ENTRY_COUNT] += STAT_INCR_AMOUNT;\
};\
};

11
code/__odlint.dm Normal file
View File

@@ -0,0 +1,11 @@
// This file is included right at the start of the DME.
// Its purpose is to enable multiple lints (pragmas) that are supported by OpenDream to better validate the codebase
// These are essentially nitpicks the DM compiler should pick up on but doesnt
#ifndef SPACEMAN_DMM
#ifdef OPENDREAM
// These are in their own file as you need to do it with an include as a hack to avoid
// SpacemanDMM evaluating the #pragma lines, even if its outside a block it cares about
#include "__pragmas.dm"
#endif
#endif

31
code/__pragmas.dm Normal file
View File

@@ -0,0 +1,31 @@
//1000-1999
// CHOMPEdit - We have to currently set the FileAlreadyIncluded pragma to warning, because of how the turfpack generation works.
#pragma FileAlreadyIncluded warning
#pragma MissingIncludedFile error
#pragma MisplacedDirective error
#pragma UndefineMissingDirective error
#pragma DefinedMissingParen error
#pragma ErrorDirective error
#pragma WarningDirective error
#pragma MiscapitalizedDirective error
//2000-2999
#pragma SoftReservedKeyword error
#pragma DuplicateVariable error
#pragma DuplicateProcDefinition error
#pragma PointlessParentCall error
#pragma PointlessBuiltinCall error
#pragma SuspiciousMatrixCall error
#pragma MalformedRange error
#pragma InvalidRange error
#pragma InvalidSetStatement error
#pragma InvalidOverride error
#pragma DanglingVarType error
#pragma MissingInterpolatedExpression error
#pragma InvalidIndexOperation error
#pragma PointlessPositionalArgument error
#pragma ProcArgumentGlobal error
//3000-3999
#pragma EmptyBlock error
#pragma AmbiguousInOrder error

View File

@@ -90,8 +90,11 @@
var/ourdir = dir
if(!none && ourdir != SOUTH)
if(length(icon_states(icon(icon, state, NORTH))))
pass()
else if(length(icon_states(icon(icon, state, EAST))))
pass()
else if(length(icon_states(icon(icon, state, WEST))))
pass()
else
ourdir = SOUTH

View File

@@ -512,8 +512,7 @@ GLOBAL_VAR_INIT(jps_visualization_resolve, TRUE)
#endif
// check it's 1. there and 2. we haven't checked it yet and
// 3. we can reach it; if not this is just pointless
if(isnull(cscan_current) || (cscan_current.pathfinding_cycle == cycle) || !JPS_ADJACENCY_CALL(node_top_pos, cscan_current))
else
if(!(isnull(cscan_current) || (cscan_current.pathfinding_cycle == cycle) || !JPS_ADJACENCY_CALL(node_top_pos, cscan_current)))
// perform iteration
JPS_CARDINAL_SCAN(cscan_current, node_top_dir)

View File

@@ -48,7 +48,7 @@
while (i)
var/char = text2ascii(hex, i)
switch(char)
if(48) // 0 -- do nothing
if(48) pass() // 0 -- do nothing
if(49 to 57) num += (char - 48) * power // 1-9
if(97, 65) num += power * 10 // A
if(98, 66) num += power * 11 // B
@@ -166,6 +166,28 @@
if (NORTHWEST) return 315
if (SOUTHWEST) return 225
/// Returns a list(x, y), being the change in position required to step in the passed in direction
/proc/dir2offset(dir)
switch(dir)
if(NORTH)
return list(0, 1)
if(SOUTH)
return list(0, -1)
if(EAST)
return list(1, 0)
if(WEST)
return list(-1, 0)
if(NORTHEAST)
return list(1, 1)
if(SOUTHEAST)
return list(1, -1)
if(NORTHWEST)
return list(-1, 1)
if(SOUTHWEST)
return list(-1, -1)
else
return list(0, 0)
// Converts a blend_mode constant to one acceptable to icon.Blend()
/proc/blendMode2iconMode(blend_mode)
switch (blend_mode)

View File

@@ -1529,6 +1529,10 @@ var/mob/dview/dview_mob = new
return !QDELETED(D)
return FALSE
/// No op
/proc/pass(...)
return
//gives us the stack trace from CRASH() without ending the current proc.
/proc/stack_trace(msg)
CRASH(msg)

View File

@@ -281,7 +281,8 @@
var/datum/component/C = dc[c_type]
if(C)
if(length(C))
C = C[1]
var/list/component_list = C
C = component_list[1]
if(C.type == c_type)
return C
return null

View File

@@ -353,7 +353,7 @@
to_chat(H, span_danger("<font size =3>You somehow have become the recepient of a loyalty transplant, and it just activated!</font>"))
H.implant_loyalty(override = TRUE)
log_admin("[key_name_admin(usr)] has loyalty implanted [current].")
else
else if (href_list["silicon"])
BITSET(current.hud_updateflag, SPECIALROLE_HUD)
switch(href_list["silicon"])

View File

@@ -51,7 +51,7 @@
/datum/antagonist/proc/print_player_lite(var/datum/mind/ply)
var/role = ply.assigned_role ? "\improper[ply.assigned_role]" : "\improper[ply.special_role]"
var/text = "<br>" + span_bold("[ply.name]") + " (" + span_bold("[ply.key]") + ") as \a " + span_bold("[role]") + " ("
var/text = "<br>" + span_bold("[ply.name]") + " (" + span_bold("[ply.key]") + ") as " + span_bold("\a [role]") + " ("
if(ply.current)
if(ply.current.stat == DEAD)
text += "died"

View File

@@ -19,7 +19,7 @@
if(!M || !M.dna)
return
if(gene.block)
if(gene.name in M.active_genes || gene.flags & GENE_ALWAYS_ACTIVATE)
if((gene.name in M.active_genes) || gene.flags & GENE_ALWAYS_ACTIVATE)
enabled_genes.Add(gene)
else
disabled_genes.Add(gene)

View File

@@ -298,7 +298,6 @@
ex_act(severity)
qdel(src)
return
else
return
/obj/machinery/computer/scan_consolenew
@@ -356,7 +355,6 @@
if(prob(50))
qdel(src)
return
else
return
/obj/machinery/computer/scan_consolenew/Initialize()

View File

@@ -266,7 +266,7 @@ var/global/list/Holiday = list() //Holidays are lists now, so we can have more t
for(var/blurb in holiday_blurbs)
to_world(span_filter_system(span_blue("<div align='center'>[blurb]</div>")))
switch(Holiday) //special holidays
if("Easter")
//if("Easter")
//do easter stuff
if("Christmas Eve","Christmas")
Christmas_Game_Start()
@@ -278,7 +278,7 @@ var/global/list/Holiday = list() //Holidays are lists now, so we can have more t
if(isemptylist(Holiday))
return 0
switch(Holiday) //special holidays
if("Easter") //I'll make this into some helper procs at some point
//if("Easter") //I'll make this into some helper procs at some point
/* var/list/turf/simulated/floor/Floorlist = list()
for(var/turf/simulated/floor/T)
if(T.contents)

View File

@@ -7,7 +7,7 @@
for(var/obj/machinery/power/smes/S in GLOB.smeses)
var/area/current_area = get_area(S)
if(current_area.type in skipped_areas || !(S.z in using_map.station_levels))
if((current_area.type in skipped_areas) || !(S.z in using_map.station_levels))
continue
S.last_charge = S.charge
S.last_output_attempt = S.output_attempt
@@ -33,7 +33,7 @@
C.cell.charge = C.cell.maxcharge
for(var/obj/machinery/power/smes/S in GLOB.smeses)
var/area/current_area = get_area(S)
if(current_area.type in skipped_areas || isNotStationLevel(S.z))
if((current_area.type in skipped_areas) || isNotStationLevel(S.z))
continue
S.charge = S.last_charge
S.output_attempt = S.last_output_attempt

View File

@@ -39,7 +39,6 @@
if(3.0)
if(prob(25))
density = FALSE
else
return
/obj/machinery/optable/attack_hand(mob/user as mob)

View File

@@ -161,7 +161,6 @@
//SN src = null
qdel(src)
return
else
return
/obj/machinery/bodyscanner/tgui_host(mob/user)
@@ -628,7 +627,6 @@
//SN src = null
qdel(src)
return
else
return
/obj/machinery/body_scanconsole/proc/findscanner()

View File

@@ -440,7 +440,6 @@
ex_act(severity)
qdel(src)
return
else
return
/obj/machinery/clonepod/update_icon()

View File

@@ -56,7 +56,6 @@
for(var/x in verbs)
src.verbs -= x
set_broken()
else
return
/obj/machinery/computer/bullet_act(var/obj/item/projectile/Proj)

View File

@@ -85,7 +85,7 @@
var/obj/item/weldingtool/welder = I.get_welder()
if(welder.remove_fuel(0,user))
to_chat(user, span_notice("You start weld \the plasteel into place."))
to_chat(user, span_notice("You start welding the plasteel into place."))
playsound(src, welder.usesound, 50, 1)
if(do_after(user, 10 * welder.toolspeed) && welder && welder.isOn())
to_chat(user, span_notice("You finish reinforcing \the [src]."))

View File

@@ -196,7 +196,6 @@ Class Procs:
if(prob(25))
fall_apart(severity)
return
else
return
/obj/machinery/vv_edit_var(var/var_name, var/new_value)

View File

@@ -121,7 +121,7 @@
return
//when there is a breather:
if(breather && target != breather)
to_chat(user, span_warning("\The pump is already in use."))
to_chat(user, span_warning("\The [src] is already in use."))
return
//Checking if breather is still valid
if(target == breather && target.wear_mask != contained)

View File

@@ -737,7 +737,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
/atom/proc/test_telecomms()
var/datum/signal/signal = src.telecomms_process()
var/pos_z = get_z(src)
return (pos_z in signal.data["level"] && signal.data["done"])
return ((pos_z in signal.data["level"]) && signal.data["done"])
/atom/proc/telecomms_process(var/do_sleep = 1)

View File

@@ -131,7 +131,7 @@
var/newnet = tgui_input_text(ui.user, "Which network do you want to view?", "Comm Monitor", network, 15)
newnet = sanitize(newnet,15)
if(newnet && ((ui.user in range(1, src) || issilicon(ui.user))))
if(newnet && ((ui.user in range(1, src)) || issilicon(ui.user)))
if(length(newnet) > 15)
set_temp("FAILED: NETWORK TAG STRING TOO LENGTHY", "bad")
return TRUE

View File

@@ -102,7 +102,7 @@
if("network")
var/newnet = tgui_input_text(ui.user, "Which network do you want to view?", "Comm Monitor", network, 15)
newnet = sanitize(newnet,15) //Honestly, I'd be amazed if someone managed to do HTML in 15 chars.
if(newnet && ((ui.user in range(1, src) || issilicon(ui.user))))
if(newnet && ((ui.user in range(1, src)) || issilicon(ui.user)))
if(length(newnet) > 15)
set_temp("FAILED: NETWORK TAG STRING TOO LENGTHY", "bad")
return TRUE

View File

@@ -195,7 +195,7 @@
var/newnet = tgui_input_text(usr, "Which network do you want to view?", "Comm Monitor", network, 15)
newnet = sanitize(newnet,15)
if(newnet && ((usr in range(1, src) || issilicon(usr))))
if(newnet && ((usr in range(1, src)) || issilicon(usr)))
if(length(newnet) > 15)
temp = "<font color = #D70B00>- FAILED: NETWORK TAG STRING TOO LENGHTLY -</font>"

View File

@@ -70,11 +70,11 @@
var/turf/loc = get_turf(user)
var/area/A = loc.loc
if(!istype(loc, /turf/simulated/floor))
to_chat(user, span_danger("\The frame cannot be placed on this spot."))
to_chat(user, span_danger("\The [src] cannot be placed on this spot."))
return
if(A.requires_power == 0 || A.name == "Space")
to_chat(user, span_danger("\The [src] Alarm cannot be placed in this area."))
to_chat(user, span_danger("\The [src] cannot be placed in this area."))
return
if(gotwallitem(loc, ndir))

View File

@@ -138,7 +138,7 @@
by_variable[variable] += 16
/proc/list_memory_size(list/L,list/list_of_lists,list/recursed_from)
if(L in recursed_from || LAZYLEN(recursed_from) > 64 || (LAZYLEN(recursed_from) && (L in list_of_lists))) return 0
if((L in recursed_from) || LAZYLEN(recursed_from) > 64 || (LAZYLEN(recursed_from) && (L in list_of_lists))) return 0
if(LAZYLEN(recursed_from) && refcount(L) > 4)
if(L in list_of_lists) list_of_lists[L]++
else list_of_lists[L] = 1

View File

@@ -393,8 +393,9 @@
// Copied from /obj/machinery/computer/supplycomp/ui_interact(),
// code\game\machinery\computer\supply.dm, starting at line 55
/obj/item/commcard/proc/get_supply_shuttle_status()
var/shuttle_status[0]
var/list/shuttle_status = list()
var/datum/shuttle/autodock/ferry/supply/shuttle = SSsupply.shuttle
if(shuttle)
if(shuttle.has_arrive_time())
shuttle_status["location"] = "In transit"
@@ -445,7 +446,7 @@
shuttle_status["engine"] = "Engaged"
else
shuttle["mode"] = SUP_SHUTTLE_ERROR
shuttle_status["mode"] = SUP_SHUTTLE_ERROR
return shuttle_status

View File

@@ -272,11 +272,7 @@
//Checks for various conditions to see if the mob is revivable
/obj/item/shockpaddles/proc/can_defib(mob/living/carbon/human/H) //This is checked before doing the defib operation
//CHOMPEdit Begin - Vox can be revived with jumper cables
if(H.get_species() == SPECIES_VOX && use_on_synthetic)
// Will silently continue to the other two checks.
//CHOMPEdit End - Edit included the else on the next line.
else if((H.species.flags & NO_DEFIB))
if((H.species.flags & NO_DEFIB))
return "buzzes, \"Incompatible physiology. Operation aborted.\""
else if(H.isSynthetic() && !use_on_synthetic)
return "buzzes, \"Synthetic Body. Operation aborted.\""

View File

@@ -195,7 +195,7 @@
H.eye_blurry = max(H.eye_blurry, flash_strength + 5)
H.flash_eyes()
H.adjustHalLoss(halloss_per_flash * (flash_strength / 5)) // Should take four flashes to stun.
H.apply_damage(flash_strength * H.species.flash_burn/5, BURN, BP_HEAD, 0, 0, "Photon burns")
H.apply_damage(flash_strength * H.species.flash_burn/5, BURN, BP_HEAD, 0, 0)
else
flashfail = 1

View File

@@ -483,8 +483,8 @@
//IF the crystal somehow ends up in a tummy and digesting with a bound mob who doesn't want to be eaten, let's move them to the ground
/obj/item/capture_crystal/digest_act(var/atom/movable/item_storage = null)
if(bound_mob) //CHOMPEdit
if(bound_mob in contents && !bound_mob.devourable)
if(bound_mob) // CHOMPEdit
if((bound_mob in contents) && !bound_mob.devourable)
bound_mob.forceMove(src.drop_location())
return ..()

View File

@@ -89,11 +89,11 @@
if(user.gloves && !protected_hands)
to_chat(user, span_warning("\The [src] partially cuts into your hand through your gloves as you hit \the [target]!"))
user.apply_damage(light_glove_d + will_break ? break_damage : 0, BRUTE, active_hand, 0, 0, src, src.sharp, src.edge) // Ternary to include break damage
user.apply_damage(light_glove_d + will_break ? break_damage : 0, BRUTE, active_hand, 0, 0, src.sharp, src.edge, src) // Ternary to include break damage
else if(!user.gloves)
to_chat(user, span_warning("\The [src] cuts into your hand as you hit \the [target]!"))
user.apply_damage(no_glove_d + will_break ? break_damage : 0, BRUTE, active_hand, 0, 0, src, src.sharp, src.edge)
user.apply_damage(no_glove_d + will_break ? break_damage : 0, BRUTE, active_hand, 0, 0, src.sharp, src.edge, src)
if(will_break && src.loc == user) // If it's not in our hand anymore
user.visible_message(span_danger("[user] hit \the [target] with \the [src], shattering it!"), span_warning("You shatter \the [src] in your hand!"))

View File

@@ -352,7 +352,7 @@
L.add_modifier(/datum/modifier/entangled, 3 SECONDS)
if(!L.apply_damage(force * (issilicon(L) ? 0.25 : 1), BRUTE, target_zone, blocked, soaked, src, sharp, edge))
if(!L.apply_damage(force * (issilicon(L) ? 0.25 : 1), BRUTE, target_zone, blocked, soaked, sharp, edge, src))
return
playsound(src, 'sound/effects/glass_step.ogg', 50, 1) // not sure how to handle metal shards with sounds

View File

@@ -70,7 +70,6 @@ var/global/list/micro_tunnels = list()
for(var/datum/planet/P in SSplanets.planets)
if(myturf.z in P.expected_z_levels)
planet = P
else
for(var/obj/structure/micro_tunnel/t in micro_tunnels)
if(t == src)
continue
@@ -85,7 +84,6 @@ var/global/list/micro_tunnels = list()
if(targetturf.z in planet.expected_z_levels)
destinations |= t
continue
else
var/above = GetAbove(myturf)
if(above && t.z == z + 1)
destinations |= t

View File

@@ -181,7 +181,7 @@ It also makes it so a ghost wont know where all the goodies/mobs are.
/obj/structure/mob_spawner/scanner/proc/CheckProximity(atom/movable/AM,turf/new_loc)
if(AM in mobs_in_range && (!AM || get_dist(src,new_loc) > range))
if((AM in mobs_in_range) && (!AM || get_dist(src,new_loc) > range))
mobs_in_range -= AM
//CHOMPEdit End

View File

@@ -152,7 +152,6 @@
if (prob(50))
qdel(src)
return
else
return
/obj/structure/closet/crate/secure

View File

@@ -40,7 +40,7 @@
comp.paused = FALSE
identifier = length(comp.identifier) > 0 ? comp.identifier : initial(identifier)
material = length(comp.material) > 0 ? comp.material : initial(material)
tint = length(comp.tint) > 0 ? comp.tint : initial(tint)
tint = length(comp.tint) > 0 ? comp.tint : initial(comp.tint)
adjective = length(comp.adjective) > 0 ? comp.adjective : initial(adjective)
if (copytext_char(adjective, -1) != "s")
adjective += "s"

View File

@@ -321,7 +321,6 @@
if (prob(5))
dismantle()
return
else
return
/obj/structure/girder/cult

View File

@@ -50,7 +50,6 @@
return
if(3.0)
return
else
return
/obj/structure/lattice/attackby(obj/item/C as obj, mob/user as mob)

View File

@@ -275,7 +275,7 @@
to_chat(user, span_warning("There is no tank in \the [src]."))
return
if(is_loosen)
to_chat(user, span_warning("Tighten \the nut with a wrench first."))
to_chat(user, span_warning("Tighten the nut with a wrench first."))
return
if(!Adjacent(target))
return

View File

@@ -277,7 +277,6 @@
if(3.0)
qdel(src)
return
else
return
// Duplicated from structures.dm, but its a bit different.

View File

@@ -1855,7 +1855,7 @@
desc = "The red flag of the Five Arrows."
description_fluff = "The Five Arrows is an independent government entity that seceded from the Solar Confederate Government in 2570, in response to perceived \
failures in aiding the Sagittarius Heights during the Skathari Incursion. The success of the government in achieving effective local defense and prosperity has \
since attracted the membership of Kauq'xum, a remote Skrellian colony. \The Five Arrows formed the model for SolGov's own semi-autonomous \"Regional Blocs\"."
since attracted the membership of Kauq'xum, a remote Skrellian colony. The Five Arrows formed the model for SolGov's own semi-autonomous \"Regional Blocs\"."
icon_state = "fivearrows"
flagtype = /obj/item/flag/fivearrows
@@ -1870,7 +1870,7 @@
desc = "The red flag of the Five Arrows."
description_fluff = "The Five Arrows is an independent government entity that seceded from the Solar Confederate Government in 2570, in response to perceived \
failures in aiding the Sagittarius Heights during the Skathari Incursion. The success of the government in achieving effective local defense and prosperity has \
since attracted the membership of Kauq'xum, a remote Skrellian colony. \The Five Arrows formed the model for SolGov's own semi-autonomous \"Regional Blocs\"."
since attracted the membership of Kauq'xum, a remote Skrellian colony. The Five Arrows formed the model for SolGov's own semi-autonomous \"Regional Blocs\"."
flag_path = "fivearrows"
/obj/item/flag/fivearrows/l

View File

@@ -581,7 +581,6 @@
return 6
if("SOUTHWEST", "SW")
return 10
else
return 0
@@ -606,5 +605,4 @@
return "NW"
if(10)
return "SW"
else
return

View File

@@ -52,7 +52,7 @@ var/list/turf_edge_cache = list()
user.setClickCooldown(delay)
if(do_after(user, delay, src))
new/obj/structure/closet/grave/dirthole(src)
to_chat(user, span_notice("You dug up \a hole!"))
to_chat(user, span_notice("You dug up a hole!"))
return
else
to_chat(user, span_notice("\The [user] begins digging into \the [src] with \the [C]."))

View File

@@ -275,7 +275,7 @@
var/list/locked = list("vars", "key", "ckey", "client", "firemut", "ishulk", "telekinesis", "xray", "virus", "viruses", "cuffed", "ka", "last_eaten", "urine")
master.buildmode.varholder = tgui_input_text(usr,"Enter variable name:" ,"Name", "name")
if(master.buildmode.varholder in locked && !check_rights(R_DEBUG,0))
if((master.buildmode.varholder in locked) && !check_rights(R_DEBUG,0))
return 1
var/thetype = tgui_input_list(usr,"Select variable type:", "Type", list("text","number","mob-reference","obj-reference","turf-reference"))
if(!thetype) return 1

View File

@@ -3,11 +3,12 @@
var/header
if(DA)
if (islist(DA))
var/list/data_list = DA
var/index = name
if (value)
name = DA[name] //name is really the index until this line
name = data_list[name] //name is really the index until this line
else
value = DA[name]
value = data_list[name]
header = "<li style='backgroundColor:white'>(<a href='byond://?_src_=vars;[HrefToken()];[VV_HK_LIST_EDIT]=1;target=\ref[DA];index=[index]'>E</a>) (<a href='byond://?_src_=vars;[HrefToken()];[VV_HK_LIST_CHANGE]=1;target=\ref[DA];index=[index]'>C</a>) (<a href='byond://?_src_=vars;[HrefToken()];[VV_HK_LIST_REMOVE]=1;target=\ref[DA];index=[index]'>-</a>) "
else
header = "<li style='backgroundColor:white'>(<a href='byond://?_src_=vars;[HrefToken()];datumedit=\ref[DA];varnameedit=[name]'>E</a>) (<a href='byond://?_src_=vars;[HrefToken()];datumchange=\ref[DA];varnamechange=[name]'>C</a>) (<a href='byond://?_src_=vars;[HrefToken()];datummass=\ref[DA];varnamemass=[name]'>M</a>) "

View File

@@ -5,7 +5,7 @@
#define AI_SMART 3 // Will do more processing to be a little smarter, like not walking while confused if it could risk stepping randomly onto a bad tile.
//#define ai_log(M,V) if(debug_ai) ai_log_output(M,V)
#define ai_log(M,V)
#define ai_log(M,V) // If you restore this, also remove the extra pass() calls in ai_holder_movement
// Logging level defines.
#define AI_LOG_OFF 0 // Don't show anything.

View File

@@ -62,6 +62,7 @@
give_destination(home_turf, max_home_distance)
else
ai_log("go_home() : Told to go home without home_turf.", AI_LOG_ERROR)
pass() // Remove this ever ai_log does something
/datum/ai_holder/proc/give_destination(turf/new_destination, min_distance = 1, combat = FALSE)
ai_log("give_destination() : Entering.", AI_LOG_DEBUG)
@@ -75,6 +76,7 @@
return TRUE
else
ai_log("give_destination() : Given null destination.", AI_LOG_ERROR)
pass() // Remove this ever ai_log does something
ai_log("give_destination() : Exiting.", AI_LOG_DEBUG)

View File

@@ -62,6 +62,25 @@
transform.crop(x1, y1, x2, y2)
return src
/// Internally performs a crop.
/datum/universal_icon/proc/shift(dir, amount, icon_width, icon_height)
if(!transform)
transform = new
var/list/offsets = dir2offset(dir)
var/shift_x = -offsets[1] * amount
var/shift_y = -offsets[2] * amount
transform.crop(1 + shift_x, 1 + shift_y, icon_width + shift_x, icon_height + shift_y)
return src
/// Internally performs a color blend.
/// Amount ranges from 0-1 (100% opacity)
/datum/universal_icon/proc/change_opacity(amount)
if(!transform)
transform = new
transform.blend_color("#ffffff[num2hex(clamp(amount, 0, 1) * 255, 2)]", ICON_MULTIPLY)
return src
/datum/universal_icon/proc/to_list()
RETURN_TYPE(/list)
return list("icon_file" = "[icon_file]", "icon_state" = icon_state, "dir" = dir, "frame" = frame, "transform" = !isnull(transform) ? transform.to_list() : list())
@@ -93,17 +112,17 @@
for(var/transform in src.transforms)
switch(transform["type"])
if(RUSTG_ICONFORGE_BLEND_COLOR)
target.Blend(target["color"], target["blend_mode"])
target.Blend(transform["color"], transform["blend_mode"])
if(RUSTG_ICONFORGE_BLEND_ICON)
var/datum/universal_icon/icon_object = target["icon"]
var/datum/universal_icon/icon_object = transform["icon"]
if(!istype(icon_object))
stack_trace("Invalid icon found in icon transformer during apply()! [icon_object]")
continue
target.Blend(icon_object.to_icon(), target["blend_mode"])
target.Blend(icon_object.to_icon(), transform["blend_mode"])
if(RUSTG_ICONFORGE_SCALE)
target.Scale(target["width"], target["height"])
target.Scale(transform["width"], transform["height"])
if(RUSTG_ICONFORGE_CROP)
target.Crop(target["x1"], target["y1"], target["x2"], target["y2"])
target.Crop(transform["x1"], transform["y1"], transform["x2"], transform["y2"])
return target
/datum/icon_transformer/proc/copy()
@@ -115,36 +134,60 @@
return new_transformer
/datum/icon_transformer/proc/blend_color(color, blend_mode)
#ifdef UNIT_TEST
if(!istext(color))
CRASH("Invalid color provided to blend_color: [color]")
if(!isnum(blend_mode))
CRASH("Invalid blend_mode provided to blend_color: [blend_mode]")
#endif
transforms += list(list("type" = RUSTG_ICONFORGE_BLEND_COLOR, "color" = color, "blend_mode" = blend_mode))
/datum/icon_transformer/proc/blend_icon(datum/universal_icon/icon_object, blend_mode)
#ifdef UNIT_TEST
// icon_object's type is checked later in to_list
if(!isnum(blend_mode))
CRASH("Invalid blend_mode provided to blend_icon: [blend_mode]")
#endif
transforms += list(list("type" = RUSTG_ICONFORGE_BLEND_ICON, "icon" = icon_object, "blend_mode" = blend_mode))
/datum/icon_transformer/proc/scale(width, height)
#ifdef UNIT_TEST
if(!isnum(width) || !isnum(height))
CRASH("Invalid arguments provided to scale: [width],[height]")
#endif
transforms += list(list("type" = RUSTG_ICONFORGE_SCALE, "width" = width, "height" = height))
/datum/icon_transformer/proc/crop(x1, y1, x2, y2)
#ifdef UNIT_TEST
if(!isnum(x1) || !isnum(y1) || !isnum(x2) || !isnum(y2))
CRASH("Invalid arguments provided to crop: [x1],[y1],[x2],[y2]")
#endif
transforms += list(list("type" = RUSTG_ICONFORGE_CROP, "x1" = x1, "y1" = y1, "x2" = x2, "y2" = y2))
/// Recursively converts all contained [/datum/universal_icon]s and their associated [/datum/icon_transformer]s into list form so the transforms can be JSON encoded.
/datum/icon_transformer/proc/to_list()
RETURN_TYPE(/list)
var/list/transforms_out = list()
for(var/transform in src.transforms.Copy())
var/this_transform = transform
var/list/transforms_original = src.transforms.Copy()
for(var/list/transform as anything in transforms_original)
var/list/this_transform = transform.Copy() // copy it so we don't mutate the original
if(transform["type"] == RUSTG_ICONFORGE_BLEND_ICON)
var/datum/universal_icon/icon_object = this_transform["icon"]
if(!istype(icon_object))
stack_trace("Invalid icon found in icon transformer during to_list()! [icon_object]")
continue
// This mutates the inner transform list!!! Make sure it only runs on copies.
this_transform["icon"] = icon_object.to_list()
transforms_out += list(this_transform)
return transforms_out
/// Reverse operation of /datum/icon_transformer/to_list()
/proc/icon_transformer_from_list(list/input)
RETURN_TYPE(/datum/icon_transformer)
var/list/transforms = list()
for(var/transform in input)
var/this_transform = transform
for(var/list/transform as anything in input)
// don't mutate the input :(
var/this_transform = transform.Copy()
if(transform["type"] == RUSTG_ICONFORGE_BLEND_ICON)
this_transform["icon"] = universal_icon_from_list(transform["icon"])
transforms += list(this_transform)

View File

@@ -3020,7 +3020,7 @@
acronym = "SAARE"
desc = "SAARE consistently have the worst reputation of any paramilitary group. This is because they specialize in deniability and secrecy. Although publically they work in asset recovery, they have a substantiated reputation for info-theft and piracy that has lead to them butting heads with the law on more than one occasion. Nonetheless, they are an invaluable part of the Solar economy, and other TSCs and small colonial governments keep them in business.\
<br><br>\
For the purposes of plausible deniability, SAARE designates their ships using a series of rotating identifiers, with ships on a specific operation or in a particular area all using the same initial designation (<i>e.g.</i> 'Sledgehammer') and having a different numerical identifier, with the most important ships involved bearing a unique additional codename (such as 'Actual' for Command \& Control ships). As ships are shuffled in and out of operating areas, it can be difficult to pin down exactly which ship in SAARE's fleet was responsible for which act. SAARE's misdirection is multilayered, including elements such as extensive use of repainting, false IFFs, bribes, forged documents, intimidation, camouflage, and all manner of other underhanded tactics."
For the purposes of plausible deniability, SAARE designates their ships using a series of rotating identifiers, with ships on a specific operation or in a particular area all using the same initial designation (<i>e.g.</i> 'Sledgehammer') and having a different numerical identifier, with the most important ships involved bearing a unique additional codename (such as 'Actual' for Command & Control ships). As ships are shuffled in and out of operating areas, it can be difficult to pin down exactly which ship in SAARE's fleet was responsible for which act. SAARE's misdirection is multilayered, including elements such as extensive use of repainting, false IFFs, bribes, forged documents, intimidation, camouflage, and all manner of other underhanded tactics."
history = ""
work = "mercenary contractors"
headquarters = ""

View File

@@ -2608,7 +2608,7 @@
acronym = "SAARE"
desc = "SAARE consistently have the worst reputation of any paramilitary group. This is because they specialize in deniability and secrecy. Although publically they work in asset recovery, they have a substantiated reputation for info-theft and piracy that has lead to them butting heads with the law on more than one occasion. Nonetheless, they are an invaluable part of the Solar economy, and other TSCs and small colonial governments keep them in business.\
<br><br>\
For the purposes of plausible deniability, SAARE designates their ships using a series of rotating identifiers, with ships on a specific operation or in a particular area all using the same initial designation (" + span_italics("e.g.") + " 'Sledgehammer') and having a different numerical identifier, with the most important ships involved bearing a unique additional codename (such as 'Actual' for Command \& Control ships). As ships are shuffled in and out of operating areas, it can be difficult to pin down exactly which ship in SAARE's fleet was responsible for which act. SAARE's misdirection is multilayered, including elements such as extensive use of repainting, false IFFs, bribes, forged documents, intimidation, camouflage, and all manner of other underhanded tactics."
For the purposes of plausible deniability, SAARE designates their ships using a series of rotating identifiers, with ships on a specific operation or in a particular area all using the same initial designation (" + span_italics("e.g.") + " 'Sledgehammer') and having a different numerical identifier, with the most important ships involved bearing a unique additional codename (such as 'Actual' for Command & Control ships). As ships are shuffled in and out of operating areas, it can be difficult to pin down exactly which ship in SAARE's fleet was responsible for which act. SAARE's misdirection is multilayered, including elements such as extensive use of repainting, false IFFs, bribes, forged documents, intimidation, camouflage, and all manner of other underhanded tactics."
history = ""
work = "mercenary contractors"
headquarters = ""

View File

@@ -60,6 +60,7 @@
if(href_list["flavor_text"])
switch(href_list["flavor_text"])
if("open")
pass()
if("general")
var/msg = strip_html_simple(tgui_input_text(user,"Give a general description of your character. This will be shown regardless of clothings. Put in a single space to make blank.","Flavor Text",html_decode(pref.flavor_texts[href_list["flavor_text"]]), multiline = TRUE, prevent_enter = TRUE)) //VOREStation Edit: separating out OOC notes
if(CanUseTopic(user) && msg)
@@ -74,6 +75,7 @@
else if(href_list["flavour_text_robot"])
switch(href_list["flavour_text_robot"])
if("open")
pass()
if("Default")
var/msg = strip_html_simple(tgui_input_text(user,"Set the default flavour text for your robot. It will be used for any module without individual setting. Put in a single space to make blank.","Flavour Text",html_decode(pref.flavour_texts_robot["Default"]), multiline = TRUE, prevent_enter = TRUE))
if(CanUseTopic(user) && msg)

View File

@@ -553,7 +553,6 @@ var/global/list/valid_bloodreagents = list("default",REAGENT_ID_IRON,REAGENT_ID_
else
picklist = everyone_traits_negative.Copy() - pref.neg_traits
mylist = pref.neg_traits
else
if(isnull(picklist))
return TOPIC_REFRESH
@@ -620,11 +619,11 @@ var/global/list/valid_bloodreagents = list("default",REAGENT_ID_IRON,REAGENT_ID_
tgui_alert_async(user, "The trait you've selected cannot be taken by the species you've chosen!", "Error")
return TOPIC_REFRESH
if(trait_choice in pref.pos_traits + pref.neu_traits + pref.neg_traits)
if(trait_choice in (pref.pos_traits + pref.neu_traits + pref.neg_traits))
conflict = instance.name
varconflict:
for(var/P in pref.pos_traits + pref.neu_traits + pref.neg_traits)
for(var/P in (pref.pos_traits + pref.neu_traits + pref.neg_traits))
var/datum/trait/instance_test = all_traits[P]
if(path in instance_test.excludes)
conflict = instance_test.name

View File

@@ -114,7 +114,7 @@
var/found = FALSE
for(var/access in valid_access)
if(access in id_card.GetAccess() || emagged)
if((access in id_card.GetAccess()) || emagged)
to_chat(user, "You imprint your ID details onto the badge.")
set_name(user.real_name)
found = TRUE

View File

@@ -178,7 +178,6 @@ GLOBAL_LIST_EMPTY(vending_products)
malfunction()
return
return
else
return
/obj/machinery/vending/emag_act(var/remaining_charges, var/mob/user)

View File

@@ -103,7 +103,7 @@
if(victim.vore_taste)
to_chat(user, span_infoplain(span_bold("[victim]") + " tastes like... [victim.vore_taste]!"))
victim.apply_damage(5, used_weapon = "straw")
victim.apply_damage(5, used_weapon=src)
// If you're human you get the reagent
if(ishuman(user))

View File

@@ -207,7 +207,7 @@
var/obj/item/thecake_layer/C = W
if(C.layer_stage == 5)
for(var/mob/O in view(src, null))
O.show_message(span_warning("It has been done! \The Infinity Cake has been assembled!"),1)
O.show_message(span_warning("It has been done! The Infinity Cake has been assembled!"),1)
qdel(W)
stage++
desc = desclist[stage]

View File

@@ -273,7 +273,7 @@
switch(reagent_mix)
if (RECIPE_REAGENT_REPLACE)
//We do no transferring
pass() //We do no transferring
if (RECIPE_REAGENT_SUM)
//Sum is easy, just shove the entire buffer into the result
buffer.trans_to_holder(holder, buffer.total_volume)

View File

@@ -140,7 +140,7 @@
if(affecting)
to_chat(target, span_danger("\The [fruit]'s thorns pierce your [affecting.name] greedily!"))
target.apply_damage(damage, BRUTE, target_limb, blocked, soaked, TRUE, has_edge, "Thorns")
target.apply_damage(damage, BRUTE, target_limb, blocked, soaked, TRUE, has_edge)
else
to_chat(target, span_danger("\The [fruit]'s thorns pierce your flesh greedily!"))
target.adjustBruteLoss(damage)
@@ -149,7 +149,7 @@
has_edge = prob(get_trait(TRAIT_POTENCY)/5)
if(affecting)
to_chat(target, span_danger("\The [fruit]'s thorns dig deeply into your [affecting.name]!"))
target.apply_damage(damage, BRUTE, target_limb, blocked, soaked, TRUE, has_edge, "Thorns")
target.apply_damage(damage, BRUTE, target_limb, blocked, soaked, TRUE, has_edge)
else
to_chat(target, span_danger("\The [fruit]'s thorns dig deeply into your flesh!"))
target.adjustBruteLoss(damage)

View File

@@ -314,7 +314,6 @@
if (prob(5))
die_off()
return
else
return
/obj/effect/plant/proc/check_health()

View File

@@ -20,7 +20,7 @@
write_data_to_pin(new_data)
/datum/integrated_io/dir/write_data_to_pin(var/new_data)
if(isnull(new_data) || (new_data in alldirs + list(UP, DOWN)))
if(isnull(new_data) || (new_data in (alldirs + list(UP, DOWN))))
data = new_data
holder.on_data_written()

View File

@@ -87,7 +87,6 @@
b.loc = (get_turf(src))
qdel(src)
return
else
return
/obj/structure/bookcase/update_icon()

View File

@@ -34,8 +34,8 @@
if(burn_user)
H.visible_message(span_danger("\The [src] flashes as it scorches [H]'s hands!"))
H.apply_damage(amount / 2 + 5, BURN, "r_hand", used_weapon="Supermatter Chunk")
H.apply_damage(amount / 2 + 5, BURN, "l_hand", used_weapon="Supermatter Chunk")
H.apply_damage(amount / 2 + 5, BURN, "r_hand", used_weapon=src)
H.apply_damage(amount / 2 + 5, BURN, "l_hand", used_weapon=src)
H.drop_from_inventory(src, get_turf(H))
return
@@ -43,7 +43,7 @@
burn_user = FALSE
if(burn_user)
M.apply_damage(amount, BURN, null, used_weapon="Supermatter Chunk")
M.apply_damage(amount, BURN, null, used_weapon=src)
/obj/item/stack/material/supermatter/ex_act(severity) // An incredibly hard to manufacture material, SM chunks are unstable by their 'stabilized' nature.
if(prob((4 / severity) * 20))

View File

@@ -159,10 +159,10 @@
if (shock_damage<1)
return 0
src.apply_damage(0.2 * shock_damage, BURN, def_zone, used_weapon="Electrocution") //shock the target organ
src.apply_damage(0.4 * shock_damage, BURN, BP_TORSO, used_weapon="Electrocution") //shock the torso more
src.apply_damage(0.2 * shock_damage, BURN, null, used_weapon="Electrocution") //shock a random part!
src.apply_damage(0.2 * shock_damage, BURN, null, used_weapon="Electrocution") //shock a random part!
src.apply_damage(0.2 * shock_damage, BURN, def_zone) //shock the target organ
src.apply_damage(0.4 * shock_damage, BURN, BP_TORSO) //shock the torso more
src.apply_damage(0.2 * shock_damage, BURN, null) //shock a random part!
src.apply_damage(0.2 * shock_damage, BURN, null) //shock a random part!
playsound(src, "sparks", 50, 1, -1)
if (shock_damage > 15)

View File

@@ -1803,7 +1803,7 @@
var/obj/item/organ/external/e = organs_by_name[name]
if(!e)
continue
if((e.status & ORGAN_BROKEN && (!e.splinted || (e.splinted in e.contents && prob(30))) || e.status & ORGAN_BLEEDING) && (getBruteLoss() + getFireLoss() >= 100))
if((e.status & ORGAN_BROKEN && (!e.splinted || ((e.splinted in e.contents) && prob(30))) || e.status & ORGAN_BLEEDING) && (getBruteLoss() + getFireLoss() >= 100))
return 1
else
return ..()

View File

@@ -809,13 +809,13 @@
if(breath.temperature >= species.heat_discomfort_level)
if(breath.temperature >= species.breath_heat_level_3)
apply_damage(HEAT_GAS_DAMAGE_LEVEL_3, BURN, BP_HEAD, used_weapon = "Excessive Heat")
apply_damage(HEAT_GAS_DAMAGE_LEVEL_3, BURN, BP_HEAD)
throw_alert("temp", /obj/screen/alert/hot, HOT_ALERT_SEVERITY_MAX)
else if(breath.temperature >= species.breath_heat_level_2)
apply_damage(HEAT_GAS_DAMAGE_LEVEL_2, BURN, BP_HEAD, used_weapon = "Excessive Heat")
apply_damage(HEAT_GAS_DAMAGE_LEVEL_2, BURN, BP_HEAD)
throw_alert("temp", /obj/screen/alert/hot, HOT_ALERT_SEVERITY_MODERATE)
else if(breath.temperature >= species.breath_heat_level_1)
apply_damage(HEAT_GAS_DAMAGE_LEVEL_1, BURN, BP_HEAD, used_weapon = "Excessive Heat")
apply_damage(HEAT_GAS_DAMAGE_LEVEL_1, BURN, BP_HEAD)
throw_alert("temp", /obj/screen/alert/hot, HOT_ALERT_SEVERITY_LOW)
else if(species.get_environment_discomfort(src, ENVIRONMENT_COMFORT_MARKER_HOT))
throw_alert("temp", /obj/screen/alert/warm, HOT_ALERT_SEVERITY_LOW)
@@ -825,13 +825,13 @@
else if(breath.temperature <= species.cold_discomfort_level)
if(breath.temperature <= species.breath_cold_level_3)
apply_damage(COLD_GAS_DAMAGE_LEVEL_3, BURN, BP_HEAD, used_weapon = "Excessive Cold")
apply_damage(COLD_GAS_DAMAGE_LEVEL_3, BURN, BP_HEAD)
throw_alert("temp", /obj/screen/alert/cold, COLD_ALERT_SEVERITY_MAX)
else if(breath.temperature <= species.breath_cold_level_2)
apply_damage(COLD_GAS_DAMAGE_LEVEL_2, BURN, BP_HEAD, used_weapon = "Excessive Cold")
apply_damage(COLD_GAS_DAMAGE_LEVEL_2, BURN, BP_HEAD)
throw_alert("temp", /obj/screen/alert/cold, COLD_ALERT_SEVERITY_MODERATE)
else if(breath.temperature <= species.breath_cold_level_1)
apply_damage(COLD_GAS_DAMAGE_LEVEL_1, BURN, BP_HEAD, used_weapon = "Excessive Cold")
apply_damage(COLD_GAS_DAMAGE_LEVEL_1, BURN, BP_HEAD)
throw_alert("temp", /obj/screen/alert/cold, COLD_ALERT_SEVERITY_LOW)
else if(species.get_environment_discomfort(src, ENVIRONMENT_COMFORT_MARKER_COLD))
throw_alert("temp", /obj/screen/alert/chilly, COLD_ALERT_SEVERITY_LOW)

View File

@@ -131,7 +131,7 @@
message_data[2] = pick(M.say_verbs)
. = 1
else if(CE_SPEEDBOOST in chem_effects || is_jittery) // motor mouth
else if((CE_SPEEDBOOST in chem_effects) || is_jittery) // motor mouth
// Despite trying to url/html decode these, byond is just being bad and I dunno.
var/static/regex/speedboost_initial = new (@"&[a-z]{2,5};|&#\d{2};","g")
// Not herestring because bad vs code syntax highlight panics at apostrophe

View File

@@ -54,7 +54,7 @@
ideal_air_type = /datum/gas_mixture/belly_air/vox
siemens_coefficient = 0.2
flags = NO_SCAN | NO_DEFIB
flags = NO_SCAN // CHOMPEdit - Vox can now be defibbed
spawn_flags = SPECIES_IS_WHITELISTED
appearance_flags = HAS_EYE_COLOR | HAS_HAIR_COLOR | HAS_SKIN_COLOR

View File

@@ -710,11 +710,15 @@
to_chat(owner, span_warning("A dark maw you deployed has triggered!"))
spawn(10)
var/will_vore = 1
if(!owner || !(target in owner) || !L.devourable || !L.can_be_drop_prey || !owner.can_be_drop_pred || !L.phase_vore)
will_vore = 0
if(!src || src.gc_destroyed)
//We got deleted probably, do nothing more
else if(L.loc != get_turf(src))
return
if(L.loc != get_turf(src))
visible_message(span_notice("The shadowy tendrils fail to catch anything and dissipate."))
qdel(src)
else if(will_vore)

View File

@@ -270,19 +270,19 @@
var/bodypart = pick(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO,BP_GROIN,BP_HEAD)
if(breath.temperature >= breath_heat_level_1)
if(breath.temperature < breath_heat_level_2)
H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_1, BURN, bodypart, used_weapon = "Excessive Heat")
H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_1, BURN, bodypart)
else if(breath.temperature < breath_heat_level_3)
H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_2, BURN, bodypart, used_weapon = "Excessive Heat")
H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_2, BURN, bodypart)
else
H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_3, BURN, bodypart, used_weapon = "Excessive Heat")
H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_3, BURN, bodypart)
else if(breath.temperature <= breath_cold_level_1)
if(breath.temperature > breath_cold_level_2)
H.apply_damage(COLD_GAS_DAMAGE_LEVEL_1, BURN, bodypart, used_weapon = "Excessive Cold")
H.apply_damage(COLD_GAS_DAMAGE_LEVEL_1, BURN, bodypart)
else if(breath.temperature > breath_cold_level_3)
H.apply_damage(COLD_GAS_DAMAGE_LEVEL_2, BURN, bodypart, used_weapon = "Excessive Cold")
H.apply_damage(COLD_GAS_DAMAGE_LEVEL_2, BURN, bodypart)
else
H.apply_damage(COLD_GAS_DAMAGE_LEVEL_3, BURN, bodypart, used_weapon = "Excessive Cold")
H.apply_damage(COLD_GAS_DAMAGE_LEVEL_3, BURN, bodypart)
//breathing in hot/cold air also heats/cools you a bit

View File

@@ -8,7 +8,7 @@
blurb = "Greys are a species of aliens that are more weak than humans physically, but possesses\
the ability to talk telephatically with themselves and other species, Due to this, Grey have no\
naming scheme or language, having names only to make easier communication with other species.\
<br>\The Grey have unknown origin even to themselves, scientists believes they came from\
<br>The Grey have unknown origin even to themselves, scientists believes they came from\
another galaxy, greys have chosen mauna-b to act as their home planet due to high amount of grey\
residing in there."

View File

@@ -538,7 +538,7 @@
for(var/K in damageable)
if(!(K in covered))
H.apply_damage(light_amount/4, BURN, K, 0, 0, "Abnormal growths")
H.apply_damage(light_amount/4, BURN, K, 0, 0)
/datum/species/diona
name = SPECIES_DIONA

View File

@@ -8,7 +8,7 @@
Returns
standard 0 if fail
*/
/mob/living/proc/apply_damage(var/damage = 0,var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/soaked = 0, var/used_weapon = null, var/sharp = FALSE, var/edge = FALSE, var/obj/used_weapon = null, var/projectile = 0)
/mob/living/proc/apply_damage(var/damage = 0, var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/soaked = 0, var/sharp = FALSE, var/edge = FALSE, var/obj/used_weapon = null, var/projectile = 0)
if(Debug2)
to_world_log("## DEBUG: apply_damage() was called on [src], with [damage] damage, and an armor value of [blocked].")
if(!damage || (blocked >= 100))
@@ -77,8 +77,8 @@
damage = 0
adjustFireLoss(damage * blocked)
if(SEARING)
apply_damage(round(damage / 3), BURN, def_zone, initial_blocked, soaked, used_weapon, sharp, edge)
apply_damage(round(damage / 3 * 2), BRUTE, def_zone, initial_blocked, soaked, used_weapon, sharp, edge)
apply_damage(round(damage / 3), BURN, def_zone, initial_blocked, soaked, sharp, edge, used_weapon)
apply_damage(round(damage / 3 * 2), BRUTE, def_zone, initial_blocked, soaked, sharp, edge, used_weapon)
if(TOX)
adjustToxLoss(damage * blocked)
if(OXY)
@@ -91,7 +91,7 @@
electrocute_act(damage, used_weapon, 1.0, def_zone)
if(BIOACID)
if(isSynthetic())
apply_damage(damage, BURN, def_zone, initial_blocked, soaked, used_weapon, sharp, edge) // Handle it as normal burn.
apply_damage(damage, BURN, def_zone, initial_blocked, soaked, sharp, edge, used_weapon) // Handle it as normal burn.
else
adjustToxLoss(damage * blocked)
if(ELECTROMAG)

View File

@@ -130,12 +130,12 @@
if(P.taser_effect)
stun_effect_act(0, P.agony, def_zone, P)
if(!P.nodamage)
apply_damage(P.damage, P.damage_type, def_zone, absorb, soaked, 0, P, sharp=proj_sharp, edge=proj_edge, projectile=TRUE)
apply_damage(P.damage, P.damage_type, def_zone, absorb, soaked, 0, sharp=proj_sharp, edge=proj_edge, used_weapon=P, projectile=TRUE)
qdel(P)
return
if(!P.nodamage)
apply_damage(P.damage, P.damage_type, def_zone, absorb, soaked, 0, P, sharp=proj_sharp, edge=proj_edge, projectile=TRUE)
apply_damage(P.damage, P.damage_type, def_zone, absorb, soaked, 0, sharp=proj_sharp, edge=proj_edge, used_weapon=P, projectile=TRUE)
P.on_hit(src, absorb, soaked, def_zone)
if(absorb == 100)

View File

@@ -232,8 +232,7 @@
/mob/living/silicon/pai/verb/pick_eye_color()
set category = "Abilities.pAI Commands"
set name = "Pick Eye Color"
if(chassis in allows_eye_color)
else
if(!(chassis in allows_eye_color))
to_chat(src, span_warning("Your selected chassis eye color can not be modified. The color you pick will only apply to supporting chassis and your card screen."))
var/new_eye_color = tgui_color_picker(src, "Choose your character's eye color:", "Eye Color")
@@ -271,7 +270,6 @@
eye_layer = image('icons/mob/pai_vr64x32.dmi', "type13-eyes")
else if(holo_icon_dimension_X == 64 && holo_icon_dimension_Y == 64)
eye_layer = image('icons/mob/pai_vr64x64.dmi', "type13-eyes")
else
else if(chassis in allows_eye_color)
eye_layer = image(icon, "[icon_state]-eyes")
else return

View File

@@ -469,7 +469,7 @@
/obj/item/dogborg/sleeper/proc/inject_chem(mob/user, chem)
if(patient && patient.reagents)
if(chem in injection_chems + REAGENT_ID_INAPROVALINE)
if(chem in (injection_chems + REAGENT_ID_INAPROVALINE))
if(hound.cell.charge < 800) //This is so borgs don't kill themselves with it.
to_chat(hound, span_notice("You don't have enough power to synthesize fluids."))
return
@@ -864,7 +864,7 @@
/obj/item/dogborg/sleeper/compactor/brewer/inject_chem(mob/user, chem) //CHOMP Addition Start
if(patient && patient.reagents)
if(chem in injection_chems + REAGENT_ID_INAPROVALINE)
if((chem in injection_chems) + REAGENT_ID_INAPROVALINE)
if(hound.cell.charge < 200) //This is so borgs don't kill themselves with it.
to_chat(hound, span_notice("You don't have enough power to synthesize fluids."))
return

View File

@@ -548,7 +548,7 @@
if(wood)
wood.add_charge(4000)
else if(istype(W,/obj/item/pipe))
// This allows drones and engiborgs to clear pipe assemblies from floors.
pass() // This allows drones and engiborgs to clear pipe assemblies from floors.
else
continue

View File

@@ -59,11 +59,11 @@
L.visible_message(span_warning("\The [L] uselessly hits \the [src]!"))
L.do_attack_animation(src)
return
apply_damage(damage = real_damage, damagetype = hit_dam_type, def_zone = null, blocked = armor, blocked = resistance, used_weapon = null, sharp = FALSE, edge = FALSE)
apply_damage(damage = real_damage, damagetype = hit_dam_type, def_zone = null, blocked = armor, blocked = resistance, sharp = FALSE, edge = FALSE, used_weapon = null)
L.visible_message(span_warning("\The [L] [pick(attack.attack_verb)] \the [src]!"))
L.do_attack_animation(src)
return //VOREStation EDIT END
apply_damage(damage = harm_intent_damage, damagetype = BRUTE, def_zone = null, blocked = armor, blocked = resistance, used_weapon = null, sharp = FALSE, edge = FALSE) //VOREStation EDIT Somebody set this to burn instead of brute.
apply_damage(damage = harm_intent_damage, damagetype = BRUTE, def_zone = null, blocked = armor, blocked = resistance, sharp = FALSE, edge = FALSE, used_weapon = null) //VOREStation EDIT Somebody set this to burn instead of brute.
L.visible_message(span_warning("\The [L] [response_harm] \the [src]!"))
L.do_attack_animation(src)
@@ -148,7 +148,7 @@
if (3.0)
bombdam = 30
apply_damage(damage = bombdam, damagetype = BRUTE, def_zone = null, blocked = armor, blocked = resistance, used_weapon = null, sharp = FALSE, edge = FALSE)
apply_damage(damage = bombdam, damagetype = BRUTE, def_zone = null, blocked = armor, blocked = resistance, sharp = FALSE, edge = FALSE, used_weapon = null)
if(bombdam > maxHealth)
gib()
@@ -198,7 +198,7 @@
if(shock_damage < 1)
return 0
apply_damage(damage = shock_damage, damagetype = BURN, def_zone = null, blocked = null, blocked = resistance, used_weapon = null, sharp = FALSE, edge = FALSE)
apply_damage(damage = shock_damage, damagetype = BURN, def_zone = null, blocked = null, blocked = resistance, sharp = FALSE, edge = FALSE, used_weapon = null)
playsound(src, "sparks", 50, 1, -1)
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
@@ -227,11 +227,11 @@
if(stun_amount)
stunDam += stun_amount * 0.5
apply_damage(damage = stunDam, damagetype = BURN, def_zone = null, blocked = armor, blocked = resistance, used_weapon = used_weapon, sharp = FALSE, edge = FALSE)
apply_damage(damage = stunDam, damagetype = BURN, def_zone = null, blocked = armor, blocked = resistance, sharp = FALSE, edge = FALSE, used_weapon = used_weapon)
if(agony_amount)
agonyDam += agony_amount * 0.5
apply_damage(damage = agonyDam, damagetype = BURN, def_zone = null, blocked = armor, blocked = resistance, used_weapon = used_weapon, sharp = FALSE, edge = FALSE)
apply_damage(damage = agonyDam, damagetype = BURN, def_zone = null, blocked = armor, blocked = resistance, sharp = FALSE, edge = FALSE, used_weapon = used_weapon)
// Electromagnetism

View File

@@ -821,7 +821,9 @@ GLOBAL_VAR_INIT(teppi_count, 0) // How mant teppi DO we have?
ai_holder.set_busy(FALSE)
/mob/living/simple_mob/vore/alienanimals/teppi/perform_the_nom(user, mob/living/prey, user, belly, delay)
/mob/living/simple_mob/vore/alienanimals/teppi/perform_the_nom(mob/living/user, mob/living/prey, mob/living/pred, obj/belly/belly, delay)
if(!pred)
pred = user
if(client)
return ..()
var/current_affinity = affinity[prey.real_name]

View File

@@ -194,7 +194,7 @@
to_chat(H, span_alien("You are disoriented by \the [src]!"))
H.eye_blurry = max(H.eye_blurry, flash_strength + 5)
H.flash_eyes()
H.apply_damage(flash_strength * H.species.flash_burn/5, BURN, BP_HEAD, 0, 0, "Photon burns")
H.apply_damage(flash_strength * H.species.flash_burn/5, BURN, BP_HEAD, 0, 0)
else if(issilicon(L))
if(isrobot(L))
@@ -272,7 +272,7 @@
var/mob/living/L = A
if(ishuman(L))
var/mob/living/carbon/human/H = L
H.apply_damage(damage_to_apply, BRUTE, BP_TORSO, 0, 0, "Animal claws")
H.apply_damage(damage_to_apply, BRUTE, BP_TORSO, 0, 0)
else
L.adjustBruteLoss(damage_to_apply)

View File

@@ -160,6 +160,7 @@
if(prob(1))
winterize()
if("summer")
pass()
if("autumn")
vore_bump_chance = 20
if(prob(50))

View File

@@ -93,15 +93,15 @@
/mob/living/simple_mob/humanoid/possessed/Destroy()
var/droploc = get_turf(src)
playsound(src, 'sound/effects/blobattack.ogg', 40, 1)
visible_message(span_critical(pick("\The The horrid screech of metal grating metal cuts through the air as the suit's interlocking joints grind and fold inwards upon itself. A putrid wash of decayed flesh spills forwards, staining the ground dark with the contents of the collapsing RIG's long expired pilot.",
"\The The [src] shudders as some hurt living thing, reeling as screaming servos overcompensate beneath the weight of that debilitating strike - the horrid sounds of shattered metal resonate as the RIG rips itself apart. Limbs flung about in distinctly inhuman motions in a final failed effort at balance before buckling inwards at the joints, hydraulic fluid jettisoned as blood from a severed artery as the long liquidized contents of the suit's ex-pilot spill from its chassis in a thick slurry.",
"\The Hissing atmosphereic valves pop and snap, breaking the ageless seal as the putrid stench of rot and carrion assaults the senses in debilitating waves. The damaged RIG's visor alight with warnings of hazardous atmospheric conditions as a final distorted scream echos from within the damaged chassis. The fetid miasma that breeches through those wheezing seals overtaken by a wet burble and plop as the suit is bathed in the liquid contents of its passenger, blackened flesh fed through those narrow seals as rotten grounds.",
"\The The timeworn suit's seals finally crack open with a hiss - spilling forth a thick fungal mist. The control module ejects from the rig as it loses all control impulses - leaving behind but a pile of bones and the rotten sludge it had been swimming in for heaven knows how long.",
"\The The [src]'s emergency protocols kick in, retracting around the former-person, who's now little more than a disgusting pile of parts not even a vulture would want. The control module appears to be intact, however.",
"\The The suit finally lets go of the prisoner it had held for so long. Unfortunately, this guy reminds you of that news report of someone who forgot that Ganymede rock lobster in a fridge for a year, the thick miasma of fungi and rotten gasses visibly pouring out, pushing out rancid bits of meat and slimy bones. The only salvageable bit appears to be the Control Module.",
"\The A few last desperate seals give out with a weary series of pops, and the suit contorts with the final pressure differentials resolved: the suit tangles and leaks, and finally compacts back into it's rightful shape.",
"\The Tightening, the suit re-attempts to remain it's current form, before it collapses under the stress, supporting mechanisms closing in on themselves like a noose with nothing left to catch on.",
"\The The suit makes a noise akin to clockwork binding, and shutters, before something imperceptible gives with an abysmal noise and the suit returns to it's default form.")))
visible_message(span_critical(pick("The horrid screech of metal grating metal cuts through the air as the suit's interlocking joints grind and fold inwards upon itself. A putrid wash of decayed flesh spills forwards, staining the ground dark with the contents of the collapsing RIG's long expired pilot.",
"\The [src] shudders as some hurt living thing, reeling as screaming servos overcompensate beneath the weight of that debilitating strike - the horrid sounds of shattered metal resonate as the RIG rips itself apart. Limbs flung about in distinctly inhuman motions in a final failed effort at balance before buckling inwards at the joints, hydraulic fluid jettisoned as blood from a severed artery as the long liquidized contents of the suit's ex-pilot spill from its chassis in a thick slurry.",
"Hissing atmosphereic valves pop and snap, breaking the ageless seal as the putrid stench of rot and carrion assaults the senses in debilitating waves. The damaged RIG's visor alight with warnings of hazardous atmospheric conditions as a final distorted scream echos from within the damaged chassis. The fetid miasma that breeches through those wheezing seals overtaken by a wet burble and plop as the suit is bathed in the liquid contents of its passenger, blackened flesh fed through those narrow seals as rotten grounds.",
"The timeworn suit's seals finally crack open with a hiss - spilling forth a thick fungal mist. The control module ejects from the rig as it loses all control impulses - leaving behind but a pile of bones and the rotten sludge it had been swimming in for heaven knows how long.",
"\The [src]'s emergency protocols kick in, retracting around the former-person, who's now little more than a disgusting pile of parts not even a vulture would want. The control module appears to be intact, however.",
"The suit finally lets go of the prisoner it had held for so long. Unfortunately, this guy reminds you of that news report of someone who forgot that Ganymede rock lobster in a fridge for a year, the thick miasma of fungi and rotten gasses visibly pouring out, pushing out rancid bits of meat and slimy bones. The only salvageable bit appears to be the Control Module.",
"A few last desperate seals give out with a weary series of pops, and the suit contorts with the final pressure differentials resolved: the suit tangles and leaks, and finally compacts back into it's rightful shape.",
"Tightening, the suit re-attempts to remain it's current form, before it collapses under the stress, supporting mechanisms closing in on themselves like a noose with nothing left to catch on.",
"The suit makes a noise akin to clockwork binding, and shutters, before something imperceptible gives with an abysmal noise and the suit returns to it's default form.")))
gib()
/* Nah
if(rand(1,2) == 1)

View File

@@ -275,9 +275,6 @@
goia_overlays["belly"] = choice
goia_overlays["zorgoia_belly"] = new_color
update_icon()
else
/mob/living/simple_mob/vore/zorgoia/Initialize()
..()

View File

@@ -101,7 +101,7 @@
var/armor = target.run_armor_check(BP_HEAD, "melee")
var/soaked = target.get_armor_soak(BP_HEAD, "melee")
target.apply_damage(damage, BRUTE, BP_HEAD, armor, soaked)
attacker.apply_damage(10, BRUTE, BP_HEAD, attacker.run_armor_check(BP_HEAD), attacker.get_armor_soak(BP_HEAD), "melee")
attacker.apply_damage(10, BRUTE, BP_HEAD, attacker.run_armor_check(BP_HEAD), attacker.get_armor_soak(BP_HEAD))
if(!armor && target.headcheck(BP_HEAD) && prob(damage))
target.apply_effect(20, PARALYZE)

View File

@@ -225,7 +225,7 @@
if(job_civilian_low & ASSISTANT)
previewJob = job_master.GetJob(JOB_ALT_VISITOR)
else if(client && ispAI(client.mob)) //VOREStation Edit! - pAIs shouldn't wear job gear~!
//Don't do anything!
pass() //Don't do anything!
else
for(var/datum/job/job in job_master.occupations)
var/job_flag

View File

@@ -78,7 +78,7 @@
qdel(W)
else if(B.pages.len == 1) //if only one item left, extract item and delete the one-item bundle
user.drop_from_inventory(B)
user.put_in_hands(B[1])
user.put_in_hands(B.pages[1])
qdel(B)
else //if at least two items remain, just update the bundle icon
B.update_icon()
@@ -89,4 +89,4 @@
if(holder2 && (holder2.nano_printer == src))
holder2.nano_printer = null
holder2 = null
return ..()
return ..()

View File

@@ -145,7 +145,7 @@ GLOBAL_DATUM_INIT(overmap_event_handler, /decl/overmap_event_handler, new)
/decl/overmap_event_handler/proc/is_event_in_turf(var/datum/event/E, var/turf/T)
for(var/obj/effect/overmap/event/hazard in hazard_by_turf[T])
if(E in hazard.events && E.severity == hazard.difficulty)
if((E in hazard.events) && E.severity == hazard.difficulty)
return TRUE
/decl/overmap_event_handler/proc/is_event_included(var/list/hazards, var/obj/effect/overmap/event/E, var/equal_or_better)//this proc is only used so it can break out of 2 loops cleanly

View File

@@ -172,7 +172,7 @@
to_chat(usr, span_notice("You remove the [W.name] from the bundle."))
if(pages.len <= 1)
var/obj/item/paper/P = src[1]
var/obj/item/paper/P = pages[1]
usr.drop_from_inventory(src)
usr.put_in_hands(P)
qdel(src)

View File

@@ -15,7 +15,7 @@
src.contents += P
P = new()
P.name = "Staff Notice: Breakroom \& Storage"
P.name = "Staff Notice: Breakroom & Storage"
P.info = "<br>Enjoy the view from the new breakroom. You've also got a storage room full of leftover supplies from the shift before yours."
P.stamped = list(/obj/item/stamp/cmo)
P.add_overlay("paper_stamped_cmo")

View File

@@ -428,7 +428,7 @@ var/datum/planet/virgo3b/planet_virgo3b = null
if(amount_soaked >= damage)
continue // No need to apply damage.
H.apply_damage(damage, BRUTE, target_zone, amount_blocked, amount_soaked, used_weapon = "hail")
H.apply_damage(damage, BRUTE, target_zone, amount_blocked, amount_soaked)
if(show_message)
to_chat(H, effect_message)

View File

@@ -418,7 +418,7 @@ var/datum/planet/virgo3c/planet_virgo3c = null
if(amount_soaked >= damage)
continue // No need to apply damage.
H.apply_damage(damage, BRUTE, target_zone, amount_blocked, amount_soaked, used_weapon = "hail")
H.apply_damage(damage, BRUTE, target_zone, amount_blocked, amount_soaked)
if(show_message)
to_chat(H, effect_message)

View File

@@ -402,7 +402,7 @@ var/datum/planet/virgo4/planet_virgo4 = null
if(amount_soaked >= damage)
continue // No need to apply damage.
H.apply_damage(damage, BRUTE, target_zone, amount_blocked, amount_soaked, used_weapon = "hail")
H.apply_damage(damage, BRUTE, target_zone, amount_blocked, amount_soaked)
if(show_message)
to_chat(H, effect_message)

View File

@@ -152,7 +152,6 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
if (prob(25))
qdel(src)
return
else
return
/obj/structure/particle_accelerator/update_icon()
@@ -324,7 +323,6 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
if (prob(25))
qdel(src)
return
else
return
/obj/machinery/particle_accelerator/proc/update_state()

View File

@@ -725,7 +725,7 @@
in_chamber.on_hit(M)
if(in_chamber.damage_type != HALLOSS && !in_chamber.nodamage)
log_and_message_admins("commited suicide using \a [src]", user)
user.apply_damage(in_chamber.damage*2.5, in_chamber.damage_type, "head", used_weapon = "Point blank shot in the mouth with \a [in_chamber]", sharp = TRUE)
user.apply_damage(in_chamber.damage*2.5, in_chamber.damage_type, "head", sharp = TRUE, used_weapon = src)
user.death()
else if(in_chamber.damage_type == HALLOSS)
to_chat(user, span_notice("Ow..."))

View File

@@ -133,7 +133,7 @@
else if(firer)
var/obj/T
if(original in target.contents && istype(original, /obj))
if((original in target.contents) && istype(original, /obj))
T = original
var/list/possible_targets = list()

Some files were not shown because too many files have changed in this diff Show More