From dd9c91cf5f9f0a53b72b483bc7b8cf007347392b Mon Sep 17 00:00:00 2001 From: Belsima Date: Sat, 6 May 2017 09:27:38 -0400 Subject: [PATCH 01/82] Lets biological females have facial hair. --- code/modules/mob/new_player/sprite_accessories.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index f6679a6dfe..cab1856683 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -561,7 +561,6 @@ /datum/sprite_accessory/facial_hair icon = 'icons/mob/Human_face.dmi' - gender = MALE shaved name = "Shaved" @@ -1236,4 +1235,4 @@ name = "Default skrell skin" icon_state = "default" icon = 'icons/mob/human_races/r_skrell.dmi' - species_allowed = list("Skrell") \ No newline at end of file + species_allowed = list("Skrell") From c95df78a549e4a1bc07cafd3fc37f9838b6ee89b Mon Sep 17 00:00:00 2001 From: Yoshax Date: Mon, 22 May 2017 15:33:29 +0100 Subject: [PATCH 02/82] Fixes a bug with healthy analzyers and adds radiation showing to them, from Bay --- code/game/objects/items/devices/scanners.dm | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 5d883784aa..6399d0ce4a 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -69,7 +69,7 @@ REAGENT SCANNER user.show_message("Analyzing Results for [M]:") user.show_message("Overall Status: dead") else - user.show_message("Analyzing Results for [M]:\n\t Overall Status: [M.stat > 1 ? "dead" : "[round((M.health/M.getMaxHealth())*100) ]% healthy"]") + user.show_message("Analyzing Results for [M]:\n\t Overall Status: [M.stat > 1 ? "dead" : "[round(M.health*100/M.maxHealth)]% healthy"]") user.show_message(" Key: Suffocation/Toxin/Burns/Brute", 1) user.show_message(" Damage Specifics: [OX] - [TX] - [BU] - [BR]") user.show_message("Body Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)", 1) @@ -99,6 +99,10 @@ REAGENT SCANNER if(M.status_flags & FAKEDEATH) OX = fake_oxy > 50 ? "Severe oxygen deprivation detected" : "Subject bloodstream oxygen level normal" user.show_message("[OX] | [TX] | [BU] | [BR]") + if(M.radiation) + user.show_message("Radiation Level: [M.radiation]") + else + user.show_message("No radiation detected.") if(istype(M, /mob/living/carbon)) var/mob/living/carbon/C = M if(C.reagents.total_volume) From 6185bbd212c9085fd69bc1769e1ca5f0d754d5af Mon Sep 17 00:00:00 2001 From: Ben Reeve Date: Thu, 15 Dec 2016 19:07:39 +0000 Subject: [PATCH 03/82] Unified radiation system --- code/controllers/Processes/radiation.dm | 43 +++++++ code/controllers/configuration.dm | 4 + code/datums/repositories/radiation.dm | 114 ++++++++++++++++++ code/game/atoms_movable.dm | 3 + code/game/gamemodes/meteor/meteors.dm | 3 +- code/game/machinery/doors/airlock.dm | 13 +- code/game/machinery/doors/blast_door.dm | 11 +- code/game/machinery/doors/door.dm | 2 + code/game/machinery/vending.dm | 2 +- code/game/mecha/equipment/tools/tools.dm | 6 +- code/game/objects/items/devices/geiger.dm | 53 ++++++++ .../crates_lockers/closets/utility_closets.dm | 2 + code/game/turfs/simulated/wall_attacks.dm | 2 + code/game/turfs/simulated/wall_icon.dm | 1 + code/game/turfs/simulated/walls.dm | 6 +- code/game/turfs/turf.dm | 11 +- code/modules/events/event_container.dm | 2 +- code/modules/events/radiation_storm.dm | 10 +- code/modules/events/solar_storm.dm | 17 ++- code/modules/mining/mine_turfs.dm | 4 +- .../mob/living/carbon/human/human_defense.dm | 2 +- .../mob/living/silicon/robot/robot_modules.dm | 2 + code/modules/power/port_gen.dm | 8 +- code/modules/power/singularity/collector.dm | 5 + code/modules/power/singularity/singularity.dm | 10 +- code/modules/supermatter/supermatter.dm | 22 +++- .../xenoarcheaology/effects/radiate.dm | 10 +- .../tools/geosample_scanner.dm | 5 +- html/changelogs/cirra-Radiation.yml | 37 ++++++ icons/obj/device.dmi | Bin 51528 -> 55614 bytes polaris.dme | 3 + 31 files changed, 337 insertions(+), 76 deletions(-) create mode 100644 code/controllers/Processes/radiation.dm create mode 100644 code/datums/repositories/radiation.dm create mode 100644 code/game/objects/items/devices/geiger.dm create mode 100644 html/changelogs/cirra-Radiation.yml diff --git a/code/controllers/Processes/radiation.dm b/code/controllers/Processes/radiation.dm new file mode 100644 index 0000000000..8ebd3a71a8 --- /dev/null +++ b/code/controllers/Processes/radiation.dm @@ -0,0 +1,43 @@ +/datum/controller/process/radiation + var/repository/radiation/linked = null + +/datum/controller/process/radiation/setup() + name = "radiation controller" + schedule_interval = 20 // every 2 seconds + linked = radiation_repository + +/datum/controller/process/radiation/doWork() +// set background = 1 + for(var/turf/T in linked.irradiated_turfs) + if(!T) + linked.irradiated_turfs.Remove(T) + continue + linked.irradiated_turfs[T] -= config.radiation_decay_rate + if(linked.irradiated_turfs[T] <= config.radiation_lower_limit) + linked.irradiated_turfs.Remove(T) + SCHECK + for(var/mob/living/L in linked.irradiated_mobs) + if(!L) + linked.irradiated_mobs.Remove(L) + continue + if(get_turf(L) in linked.irradiated_turfs) + L.rad_act(linked.irradiated_turfs[get_turf(L)]) + if(!L.radiation) + linked.irradiated_mobs.Remove(L) + SCHECK + for(var/thing in linked.sources) + if(!thing) + linked.sources.Remove(thing) + continue + var/atom/emitter = thing + linked.radiate(emitter, emitter.rad_power) + to_process.Cut() + SCHECK + for(var/thing in linked.resistance_cache) + if(!thing) + linked.resistance_cache.Remove(thing) + continue + var/turf/T = thing + if((length(T.contents) + 1) != linked.resistance_cache[T]) + T.calc_rad_resistance() + SCHECK \ No newline at end of file diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 5021453462..c22ac1bc81 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -219,6 +219,10 @@ var/list/gamemode_cache = list() var/show_human_death_message = 1 + var/radiation_decay_rate = 1 //How much radiation is reduced by each tick + var/radiation_resistance_multiplier = 6.5 + var/radiation_lower_limit = 0.35 //If the radiation level for a turf would be below this, ignore it. + /datum/configuration/New() var/list/L = typesof(/datum/game_mode) - /datum/game_mode for (var/T in L) diff --git a/code/datums/repositories/radiation.dm b/code/datums/repositories/radiation.dm new file mode 100644 index 0000000000..bdf2b18322 --- /dev/null +++ b/code/datums/repositories/radiation.dm @@ -0,0 +1,114 @@ +//#define RADDBG + +var/repository/radiation/radiation_repository = new() + +var/list/to_process = list() + +/repository/radiation + var/list/sources = list() //All the radiation sources we know about + var/list/irradiated_turfs = list() + var/list/irradiated_mobs = list() + var/list/resistance_cache = list() + +/repository/radiation/proc/report_rads(var/turf/T as turf) + return irradiated_turfs[T] + +/repository/radiation/proc/radiate(source, power) //Sends out a radiation pulse, taking walls into account + if(!(source && power)) //Sanity checking + return + + var/range = min(round(sqrt(power / config.radiation_lower_limit)), 31) + var/turf/epicentre = get_turf(source) + to_process = list() + + range = min(epicentre.x, world.maxx - epicentre.x, epicentre.y, world.maxy - epicentre.y, range) + + to_process = trange(range, epicentre) + to_process[epicentre] = power + + for(var/turf/spot in to_process) + var/turf/origin = get_turf(epicentre) + var/working = power + while(origin != spot) + origin = get_step_towards(origin, spot) //Raytracing + if(!(origin in resistance_cache)) //Only get the resistance if we don't already know it. + origin.calc_rad_resistance() + working = max((working - (origin.rad_resistance * config.radiation_resistance_multiplier)), 0) + if(!working) + break + if(!to_process[origin]) + to_process[origin] = working + + else + to_process[origin] = max(to_process[origin], working) + + for(var/turf/spot in to_process) + irradiated_turfs[spot] = max(((to_process[spot]) * (1 / (get_dist(epicentre, spot) ** 2))), irradiated_turfs[spot]) //Butchered version of the inverse square law. Works for this purpose + #ifdef RADDBG + var/x = Clamp( irradiated_turfs[spot], 0, 255) + spot.color = rgb(5,x,5) + #endif + +/repository/radiation/proc/flat_radiate(source, power, range, var/respect_maint=0) //Sets the radiation in a range to a constant value. + if(!(source && power && range)) + return + var/turf/epicentre = get_turf(source) + range = min(epicentre.x, world.maxx - epicentre.x, epicentre.y, world.maxy - epicentre.y, range) + if(!respect_maint) + for(var/turf/T in trange(range, epicentre)) + irradiated_turfs[T] = max(power, irradiated_turfs[T]) + else + for(var/turf/T in trange(range, epicentre)) + var/area/A = T.loc + if(A.flags & RAD_SHIELDED) + continue + irradiated_turfs[T] = max(power, irradiated_turfs[T]) + +/repository/radiation/proc/z_radiate(var/atom/source, power, var/respect_maint=0) //Irradiates a full Z-level. Hacky way of doing it, but not too expensive. + if(!(power && source)) + return + var/turf/epicentre = locate(round(world.maxx / 2), round(world.maxy / 2), source.z) + flat_radiate(epicentre, power, world.maxx, respect_maint) + +/turf/proc/calc_rad_resistance() + rad_resistance = 0 + for(var/obj/O in src.contents) + if(O.rad_resistance) //Override + rad_resistance += O.rad_resistance + + else if(O.density) //So doors don't get counted + var/material/M = O.get_material() + if(!M) continue + rad_resistance += M.weight + radiation_repository.resistance_cache[src] = (length(contents) + 1) + +/turf/simulated/wall/calc_rad_resistance() + radiation_repository.resistance_cache[src] = (length(contents) + 1) + rad_resistance = (density ? material.weight : 0) + +/atom + var/rad_power = 0 + var/rad_resistance = 0 + +/atom/Destroy() + if(rad_power) + radiation_repository.sources.Remove(src) + . = ..() + +/atom/proc/update_radiation() //For VV'ing something to make it radioactive at runtime + if((rad_power) && (!(src in radiation_repository.sources))) + radiation_repository.sources.Add(src) + else if((!rad_power) && (src in radiation_repository.sources)) + radiation_repository.sources.Remove(src) + +/atom/proc/rad_act(var/severity) //If people expand the system, this may be useful. Here as a placeholder until then + return 1 + +/mob/living/rad_act(var/severity) + if(severity) + src.apply_effect(severity, IRRADIATE, src.getarmor(null, "rad")) + for(var/obj/I in src) + I.rad_act(severity) + + +//#undef RADDBG \ No newline at end of file diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index fe9f99b032..82061ddb6a 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -53,6 +53,9 @@ pulledby = null /atom/movable/proc/initialize() + if(rad_power) + radiation_repository.sources.Add(src) + if(!isnull(gcDestroyed)) crash_with("GC: -- [type] had initialize() called after qdel() --") diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm index ad8b89ec80..c5096d12d8 100644 --- a/code/game/gamemodes/meteor/meteors.dm +++ b/code/game/gamemodes/meteor/meteors.dm @@ -271,8 +271,7 @@ if(explode) explosion(src.loc, devastation_range = 0, heavy_impact_range = 0, light_impact_range = 4, flash_range = 6, adminlog = 0) new /obj/effect/decal/cleanable/greenglow(get_turf(src)) - for(var/mob/living/L in view(10, src)) - L.apply_effect(40, IRRADIATE) + radiation_repository.radiate(src, 50) // This meteor fries toasters. /obj/effect/meteor/emp diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index e78cba3568..c1ec9287b0 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -263,6 +263,7 @@ icon = 'icons/obj/doors/Dooruranium.dmi' mineral = "uranium" var/last_event = 0 + rad_power = 7.5 /obj/machinery/door/airlock/process() // Deliberate no call to parent. @@ -277,18 +278,6 @@ ..() -/obj/machinery/door/airlock/uranium/process() - if(world.time > last_event+20) - if(prob(50)) - radiate() - last_event = world.time - ..() - -/obj/machinery/door/airlock/uranium/proc/radiate() - for(var/mob/living/L in range (3,src)) - L.apply_effect(15,IRRADIATE,0) - return - /obj/machinery/door/airlock/phoron name = "Phoron Airlock" desc = "No way this can end badly." diff --git a/code/game/machinery/doors/blast_door.dm b/code/game/machinery/doors/blast_door.dm index 3d899377cc..f8e1d1cbb5 100644 --- a/code/game/machinery/doors/blast_door.dm +++ b/code/game/machinery/doors/blast_door.dm @@ -13,7 +13,7 @@ icon = 'icons/obj/doors/rapid_pdoor.dmi' icon_state = null min_force = 20 //minimum amount of force needed to damage the door with a melee weapon - + var/material/implicit_material // Icon states for different shutter types. Simply change this instead of rewriting the update_icon proc. var/icon_state_open = null var/icon_state_opening = null @@ -29,6 +29,13 @@ //turning this off prevents awkward zone geometry in places like medbay lobby, for example. block_air_zones = 0 +/obj/machinery/door/blast/initialize() + ..() + implicit_material = get_material_by_name("plasteel") + +/obj/machinery/door/blast/get_material() + return implicit_material + // Proc: Bumped() // Parameters: 1 (AM - Atom that tried to walk through this object) // Description: If we are open returns zero, otherwise returns result of parent function. @@ -46,6 +53,8 @@ icon_state = icon_state_closed else icon_state = icon_state_open + var/turf/T = get_turf(src) + T.calc_rad_resistance() return // Proc: force_open() diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 7a1d6abd02..898683192f 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -362,6 +362,8 @@ icon_state = "door1" else icon_state = "door0" + var/turf/T = get_turf(src) + T.calc_rad_resistance() return diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 3d53a053f0..58bed70d07 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -1029,7 +1029,7 @@ icon_state = "engivend" icon_deny = "engivend-deny" req_access = list(access_engine_equip) - products = list(/obj/item/clothing/glasses/meson = 2,/obj/item/device/multitool = 4,/obj/item/weapon/cell/high = 10, + products = list(/obj/item/device/geiger = 4,/obj/item/clothing/glasses/meson = 2,/obj/item/device/multitool = 4,/obj/item/weapon/cell/high = 10, /obj/item/weapon/airlock_electronics = 10,/obj/item/weapon/module/power_control = 10, /obj/item/weapon/circuitboard/airalarm = 10,/obj/item/weapon/circuitboard/firealarm = 10,/obj/item/weapon/circuitboard/status_display = 2, /obj/item/weapon/circuitboard/ai_status_display = 2,/obj/item/weapon/circuitboard/newscaster = 2,/obj/item/weapon/circuitboard/holopad = 2, diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm index 9b2e0aa26d..4d7ee902d8 100644 --- a/code/game/mecha/equipment/tools/tools.dm +++ b/code/game/mecha/equipment/tools/tools.dm @@ -973,11 +973,7 @@ process(var/obj/item/mecha_parts/mecha_equipment/generator/nuclear/EG) if(..()) - for(var/mob/living/carbon/M in view(EG.chassis)) - if(istype(M,/mob/living/carbon/human)) - M.apply_effect((EG.rad_per_cycle*3),IRRADIATE,0) - else - M.apply_effect(EG.rad_per_cycle, IRRADIATE) + radiation_repository.radiate(EG, (EG.rad_per_cycle * 3)) return 1 diff --git a/code/game/objects/items/devices/geiger.dm b/code/game/objects/items/devices/geiger.dm new file mode 100644 index 0000000000..acd85b730c --- /dev/null +++ b/code/game/objects/items/devices/geiger.dm @@ -0,0 +1,53 @@ +#define RAD_LEVEL_LOW 5 //10 // Around the level at which radiation starts to become harmful +#define RAD_LEVEL_MODERATE 15 //15 +#define RAD_LEVEL_HIGH 50 //50 +#define RAD_LEVEL_VERY_HIGH 100 //100 + +//Geiger counter +//Rewritten version of TG's geiger counter +//I opted to show exact radiation levels + +/obj/item/device/geiger + name = "geiger counter" + desc = "A handheld device used for detecting and measuring radiation in an area." + icon_state = "geiger_off" + item_state = "multitool" + w_class = ITEMSIZE_SMALL + var/scanning = 0 + var/radiation_count = 0 + +/obj/item/device/geiger/New() + processing_objects |= src + +/obj/item/device/geiger/process() + if(!scanning) + return + radiation_count = radiation_repository.report_rads(get_turf(src)) + update_icon() + +/obj/item/device/geiger/examine(mob/user) + ..(user) + to_chat(user, "[scanning ? "ambient" : "stored"] radiation level: [radiation_count ? radiation_count : "0"]Bq.") + +/obj/item/device/geiger/attack_self(var/mob/user) + scanning = !scanning + update_icon() + to_chat(user, "\icon[src] You switch [scanning ? "on" : "off"] [src].") + +/obj/item/device/geiger/update_icon() + if(!scanning) + icon_state = "geiger_off" + return 1 + + switch(radiation_count) + if(null) icon_state = "geiger_on_1" + if(-INFINITY to RAD_LEVEL_LOW) icon_state = "geiger_on_1" + if(RAD_LEVEL_LOW + 1 to RAD_LEVEL_MODERATE) icon_state = "geiger_on_2" + if(RAD_LEVEL_MODERATE + 1 to RAD_LEVEL_HIGH) icon_state = "geiger_on_3" + if(RAD_LEVEL_HIGH + 1 to RAD_LEVEL_VERY_HIGH) icon_state = "geiger_on_4" + if(RAD_LEVEL_VERY_HIGH + 1 to INFINITY) icon_state = "geiger_on_5" + +#undef RAD_LEVEL_LOW +#undef RAD_LEVEL_MODERATE +#undef RAD_LEVEL_HIGH +#undef RAD_LEVEL_VERY_HIGH \ No newline at end of file diff --git a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm index 5c8aa2b2e0..67a4d3e788 100644 --- a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm @@ -155,6 +155,8 @@ new /obj/item/clothing/head/radiation(src) new /obj/item/clothing/suit/radiation(src) new /obj/item/clothing/head/radiation(src) + new /obj/item/device/geiger(src) + new /obj/item/device/geiger(src) /* * Bombsuit closet diff --git a/code/game/turfs/simulated/wall_attacks.dm b/code/game/turfs/simulated/wall_attacks.dm index 098782ebdf..b236e4dc90 100644 --- a/code/game/turfs/simulated/wall_attacks.dm +++ b/code/game/turfs/simulated/wall_attacks.dm @@ -7,6 +7,8 @@ if(can_open == WALL_OPENING) return + calc_rad_resistance() + if(density) can_open = WALL_OPENING //flick("[material.icon_base]fwall_opening", src) diff --git a/code/game/turfs/simulated/wall_icon.dm b/code/game/turfs/simulated/wall_icon.dm index dc7874b2aa..757639e1bb 100644 --- a/code/game/turfs/simulated/wall_icon.dm +++ b/code/game/turfs/simulated/wall_icon.dm @@ -26,6 +26,7 @@ else if(material.opacity < 0.5 && opacity) set_light(0) + calc_rad_resistance() update_connections(1) update_icon() diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index f8544e714d..376fb8e452 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -48,6 +48,9 @@ if(!radiate()) return PROCESS_KILL +/turf/simulated/wall/proc/get_material() + return material + /turf/simulated/wall/bullet_act(var/obj/item/projectile/Proj) if(istype(Proj,/obj/item/projectile/beam)) burn(2500) @@ -265,8 +268,7 @@ if(!total_radiation) return - for(var/mob/living/L in range(3,src)) - L.apply_effect(total_radiation, IRRADIATE,0) + radiation_repository.radiate(src, total_radiation) return total_radiation /turf/simulated/wall/proc/burn(temperature) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 3f2e0064f2..87b4b2b648 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -140,6 +140,12 @@ var/const/enterloopsanity = 100 if(ismob(A)) var/mob/M = A + var/mob/living/L = A + if(istype(L)) + if(!(L in radiation_repository.irradiated_mobs)) + if(src in radiation_repository.irradiated_turfs) + radiation_repository.irradiated_mobs.Add(L) + L.handle_footstep(src) if(!M.lastarea) M.lastarea = get_area(M.loc) if(M.lastarea.has_gravity == 0) @@ -147,9 +153,6 @@ var/const/enterloopsanity = 100 else if(!is_space()) M.inertia_dir = 0 M.make_floating(0) - if(isliving(M)) - var/mob/living/L = M - L.handle_footstep(src) ..() var/objects = 0 if(A && (A.flags & PROXMOVE)) @@ -255,4 +258,4 @@ var/const/enterloopsanity = 100 step(AM, turn(AM.last_move, 180)) if(isliving(AM)) var/mob/living/M = AM - M.turf_collision(src, speed) + M.turf_collision(src, speed) \ No newline at end of file diff --git a/code/modules/events/event_container.dm b/code/modules/events/event_container.dm index 37a576a442..804d13404d 100644 --- a/code/modules/events/event_container.dm +++ b/code/modules/events/event_container.dm @@ -186,4 +186,4 @@ var/global/list/severity_to_string = list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT #undef ASSIGNMENT_JANITOR #undef ASSIGNMENT_MEDICAL #undef ASSIGNMENT_SCIENTIST -#undef ASSIGNMENT_SECURITY +#undef ASSIGNMENT_SECURITY \ No newline at end of file diff --git a/code/modules/events/radiation_storm.dm b/code/modules/events/radiation_storm.dm index b9435f25aa..a8c9386fde 100644 --- a/code/modules/events/radiation_storm.dm +++ b/code/modules/events/radiation_storm.dm @@ -30,20 +30,18 @@ command_announcement.Announce("The station has passed the radiation belt. Please report to medbay if you experience any unusual symptoms. Maintenance will lose all access again shortly.", "Anomaly Alert") /datum/event/radiation_storm/proc/radiate() + var/radiation_level = rand(15, 35) + for(var/z in using_map.station_levels) + radiation_repository.z_radiate(locate(1, 1, z), radiation_level, 1) + for(var/mob/living/carbon/C in living_mob_list) var/area/A = get_area(C) if(!A) continue - if(!(A.z in using_map.station_levels)) - continue - if(A.flags & RAD_SHIELDED) - continue if(istype(C,/mob/living/carbon/human)) var/mob/living/carbon/human/H = C - H.apply_effect((rand(15,35)),IRRADIATE,0) if(prob(5)) - H.apply_effect((rand(40,70)),IRRADIATE,0) if (prob(75)) randmutb(H) // Applies bad mutation domutcheck(H,null,MUTCHK_FORCED) diff --git a/code/modules/events/solar_storm.dm b/code/modules/events/solar_storm.dm index 971e0418bc..4ebfc71d55 100644 --- a/code/modules/events/solar_storm.dm +++ b/code/modules/events/solar_storm.dm @@ -27,17 +27,14 @@ radiate() /datum/event/solar_storm/proc/radiate() - for(var/mob/living/L in living_mob_list) - var/turf/T = get_turf(L) - if(!T) + var/radiation_level = rand(15, 30) + for(var/area/A in all_areas) + if(!(A.z in using_map.player_levels)) continue - - if(!istype(T.loc,/area/space) && !istype(T,/turf/space)) //Make sure you're in a space area or on a space turf - continue - - //Todo: Apply some burn damage from the heat of the sun. Until then, enjoy some moderate radiation. - L.apply_effect((rand(15,30)),IRRADIATE,blocked = L.getarmor(null, "rad")) - + for(var/turf/T in A) + if(!istype(T.loc,/area/space) && !istype(T,/turf/space)) + continue + radiation_repository.irradiated_turfs[T] = radiation_level /datum/event/solar_storm/end() command_announcement.Announce("The solar storm has passed the station. It is now safe to resume EVA activities. Please report to medbay if you experience any unusual symptoms. ", "Anomaly Alert") diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index bf59f3c382..68363fb27f 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -482,7 +482,7 @@ var/list/mining_overlay_cache = list() M.flash_eyes() if(prob(50)) M.Stun(5) - M.apply_effect(25, IRRADIATE) + radiation_repository.flat_radiate(src, 25, 200) if(prob(25)) excavate_find(prob(5), finds[1]) else if(rand(1,500) == 1) @@ -559,4 +559,4 @@ var/list/mining_overlay_cache = list() if(mineral_name && (mineral_name in ore_data)) mineral = ore_data[mineral_name] UpdateMineral() - update_icon() + update_icon() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 61b13316b8..8f7398e0a8 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -94,7 +94,7 @@ emp_act var/obj/item/organ/external/organ = organs_by_name[organ_name] if(organ) var/weight = organ_rel_size[organ_name] - armorval += getarmor_organ(organ, type) * weight + armorval += (getarmor_organ(organ, type) * weight) total += weight return (armorval/max(total, 1)) diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 795e535ebf..4b2c7f6f79 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -352,6 +352,7 @@ var/global/list/robot_modules = list( src.modules += new /obj/item/device/pipe_painter(src) src.modules += new /obj/item/device/floor_painter(src) src.modules += new /obj/item/weapon/gripper/no_use/loader(src) + src.modules += new /obj/item/device/geiger(src) var/datum/matter_synth/metal = new /datum/matter_synth/metal() var/datum/matter_synth/plasteel = new /datum/matter_synth/plasteel() @@ -396,6 +397,7 @@ var/global/list/robot_modules = list( src.modules += new /obj/item/device/pipe_painter(src) src.modules += new /obj/item/device/floor_painter(src) src.emag = new /obj/item/weapon/melee/baton/robot/arm(src) + src.modules += new /obj/item/device/geiger(src) var/datum/matter_synth/metal = new /datum/matter_synth/metal(40000) var/datum/matter_synth/glass = new /datum/matter_synth/glass(40000) diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index f900f6fcf4..6a40cf3b8e 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -396,17 +396,13 @@ /obj/machinery/power/port_gen/pacman/super/UseFuel() //produces a tiny amount of radiation when in use if (prob(2*power_output)) - for (var/mob/living/L in range(src, 5)) - L.apply_effect(1, IRRADIATE) //should amount to ~5 rads per minute at max safe power + radiation_repository.radiate(src, 4) ..() /obj/machinery/power/port_gen/pacman/super/explode() //a nice burst of radiation var/rads = 50 + (sheets + sheet_left)*1.5 - for (var/mob/living/L in range(src, 10)) - //should really fall with the square of the distance, but that makes the rads value drop too fast - //I dunno, maybe physics works different when you live in 2D -- SM radiation also works like this, apparently - L.apply_effect(max(20, round(rads/get_dist(L,src))), IRRADIATE) + radiation_repository.radiate(src, (max(20, rads))) explosion(src.loc, 3, 3, 5, 3) qdel(src) diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm index dee15d9f14..ba817d392a 100644 --- a/code/modules/power/singularity/collector.dm +++ b/code/modules/power/singularity/collector.dm @@ -31,6 +31,11 @@ var/global/list/rad_collectors = list() last_power_new = 0 + var/turf/T = get_turf(src) + if(T in radiation_repository.irradiated_turfs) + receive_pulse((radiation_repository.irradiated_turfs[T] * 5)) //Maths is hard + + if(P) if(P.air_contents.gas["phoron"] == 0) investigate_log("out of fuel.","singulo") diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index 39090ceac5..9309c6bd3c 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -406,15 +406,13 @@ var/toxrange = 10 var/toxdamage = 4 var/radiation = 15 - var/radiationmin = 3 if (src.energy>200) toxdamage = round(((src.energy-150)/50)*4,1) radiation = round(((src.energy-150)/50)*5,1) - radiationmin = round((radiation/5),1)// + radiation_repository.radiate(src, radiation) //Always radiate at max, so a decent dose of radiation is applied for(var/mob/living/M in view(toxrange, src.loc)) if(M.status_flags & GODMODE) continue - M.apply_effect(rand(radiationmin,radiation), IRRADIATE) toxdamage = (toxdamage - (toxdamage*M.getarmor(null, "rad"))) M.apply_effect(toxdamage, TOX) return @@ -448,13 +446,13 @@ /obj/singularity/proc/smwave() for(var/mob/living/M in view(10, src.loc)) if(prob(67)) - M.apply_effect(rand(energy), IRRADIATE) - M << "You hear an uneartly ringing, then what sounds like a shrilling kettle as you are washed with a wave of heat." - M << "Miraculously, it fails to kill you." + to_chat(M, "You hear an uneartly ringing, then what sounds like a shrilling kettle as you are washed with a wave of heat.") + to_chat(M, "Miraculously, it fails to kill you.") else M << "You hear an uneartly ringing, then what sounds like a shrilling kettle as you are washed with a wave of heat." M << "You don't even have a moment to react as you are reduced to ashes by the intense radiation." M.dust() + radiation_repository.radiate(src, rand(energy)) return /obj/singularity/proc/pulse() diff --git a/code/modules/supermatter/supermatter.dm b/code/modules/supermatter/supermatter.dm index 1ebd8207e0..46f8033b24 100644 --- a/code/modules/supermatter/supermatter.dm +++ b/code/modules/supermatter/supermatter.dm @@ -23,8 +23,11 @@ #define DAMAGE_RATE_LIMIT 3 //damage rate cap at power = 300, scales linearly with power -//These would be what you would get at point blank, decreases with distance -#define DETONATION_RADS 200 +// Base variants are applied to everyone on the same Z level +// Range variants are applied on per-range basis: numbers here are on point blank, it scales with the map size (assumes square shaped Z levels) +#define DETONATION_RADS 20 +#define DETONATION_HALLUCINATION_BASE 300 +#define DETONATION_HALLUCINATION_RANGE 300 #define DETONATION_HALLUCINATION 600 @@ -39,6 +42,7 @@ anchored = 0 light_range = 4 + rad_power = 1 //So it gets added to the repository var/gasefficency = 0.25 var/base_icon_state = "darkmatter" @@ -95,6 +99,10 @@ anchored = 1 grav_pulling = 1 exploded = 1 + var/turf/TS = get_turf(src) // The turf supermatter is on. SM being in a locker, mecha, or other container shouldn't block it's effects that way. + radiation_repository.z_radiate(TS, DETONATION_RADS) + radiation_repository.z_radiate(TS, DETONATION_RADS) + for(var/mob/living/mob in living_mob_list) var/turf/T = get_turf(mob) if(T && (loc.z == T.z)) @@ -102,8 +110,6 @@ //Hilariously enough, running into a closet should make you get hit the hardest. var/mob/living/carbon/human/H = mob H.hallucination += max(50, min(300, DETONATION_HALLUCINATION * sqrt(1 / (get_dist(mob, src) + 1)) ) ) - var/rads = DETONATION_RADS * sqrt( 1 / (get_dist(mob, src) + 1) ) - mob.apply_effect(rads, IRRADIATE) spawn(pull_time) explosion(get_turf(src), explosion_power, explosion_power * 2, explosion_power * 3, explosion_power * 4, 1) qdel(src) @@ -258,12 +264,15 @@ if(eye_shield < 1) l.hallucination = max(0, min(200, l.hallucination + power * config_hallucination_power * sqrt( 1 / max(1,get_dist(l, src)) ) ) ) +/* //adjusted range so that a power of 170 (pretty high) results in 9 tiles, roughly the distance from the core to the engine monitoring room. //note that the rads given at the maximum range is a constant 0.2 - as power increases the maximum range merely increases. for(var/mob/living/l in range(src, round(sqrt(power / 2)))) var/radius = max(get_dist(l, src), 1) var/rads = (power / 10) * ( 1 / (radius**2) ) l.apply_effect(rads, IRRADIATE) +*/ + rad_power = power * 1.5//Better close those shutters! power -= (power/DECAY_FACTOR)**3 //energy losses due to radiation @@ -377,8 +386,8 @@ "The unearthly ringing subsides and you notice you have new radiation burns.", 2) else l.show_message("You hear an uneartly ringing and notice your skin is covered in fresh radiation burns.", 2) - var/rads = 500 * sqrt( 1 / (get_dist(l, src) + 1) ) - l.apply_effect(rads, IRRADIATE) + var/rads = 500 + radiation_repository.radiate(src, rads) /obj/machinery/power/supermatter/proc/supermatter_pull() @@ -394,6 +403,7 @@ return + /obj/machinery/power/supermatter/GotoAirflowDest(n) //Supermatter not pushed around by airflow return diff --git a/code/modules/xenoarcheaology/effects/radiate.dm b/code/modules/xenoarcheaology/effects/radiate.dm index 7816409757..6c8d37838a 100644 --- a/code/modules/xenoarcheaology/effects/radiate.dm +++ b/code/modules/xenoarcheaology/effects/radiate.dm @@ -15,16 +15,10 @@ /datum/artifact_effect/radiate/DoEffectAura() if(holder) - var/turf/T = get_turf(holder) - for (var/mob/living/M in range(src.effectrange,T)) - M.apply_effect(radiation_amount,IRRADIATE,0) - M.updatehealth() + radiation_repository.flat_radiate(holder, radiation_amount, src.effectrange) return 1 /datum/artifact_effect/radiate/DoEffectPulse() if(holder) - var/turf/T = get_turf(holder) - for (var/mob/living/M in range(src.effectrange,T)) - M.apply_effect(radiation_amount * 25,IRRADIATE,0) - M.updatehealth() + radiation_repository.radiate(holder, ((radiation_amount * 25) * (sqrt(src.effectrange)))) //Need to get feedback on this return 1 diff --git a/code/modules/xenoarcheaology/tools/geosample_scanner.dm b/code/modules/xenoarcheaology/tools/geosample_scanner.dm index 9d6450a839..9e3343b680 100644 --- a/code/modules/xenoarcheaology/tools/geosample_scanner.dm +++ b/code/modules/xenoarcheaology/tools/geosample_scanner.dm @@ -198,8 +198,7 @@ radiation = rand() * 15 + 85 if(!rad_shield) //irradiate nearby mobs - for(var/mob/living/M in view(7,src)) - M.apply_effect(radiation / 25, IRRADIATE, 0) + radiation_repository.radiate(src, radiation / 25) else t_left_radspike = pick(10,15,25) @@ -361,4 +360,4 @@ scanned_item = null add_fingerprint(usr) - return 1 // update UIs attached to this object + return 1 // update UIs attached to this object \ No newline at end of file diff --git a/html/changelogs/cirra-Radiation.yml b/html/changelogs/cirra-Radiation.yml new file mode 100644 index 0000000000..53038532cd --- /dev/null +++ b/html/changelogs/cirra-Radiation.yml @@ -0,0 +1,37 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +################################# + +# Your name. +author: Cirra + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - rscadd: "Added a unified radiation system. Radiation is lessened by obstacles, and distance." + - rscadd: "Added a geiger counter for measuring radiation levels, which can be found in certain vending machines and radiation closets." diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index 336f8dfe9ca6529e358c535cf800995662f80912..1198dc0314405b17131745daabc112e319559d67 100644 GIT binary patch literal 55614 zcmcG#c{r5s`#(HLBiTwqVk}8fQBq_Xl2nMwR+g~~S+cJ)WGg8Y*_TMNj(unBOSUBY zGKP?S7|cHN+|~Q@{w~Mwc#hxm$KyE6buV*Y*FE=ro#**FU+3$3rFUPGo%Iwe2n1rk zd*{|e5Qx#@_dm;F;K)TM^fwTQX~tjQ*z=aHhqb$do2P@T3kc+!R{U7Uby|i^Spp?G zQL-L;cJo8uCH2>qk(<(dQMabo_AKwXM{SJjzU7|w%8niMmzh5i^HWwwC2Fg?6Tbq1 zBBV3m)U@puKZk*Z=>-hVT_qqvG=8VsUoJC2`1O@aXrKkd!Y24+2+&JV{lR`Uh3VRB_-uv>JB|cF8g5ZQDI-+-XjJ%d_@J zH29UqB@Y|FVd7)IIYzo|T~ZV&;GCnQ|7g$I^xCzmhu2fCFkjMM*}&g^7V_K)`xa>s z+d6fqox$B+9DMVUG1FUF-n0`MH_Ib-7AqUFH(`Sr?tx}P$>}Cj7mNjMSL>056`1VR z58?9gBi!UepWZ<7r8*zhe!Ov^JIKGX-$G(1MLX3=kHJkaTuDEyeYEX*cgO}vGI_Q?JfKg8LM1Q~Y=$lz0D8A!)p;Z34O@Ypo@hFA1vky{D<=*pZj5S1Gc_hGB zg3IU}W7d=}uU2jRq-7yFues|kou=_%(8bx}`P?S`_!VyBz}GvQ^2dAx&Oek`jMoTw ze}V672R7DuONukrLanhE$Bhi!X5RLxETPtRB+s-W{>j)E}nlL-RbokFi` ztQpFmmaFMSo5v~4p@IsISFEouF~X#$sU)}RDK=R*E5|Esj|B6VSy|Rmp)H?Ioo{RJ zu-jP0wAXjPusgyqkp}tla6GqYu{*u{xfj0Zcz{yhm;Uv5T^ghOw26SoN9z!!USu`S#=_=o)&{TIdk^)(C)2Dgs4)vBd#Haf<@ zmF<_QX&DcFLN|zxunsvv=nGEqbIi0_UmDeu5ZMOx2>lr!boPf22owyudrM8pRmaZZxslYH#Qm-1X-X~_>FjiO(K*OxS~%sjU=Vi}`e3UeG% zyJcE@F6&{$hw~MBpH&~+X4t3U1KvqAeR4>7jyFvSgg$Zk`A&E1-AoWJAY(@1;lqb4 zfP(>nzU0VUWB9$HdI(&ap&a1ou`=joQSs-{IaUifr?HNcOux_T@wfbLK*8Cd10;f~ zwTLk=GFuWFzdB&eAK9+9-H3a;I`Dp^3qMSXNwPGlkf0opa8}>4)E3y~ZNHv~L^=?1 zra3{N2auLpG%sfzaR-ZO*U!1lei?NyLDH%R7p*oB#Z~>Z>*&;1^N~D(73E5ApeV!Sx=Ksigr9M~W{5sv9pg}8KU95jrj-*) zsn}V%XUn{?R){=Enk%!`EU{f1M@rKIXHQ-N9|&=`=ab8omxmfx&t863$O-Y8^$v%( ztdzF&++zcW@Y-E+4_l{`Utbi$O@C1ObwHmWiR9sy?qgFo@Lt%&K-|Fftx&`Qa%B%u zIIKN#n+5uXR|*7cx-#GJ~#5~quW6vD3b7sF{~`gJODkW9K9*t;rqA@IduD5_%U$n^l3nT`F|h4f<{yB$Z?sD#CZ ztQHY9PKJf)nxd{2m>YF>-gQralV(b+_gr~^FMp5xVsn?!(>Iimd4+oT=b;gBeVZ#o z;|QIw7~?!mYzH1aL{pnU+N_?g6f!cuyKWvh{2-PZV$d>X`>lz({pw{$511a8qq)*- zxnbdI(9p(^MTR7M!{;;GxTpKg7w)Lpb!qBd2L~ZsF;+k^5V(aI^vmSO z59!@p^|hkieMy2UySo8k4#L2`04hkJ+dznAJ`w^aQ*PU!JPS;dGgcrVNfm|0Nm`4f z1r=E>=efhsWK!djJ>oOzz7%+A(W&_{rhOXvFyc}wrEA_gGPAKgZ&1K#%y&luB3h zoN{_{@@fWBH0&{k^9$pcCG2o|?f4w)M7GB3Tih($zk)DM&B;8%Ft|0>!&TjbW1#M! zgXAly=S@ouxmh52wdD zK_9k#{`t9snNVG=#7nshRPsnOm7HMDB}HK{Xt_V*HioVU2AQLq0h4v~ zXJ&!xA_{~KK4nV549T|8t3pHT^F!FcxohKdZlMkQKO_-Hg1RfqeV;q#G}s6mY}yab zy1%}-j=Be_9vZCvF{DWD?&91JXh0I}sQN;10;Xoj^-}iW7 zLJIM)jLNX1`3mS!FFWb}?09X*gqm?%-c6ZxBVWK*B!c%EQ?kT~vo4=AnO>H$e)&Fx ziE&U@NHB&A6;Rw~4W7}7i{{)bqCY*@zhaog=$lF`1bNk@pk`45CK9cJVuMztC=6AW z8bK08p6*XoeQitRfuk6rr{!$(D(thxv))*f>jo#zX)Pk^FXlh`cdj&OLx8kRsY&4=XYiyc>o z5^MUN_YS5jUfhwUuRs^`rhs* zZcx26?=#ouH#16pAXtMT_c#kDy(>SionySF^!P_jxI5)E? z4om9JMqt{)-)@;TI0cvmm7X?(J{+Swt%Cjnc`qPQUra5@?y1j63-CKM4w|8X#eB{9 z&^YAu$8EMrC#5Ad^MNcoCX_#YbtKQ>v(SzEi5I2Xz`6pM^ycSJ53ak_z#zM=V7LI) zpHSWoO>aUrzSwjPMf1JzHMJ#_PeJtGE%dRApFQ*Q2CgX~QDk>H)Ltm>+Wyoxe0+m! zE&jTzl%xzW!R%i+91cg#lT&9W2e&s35ln!4AZ+5aqIjfk>!e;Y5Na;k1D|gBDJ{Iq zY7&^56d54X*;e6hEO0fcfKE&5z%a{qo$8 zaI}Q}^tN4djgix6k9F;MhwD7Hof8!VcfG2ULm>D*XMMQ{@y^=Cm*|~p>puWSB6yxi zkX$m|&8=Ox$4-{Ote+DWVh;utw~eQugD~a@47Y~RUEN%V#hRyB%|uv)Dr_KYOKZ`1 z;>2Op6DU1i8R@}(_n>6%Ck_sbglIh=w_$qxo{nPrSP`lW+O*@li7@yMxub{`*5x`P zb~1?jTaXQoH}lqU+KWxjGl#zV#s3)DE}0%P&h z8wH{a1oXs;>@CJXzsrrAs%Ks@*EXy7=21TaE8KdPpK=ud8DPrr;!3xGyjxbSOy%W6 zUq4GPHgcrjXoc9qL7-B_$fQkauDp-2iu7?9BK@;Y>TL%H2df@zE4`&PR0zyO$m!b_ zWNb=Rd1Ef6+X_NafvaAgWbOBBv0-8Hd<>j+4dke>8_3>S>>hb}Ospdo;WxhhN}}Vc z(XaWK`%n-_ICzq;Z9c{f70A&PfIq3G2Z{2V`6-@P41fCvgn$mofVgg9z`w!X?*#8Z z4T!7d_ul_%K#Y8Uj{eiAg8l%pe;N>r1#mL^oe5+sFNnD1IbHJo8(~eL@**^7yM@FA z3|3AaYDhRG!O$@@YB!sLm3M%CVnHlTREI?LTK*O&1G!&OB4(RfAZ?M_!rOB z?^nGyjF+~1n}f)Xov(Q%XsI%mH+$efZ=$gr6|fWFMxGeubr~U$cwf|skJHlT`pZ6w zO&O5}U>kz)znmnmGUo$7&ZZuhLyE;*3tzTxP;W%4gRnB#`-N@AR zw5_e}D-p6fyQLaf1`jTAxAmuCEi*pmQ(9U%5m(7?z|h-5l(V}q5D#)4i85E}*2{ck z4kw;Im-%}fWgf)Y2O%#|S;zH3i=2k!gU#8I?iW@%q$Q=+b;!f(W6e59f?sdl^(my z)I^?-NY|nKYe10a)Nk;1j#JZ9l0k!jDn^A{_v26VBSaR}1hD#s-FS+6a$VFmhVL+wd} zckvP`;x|+lEax;%=zKkkd(C<34CTW2&k`bV*ew$oF8S3S&JC(H zV!OC=-CEGLtfqa+9kvgyOO^rJ2#}3fDTAs!s#vHt7eG`N+mtgDr7{O z&s)m#SPnWxc~ibYZ2Zc;)>xjT(QH-+BFkng>dtLT>iaN@-A6RW0NGS6;*t; zn_D4aBJl%U+xeWi8NW6sEHwK4qt9GbF3!%(+CqV|i>`$islA~{eC?Ivja{4_AE09} z1b=hVKh$mK+;sw zlI~C0@|MlzA^VX9GDE*^4kcVV=mRkKV%XPxB!a(b-k;vPf~{@VDZ+voBaz;^Gx1Ke z8rMK|gI|aHs9^dw->f@g+7yTKqX*2oD(9`4eFAT9ymO+piA%*3HlNTHhhUmobJ&95 zxO(ZfA5~I1I|acHUcx$R@i14Ma z3094F-=D37Q~l*cit<*}zNI>j7Sxf^J(6LMp)A1=xFVJKK%qhDqTg1iDQ?~1X_if< zo};VCldG6TQ`};{WL#7pb`i37-_QlIvq^%Js(+avtR*N7`}F8@+hNE^8Li+JgqJC0G!l;FF(THE(Mmv*h534R z0o%O@M_jGlyzi)baO?;?^GDR&e$3>3!me<~Vgb3CkF(92R5;N{^CnwU_iLP}n<~@t z6zroz-*Ne8R&W90lgiRT7?U5B1^x%bIZt&kk}R`d|H6$DzFl(GHXeHF52U>H1K(~XpT zMm%b1r)>C*p&!%pypRJLw`>%Ijf9p{SYV(pw&-OYxGSpC;bwE+?}TmmwjP7FcaOHN z?hr8k`)~-&_<)J456eFqWOi5rMQ(uz(vmnW;@nC@{+?PFVWUm#cL)BBdw&BS=syh* z(f$O-|Jeu!|6wlvX?};>-+%u!|0Cx5S~gDLK2ihDiHmoB+})Xvgylkh_oaHPg*QM* z*)iUG1CMr4O9G?xgn(FSKswd}^mOY`SCpESRkocSvuJF0CwHgl!f5H#~EvE*N3_tO^3Q2uihdcx=hPncA zH{Y=MiIx9Esb$L7P#H=YMpruxiQs$JNl?bms6&GG;sTPaZju8(k(=tCPh5D@*mgLQ zGlM=GHpfB8K`|!m{L0xg#Vy~WbW;d9-|-e*(foU+ksJ!LhD9>_J55qtrpih9xd1ij z;MQ!zT|`=`lrUB^1Erme{PiQ>q@z?vU?mpg$LvfE<*?YD7vSa9eEj&a)kM9QldTAd zX1wb`xO?0h5){92>;+-^5cV`BS8Rh~%ZPYr$@_XI4kEW};?~W9F zf5D9F^mSZ&ur{1?PEg7BPBhGK3F1jys#=|?Q)afJ4ujcl$=nq^q!6n6jz#U(`rgMc z4Rv!rdKZ|ib-2o>w?BRL+1$hK6q9#sA?GI9B&5_DXD|XNuNGJ5B_|--)Gg!Qj;?Wa zWTYtVj+tcO(EeJ*=m3>C2e>u!LY7MUXS%_anYluH-KlEpNItsTFB#Itx7M^(OVVCz zn#0*N);n<8$99!ZV&KGOZO+j=&WqvbTXYrb_QP@K(sJe{B9JqML24 zepELafjo{G#^h)o?I(eGT53s`pH0XBu)=k2W>=DpQnoylf8#keF65lV=_R(}BR9Rt z={xZEes z_0b$nGhA)Cc>77CrYq;-dgRQCpBQ}Y`EqY^QuF8!64;DEF_2JNEO(4x-J5Cilq80n z&k<#r+#FJi;8b?|S-+WJWWMv|@ME=41m0$Pd6N15ti+Gyu7(a@JUO#^hVw^Uy<>tr zp=q*^ceuoCi`Zo+guu3P(avFEzcdt8W;J5!j~g2f-k*?uPNLOk6(RH(HU_SvJ$qDC z4W5<-z;~X6cD%2s=X^JeLM=*c5wCBbl5CDUzc0O&w21Id1jwFg`lt0&@JP1C(btqN z*7%CuYoSk8A4r6pCMDT(?S?6Si-f#zC!f#fIZ|bv&WPZ+LYeU#(NS?-;j$5rn_s~i zAk827fZi`EWvcU?BbdU8OH;IHw&4xjx2@T|c`@au*!k8UCC(-{e6hmLGo`KD)NU2J zk~3}J=t+%>;O33eksPLdz?_JEabl~%)Q_ZHS}Jb#;+8olIOavQzPNw%_-?KBlRYAM-&F%}9WlScGHp)~JBS?xo!yTP zh)4HUG7+~Zq{x#k3-#aQ&u8%PQ85Xdhw9;Q-p#x;R^yqHkN13Tnl-@hli9nC?3uMO z+@*fx#Eaf>@T(MxnPE%6#3auP_vN4Z%}T?SY5G6i`b+yW9}yp7z_)AHIuZRjF>kVK z?4U@B0%h#Eg01PI0&>|T@jMPO2n(c9x6}AZE2W=}@&dJ}8wWSoH3n3IF5sT?v>J!7 z{G4|vQf+~iQXhRT&e4*lLVcJoaB- zaWUF@-x)jIOuZWiRS0%`pYXBU1v+eR_CpMFmzq8Q0DmDRV3eu9cTR z0x#|7{9#F{gL1nt_mg+p_Q56$veUYkm+@u{xR|2goggCIY1}1dVqa4tkRUcDjhNax z?Q@WKZ)WaZj>=t?7kX0dg!(Vo(4L&RmGoaP-sl7iA}Dd!q>6l(c2NhXoU2P0I?=Wf zYp|a-62IJ}xNyt;ACpNC=-g_{{Wu21A!46_;@U9yLK5pl*?Y~^TsoC&cpc*YFY4HR ze+02X49YONqjfNx@IB?5bxo$i!kSi#;4Ib4JF!or5Z#bN{ox=OPk6&7c;m;|i0Z8d zR52|)lGBj$y5p_!R6U0G*hQV|t&n>V8CmL!%84DL3nsmq%ojwmSSKj>D_`L0J?8W* zDT`g<4X5TPK@g>EbEwt#{w2j5jfFT)h{}wJuF8{&C4)MbA!B+)t;{|aGnN)1GDfuw z_ad~nH894ZZ7mz6xOU?i?TE0iE8leu$x^m96KiPX#P%#W8nMLplsOu~tgsWVaIA?Y z;?-t^C=G|e>1uaI#X~msJP5`Ij;^Pa?bwQ;kIni6HW#Y)wm&%C0)@aXW=hl3Zg{Uf zomQl$3_4F60&0Q2GTI+n&1p7vi!b%gLK3NDK4E9IS+bvKcw-rk+2Hom)LV` zgE~U{J48BGcE26+n3iZ>-)_c`6R`Ess*}FAJ~-GMU$BFvFt3f^n_j{Yrco>>F4WQu z9=i9F6au41=`INO4=j*e{}Ug_Pnv3Z{klZpv9>2zZLq<#C5}=8&nI1_s&<0aK3{zB zO|VYfc|X*idc*6Bd2C{K2-KYtIJE>rT+~__q+a;ExNwQogfKK5^lLL8Yo9(CSQ7K6 z9&1qzc_F3qilh0qqq{b#Znqs1O7w}76Ai>-W&MxAnfEp(N5=4oN^)mstkaLrxg|{V zKMe|>V!u2PftugpwT=LIz|D-u_d=&_h6T+Q(s&9SH7Fzwp~gE}P_KiNi{x7*l2~vE zBY#_(>n~!8;6RKwu@3p(2Xc-Bq6C4jCoB4tgi7C;MZ%y{xro9gSr-qmX9n_XX41Rt zILw)zK%vt3j$2+dkCm(2xZvFQbCxMEb2cL8d*`bExc?aE;!Z8&v9Fy;n3xN6@9}LV zUthd(_^-tn+A;NrZvG4!nNhK?A(4IGYNlWeKz}C)!Y7Zyn+HXFZb3`;7fox@`!8u4 z!oZiusBe3~M{5}w5gla6+S2K2XGMDF@mz?n;UMzy6I8Kx z>tn=kT*%@Ldv;@t8pl;nD8f^tcyM1@Rs+1fXevQH4UAu0xkiLwhQf@+#z|CPEbj$` zqvL&o`>2(hDRtOeMTmke+!OnYcF!ID zpCI_3z5gQ?4rV;w5-q`@Sc!i?Zj0Bi&BVFGl*Q#jb{`bd#zcz}e^s&eCw>QpHVd4bmZ3evW7ao~rSn9jn4&NhGSN*&}6?IHOg}wWL zY|aq>KcfJoWil;L%EGiMyW%H0cF{yD3M*HuBapI^(w%UTzr|w@`3-~2&w_`FG=&I( z;W8lo)@|i&uFqeO0uzKkli`BbsN}KcxsB1+PscCe1FdCqpz_fS>+Olprv{ncIYMtr z059~*Q44^6t*eHLsb5u8sSLQTOt{1Oz|d*D`XYdTWBr>CQqW+f^mjK?5!3{L?9puC z*x38kf(pR9Y(0#4UzW1B34QnCWxNeL6*Lc{z`Y36o0942Lg$M3x^r?|nwpK%?{;o6f zK0{c-7`{%7_t`V|bI$R|Yf{mV4C@3i^`CyGb;tPJxOb^*Gw9o!{pNE8;h;9m)YnWH1)-f7aovK=$rzyvK-Ixx#?DCkw>3dN! znfDECeyNu60HX>XXvnI^Q7>e%`IH6~~ls4G$Q-bm>2 zNEslS^a!p_uVISe={NMHqqUClbDx2koKKp!y-fl_=3fiKT%X=1Tg}KhjyyC1r8YY9 zunWma{^Vi7Tg@~op{0MYryRHI1|aKyOs<0JXC6)d?YT)#CC6}Uk!6gg3`c=)pT9=; zKmMOiBhlJ{MlGgpkW#lLzys%T{$a>fD`V}MFQi2!B*XyJIzXd)G4yXl@km+Ak-1pi?L{!iq<|7POR+b`@ISO*Mn2fB2A$rAR*hk_>jjVO2gcnC2Qzx*hN54) z{(1Xm9zn=Pccf$*u1)LK- zAT!b?c5wmU?%=oZCd;r|Y*38DHeSX2_sfAAQg)!-kCqLRCuo)gbrtq-B`lHE67=N- zI$%yjJAoI_6CC4!`Gw1H$%`<{Y%^udifC6sK5_#@%7sYj#maPG7p)Du!=N1zbB9&5 zAmg>*=t-`L^^%3ER~>j2K!9=+I8gx4_rElU8TkM@$?}h*kYra^nr&+Eg6HVIUGd^F ztfFBddn}seN9I^jHGNzAHDuf${eUk8$9==fmfDop@W^NVE&XujX-*$2dc*pPq=tt_IIo)`Fno9faajeI;kqe)`yRxZ= z^0HNL5s*+gyj5yqzov+>+O_5VJ+#{#SiO)E;!Of>#!ndnY#!DdMgED2hzkU!{Em*P z1EVTh7nfZZNwc%F)&SqBhK2w$u=@0N<4x5fI_radQtGPIx1g5!p@zk}|7G-6b)3dm z38AbOa}xZx$Y)G)>)MrA@pOp-Dup|D@0fc?iotgLXXln-%NBU=B|30L=-!lzY7 zq|>fDFa2vzgq+SySCH&k`R3{e!gtE}SN|(A0#gPkfj7Uq4jWed!Na<8@8^G;E5D?R zti;=x|7(7wP#!%0qfZ0{zc}`2!@h?%q8@ z?rr@>$6vtJg=dCdOQ=cl4%FkC+c+w}ba&-A5}ulZ-?#??J)v{sXi<+RLJ`#H#jSZ)Avya<(eq=oiDwPWC zbYxMl>RaC2W>t*Sr?T$Xg#jiJ9(*xfQLk5ADD8@&^USjX9pyI=VUV)bBB_yLw zI2tA#rGbJ1_=)yw&tu{WKrQo>8c)*v4BD}@in%{_B^{cSzOcFo2y7v+3w;o6)OUcca4@pl()*1~RKpFkC>sT`{a_T^>L5N(JCm|GaotGnUs&Di(JCn3c6n zrnIY#z?aAN**uq!@6*0=Y!^_P$Nt7F8Xs=FSjxU@>i{sXvPRlj0#J3>-6MsxIcKf% z4yINE6#jo^)9}L3^qHp`?CtA;{T}_|Bq6! zcJ^lMt&3jorkt3!rpGl+h|Z#B!%r2>JO=o#hA{pKe`U8$J-GSep;#nRar=Un6iR$; zL?YF$pD#xwj6s}XWAkxE<$y`G-utdMt8sHp38>Y-NI6Ca^)o*&1%wIK630y(4DJK^_;?Fvd#wYL~gCNhRQXl1pa-5-Jf9*#lZK!E9|Tvz8pIe zm^vyFjrnH#bEfXZnIjfvAT4d}A5-xc#JjY9A#!ebjRjt;S=&f9#XWr3=9>A}0YJSe zBvyS!IaaiNdGvsee!TQsp|RSp^`(V)X#hU`W9(ebmzx$ z?nipeOv{I5Xr($udJ1T;ZlJR(EC%K#cZ89*YNlSN{3d0~q1uxjC)`ZrR$YJ3F!4I!RnCiXj5!m2!(tMm#S zncqNZKuqc5g5QodzIFHRtwggiokxOgGqgjq=!>2Ry`Yw}x*2KPSN@6QPO`z!8q||O z-k8<@mSlisp$7G|IXLW#IYO}pkgjn8s)p^MtgqA#}enb-u9ivhE>Eha(kd^T10m6qST=;yImyj8V@p) zuzIXuriRoUu6*(vEH~;mZ*|+SS>AU?Y0_r(s4V<^olWmuf3E_e7vP^^+8N74!$@hw z$lNUl)kW+h0~p>5sABmH_4oICx^llBp9b_zFZMoyh2OO$&WcQ20#X>gS3VV=*ettB zmuA_{GmX=zWF0?_M6+w{t%5r>&K}`1yh=^>L*C^DOwE^{T{Lf$M=!09BV8T&_^-Q| zwhUDBUNX%BWN!Zb0t)V*_=nWPGB>BSP+l~O-;;XJ^X$LSnFq;xQ&X#)H-as@1?tej z294Kl8x=*k)uoG_fBD7#5@CVI4|X_uyZfo{Ho3r^SP-@2ZUhUe(v%3OEAkP>ZAHUk zYiXo)>YRB&d_}SkP>I|dHA;LmkfNx)<4yny4VuPCG3f0ik$yq=?U=2=&WW zKY}#Tz$5hZOZ2NAlyG$-)(^oIRF>-jmaMbMFUK;V)~nq18OqwWH_HR4RKY{~1nNge zs)vqLAe9s;q99*S-0&@938Y?Uk%apDfi^^3T}~K30vv zuc-~Baz5HU+5;p{zgi2<+S=H>!~oe|K2W{fS_M>@io8F~F=v%TIPMQA<4q@G+GCF0 zX6fT;t{rK5KQtrq?5~h567hsUYx@YF$C0Z?0r~1ZgG#1ddA?e2)!(@rtvaM&KgJd{ zyA4I~fD+&hbM&}Us>kMg(|_UC)4l6Jbz(^PgAq%gR3I}+s#i4*^E%R1`#}Zt{l`L$ z*C#72+apZd1zc*?IIRWuK)2)LW?D~37>P*SPrEacr;ArWLxAa;%Pn#L8!s%-(opu3 z2t~eIGsZALyLSn8oMwHJ!(QTNOb}Cse))r4e-$9OuxAyFK~GXc^sTI%$%Rkos;L-_o^j~>Z3otma=kB zk+K|&t-i?#J7RTbPj%uxhn_YHPQ6)=oE!-4?NtzY*==AQj&hS%6aj6tkh28VsmBeF zP*MnEVJs@FzmU<+=2n+PJofJ4pl_lQp1qcFq8c-Og3A8!K=sz{Yn5o-NYKtg&{GRo z#=YUZ(Pz9R!M&y8sbWi4BV~QKZQN6uOBH}I({FgO5}N^a6vhz6u?uBCl?M0Rm>9Yx zD}0@LnKcDMB_}2=)@)ooQ9zoX7zK-=?x|kbQ!5`q)^oB}BWy^UYoSRnEs!}KOPQRU z+`5-^1{swEpm_Viw2!s5wO?32H(sn==)_73@+(}79L%b2iyzT*b7NiRjrCKGkP~^S zA0{nM%VJEz-=$GR$e<*zv&%|Ua|v3-_wAr}YP%K6@x=%>Vvq|$5r$|OhtQOuq4(zK z@M`eyA?Gl!b)V0_t_-`Hjc{jViIgs!fAruPdahe6-q??oHKJV~zCztKpSw`=IH;zd zO%14Ln~YaFJTk!axg%N_w9U;$^=dg)N#VH9&J2HJYYrN6NA?V!=sz>c9<6&hj(2^m zI0ukBrhKQIQ%_o{+}EV@so;W2xH_Ju+}_#Q$xikl?ydlmx(5fu%yDYYP5g>LOElVo zFl8Ph4E41OB)|9@0S+iLY^$>yJtNW2Gd3)?&8Q1lgCM-i)Pr2s1+5d|GLd2uF_Nq> zKeA@{3IGUp5;llY2Or^C1R6$3?eD!=kGO{E$~&?>?t-b1SYb#SmPxr+;<9qU$zkz( zu{z~5t>^%_8UPHaBCK8#|Ac}KB7buSJD%yiNPokXYLC2?@UN($!OsGF*l<>3&xq2e zJBwB`Kw=?!+*$}agJ02V^=gd#@$Z+la!3yVO2sd~-*;CC>DW2>$ z%+W*d6Fz*1cystqLK|$+yM5ZCS<+&cZ3mF9{mzQj+6H2;gkA0uKAS4mBxM1V@&AyC zEXVyWl|HF*T;lJr$&^8ayiSD-+yL|at;JhOhHcI^T>nBod*+OAAj2O(A)Ll_@>wkF zlFC2*MsR&z_|Nt~hyE?g|KBCxl{)32CNVxR{}0j6FA2XwP?f|SwQt%hxtHNZn^6B$4)Z$X9wRZRUqF$C+` zrxf4Zq45#eBRsNn1a%XASZV{ezO^IgY)ap`hN6+aPOkz*Nbn}1-|#&xxx#+BdeOMf zJ(sVUP9tAlwXc@o7(Vq$+r0&n3J2)}T4aL$s1I$OFr9ZsR`$_ojT?~I*rN7qrZ&bu z!RoDhU2XPJDc{#>&|^Y=KaZK*44$Pize+s*hCk;GzwFtwROx0yw)ert$^ts_`qfEL~hi7LR)Ygu-ox?JimWBocG?3(y-l}1BjGX z8qy31I1_frJbH|YH>T#<T|@W03Rdw3_5;n~Bl8Ux|QMO$j~ zQ;wu!PAlg|mTN)~r$sKXN?EwLbHE38hI2+$CQWJLQPd-Mg%)!-zXUPfb;wxEk(zF# zYIc8sMF9Mz0iWV*A=~NGpZ(3pJi2D;Jl+SaHBjEBpCs=IB+8N%_{hFGY4Vqc_PbZl z1&=C`H!4IyyGS=%P(?U@o&9Xkb`y)`@Trz}?>#tP^!Bc0KD&fk0KH55u)$%eR5Ftp z%iZRi#xc=IJzq^hBj`3uim)2QKCAzi7!#<^&4+`e_xU$ z{Lh~9Ls~RHebfkcv1@&_P!mes<4#xfxxZ?UC3%q;EYd4>y&e}osnpHH? z>2qr^YzWgwvRYR)yWdi^ueQ65Kx9d(_B;a+KeE*HPao#2;e^DAMO^?rDO$YGR3ZoG zZd{-Z9FhgP32-a^Z8SPJ_y z8ViBd9@gQ2Z20Al2g{?4A)dAkY+uCy*`(|1GPHqu{IMm!j72bu8b3e3mFeg@*LnCP z=lZ7#roete@<;VZR07?PCiK^4YZ7RQe2V{Sk5*A-eF<^3j z;Ry)?MB~*Z4kMonI8^|JSs(m*edY$%qjq&13DL<^Q691-co*J`orS~Pu$U+|_EP&5 z=NecBskJ0Dah5h&VXr73mVe+*zqGZ|No}$roVwkVBYFx+taM(F#3vM-~ovKHm z-q3RDQSaW+hMe^B-jX+Q(&OW(_ixrw6pvZ-@NK&LEc)&$NAE9GiIVzu`f?e-kn9#GNyDpNgKIP@Dq#ze`ezTH=cr91+pt9&1%^XPZ zoz@0o9EO8nnBgy)#AWAANRi($KXqeIU37q_jWARwxy%78AqGOSuXYVu`=c0VJa}L#c@{4VKCgPSsBqY%oJv07G9+1GL%ABGK)UrgPd*=%=Sq zdmQG++XEw6tQ}4go0|MwrThLebQ>Dipih|bmZz?}q}j2YBpUj-)GeL7d>Y7y+O<*b zI|i!w^LKs=*+8Hy(8pcgm@9XFshf<+rBMIS5ULCeiTqJQ{}&qd6W^+xvp=MyEX4BW ze;Ap#@|VRZ7507AH&^NP#?^=2?}Jbmfo+q;>hCF;%Yi$#7IJS*N{*^FJl9cl)s$lc z5C>Pn85c-)?$xB9Kq{VfDR4)xZ$)Wu*Zb;SQ2?f7V^w2sp6Br661rm3aLwT%6PSW! zdVSfjX%AD|@LHi8C47pwTTJnk6!LJDpSIZw2D->y%YrVMIJ5TkmTD zOZ%)d4R1L(D13B6sVG|uemsAif$f&qVs{Mw96W~aG9%hT(&q=-GH0F#hzs4n=iqjN z;lewP`>$Tr&AkY;^&qGpg-JJJUj&e*T~WE2aMInrz=Oy2eG6V|(=|wkhIiM|fwGR? zKPbiWmOX4w5aZ10LE!{l~7xvvD@l@Ijd|8WoE zzPfHT$lhB*mV3FimM9e{=k|uThwEe+!$z|GyS5ux4gnH~N7^tx>O@nRr2aY0qjRwH zH}7VNoEf8bVddQBRgcx5*_^7%0kW%OO$5=P1y+B>BkHn z=q*+U=iaHaJ%&Rng%>9(U#$i0gp<~s?i1>VWsoi5r7zhmt_1GEHwLq|6`c-_XW|=Z z^`GP4l^>yTwT%P$(G2c>hSFVE6!jV)R`jr{$K+*xA2+LiDQu^~@>@i9KBismExm}< z5=bx}qu@<;1}uw$>lsaEVII8;hu`X_e4?26ZO^R&3+`Gn7i#OZt+bJ-^lilGOBFNO zG>oIocfaA4KK}YNKnd0Q?HG*H@~z6)HT8py$wyA#KOHHKc`dd!XJ!JZf4_5i7cCRS z+JHflO5ipdJump$L@xysk3vpgYV4K%)T8>a!cLCR9@ah%L=&YK4*=!ms#B0}F|Au< zV}gnECGqavyPpGvQ@d@4Q`>JIwd5Y-$Z0z7@zmNdEqD8|HDRj32dU0!CK~vdzin${ zN+SRp5;?P|brMnF2~Nt$C|OCT+(d+TDkSjKLYV-G$@tXL_vA@ONJII0Gf~mce3hZ4=q~$&Ky=mw} z_})Gw=rg01IQr$Iy^NPg|F7{--kl+}?|TESsUNd|S5y>Sh1!>lad1&l^jJ>gqwjR5 zIrhtqUp>K)qo02~yRBU$v^|1N@JcB*7J@4%Tx*9|?Z0m4eV>pZ9?>4jnO8IC|N7dq z302*V2{qRrNa>psDMZ{Wbz^t;@{=xHi}!epib(f`*G8xK+q#OJH_Q5`BAjLyrPvgt zatShyvr|WKy-(VX(S?5DJm+Q}CHrT&uIod{&T*SdfI zBc8SijbiREE)I!wPsUuN!8%fh^FexjZu;nvg6yHxynZMh`f4gYUL!Bfzu>;tzTfjH zCc4gpY8q)d?|aEODoUl<5VHWHL*W}34??YMzVhZoW2AW!)%6r@!pUml z7s+2Ab=UdHyTtvaX8{<>nj5csm}&55L{K}U6T zb9>{-qzME99+r5%%1M%5dma8{XOz5h$M`bVWT;M>V*$1iG8lRvrHpz=i$)^ z=ms8GCs11}?}Po`t|O%8%&3#B?&)iMf9W-oal(A}_t^2l5t-OLYO-M;3-{PhDX-=qnH z2jq}-7UM~6!g1K`eIjmoV5FbJa*AzbUnrr_lL#j2U_30#6yqN=HwuMha{E2Qp^%1d1>CXl)a6J|M za)@M%N~3mG!WI1%JqC5=B8x_PC_Bth^!~-TwHpdj;1a`IR!JMI=ImUKMK=9Om!Aap zG4H{ndq87FtGRVAj$Uuzmx6W?{aSP{%mu8m z<;OW-zgezDfb#(s%kfdASG+SMFiV8bJW_@)p`R0ldX}%c-e(`TD29}AH_yHGI2F`M$J%Y{$#++MfJrOA;{(!sv zOvZNOn>=fYWi|xW zL5WYKf9l9f2hZuM5W^M@&q=u~>e;bb+FgT2VRIudMvZG;*+=;z1=w+Zb@8{Zsz1@F z{V27-lvKufqJ6+=29p*SlyOFBvyh0K3JJYRsxEwK+FmR{(_6E*$-E#GF$KPGn$BeV zZl*o+zR;0%Ifu~#9%a(692HmG=po{WF0@W@A(9nO{d!b|J%SC^IFmG1d>)x=GBn(7 z^#8E+)^SmFZQC#@AX1V_i-OXKbPSC_DV;+I2$Iq@0|J5~42pzO79b%*Hw=w*gXGZN zH3L)M*6Vui`+cAH`)lU6_nK9+_FCt0oacG$LweDps3;epP@}&QYh(yJY{- zOMh)^dyAN(=Pe>(Wuc?jeX2||RE1r}!)=QA^&CJG*>I48s)ziaztH@ft!~* z4cGk1TZW}@r)i{w^eMJ&ks54FEvzY zlZce(n8EA${+Pm0Lf2fLg5dURe%$xxojH4J+9>zF()TwJ#1;%q8mB^uUI6GQH6(vj z)o?y+N*}jHv^GcaX3*!Beq}S~z%^Q4t8*ZCqdMeRdy&8hdX%g_4&fi;zh4h<(Ya55 zOT2=MT!52So?e`Fdz)nvJdVkxtJ>{+JKW?K z4fhX5FNu99BZVj^#e{|2G>j4pN_R{aJGug%Uwo6Nd0$dECimAb0efKDlQOUHmIb%x zSsZwH90w#6?m83?T;o#uOcBZX5I3)zNZ!3~O>PPB7QYY0L$BQ^h8%X(e3V*gU|G?= zD7)pq&!VtazgPEY7PR3R?31DJ?p1MijkjN%!c;G>Ou)6g)!L?&M2P|Jd(RSY?d#*K zL<((navmlN!_~q7&TP8EWi%FnlPn`?rr_D5Xj?r5+&!a!vu(X(dQfkQ!nys|qEY?C z>VbAG(k!f}m)m_GdJUi+pr_k&@JF*O>lo=#l-zmLo&A})h$|YVM33BNOddVZ^;?k< zGg|3Zccgr$dNb`gUsmyxX@}sThp(O>WI#oFV&V`m?@lzUjo0AvK?mm{d(wWK7kisQ zNlV<|YDdGA_<9k>?$RxZ54!I-Yg|U2HWb>L9L{5bJTkF1U9nC@+0#6mwQM1``39*NyjKnKSzg9Bk& zSD@l6jIlkK?gfU8=pPPq*`}22%AqxDO8SH@huWwpvd6fkCRMA1^#zvu%s{;TLpW2H zmZ>vpjbrQLZ2WEBCrW0Imn%aZ$&!*JnQ*~0@97>oA=7JUOTvdch8$%#c+?6f?*U<( zo9iXZoMp0s-EWL4ia|sSjLjD2=?-h(?$+>z*;&uuC5Ue=OW@kB>nq8V9<&`$8tR1qZwVNK4%jB5h9K(J>v zgxH&-T)RNtNWNolO2vzua?i2?YHvwqNiCy!on=@F^my&CqE!y2a1)Y8a2LDHxc`m@*fqXy$-;4C$fg|GpmomMiY~s@(n>R8%SU+#}u5Nzg zll4NY=`R3ff*UTj3KImfL!Tre6KfoT#d+VR^DuS?bUkiTLUb+IGHVzJ4N>r#Q`xS_ zK$$7H0noJ%|M>ETBIhvVs^Dvtx-${q_+q* zkFMd9A`>e0S;#Caz22DycsCT()4VODJDTYb<6ghJ3zONAP$rHh>EO&D<=-k!MP7?{m4J9OuCk?Dh5Cwb$)KtZwR@U4Rm zh(jn539YO>mzIBDi`;*qQ04x`!cX*@_WKK0r#-U2K}x$vq(DNR+iKpv;Sb-#_sX92 z-!&v8guzXUyYrQ>V)XI7(|s9(bZMMl3@84LW6yLQ{vb7e6UB{n#dhguGPON4E->4p z;Bg}T4M>m_toqF)=__v@*i3}jsG_tpQ-_(fVcm|qav<@LKJ4_?@X3CVL;Z{FDyN{I^V|056f!R4BSyG z;CpywLoD~a|MUC!5CnRJgYby=B3q&hbTlz!L+}Q#5iYcSi6l+3q;W^o-gM!*;LSF- zuM_DI-sx;;bdL@q@@f?F-8&vE;`=SLEtp0V{_N4i;0-&A`b7bY8ZTZNHnfh;IgGRa zGg#V_b#O7?PTlQL63bDQ>uIzHX9R1yg4s8gnYNbNH2{CHjD*xjt! zB4lqW?~bGo$a<7e6geQRoi^@~aLr^ho_x~+!46USrsp&MtSnPKzz-khAxlsHzGVQe>TJ(gY1 zdE^FlwQ6T^=3Zo?D|DO1H13oel}*?pw*B@3dejimaWPqBIGF;3DdJdvZF}Z`5+{)l zp*(QJ_zaTU1Q1Bz1VPl^%G7?XMLHTH%!E^5Fu2{cyf<3jyLA&Pl^>0CnU#=tx-uX=WJ59o&f+&@Gn^gSS5RW@RN(>BDLP7mu724U_>&<# zK#8dUUK$L?i)RfYrCm&=bNjBG^N`h~%Ii78Y)li82Lssw?M-M)1?;DP(} zHr%3&v1)XXLZw)FC3+lU<4MaML{3zQ;|NE?sw3e<^mpJ0W3r12OU=)4L^8OUBnY?L zx`hIN%k9@ZO#;V&O@+U#=(8x;WFJ=X7nYgu;dX*ON8*%m920$4Y_&d_z_nnsfuA6= z2YmfL=Xv@WKe~fXW>^>|T+J)+y4Q`qeeZfTv{jM4F<0$N;Fu#!Yv>N}P2Xs>__;NK z-Zp;z5C+QBZ~@^}y2S>*1;r(C8uIH+t|(fIwOWLRTkedzC%@kmuHyEHsjaFzV&@by{}kQxHX-3qqZ;tPqOu3vRYtX6m%A9 zt?2ZFS9p7cyJ9IF{==!V;44)-&_eGBzHvr)hSy=;7{zlQ6Pq`sZzVbMf)&vuj zP6*rk;J!ULgB&>R+UA~tLm_6H>$yq}auGlGlAG8=!TD1v) zJOW|C*UeW!#6fSvem!0IboM~+;C;J*vikFN+M7KoEpZwL78V|_0~7SGu&Lm(17GGg z9=h8KC73IjGsDW?V&6E#%FK8?ZUtwQJunzfvsSnuS8>aY03raF& z?sO#xG4j`fLlmk&HiX|0+_8Fewopj}4PL$k_I_`xKuLDR9ARuOgxxt>^_==0OgLV) z`BI(Rq{C{BkMTuhXeSpzcL}KM?hlF~SFL5gVM6@IxgaOzC`DKIMrfZ9;oC1x-CR;QeARTWirvQdSBvIgfS;zKH3derhIKFjc?L z1v57A$kzb1zR@q~iCM!${kgZ5VD3Bz3W zzsoc^B|KL8SsXGr7ok&6yXD{Lp?pERB6*noMk_+^`Afu};%k>h!uWMiK-oTShNU3* zf=z1q^LU5x;qdw)Qs_c)m;od?dKI`0EjnchLn}ya^*+!x$*77&n4ScE<-_wo$9_%1 zrOX>$pajPnL;1Emh6rB>eqw|-X8cN&VYkDY-L|dv3Q0P@^llxj!p4*5#|W8sUQKfD zvY+5;%bQ9`{JrX(o1{#d*{)R_wVIN@&DE=1VNXMDHNqtc zxR@;D+=Or~wXb-Vd3-wm{{5EE$IjEOHwPWPpZ3JSZ;uH7SX{nv?hZoYbq#yc{77>Y?vc-wVwyYc6MODy3s<8y5vfyv^p5 zk$Un?Yk+t8x{NePUVYw^H=rGEme0T2qo^ZOU2lv%zu$_srk=76(YX);c*j|KijfU=OgCUZO;Cn}6>~dyd=@&|s&qGKZGtaviObZe_agCyP zxYp4M3Xd?i!r~;OYWEy0RyCo*d!rpKTlL1s(Rg={&mrk933O1uXS0h<`ZHw-*YX7_ zPx>u0c>Dag%NM}+USx~Xnt<~>bJNqMzfcce@nH&cdD+Ri*9*hKmeDl?S4+su<`uhQ zOxhaUM)hQK$@cV=u8t5q2d&*h{=~qx@rAyG!8+)So-?J-Tvx>;LQP~iFD`O?x*u$~ z%`anEXvfO2&CfJm(}w#=xU-KwLUdK`DpbeP^Y0tllClL@tPdPlKA&VkxULK=-}84< zL8vkHzF^y$hzF>D^)J5R>liQX&@<@!L{&b8?JurwtaW)-V(ZmHO2}Em2{{O?@I(X~ zjK12tHCwqb1KJ@`m*kJx!;WEREpB!26#GxxIYe5X228Wq-ddK}b%4z*Ft+H{?^ zJix0d#jc_$Joth8ZGfEDe+vN4<&cY#hZj!$iEpHW*y##uiXYPN$u+k-C>CLmr$^8} z+DND+7e1y9^-qmjgr&CqP1T||GYFjB(dHl!4a8tgoYWFM=(|sA7h(G0_Uy4&ZRBX+ z`o{yulFMYutY)_%=BG!>u#XRKs;=>3ac`spu!cOVq!Axgo2pRf>v z6oy7n11x-j^{^;xrfJ+LO1z$AVc~E&8ucsU3hE@kuWgBj7fI>3R5-N4z(?N> ze@$tqv7SvY8(YA3#*V#d9pLD5T^uV%!+S-8y$i-Qc^Qx$WEM2yiNS-1?KL~F)azo2 zxdaquA2A9dV1Xr)EOXijU2FIL>DE!e1c;3Q?04SPjz?%~yw#bUd?;Gn8jVpif?je2 zd{n8)Ekak%pnx1pH0TFW3cCHdMGrfn$}#U~HiTW{LWe6@?3OMzv58~0efi8%!1K)P z3`$p3vJy1SK;(F2)9Aw2h#8ov^*{`W!&2X&B#w2_XGP`~;=Q1e`s(}{BK+^OI9s1R z4r4@7-LmI}r4GRlF9w_GHM#wW;*4{s@66*qvVa1v#C2R&UY@^y%BQr}{~%;aX+ZVo zCbRChs>`|mdVj^37kdYA+yI%gDwY`5{C07>TtCHNy?&4B_${xn1<7Zf`QU=wybu)a zhO&rfW3m-WVpaDS1#%r6*s_23+bg=f$ie<^NW<7-v*W}Xm^pG}op#+RC?>G( z-EDbswDN%A$6H0e-ay!Au+!akoz&i&*t1o2VJ$EmhI4aoIKnP|H^z@AAaVcmh z4*t5xHf2POE;*iHTxa#;)(`Ks>Ao@sa^rni2VGK`>e?B8K!*k5D#kCC@2}BX?0IKr z8Ok4uPOo27Je$5x-N|jhd{8JljiR0&rcv@&ApJd0dV+h|>vCRiU2(TMv_Lq@U0?X; zxP?it(mc;<1>YysKWlb_h=mHsgke-5{fuA*&v$x~6fQ))QwWF`FyhjI}9*tvJUM*cqM6g{f*xQ`chVz#(JT>yu3c9-pq4 zt)!h^<&i50f(OV@yzna;<;;xQo|y6QBU=KOZ?RuE?Oy*n;;ms^@FaRBb}29;1J_Vi zZW`y6j5C#%Dwv72*qMEJ_p8ZxDvD4}j&FL*ujmi@D+b@N(6BIpOXM6i*YvZ;F)iXexEd& zR&-V=4jN8Cu!7PYTUS>a216%7Tw6s?6*7dAV+dEU$?}&uhEwcYwxCx=uX-^s@#@ZD@dwwX{)2*DptXAWN8qMwi#zY zEGGtj4lEeU#98K3xP=hS3+TYdaiAXP9DiaYbZ*yTGlV0jBN&{ze6B(slW0-ls} zFMY1e^mq09b*-6pNbd=A(@Mm=tWo9vF%FKu;{aua(yl(2`8KCe_4+)Z;eeSFd0fbr zs$K{ozE((_NGFPA43!BZsfRh@uLTLC6K{Z~8t{)dkmb&FPD?>esCBcntT_ z$OPyj50S`KBU<~NJ`>^fZm$T5T$WJAxyv&Pen;B;y4I(`+Y=EIE}qF`v9}ZlR&I zBXh}p6%$B9p-K}86}EZoGMhseoIajc=aLBj?kVQS#O^m?I`BMkN!#!@dpzD5WWYtV zd)dyP0~@C7#GQ^iCsXOg`FldCu>rF|G0S~Zk`~@!uzN4s?*|8s^q!m~=52093~&=! zp|`~Ztv0So2%iLev0B_dR_ZpYxW5PE1YH8LfYumcpf&&Vi>9%6DXmdxp^AX1;~SyfU&dRy*odCrrVZzLx#3U_3cqX{(avn& z8PBbqNztT}-H5-tJ5`m8KabHEkHh#MzBX%Yn|#kX`onBE12zY;67)HsvKWjzkgCV^ z-`g7<+!&fy($nsK0>KRoyP@(0n$FMIVI3Z>VIrBqXp+YykEc{ST+}bP0ubUO<);4T z>&qEFN;XxC-nfh72uy%Gt|0DgE}i0s!AEwV3Dj6X#nR~2?*)vIBGcxbOUxx~G`4T& zGKZAZ1|s8rIs6bO@@NS7a70uSbnN6h^8GC_%pkv@^`!5N>5PEOs+@wLDjaVRE>FU`stKI?kE$tKJGR zaEjA|Q=8O*F}a|WnN{oPyBCeu4*Muwt>9I%$?bDW*7%Bync8FAm$sPpz&xi+jRpCs zd#F2-D-M_=3ep&OX?JqRo!jWt#BWKmZ^Ir9Cs<<;_m44!DjhFDpKJ)NWH*$Fa&aey zDxM_Eah?r-POAry%%A;==r-;Md`ut8r^^@i@ExnSV^0lfY5-+YOI+$AXrF$~e5Gdq zKtwZx>ZWE(LF^+kvAhKNqX;g#p$TyHlPQslUCRvJM9TmVKhx$EXj4XR0+$+Tr`{0@ z=9D51@ZaAQEbt|CB^RIMA6JmlSjKI}8Lpd8lewVqfEL`(qZp=U`%}|c|7Pcr)$+p$ zm)WVy7;3@J|khvgs-Qx=Q zs1!%u|2M_v;=16RfH&jQhYv5GzR09-8^~bdG8_4yG5yITZczAwQd*o{EV_=h(eYJ- zMbT@04B1Q#)jR4GYnn2RN~Hh?L@$>4wuc|5WltzIj58D!d8qn}oOr%b1KRWIyV%D8FMNxp2u!4xegV0C`Zy*rt` zCYC1FIwGfZ|4rdWYN-x72nz>iC8qie+jRo{scRIYerHPE5vQ&Wvq@vJDt^lRW3OT7$;DN~n9p-|CU*AcTeG#2 zPuHa<$DQd)GWc@UL7mB3Ey@lJuRxen!WrUHTRUAwe?kV4xnbH7kM!JToR@6G z$dq4(-mBxPaBH#-*vr1Z!xtx}p`|s>l@>?~x67z>xd>jI&oH~xR_ zN1z$B9K*%SFeXc?#mC}%`I9sVC?9&Vj4+N9xqp)4huu&N4W-iY!l>``1$gX=e>jVQ z_Fw<0wE)3v7ZX2w2Ch+kcK|mPStnPG3SO9%b9uj?_k5yR=)nVV&@D|`hKcp8tw|X0 zmjZG*?Y_J}+NUjU*Nh}A#(^e9qCQUFy_)d*3CL6`Rfv6(-jE0ePI#yMi2a3gAwH!N z?XzOzPRuRlfh~jOZ*mh~0y%A-Por0*<|c{bp7|+gXlwhFI*ODT1TIPi*bc{J{w9ok z0|!(0k1Y~7F4XYPrwChu%?67bD=|!L zV3k*RVAY4>lGKG>fc}T-X;VS>fCQovhmHZWs2*C2pm?DF&hG+v>2BP(fliN+J?C17 zy0Z~(w-3%z;zI;lcRqSf;hM6+N}@evTJhPG;PMkANGkCz*PFGZ!wAn$B2#6~pbBF$ zu*Xu|V3YU^lsijeMy#4%f4i1)haK#vMcLd%%lQf}pucpMjqOc3ih@|4Wir^wvg+(M z?C}vuN0b9xxkMFF7u)c34GtwcBh32iGXd+qYRWlxBqd#%%;A2DU-Mp&A369tvwHig zKA4Q{Zo7L_P$Vwr&N22Cf1_*b>u}d-)hKPc-Bs_(hnPgWHf)NBxxMRDL9%O%8+D$~ z3v@uY@>Bp>TMR9#SMh^OkMhU<>Yb0{7#7*1QDwH#U9I1&Y^0V5LKea$_PO`@%)yI8 zas%qipAVk!wkvXwvMcyU7@V;u-pw|CD;#7_Sz(-ntHz&d#h<0_IEY*Y!hZ29w8$C8qpx_9pbHD|-CUQq0Djk)aQZ&+;Txnk36Hq`x$ zhIfH>He7DW(%sTIo>fHxS~GB=5>y%kd~=gn@}Ks_Fm;#3S1sT5tO|+F|DF%G~4u-cCpZ)(T043eOlZu@(AZ=HZ*cXS%PUDM5;x&W9|j(S}-z1=r$Zpr>n;|c9-K&3$4 zVPwC5RL?J|0ra@ok@xV&P|;se^wh3gm&*n8PApW*+%4<4--yfl!*ayqIQx&CEaihb z|7qgc&1M6){%i@xOCV5`r|fICF$9Q?bpVnY!>84FX*eL@l_~#QnV@n?M*4X%Ch#7; z4Ir4G`)TPWKmS%%g24OgX`Qa=Qtz88uc0J|`aF0l3rg|D^B&niA`@(YdFA%-8y`09 z&@M|&w%`_>HV0i)?!zpxfY&#SAU(M5vtmsbSl~7ikEtkhihxoFK1B@xd=PGpzr6UxIUW8xSM> zIbeTYk)z2+V3zs(N;^zX!aXfnBiVosA46NYV*Me~V=fj7UdY};cphhGi5~WE)%(fC z3JTxEH|mD-4i#4Jr+Y4>aKY3^etY{b=iWs0FG0w!t#u^@zlJMVRE8_u@Q5~?LL4~+ z#EGB0?C5m*G;6mFXg!8ACq_z@0eOX2xP+sHOo&P@Q}SsM^?f3bF1pGEf>@>cj#0ba zfZ}Cq=|839s7)4I^GX?CP6A=+ZFeM%3Qty`i)wc`Wa-1DnvWz>;s!EbLp|4#b@;d! zDyK*pG;3&Ka%7S45|W)fEu0?Q)d#!wb9irWKyl!M2zWDP;cI`Gj)I9Y2^}rg{Hm>7 zZHdF`ZV5z_+t6T8Y>vM*>tZF%Wy;~_%3$`{Bue*JLxZAC?b8;=IbsLRr<^78w?*zO zF3z<`enyqAy&F7OROAR@vTdoq^$CVAAzoUA#cx4mWlBG7h=??il)As46KvkiX_N2& zbOc=pA6wwRc^~Wi)QHM^f|!wDGl1~Jv95*#6MP^Rm1ZGlOY#;Cx5O$mUWpbtyjA># za?~*N)|HfYR{POvTU9nAltJ_v=g9R1RcGMp#v7vfI99?-G# z^hIJWBwA)L#b_mfO@N~+RKnJvCBUlvY&qX>>RL}Mdz&clyHCUvQmM&aA0g%S(Ws%Uo5Bv zPm+V~pC3_FGDB}+G}|)dw1u^lU&tO_5oSBj=dVf;1ADk4n;I22nY5vq{r2kS8~WL| zBYbKd=>xUzfoPwNWW+?ov-dLps7f~I3o-!4i@z0G@F_vBzpdcU2-463_}9>-Y&1$4 zzrA9j!TT}wN~M^hEy=FD#?}_GI%OqI$t5TEANafN8|YgvGW^&lHi8KgeB6$|eh>H2 zX8T&0-|6?frkEB2{eI~gO#q68)#xY?gI#ZFk$X1_f!{e6)^g1eNu4OT`ldQ8VTAx2 zbXP&iCmg&Qlxy1!EeW`r5Gg$3t?qr#P4=elhjm!gCE69f2_WO+Dxq?fo4a-)G?iJX z29>9Gkex+K&l$fxc5si8U_^LLusDMGQE``-DgKl^1uOD9xpduq4kO45G@CSdGhG6~ zAO7vM_sMe!R!f_ zmiueeUQtnzKWhJ z+WpBV&0ud2Ed%<){mX>3n6%WiytRgtK)gib*V(Iohc|sJcJ%mND%T(=m-)->avR=e zFNo>HnsV-L+>0+ZLv2Ur+nO_W%c(Ri)=3BP2jNtv0tLJ6QN_m0FkZ#?$<1NL-b2in ztxr!{b(f>{U*9;B**q8d1ZzDwbyZ&UT~u>vO1~C3xP%{8dJ9)u{zW#osJPRRiO5+N zEWj1ZwRdXY3;)elY+au(*gsd-ZIhmVUH2`@9G|C~WOJ|kSK@kokRl;%?Q}cnT3W$y zdti1kVT1U={gNM#j0j;r@ac`O4VlHR1%~2GAC&i!>;SKO8v^3-t}k!UFo8#(q#xe8 zeW3fRyY2DYFzR{Q(1EvX2O}60)3fqc&uiMAVzc3?UyZcvEbnng=TPlam@cRu%y=S* zE9`e4sStg?v-JAiYros^L$0t-kW^&AWU+svv|@idbQjG!o35SY_YztOERs)wDnIZT zTbyYiS3?pU zj3{YdW@nKtYgwP$c)^@R!XUeN5ZNd(gh11r2US!DF7Cwh*XT~5f3xR*4zYqUBpwBz zZY%mI_RCThjh!qVXpJk3 zBGo!YB#c9a=x!hGlMn=bRFtxy>@LNX6gsiuvPq;du4Ye}J4_9Z4XisRk6=x&_$Z3o z`b@Xl(C3rCy_IUnNoECGZETl%g&WZ885taNZjF+DmB=J&+9N-`9Yn-ck*>*6>dE|b z1GcHAI?K~wJ#N`24O-=o*_t{Fr9U;xK)gm=)@T=sQ9+xTEAM(fL>QjW2pWni3HmM?nfjZ`bz*i;islhr!RS?9Z7d-cPI<`1lSYFkyP!k;Z8 z&wI2>g!8|7RCQcN^!VwG(Q_l|5_aYayDtwNwMLr7_QQ{nllwZA7Jp~bN9i#(5 zo?4iy z1%e+B#!VTsFen7!XCb}19}M1R0SiBQwe_l`M#9S`tE02T3|;Y?p2gIcmX2;c*`UV1 zlm|%>G0xK5#$dXcej~3uzopRXRQrAE zy~jo#!bGT&CY$t9w_QTejzK%L4*m>f2^oZcUU{V>oiXl<`}Vsb=&vVx4C)g6YK{Lt z(0T6X67?Y<^!{t|fWxLuHaJ$i^ztDSVVx&=>PbTQft=LW9s6Prlt(FV(F;;>a}PP=sB1*zobNoALMQTva1A%gOPPhzIQt&HSu7_d5#F ztn5U~8a^4@QG5PmT;-Ts_{I$AV*>g9-`*lju#*qNMJ`GhF;Hp(_OxJi_V|{XQUr`u z1~Sz(b^?35-6gC9W=AySV&rXamjs_~btu_P+@J=c&<)?*RSF-hJa6@S!$7ZhwIMOU zIDlBtld^D@$jXgOMEcdZm%7>Z!`Lnd{AtC5?KdWdw~Q1#g*fx`3k!3mw*Pd@lG;mg z!b{z23E8%dSjgN09qMBz-w-UQ#B=g`=eWd~%>Sa&`KsaGXp%?$ZPDv%gV~-}=Ound zTqgA7Anl0t1ng-v)bB~C=wzSvCce-~azUoda4Zq}hSWba@GOr42Gz&1%y7uo1^ zvyFU(hp$o!RDu2F-?RCTK~YT?L;ic@Ll8tg$wq2XBUDO)zx7+p*-=e!ocMtRWx%s{ znXoTqXRt*?wm&L)C298_1&#H>+9j;yegVN|JZ#IXTM|Jn=Qa;vNiu;SONT|d) zHPad${<%+f)%Gun`&05C9Q7~c`}6C603q=0AKa%NQSWX01LeV<<(mDUYePzl4@9G) zC|^|HzB{c9l>LhgJ=*@Fxb^>_xY#KA%m1RdV=WBOB-tOpS7ROeFJdE0;F|6oq}f7d z$51;XdfOPj*+g#CE3^qQcBWUbsA|m!{M*Bp-6iU_w~-XK9neBgf9{{MG2ZO~6<2{0 zC^BKovi21nEN|PZ^Pr@#9w>l=aTe4i-rsDJ8BfmKP=jGSn5Wr0A&9WWpkT+=Ky+7$ z9c@_NBe;z%KB4!PJi}+?Nu<-+DuCDwt zBZ=s^X>>w)6*M*33yGX&Y5KqMkv|F0NKzQG6lRkXh72XGJ_+P_-?atWig2J*itM%eX~>TILkil-u4TpI*biy}0sS!!mfc|30iN`#^>1CSg_kSyuw}+0Gg-7YrA`RD{$y-|s*7)W^m? zzx}ddya_N6)_o?kFO9KLDDZk#>{Fe4%0qgFfFVpz2TYT`igq8L&o0PDP}r)GY|ttn zJsVd$ZK&VbuQLL2HEDd2xcyJAMPc92bb>XPx(SL@jH0I8c7138mA{9XxLw6mYktDd@7htp=_u!iqJYb7IgCM7VHpGf^L z0x8jV%RK6)3^3Y*QW9f8SJ^WOT5ZqpVM>IsctUHd8YL~Q|AoT5J#ym+9!vnu^F^cf z{Gj+r+ZmCwpYF@G&NPD18z5IZqziG?Qv5gZz=h0$_3|_6u}1M17|)k2XZt7am`jIX zrYGE4xNSM~2F_``c=4R{oS0r?b+8aPCGD691HR9KW4XWWh8W?6$YbBI4J#4G-Gs;z zEq4l6Bc@1m>ccG0!PFQ%D)G>!%*tAr3+AiU57v{CP<-&P|8KOT`cMd-0^pt~(r{2= zk;ve61>-5t;Mgg;&sfwE7Ujp*4_ZaUtRS9vQAyaZMtEDwf0!>(V0>Hdz7kd+ZlUzD zy;Vk}@*0$!6-o9{k%M}<+M^x{kmPw`Un{tQf0OhaiaxO00Ib`1Z{QDojLil?xjsp| z_kg$+GR$}Drsc2+duKECT}=Y32y4|`dX-?{Q)1&1p0jk91tUc%roB5E%xm%(ElyT5 zy!(v-sJpw#^Ea~I8K!>Y{vF5%Wd8Pv$#U&xqIAo^PcYNjiB#arq^VQ-7_ytbBp`fIec7-MHkO;=gD)D+Xq zpNE%_qMQD?D;saLiyilzoMy5|b2jce<5uC)(P=4XN_PnEuWcfpJKy!|2lj@aI18$h zRqikvZCb0CkMOaW!(({qa{8laVR?)%7_H{C{VpIE*)#{&wIHU$p)GsJ-U@ z!+xp$GcTo)5?8fm{%lzmt($($(*IZoM3LO(MtHzFSWEGX{iO`7-X<5YisB`WmSez_ zu!?;>#A$ZITO3gp4fW3p`*uY5!`YwzznuMG;f^6bDXeiv=7%nCyYr&!`rI%YpgVz4 zPd3rpJd{}Tpi6sq7T*WmF)NY0`lT%LiOsPI<^wQW&oMNvmXz_nq`+1N6z|3V_b3mP zlDPTLQ9kd4{DI}Z>z0NryY)y%#Io|qZlc?wuO2PI!@64k9PlJnAc=re@(V3dw62?5 zQMXOT$%!w>v(l4ELm(=9T>i#(!XJw8-(DvDVN3lkX;E`{GMOd#tFgUF_>mhp@01O! zj%~Z_zb7Dl##U_T_}{5NLjC8wt-1F9p2q*>UjO^;f3vV^bC*Q%m^>SA+KyAiCO>+a zTiy0NhC8JHlb;q6k#+XqFT)$L&_YQ^y_$KUWc_ugbEe)C)NnA%Q%8`u|F=(+TqGwo zv$Nl+tZD)upMAyRLx}f(LwovOj^;rh<7|3Ust;w^Quh!ZzXgc3elX-9!1to>(L^pR z*dCxzF|Y76yPab2+c5y~{iDHTbDidlimZUpWJ#EF=T?B`ur(jt*d80q=uaI)`i{o4 zAZtTw-^bjh$KpKSBMMg?e#IfI?~NCl(s?wUI~_O>JnrRvc|Rpx3I((;!vQf&^(4zr zHBU!3FaddCG2~{tAw1^l+qW?BRr|fa2dRy#I%-Q+Hd(rY90bfc9MqYo?u-cSFj4|A zz8W85k1+%^4zDjiQ=%wpXyCA@a9a$ZDLz~-Oodxm(bdY4z0hC(H2au8z6PqaqX00< z*akU=S97wSI%!1CT~IRC5n}l;f-oV$_Trv9DdFPp+)>kZEY2S``O8@ z7ID%^7VdStF6lhb4CEGD{V{r~Z$b8+jg#!f)-dZi5_({BcUn&>5DpkxLyb5C;J8}k zLr`!-hQ#cro>02jB37b=ZEUAhq-<#>+UR-^>-$LhGN0px`C`;XP#Nx%_(Jq#?SXY= zXmR$>!QdBv_T{Xzutt1{8pbETqCzXnqha`n!OYyemVb4-O9@nV@=Ai?$-qeZ;65_t zSH&%p@uTwMSzs&*Sjwy9G)tu)xo2K8lYn8|H@n7x$3B%A5AZphLfjEw^toS^B);+r z6d(LbL}bkHKtt8&VvOo{X&q@1c({vc?D)}~W?Bhhp*i~&aY_=kg2{aG>#&S%dgduE z+)@S_&+E60KOwL4mU*(GVUsj9Nsz$vr?`) zHHZCmay0H@f^n!1XWHi*5BpSurH{1P6t}g+Be-XM4R6hQwQ0&hf`Y`Y5D70Agva0k z%vg3CG7xBeT?KgOQa=+;LGIQWE|FMP zpLV%q|C3i1N7m>TK09ufybWpES@+|pzrd%m7RtAyAVtO90oz39Utj)AIYO#6qkWk4 zKc-WRD|FCasgnzFutp4w8<|d)_$^9!>KEpeL{VM4)ZiX zF(Kh9mwvb>exKbC4niFr-^57yL4LQaX5*Oe`tL8U1HJ;cW1nZ}pI8M8zgFO!+jd6+ zYgC{L^gE)uY1tpG4Rd3=3zuNLPuILnGuehgm1Gl?qx_CeKbO7F>E6G4@46pJI91e0 z8KwW8V49BRQ10n2Z5+Lhp%q-#?D+gTB^8wfb^VK9h{VAWTu3E4o#4r7C1dUEf3q|K z*q{c;C>5H5cduIs3dKa4$4J!^Sl7rU8J=PAq&Dz6!X+9=zy&_O3|v^vL!D4;iUQ4j zB-#sqd=`1RSoH{`-x}3BuH+_(r=mYTkeb`)?3gGM3KCo==CAR>e36Mc5*HS}GF|?d zM_M%c{5;X`E_>CUy&6nPv}MO)v0FHQ(Z!n5`a(;kbG=Aa{#qYa~`N1fXKwba#0&wrg&CJ_C;6|}Cg%7}=!^Y{0!l!c0xyV+9Q}qTR;9UlZs2<= zID3&DP_tfWqvYS1b+hkYJ@gfT#zM?xK#I%@NyderpKTMxp`p4`Ed|Ee2gkUJ$Whe( zk1*|pw_!0#wgoRQktfoF(C6m3cKu3ZMb%GwJHWg3HSywL2RzuKy)RSfPcz8?zo;J%LJwzPpu?K%ys7FK0*qXxD(I$mIBMI=*R)>M% zgsd@qtTxz~q>l{2Y8{xXN8;747Q%YGT|e%EC>gR zwA_)hC*v4xqr30MKihs6B-R*;@>+Z-HHF$_zPyUJYsElQt z+$CnKSPrpWRt(&3p|FKIRVj+Sq`C6thQ@_W?Ky@8e!8?Cu9CX@|1tK~aZUAo{4gm< zH!39{f*_qzBUBUxM7lwwTRMldN*HtvL_ldoI!2=)EgfSZ9b=5xU~JF9>$<3d6h0$9*l6TJ^{LCqGRF7>l+an_1Yv z4MIeIv_5@5`95l-hlf$hW_jls{ZiyZ%$aaztit^^o}90&@zGP2#3w=dv6NimmaRbv z!Ce)ZC3mCt1CTg!(Nj24d74EVo&#YR>JRUX_MEctpE)0T$E&e~SP(`H!_O)^!ra=d z09z2rG!Q1v2TBW5Bl=z<97$t$%r2`4@0tcU&u7%aHYeWxa(#^Hv;ZtO>yePgMf@_4v3$}0Zf|;y% zT%V7e7oZt8#X8%Xx53}(Co?$3D{v>q9Xpj`L%8&=$39$s9%r_+to2Rb!N$fZ#r@9Q zWBuDx9hHmJ*O|r*Pz8P4=FSvq z;|2mA(|hfbk-0C=K|8TT(WUYq?~#Dr%;GOOgznz~mwsM$oQ8S$RKY7^{*Pzs~s%!3pygQF64bc!!;YMQqlVEWv!Z26;K# zw!vjFFv{WZm4Rh*f12ax-E%y;ZP!JUHhn+D$qS!2?f;xXxtIRKK1Vg;Ey1>pZ^3$O z(LvSb7+ewSmhTfX5C><0jcSryb%R|S0G(b-WN)C6wE9B3vTkMDceKPp?wJJ?yM-;1 z`s6>Vv@$X_cpS3HFcsG^9Jr3UEl3A0<*Rq5AxRp(CP81k?|gKh2HZ8iGsi)F%kY{J zO0xyOsBwU-35BeBlsPrh74sfXK~KQFGhpYBAy^};ZwNwcv-8DPsJIrS7G*L_+*OZc zCk>m*P6SPS2R-^=Ty1$vB@i48EJOB|7!FbvP2ufMKF-%4RVc01cGLPbapw2m92>oI zU-;B_E;sckgr(iPwiT?j6c<{oWUUG3&0|vTM{K|eB|F=~jmdpg#*9WJ^aUfXxc_XR zDSgU08Y&&4v`fn+KacqR?lGebFSBHknSOVl#7WKQ+rSrFv}eYWcBJBjN6l0ZmQpH+ zC@M1fUliSb%PN#?sV)**e5$m%?sUwtNm4#+QyiBY2fYt+8JGNM_h(hM{IeNqnST=OD;J+9Ea_-@sf_1fu(m)zxinwDUK+G?gC}@M?DqD^ zU15dRIGng^T?6ZgQJNRPmZ+sN6ck}FR;}d zi9sXW`1HnQ6D+4fuR$@g);OIuQVMonn{T1!2R3ucj3@Hk`}9i%qeppms9oRLum_%T z_xN;qb_(;yh@v%bf13|sxv%e*zDTE`5KYSB?(l`^5tQ37=lI5%Y0%C2%K*(#i{`jk z;Ae5<^hMaPEE)gLz2{ztFy-|Jahwj_u@YJan{JM9%+ocU(G(%Nu*h$x{+ws*-9siK zaNWJJb4tW`q2Fd0tH>4@e}BgRL3oY=zt#cHXYg78->u7Q#h<=&cb?Acou4|*e!t>o zMZkq{`wv@U;Ds%*zKpo2I8@nbtRx@q&HmzRskF-E83WVWbF+}*mMDX!#8hV8zy-!# zM)EeQzYf(A-t*;MaEjEIR|4GHk&8i$-9(hCGEt>R9&*8Wfv|bsi$m!rj_JJA^Oih? z=wYCiDDd5J*R$Ug`Ym!qtBIa9Bx>pR2`rA>ouA1?5XV5e)Vi)Crdph-pS(Q!-ERf_ zPOsohC{DL1{Jyj+=_ZCu#tU{^uCl7ID^@fT^*8fZC0@0|6wx_Nj+sCOO-$ zJ=t46r$pK^&D#OMS?2k)7}V}jYPxBibD?0|Uo=fc>1BYC6Q+Ou96r*8n;x}2m!P%F z{3=nn`>4B)ewqMYIyJd(bf=H?`fY*m&PUNLW6SsJNHvXG8b>=XSLWJ7RQB!A0D?R^ zCL51Bfeen7%_j=r)wp-goVdVu-*^Nqn>ylTy3>!&{Wqrz4Nnk4%L6vF>2#`S6D@KR zN-iWvIfK);P%9Nzoy|M4?lttTmIAaVzx3U^UT!bMX^kSUwS|={CNWEbKvv3l3@b!^ zp4ZC&_G2KjeC%dz(cxff^t>aWj!b}I<#^yi$OYl^^YhIeb9|~R zgU#8Lsy)t?GtpD{p!5q+U5;S>+tA8-&@Wt20|AQZr8?1HVo${IWwF179zgf`Z^`F> zia#?dC)1-LGqG-)H5_j| zb`laj7ImFV-HYX+N?fqL^>ag)@IrYa2M+C2JplS7Wb;;wCK&2S;dJdL!hd1}n!kWv zWnK-@DeHGh30t%V4(AG)Gx)}*!om#a*B{c;KL=->+&wVN+B8;>Nt`v$SxUf8JtT~= z6dT_+9&i2fe*KY0^$GgRzT#| zOQ2c)s^#|z3o~-v9Ky9N*W$dqa9IJ(_#I4Y4>Eg@QM@Q*zRE_uvKny<3xEK`8{oNo zuItwZ`zq!(CGsF!hI;I#PE7ZX>w`CO;dlL%omVyE5)vlL8GDDM6(ugQKyv`@dB{B$ z=;KsHEVc&9g{*5g2pwFFxA)jds^z@ht zKHqvBs?TD4!zhUS+S$uKkWL~ympYy{JR>F84!7wh4>zgFtE!?)HJL#BDr!#b?at=O$WX+`l+1fbppm^!1hOJD7t+O z??*a~#h@D7XBxbC<9gSDDwY-a&kRXwW}Ciewp!)sTTGC-!s6!aM3I&^kj!yzA9g0grY+^m#>=9WGVsJ?H{dyMuOlJvbosh72r6B$ zbIjIe^{z1uoJy;~ps#)kq+w>h+T!)4!IW^mMX!mT;yr)ZbH zELN&vYHRk#e`qN#Rt#dW)vW8kkFQ|PrXGnlVV@Ex`{@OR35G5H=yI~17|&0&H@cTj zieK~AyLU%yN?ozy4OT&#tSp}S*b#c_$xn&ApFl)W-bzrkx3dw0E)tF0sU8^%>0u(nMuzJz$o(K8YBiyU?eH*~+>^>n{eb z?%nUI9mq8d#-VpF?6=bw!43qB|J@3e4-&ukoM z0Q5|AKd2UT%-teP;9@-)V>3~alxW4%XHsvIP_f!Mi^``WRFkUd;?FTM)I`l)q6KdI zhv60Qq_fwQf`KieIMmWo_5*k5RB|9oZsu6(BNx8T?zu3H1AO1Q417iUaGwg|9W#fq zMm#@^H2Jg=v+OwS`5;qZnCmhvJGriF-dLTRSsH5joy>{aovH(wR`TAVD^GTV4x$WR zWLxlSZd2iXUtFb7QnbF{POO|vzWlJ_(`eFXiU5bPe5399Sst!9`PN5VL7h^>KqVi{ z?O{x3l8<@I`t-B2I#y=(Knn1~?=gjwM9lR|*Mj_j^PGl*kaxvye5IkSE-s@QvbQJF zH|+VLFetxdKYI{qDIKyClgq`#Ra&2K^qKdzSu9ZvuR?Fun;5V2B7?wPsr}Bv)zydI zi=Me3t_rA#({|eO+8nzGUC(whIc(1(m&?9JBW(IDJTD5`HE45N>yF6lg!C(MJ20-N z^{Z-AeWu_2_Ho7dda^Q8tkHwH8nVd>;V2E8tYrIlme~c&OrIX&3aU;q&bRa}iF|R) zUayCotw5ucCpb-!H#TeUb!9LRrO-Min5w9G0?|&2ktK4j+Lnxq6o(lGh?TwfYB8Yn zh3v&8LP^?jCN81hMwRtp%@bo2GrNS-67}!d_KK4KPaGI<)yKy9gXw!)i5yyhs>#`krKH7kyaD~>W8Aq`P}rL_OF47* zmpWor4No!=_LmlG8o(inagVt3$S!fkBCAk-xYXRz&&SPcbUm?jDgrT+6$|<)YXEwx zXE13hc9s(7jAjuKLLSb^y?7t`IMn92piZP-ArGA*a4=M!j%tbhHur5pgR2nh)f z)|cNi?6ZW_9t-KstB;P1IJdHO|3j;60kn$Vs-Gk=KLkh$BZn_@Fa|{G(V0Bi_3!p5 z5Z>0!8$I5pxOhAS7lb-&LtmKatIu+Ig3lsR@pQzNL9ngS>4+o=?Ypl z2xkVvJ_paY2J(!$vu-&vJUW}i%m zvGyW|&e-8Bm#Z4AIA%*Z1Dwsp8N`xYX>(S>7N$K$UcS6PqE3tSW}B>(brm-}^x4e> z!F;-M{0~-yQ0p!dm#sLz*f_f1-k-<)JXh?l2Z}4%NlZX?s!7Z{rxZU(A-)oiI0-9Y zRh(-&oYa+%vkK*#eplMgrIT#OpNq%N2&`239V=yAECj6!Z8b++N;(^n5+&!VX9Rmr z;3xY_Ycajy&xVWwq_Tzu@iHilbyY6w1Qw9aV*^k2u zMJ#t>w-?32ArMHu5PXIAJKv+!b{~|yH85c%0+^ZBcu4+KN*VVIB5B8~|Ac^&MI=1V zkbeJXo`W@>_H0!ef()h?=E=*eQsJZ?I$iQ6Z@t4LSYaxoyj(AAe!%$*HjV)#d|1}5 z-kB|%6*!r=kJ#!`2(JgqvsAU`1wP?zr^&>?T_xf5VKur|!P=+A z&$2GTqSz5Anyr^~UCHK*yE~ea^@*n!Ji2{2V2Js5&MC0jOV55{(WKc3(!wHV$c)_6VTxE9@I$NpbU|HAW&M-^@|;IOCaSl6n8j3Y+#3nzCyLQ~Va|BW8E z@7&qMr1h5cDz9L^--W&#`tMYEWOg4FQ{rFa%f zx>;Vo#$ImLX?tf}vJ^{NhE2vS?Z~~Rmdl1i0oT#ti+dUx17_4^maUo1eC0_l#Mw1Z zCOjV`BzpFNeM&AXQl`3lyZYSajexzGv!=tCyCp2+ERAIjTF}ybX9%f1F>%72SAFgkfMs zr}9BID(Ot?qV(Oyuis5C-*(&vl}2$GC3~o)s*MH(NQN zEA@yT2ejpeojTE*(!Jpnr|)x$FyJpT9JKpB^rKGmk&H{gr{S@fZ!;xOzH5+7x2rDy zT;Cy=Wy(lF#p`kpv1*G33wPejMj5&jh{!~+utk}*e)(KT-nAl*51Rc{J5us6>Pt?2 zO5(3y6BA=)c0q~};A;AoT7o`X{wbwWJ)*MDRnC5M+m%pvhFsBA2Rrs+i4!%>fi7~~ znvP>BIj-r56%tB_l$4FYFP^|NGCYt0t1Jn9K@SvUxK4YGa_C(a6#X{DLX-j-E^?YW zxYdV&YC>&SqyByKPm=`&RG6P~uq=Igf!bPm#{7c7$>Ot68qLfhNh1Y(;@!HPi5uXk zC1+(*b2*wGG;QBNMyR@3i*lI05lLEw4aF=a9sqah7453NhiHL@ecew4VZGh~E44XM zppXqu=uh>GqMZ*jAp`M1Nb(Xp#)&I_(~ozDGX7;b3_J`w?5OpO5()*d@>0Oiv*$)n zo)AQ*QE;!puS`!@Q$~G-wZrB*OQ!_{JYp; zmC||U$DVIVR5wWc{>3LE98fw$KY#qhr$#$9`>8H}b9yTiC~?EyLEZE&$&IflT_Gbi zz`5j}LMLPt@SN&)n8GVAjqC*)V8~?TVrwwU6FrpUY4lr?4kX|6&Bl4#T;mH^L+BB&w)lJ0c5#89W5{ z$>XmOin*{bebq(-m10ew3M{P|F{r*D(Iek(GXryZUn_h=iD9~E344{*qc(p)m(0r9 zpWD&n+YIqWWdzpL;uBylIFJw=@Ka&8ZQPj8Ko{d+w{R{@)}L`=gyj0Z(5T_EWA<+c z3@Y2pNOyzz<1w2Yd*Pkc)m7xr6gKmBz<%m!TvQds=l{g@fxjjH1J`d^Wu!spH(aUyR|RcNz&_4I!CbA{-cCv560q z*P_e6FBgFa?5EPFsakk5xyYoPhPv8&6IQ9pgfA~=)IY^coxG8;TFA?!S-pGboxRaR z6%R@Z+Ln{AI5)T6?dsdKK`N4HX8TO{i4NYVXj%mL0%r4a{TpTFqeCU|F z1_b>60$v6M^7;Imfm7~naM`ydtN6OAounMy9Q^OgrN8Bx zwUdKr@y2N*3quFrhJJyO>FI?W17$2&N)O8RYw5K%#dHf57s%Eoc!|4`1nmw?eT4e&bie4ai1^Cv>1#(*0Nb5!{Lr4EE5v zi0F1^IhKg7FYu9%_bACV(F*hIyvR8%)eTuXPfPWQ zvfJ*TX-wR?^5uC!fsXwnr1U{&;j55tMQLKnJpO%rzpXu>#Ue$=-q;!O;(8n@g<6Dh z_p(3M%%YMCJbjvZ@zdz(W$>}jD{%RJxDyW-bKoZOh->`ylVp=LjBK!3RhQ8!^sAuu zqSGXy?072pumo-^dx*_LSM}fI#K8R!HJ8lr-zV#Yq*9K>|k&SM~M}_3roO)Efl=;0{m~^Z$`tBub`!b8>9}Vb5R9>DxAv=0D6%lTIkGhS}Eodu6tGwmHE?$>P)#?^90n*}p& z{fRGLY7e|$hlU)s*s)unjRN5Mn9BK&jjSSCzj#Ri0i+E73%@;ypV}d;ffIgt8g{lT zXyB8yl^>o0ZPpN%_%I$n9Ig>R@|+|pf(%xrZubV2GqNgpla$A^6CUp+E{5Bk`5Uqh z<;r&0Vx|H}qNq9BY$AEhvJrW`|H7n!$`PDm&zRhYvzDr{E<1#(9g!Z>`3{up3SW@; zj>Rh*R@fLtu7|W&;L)WYj=0u^GuF#>&!^gnH7_n0REyBizU@}+o$FX^uF_YcDLq1m zSP<1ZF~tlbx)fJ2#_asgo*F_3v3J9Om7BQs6XFLe@0pee-UQF6b4TQUGVF zHtRNIrvYI`#Xn(2;WnHASt4264gucd1&)`kka*)SL<*9(R1h`KslW@OCV}YY`@imH z;EA{|tzGNTj_xH}4%y_{3(Aoy{!pf0OqJaaGfaQ6dB@3aksi{RO&HmGslWhd*pn@; zaWQ(irQ;hLk32zl71Z}bM9Ekgoc(QVXW!W%jpFyIJJtA0ngA%>eqF2&?{QhNetx#) zK2h_-i%!O`)ZS7qH%)MnBxHryi;%@@YP+cEl&tFc{!M6`} z-|-zsb7UK%#~PTv5Hbi6pnSE}td9?SCdQCYp3;-tmMy+YNjVVmxW>>--TGQliyZUQ z`c^A9>QqZTUbQ}oO;Jd^KkC`5wHMpM*f-3%3qznVG1+InB{-qk+a60+W&0K8>zXNebeQMe zzEiLjRC0nvCA3;D11a&n9GkQ)TWl(?8N8~ZLNEc=+6Eorn+`nm!r`wg;Ba_034Hd0 z`zI6Nq_5##^6e!bE?R8f+B{p2UN8DcA|rBT-N)wt5_7zq*VH#;FD` zQ~Ry;c9W^RSi*ydgDZ%hiFnphIvpgK=Bc;0Fq4>a@mih8+Lj@qunYbjy>VpT@X}F*qZ(6j_mu_$UhmO_e_3fFvZ{fem{xfTSRQUMiT#y& zJkfpI!u@%gz*wrKpIS|Np3YQQ6l!*7{FCp!QfhqN#X+oS4o|kM+%UOKd(E9(>*ylx zxDmHtjPJv4J0*Pv-t#WAY4!}mdbD5~zET~-7NK`O1;JlRe4D2@X&Yhl2kJRAJwY3Z zoYPQxKFtq2vZ^lXYa)qx^phhNHZ>uc2xhjZ*VL-DFPcr)3pquv{JL~J z20y}P4I9kSnFC=+ORV1c$?j=oALXUmm#sc%D!iWzN%5(bEZT#BBsN8^N&U@EcgL&9 zpahcWuL##%sxOy(6yEd~YjEHAtAF874TBXMfL$gcNP?%1zIp6g`mU3Qs{k>`zaxvY zNFAawmK#@`AcCw&o!fMHl4Zz~6ATb3xX^!zUM|`HkD$XpI85cASAXRwEo8nlx-NH#b-H&hp%9ct1f3vEilrPqZ&oZJxl=!SlD1i3tVe3_fb6rltvJ z;d~eUF!*k$xZKDnc#O%zyAd?Y+jECL7pif$`@;1E>E2i4MXIyEf4oi4q1KI#rek9(HRHR1OJKD^ z88@8o+oXe>lYc6R(w2qXEjNFN4R$&Qi(FS(hO8bP^F6Z0;m#QlA8|Fu;ph|GF_=n- ztOJ7qLKM2;6aQ7`;uY)1c@vE0Zl87#Fp};C#xN5KUGHmuNgzjIpF(Zi6A55Jx?u-9 zRc=NbV9NOv9|v$T8$97ec?2udEmsK!B9=mXC<9x>PEG)Ep; z^|D$S*AY_=u2m^rfWMRDWBl)j1E-?>gcD!{t99Jidj`%$4n^W1kc(kkS1ihNM>m`l zk?L51yGI;Vf}7ftEL8&cGS<7XAq;!mL^&p%COa)HEjcUAuM2+M2)IZ3_`wpTSRWm}^S?g=G zvSdb9ODhR7r9WJ=`JLnYQ}Oxy84>>Eh&Z6+r1VMH?rp5k3&x~+7w@(?3`E9IiDTJI z9GCBSf6<)T#yCtfmPWePX^O_ux-XW9n6KJyjRP)p1W@uG`&*@0uWGu%?`D;H#Vn1> zga&nZ$k$U4YSOF}i1oA6;d@aC*E2*if%?k7MA&{K8vfjuq`aVs8>qB@3S!tNzz&Pk zOeS%hJEtO&)mQ(IeweGqW(?hu9)$;eXK7Wc(j5J-4tNGD{5m(>RN)uP3$qZFgTg&P>*EDOmvaIKHyAV_9bZk8fqz_>GS_u9V@CT3%&&E6yM z7T$VvBj+#q_b-fj_tmQds*UQqqwzdt>%V{0u0D(uAtyJzcIrk$DVB|jN?P#zowRIwB%>eAVKdY8 z!mk2Qb|KHU&>v==hNL?+8AJw}I0Xidne%6_Tlc1O6E9uB-fZTBnaXl&Zcoz0=p|2Q zxo?i6L=g-)8rj%tsnrJK>1WTbe+B<%Ar5%8`pjlx8LBp$t5oIZ#;r&(_etu_;qrqA ztG>utl>h*7_66%acT(B8B@|hck-_pu_xbyhK-$0t~|2;M>G&r-&ce zm4oYZ@6O(^7B*&fLv<$bjjmN3@kz1ORLQBGQ(!DF>yoUng?y(SEnsViy3olrnW~`} zD@5vwW39PloBe>&^~;yXQ0|gdDCSP$g-EpEZ9zSs*n>avZp>fuE+ynMf$`OU$-BRG z=kyb9_P*Az0Dh0bn(*krmlbmKWL(jz4aYo>1Exn%k;`3wA=|y^uBn}9S+A01K4Jh2 z-3O4Zr|*iRkhp3z{!b$ijYaJ`)R{>+K~{MZt8<|_7kC0=#Ue1B(PJU?^6lW0Y2!v5 zbZ84~whRL(Bhk#~&%dJ<6m#*vpNC(x{RHF`0?SG{4%UP-nxQIfa$^hydAQU)#r((R>JRg$IHk`;poj{K-Ne~2Jrk))8356? zqj3KLi!J5Mur9mNHODt6F9Z9`GD6SXm%=!HC7=}ukbet24RAvBj>;4|j7Q|~l_MBG z1}OYdy6#(qGb{eXbQ%!eyqUd{&2JzY&og9~Aa5PKNb+MXtXY$Jp&&@WdKIy!8~<}v zDoaB}PdY&Q3Mp-yO>C}kHX=&INcY%8*#>@*n-KMp!)IrfJn2IMO8eun7P0Xn1i)ZOTVUyuF=2JRvMZV=L}$Tpe7 zPJq7OyEermY{+F8qXgr)0KsaobmILdR-uCVe~G863ZmKnU!e8^{sN%3Syyh&F7_kO zw2WVw6okmC*KxAUeZNw|BN|=FhmSaG>INN%^b<_rP4jz1p(@rE<#_EwJn(o3*@@dW z&vz&daAS{mwOT0mlet6F+3TJHqwrxyUn|a(h3D9n1_ThYbYLrizk=`kl&wFFJrsX6 z_9*-xjXmN(V~+{pO15msj$g1#I2j{h+ZNZ2!kONdl-cFNwl87Ztn9zHv!}tte5Q$& zzCC&u0;)mIzx30=7S9)!%jD^*@!|UkI^CGDdjLrNbf=EEL z>@1tau`AiE)AgjLC@Dg0RZ*kJ#h;l==CSEH#P>zcHR%Yeh)5*}IAJ~f^co)ByR@pX zw-ku+d=U5T6l~5O4+@}TnIy$s)D2OJRd)s_u&LF6gHQG*o|9S!!gY7LJtbV`>h{t6 z_W;+T^Lm2<5YA|9Vss*UyA2 zYj%jui|^zZhaf>?0AS8-YcQ4P)O>~&Mf|i%lZAy(?TZ=)7*==}#N_WHUfT90cDybp zd$y!>WK_vPT9F?;AXi08P->`(F!PAcgIZS95iGyy`4OL{>b?p#hu)bO)14I}BO+?4 z!6|ftg36kz2~omXGH^4i+6sIbapK}ndGjHBiNQy){rVsBz%_aoyi;S`y!r?W9oj=p zyHs}2v(ABCB~yz&wXoCC5lG&{t>bk!`|5HCi z`4=wNPzmaaz~`$2DEBC){TN+uNl**tivJsvf5z`z;i~6G%uU}pG_;PL;SBY=Lc z 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 literal 51528 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üT&6RojtjKxL?!)u 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 Date: Mon, 22 May 2017 16:26:24 +0100 Subject: [PATCH 04/82] Tweaks readstorms as per Bay --- code/modules/events/radiation_storm.dm | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/code/modules/events/radiation_storm.dm b/code/modules/events/radiation_storm.dm index a8c9386fde..1debfb2fcf 100644 --- a/code/modules/events/radiation_storm.dm +++ b/code/modules/events/radiation_storm.dm @@ -2,7 +2,7 @@ var/const/enterBelt = 30 var/const/radIntervall = 5 // Enough time between enter/leave belt for 10 hits, as per original implementation var/const/leaveBelt = 80 - var/const/revokeAccess = 135 + var/const/revokeAccess = 165 startWhen = 2 announceWhen = 1 endWhen = revokeAccess @@ -27,8 +27,7 @@ radiate() else if(activeFor == leaveBelt) - command_announcement.Announce("The station has passed the radiation belt. Please report to medbay if you experience any unusual symptoms. Maintenance will lose all access again shortly.", "Anomaly Alert") - + command_announcement.Announce("The station has passed the radiation belt. Please allow for up to one minute while radiation levels dissipate, and report to medbay if you experience any unusual symptoms. Maintenance will lose all access again shortly.", "Anomaly Alert") /datum/event/radiation_storm/proc/radiate() var/radiation_level = rand(15, 35) for(var/z in using_map.station_levels) From 40ba4f5913292dc382540def4c63192075004748 Mon Sep 17 00:00:00 2001 From: Yoshax Date: Mon, 22 May 2017 16:29:04 +0100 Subject: [PATCH 05/82] Fixes a radiation oversight as per Bay --- code/modules/events/radiation_storm.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/events/radiation_storm.dm b/code/modules/events/radiation_storm.dm index 1debfb2fcf..4596e9ef35 100644 --- a/code/modules/events/radiation_storm.dm +++ b/code/modules/events/radiation_storm.dm @@ -37,7 +37,8 @@ var/area/A = get_area(C) if(!A) continue - + if(A.flags & AREA_RAD_SHIELDED) + continue if(istype(C,/mob/living/carbon/human)) var/mob/living/carbon/human/H = C if(prob(5)) From e5ebd3a56d781def2f789d4c966249805a4140cf Mon Sep 17 00:00:00 2001 From: Yoshax Date: Mon, 22 May 2017 16:33:37 +0100 Subject: [PATCH 06/82] Fixes a radiation oversight --- code/modules/events/radiation_storm.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/events/radiation_storm.dm b/code/modules/events/radiation_storm.dm index 4596e9ef35..bf2dec5e4e 100644 --- a/code/modules/events/radiation_storm.dm +++ b/code/modules/events/radiation_storm.dm @@ -37,7 +37,7 @@ var/area/A = get_area(C) if(!A) continue - if(A.flags & AREA_RAD_SHIELDED) + if(A.flags & RAD_SHIELDED) continue if(istype(C,/mob/living/carbon/human)) var/mob/living/carbon/human/H = C From 4dd0bb9bbebc989c63cba8068c8fd4c9a1d043ef Mon Sep 17 00:00:00 2001 From: Yoshax Date: Mon, 22 May 2017 16:46:25 +0100 Subject: [PATCH 07/82] Fixes SM stuff --- code/modules/supermatter/supermatter.dm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/code/modules/supermatter/supermatter.dm b/code/modules/supermatter/supermatter.dm index 46f8033b24..9db6eca0ad 100644 --- a/code/modules/supermatter/supermatter.dm +++ b/code/modules/supermatter/supermatter.dm @@ -100,9 +100,10 @@ grav_pulling = 1 exploded = 1 var/turf/TS = get_turf(src) // The turf supermatter is on. SM being in a locker, mecha, or other container shouldn't block it's effects that way. - radiation_repository.z_radiate(TS, DETONATION_RADS) - radiation_repository.z_radiate(TS, DETONATION_RADS) - + if(!TS) + return + for(var/z in GetConnectedZlevels(TS.z)) + radiation_repository.z_radiate(locate(1, 1, z), DETONATION_RADS, 1) for(var/mob/living/mob in living_mob_list) var/turf/T = get_turf(mob) if(T && (loc.z == T.z)) @@ -111,7 +112,7 @@ var/mob/living/carbon/human/H = mob H.hallucination += max(50, min(300, DETONATION_HALLUCINATION * sqrt(1 / (get_dist(mob, src) + 1)) ) ) spawn(pull_time) - explosion(get_turf(src), explosion_power, explosion_power * 2, explosion_power * 3, explosion_power * 4, 1) + explosion(TS, explosion_power, explosion_power * 2, explosion_power * 3, explosion_power * 4, 1) qdel(src) return @@ -389,7 +390,6 @@ var/rads = 500 radiation_repository.radiate(src, rads) - /obj/machinery/power/supermatter/proc/supermatter_pull() //following is adapted from singulo code if(defer_powernet_rebuild != 2) From 341be4ccb8f0a71e2cc05e8e1fb3d6c12e8a35cb Mon Sep 17 00:00:00 2001 From: Yoshax Date: Mon, 22 May 2017 16:48:52 +0100 Subject: [PATCH 08/82] Max health thing --- code/game/objects/items/devices/scanners.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 6399d0ce4a..3d48a40374 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -69,7 +69,7 @@ REAGENT SCANNER user.show_message("Analyzing Results for [M]:") user.show_message("Overall Status: dead") else - user.show_message("Analyzing Results for [M]:\n\t Overall Status: [M.stat > 1 ? "dead" : "[round(M.health*100/M.maxHealth)]% healthy"]") + user.show_message("Analyzing Results for [M]:\n\t Overall Status: [M.stat > 1 ? "dead" : "[round(M.health*100/M.getMaxHealth())]% healthy"]") user.show_message(" Key: Suffocation/Toxin/Burns/Brute", 1) user.show_message(" Damage Specifics: [OX] - [TX] - [BU] - [BR]") user.show_message("Body Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)", 1) From b1250a4391ba446d68e8d61af3836796fdccff55 Mon Sep 17 00:00:00 2001 From: Yoshax Date: Mon, 22 May 2017 17:17:28 +0100 Subject: [PATCH 09/82] Door stuff --- code/game/objects/structures/simple_doors.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/game/objects/structures/simple_doors.dm b/code/game/objects/structures/simple_doors.dm index 58742c3b60..4e302e0e31 100644 --- a/code/game/objects/structures/simple_doors.dm +++ b/code/game/objects/structures/simple_doors.dm @@ -168,8 +168,7 @@ /obj/structure/simple_door/process() if(!material.radioactivity) return - for(var/mob/living/L in range(1,src)) - L.apply_effect(round(material.radioactivity/3),IRRADIATE,0) + radiation_repository.radiate(src, round(material.radioactivity/3)) /obj/structure/simple_door/iron/New(var/newloc,var/material_name) ..(newloc, "iron") From db95f36e3bd36e850d206d8616b682d1064baaa7 Mon Sep 17 00:00:00 2001 From: Leshana Date: Mon, 22 May 2017 14:19:14 -0400 Subject: [PATCH 10/82] Fixes Runtime in camera.dm,214: pick() from empty list proc name: attackby (/obj/machinery/camera/attackby) --- code/game/machinery/camera/camera.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index b105222084..85d97a2b30 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -206,7 +206,7 @@ user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) if (W.force >= src.toughness) user.do_attack_animation(src) - visible_message("[src] has been [pick(W.attack_verb)] with [W] by [user]!") + visible_message("[src] has been [W.attack_verb.len? pick(W.attack_verb) : "attacked"] with [W] by [user]!") if (istype(W, /obj/item)) //is it even possible to get into attackby() with non-items? var/obj/item/I = W if (I.hitsound) From 1b0474d57a50a7cefada05ca45d7c6f253506b3d Mon Sep 17 00:00:00 2001 From: Leshana Date: Mon, 22 May 2017 14:19:38 -0400 Subject: [PATCH 11/82] Fixes Runtime in preferences_setup.dm,230: Cannot read null.title proc name: dress preview mob (/datum/preferences/proc/dress_preview_mob) --- code/modules/mob/new_player/preferences_setup.dm | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm index 4cf3499b8a..5fa306b7b9 100644 --- a/code/modules/mob/new_player/preferences_setup.dm +++ b/code/modules/mob/new_player/preferences_setup.dm @@ -224,12 +224,14 @@ var/datum/gear/G = gear_datums[thing] if(G) var/permitted = 0 - if(G.allowed_roles) + if(!G.allowed_roles) + permitted = 1 + else if(!previewJob) + permitted = 0 + else for(var/job_name in G.allowed_roles) if(previewJob.title == job_name) permitted = 1 - else - permitted = 1 if(G.whitelisted && (G.whitelisted != mannequin.species.name)) permitted = 0 From c53899bea6626704516609c2464dd0b79d1398bc Mon Sep 17 00:00:00 2001 From: Leshana Date: Tue, 23 May 2017 21:03:39 -0400 Subject: [PATCH 12/82] Fixes Runtime in lattice.dm,41: undefined proc or verb /turf/simulated/floor/airless/update(). --- code/game/objects/structures/lattice.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index 96291ecd27..ec4652901d 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -37,7 +37,7 @@ if(istype(loc, /turf/simulated/open)) var/turf/simulated/open/O = loc spawn(1) - if(O) // If we built a new floor with the lattice, the open turf won't exist anymore. + if(istype(O)) // If we built a new floor with the lattice, the open turf won't exist anymore. O.update() // This lattice may be supporting things on top of it. If it's being deleted, they need to fall down. ..() From 34c73dab6963c91086f30a1bc1ad6a79038e766e Mon Sep 17 00:00:00 2001 From: Leshana Date: Wed, 24 May 2017 16:37:06 -0400 Subject: [PATCH 13/82] Optimization/Rewrite of Radiation Controller * The performance of the radiation controller as-is was not fast enough for inclusion in production servers, but it has some nice featuers, so rewrote it to be more performant. * Instead of storing the radiation strength for every turf, we only store the sources of radiation, and calculate the strength only for mobs who might be in range. * Old method was ray-tracing to every turf in range whether anything was there to be irradiated or not. Could be hundreds of turfs. New method only lazily calcualtes strength at a turf if we actually need to know it. Often times this is zero turfs if nobody is standing in engineering. * Removed the automatic processing of objects with "rad_power" set. Objects are responsible for calling the repository to create/update their radiation sources. Saves some extra overhead that in practice was redundant with other process controllers. * Also tweaked to be more respectful of qdel'd objects and added some comments. --- code/controllers/Processes/radiation.dm | 68 ++++---- code/datums/repositories/radiation.dm | 178 +++++++++++--------- code/game/atoms_movable.dm | 3 - code/game/machinery/doors/airlock.dm | 9 +- code/game/machinery/doors/blast_door.dm | 3 +- code/game/machinery/doors/door.dm | 3 +- code/game/objects/items/devices/geiger.dm | 2 +- code/game/objects/items/devices/scanners.dm | 6 +- code/game/turfs/simulated/wall_attacks.dm | 2 +- code/game/turfs/simulated/wall_icon.dm | 2 +- code/game/turfs/turf.dm | 11 +- code/modules/events/event_container.dm | 2 +- code/modules/events/solar_storm.dm | 17 +- code/modules/mining/mine_turfs.dm | 2 +- code/modules/power/singularity/collector.dm | 8 +- code/modules/supermatter/supermatter.dm | 6 +- 16 files changed, 172 insertions(+), 150 deletions(-) diff --git a/code/controllers/Processes/radiation.dm b/code/controllers/Processes/radiation.dm index 8ebd3a71a8..e64f71ebb7 100644 --- a/code/controllers/Processes/radiation.dm +++ b/code/controllers/Processes/radiation.dm @@ -7,37 +7,43 @@ linked = radiation_repository /datum/controller/process/radiation/doWork() -// set background = 1 - for(var/turf/T in linked.irradiated_turfs) - if(!T) - linked.irradiated_turfs.Remove(T) + // Step 1 - Sources Decay + var/list/sources = linked.sources + for(var/thing in sources) + if(deleted(thing)) + sources.Remove(thing) continue - linked.irradiated_turfs[T] -= config.radiation_decay_rate - if(linked.irradiated_turfs[T] <= config.radiation_lower_limit) - linked.irradiated_turfs.Remove(T) - SCHECK - for(var/mob/living/L in linked.irradiated_mobs) - if(!L) - linked.irradiated_mobs.Remove(L) - continue - if(get_turf(L) in linked.irradiated_turfs) - L.rad_act(linked.irradiated_turfs[get_turf(L)]) - if(!L.radiation) - linked.irradiated_mobs.Remove(L) - SCHECK - for(var/thing in linked.sources) - if(!thing) - linked.sources.Remove(thing) - continue - var/atom/emitter = thing - linked.radiate(emitter, emitter.rad_power) - to_process.Cut() - SCHECK - for(var/thing in linked.resistance_cache) - if(!thing) - linked.resistance_cache.Remove(thing) + var/datum/radiation_source/S = thing + if(S.decay) + S.update_rad_power(S.rad_power - config.radiation_decay_rate) + if(S.rad_power <= config.radiation_lower_limit) + sources.Remove(S) + SCHECK // This scheck probably just wastes resources, but better safe than sorry in this case. + + // Step 2 - Cache Expires + var/list/resistance_cache = linked.resistance_cache + for(var/thing in resistance_cache) + if(deleted(thing)) + resistance_cache.Remove(thing) continue var/turf/T = thing - if((length(T.contents) + 1) != linked.resistance_cache[T]) - T.calc_rad_resistance() - SCHECK \ No newline at end of file + if((length(T.contents) + 1) != resistance_cache[T]) + resistance_cache.Remove(T) // If its stale REMOVE it! It will get added if its needed. + SCHECK + + // Step 3 - Registered irradiatable things are checked for radiation + var/list/registered_listeners = living_mob_list // For now just use this. Nothing else is interested anyway. + if(length(linked.sources) > 0) + for(var/thing in registered_listeners) + if(deleted(thing)) + continue + var/atom/A = thing + var/turf/T = get_turf(thing) + var/rads = linked.get_rads_at_turf(T) + if(rads) + A.rad_act(rads) + SCHECK + +/datum/controller/process/radiation/statProcess() + ..() + stat(null, "[linked.sources.len] sources, [linked.resistance_cache.len] cached turfs") diff --git a/code/datums/repositories/radiation.dm b/code/datums/repositories/radiation.dm index bdf2b18322..457e423b4e 100644 --- a/code/datums/repositories/radiation.dm +++ b/code/datums/repositories/radiation.dm @@ -1,114 +1,132 @@ -//#define RADDBG - -var/repository/radiation/radiation_repository = new() - -var/list/to_process = list() +var/global/repository/radiation/radiation_repository = new() /repository/radiation - var/list/sources = list() //All the radiation sources we know about - var/list/irradiated_turfs = list() - var/list/irradiated_mobs = list() - var/list/resistance_cache = list() + var/list/sources = list() // all radiation source datums + var/list/sources_assoc = list() // Sources indexed by turf for de-duplication. + var/list/resistance_cache = list() // Cache of turf's radiation resistance. -/repository/radiation/proc/report_rads(var/turf/T as turf) - return irradiated_turfs[T] +// Describes a point source of radiation. Created either in response to a pulse of radiation, or over an irradiated atom. +// Sources will decay over time, unless something is renewing their power! +/datum/radiation_source + var/turf/source_turf // Location of the radiation source. + var/rad_power // Strength of the radiation being emitted. + var/decay = TRUE // True for automatic decay. False if owner promises to handle it (i.e. supermatter) + var/respect_maint = FALSE // True for not affecting RAD_SHIELDED areas. + var/flat = FALSE // True for power falloff with distance. + var/range // Cached maximum range, used for quick checks against mobs. +/datum/radiation_source/Destroy() + radiation_repository.sources -= src + if(radiation_repository.sources_assoc[src.source_turf] == src) + radiation_repository.sources -= src.source_turf + . = ..() + +/datum/radiation_source/proc/update_rad_power(var/new_power = null) + if(new_power != null && new_power != rad_power) + rad_power = new_power + . = 1 + if(. && !flat) + range = min(round(sqrt(rad_power / config.radiation_lower_limit)), 31) + +// Ray trace from all active radiation sources to T and return the strongest effect. +/repository/radiation/proc/get_rads_at_turf(var/turf/T) + if(!istype(T)) return 0 + + . = 0 + for(var/value in sources) + var/datum/radiation_source/source = value + if(source.rad_power < .) + continue // Already being affected by a stronger source + var/dist = get_dist(source.source_turf, T) + if(dist > source.range) + continue // Too far to possibly affect + if(source.respect_maint) + var/atom/A = T.loc + if(A.flags & RAD_SHIELDED) + continue // In shielded area + if(source.flat) + . = max(., source.rad_power) + continue // No need to ray trace for flat field + + // Okay, now ray trace to find resistence! + var/turf/origin = source.source_turf + var/working = source.rad_power + while(origin != T) + origin = get_step_towards(origin, T) //Raytracing + if(!(origin in resistance_cache)) //Only get the resistance if we don't already know it. + origin.calc_rad_resistance() + working = max((working - (origin.cached_rad_resistance * config.radiation_resistance_multiplier)), 0) + if(working <= .) + break // Already affected by a stronger source (or its zero...) + . = max((working * (1 / (dist ** 2))), .) //Butchered version of the inverse square law. Works for this purpose + +// Add a radiation source instance to the repository. It will override any existing source on the same turf. +/repository/radiation/proc/add_source(var/datum/radiation_source/S) + var/datum/radiation_source/existing = sources_assoc[S.source_turf] + if(existing) + qdel(existing) + sources += S + sources_assoc[S.source_turf] = S + +// Creates a temporary radiation source that will decay /repository/radiation/proc/radiate(source, power) //Sends out a radiation pulse, taking walls into account if(!(source && power)) //Sanity checking return + var/datum/radiation_source/S = new() + S.source_turf = get_turf(source) + S.update_rad_power(power) + add_source(S) + return S - var/range = min(round(sqrt(power / config.radiation_lower_limit)), 31) - var/turf/epicentre = get_turf(source) - to_process = list() - - range = min(epicentre.x, world.maxx - epicentre.x, epicentre.y, world.maxy - epicentre.y, range) - - to_process = trange(range, epicentre) - to_process[epicentre] = power - - for(var/turf/spot in to_process) - var/turf/origin = get_turf(epicentre) - var/working = power - while(origin != spot) - origin = get_step_towards(origin, spot) //Raytracing - if(!(origin in resistance_cache)) //Only get the resistance if we don't already know it. - origin.calc_rad_resistance() - working = max((working - (origin.rad_resistance * config.radiation_resistance_multiplier)), 0) - if(!working) - break - if(!to_process[origin]) - to_process[origin] = working - - else - to_process[origin] = max(to_process[origin], working) - - for(var/turf/spot in to_process) - irradiated_turfs[spot] = max(((to_process[spot]) * (1 / (get_dist(epicentre, spot) ** 2))), irradiated_turfs[spot]) //Butchered version of the inverse square law. Works for this purpose - #ifdef RADDBG - var/x = Clamp( irradiated_turfs[spot], 0, 255) - spot.color = rgb(5,x,5) - #endif - -/repository/radiation/proc/flat_radiate(source, power, range, var/respect_maint=0) //Sets the radiation in a range to a constant value. +// Sets the radiation in a range to a constant value. +/repository/radiation/proc/flat_radiate(source, power, range, var/respect_maint = FALSE) if(!(source && power && range)) return - var/turf/epicentre = get_turf(source) - range = min(epicentre.x, world.maxx - epicentre.x, epicentre.y, world.maxy - epicentre.y, range) - if(!respect_maint) - for(var/turf/T in trange(range, epicentre)) - irradiated_turfs[T] = max(power, irradiated_turfs[T]) - else - for(var/turf/T in trange(range, epicentre)) - var/area/A = T.loc - if(A.flags & RAD_SHIELDED) - continue - irradiated_turfs[T] = max(power, irradiated_turfs[T]) + var/datum/radiation_source/S = new() + S.flat = TRUE + S.range = range + S.respect_maint = respect_maint + S.source_turf = get_turf(source) + S.update_rad_power(power) + add_source(S) + return S -/repository/radiation/proc/z_radiate(var/atom/source, power, var/respect_maint=0) //Irradiates a full Z-level. Hacky way of doing it, but not too expensive. +// Irradiates a full Z-level. Hacky way of doing it, but not too expensive. +/repository/radiation/proc/z_radiate(var/atom/source, power, var/respect_maint = FALSE) if(!(power && source)) return var/turf/epicentre = locate(round(world.maxx / 2), round(world.maxy / 2), source.z) flat_radiate(epicentre, power, world.maxx, respect_maint) +/turf + var/cached_rad_resistance = 0 + /turf/proc/calc_rad_resistance() - rad_resistance = 0 + cached_rad_resistance = 0 for(var/obj/O in src.contents) if(O.rad_resistance) //Override - rad_resistance += O.rad_resistance + cached_rad_resistance += O.rad_resistance - else if(O.density) //So doors don't get counted + else if(O.density) //So open doors don't get counted var/material/M = O.get_material() if(!M) continue - rad_resistance += M.weight + cached_rad_resistance += M.weight + // Looks like storing the contents length is meant to be a basic check if the cache is stale due to items enter/exiting. Better than nothing so I'm leaving it as is. ~Leshana radiation_repository.resistance_cache[src] = (length(contents) + 1) /turf/simulated/wall/calc_rad_resistance() radiation_repository.resistance_cache[src] = (length(contents) + 1) - rad_resistance = (density ? material.weight : 0) + cached_rad_resistance = (density ? material.weight : 0) -/atom - var/rad_power = 0 - var/rad_resistance = 0 +/obj + var/rad_resistance = 0 // Allow overriding rad resistance -/atom/Destroy() - if(rad_power) - radiation_repository.sources.Remove(src) - . = ..() - -/atom/proc/update_radiation() //For VV'ing something to make it radioactive at runtime - if((rad_power) && (!(src in radiation_repository.sources))) - radiation_repository.sources.Add(src) - else if((!rad_power) && (src in radiation_repository.sources)) - radiation_repository.sources.Remove(src) - -/atom/proc/rad_act(var/severity) //If people expand the system, this may be useful. Here as a placeholder until then +// If people expand the system, this may be useful. Here as a placeholder until then +/atom/proc/rad_act(var/severity) return 1 /mob/living/rad_act(var/severity) if(severity) src.apply_effect(severity, IRRADIATE, src.getarmor(null, "rad")) - for(var/obj/I in src) + for(var/atom/I in src) I.rad_act(severity) - - -//#undef RADDBG \ No newline at end of file diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 82061ddb6a..fe9f99b032 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -53,9 +53,6 @@ pulledby = null /atom/movable/proc/initialize() - if(rad_power) - radiation_repository.sources.Add(src) - if(!isnull(gcDestroyed)) crash_with("GC: -- [type] had initialize() called after qdel() --") diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index c1ec9287b0..5d8d068d49 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -263,7 +263,7 @@ icon = 'icons/obj/doors/Dooruranium.dmi' mineral = "uranium" var/last_event = 0 - rad_power = 7.5 + var/rad_power = 7.5 /obj/machinery/door/airlock/process() // Deliberate no call to parent. @@ -278,6 +278,13 @@ ..() +/obj/machinery/door/airlock/uranium/process() + if(world.time > last_event+20) + if(prob(50)) + radiation_repository.radiate(src, rad_power) + last_event = world.time + ..() + /obj/machinery/door/airlock/phoron name = "Phoron Airlock" desc = "No way this can end badly." diff --git a/code/game/machinery/doors/blast_door.dm b/code/game/machinery/doors/blast_door.dm index f8e1d1cbb5..41680d3de7 100644 --- a/code/game/machinery/doors/blast_door.dm +++ b/code/game/machinery/doors/blast_door.dm @@ -53,8 +53,7 @@ icon_state = icon_state_closed else icon_state = icon_state_open - var/turf/T = get_turf(src) - T.calc_rad_resistance() + radiation_repository.resistance_cache.Remove(get_turf(src)) return // Proc: force_open() diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 898683192f..cf7f96d52d 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -362,8 +362,7 @@ icon_state = "door1" else icon_state = "door0" - var/turf/T = get_turf(src) - T.calc_rad_resistance() + radiation_repository.resistance_cache.Remove(get_turf(src)) return diff --git a/code/game/objects/items/devices/geiger.dm b/code/game/objects/items/devices/geiger.dm index acd85b730c..62cb9d9862 100644 --- a/code/game/objects/items/devices/geiger.dm +++ b/code/game/objects/items/devices/geiger.dm @@ -22,7 +22,7 @@ /obj/item/device/geiger/process() if(!scanning) return - radiation_count = radiation_repository.report_rads(get_turf(src)) + radiation_count = radiation_repository.get_rads_at_turf(get_turf(src)) update_icon() /obj/item/device/geiger/examine(mob/user) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 3d48a40374..cfd0693b15 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -69,7 +69,7 @@ REAGENT SCANNER user.show_message("Analyzing Results for [M]:") user.show_message("Overall Status: dead") else - user.show_message("Analyzing Results for [M]:\n\t Overall Status: [M.stat > 1 ? "dead" : "[round(M.health*100/M.getMaxHealth())]% healthy"]") + user.show_message("Analyzing Results for [M]:\n\t Overall Status: [M.stat > 1 ? "dead" : "[round((M.health/M.getMaxHealth())*100) ]% healthy"]") user.show_message(" Key: Suffocation/Toxin/Burns/Brute", 1) user.show_message(" Damage Specifics: [OX] - [TX] - [BU] - [BR]") user.show_message("Body Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)", 1) @@ -100,9 +100,7 @@ REAGENT SCANNER OX = fake_oxy > 50 ? "Severe oxygen deprivation detected" : "Subject bloodstream oxygen level normal" user.show_message("[OX] | [TX] | [BU] | [BR]") if(M.radiation) - user.show_message("Radiation Level: [M.radiation]") - else - user.show_message("No radiation detected.") + user.show_message("Radiation detected.") if(istype(M, /mob/living/carbon)) var/mob/living/carbon/C = M if(C.reagents.total_volume) diff --git a/code/game/turfs/simulated/wall_attacks.dm b/code/game/turfs/simulated/wall_attacks.dm index b236e4dc90..890574d664 100644 --- a/code/game/turfs/simulated/wall_attacks.dm +++ b/code/game/turfs/simulated/wall_attacks.dm @@ -7,7 +7,7 @@ if(can_open == WALL_OPENING) return - calc_rad_resistance() + radiation_repository.resistance_cache.Remove(src) if(density) can_open = WALL_OPENING diff --git a/code/game/turfs/simulated/wall_icon.dm b/code/game/turfs/simulated/wall_icon.dm index 757639e1bb..eab99bfba7 100644 --- a/code/game/turfs/simulated/wall_icon.dm +++ b/code/game/turfs/simulated/wall_icon.dm @@ -26,7 +26,7 @@ else if(material.opacity < 0.5 && opacity) set_light(0) - calc_rad_resistance() + radiation_repository.resistance_cache.Remove(src) update_connections(1) update_icon() diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 87b4b2b648..3f2e0064f2 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -140,12 +140,6 @@ var/const/enterloopsanity = 100 if(ismob(A)) var/mob/M = A - var/mob/living/L = A - if(istype(L)) - if(!(L in radiation_repository.irradiated_mobs)) - if(src in radiation_repository.irradiated_turfs) - radiation_repository.irradiated_mobs.Add(L) - L.handle_footstep(src) if(!M.lastarea) M.lastarea = get_area(M.loc) if(M.lastarea.has_gravity == 0) @@ -153,6 +147,9 @@ var/const/enterloopsanity = 100 else if(!is_space()) M.inertia_dir = 0 M.make_floating(0) + if(isliving(M)) + var/mob/living/L = M + L.handle_footstep(src) ..() var/objects = 0 if(A && (A.flags & PROXMOVE)) @@ -258,4 +255,4 @@ var/const/enterloopsanity = 100 step(AM, turn(AM.last_move, 180)) if(isliving(AM)) var/mob/living/M = AM - M.turf_collision(src, speed) \ No newline at end of file + M.turf_collision(src, speed) diff --git a/code/modules/events/event_container.dm b/code/modules/events/event_container.dm index 804d13404d..37a576a442 100644 --- a/code/modules/events/event_container.dm +++ b/code/modules/events/event_container.dm @@ -186,4 +186,4 @@ var/global/list/severity_to_string = list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT #undef ASSIGNMENT_JANITOR #undef ASSIGNMENT_MEDICAL #undef ASSIGNMENT_SCIENTIST -#undef ASSIGNMENT_SECURITY \ No newline at end of file +#undef ASSIGNMENT_SECURITY diff --git a/code/modules/events/solar_storm.dm b/code/modules/events/solar_storm.dm index 4ebfc71d55..afaa01ed95 100644 --- a/code/modules/events/solar_storm.dm +++ b/code/modules/events/solar_storm.dm @@ -27,14 +27,17 @@ radiate() /datum/event/solar_storm/proc/radiate() - var/radiation_level = rand(15, 30) - for(var/area/A in all_areas) - if(!(A.z in using_map.player_levels)) + // Note: Too complicated to be worth trying to use the radiation system for this. Its only in space anyway, so we make an exception in this case. + for(var/mob/living/L in living_mob_list) + var/turf/T = get_turf(L) + if(!T) continue - for(var/turf/T in A) - if(!istype(T.loc,/area/space) && !istype(T,/turf/space)) - continue - radiation_repository.irradiated_turfs[T] = radiation_level + + if(!istype(T.loc,/area/space) && !istype(T,/turf/space)) //Make sure you're in a space area or on a space turf + continue + + //Todo: Apply some burn damage from the heat of the sun. Until then, enjoy some moderate radiation. + L.rad_act(rand(15, 30)) /datum/event/solar_storm/end() command_announcement.Announce("The solar storm has passed the station. It is now safe to resume EVA activities. Please report to medbay if you experience any unusual symptoms. ", "Anomaly Alert") diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index 68363fb27f..a6a857c43b 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -559,4 +559,4 @@ var/list/mining_overlay_cache = list() if(mineral_name && (mineral_name in ore_data)) mineral = ore_data[mineral_name] UpdateMineral() - update_icon() \ No newline at end of file + update_icon() diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm index ba817d392a..47a9c08923 100644 --- a/code/modules/power/singularity/collector.dm +++ b/code/modules/power/singularity/collector.dm @@ -31,10 +31,10 @@ var/global/list/rad_collectors = list() last_power_new = 0 - var/turf/T = get_turf(src) - if(T in radiation_repository.irradiated_turfs) - receive_pulse((radiation_repository.irradiated_turfs[T] * 5)) //Maths is hard - + if(P && active) + var/rads = radiation_repository.get_rads_at_turf(get_turf(src)) + if(rads) + receive_pulse(rads * 5) //Maths is hard if(P) if(P.air_contents.gas["phoron"] == 0) diff --git a/code/modules/supermatter/supermatter.dm b/code/modules/supermatter/supermatter.dm index 9db6eca0ad..046c315ec9 100644 --- a/code/modules/supermatter/supermatter.dm +++ b/code/modules/supermatter/supermatter.dm @@ -42,7 +42,6 @@ anchored = 0 light_range = 4 - rad_power = 1 //So it gets added to the repository var/gasefficency = 0.25 var/base_icon_state = "darkmatter" @@ -112,7 +111,7 @@ var/mob/living/carbon/human/H = mob H.hallucination += max(50, min(300, DETONATION_HALLUCINATION * sqrt(1 / (get_dist(mob, src) + 1)) ) ) spawn(pull_time) - explosion(TS, explosion_power, explosion_power * 2, explosion_power * 3, explosion_power * 4, 1) + explosion(get_turf(src), explosion_power, explosion_power * 2, explosion_power * 3, explosion_power * 4, 1) qdel(src) return @@ -273,7 +272,7 @@ var/rads = (power / 10) * ( 1 / (radius**2) ) l.apply_effect(rads, IRRADIATE) */ - rad_power = power * 1.5//Better close those shutters! + radiation_repository.radiate(src, power * 1.5) //Better close those shutters! power -= (power/DECAY_FACTOR)**3 //energy losses due to radiation @@ -403,7 +402,6 @@ return - /obj/machinery/power/supermatter/GotoAirflowDest(n) //Supermatter not pushed around by airflow return From 8579adcc53d28aaa063aed1b3c75c243f66e4784 Mon Sep 17 00:00:00 2001 From: Spades Date: Fri, 26 May 2017 19:32:23 -0400 Subject: [PATCH 14/82] Naming convention of ammo is now consistent s = Speedloaders. (Functionally the same as clips, but they're not _really_ the same thing, just in case we change these later.) c = Clips. (Can also be used to fill other magazines.) m = Magazine. (Holds ammo rounds.) a = Ammo. (Individual rounds of ammo.) --- code/datums/autolathe/arms.dm | 50 ++++++------ code/datums/supplypacks/munitions.dm | 4 +- code/datums/uplink/ammunition.dm | 32 ++++---- code/game/machinery/autolathe.dm | 4 +- .../items/weapons/storage/uplink_kits.dm | 2 +- code/game/objects/random/random.dm | 6 +- .../crates_lockers/closets/secure/security.dm | 6 +- .../crates_lockers/closets/syndicate.dm | 10 +-- code/modules/admin/verbs/debug.dm | 4 +- code/modules/flufftext/Hallucination.dm | 2 +- code/modules/projectiles/ammunition/boxes.dm | 80 +++++++++---------- .../projectiles/guns/projectile/automatic.dm | 30 +++---- .../projectiles/guns/projectile/pistol.dm | 22 ++--- .../projectiles/guns/projectile/sniper.dm | 4 +- code/modules/random_map/drop/drop_types.dm | 10 +-- 15 files changed, 133 insertions(+), 133 deletions(-) diff --git a/code/datums/autolathe/arms.dm b/code/datums/autolathe/arms.dm index efe5791b11..276819d3ad 100644 --- a/code/datums/autolathe/arms.dm +++ b/code/datums/autolathe/arms.dm @@ -49,34 +49,34 @@ /////// .45 /datum/category_item/autolathe/arms/pistol_45 name = "pistol magazine (.45)" - path =/obj/item/ammo_magazine/c45m + path =/obj/item/ammo_magazine/m45 hidden = 1 /datum/category_item/autolathe/arms/pistol_45p name = "pistol magazine (.45 practice)" - path =/obj/item/ammo_magazine/c45m/practice + path =/obj/item/ammo_magazine/m45/practice /datum/category_item/autolathe/arms/pistol_45r name = "pistol magazine (.45 rubber)" - path =/obj/item/ammo_magazine/c45m/rubber + path =/obj/item/ammo_magazine/m45/rubber /datum/category_item/autolathe/arms/pistol_45f name = "pistol magazine (.45 flash)" - path =/obj/item/ammo_magazine/c45m/flash + path =/obj/item/ammo_magazine/m45/flash /datum/category_item/autolathe/arms/pistol_45uzi name = "uzi magazine (.45)" - path =/obj/item/ammo_magazine/c45uzi + path =/obj/item/ammo_magazine/m45uzi hidden = 1 /datum/category_item/autolathe/arms/tommymag name = "Tommygun magazine (.45)" - path =/obj/item/ammo_magazine/tommymag + path =/obj/item/ammo_magazine/m45tommy hidden = 1 /datum/category_item/autolathe/arms/tommydrum name = "Tommygun drum magazine (.45)" - path =/obj/item/ammo_magazine/tommydrum + path =/obj/item/ammo_magazine/m45tommydrum hidden = 1 /////// 9mm @@ -129,34 +129,34 @@ /////// 10mm /datum/category_item/autolathe/arms/smg_10mm name = "SMG magazine (10mm)" - path =/obj/item/ammo_magazine/a10mm + path =/obj/item/ammo_magazine/m10mm hidden = 1 /datum/category_item/autolathe/arms/pistol_50 name = "pistol magazine (.50AE)" - path =/obj/item/ammo_magazine/a50 + path =/obj/item/ammo_magazine/m50 hidden = 1 /////// 5.56mm /datum/category_item/autolathe/arms/rifle_556 name = "rifle magazine (5.56mm)" - path =/obj/item/ammo_magazine/c556 + path =/obj/item/ammo_magazine/m556 hidden = 1 /datum/category_item/autolathe/arms/rifle_556p name = "rifle magazine (5.56mm practice)" - path =/obj/item/ammo_magazine/c556/practice + path =/obj/item/ammo_magazine/m556/practice /datum/category_item/autolathe/arms/machinegun_556 name = "machinegun box magazine (5.56)" - path =/obj/item/ammo_magazine/a556 + path =/obj/item/ammo_magazine/m556saw hidden = 1 /////// 7.62 /datum/category_item/autolathe/arms/rifle_762 name = "rifle magazine (7.62mm)" - path =/obj/item/ammo_magazine/c762 + path =/obj/item/ammo_magazine/m762 hidden = 1 /datum/category_item/autolathe/arms/shotgun_magazine @@ -188,24 +188,24 @@ /datum/category_item/autolathe/arms/pistol_45 name = "pistol magazine (.45)" - path =/obj/item/ammo_magazine/c45m/empty + path =/obj/item/ammo_magazine/m45/empty category = "Arms and Ammunition" /datum/category_item/autolathe/arms/pistol_45uzi name = "uzi magazine (.45)" - path =/obj/item/ammo_magazine/c45uzi/empty + path =/obj/item/ammo_magazine/m45uzi/empty category = "Arms and Ammunition" hidden = 1 /datum/category_item/autolathe/arms/tommymag name = "Tommygun magazine (.45)" - path =/obj/item/ammo_magazine/tommymag/empty + path =/obj/item/ammo_magazine/m45tommy/empty category = "Arms and Ammunition" hidden = 1 /datum/category_item/autolathe/arms/tommydrum name = "Tommygun drum magazine (.45)" - path =/obj/item/ammo_magazine/tommydrum/empty + path =/obj/item/ammo_magazine/m45tommydrum/empty category = "Arms and Ammunition" hidden = 1 @@ -221,24 +221,24 @@ /datum/category_item/autolathe/arms/smg_10mm name = "SMG magazine (10mm)" - path =/obj/item/ammo_magazine/a10mm/empty + path =/obj/item/ammo_magazine/m10mm/empty category = "Arms and Ammunition" hidden = 1 /datum/category_item/autolathe/arms/pistol_50 name = "pistol magazine (.50AE)" - path =/obj/item/ammo_magazine/a50/empty + path =/obj/item/ammo_magazine/m50/empty category = "Arms and Ammunition" hidden = 1 /datum/category_item/autolathe/arms/rifle_556 name = "10rnd rifle magazine (5.56mm)" - path =/obj/item/ammo_magazine/a556/empty + path =/obj/item/ammo_magazine/m556saw/empty category = "Arms and Ammunition" /datum/category_item/autolathe/arms/rifle_556m name = "20rnd rifle magazine (5.56mm)" - path =/obj/item/ammo_magazine/a556m/empty + path =/obj/item/ammo_magazine/m556sawm/empty category = "Arms and Ammunition" hidden = 1 @@ -250,7 +250,7 @@ /datum/category_item/autolathe/arms/rifle_762 name = "20rnd rifle magazine (7.62mm)" - path =/obj/item/ammo_magazine/c762/empty + path =/obj/item/ammo_magazine/m762/empty category = "Arms and Ammunition" hidden = 1 @@ -272,17 +272,17 @@ /datum/category_item/autolathe/arms/speedloader_357 name = "speedloader (.357)" - path =/obj/item/ammo_magazine/a357 + path =/obj/item/ammo_magazine/s357 hidden = 1 /datum/category_item/autolathe/arms/speedloader_38 name = "speedloader (.38)" - path =/obj/item/ammo_magazine/c38 + path =/obj/item/ammo_magazine/s38 hidden = 1 /datum/category_item/autolathe/arms/speedloader_38r name = "speedloader (.38 rubber)" - path =/obj/item/ammo_magazine/c38/rubber + path =/obj/item/ammo_magazine/s38/rubber // Commented out until metal exploits with autolathe is fixed. /*/datum/category_item/autolathe/arms/pistol_clip_45 diff --git a/code/datums/supplypacks/munitions.dm b/code/datums/supplypacks/munitions.dm index e2df9609ad..c9817e2274 100644 --- a/code/datums/supplypacks/munitions.dm +++ b/code/datums/supplypacks/munitions.dm @@ -27,7 +27,7 @@ name = "Flare guns crate" contains = list( /obj/item/weapon/gun/projectile/sec/flash, - /obj/item/ammo_magazine/c45m/flash, + /obj/item/ammo_magazine/m45/flash, /obj/item/weapon/gun/projectile/shotgun/doublebarrel/flare, /obj/item/weapon/storage/box/flashshells ) @@ -156,7 +156,7 @@ contains = list( /obj/item/ammo_magazine/mc9mmt, /obj/item/ammo_magazine/mc9mmt/rubber, - /obj/item/ammo_magazine/a556 + /obj/item/ammo_magazine/m556saw ) cost = 25 containertype = /obj/structure/closet/crate/secure diff --git a/code/datums/uplink/ammunition.dm b/code/datums/uplink/ammunition.dm index 4aefe349fd..4238884598 100644 --- a/code/datums/uplink/ammunition.dm +++ b/code/datums/uplink/ammunition.dm @@ -8,7 +8,7 @@ /datum/uplink_item/item/ammo/a357 name = ".357 Speedloader" - path = /obj/item/ammo_magazine/a357 + path = /obj/item/ammo_magazine/s357 /datum/uplink_item/item/ammo/mc9mm name = "Pistol Magazine (9mm)" @@ -16,28 +16,28 @@ /datum/uplink_item/item/ammo/c45m name = "Pistol Magazine (.45)" - path = /obj/item/ammo_magazine/c45m + path = /obj/item/ammo_magazine/m45 /datum/uplink_item/item/ammo/c45map name = "Pistol Magazine (.45 AP)" - path = /obj/item/ammo_magazine/c45m/ap + path = /obj/item/ammo_magazine/m45/ap /datum/uplink_item/item/ammo/tommymag name = "Tommygun Magazine (.45)" - path = /obj/item/ammo_magazine/tommymag + path = /obj/item/ammo_magazine/m45tommy /datum/uplink_item/item/ammo/tommymagap name = "Tommygun Magazine (.45 AP)" - path = /obj/item/ammo_magazine/tommymag/ap + path = /obj/item/ammo_magazine/m45tommy/ap /datum/uplink_item/item/ammo/tommydrum name = "Tommygun Drum Magazine (.45)" - path = /obj/item/ammo_magazine/tommydrum + path = /obj/item/ammo_magazine/m45tommydrum item_cost = 40 /datum/uplink_item/item/ammo/tommydrumap name = "Tommygun Drum Magazine (.45 AP)" - path = /obj/item/ammo_magazine/tommydrum/ap + path = /obj/item/ammo_magazine/m45tommydrum/ap /datum/uplink_item/item/ammo/darts name = "Darts" @@ -50,39 +50,39 @@ /datum/uplink_item/item/ammo/c556 name = "Rifle Magazine (5.56mm)" - path = /obj/item/ammo_magazine/c556 + path = /obj/item/ammo_magazine/m556 /datum/uplink_item/item/ammo/c556/ext name = "Rifle Magazine (5.56mm Extended)" - path = /obj/item/ammo_magazine/c556/ext + path = /obj/item/ammo_magazine/m556/ext /datum/uplink_item/item/ammo/c556/ap name = "Rifle Magazine (5.56mm AP)" - path = /obj/item/ammo_magazine/c556/ap + path = /obj/item/ammo_magazine/m556/ap /datum/uplink_item/item/ammo/c556/ap/ext name = "Rifle Magazine (5.56mm AP Extended)" - path = /obj/item/ammo_magazine/c556/ap/ext + path = /obj/item/ammo_magazine/m556/ap/ext /datum/uplink_item/item/ammo/c762 name = "Rifle Magazine (7.62mm)" - path = /obj/item/ammo_magazine/c762 + path = /obj/item/ammo_magazine/m762 /datum/uplink_item/item/ammo/c762/ap name = "Rifle Magazine (7.62mm AP)" - path = /obj/item/ammo_magazine/c762/ap + path = /obj/item/ammo_magazine/m762/ap /datum/uplink_item/item/ammo/a10mm name = "SMG Magazine (10mm)" - path = /obj/item/ammo_magazine/a10mm + path = /obj/item/ammo_magazine/m10mm /datum/uplink_item/item/ammo/a556 name = "Machinegun Magazine (5.56mm)" - path = /obj/item/ammo_magazine/a556 + path = /obj/item/ammo_magazine/m556saw /datum/uplink_item/item/ammo/a556/ap name = "Machinegun Magazine (5.56mm AP)" - path = /obj/item/ammo_magazine/a556/ap + path = /obj/item/ammo_magazine/m556saw/ap /datum/uplink_item/item/ammo/g12 name = "12g Shotgun Ammo Box (Slug)" diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 2953f0de87..50d6988e35 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -144,7 +144,7 @@ if(is_robot_module(O)) return 0 - if(istype(O,/obj/item/ammo_magazine/clip) || istype(O,/obj/item/ammo_magazine/a357) || istype(O,/obj/item/ammo_magazine/c38)) // Prevents ammo recycling exploit with speedloaders. + if(istype(O,/obj/item/ammo_magazine/clip) || istype(O,/obj/item/ammo_magazine/s357) || istype(O,/obj/item/ammo_magazine/s38)) // Prevents ammo recycling exploit with speedloaders. user << "\The [O] is too hazardous to recycle with the autolathe!" return /* ToDo: Make this actually check for ammo and change the value of the magazine if it's empty. -Spades @@ -262,7 +262,7 @@ stored_material[material] = max(0, stored_material[material] - round(making.resources[material] * mat_efficiency) * multiplier) update_icon() // So lid closes - + sleep(build_time) busy = 0 diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm index 573325e079..d5ac595c1e 100644 --- a/code/game/objects/items/weapons/storage/uplink_kits.dm +++ b/code/game/objects/items/weapons/storage/uplink_kits.dm @@ -27,7 +27,7 @@ if("guns") new /obj/item/weapon/gun/projectile/revolver(src) - new /obj/item/ammo_magazine/a357(src) + new /obj/item/ammo_magazine/s357(src) new /obj/item/weapon/card/emag(src) new /obj/item/weapon/plastique(src) new /obj/item/weapon/plastique(src) diff --git a/code/game/objects/random/random.dm b/code/game/objects/random/random.dm index 75c0d5830f..183065d3ba 100644 --- a/code/game/objects/random/random.dm +++ b/code/game/objects/random/random.dm @@ -285,9 +285,9 @@ prob(2);/obj/item/weapon/storage/box/shotgunammo, prob(4);/obj/item/weapon/storage/box/shotgunshells, prob(1);/obj/item/weapon/storage/box/stunshells, - prob(2);/obj/item/ammo_magazine/c45m, - prob(4);/obj/item/ammo_magazine/c45m/rubber, - prob(4);/obj/item/ammo_magazine/c45m/flash, + prob(2);/obj/item/ammo_magazine/m45, + prob(4);/obj/item/ammo_magazine/m45/rubber, + prob(4);/obj/item/ammo_magazine/m45/flash, prob(2);/obj/item/ammo_magazine/mc9mmt, prob(6);/obj/item/ammo_magazine/mc9mmt/rubber) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index dc80d17827..a80ceb3580 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -217,7 +217,7 @@ new /obj/item/clothing/accessory/storage/black_vest(src) new /obj/item/clothing/head/soft/sec/corp(src) new /obj/item/clothing/under/rank/security/corp(src) - new /obj/item/ammo_magazine/c45m/rubber(src) + new /obj/item/ammo_magazine/m45/rubber(src) new /obj/item/weapon/gun/energy/taser(src) new /obj/item/weapon/cell/device/weapon(src) new /obj/item/clothing/suit/storage/hooded/wintercoat/security(src) @@ -277,8 +277,8 @@ new /obj/item/device/radio/headset/headset_sec(src) new /obj/item/device/radio/headset/headset_sec/alt(src) new /obj/item/clothing/suit/storage/vest/detective(src) - new /obj/item/ammo_magazine/c45m/rubber(src) - new /obj/item/ammo_magazine/c45m/rubber(src) + new /obj/item/ammo_magazine/m45/rubber(src) + new /obj/item/ammo_magazine/m45/rubber(src) new /obj/item/taperoll/police(src) new /obj/item/weapon/gun/projectile/colt/detective(src) new /obj/item/clothing/accessory/holster/armpit(src) diff --git a/code/game/objects/structures/crates_lockers/closets/syndicate.dm b/code/game/objects/structures/crates_lockers/closets/syndicate.dm index 98f6138f68..906e46dbe1 100644 --- a/code/game/objects/structures/crates_lockers/closets/syndicate.dm +++ b/code/game/objects/structures/crates_lockers/closets/syndicate.dm @@ -42,11 +42,11 @@ /obj/structure/closet/syndicate/nuclear/New() ..() - new /obj/item/ammo_magazine/a10mm(src) - new /obj/item/ammo_magazine/a10mm(src) - new /obj/item/ammo_magazine/a10mm(src) - new /obj/item/ammo_magazine/a10mm(src) - new /obj/item/ammo_magazine/a10mm(src) + new /obj/item/ammo_magazine/m10mm(src) + new /obj/item/ammo_magazine/m10mm(src) + new /obj/item/ammo_magazine/m10mm(src) + new /obj/item/ammo_magazine/m10mm(src) + new /obj/item/ammo_magazine/m10mm(src) new /obj/item/weapon/storage/box/handcuffs(src) new /obj/item/weapon/storage/box/flashbangs(src) new /obj/item/weapon/gun/energy/gun(src) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 82206fdc30..bd6d1ea4d0 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -480,7 +480,7 @@ M.equip_to_slot_or_del(new /obj/item/clothing/head/det(M), slot_head) M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/revolver(M), slot_r_hand) - M.equip_to_slot_or_del(new /obj/item/ammo_magazine/a357(M), slot_l_store) + M.equip_to_slot_or_del(new /obj/item/ammo_magazine/s357(M), slot_l_store) if ("tournament chef") //Steven Seagal FTW M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chef(M), slot_w_uniform) @@ -592,7 +592,7 @@ sec_briefcase.contents += new /obj/item/weapon/spacecash/c1000 sec_briefcase.contents += new /obj/item/weapon/gun/energy/crossbow sec_briefcase.contents += new /obj/item/weapon/gun/projectile/revolver/mateba - sec_briefcase.contents += new /obj/item/ammo_magazine/a357 + sec_briefcase.contents += new /obj/item/ammo_magazine/s357 sec_briefcase.contents += new /obj/item/weapon/plastique M.equip_to_slot_or_del(sec_briefcase, slot_l_hand) diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index a8987538ab..c887ff5b9b 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -332,7 +332,7 @@ proc/check_panel(mob/M) qdel(O) return -var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/item/ammo_magazine/a357,\ +var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/item/ammo_magazine/s357,\ /obj/item/weapon/gun/energy/crossbow, /obj/item/weapon/melee/energy/sword,\ /obj/item/weapon/storage/box/syndicate, /obj/item/weapon/storage/box/emps,\ /obj/item/weapon/cartridge/syndicate, /obj/item/clothing/under/chameleon,\ diff --git a/code/modules/projectiles/ammunition/boxes.dm b/code/modules/projectiles/ammunition/boxes.dm index 8a259b6342..3ee2393bbf 100644 --- a/code/modules/projectiles/ammunition/boxes.dm +++ b/code/modules/projectiles/ammunition/boxes.dm @@ -1,6 +1,6 @@ ///////// .357 ///////// -/obj/item/ammo_magazine/a357 +/obj/item/ammo_magazine/s357 name = "speedloader (.357)" desc = "A speedloader for .357 revolvers." icon_state = "38" @@ -12,7 +12,7 @@ ///////// .38 ///////// -/obj/item/ammo_magazine/c38 +/obj/item/ammo_magazine/s38 name = "speedloader (.38)" desc = "A speedloader for .38 revolvers." icon_state = "38" @@ -22,17 +22,17 @@ max_ammo = 6 multiple_sprites = 1 -/obj/item/ammo_magazine/c38/rubber +/obj/item/ammo_magazine/s38/rubber name = "speedloader (.38 rubber)" ammo_type = /obj/item/ammo_casing/c38r -/obj/item/ammo_magazine/c38/emp +/obj/item/ammo_magazine/s38/emp name = "ammunition box (.38 haywire)" ammo_type = /obj/item/ammo_casing/c38/emp ///////// .45 ///////// -/obj/item/ammo_magazine/c45m +/obj/item/ammo_magazine/m45 name = "pistol magazine (.45)" icon_state = "45" mag_type = MAGAZINE @@ -42,30 +42,30 @@ max_ammo = 7 multiple_sprites = 1 -/obj/item/ammo_magazine/c45m/empty +/obj/item/ammo_magazine/m45/empty initial_ammo = 0 -/obj/item/ammo_magazine/c45m/rubber +/obj/item/ammo_magazine/m45/rubber name = "magazine (.45 rubber)" ammo_type = /obj/item/ammo_casing/c45r -/obj/item/ammo_magazine/c45m/practice +/obj/item/ammo_magazine/m45/practice name = "magazine (.45 practice)" ammo_type = /obj/item/ammo_casing/c45p -/obj/item/ammo_magazine/c45m/flash +/obj/item/ammo_magazine/m45/flash name = "magazine (.45 flash)" ammo_type = /obj/item/ammo_casing/c45f -/obj/item/ammo_magazine/c45m/ap +/obj/item/ammo_magazine/m45/ap name = "magazine (.45 AP)" ammo_type = /obj/item/ammo_casing/c45ap -/obj/item/ammo_magazine/box/emp/c45 +/obj/item/ammo_magazine/box/emp/b45 name = "ammunition box (.45 haywire)" ammo_type = /obj/item/ammo_casing/c45/emp -/obj/item/ammo_magazine/c45uzi +/obj/item/ammo_magazine/m45uzi name = "stick magazine (.45)" icon_state = "uzi45" mag_type = MAGAZINE @@ -75,10 +75,10 @@ max_ammo = 16 multiple_sprites = 1 -/obj/item/ammo_magazine/c45uzi/empty +/obj/item/ammo_magazine/m45uzi/empty initial_ammo = 0 -/obj/item/ammo_magazine/tommymag +/obj/item/ammo_magazine/m45tommy name = "tommygun magazine (.45)" icon_state = "tommy-mag" mag_type = MAGAZINE @@ -87,14 +87,14 @@ caliber = ".45" max_ammo = 20 -/obj/item/ammo_magazine/tommymag/ap +/obj/item/ammo_magazine/m45tommy/ap name = "tommygun magazine (.45 AP)" ammo_type = /obj/item/ammo_casing/c45ap -/obj/item/ammo_magazine/tommymag/empty +/obj/item/ammo_magazine/m45tommy/empty initial_ammo = 0 -/obj/item/ammo_magazine/tommydrum +/obj/item/ammo_magazine/m45tommydrum name = "tommygun drum magazine (.45)" icon_state = "tommy-drum" w_class = ITEMSIZE_NORMAL // Bulky ammo doesn't fit in your pockets! @@ -104,11 +104,11 @@ caliber = ".45" max_ammo = 50 -/obj/item/ammo_magazine/tommydrum/ap +/obj/item/ammo_magazine/m45tommydrum/ap name = "tommygun drum magazine (.45 AP)" ammo_type = /obj/item/ammo_casing/c45ap -/obj/item/ammo_magazine/tommydrum/empty +/obj/item/ammo_magazine/m45tommydrum/empty initial_ammo = 0 /obj/item/ammo_magazine/clip/c45 @@ -256,7 +256,7 @@ */ ///////// 10mm ///////// -/obj/item/ammo_magazine/a10mm +/obj/item/ammo_magazine/m10mm name = "magazine (10mm)" icon_state = "10mm" origin_tech = list(TECH_COMBAT = 2) @@ -267,7 +267,7 @@ max_ammo = 20 multiple_sprites = 1 -/obj/item/ammo_magazine/a10mm/empty +/obj/item/ammo_magazine/m10mm/empty initial_ammo = 0 /obj/item/ammo_magazine/clip/a10mm @@ -280,13 +280,13 @@ max_ammo = 9 multiple_sprites = 1 -/obj/item/ammo_magazine/box/emp/a10mm +/obj/item/ammo_magazine/box/emp/b10 name = "ammunition box (10mm haywire)" ammo_type = /obj/item/ammo_casing/a10mm/emp ///////// 5.56mm ///////// -/obj/item/ammo_magazine/c556 +/obj/item/ammo_magazine/m556 name = "magazine (5.56mm)" icon_state = "c5.56" origin_tech = list(TECH_COMBAT = 2) @@ -297,30 +297,30 @@ max_ammo = 20 multiple_sprites = 1 -/obj/item/ammo_magazine/c556/ext +/obj/item/ammo_magazine/m556/ext name = "extended magazine (5.56mm)" matter = list(DEFAULT_WALL_MATERIAL = 2700) max_ammo = 30 -/obj/item/ammo_magazine/c556/empty +/obj/item/ammo_magazine/m556/empty initial_ammo = 0 -/obj/item/ammo_magazine/c556/ext/empty +/obj/item/ammo_magazine/m556/ext/empty initial_ammo = 0 -/obj/item/ammo_magazine/c556/practice +/obj/item/ammo_magazine/m556/practice name = "magazine (5.56mm practice)" ammo_type = /obj/item/ammo_casing/a556p -/obj/item/ammo_magazine/c556/practice/ext +/obj/item/ammo_magazine/m556/practice/ext name = "extended magazine (5.56mm practice)" max_ammo = 30 -/obj/item/ammo_magazine/c556/ap +/obj/item/ammo_magazine/m556/ap name = "magazine (5.56mm armor-piercing)" ammo_type = /obj/item/ammo_casing/a556/ap -/obj/item/ammo_magazine/c556/ap/ext +/obj/item/ammo_magazine/m556/ap/ext name = "extended magazine (5.56mm armor-piercing)" max_ammo = 30 @@ -341,7 +341,7 @@ name = "rifle clip (5.56mm practice)" ammo_type = /obj/item/ammo_casing/a556 -/obj/item/ammo_magazine/a556 +/obj/item/ammo_magazine/m556saw name = "magazine box (5.56mm)" icon_state = "a556" origin_tech = list(TECH_COMBAT = 2) @@ -353,16 +353,16 @@ max_ammo = 50 multiple_sprites = 1 -/obj/item/ammo_magazine/a556/ap +/obj/item/ammo_magazine/m556saw/ap name = "magazine box (5.56mm armor-piercing)" ammo_type = /obj/item/ammo_casing/a556/ap -/obj/item/ammo_magazine/a556/empty +/obj/item/ammo_magazine/m556saw/empty initial_ammo = 0 ///////// .50 AE ///////// -/obj/item/ammo_magazine/a50 +/obj/item/ammo_magazine/m50 name = "magazine (.50 AE)" icon_state = "50ae" origin_tech = list(TECH_COMBAT = 2) @@ -373,7 +373,7 @@ max_ammo = 7 multiple_sprites = 1 -/obj/item/ammo_magazine/a50/empty +/obj/item/ammo_magazine/m50/empty initial_ammo = 0 /obj/item/ammo_magazine/clip/a50 @@ -388,7 +388,7 @@ ///////// 7.62mm ///////// -/obj/item/ammo_magazine/c762 +/obj/item/ammo_magazine/m762 name = "magazine (7.62mm)" icon_state = "c7.62" mag_type = MAGAZINE @@ -398,11 +398,11 @@ max_ammo = 10 multiple_sprites = 1 -/obj/item/ammo_magazine/c762/ap +/obj/item/ammo_magazine/m762/ap name = "magazine (7.62mm armor-piercing)" ammo_type = /obj/item/ammo_casing/a762/ap -/obj/item/ammo_magazine/c762/empty +/obj/item/ammo_magazine/m762/empty initial_ammo = 0 /obj/item/ammo_magazine/s762 // 's' for small! @@ -468,7 +468,7 @@ ///////// .75 Gyrojet ///////// -/obj/item/ammo_magazine/a75 +/obj/item/ammo_magazine/m75 name = "ammo magazine (.75 Gyrojet)" icon_state = "75" mag_type = MAGAZINE @@ -477,7 +477,7 @@ multiple_sprites = 1 max_ammo = 4 -/obj/item/ammo_magazine/a75/empty +/obj/item/ammo_magazine/m75/empty initial_ammo = 0 ///////// Misc. ///////// diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm index bf30c19991..7699b8483c 100644 --- a/code/modules/projectiles/guns/projectile/automatic.dm +++ b/code/modules/projectiles/guns/projectile/automatic.dm @@ -33,8 +33,8 @@ slot_flags = SLOT_BELT|SLOT_BACK fire_sound = 'sound/weapons/Gunshot_light.ogg' load_method = MAGAZINE - magazine_type = /obj/item/ammo_magazine/a10mm - allowed_magazines = list(/obj/item/ammo_magazine/a10mm) + magazine_type = /obj/item/ammo_magazine/m10mm + allowed_magazines = list(/obj/item/ammo_magazine/m10mm) auto_eject = 1 auto_eject_sound = 'sound/weapons/smg_empty_alarm.ogg' @@ -60,8 +60,8 @@ origin_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 1, TECH_ILLEGAL = 4) slot_flags = SLOT_BACK load_method = MAGAZINE - magazine_type = /obj/item/ammo_magazine/c556 - allowed_magazines = list(/obj/item/ammo_magazine/c556) + magazine_type = /obj/item/ammo_magazine/m556 + allowed_magazines = list(/obj/item/ammo_magazine/m556) one_handed_penalty = 4 @@ -115,8 +115,8 @@ fire_sound = 'sound/weapons/Gunshot.ogg' slot_flags = SLOT_BACK load_method = MAGAZINE - magazine_type = /obj/item/ammo_magazine/c762 - allowed_magazines = list(/obj/item/ammo_magazine/c762) + magazine_type = /obj/item/ammo_magazine/m762 + allowed_magazines = list(/obj/item/ammo_magazine/m762) auto_eject = 1 auto_eject_sound = 'sound/weapons/smg_empty_alarm.ogg' @@ -187,8 +187,8 @@ ammo_type = "/obj/item/ammo_casing/a556" // Is this really needed anymore? fire_sound = 'sound/weapons/machinegun.ogg' load_method = MAGAZINE - magazine_type = /obj/item/ammo_magazine/a556 - allowed_magazines = list(/obj/item/ammo_magazine/a556, /obj/item/ammo_magazine/c556) + magazine_type = /obj/item/ammo_magazine/m556saw + allowed_magazines = list(/obj/item/ammo_magazine/m556saw, /obj/item/ammo_magazine/m556) one_handed_penalty = 6 @@ -225,7 +225,7 @@ return ..() //once open, behave like normal /obj/item/weapon/gun/projectile/automatic/l6_saw/update_icon() - if(istype(ammo_magazine,/obj/item/ammo_magazine/c762)) + if(istype(ammo_magazine,/obj/item/ammo_magazine/m762)) icon_state = "l6[cover_open ? "open" : "closed"]mag" item_state = icon_state else @@ -284,8 +284,8 @@ load_method = MAGAZINE caliber = ".45" origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 2, TECH_ILLEGAL = 5) - magazine_type = /obj/item/ammo_magazine/c45uzi - allowed_magazines = list(/obj/item/ammo_magazine/c45uzi) + magazine_type = /obj/item/ammo_magazine/m45uzi + allowed_magazines = list(/obj/item/ammo_magazine/m45uzi) firemodes = list( list(mode_name="semiauto", burst=1, fire_delay=0), @@ -330,8 +330,8 @@ origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 2, TECH_ILLEGAL = 5) slot_flags = SLOT_BELT // ToDo: Belt sprite. load_method = MAGAZINE - magazine_type = /obj/item/ammo_magazine/tommymag - allowed_magazines = list(/obj/item/ammo_magazine/tommymag, /obj/item/ammo_magazine/tommydrum) + magazine_type = /obj/item/ammo_magazine/m45tommy + allowed_magazines = list(/obj/item/ammo_magazine/m45tommy, /obj/item/ammo_magazine/m45tommydrum) firemodes = list( list(mode_name="semiauto", burst=1, fire_delay=0), @@ -354,8 +354,8 @@ origin_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 1, TECH_ILLEGAL = 4) slot_flags = SLOT_BACK load_method = MAGAZINE - magazine_type = /obj/item/ammo_magazine/c762 - allowed_magazines = list(/obj/item/ammo_magazine/c762) + magazine_type = /obj/item/ammo_magazine/m762 + allowed_magazines = list(/obj/item/ammo_magazine/m762) one_handed_penalty = 4 diff --git a/code/modules/projectiles/guns/projectile/pistol.dm b/code/modules/projectiles/guns/projectile/pistol.dm index fd46803c68..d4f9d265f0 100644 --- a/code/modules/projectiles/guns/projectile/pistol.dm +++ b/code/modules/projectiles/guns/projectile/pistol.dm @@ -2,8 +2,8 @@ var/unique_reskin name = ".45 pistol" desc = "A cheap Martian knock-off of a Colt M1911. Uses .45 rounds." - magazine_type = /obj/item/ammo_magazine/c45m - allowed_magazines = list(/obj/item/ammo_magazine/c45m) + magazine_type = /obj/item/ammo_magazine/m45 + allowed_magazines = list(/obj/item/ammo_magazine/m45) icon_state = "colt" caliber = ".45" origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2) @@ -12,7 +12,7 @@ /obj/item/weapon/gun/projectile/colt/detective desc = "A Martian recreation of an old Terran pistol. Uses .45 rounds." - magazine_type = /obj/item/ammo_magazine/c45m/rubber + magazine_type = /obj/item/ammo_magazine/m45/rubber /obj/item/weapon/gun/projectile/colt/detective/update_icon() if(ammo_magazine) @@ -71,7 +71,7 @@ name = ".45 pistol" desc = "The NT Mk58 is a cheap, ubiquitous sidearm, produced by a NanoTrasen subsidiary. Found pretty much everywhere humans are. Uses .45 rounds." icon_state = "secguncomp" - magazine_type = /obj/item/ammo_magazine/c45m/rubber + magazine_type = /obj/item/ammo_magazine/m45/rubber caliber = ".45" origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2) fire_sound = 'sound/weapons/semiauto.ogg' @@ -86,7 +86,7 @@ /obj/item/weapon/gun/projectile/sec/flash name = ".45 signal pistol" - magazine_type = /obj/item/ammo_magazine/c45m/flash + magazine_type = /obj/item/ammo_magazine/m45/flash /obj/item/weapon/gun/projectile/sec/wood desc = "The NT Mk58 is a cheap, ubiquitous sidearm, produced by a NanoTrasen subsidiary. This one has a sweet wooden grip. Uses .45 rounds." @@ -111,8 +111,8 @@ recoil = 0 origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2, TECH_ILLEGAL = 8) load_method = MAGAZINE - magazine_type = /obj/item/ammo_magazine/c45m - allowed_magazines = list(/obj/item/ammo_magazine/c45m) + magazine_type = /obj/item/ammo_magazine/m45 + allowed_magazines = list(/obj/item/ammo_magazine/m45) /obj/item/weapon/gun/projectile/deagle name = "desert eagle" @@ -123,8 +123,8 @@ caliber = ".50" load_method = MAGAZINE fire_sound = 'sound/weapons/deagle.ogg' - magazine_type = /obj/item/ammo_magazine/a50 - allowed_magazines = list(/obj/item/ammo_magazine/a50) + magazine_type = /obj/item/ammo_magazine/m50 + allowed_magazines = list(/obj/item/ammo_magazine/m50) /obj/item/weapon/gun/projectile/deagle/update_icon() ..() @@ -173,8 +173,8 @@ origin_tech = list(TECH_COMBAT = 3) ammo_type = "/obj/item/ammo_casing/a75" load_method = MAGAZINE - magazine_type = /obj/item/ammo_magazine/a75 - allowed_magazines = list(/obj/item/ammo_magazine/a75) + magazine_type = /obj/item/ammo_magazine/m75 + allowed_magazines = list(/obj/item/ammo_magazine/m75) auto_eject = 1 auto_eject_sound = 'sound/weapons/smg_empty_alarm.ogg' diff --git a/code/modules/projectiles/guns/projectile/sniper.dm b/code/modules/projectiles/guns/projectile/sniper.dm index be280c2f64..8afda4b63b 100644 --- a/code/modules/projectiles/guns/projectile/sniper.dm +++ b/code/modules/projectiles/guns/projectile/sniper.dm @@ -88,11 +88,11 @@ one_handed_penalty = 4 // The weapon itself is heavy, and the long barrel makes it hard to hold steady with just one hand. fire_sound = 'sound/weapons/SVD_shot.ogg' magazine_type = /obj/item/ammo_magazine/SVD - allowed_magazines = list(/obj/item/ammo_magazine/SVD, /obj/item/ammo_magazine/c762) + allowed_magazines = list(/obj/item/ammo_magazine/SVD, /obj/item/ammo_magazine/m762) /obj/item/weapon/gun/projectile/SVD/update_icon() ..() -// if(istype(ammo_magazine,/obj/item/ammo_magazine/c762) +// if(istype(ammo_magazine,/obj/item/ammo_magazine/m762) // icon_state = "SVD-bigmag" //No icon for this exists yet. if(ammo_magazine) icon_state = "SVD" diff --git a/code/modules/random_map/drop/drop_types.dm b/code/modules/random_map/drop/drop_types.dm index 43f89b4ec7..0f331ccbfd 100644 --- a/code/modules/random_map/drop/drop_types.dm +++ b/code/modules/random_map/drop/drop_types.dm @@ -62,10 +62,10 @@ var/global/list/datum/supply_drop_loot/supply_drop /obj/item/weapon/storage/box/emps, /obj/item/weapon/storage/box/flashbangs, /obj/item/weapon/gun/projectile/automatic/sts35, - /obj/item/ammo_magazine/c762/ap, - /obj/item/ammo_magazine/c762/ap, + /obj/item/ammo_magazine/m762/ap, + /obj/item/ammo_magazine/m762/ap, /obj/item/weapon/gun/projectile/colt, - /obj/item/ammo_magazine/c45m, + /obj/item/ammo_magazine/m45, /obj/item/weapon/material/hatchet/tacknife/combatknife) /datum/supply_drop_loot/heavy_warfare @@ -83,8 +83,8 @@ var/global/list/datum/supply_drop_loot/supply_drop /obj/item/clothing/accessory/storage/black_drop_pouches, /obj/item/weapon/storage/backpack/dufflebag/sec, /obj/item/weapon/gun/projectile/automatic/carbine, - /obj/item/ammo_magazine/c762/ap, - /obj/item/ammo_magazine/c762, + /obj/item/ammo_magazine/m762/ap, + /obj/item/ammo_magazine/m762, /obj/item/weapon/shield/energy, /obj/item/weapon/grenade/frag, /obj/item/weapon/grenade/frag, From 1e35ef880954bfa1fea9737a425c50707554258f Mon Sep 17 00:00:00 2001 From: Arokha Sieyes Date: Sat, 27 May 2017 03:03:45 -0400 Subject: [PATCH 15/82] Goggles are airtight Adds some 'plain' goggles that are airtight, and as such protect your eyes from things like phoron. Also allows eyewear to protect you from phoron if it's airtight (and hiding your eyes). Added airtight flag to science goggles, welding goggles, and 'plain' goggles I added. Weldning goggles only protect your eyes when down, since it removes the covers eyes flag when up. --- code/ZAS/Phoron.dm | 30 +++++++++++++---------- code/modules/clothing/glasses/glasses.dm | 10 ++++++++ icons/mob/eyes.dmi | Bin 8985 -> 8944 bytes icons/mob/species/seromi/eyes.dmi | Bin 6148 -> 6400 bytes icons/mob/species/vox/eyes.dmi | Bin 3407 -> 3819 bytes icons/obj/clothing/glasses.dmi | Bin 9511 -> 9446 bytes 6 files changed, 27 insertions(+), 13 deletions(-) diff --git a/code/ZAS/Phoron.dm b/code/ZAS/Phoron.dm index 4a4c29dcfb..acee6a8b65 100644 --- a/code/ZAS/Phoron.dm +++ b/code/ZAS/Phoron.dm @@ -103,19 +103,23 @@ obj/var/phoronproof = 0 //Burn eyes if exposed. if(vsc.plc.EYE_BURNS && (species.breath_type != "phoron")) - if(!head) - if(!wear_mask) - burn_eyes() - else - if(!(wear_mask.body_parts_covered & EYES)) - burn_eyes() - else - if(!(head.body_parts_covered & EYES)) - if(!wear_mask) - burn_eyes() - else - if(!(wear_mask.body_parts_covered & EYES)) - burn_eyes() + var/burn_eyes = 1 + + //Check for protective glasses + if(glasses && (glasses.body_parts_covered & EYES) && (glasses.item_flags & AIRTIGHT)) + burn_eyes = 0 + + //Check for protective maskwear + if(burn_eyes && wear_mask && (wear_mask.body_parts_covered & EYES) && (wear_mask.item_flags & AIRTIGHT)) + burn_eyes = 0 + + //Check for protective helmets + if(burn_eyes && head && (head.body_parts_covered & EYES) && (head.item_flags & AIRTIGHT)) + burn_eyes = 0 + + //If we still need to, burn their eyes + if(burn_eyes) + burn_eyes() //Genetic Corruption if(vsc.plc.GENETIC_CORRUPTION && (species.breath_type != "phoron")) diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index 4fb748f73a..65d6697df4 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -89,11 +89,20 @@ BLIND // can't see anything item_state_slots = list(slot_r_hand_str = "glasses", slot_l_hand_str = "glasses") toggleable = 1 action_button_name = "Toggle Goggles" + item_flags = AIRTIGHT /obj/item/clothing/glasses/science/New() ..() overlay = global_hud.science +/obj/item/clothing/glasses/goggles + name = "Goggles" + desc = "Just some plain old goggles." + icon_state = "plaingoggles" + item_state_slots = list(slot_r_hand_str = "glasses", slot_l_hand_str = "glasses") + item_flags = AIRTIGHT + body_parts_covered = EYES + /obj/item/clothing/glasses/night name = "Night Vision Goggles" desc = "You can totally see in the dark now!" @@ -200,6 +209,7 @@ BLIND // can't see anything item_state_slots = list(slot_r_hand_str = "welding-g", slot_l_hand_str = "welding-g") action_button_name = "Flip Welding Goggles" matter = list(DEFAULT_WALL_MATERIAL = 1500, "glass" = 1000) + item_flags = AIRTIGHT var/up = 0 /obj/item/clothing/glasses/welding/attack_self() diff --git a/icons/mob/eyes.dmi b/icons/mob/eyes.dmi index 1f4bd4a68f2b716e086c1b4a50b7a6d3b026d85e..763ce789906ca72500466ee84ba041e9e64a78e4 100644 GIT binary patch literal 8944 zcmc&)XIN9~mX3;|s34+ZLBOaWQU#R`7LX>OfCQujr33^*F9DK(4FnYs0jW72n$$pm z&;trmgb;e9hK>*dLI^#{Y`pjWn3*$k&v~ZYJkL&c_E)m^x7N4T`@So$?ipwu<~q#< z0)Y@=o)8CgFg;sW z`1^;iF08sP9nOMF_IFFes&5HuJ$spa%!U|s>HQJeZ%0sVueLwhsiSJ|d7R3B`IXPq zQEDz+dQz6V^HAuQM{O@6Uh0T7th&uPq^dY5Bz$#ItF9PdQjfomex;ix>U00L40!T{ ztq@7O!^eP@{s;=gifJ;uvlf34W}8(54x1}OG+$!jdd|cf`kf?`jB^&QY)lk~4%q+A zhEbHkK!;YF+WqyDD|Xo1c=ipYr?D5l*vQA5hcFbEF6!)3_rXcUeUn*uEJj-8O^Bkj zvh#m`+fmZG>t#9?2LUnM|_XH*Mj#g%d`l~6Fw>I(IHu6@a=PnhD~YJf~3)ta6iJ+VPp6@O&@+ZMOe^cG^y4K#pgIfVk~6@K@$uGyK$nDrcY*HR z0PO+&77W_w{`vHoGy0deu2dAVCY+z-@LZCTx<2M^CRom9DGLo$GD6$Q0|O8Hi(!$Z zHzG0ANE28I6ONN;Raxn{4F=z)Uy_jUE)88>^_}QB%8M8c;cURWlHLYFjbk>JQdN&e zHeIYn6kmX2&1**(YT)Rw?1BP8)15g6$URrRyRwnn9_DzLg!19r7mi-x z3N#MWiWolPH>5C_jzv81a#+#Q*N zD7&l@mKy7jlZ!;Fto1(1M!K#>x0hD-H)fOSC78Zxcj+2Yb`v?i+KYS)BV`4$F%xTNJdD;;&K3RRP;A(#r(}Qi|(e4(7M3%(L*Z@V+w7r;=b< z1^QHLgc2J{h)Qh)a2 z^N06UdLb!He8(x=_x?#w`6nj* z#}@xEgFOw&37Y`I3iMxeojKB$^wIH5Kp-?iF8cX2aXyCGS@<5s32X2Erg!(e}82_<6F-rinB zRM}#abDv#%vZCk0kRoCx#ZP7S5%8^k)rlaM5J1!N+<>q#+bj%PPc56nBnx&!g;QW()`O)18ReK*b08D|r&uDpqd=RjC`tKlvhgqwig^8(%8_ zj!(G{p}Y-u|L%g#Kbu2svt?~>uajns*gL2C;2e1nC z6TBPUMPgkDqJiNIb51-m5i6l88o`f^PSaXDj8xt3%2>wKu1J#W7lU@u;}?WTY6fgn z?dz+YWu&HO7!)^#nb!)b5+uO2#e!k&LEjxwletzw8 zhahz$k48THFygiWouAKO$Ill_Jafv8u_^Xe)7jL@_*m+Kbz3@MO7{@d&X2_351cXPQA)Y zl9Ja@wG@Wp`}p`IIaqshfmKz{G;x!sX|tHc=fSMlooaLW%cJ6wM=vE7+hS(T&1EMD zr({*d^)7!IdqjEvE03URp>fySex|2V79mM~nhGv)e$y>oFF*VE5pXP&`AEWyjw+3T z{q!kHG}ZqW4u_kJvw%lS^ikHCsO(Rl+-potP5a6V(BB|+Bo61ceAfr{U1%VC=FAsd zePIvL4qQ>KV64V-t9KW!h!37{@hT1dwxB!FXjx4T=B=)t9x=9}0#}3Y>s2&)UO$}@BicQFUb~OY zm#0ou=OwF8fdJUdAGs4)cd*T03w(brJO3rmD|h7N7LegvsxZDXg51gVmchrxP1hUg z8-R<~X;NJrJK&GL=qLt9L`3Lsy}OuHP&t>QPovRp4}SgnH8n^>=HXfFoG5^{O3KR4 zz_@{yg0(2K+?twUv$&~QkI-8m(Bh>6q-R z(&2)H9|<;ZoS?XLR!(j~4tBmkU;rgzHqk_9CgCl+%Zw954vZ#Y0swTL0%Y43&X_C8AzR0=fZiWKONE>~sI zGNfB^uU!Xk3u&2s9u=v|C&rw*K-OLO%Givv-yIU%@c0UJ91mf1-@J5eF5>HBM7ygr zS-8T~Q@Vi6vyZCIN|iPoTK(M@@PmH5&0wKoB%YG1mSEDtyn zml@brKaBrlnm<}4=~F>Ldsx^|;9^b8oQhl~V0q#DR#qt<;=%`jgen7HzbNrvfUUn| z&OZg;{&2?EdLSVM_qx|jbV~{Ot>)*p0=eGv2S8nCA$5Fh;m5^;22?>HsgZQ9(e{`7 zXeU6Ra$#fRjmUfiJ&~BKI6hc(8;)G4C~apwefo51aeg;P{xET8L%-vuSiSRc{^(q4 zkgPB^;AMF1rn6tM95ufz)d-5_<)to*FTcBZ##%of z`I%jG&CMD>!8^;J-#ps%G4lB>k=(+23pH!jv3xdfOREskVL^*kkUSsyL_d&K&V!#c zC2%Lpt5CKUjyn~zj8RN|dX=0|%M|pD{d}dre&BSReZmc4;UcrP`11VDh`32Ug1vbo z-qp|{%CeOzFBId%H0BzO?&TDbUXh&c9ps>Go|awu5V9njjXH2Jf%XETb}t{pebXBll!ZQ;sp@3| zJ|BF=DbGAHfB2~q7FO35QnYhnKG5k#)m|TKQgFf^+a^-*6){VCm2#UidrWIiXcz3L z1GlBXFW?=-arplrc>MR?Cg$kkay5INGr03^%?Hk%K=3?C6S<_~R9vc8}k53DY(~UwMYA>Uc zE6mkBRu8wH{&z$S3=Tal+1)ATNn|8_WoI>Iq!~{R@(dJ^^&zk5?pus9fG#+;2dym( zXF4);x88}xH%~;WISdzX)DFhqtG#txDIz zn>lp)faT-A6B=BxTiX2Aq#J?Li!4^pM0<>yycK`p4VV{|zg-KWc8?9Cl^PQ3^Da5kTJ zlcq5S?_lE&`LqX6xh?4Cz0`m?u~>vMb_<7-)d^z8#>Te1JbcD-Q50asb8~Z#e1LqO ziPYD>qmjP4)TG&vbZUO2W>CS4$8AIc3WF2#8ye{V z4r8cYhYva8ii<;OLMKl~r6~Ia7(q2IRB*xs;cJB+6L(@1yqfCjg2S}G$!RMFcfYVV z7rC-B!enOOE|zAu5v_X+3Sx&M1}m$o^v7G&H+)5wJ@+Nj4T2_|2JzAx_(6s^fZ%HI zzGf+%tAU-N@p31#VF5aiVb)I_6Lmpe{8(}pvnAG z+#-_+8o}8|^aF>^NW00e2vyf0?<2vZgji0WoStrMZEe*D7Ib^EB_?DE?gG9fEiJ_L zd1z>8z46T%;?A?d`-aLr(ppHQNQ??XcC-hJ#rl;x;2I`;{fBQ?iv3sEH(rMtxfHW} z+#P|aI0aZFH8u4H5?O-r<&c^ev`mGtOk%ikCa7ok~xC)HqtH z3^hmBdRt=vyi8p0X$OPx31qORUJ|9EOHE7}H;%nb0xek_YMw-R7 z@I^Oj}ul2q~2>7|SOlp;i*NZ#RERR}w zyRx#XtFQmYxoMHZ66jdJK%J!>=k+KhG~0}dkX0>_&$c%*_?C%$sD2aEI3wnPQ*|A& z>z!qNO{24!B_%zU2}$CBP-T^J8z2@ViU?UrwWkhD^=L6F^uYuBw?k{1SBf)R>G1`O zVNW=ADMd|OPjCxDt|w(nFV7xXy&ROXdF|RYLPPFw10sDh=$9_FE_dNyim_m)uj1JsiO;4qvQxEr#78MlO~c?L6x2EG@Ra zSH8KMx{W)3`r1GZf_UJTG^`LfH^kCg$L7wYXO+pHpWy~goSOm_Nt~fJdamAdMmo&p#d3KKeV>s@B zfw}8b`61X-W78z9MSNQ~&r4Yc8sEkC`iOu5xy2FJH)dWX%nz1;xTk1V)E@74KQ1Fev<02|8G7(%t~d$Dkvwbt%^-^a&j!KIA%8JGwo-KG)Z+|B;&@1p(j@`TZSF|IV^)g!AMni{5*Qs?|)=8~DE zItvj0`T=RUrKKf$WW+i_*{@(_ZLM{_zj#NX1#cxLwk4^mdIs3od`A}Jil^qbgUpLj zNZqEzVprv2g{;a zL4dfO>P}VPVIUxW*cawe0LsVwzo&;k6#f7u4+OIL9Y_T7En9O`D$*7qRS+CWb${`0IJbd_Mx;;gl$z;j~uDY0)yN_ipNQ;Sil(GQb-fK#IKKenfX$ysv zDurhA>@u%;5DmFX*9oXLT2Vi@|Vc9`DiONK|{*P+mERS zXBSsY)*Efy@mT6mlb&AqF*o;)gjy{oo~QW@{&8X8^$L^yOlaE%>$O!@%cLpEQ$^cZ zseudTRK^+_064Q$YD{%?^+#koZSTPoEx7MAuA7Y=tCOBp;>nj7S{1onA-c+p8^p-SSEB5Y;aZc+VOvQg(VME3mC!6 zo1l&+_@7k*gVjsJ+w9{vrW#?kgrs~-Vyjfu-BtC#v>Bvh&i+v1>cGH9Tf9W;cRa1- z&^zagYvY;P7alLvvRO4?aCfG@#oAb?(DjHgm*GmE{6^>d7R$eYtCwgHkjq8mtpl=k z*Dv8)})((t6)qJhZPjMs5d0o>Sg5(6nlbumgIKS<^L1(`Ii8UX!IUV?hmil zhqATf)sAN98Rpf#1=uiOJs`m~>H*8Pw8b<6?%k`{000?^UemAV2TEIel}`2pO!-6L zK3k^dKNM;GB=h&Nv8S+G9@C@RSqRHdIv#uHpDz}*+ZK?O`Ve=wQMK>m;xc=yMj9LM zboY0R4$v_Q9$!jl8o$~y<+K2eS~KlF)Dz^?$pwXR&t8u-N%!6xbnfHCbnF;3r#5HG zO;gG%cT@D5b-e8it%-O_1I#No@q&NBg~{MtzSo+j9%M6Bwji--C^z{`TchBTgm-RU zSlA9v1;hxy23v8UnijY^zcioJfy?{Y9}i&T=uja7y|$OkE-WnU=oK6o93*y6P5GVJ z9;Prm`XTr3jXJa#_SXcKZ9qAH*V>K2oVTd8CQPzs<{}%|Ov%|w2lG2vwy~AEB91|w z(i^g51I0HlwiiPSo`AP$nTm(1l~7t4hSSg6fvR1`Z@=Bh$<4L0dKP`lKs+dBjg%nQ zRJ;iWL#z=QmI1RF%Y7DZItIS@6`n)sDiQB@n{C;W>Alhb{&R!WN*Ph%JUgF>LN_50 z$X4FSh`xOFyNfSgyda#hRxHl;>C-V60jH%1)QnEGkRJ`M-XqSuB^0&Lejeu)laN?Z zMXbEh-@A7&?(tVH%K48`OUnc9^)C+-CKPA5*}mUwq-!^am+G_JjzmKl4lA2YZV`gM zfy{#k4P)Fpe z+fCp?=f8eS00mi@YrUM$0UA&6-;U+xH9x*TNX$d|L`1#-`$TB(;*M4ZP`D}Uhsm^^ z9x6NzqiyQaN7mmJlOifa`=G}o^+Ll|_U?XHp3*|Cy(}0HQ~eMk$A;|*`G`!#vU47E zb#|UZB9TCQC$;uTtjgAW@kk!KsZ_ukt3Jd2n8=T00qRbQ=a@iicv#rVps&xk?>ED% zAs40n-`Z zhFn?~M}*YHCnJl@T&C9XKCI1dloIVnHXEV4t;LM^PXdZ$JHA*1P7*%br%qrLr7bUT z%Krd?K$|=N1?a};jdsWZW8@Ib2@4_R)8%Y6G7K=FI~y61g0wDBmq}Q688q0qsTg;B zwv6^<22U2n{7%!f(9n1&{!r-d&}t4!Njnv>oLH_C$jtwt?#jzs)XG}@45$@zS5JDg!$vfEhz1#1;|9`9BTJQe%XRSjxb*hRwRlDljdw+TUKv#p4 z{Tw?81mc8fsu_SlEVIDXeDnxV5*E^s1Khj|GcpTMbMklebM*;u_4WdRLedixTXZk~ zdi)tyO7CP#qP704T#|ABfNI?utD4t$k;gAijh!tb3=-`{FI0F;&S}~zFyKsG@t$}Z zGEDV z-ey7Rokky4tQ!(<*uN(inJCn1XNoU9v>N{1KlKpI;&Z*(HPxARgUofVlvkJ)reii& zpUSa|V&^gIoxM5LW=~>9d|xZ2o;u8D-|-?w=9}k&SdMJZbn)1rV%a87hOv!&5b`e7 zo3&BsQB+kr&l-nZg(m$|=IB|BQJ^aUjB{?9dI1M9`h2+&hGn53&;<}g?XFQs`uZf? zXPBHp+{E2IapHKG*vK2XWRuh51e;*GKF&zSwqi=OjhlrpNHr(OdGnDT$Bs}&b(qw* zF!3CzxD!07E3Y#=$E$o@V!n?&lFz<^$K$6#aXG-LEOs$+8c5WL#T+veq}@rT)VH zBTQ;5K`PUdyjIg?pww-tOxur-^b7Da)6-=!^+kd-q#!gf*-4m($iVpcxKkM3%<7qP zdi*B#)sYU80-w_c^p(SkQ*ME7-eeJ#nw=b)(3CsqDnssf#6kwXpAy5DBh66y2(Adv zfyM$`5YLm=P&NHQzeQl^w-{RivujLKIAb_Cj9<8LrRePCASMalKZCsz$pVsWCLa90 z^Izs41Y-S35(GMO)D8qXexex!I&)MivXnXTZiLJNS~5&#@t`AxQDxkqJID}@bN{vW zg}>VEe_PS+vzE}$;;%Jp3*0ytar}NPlS4y8t01aH=f;fz3MLsVRWvPLJF9Q1|E-Qg zJmljemy;r^q?$6M1kmQb$f@p!H!7~KINeAYwR^U)#DJ-^^EJL~+4Kab{pwBKUUpHy zJnGMWz}7!KEnc3Tt?n5bi-SlFEK7E4A*64~G^h#)$c+pS&(%Rri7drb-k3t$-7Ub| zhP-z7_Qs9y**xN0{DvG=lK)Db{uILt$#;QGc%rf=neX3=)Q}dEs(_0|W%02eshMV? zWZ|Vn<=kXixm+UEpAY$fatGm6`)!8DovzGXXU=rr+gZ0axu!dU_cm9~&~0F4<9ak% z>)X%UJ7{{8dtUv{R|*{_<3rBKSFHsWk+ib1aw&A-q-Or0*J@5aYbUZAT3u6~tq!~Z zI%uM#AYAmw0dh-i#)@PZT8xiAZ8Ed##gF18F_cs*5UdVnL^sKUf zg!8!CrPs1^t!Z5k9ZZ@)pnGu-Z;Z`F!Bth;B5yqUeAwsGYoDmc6B8CjN_*W6Q%id3 z1GVuHCVJ*KC0ixEK_*3pqQRv4&2!;X?bNO+4W0(?gh|7EqYSM&V=|fE`;MjQaE7Lk zRp7OSpPxU~&L1qRt{xHo`Iu>l%eiOW5}3wL3z0X^)%6=>a+H0w_@Gqg@;tw?(Ox#D z@{zsTu|;~PcXjGlT3^c(!cu>ZIB#sm<|c5H1!r0ZjX6O_ZU=0eqIkrtdeG-;<~sOodzrf)?J=5V%FyBGMKJViBME;(y=Ol~ zLtmG7b6f^Vk^n0k2Q(pIiUp;lDSZ9W-y7m;h z!Xra|uY;Q$-IQ~46IJ7C+G*V=Aee18jo1c?KH`grYH~zV+t5jRPY-eB8NU~fFqKxX zOo&*Hpi|s2Kf6gpa|s5RMyxqPM|SG+v0CqcWV(p6cO;i2! zhN@KPEw6=-iHg0ba&iIf!-+tN7Rx?PPR@$`xyKQuEQftyedcJorAOIW|9l#TNEbu> z{(E~Pw}8Tuh;C}Gws@VIcN5u!(s`;g?&a^GquaNlxuHv{S-rEsq{4n8iu6|j zaU*8ApPWFucT9F!VnNRo4u!n(q3{b3U@XVkev*84{%?Q$r!)3{0NB5HYX7}QyN`ja zPx6Y2z9c3j6l7&x`N!6H3ag!sJK|Q{8rGK*&w}hW1w7q7KpTj2O80Ffq~=@uYsq> z>a$Dk*GQP17#C~%+X+gGK$q%RC|oaD$$yD~H%^Cs7l5pgqc^<0>LIbb*V&zp=;-L^ zB49H+)#Ky3<@8R){L_DIG$2mQw-#OJVKSKL_4N;0!D7$oaPqKe1I{L5Q+>*>`+C@N zJDR*Ke&+;(@yxiX2=52LApeDXlz$xzExo zueyb|E(f%OYQ5JQ#bNCoNVVX8gAXNqiv}yvFC^A$kjdDDq@?Kawm1QKs|VT$!HA8! zduZj^)L&;PY^Argjg5^716^;biqJ|!oCiU@Jnp<`Ow9%UbLSlPI!)-OS$B|huqcga zZ1hX$?mQ%sI9?^q94!KK0Q6>mmUQjf+uey8jT=u|EuxyXJ3kx)V)QeF{igiE=ea{? z{#nuZuO6+DcPpH_d1X#xg5amM!Fw@zS9UN=fJn${OS$yEFsFdzpENOlk_4)`Ov$bC z+Wk%^Vh$MImoHyZ5zeP zC$B;XTiraC4JN?}Nzo>&&5v2LpzB$!4O?GcPN5hK3jXk_VZQFI<@{Dlj6PyM)5LPk z=4I0pIFA5HwRi29h_jceD=2`YseEHnfO zlj3sg_l#iIadvlgD8XfWtJ~IV2(Of1UT!WW@wLXqwA^N0 z$aQ%j@A8V=8;Ot>68V<-rsMrqDnBlBGkW@ zJU`jtx0slicpc#!xTs}(j_A>&-0O@&T`rhO>2cP^1}V1 zOl)Pto;k++R>`EZ&rX;8`)Uk_fWl=Y0+7iK_L^R;58A)7*v*Ik|w6;^I#KHzN1@c$}Q-p)J2X zz}xPs^6*7+-eDk7=1aqwyXA=3gtApSDHdM-3cDdoiTsK8SY>`1+0IXg*2@+&9d>n z$Y7IT&{Q)TN}Ft=Oc&S5#Osq|z#Tvpe{aDY^Wd`nkFJB%DOErau-q~*Hy=9y@{>*g zUj@$|m=%9WlFS=)rPNq5cWy(rBD~SWJ$~WkPAQl|d0Cm)C+nvi_><~7t0~IWlm0lU zL4DwBaJOTWSdv-!lLaI-Zq|9}Z$KIm1%+0!F2 zH^OrVFQ$X5qvC0f%>d&E9f_M^`9}f&zXXIoSpt8lN7c_;3*A$|W&LealZSl#2uctb zq3Y+?mo zo4X`Aq^`)?opR+31UEdK7Z(>7qN=J|l9O|J8n`W>E*I+#ku*i#lpT<%{c@mO(0JW$ zr-j+OFzJXUayz(7@2pSY2~8B6o~FUTwJ`WpI=Uv^aPNMFk;TXL1d@20C=;OqzqL$A#x}9 ze))Z^@d&+FsoSfWuCnu-6%NlW?e#p3OB?6k}C1cFOkK`;}{&IHPL~O+$%e0pm;V?)zI8Hk4&PoFl-u$5TFB=R0 z%#-AR^nxO@96d$mwXCM~p0xRfKnw4d*=5^=YAN2UC zQuKdN<9n!36jSkKF1_<}mGm3m8G378jDXnd%w4_pk_MZGxQv7wXJrOdWRK4Hr`*NN z{8k3=x%$nyDtxNJOMZD13f!-;d?%t#)C-( zs+aP^!)Bhuufd=1SQ(y!D0b6r)4FQM$1QLZ8nLhvp5BXVVQ;0l4_ygb%bm>iwWx4V z|3#J{8)0^NIs8I$R4yU(DU7YLhm_8smJjdz3Zc!s6;g!GCJ-{@wDiETd7hbgFEYK) z=CC3#2qS~WB)lI&P8d2|fEKEP-cRK<*`!P{yEeldu=0qZxl4epT2Fy9C-O0DT$;}f z*WmBg>B#4j<^;H>XQ^1)4R!g|GMt``+&ew+TLxulPL9ZdD_)zx7yyqgfw4UzaUUx4 z_>v%qJ-tIl?Xz`vDT;k*ijzUI1b$cz743iKniHZMJn7#P3b5qMsyq*B!I zqtNT$IfD#=kQ_`$v)TXQ+`<%YYqxhVLt3p~S2&C-+n?zyvZvQ7Cd8ep&u99V5i zlq#;%D8Q?r=aBI2H_Zpw3jv>EA=)R|8=?$D;=ga!zEv2xG<8Ee%okx1Uykdr{c7NM zuTT(!^|uZE!d-a8`TjQ>Yj#FQe=gsRzSPkt*ta=W3DO^_PzxZfNIHk`;0s@$F!^6YmfB}ejNRjaMRpQN zlO49QRn^sQ-#2mxjgJ>q*=7h(+cBd*NgUk*;`h|4E4sDjC}&qjr(RO5AK?@( zT>MQf;Woq~!eL>be9B!~%iz+WG*Rs{AJf4|HvX!cMXv(jD$;2bZNxc#en(*3x`;9~ z)s1uhkn9jo@8y`(5h>?8+$W8(!aEiDzK>W!3u&Umn?qvPC% zWSQV*IsodS)#7yY2+MIW;9^WPxRlEgK|w1cmfoCI(Vi34 zw~NP2jg9NHujq{&E>_N-Pzrl9-REAvo+GmyH7pUV3|`C_8+#h(M8AC2eek2HBN=?8#`JFP)K;6;9qMYiHlhPar7!_9yLz(2{`pqaJzI8GaR80` zp--)uJu)*2j*IqeURe~0?J^X~kcg(0^(r&>HQOW#z(c@$C88HkR1XXonD;2vegN1Q zC3U9=;9PI-i&&?KxEibO;=rpl*2)Diz|s!SA>1ldniQNa2-kV*eHS2Z?Tu~GNmk4+ zW{F8jon`QaUBn1Pj$`ByYEySNepoj}Fwm&jYe~D%uq^SNW6v*Lwtn$s93WooYQk&5hA*N9E znA`V1NCUcCQajV0P9+oIUR`T3@NGZEt-AS_+z}XiQv$}ulx8dy;2RoRP!$`>M0znP z*6|VIp^nKkjAJJkrJ2GX1aLD z87{VW!}k`FG)!y};!WEI8F0p47@dr}<=gsG#?lHql=nd7XVguKc_J1+&EXcoE~v3F z`wsD@DL3pCw%4G|=CLs~8 zSVfyf6dLBcEq+a@=)5Looj`dO%O?@Hj@%{m%4lQ|7F;mX7}6*i0ShvNMme4?p(qEt zIJ=C}Y=L>|hOV|`;3OE0LMdx-^sEChG&8nyE-Ts_rc)R~h+x%Ehubk3bn3b{yx2o} z!Wt!)$WHfWIS{haSZzws`Ji>m>h`(HBj3XB&DMn4$i$2ot9^<8dX(7)8d`MWdl_;3E++uL>N<3fQQ zb6$Vn!F6=Bjij!Y@Q@jL+l?QEGB)V-`*Q^=d{0_afP#R(J;Peu za<3DrGO1BYfS)&}J4l+*l-~gk2?+n}Un7#wcus-tNn=SRmLSlnNfy?0I=3kBy^X5} z-v#);po2;`?fdubl()HC)nXx?mZ4bd3H6~*Ue;S1;f9s$R=aqAR*uV#2Ta>u4{6J= z>eY*sfuGOg1w$Qz_aD<#k-#3?Wu?rVC{eFtf+Vdz{b2Gs+l|}DX39APH3XDw7H8gS zBapka=&c`9%3!wk{Mw5d;*C2!cihWQ*(q0TjccBG`%o0s&=Hc4P?wLO>gctc?h=M{E&A z76Az$Yd6ili>!fwY++4+K*ExcTXfGn_s;F^JM-L`x%WpsRj2Cvs=hkseD8VR^X#Uv z0Uyr^9smINt{Nh40RTtH?y;W>yz{21v=%fB0!+<)5DwmUj~{vZJo0b{0RQyFglhM_ zrv<)WsLU}Ray#6hv!oKA-yFu`k))W{505-C$4$dAk>=Ng8uq+26#p^hesVpLjzNWV z1P=t;3a#><%(FofXLL0zW^GGdMWXCox3mp!9msk*l;@_b7ka4Q%{$szH}udkow|J) z5~^Ji5dj3ld#3UhX}&}!NL_& zJ^$sM5&q-ClUi&nzJoUV5vM4eCMGkbTAG@e=wvCQil(ce&w6(>@u-LMloEFy@fdqa zSAG&YdwIG zUz-*HKzyzuE}QzNFO9mn-ey$St>Di~J=48WrYYrk-yZWMA6EYKno#4+?cD9xJRHx@ z52a^ke|}&w{eCHZ&Dj$6MDt*e+K;Xu_4C^({jzFv(K7<4azDNIEUpZ@d#^k9S)Wgj z^>N-Zd(0`QbaWycBN*$V>yPv9^hzINoXL`qjA3Kh#z8f)^;hZ$ZXCd@(vRID03gK0 z0RY+i0YFL*04|;10|3_q0pMmNVEZ${ebjmPC|Ix2@9XP(`}y-QO?ad9kk2U~`D0er zX~B3SgTKRVjmBM=B=z+83+uDLNrBnD@QMpt|y5V)9wO`v@Pv~alS=xBS!M9xEH z=X;ixdn+I;li<~a%q54(#+aFE2C1zEJ6;zWQo;@EuU|6&Lg20=wGR1d9m!auWrvJl(&6Y^$K4#B7{tf^D(?^7ZT2 zMG>l@x0J;r}~BF0-NXL;LVBpNw+*7 z4Y?A>j@$|somgp{p>YlhJ$m%$YNsak>zm$3U0qQ&kPVTR>hZ=&ugUfY{dpFdR!lwp z`o}914X&IcIJY{&QVS{E+^H*b$JoZk5HXb%A(nbr@}WjCrK;pQVoFnIXC*u|l%t}1 zK+?q5?^qD&=-sBd+kW*=%#i2?a4|;+8lMq}n(Yh|qxZD9iRo(~vNq(*215jZx|9F* zi2u5U|2A(td!M(wX(8Jsr#c=B*b77&fZ zef6=0sm1vP7ni-69=Zk5*5F_>Hnm%u%p&23RFHYX!CzZDSwCs^yP6lvs2Hk?$l5KMxtFcDt zI~B1~oRC(f&WRra=N1-}I^CjhaMoJy1ESw$ipSZ*3MoeV4@}^vp->ogR3^o!v5fW0 zq*n=uFLg1oo7tL)tw>%!%J4at{yf1l#^Jc8j;t#Y#YzytF?m0`^+uu#1wA;=gCXc5 z5Qz^bG3Sw%ri*P8Y158 zD3-nb?x5G{fyQ?;=I!uGZ>P(hmqBao(k@~K@8|t{TlxK*D6sQD8Yqw5y}-c%t0tdA z05Goc2eA9MG5bSg{{0Y%vnfVM8h*Hn)O111b0_Cz$`RK0_KJ^oHmQYF5k})qU_E%tZ0Gk@8W}G7cEGd>C8Eo&pI3quf_0-`r_`gZlOatRF5! z>Yc7)5xGq~ev2})Yc$?Cr-3Je{~9})Ulw9((BcQ=h*Ol z;&B!=zT!V}vE<>!vigLm+UAGm8jfXFv2~(jVrzCo)zvQfli!{eGgm`*dSF}SxM3Ph z3oEcmtc|Q5OyjO?o{ippzDgG_7=DVs$nGUGxm}5wi*5iADWJ3WkL%p;z4^OR_|FdM zkX_@t8T7j6ouJ@(x%2Tfh`fDV8CdCf2=C9oDk|#Xe0sTSMj%GNV|n@Gr?N7LPiH!N z<>=%lSrafa^pbc?2bhRL{(<|v2aAm^9DhM5R_yA3C?k_# zdqFBf?t`tjdu&5{QTD-NM#-l)h~d_Y?9NS;7zBBd;1jw)#{N9U;gfUAkz~TS=IdL^ zoVuM2g{~&x!|knoOWRqdy8Q$F0Xwp%#NyKAED4_hO z!uMEb#8WKgRa*z<=Zl+|$z_ut9fUW3hP+`P5=1Ys7FQr#@-1rA)YC9tt5qMCxOtMr zDQK2U5c~`@M{nvpksc&5FnpbT5*np-uLPWY!uMDC0l@00+ynd;$X2&;s_@i58ci<(#7R*eo8<7A~s+o?o7#xYpnVwQb znASd!t_8DMI^l;o1b%`BPES_PevD-@oSpbk(?>%_oS;>_7n~Q3(xZN~RP`XarW56- z^3=eK0^hL$M$w$K8V*X*KE$+I2nb$b;acn!za;LDl-HG5Uib9oe82G>vbGt; zC;+yE!W{axovHkI4R)(nd2v2ZQWPNTuC4w^o7&l+>LI2|Q>_4TCL`i3^bu!;c&xqP2`xCBe@!q& zTQ}bq zNkmIZ%i>UpR!V(^H`(aUoy4y}?rSrn$!fpm)`s`Llk)um0oW}jRx~C`TqTV3RH9uZ zK}88~qCvW!(!l38uHOV0>GVAG8CeE7cy2ILO;t73_QLFtCK=u2qo$KH0TDk3eoikNz=6ljZ`8PaFEMWa$cy!$|Gg;xu3J-uv3PB#M( z2oeQ*o30jvTm~`O*T zQwQzk+2uiAg)W;_2l4-;zX*iAF}gxFH}A!IX=#l$H%PqDOU>~gVi}-={MTN|1{ND> zGkYSSiYG+L8!Q>KYZwd$$PQL?&{^3?qGOPoM~m%LFJDdHFy_Wv_T>jrM{-`2#%%5tzXS4qeX&&Kw_lSG#dvbL0{* z&XXClry&CPXUpGjdh*ZS@;+rV=oY9MCr^5~x$zmfYc}Nnz9fFgR02>&8=4`z1kB$x zG|ye;h+zDe=Z7su?@DB!JNHF2Dn^8h56q1tyj;^i*&T#iOCIMv7S!qM>-*NDA@W9! z30@T=bJsOh2fG6bS&cEeGU;A$fliWx#oNL{kF|lwqiI`PTUKM&DQ=AQb>X&R9zX1v z_~xGs&psew7}g22v8UPv*e%D{&FNKmx{ZWbTxGEP#7g-y1XKbgr{=B()}$NkE-*W) z{HAatj0xU3Dr9rnK>XUHt1Yv9TB=vtX)mXC5@oV$YDm3K@BS=Vw3PfD;}@7=2a7-F z8=dG}TDBLLYqB(=w4V%a50aG;C4FKs(df^gObK`$*asvQ6Ng_gIhy1kOeB<)l>Pke zhMz~FWXbVBqTK*J!NEd8i07(ALi|msvl$r~(zP-%2xyL`re;akRux>*&LePfcr*DX zAliBTQs?!Pc4Gs%pzqt$G|e(cD|!>um75;Sw08@@I5<4@kf1mf(%F?S|GiW2XOaCc z&4hp15cIzBm*3oWL)xD-Dff2TKPp8B8@vFkCq@&~DoI;v-t92ZU+v%xqqdc#MXM_F z`U*EExw3)gm%f%8akX0?QLT$kpHrp1V-Zm9Gx4|smU0s0T5gOLd#yv1_6Wx99h~xU zdUWzj3W}1NP~8#YMnq#?A3ap&u7gEp%F87#k-OS*2W;Yu{gl)`fD0HZ@;3nClcxwG zBkEon7^s!fFi4dDiV<^Z6t8tBiPW4e!xWX+1|G-=_{Cm&m`D2{>_(Wnrfi#H)=fjj zlxVPs%`M6@GnvPpA&gOee)68AGTF94!qS{*V}XJn|B*x#5K^@BskSpHcogXi*;A|F zR33)ss8hk)l&J}5tQ-Dh^IGbK&Qc+5y2b^sG;#$P&ozq+HlLLfYTxRcuF20vcY5-3 zgnVFD?Kf5#tv$KoCfDH|9tc*0X|kSY?h4Hpy=(7skYsI2F!j4LOwTXg?ZWQgP#hc~ zx2iZf|DMA6Ux(Th$zdpwFyk1@0lY2PMFLQPTz2`m5NYS~g|av+0rJ$ph*Ckpc=hS& z;&;WjKzho>9IhW6&+dJMp6Wicoz9S1YCWMg(3XKBrV{wBC&^Y!OoD>6W)wBs-_vtH zw?DrWPh7VHW&1M^ok!HM0XG$8<&9Mpb5N|(DWf9gJqm>uNr}~5$|@>X`#zV_w@Mde ziJllxk<*3UjX@?zVqkKz76fs?W zta|N$4Sq42Ock#R^zU!Cc)Ws#IDltGC%@%TT}qAsm@E~Lv0Cgh<(tVU9hTX7f0xf* z_zt}ftnT|)&R>b$%+gF$1fi}-Rz~w+ zVgLN>Y;(b6-a_BKfdnIo!h5JHyWSzw&$S6dZS6tYbKI74B}`;I_xut_VE^hbRu4mE z-Z;A*KQ?%-!rLoNiCp1Y*_p z8o0Q8kn{%oo0IysiY1b}4DVkkBv!Z7LKQIPNq1)D04af*e^Aj{Z70;-xN!rd!tsWj zBcD4!5xsumc8Zcy#Eb=yENZrAoUEq~KKi6@TeY3(psusAMvEOj8ygR`jf08~x?)m4X>H_L4*7j3_qvx~>6NjOf5CmUO2m}>={@GtVe zyum|#8|HVec(aAMUEy^#4EB_Z*QiM&V8>zORl@}h*BOYwxuSDwPkia@E?PJWlOfLX zLMZNnGPE1|aCp$nEYqLIqvidz95~4=v*_zE~AfdOqj8fA7XD8q*sHW9)|JkPO5Np{*IN{Xq2a{~^|88t%t zNvGME5?%T)8oE3T+)a^k$IedNQvH;qEa2BF3$qz)xlD?FU1F@u@83JPh|&C1DXn)P zNsU-(jbo6GXs^Z$kbU4pIs=Q*ll{4c1Ax_A7gr7dK;Cr#XuiM#0KXpt0NGdocwho* zh9$9Mi!}*XDUG&98AA3x~#dokO)yg_7+)U zYROR;-_SMsNQ@JgN&NFT;e9}>)5=UQ`grHbHl1{iZ{Jf{j;c)zV8es&$y%p0J&>|A=}(22)J7) z>(NK!Yi{ox9y^u1izq#*BrL?FT%_PN$@>A|-MXCdpPm|UI=&B79|Qn?-G5_^zceMe zoRS?*ND1QtzF7{iJ}@9E5SZ*%9PyR~`^LE31t`K7WRgBNRy_9dYM84T`qcQ%nM+us z*lVb!ev6KgIYzz4GhE{}G%QcDGn;YGe7po-`0iGTMx*IzuQW)#z1595IcK|;DvBz* zv3=yyr2YFTf+%Z~oJ&PT)t)V}R&>4r&zgCc^T_YiR}dkI;NuuI2oK zWz%Nw)Dnd#6X9J<)1U((mX0G+(?3k^Yz2+fhb)AY(jU<=4BQv+2)8u4B^_u(;o-2l z9v+1GM0IeRIvV!{DZgS!fG5Y2Hk%L_q|u9?3kv4a$nInbvl(>Vcr03RG(;P5^)5jW zyD^;stGAP0T>6c~20z;(;H{Ds^wH*4+GR0ByW^=N-?tb|j?vfn%MI3XnxnLr!Hbif zKFh1(V$_-;?~J48f8Ck1kAxvbBPX`Vj#2CL&REh=(Uz);K5jIiarK?g`lX`maJn*n zBhl~$X;e&)yxocy@7aKC92NruYtbx7ll1^_ko|8p_WuU(pIs)xWx%uV#Z*9QsyH%? z1^5P$Mw+!hdyjslfy|EZnw((F%m$XOtkEW$o0ai*EzEy?o4GG#TYm1?hG?MotbcuG zHj|7c9zcdiO_Frw+}cMRoJV}H_uCdXmMDB0q>c{R_e1LMfgTbGGl5SSsoeO;j(VBP zj$0`Sce9V$;86{x$Ga}jXta@z^50c>`G`xy)9o2zoamNmcHxLS3*#+0guL2X5-Ukc zk6Ug2K?GT*ZO+TnGjJoqLCSF}U6h)y8hjBDfzRpt~t`(M^|l-JG9%u0H)*$PKl z-Fz)+(jTCg-|fv9#Xgls9v^a3G&c%^j8q4Q+P4`IUWrb@na><{${q6qRTeFQyoPq| z6Fzm+z`-e|!umpyW`f%ilI^qqoV~D)Q*lOA`4h(01eU8?jTn$O7=2S&fvv>L-H+RA z#0C*y{H@&2?+gGwF!=!6e~R0l7C~Uw`68f{7^e(u$EpFDcu)g0haUYi-u~HK{}Ph_ z^^|yhg^ZmJX7BWd2D{UEn%bbuSGP)fDRZ;yiipDiT*hX!qvI%*8S7_xH$S|j$?-fp z8$ns4@~xJog{8+p?1}R2(lc?27(40w3{>gG;x~GUYF>;4LxR&sD1fsir$)Jl&#tn(NM{!IJhLtWjUT_(ye7tA@&)wa2ya<7Gva zmA)t@m5?>KP?sUe!>%31+uGXloNX_Xl$V#U|Mu znQ%L`-%mfNmXbnyZ3ap;u0m~6!*6!KH|#~0rsd+fQJsUYdDlAnO2iqNTWZAH4sh(? zdm|Dxy7gX$hJ6ts0T#zVx@3`Rs_GtdeCS!5IV6u#e&=qMfANYtBAw{Fd#SX^ft}C1 z@cdgjF6n}XY@(|OBrz~Q)A0|#a@is%ky+1QCPz)`dTt>A{4D}x~Q#zLI#?5?Z~MqX?RLU zTI!K>uey zzgNLOzcAf&)$7{jRQ#|B!B<7?gz>Gmt~m$1WP2x4cr-_;mCKXpVz)50D+1Y@yxGF> zd_}CCBeHQObZI%s!;p%=u#+NxtwTArKCSJTz)j|Pug#kV|8gx#Pfs77s&te1aQCB! zt<7-x1pekOFF=92SP+;x{SO{19~c)@<%ff}j>%byUQ98bzxd8d_Idf}t{f`>81Jr2 zocS-3hx?0GO}^pc6Pt;GuS9PXGxFuz+haQ1Sb^x_RF*RJBtK2;mVe{|lh<8z}9q`F$1+T$CLM3r*5p;$2kwdZM!&`Qn zQ(v>QO5ME;FC_WxK%%7do*qmdPiZzId++59`!s#(GougmR?FmD;wv%&sy}cSB^;8n zuMnT%xa1Y1MySn<+oXsOlO9;(u1fhK4E^h@m9!pFK~X&bf(cZ4zrbA`jxIH_sc$j5 zVY;P4l(M^EU)z=FW$XKYcEW&oKv;%qZN@hpvIlRh!sLaik1%8|t`eTOQgc3n zEKL5Pf99Y8=+Fo@MQy#$pN{8^oeYs^ef_NTy4~4zIyU>Jc+v;^wI}zn%w(=@hs{rV zd9TeSP(&J8IBxa&`bapta7dfWV&(*RAH+G~rVybv7t@UhoGfw>W>ip9W3h=!%YnRc z>pE@ds8mR&d&7L{A&A3Jd^x?vttwo)yKz1Z#9Jx7O(@x?HzHO|6}@(R5=j@Oeu1+s;H#o_DDW^>F7+Dh?=VanBdmu!}s9tze;wrIGds5 z#-XR7kxH6<0?i?}q*o3YN0}D(ME`X6@-q0Mj*Q7IENr`NVexwnSE2d0EESl(YS8Qj zs!G5v#3F&BnQRGgydR$8yN>!m5EI@#wsl==mDvk}zEF&`O9QR44 z`Xe#3OQp0d$8Ebf0p4eF=QAN?qx+eiB`utaEh<3@88Ac->AX}=%qPFK{*z+#EYY?8 zG^^?IfAVWYZrX_x4HXSG-z|!x=T6=Omuxvk`1LQ~G~B0Po$<;$wC)uOW5*gn7&xF2 z+--3G-o5DU8g>d3i{qK0ZH=veUyJbFtsE$h3zO#A*lr>P-+97R5j4qU?$Ms?{znqQ z^_HVdzdI(djPOEu3KjX#?_l57l_uLcuBe%|ev)bk$C;2q)#ZxY1_lQ7MeE9CFe$t$ z{tTvv;Mw(sLrc6zDNMVmkX`LV*Ut2(YGJf8`DmO@YFaxIZ`|QbBWH)x(hpYHWQB6r z#zr)^)qWIxW-S{9T1Bb=$q(KWbJ6_e;OJ5nFzy(b3V5nsK}( z)VVp%Na+^R$j}f?jd*EbkGc+b_xJxA4Wmg}F0W6QPjM-pN1uBA=#7&ve9vAQcv+h zc-T4XxEzvt;H*+;HU-g^ySUK^epOUd^e-oxdU$%O4R&^#oUlt+%shgn=RomO)N}*s z4LTiy^2TgjLM$hxqtrIP!kDWms^NWjf8me@wc_ znOc+4R58^cl|yhH$$?4N(VdEATloV3pns~jr;00-B{kM#7WTZaJ|}~G1FtW~SNi^a zFM}H6BK6E6n7=k{ubmLV!@t*0_-{kOLGZ8JKqCB3@beeN`W_y@*a56!HnF?tfCQ! zI@KCDq(ARwCPgFkXOAw1>`UTo>e}5gsbgnZZD_5)y`>rOSgqEvFbzMG>#Ob1*37?qB?Vb>t-R;E!Q5ZXZ+-50fv)3`!Sxlnu#qQ@LBfj0# zDvrJ{OITw?xV!8H9EIb`lf1-IKrp+@>csBvYM^%cduF;0r+%m(`cVMe2nPq=sI8(6rk$~wRX4* z{5+@*_<29#X-D(1-4Xb{sIvbcUm(b+vQWRjb4tE)kLq;)WqKewKuTJ?Y>-ba*^ zff_N+QwR*{q)q2Y;?6~#zuJ^giwl}T6iZnvt>T*l?l*ij~JD;@lGBNQ~|B`-;^?wJAZ zi)JnpY_~N02FSV%Tz^yxO7rW&Xggsh6l}=8*vLr8aSl>*>#X#{8b3ASk6p@hyJ8f-kmw5BSKaD94 z+HZLr#ScX#W&iIk#|Mm3#L%zjrG4(E50UYsc{Lted&{ujS?k z(?8PQHEmDHs07Vg>b^Ga&DqrQeaCKYEH;#(gCTIWEA%wJ=wp2p)<^V)$W!RI+>ZWV0RzT(>2sVYdJmo2hGs` Awg3PC diff --git a/icons/mob/species/vox/eyes.dmi b/icons/mob/species/vox/eyes.dmi index 6e15b3e58c4a140c074d08679cd577e8ab50cc37..c81f6217a2cc81a01cf51b8af499244a0e192285 100644 GIT binary patch literal 3819 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 diff --git a/icons/obj/clothing/glasses.dmi b/icons/obj/clothing/glasses.dmi index 0e863674733d59ee271ebf5ff0444ae1ec88ff20..920880e1553d50de9a26fa740e71e2e973e824b5 100644 GIT binary patch literal 9446 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 lKj}07^RoUwVdq9MvgFuE%o*@rnQd literal 9511 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 D&4v*^ From 3ff9d441f9c2db9c0c8357a4824ffb6b485541ce Mon Sep 17 00:00:00 2001 From: Spades Date: Sat, 27 May 2017 04:39:49 -0400 Subject: [PATCH 16/82] Finishes fixing ammo inconsistencies --- code/datums/autolathe/arms.dm | 60 +++---- code/datums/supplypacks/contraband.dm | 2 +- code/datums/supplypacks/munitions.dm | 6 +- code/datums/uplink/ammunition.dm | 2 +- .../objects/items/weapons/storage/belt.dm | 2 +- .../objects/items/weapons/storage/boxes.dm | 32 ++-- code/game/objects/random/random.dm | 4 +- code/modules/projectiles/ammunition/boxes.dm | 166 +++++++++--------- .../modules/projectiles/ammunition/bullets.dm | 48 ++--- .../projectiles/guns/projectile/automatic.dm | 16 +- .../projectiles/guns/projectile/pistol.dm | 30 ++-- .../projectiles/guns/projectile/revolver.dm | 12 +- .../projectiles/guns/projectile/shotgun.dm | 12 +- code/modules/research/designs.dm | 4 +- icons/obj/ammo.dmi | Bin 25469 -> 25318 bytes maps/northern_star/polaris-1.dmm | 6 +- maps/northern_star/polaris-2.dmm | 14 +- 17 files changed, 210 insertions(+), 206 deletions(-) diff --git a/code/datums/autolathe/arms.dm b/code/datums/autolathe/arms.dm index 276819d3ad..b40bf27e47 100644 --- a/code/datums/autolathe/arms.dm +++ b/code/datums/autolathe/arms.dm @@ -8,29 +8,29 @@ /datum/category_item/autolathe/arms/shotgun_blanks name = "ammunition (12g, blank)" - path =/obj/item/ammo_casing/shotgun/blank + path =/obj/item/ammo_casing/a12g/blank /datum/category_item/autolathe/arms/shotgun_beanbag name = "ammunition (12g, beanbag)" - path =/obj/item/ammo_casing/shotgun/beanbag + path =/obj/item/ammo_casing/a12g/beanbag /datum/category_item/autolathe/arms/shotgun_flash name = "ammunition (12g, flash)" - path =/obj/item/ammo_casing/shotgun/flash + path =/obj/item/ammo_casing/a12g/flash /datum/category_item/autolathe/arms/shotgun name = "ammunition (12g, slug)" - path =/obj/item/ammo_casing/shotgun + path =/obj/item/ammo_casing/a12g hidden = 1 /datum/category_item/autolathe/arms/shotgun_pellet name = "ammunition (12g, pellet)" - path =/obj/item/ammo_casing/shotgun/pellet + path =/obj/item/ammo_casing/a12g/pellet hidden = 1 /datum/category_item/autolathe/arms/stunshell name = "ammunition (stun cartridge, shotgun)" - path =/obj/item/ammo_casing/shotgun/stunshell + path =/obj/item/ammo_casing/a12g/stunshell hidden = 1 ////////////////// @@ -81,50 +81,50 @@ /////// 9mm -/obj/item/ammo_magazine/mc9mm/flash - ammo_type =/obj/item/ammo_casing/c9mmf +/obj/item/ammo_magazine/m9mm/flash + ammo_type =/obj/item/ammo_casing/a9mmf -/obj/item/ammo_magazine/mc9mm/rubber +/obj/item/ammo_magazine/m9mm/rubber name = "magazine (9mm rubber)" - ammo_type =/obj/item/ammo_casing/c9mmr + ammo_type =/obj/item/ammo_casing/a9mmr -/obj/item/ammo_magazine/mc9mm/practice +/obj/item/ammo_magazine/m9mm/practice name = "magazine (9mm practice)" - ammo_type =/obj/item/ammo_casing/c9mmp + ammo_type =/obj/item/ammo_casing/a9mmp /datum/category_item/autolathe/arms/pistol_9mm name = "pistol magazine (9mm)" - path =/obj/item/ammo_magazine/mc9mm + path =/obj/item/ammo_magazine/m9mm hidden = 1 /datum/category_item/autolathe/arms/pistol_9mmr name = "pistol magazine (9mm rubber)" - path =/obj/item/ammo_magazine/mc9mm/rubber + path =/obj/item/ammo_magazine/m9mm/rubber /datum/category_item/autolathe/arms/pistol_9mmp name = "pistol magazine (9mm practice)" - path =/obj/item/ammo_magazine/mc9mm/practice + path =/obj/item/ammo_magazine/m9mm/practice /datum/category_item/autolathe/arms/pistol_9mmf name = "pistol magazine (9mm flash)" - path =/obj/item/ammo_magazine/mc9mm/flash + path =/obj/item/ammo_magazine/m9mm/flash /datum/category_item/autolathe/arms/smg_9mm name = "top-mounted SMG magazine (9mm)" - path =/obj/item/ammo_magazine/mc9mmt + path =/obj/item/ammo_magazine/m9mmt hidden = 1 /datum/category_item/autolathe/arms/smg_9mmr name = "top-mounted SMG magazine (9mm rubber)" - path =/obj/item/ammo_magazine/mc9mmt/rubber + path =/obj/item/ammo_magazine/m9mmt/rubber /datum/category_item/autolathe/arms/smg_9mmp name = "top-mounted SMG magazine (9mm practice)" - path =/obj/item/ammo_magazine/mc9mmt/practice + path =/obj/item/ammo_magazine/m9mmt/practice /datum/category_item/autolathe/arms/smg_9mmf name = "top-mounted SMG magazine (9mm flash)" - path =/obj/item/ammo_magazine/mc9mmt/flash + path =/obj/item/ammo_magazine/m9mmt/flash /////// 10mm /datum/category_item/autolathe/arms/smg_10mm @@ -161,7 +161,7 @@ /datum/category_item/autolathe/arms/shotgun_magazine name = "24rnd shotgun magazine (12g)" - path =/obj/item/ammo_magazine/g12 + path =/obj/item/ammo_magazine/m12gdrum hidden = 1 /* @@ -211,12 +211,12 @@ /datum/category_item/autolathe/arms/pistol_9mm name = "pistol magazine (9mm)" - path =/obj/item/ammo_magazine/mc9mm/empty + path =/obj/item/ammo_magazine/m9mm/empty category = "Arms and Ammunition" /datum/category_item/autolathe/arms/smg_9mm name = "top-mounted SMG magazine (9mm)" - path =/obj/item/ammo_magazine/mc9mmt/empty + path =/obj/item/ammo_magazine/m9mmt/empty category = "Arms and Ammunition" /datum/category_item/autolathe/arms/smg_10mm @@ -262,7 +262,7 @@ /datum/category_item/autolathe/arms/shotgun_magazine name = "24rnd shotgun magazine (12g)" - path =/obj/item/ammo_magazine/g12/empty + path =/obj/item/ammo_magazine/m12gdrum/empty category = "Arms and Ammunition" hidden = 1*/ @@ -335,35 +335,35 @@ /datum/category_item/autolathe/arms/pistol_clip_10mm name = "ammo clip (10mm)" - path =/obj/item/ammo_magazine/clip/a10mm + path =/obj/item/ammo_magazine/clip/c10mm category = "Arms and Ammunition" hidden = 1 /datum/category_item/autolathe/arms/pistol_clip_50 name = "ammo clip (.50AE)" - path =/obj/item/ammo_magazine/clip/a50 + path =/obj/item/ammo_magazine/clip/c50 category = "Arms and Ammunition" hidden = 1 */ /datum/category_item/autolathe/arms/rifle_clip_556 name = "ammo clip (5.56mm)" - path =/obj/item/ammo_magazine/clip/a556 + path =/obj/item/ammo_magazine/clip/c556 category = "Arms and Ammunition" hidden = 1 /datum/category_item/autolathe/arms/rifle_clip_556_practice name = "ammo clip (5.56mm practice)" - path =/obj/item/ammo_magazine/clip/a556/practice + path =/obj/item/ammo_magazine/clip/c556/practice category = "Arms and Ammunition" /datum/category_item/autolathe/arms/rifle_clip_762 name = "ammo clip (7.62mm)" - path =/obj/item/ammo_magazine/clip/a762 + path =/obj/item/ammo_magazine/clip/c762 hidden = 1 /datum/category_item/autolathe/arms/rifle_clip_762_practice name = "ammo clip (7.62mm practice)" - path =/obj/item/ammo_magazine/clip/a762/practice + path =/obj/item/ammo_magazine/clip/c762/practice /datum/category_item/autolathe/arms/knuckledusters name = "knuckle dusters" diff --git a/code/datums/supplypacks/contraband.dm b/code/datums/supplypacks/contraband.dm index 0c7fd3f4ed..c200e2edda 100644 --- a/code/datums/supplypacks/contraband.dm +++ b/code/datums/supplypacks/contraband.dm @@ -47,7 +47,7 @@ name = "Surplus militia rifles" contains = list( /obj/item/weapon/gun/projectile/shotgun/pump/rifle/mosin = 3, - /obj/item/ammo_magazine/clip/a762 = 6 + /obj/item/ammo_magazine/clip/c762 = 6 ) cost = 50 contraband = 1 diff --git a/code/datums/supplypacks/munitions.dm b/code/datums/supplypacks/munitions.dm index c9817e2274..d0635ffce6 100644 --- a/code/datums/supplypacks/munitions.dm +++ b/code/datums/supplypacks/munitions.dm @@ -129,7 +129,7 @@ contains = list( /obj/item/device/assembly/timer, /obj/item/weapon/gun/projectile/shotgun/pump/rifle/practice = 2, - /obj/item/ammo_magazine/clip/a762/practice = 4, + /obj/item/ammo_magazine/clip/c762/practice = 4, /obj/item/target = 2, /obj/item/target/alien = 2, /obj/item/target/syndicate = 2 @@ -154,8 +154,8 @@ name = "Automatic weapon ammunition crate" num_contained = 6 contains = list( - /obj/item/ammo_magazine/mc9mmt, - /obj/item/ammo_magazine/mc9mmt/rubber, + /obj/item/ammo_magazine/m9mmt, + /obj/item/ammo_magazine/m9mmt/rubber, /obj/item/ammo_magazine/m556saw ) cost = 25 diff --git a/code/datums/uplink/ammunition.dm b/code/datums/uplink/ammunition.dm index 4238884598..03f1296ad9 100644 --- a/code/datums/uplink/ammunition.dm +++ b/code/datums/uplink/ammunition.dm @@ -12,7 +12,7 @@ /datum/uplink_item/item/ammo/mc9mm name = "Pistol Magazine (9mm)" - path = /obj/item/ammo_magazine/mc9mm + path = /obj/item/ammo_magazine/m9mm /datum/uplink_item/item/ammo/c45m name = "Pistol Magazine (.45)" diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index 06fd49d0e3..dfa4f61ba1 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -124,7 +124,7 @@ /obj/item/weapon/handcuffs, /obj/item/device/flash, /obj/item/clothing/glasses, - /obj/item/ammo_casing/shotgun, + /obj/item/ammo_casing/a12g, /obj/item/ammo_magazine, /obj/item/weapon/cell/device, /obj/item/weapon/reagent_containers/food/snacks/donut/, diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index 8eab766dba..c33e26d809 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -136,12 +136,12 @@ /obj/item/weapon/storage/box/blanks/New() ..() for(var/i = 1 to 8) - new /obj/item/ammo_casing/shotgun/blank(src) + new /obj/item/ammo_casing/a12g/blank(src) /obj/item/weapon/storage/box/blanks/large/New() ..() for(var/i = 1 to 8) - new /obj/item/ammo_casing/shotgun/blank(src) + new /obj/item/ammo_casing/a12g/blank(src) /obj/item/weapon/storage/box/beanbags name = "box of beanbag shells" @@ -152,12 +152,12 @@ /obj/item/weapon/storage/box/beanbags/New() ..() for(var/i = 1 to 8) - new /obj/item/ammo_casing/shotgun/beanbag(src) + new /obj/item/ammo_casing/a12g/beanbag(src) /obj/item/weapon/storage/box/beanbags/large/New() ..() for(var/i = 1 to 8) - new /obj/item/ammo_casing/shotgun/beanbag(src) + new /obj/item/ammo_casing/a12g/beanbag(src) /obj/item/weapon/storage/box/shotgunammo name = "box of shotgun slugs" @@ -168,12 +168,12 @@ /obj/item/weapon/storage/box/shotgunammo/New() ..() for(var/i = 1 to 8) - new /obj/item/ammo_casing/shotgun(src) + new /obj/item/ammo_casing/a12g(src) /obj/item/weapon/storage/box/shotgunammo/large/New() ..() for(var/i = 1 to 8) - new /obj/item/ammo_casing/shotgun(src) + new /obj/item/ammo_casing/a12g(src) /obj/item/weapon/storage/box/shotgunshells name = "box of shotgun shells" @@ -184,12 +184,12 @@ /obj/item/weapon/storage/box/shotgunshells/New() ..() for(var/i = 1 to 8) - new /obj/item/ammo_casing/shotgun/pellet(src) + new /obj/item/ammo_casing/a12g/pellet(src) /obj/item/weapon/storage/box/shotgunshells/large/New() ..() for(var/i = 1 to 8) - new /obj/item/ammo_casing/shotgun/pellet(src) + new /obj/item/ammo_casing/a12g/pellet(src) /obj/item/weapon/storage/box/flashshells name = "box of illumination shells" @@ -200,12 +200,12 @@ /obj/item/weapon/storage/box/flashshells/New() ..() for(var/i = 1 to 8) - new /obj/item/ammo_casing/shotgun/flash(src) + new /obj/item/ammo_casing/a12g/flash(src) /obj/item/weapon/storage/box/flashshells/large/New() ..() for(var/i = 1 to 8) - new /obj/item/ammo_casing/shotgun/flash(src) + new /obj/item/ammo_casing/a12g/flash(src) /obj/item/weapon/storage/box/stunshells name = "box of stun shells" @@ -216,12 +216,12 @@ /obj/item/weapon/storage/box/stunshells/New() ..() for(var/i = 1 to 8) - new /obj/item/ammo_casing/shotgun/stunshell(src) + new /obj/item/ammo_casing/a12g/stunshell(src) /obj/item/weapon/storage/box/stunshells/large/New() ..() for(var/i = 1 to 8) - new /obj/item/ammo_casing/shotgun/stunshell(src) + new /obj/item/ammo_casing/a12g/stunshell(src) /obj/item/weapon/storage/box/practiceshells name = "box of practice shells" @@ -232,12 +232,12 @@ /obj/item/weapon/storage/box/practiceshells/New() ..() for(var/i = 1 to 8) - new /obj/item/ammo_casing/shotgun/practice(src) + new /obj/item/ammo_casing/a12g/practice(src) /obj/item/weapon/storage/box/practiceshells/large/New() ..() for(var/i = 1 to 8) - new /obj/item/ammo_casing/shotgun/practice(src) + new /obj/item/ammo_casing/a12g/practice(src) /obj/item/weapon/storage/box/empshells name = "box of emp shells" @@ -248,12 +248,12 @@ /obj/item/weapon/storage/box/empshells/New() ..() for(var/i = 1 to 8) - new /obj/item/ammo_casing/shotgun/emp(src) + new /obj/item/ammo_casing/a12g/emp(src) /obj/item/weapon/storage/box/empshells/large/New() ..() for(var/i = 1 to 8) - new /obj/item/ammo_casing/shotgun/emp(src) + new /obj/item/ammo_casing/a12g/emp(src) /obj/item/weapon/storage/box/sniperammo name = "box of 14.5mm shells" diff --git a/code/game/objects/random/random.dm b/code/game/objects/random/random.dm index 183065d3ba..5dba97befb 100644 --- a/code/game/objects/random/random.dm +++ b/code/game/objects/random/random.dm @@ -288,8 +288,8 @@ prob(2);/obj/item/ammo_magazine/m45, prob(4);/obj/item/ammo_magazine/m45/rubber, prob(4);/obj/item/ammo_magazine/m45/flash, - prob(2);/obj/item/ammo_magazine/mc9mmt, - prob(6);/obj/item/ammo_magazine/mc9mmt/rubber) + prob(2);/obj/item/ammo_magazine/m9mmt, + prob(6);/obj/item/ammo_magazine/m9mmt/rubber) /obj/random/action_figure diff --git a/code/modules/projectiles/ammunition/boxes.dm b/code/modules/projectiles/ammunition/boxes.dm index 3ee2393bbf..d4b450341c 100644 --- a/code/modules/projectiles/ammunition/boxes.dm +++ b/code/modules/projectiles/ammunition/boxes.dm @@ -18,17 +18,17 @@ icon_state = "38" caliber = "38" matter = list(DEFAULT_WALL_MATERIAL = 360) - ammo_type = /obj/item/ammo_casing/c38 + ammo_type = /obj/item/ammo_casing/a38 max_ammo = 6 multiple_sprites = 1 /obj/item/ammo_magazine/s38/rubber name = "speedloader (.38 rubber)" - ammo_type = /obj/item/ammo_casing/c38r + ammo_type = /obj/item/ammo_casing/a38r /obj/item/ammo_magazine/s38/emp name = "ammunition box (.38 haywire)" - ammo_type = /obj/item/ammo_casing/c38/emp + ammo_type = /obj/item/ammo_casing/a38/emp ///////// .45 ///////// @@ -36,7 +36,7 @@ name = "pistol magazine (.45)" icon_state = "45" mag_type = MAGAZINE - ammo_type = /obj/item/ammo_casing/c45 + ammo_type = /obj/item/ammo_casing/a45 matter = list(DEFAULT_WALL_MATERIAL = 525) //metal costs are very roughly based around 1 .45 casing = 75 metal caliber = ".45" max_ammo = 7 @@ -47,29 +47,29 @@ /obj/item/ammo_magazine/m45/rubber name = "magazine (.45 rubber)" - ammo_type = /obj/item/ammo_casing/c45r + ammo_type = /obj/item/ammo_casing/a45r /obj/item/ammo_magazine/m45/practice name = "magazine (.45 practice)" - ammo_type = /obj/item/ammo_casing/c45p + ammo_type = /obj/item/ammo_casing/a45p /obj/item/ammo_magazine/m45/flash name = "magazine (.45 flash)" - ammo_type = /obj/item/ammo_casing/c45f + ammo_type = /obj/item/ammo_casing/a45f /obj/item/ammo_magazine/m45/ap name = "magazine (.45 AP)" - ammo_type = /obj/item/ammo_casing/c45ap + ammo_type = /obj/item/ammo_casing/a45ap /obj/item/ammo_magazine/box/emp/b45 name = "ammunition box (.45 haywire)" - ammo_type = /obj/item/ammo_casing/c45/emp + ammo_type = /obj/item/ammo_casing/a45/emp /obj/item/ammo_magazine/m45uzi name = "stick magazine (.45)" icon_state = "uzi45" mag_type = MAGAZINE - ammo_type = /obj/item/ammo_casing/c45 + ammo_type = /obj/item/ammo_casing/a45 matter = list(DEFAULT_WALL_MATERIAL = 1200) caliber = ".45" max_ammo = 16 @@ -82,14 +82,14 @@ name = "tommygun magazine (.45)" icon_state = "tommy-mag" mag_type = MAGAZINE - ammo_type = /obj/item/ammo_casing/c45 + ammo_type = /obj/item/ammo_casing/a45 matter = list(DEFAULT_WALL_MATERIAL = 1500) caliber = ".45" max_ammo = 20 /obj/item/ammo_magazine/m45tommy/ap name = "tommygun magazine (.45 AP)" - ammo_type = /obj/item/ammo_casing/c45ap + ammo_type = /obj/item/ammo_casing/a45ap /obj/item/ammo_magazine/m45tommy/empty initial_ammo = 0 @@ -99,14 +99,14 @@ icon_state = "tommy-drum" w_class = ITEMSIZE_NORMAL // Bulky ammo doesn't fit in your pockets! mag_type = MAGAZINE - ammo_type = /obj/item/ammo_casing/c45 + ammo_type = /obj/item/ammo_casing/a45 matter = list(DEFAULT_WALL_MATERIAL = 3750) caliber = ".45" max_ammo = 50 /obj/item/ammo_magazine/m45tommydrum/ap name = "tommygun drum magazine (.45 AP)" - ammo_type = /obj/item/ammo_casing/c45ap + ammo_type = /obj/item/ammo_casing/a45ap /obj/item/ammo_magazine/m45tommydrum/empty initial_ammo = 0 @@ -116,86 +116,86 @@ icon_state = "clip_pistol" desc = "A stripper clip for reloading .45 rounds into magazines." caliber = ".45" - ammo_type = /obj/item/ammo_casing/c45 + ammo_type = /obj/item/ammo_casing/a45 matter = list(DEFAULT_WALL_MATERIAL = 675) // metal costs very roughly based around one .45 casing = 75 metal max_ammo = 9 multiple_sprites = 1 /obj/item/ammo_magazine/clip/c45/rubber name = "ammo clip (.45 rubber)" - ammo_type = /obj/item/ammo_casing/c45r + ammo_type = /obj/item/ammo_casing/a45r /obj/item/ammo_magazine/clip/c45/practice name = "ammo clip (.45 practice)" - ammo_type = /obj/item/ammo_casing/c45p + ammo_type = /obj/item/ammo_casing/a45p /obj/item/ammo_magazine/clip/c45/flash name = "ammo clip (.45 flash)" - ammo_type = /obj/item/ammo_casing/c45f + ammo_type = /obj/item/ammo_casing/a45f ///////// 9mm ///////// -/obj/item/ammo_magazine/mc9mm +/obj/item/ammo_magazine/m9mm name = "magazine (9mm)" icon_state = "9x19p" origin_tech = list(TECH_COMBAT = 2) mag_type = MAGAZINE matter = list(DEFAULT_WALL_MATERIAL = 480) caliber = "9mm" - ammo_type = /obj/item/ammo_casing/c9mm + ammo_type = /obj/item/ammo_casing/a9mm max_ammo = 8 multiple_sprites = 1 -/obj/item/ammo_magazine/mc9mm/empty +/obj/item/ammo_magazine/m9mm/empty initial_ammo = 0 -/obj/item/ammo_magazine/mc9mm/flash - ammo_type = /obj/item/ammo_casing/c9mmf +/obj/item/ammo_magazine/m9mm/flash + ammo_type = /obj/item/ammo_casing/a9mmf -/obj/item/ammo_magazine/mc9mm/rubber +/obj/item/ammo_magazine/m9mm/rubber name = "magazine (9mm rubber)" - ammo_type = /obj/item/ammo_casing/c9mmr + ammo_type = /obj/item/ammo_casing/a9mmr -/obj/item/ammo_magazine/mc9mm/practice +/obj/item/ammo_magazine/m9mm/practice name = "magazine (9mm practice)" - ammo_type = /obj/item/ammo_casing/c9mmp + ammo_type = /obj/item/ammo_casing/a9mmp -/obj/item/ammo_magazine/mc9mmt +/obj/item/ammo_magazine/m9mmt name = "top mounted magazine (9mm)" icon_state = "9mmt" mag_type = MAGAZINE - ammo_type = /obj/item/ammo_casing/c9mm + ammo_type = /obj/item/ammo_casing/a9mm matter = list(DEFAULT_WALL_MATERIAL = 1200) caliber = "9mm" max_ammo = 20 multiple_sprites = 1 -/obj/item/ammo_magazine/mc9mmt/empty +/obj/item/ammo_magazine/m9mmt/empty initial_ammo = 0 -/obj/item/ammo_magazine/mc9mmt/rubber +/obj/item/ammo_magazine/m9mmt/rubber name = "top mounted magazine (9mm rubber)" - ammo_type = /obj/item/ammo_casing/c9mmr + ammo_type = /obj/item/ammo_casing/a9mmr -/obj/item/ammo_magazine/mc9mmt/flash +/obj/item/ammo_magazine/m9mmt/flash name = "top mounted magazine (9mm flash)" - ammo_type = /obj/item/ammo_casing/c9mmf + ammo_type = /obj/item/ammo_casing/a9mmf -/obj/item/ammo_magazine/mc9mmt/practice +/obj/item/ammo_magazine/m9mmt/practice name = "top mounted magazine (9mm practice)" - ammo_type = /obj/item/ammo_casing/c9mmp + ammo_type = /obj/item/ammo_casing/a9mmp -/obj/item/ammo_magazine/p90 +/obj/item/ammo_magazine/m9mmp90 name = "high capacity top mounted magazine (9mm armor-piercing)" icon_state = "p90" mag_type = MAGAZINE - ammo_type = /obj/item/ammo_casing/c9mm/ap + ammo_type = /obj/item/ammo_casing/a9mm/ap matter = list(DEFAULT_WALL_MATERIAL = 3000) caliber = "9mm" max_ammo = 50 multiple_sprites = 1 -/obj/item/ammo_magazine/p90/empty +/obj/item/ammo_magazine/m9mmp90/empty initial_ammo = 0 /obj/item/ammo_magazine/clip/c9mm @@ -203,33 +203,33 @@ icon_state = "clip_pistol" desc = "A stripper clip for reloading 9mm rounds into magazines." caliber = "9mm" - ammo_type = /obj/item/ammo_casing/c9mm + ammo_type = /obj/item/ammo_casing/a9mm matter = list(DEFAULT_WALL_MATERIAL = 540) // metal costs are very roughly based around one 9mm casing = 60 metal max_ammo = 9 multiple_sprites = 1 /obj/item/ammo_magazine/clip/c9mm/rubber name = "ammo clip (.45 rubber)" - ammo_type = /obj/item/ammo_casing/c9mmr + ammo_type = /obj/item/ammo_casing/a9mmr /obj/item/ammo_magazine/clip/c9mm/practice name = "ammo clip (.45 practice)" - ammo_type = /obj/item/ammo_casing/c9mmp + ammo_type = /obj/item/ammo_casing/a9mmp /obj/item/ammo_magazine/clip/c9mm/flash name = "ammo clip (.45 flash)" - ammo_type = /obj/item/ammo_casing/c9mmf + ammo_type = /obj/item/ammo_casing/a9mmf -/obj/item/ammo_magazine/c9mm // Made by RnD for Prototype SMG and should probably be removed because why does it require DIAMONDS to make bullets? +/obj/item/ammo_magazine/box/c9mm // Made by RnD for Prototype SMG and should probably be removed because why does it require DIAMONDS to make bullets? name = "ammunition Box (9mm)" icon_state = "9mm" origin_tech = list(TECH_COMBAT = 2) matter = list(DEFAULT_WALL_MATERIAL = 1800) caliber = "9mm" - ammo_type = /obj/item/ammo_casing/c9mm + ammo_type = /obj/item/ammo_casing/a9mm max_ammo = 30 -/obj/item/ammo_magazine/c9mm/empty +/obj/item/ammo_magazine/box/c9mm/empty initial_ammo = 0 ///////// 5mm ///////// @@ -270,7 +270,7 @@ /obj/item/ammo_magazine/m10mm/empty initial_ammo = 0 -/obj/item/ammo_magazine/clip/a10mm +/obj/item/ammo_magazine/clip/c10mm name = "ammo clip (10mm)" icon_state = "clip_pistol" desc = "A stripper clip for reloading 5mm rounds into magazines." @@ -288,7 +288,7 @@ /obj/item/ammo_magazine/m556 name = "magazine (5.56mm)" - icon_state = "c5.56" + icon_state = "c5.56mid" origin_tech = list(TECH_COMBAT = 2) mag_type = MAGAZINE caliber = "a556" @@ -324,7 +324,28 @@ name = "extended magazine (5.56mm armor-piercing)" max_ammo = 30 -/obj/item/ammo_magazine/clip/a556 +/obj/item/ammo_magazine/m556/small + name = "magazine (5.56)" + icon_state = "c5.56" // This icon is named wrongly. Change later. + mag_type = MAGAZINE + caliber = "a762" + matter = list(DEFAULT_WALL_MATERIAL = 900) + ammo_type = /obj/item/ammo_casing/a762 + max_ammo = 10 + multiple_sprites = 1 + +/obj/item/ammo_magazine/m556/small/empty + initial_ammo = 0 + +/obj/item/ammo_magazine/m556/small/practice + name = "magazine (5.56mm practice)" + ammo_type = /obj/item/ammo_casing/a556p + +/obj/item/ammo_magazine/m556/small/ap + name = "magazine (7.62mm armor-piercing)" + ammo_type = /obj/item/ammo_casing/a556/ap + +/obj/item/ammo_magazine/clip/c556 name = "ammo clip (5.56mm)" icon_state = "clip_rifle" caliber = "a556" @@ -333,11 +354,11 @@ max_ammo = 5 multiple_sprites = 1 -/obj/item/ammo_magazine/clip/a556/ap +/obj/item/ammo_magazine/clip/c556/ap name = "rifle clip (5.56mm armor-piercing)" ammo_type = /obj/item/ammo_casing/a556/ap -/obj/item/ammo_magazine/clip/a556/practice +/obj/item/ammo_magazine/clip/c556/practice name = "rifle clip (5.56mm practice)" ammo_type = /obj/item/ammo_casing/a556 @@ -376,7 +397,7 @@ /obj/item/ammo_magazine/m50/empty initial_ammo = 0 -/obj/item/ammo_magazine/clip/a50 +/obj/item/ammo_magazine/clip/c50 name = "ammo clip (.50 AE)" icon_state = "clip_pistol" desc = "A stripper clip for reloading .50 Action Express rounds into magazines." @@ -405,24 +426,7 @@ /obj/item/ammo_magazine/m762/empty initial_ammo = 0 -/obj/item/ammo_magazine/s762 // 's' for small! - name = "magazine (7.62mm)" - icon_state = "SVD" - mag_type = MAGAZINE - caliber = "a762" - matter = list(DEFAULT_WALL_MATERIAL = 1000) - ammo_type = /obj/item/ammo_casing/a762 - max_ammo = 10 - multiple_sprites = 1 - -/obj/item/ammo_magazine/s762/empty - initial_ammo = 0 - -/obj/item/ammo_magazine/s762/ap - name = "magazine (7.62mm armor-piercing)" - ammo_type = /obj/item/ammo_casing/a762/ap - -/obj/item/ammo_magazine/clip/a762 +/obj/item/ammo_magazine/clip/c762 name = "ammo clip (7.62mm)" icon_state = "clip_rifle" caliber = "a762" @@ -431,39 +435,39 @@ max_ammo = 5 multiple_sprites = 1 -/obj/item/ammo_magazine/clip/a762/ap +/obj/item/ammo_magazine/clip/c762/ap name = "rifle clip (7.62mm armor-piercing)" ammo_type = /obj/item/ammo_casing/a762/ap -/obj/item/ammo_magazine/clip/a762/practice +/obj/item/ammo_magazine/clip/c762/practice name = "rifle clip (7.62mm practice)" ammo_type = /obj/item/ammo_casing/a762p ///////// 12g ///////// -/obj/item/ammo_magazine/g12 +/obj/item/ammo_magazine/m12gdrum name = "magazine (12 gauge)" icon_state = "12g" mag_type = MAGAZINE caliber = "shotgun" matter = list(DEFAULT_WALL_MATERIAL = 2200) - ammo_type = /obj/item/ammo_casing/shotgun + ammo_type = /obj/item/ammo_casing/a12g max_ammo = 24 multiple_sprites = 1 -/obj/item/ammo_magazine/g12/beanbag +/obj/item/ammo_magazine/m12gdrum/beanbag name = "magazine (12 gauge beanbag)" - ammo_type = /obj/item/ammo_casing/shotgun/beanbag + ammo_type = /obj/item/ammo_casing/a12g/beanbag -/obj/item/ammo_magazine/g12/pellet +/obj/item/ammo_magazine/m12gdrum/pellet name = "magazine (12 gauge pellet)" - ammo_type = /obj/item/ammo_casing/shotgun/pellet + ammo_type = /obj/item/ammo_casing/a12g/pellet -/obj/item/ammo_magazine/g12/flash +/obj/item/ammo_magazine/m12gdrum/flash name = "magazine (12 gauge flash)" - ammo_type = /obj/item/ammo_casing/shotgun/flash + ammo_type = /obj/item/ammo_casing/a12g/flash -/obj/item/ammo_magazine/g12/empty +/obj/item/ammo_magazine/m12gdrum/empty initial_ammo = 0 ///////// .75 Gyrojet ///////// diff --git a/code/modules/projectiles/ammunition/bullets.dm b/code/modules/projectiles/ammunition/bullets.dm index dfbd721952..aa34925cef 100644 --- a/code/modules/projectiles/ammunition/bullets.dm +++ b/code/modules/projectiles/ammunition/bullets.dm @@ -13,18 +13,18 @@ caliber = "75" projectile_type = /obj/item/projectile/bullet/gyro -/obj/item/ammo_casing/c38 +/obj/item/ammo_casing/a38 desc = "A .38 bullet casing." caliber = "38" projectile_type = /obj/item/projectile/bullet/pistol -/obj/item/ammo_casing/c38r +/obj/item/ammo_casing/a38r desc = "A .38 rubber bullet casing." caliber = "38" icon_state = "r-casing" projectile_type = /obj/item/projectile/bullet/pistol/rubber -/obj/item/ammo_casing/c38/emp +/obj/item/ammo_casing/a38/emp name = ".38 haywire round" desc = "A .38 bullet casing fitted with a single-use ion pulse generator." icon_state = "empcasing" @@ -35,28 +35,28 @@ * 9mm */ -/obj/item/ammo_casing/c9mm +/obj/item/ammo_casing/a9mm desc = "A 9mm bullet casing." caliber = "9mm" projectile_type = /obj/item/projectile/bullet/pistol -/obj/item/ammo_casing/c9mm/ap +/obj/item/ammo_casing/a9mm/ap desc = "A 9mm armor-piercing bullet casing." projectile_type = /obj/item/projectile/bullet/pistol/ap -/obj/item/ammo_casing/c9mmf +/obj/item/ammo_casing/a9mmf desc = "A 9mm flash shell casing." caliber = "9mm" icon_state = "r-casing" projectile_type = /obj/item/projectile/energy/flash -/obj/item/ammo_casing/c9mmr +/obj/item/ammo_casing/a9mmr desc = "A 9mm rubber bullet casing." caliber = "9mm" icon_state = "r-casing" projectile_type = /obj/item/projectile/bullet/pistol/rubber -/obj/item/ammo_casing/c9mmp +/obj/item/ammo_casing/a9mmp desc = "A 9mm practice bullet casing." caliber = "9mm" icon_state = "r-casing" @@ -73,43 +73,43 @@ * 45 ammo */ -/obj/item/ammo_casing/c45 +/obj/item/ammo_casing/a45 desc = "A .45 bullet casing." caliber = ".45" projectile_type = /obj/item/projectile/bullet/pistol/medium -/obj/item/ammo_casing/c45ap +/obj/item/ammo_casing/a45ap desc = "A .45 Armor-Piercing bullet casing." caliber = ".45" icon_state = "r-casing" projectile_type = /obj/item/projectile/bullet/pistol/medium/ap -/obj/item/ammo_casing/c45p +/obj/item/ammo_casing/a45p desc = "A .45 practice bullet casing." caliber = ".45" icon_state = "r-casing" projectile_type = /obj/item/projectile/bullet/pistol/practice -/obj/item/ammo_casing/c45r +/obj/item/ammo_casing/a45r desc = "A .45 rubber bullet casing." caliber = ".45" icon_state = "r-casing" projectile_type = /obj/item/projectile/bullet/pistol/rubber -/obj/item/ammo_casing/c45f +/obj/item/ammo_casing/a45f desc = "A .45 flash shell casing." caliber = ".45" icon_state = "r-casing" projectile_type = /obj/item/projectile/energy/flash -/obj/item/ammo_casing/c45/emp +/obj/item/ammo_casing/a45/emp name = ".45 haywire round" desc = "A .45 bullet casing fitted with a single-use ion pulse generator." projectile_type = /obj/item/projectile/ion/small icon_state = "empcasing" matter = list(DEFAULT_WALL_MATERIAL = 130, "uranium" = 100) -/obj/item/ammo_casing/c45/hp +/obj/item/ammo_casing/a45/hp desc = "A .45 hollow-point bullet casing." projectile_type = /obj/item/projectile/bullet/pistol/medium/hollow @@ -134,7 +134,7 @@ * Shotguns */ -/obj/item/ammo_casing/shotgun +/obj/item/ammo_casing/a12g name = "shotgun slug" desc = "A 12 gauge slug." icon_state = "slshell" @@ -142,28 +142,28 @@ projectile_type = /obj/item/projectile/bullet/shotgun matter = list(DEFAULT_WALL_MATERIAL = 360) -/obj/item/ammo_casing/shotgun/pellet +/obj/item/ammo_casing/a12g/pellet name = "shotgun shell" desc = "A 12 gauge shell." icon_state = "gshell" projectile_type = /obj/item/projectile/bullet/pellet/shotgun matter = list(DEFAULT_WALL_MATERIAL = 360) -/obj/item/ammo_casing/shotgun/blank +/obj/item/ammo_casing/a12g/blank name = "shotgun shell" desc = "A blank shell." icon_state = "blshell" projectile_type = /obj/item/projectile/bullet/blank matter = list(DEFAULT_WALL_MATERIAL = 90) -/obj/item/ammo_casing/shotgun/practice +/obj/item/ammo_casing/a12g/practice name = "shotgun shell" desc = "A practice shell." icon_state = "pshell" projectile_type = /obj/item/projectile/bullet/shotgun/practice matter = list("metal" = 90) -/obj/item/ammo_casing/shotgun/beanbag +/obj/item/ammo_casing/a12g/beanbag name = "beanbag shell" desc = "A beanbag shell." icon_state = "bshell" @@ -172,26 +172,26 @@ //Can stun in one hit if aimed at the head, but //is blocked by clothing that stops tasers and is vulnerable to EMP -/obj/item/ammo_casing/shotgun/stunshell +/obj/item/ammo_casing/a12g/stunshell name = "stun shell" desc = "A 12 gauge taser cartridge." icon_state = "stunshell" projectile_type = /obj/item/projectile/energy/electrode/stunshot matter = list(DEFAULT_WALL_MATERIAL = 360, "glass" = 720) -/obj/item/ammo_casing/shotgun/stunshell/emp_act(severity) +/obj/item/ammo_casing/a12g/stunshell/emp_act(severity) if(prob(100/severity)) BB = null update_icon() //Does not stun, only blinds, but has area of effect. -/obj/item/ammo_casing/shotgun/flash +/obj/item/ammo_casing/a12g/flash name = "flash shell" desc = "A chemical shell used to signal distress or provide illumination." icon_state = "fshell" projectile_type = /obj/item/projectile/energy/flash/flare matter = list(DEFAULT_WALL_MATERIAL = 90, "glass" = 90) -/obj/item/ammo_casing/shotgun/emp +/obj/item/ammo_casing/a12g/emp name = "ion shell" desc = "An advanced shotgun round that creates a small EMP when it strikes a target." icon_state = "empshell" diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm index 7699b8483c..373e0bff8e 100644 --- a/code/modules/projectiles/guns/projectile/automatic.dm +++ b/code/modules/projectiles/guns/projectile/automatic.dm @@ -8,7 +8,7 @@ caliber = "9mm" origin_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 2) slot_flags = SLOT_BELT - ammo_type = /obj/item/ammo_casing/c9mm + ammo_type = /obj/item/ammo_casing/a9mm multi_aim = 1 burst_delay = 2 @@ -88,11 +88,11 @@ caliber = "9mm" origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 2) slot_flags = SLOT_BELT - ammo_type = "/obj/item/ammo_casing/c9mmr" + ammo_type = "/obj/item/ammo_casing/a9mmr" fire_sound = 'sound/weapons/Gunshot_light.ogg' load_method = MAGAZINE - magazine_type = /obj/item/ammo_magazine/mc9mmt/rubber - allowed_magazines = list(/obj/item/ammo_magazine/mc9mmt) + magazine_type = /obj/item/ammo_magazine/m9mmt/rubber + allowed_magazines = list(/obj/item/ammo_magazine/m9mmt) /obj/item/weapon/gun/projectile/automatic/wt550/update_icon() ..() @@ -257,8 +257,8 @@ origin_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 1, TECH_ILLEGAL = 4) slot_flags = SLOT_BACK load_method = MAGAZINE - magazine_type = /obj/item/ammo_magazine/g12 - allowed_magazines = list(/obj/item/ammo_magazine/g12) + magazine_type = /obj/item/ammo_magazine/m12gdrum + allowed_magazines = list(/obj/item/ammo_magazine/m12gdrum) one_handed_penalty = 4 @@ -310,8 +310,8 @@ slot_flags = SLOT_BELT // ToDo: Belt sprite. fire_sound = 'sound/weapons/Gunshot_light.ogg' load_method = MAGAZINE - magazine_type = /obj/item/ammo_magazine/p90 - allowed_magazines = list(/obj/item/ammo_magazine/p90, /obj/item/ammo_magazine/mc9mmt) // ToDo: New sprite for the different mag. + magazine_type = /obj/item/ammo_magazine/m9mmp90 + allowed_magazines = list(/obj/item/ammo_magazine/m9mmp90, /obj/item/ammo_magazine/m9mmt) // ToDo: New sprite for the different mag. firemodes = list( list(mode_name="semiauto", burst=1, fire_delay=0), diff --git a/code/modules/projectiles/guns/projectile/pistol.dm b/code/modules/projectiles/guns/projectile/pistol.dm index d4f9d265f0..69fa353a52 100644 --- a/code/modules/projectiles/guns/projectile/pistol.dm +++ b/code/modules/projectiles/guns/projectile/pistol.dm @@ -196,12 +196,12 @@ origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2, TECH_ILLEGAL = 2) fire_sound = 'sound/weapons/semiauto.ogg' load_method = MAGAZINE - magazine_type = /obj/item/ammo_magazine/mc9mm - allowed_magazines = list(/obj/item/ammo_magazine/mc9mm) + magazine_type = /obj/item/ammo_magazine/m9mm + allowed_magazines = list(/obj/item/ammo_magazine/m9mm) /obj/item/weapon/gun/projectile/pistol/flash name = "holdout signal pistol" - magazine_type = /obj/item/ammo_magazine/mc9mm/flash + magazine_type = /obj/item/ammo_magazine/m9mm/flash /obj/item/weapon/gun/projectile/pistol/attack_hand(mob/living/user as mob) if(user.get_inactive_hand() == src) @@ -256,17 +256,17 @@ var/global/list/ammo_types = list( /obj/item/ammo_casing/a357 = ".357", - /obj/item/ammo_casing/c9mmf = "9mm", - /obj/item/ammo_casing/c45f = ".45", + /obj/item/ammo_casing/a9mmf = "9mm", + /obj/item/ammo_casing/a45f = ".45", /obj/item/ammo_casing/a10mm = "10mm", - /obj/item/ammo_casing/shotgun = "12 gauge", - /obj/item/ammo_casing/shotgun = "12 gauge", - /obj/item/ammo_casing/shotgun/pellet = "12 gauge", - /obj/item/ammo_casing/shotgun/pellet = "12 gauge", - /obj/item/ammo_casing/shotgun/pellet = "12 gauge", - /obj/item/ammo_casing/shotgun/beanbag = "12 gauge", - /obj/item/ammo_casing/shotgun/stunshell = "12 gauge", - /obj/item/ammo_casing/shotgun/flash = "12 gauge", + /obj/item/ammo_casing/a12g = "12 gauge", + /obj/item/ammo_casing/a12g = "12 gauge", + /obj/item/ammo_casing/a12g/pellet = "12 gauge", + /obj/item/ammo_casing/a12g/pellet = "12 gauge", + /obj/item/ammo_casing/a12g/pellet = "12 gauge", + /obj/item/ammo_casing/a12g/beanbag = "12 gauge", + /obj/item/ammo_casing/a12g/stunshell = "12 gauge", + /obj/item/ammo_casing/a12g/flash = "12 gauge", /obj/item/ammo_casing/a762 = "7.62mm", /obj/item/ammo_casing/a556 = "5.56mm" ) @@ -299,8 +299,8 @@ caliber = "9mm" load_method = MAGAZINE fire_sound = 'sound/weapons/semiauto.ogg' - magazine_type = /obj/item/ammo_magazine/mc9mm - allowed_magazines = list(/obj/item/ammo_magazine/mc9mm) + magazine_type = /obj/item/ammo_magazine/m9mm + allowed_magazines = list(/obj/item/ammo_magazine/m9mm) /obj/item/weapon/gun/projectile/luger/update_icon() ..() diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm index e7d31c0226..a92e59982c 100644 --- a/code/modules/projectiles/guns/projectile/revolver.dm +++ b/code/modules/projectiles/guns/projectile/revolver.dm @@ -46,7 +46,7 @@ caliber = "38" origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2) fire_sound = 'sound/weapons/Gunshot_light.ogg' - ammo_type = /obj/item/ammo_casing/c38 + ammo_type = /obj/item/ammo_casing/a38 /obj/item/weapon/gun/projectile/revolver/detective/verb/rename_gun() set name = "Name Gun" @@ -74,10 +74,10 @@ caliber = "38" origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2) fire_sound = 'sound/weapons/Gunshot_light.ogg' - ammo_type = /obj/item/ammo_casing/c38 + ammo_type = /obj/item/ammo_casing/a38 /obj/item/weapon/gun/projectile/revolver/deckard/emp - ammo_type = /obj/item/ammo_casing/c38/emp + ammo_type = /obj/item/ammo_casing/a38/emp /obj/item/weapon/gun/projectile/revolver/deckard/update_icon() @@ -113,7 +113,7 @@ fire_sound = 'sound/weapons/shotgun.ogg' recoil = 2 // ow my fucking hand accuracy = -1 // smooth bore + short barrel = shit accuracy - ammo_type = /obj/item/ammo_casing/shotgun + ammo_type = /obj/item/ammo_casing/a12g // ToDo: Remove accuracy debuf in exchange for slightly injuring your hand every time you fire it. /obj/item/weapon/gun/projectile/revolver/lemat @@ -125,10 +125,10 @@ handle_casings = CYCLE_CASINGS max_shells = 9 caliber = "38" - ammo_type = /obj/item/ammo_casing/c38 + ammo_type = /obj/item/ammo_casing/a38 var/secondary_max_shells = 1 var/secondary_caliber = "shotgun" - var/secondary_ammo_type = /obj/item/ammo_casing/shotgun + var/secondary_ammo_type = /obj/item/ammo_casing/a12g var/flipped_firing = 0 var/list/secondary_loaded = list() var/list/tertiary_loaded = list() diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm index 84ad0bc426..80d1a09d78 100644 --- a/code/modules/projectiles/guns/projectile/shotgun.dm +++ b/code/modules/projectiles/guns/projectile/shotgun.dm @@ -11,7 +11,7 @@ caliber = "shotgun" origin_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 2) load_method = SINGLE_CASING - ammo_type = /obj/item/ammo_casing/shotgun/beanbag + ammo_type = /obj/item/ammo_casing/a12g/beanbag handle_casings = HOLD_CASINGS fire_sound = 'sound/weapons/shotgun.ogg' var/recentpump = 0 // to prevent spammage @@ -48,7 +48,7 @@ item_state = "cshotgun" origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 2) max_shells = 7 //match the ammo box capacity, also it can hold a round in the chamber anyways, for a total of 8. - ammo_type = /obj/item/ammo_casing/shotgun + ammo_type = /obj/item/ammo_casing/a12g /obj/item/weapon/gun/projectile/shotgun/doublebarrel name = "double-barreled shotgun" @@ -66,7 +66,7 @@ slot_flags = SLOT_BACK caliber = "shotgun" origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 1) - ammo_type = /obj/item/ammo_casing/shotgun/beanbag + ammo_type = /obj/item/ammo_casing/a12g/beanbag burst_delay = 0 firemodes = list( @@ -75,12 +75,12 @@ ) /obj/item/weapon/gun/projectile/shotgun/doublebarrel/pellet - ammo_type = /obj/item/ammo_casing/shotgun/pellet + ammo_type = /obj/item/ammo_casing/a12g/pellet /obj/item/weapon/gun/projectile/shotgun/doublebarrel/flare name = "signal shotgun" desc = "A double-barreled shotgun meant to fire signal flash shells." - ammo_type = /obj/item/ammo_casing/shotgun/flash + ammo_type = /obj/item/ammo_casing/a12g/flash /obj/item/weapon/gun/projectile/shotgun/doublebarrel/unload_ammo(user, allow_dump) ..(user, allow_dump=1) @@ -115,6 +115,6 @@ icon_state = "sawnshotgun" item_state = "sawnshotgun" slot_flags = SLOT_BELT|SLOT_HOLSTER - ammo_type = /obj/item/ammo_casing/shotgun/pellet + ammo_type = /obj/item/ammo_casing/a12g/pellet w_class = ITEMSIZE_NORMAL force = 5 diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index 49678c966c..6f1add522a 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -545,7 +545,7 @@ other types of metals and chemistry for reagents). id = "ammo_9mm" req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 3) materials = list(DEFAULT_WALL_MATERIAL = 3750, "silver" = 100) - build_path = /obj/item/ammo_magazine/c9mm + build_path = /obj/item/ammo_magazine/box/c9mm sort_string = "TAACA" /datum/design/item/weapon/stunshell @@ -553,7 +553,7 @@ other types of metals and chemistry for reagents). id = "stunshell" req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3) materials = list(DEFAULT_WALL_MATERIAL = 4000) - build_path = /obj/item/ammo_casing/shotgun/stunshell + build_path = /obj/item/ammo_casing/a12g/stunshell sort_string = "TAACB" /datum/design/item/weapon/chemsprayer diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi index 0e0959705e4461fde7a7f52f77d1c71d67af7554..a120049eeadead0db24447477966a735e0dc0969 100644 GIT binary patch literal 25318 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 TG7A2G1!QJ)!LaPC>w|v-il{R| literal 25469 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 Ai2wiq diff --git a/maps/northern_star/polaris-1.dmm b/maps/northern_star/polaris-1.dmm index 2b58fe7175..09fa0e217a 100644 --- a/maps/northern_star/polaris-1.dmm +++ b/maps/northern_star/polaris-1.dmm @@ -2311,7 +2311,7 @@ "aSw" = (/obj/structure/bed/chair{dir = 1},/obj/structure/closet/walllocker/emerglocker{pixel_x = 0; pixel_y = -32},/turf/simulated/shuttle/floor,/area/shuttle/large_escape_pod2/station) "aSx" = (/turf/simulated/wall/r_wall,/area/maintenance/substation/security) "aSy" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/machinery/light/small{dir = 8},/turf/simulated/floor,/area/maintenance/security_port) -"aSz" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 2; health = 1e+006},/obj/structure/window/reinforced{dir = 8},/obj/effect/floor_decal/corner/red/full,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/machinery/door/window/brigdoor/northleft{name = "Ammo"; req_access = list(2)},/turf/simulated/floor/tiled/dark,/area/security/armoury) +"aSz" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 2; health = 1e+006},/obj/structure/window/reinforced{dir = 8},/obj/effect/floor_decal/corner/red/full,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/m45/rubber,/obj/item/ammo_magazine/m45/rubber,/obj/item/ammo_magazine/m45/rubber,/obj/item/ammo_magazine/m45/rubber,/obj/item/ammo_magazine/m45/rubber,/obj/item/ammo_magazine/m45/rubber,/obj/machinery/door/window/brigdoor/northleft{name = "Ammo"; req_access = list(2)},/turf/simulated/floor/tiled/dark,/area/security/armoury) "aSA" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/primary/central_one) "aSB" = (/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) "aSC" = (/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) @@ -5255,7 +5255,7 @@ "bXc" = (/obj/effect/floor_decal/corner/pink{dir = 10},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/structure/closet/secure_closet/personal/patient,/turf/simulated/floor/tiled/white,/area/medical/patient_b) "bXd" = (/obj/effect/floor_decal/corner/pink{dir = 10},/obj/structure/table/glass,/obj/item/weapon/paper_bin,/obj/item/weapon/clipboard,/obj/item/weapon/pen,/turf/simulated/floor/tiled/white,/area/medical/patient_b) "bXe" = (/obj/machinery/computer/med_data/laptop,/obj/structure/table/glass,/obj/effect/floor_decal/corner/pink/full{dir = 4},/obj/machinery/light,/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 21},/turf/simulated/floor/tiled/white,/area/medical/patient_b) -"bXf" = (/obj/structure/table/reinforced,/obj/machinery/light{dir = 4},/obj/item/ammo_magazine/mc9mmt/practice,/obj/item/ammo_magazine/mc9mmt/practice,/obj/item/ammo_magazine/c45m/practice,/obj/item/ammo_magazine/c45m/practice,/obj/item/ammo_magazine/c45m/practice,/obj/item/ammo_magazine/c45m/practice,/obj/item/ammo_magazine/c45m/practice,/obj/item/ammo_magazine/c45m/practice,/turf/simulated/floor/tiled,/area/security/range) +"bXf" = (/obj/structure/table/reinforced,/obj/machinery/light{dir = 4},/obj/item/ammo_magazine/mc9mmt/practice,/obj/item/ammo_magazine/mc9mmt/practice,/obj/item/ammo_magazine/m45/practice,/obj/item/ammo_magazine/m45/practice,/obj/item/ammo_magazine/m45/practice,/obj/item/ammo_magazine/m45/practice,/obj/item/ammo_magazine/m45/practice,/obj/item/ammo_magazine/m45/practice,/turf/simulated/floor/tiled,/area/security/range) "bXg" = (/obj/item/weapon/storage/box/lights/mixed,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/structure/table/steel,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green,/obj/item/device/radio{frequency = 1487; icon_state = "med_walkietalkie"; name = "Medbay Emergency Radio Link"},/turf/simulated/floor/tiled/dark,/area/medical/biostorage) "bXh" = (/obj/structure/closet/crate{icon_state = "crateopen"; name = "Grenade Crate"; opened = 1},/obj/item/weapon/grenade/chem_grenade,/obj/item/weapon/grenade/chem_grenade,/obj/item/weapon/grenade/chem_grenade,/obj/item/weapon/grenade/chem_grenade,/obj/item/device/assembly/igniter,/obj/item/device/assembly/igniter,/obj/item/device/assembly/igniter,/obj/item/device/assembly/timer,/obj/item/device/assembly/timer,/obj/item/device/assembly/timer,/turf/simulated/floor/tiled/dark,/area/medical/biostorage) "bXi" = (/obj/structure/bed/chair/comfy/brown{dir = 1},/obj/item/device/radio/intercom{broadcasting = 0; canhear_range = 5; dir = 8; frequency = 1487; icon_state = "intercom"; listening = 0; name = "Station Intercom (Medbay)"; pixel_x = -21; pixel_y = 0},/turf/simulated/floor/carpet/blue,/area/medical/psych) @@ -6167,7 +6167,7 @@ "coE" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 26},/turf/simulated/floor/tiled/dark,/area/hallway/primary/central_three) "coF" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green,/turf/simulated/floor/tiled,/area/crew_quarters/heads/hop) "coG" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/crew_quarters/sleep/elevator) -"coH" = (/obj/effect/floor_decal/corner/green/full{dir = 4},/obj/structure/window/reinforced{dir = 2; health = 1e+006},/obj/structure/window/reinforced{dir = 4},/obj/structure/table/rack,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/machinery/door/window/brigdoor/northright{name = "Ammo"},/turf/simulated/floor/tiled/dark,/area/security/tactical) +"coH" = (/obj/effect/floor_decal/corner/green/full{dir = 4},/obj/structure/window/reinforced{dir = 2; health = 1e+006},/obj/structure/window/reinforced{dir = 4},/obj/structure/table/rack,/obj/item/ammo_magazine/m45,/obj/item/ammo_magazine/m45,/obj/item/ammo_magazine/m45,/obj/item/ammo_magazine/m45,/obj/item/ammo_magazine/m45,/obj/item/ammo_magazine/m45,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/machinery/door/window/brigdoor/northright{name = "Ammo"},/turf/simulated/floor/tiled/dark,/area/security/tactical) "coI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor,/area/maintenance/medbay_aft) "coJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/maintenance/medbay_aft) "coK" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor,/area/maintenance/medbay_aft) diff --git a/maps/northern_star/polaris-2.dmm b/maps/northern_star/polaris-2.dmm index 3f14b89489..9708404aa3 100644 --- a/maps/northern_star/polaris-2.dmm +++ b/maps/northern_star/polaris-2.dmm @@ -869,11 +869,11 @@ "aqK" = (/obj/machinery/door/blast/regular{icon_state = "pdoor1"; id = "ASSAULT"; name = "Assault Weapon Storage"; p_open = 0},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "aqL" = (/obj/structure/sign/securearea,/turf/simulated/shuttle/wall/dark/hard_corner,/area/centcom/specops) "aqM" = (/obj/machinery/door/airlock/centcom,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"aqN" = (/obj/structure/table/rack,/obj/item/ammo_magazine/c762,/obj/item/ammo_magazine/c762,/obj/item/ammo_magazine/c762,/obj/item/ammo_magazine/c762,/obj/item/ammo_magazine/c762,/obj/item/ammo_magazine/c762,/obj/item/ammo_magazine/c762,/obj/item/ammo_magazine/c762,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"aqN" = (/obj/structure/table/rack,/obj/item/ammo_magazine/m762,/obj/item/ammo_magazine/m762,/obj/item/ammo_magazine/m762,/obj/item/ammo_magazine/m762,/obj/item/ammo_magazine/m762,/obj/item/ammo_magazine/m762,/obj/item/ammo_magazine/m762,/obj/item/ammo_magazine/m762,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "aqO" = (/obj/structure/table/rack,/obj/item/weapon/gun/projectile/automatic/z8,/obj/item/weapon/gun/projectile/automatic/z8,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "aqP" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/sniperrifle,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"aqQ" = (/obj/structure/table/rack,/obj/item/ammo_magazine/p90,/obj/item/ammo_magazine/p90,/obj/item/ammo_magazine/p90,/obj/item/ammo_magazine/p90,/obj/item/weapon/gun/projectile/automatic/p90,/obj/item/weapon/gun/projectile/automatic/p90,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"aqR" = (/obj/structure/table/rack,/obj/item/ammo_magazine/a556,/obj/item/ammo_magazine/a556,/obj/item/ammo_magazine/a556,/obj/item/ammo_magazine/a556,/obj/item/weapon/gun/projectile/automatic/l6_saw,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"aqQ" = (/obj/structure/table/rack,/obj/item/ammo_magazine/m9mmp90,/obj/item/ammo_magazine/m9mmp90,/obj/item/ammo_magazine/m9mmp90,/obj/item/ammo_magazine/m9mmp90,/obj/item/weapon/gun/projectile/automatic/m9mmp90,/obj/item/weapon/gun/projectile/automatic/m9mmp90,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"aqR" = (/obj/structure/table/rack,/obj/item/ammo_magazine/m556saw,/obj/item/ammo_magazine/m556saw,/obj/item/ammo_magazine/m556saw,/obj/item/ammo_magazine/m556saw,/obj/item/weapon/gun/projectile/automatic/l6_saw,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "aqS" = (/obj/effect/wingrille_spawn/reinforced/crescent,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops) "aqT" = (/obj/structure/closet/crate,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/item/weapon/storage/box,/obj/item/weapon/storage/box,/obj/item/weapon/storage/box,/obj/item/weapon/storage/box,/obj/item/weapon/storage/box,/obj/item/weapon/storage/box,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "aqU" = (/obj/machinery/autolathe{desc = "Your typical Autolathe. It appears to have much more options than your regular one, however..."; hacked = 1; name = "Unlocked Autolathe"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) @@ -896,7 +896,7 @@ "arl" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/item/weapon/storage/box/shotgunshells,/obj/item/weapon/storage/box/shotgunshells,/obj/item/weapon/storage/box/shotgunammo,/obj/item/weapon/storage/box/shotgunammo,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "arm" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/item/weapon/gun/projectile/shotgun/pump/combat,/obj/item/weapon/gun/projectile/shotgun/pump/combat,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "arn" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/item/weapon/gun/projectile/automatic/z8,/obj/item/weapon/gun/projectile/automatic/z8,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"aro" = (/obj/structure/table/rack,/obj/item/ammo_magazine/a556,/obj/item/ammo_magazine/a556,/obj/item/ammo_magazine/a556,/obj/item/ammo_magazine/a556,/obj/item/ammo_magazine/a556,/obj/item/ammo_magazine/a556,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/item/ammo_magazine/a556,/obj/item/ammo_magazine/a556,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"aro" = (/obj/structure/table/rack,/obj/item/ammo_magazine/m556saw,/obj/item/ammo_magazine/m556saw,/obj/item/ammo_magazine/m556saw,/obj/item/ammo_magazine/m556saw,/obj/item/ammo_magazine/m556saw,/obj/item/ammo_magazine/m556saw,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/item/ammo_magazine/m556saw,/obj/item/ammo_magazine/m556saw,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "arp" = (/obj/machinery/deployable/barrier,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "arq" = (/obj/structure/table/reinforced,/obj/item/device/pda/ert,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "arr" = (/obj/effect/floor_decal/corner/purple{dir = 9},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) @@ -953,7 +953,7 @@ "asq" = (/obj/structure/table/rack,/obj/item/weapon/melee/energy/sword/blue,/obj/item/weapon/melee/energy/sword/blue,/obj/item/weapon/melee/energy/sword/blue,/obj/item/weapon/melee/energy/sword/blue,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "asr" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/xray,/obj/item/weapon/gun/energy/xray,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "ass" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/laser,/obj/item/weapon/gun/energy/laser,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"ast" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/flash,/obj/item/ammo_magazine/c45m/flash,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"ast" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/item/ammo_magazine/m45/rubber,/obj/item/ammo_magazine/m45/rubber,/obj/item/ammo_magazine/m45/rubber,/obj/item/ammo_magazine/m45/rubber,/obj/item/ammo_magazine/m45/rubber,/obj/item/ammo_magazine/m45/flash,/obj/item/ammo_magazine/m45/flash,/obj/item/ammo_magazine/m45,/obj/item/ammo_magazine/m45,/obj/item/ammo_magazine/m45,/obj/item/ammo_magazine/m45,/obj/item/ammo_magazine/m45,/obj/item/ammo_magazine/m45,/obj/item/ammo_magazine/m45,/obj/item/ammo_magazine/m45,/obj/item/ammo_magazine/m45,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "asu" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/item/weapon/gun/projectile/sec,/obj/item/weapon/gun/projectile/sec,/obj/item/weapon/gun/projectile/sec,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "asv" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/belt/security/tactical,/obj/item/weapon/storage/belt/security/tactical,/obj/item/weapon/storage/belt/security/tactical,/obj/item/weapon/storage/belt/security/tactical,/obj/item/weapon/storage/belt/security/tactical,/obj/item/weapon/storage/belt/security/tactical,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "asw" = (/obj/structure/table/reinforced,/obj/item/clothing/glasses/sunglasses/sechud/tactical,/obj/item/clothing/glasses/sunglasses/sechud/tactical,/obj/item/clothing/glasses/sunglasses/sechud/tactical,/obj/item/clothing/glasses/sunglasses/sechud/tactical,/obj/item/clothing/glasses/sunglasses/sechud/tactical,/obj/item/clothing/glasses/sunglasses/sechud/tactical,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) @@ -1207,8 +1207,8 @@ "axk" = (/obj/structure/table/rack,/obj/item/device/megaphone,/obj/item/device/megaphone,/obj/item/device/megaphone,/obj/item/device/megaphone,/obj/item/device/megaphone,/obj/item/device/megaphone,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) "axl" = (/obj/structure/table/rack,/obj/item/device/flashlight/maglight,/obj/item/device/flashlight/maglight,/obj/item/device/flashlight/maglight,/obj/item/device/flashlight/maglight,/obj/item/device/flashlight/maglight,/obj/item/device/flashlight/maglight,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) "axm" = (/obj/structure/table/rack,/obj/item/device/camera_film,/obj/item/device/camera_film,/obj/item/device/camera_film,/obj/item/device/camera_film,/obj/item/device/camera_film,/obj/item/device/camera_film,/obj/item/device/camera,/obj/item/device/camera,/obj/item/device/camera,/obj/item/device/camera,/obj/item/device/camera,/obj/item/device/camera,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) -"axn" = (/obj/structure/table/rack,/obj/item/ammo_magazine/a10mm,/obj/item/ammo_magazine/a10mm,/obj/item/ammo_magazine/a10mm,/obj/item/ammo_magazine/a10mm,/obj/item/ammo_magazine/a10mm,/obj/item/ammo_magazine/a10mm,/obj/item/weapon/gun/projectile/automatic/c20r,/obj/item/weapon/gun/projectile/automatic/c20r,/obj/item/weapon/gun/projectile/automatic/c20r,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) -"axo" = (/obj/structure/table/rack,/obj/item/ammo_magazine/c762,/obj/item/ammo_magazine/c762,/obj/item/ammo_magazine/c762,/obj/item/ammo_magazine/c762,/obj/item/weapon/gun/projectile/automatic/sts35,/obj/item/weapon/gun/projectile/automatic/sts35,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) +"axn" = (/obj/structure/table/rack,/obj/item/ammo_magazine/m10mm,/obj/item/ammo_magazine/m10mm,/obj/item/ammo_magazine/m10mm,/obj/item/ammo_magazine/m10mm,/obj/item/ammo_magazine/m10mm,/obj/item/ammo_magazine/m10mm,/obj/item/weapon/gun/projectile/automatic/c20r,/obj/item/weapon/gun/projectile/automatic/c20r,/obj/item/weapon/gun/projectile/automatic/c20r,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) +"axo" = (/obj/structure/table/rack,/obj/item/ammo_magazine/m762,/obj/item/ammo_magazine/m762,/obj/item/ammo_magazine/m762,/obj/item/ammo_magazine/m762,/obj/item/weapon/gun/projectile/automatic/sts35,/obj/item/weapon/gun/projectile/automatic/sts35,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) "axp" = (/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/specops) "axq" = (/obj/machinery/vending/boozeomat,/turf/simulated/shuttle/wall/dark,/area/shuttle/administration/centcom) "axr" = (/obj/machinery/vending/coffee,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) From bc3f4fb0dc065a4a013cea728972b1a80a70b55e Mon Sep 17 00:00:00 2001 From: Spades Date: Sat, 27 May 2017 05:07:34 -0400 Subject: [PATCH 17/82] Polishing oversights away --- code/modules/projectiles/ammunition/boxes.dm | 30 ++++++++++++------ .../projectiles/guns/projectile/automatic.dm | 16 +++++----- icons/obj/ammo.dmi | Bin 25318 -> 24904 bytes icons/obj/gun.dmi | Bin 70629 -> 70811 bytes 4 files changed, 29 insertions(+), 17 deletions(-) diff --git a/code/modules/projectiles/ammunition/boxes.dm b/code/modules/projectiles/ammunition/boxes.dm index d4b450341c..a43741bbc2 100644 --- a/code/modules/projectiles/ammunition/boxes.dm +++ b/code/modules/projectiles/ammunition/boxes.dm @@ -288,7 +288,7 @@ /obj/item/ammo_magazine/m556 name = "magazine (5.56mm)" - icon_state = "c5.56mid" + icon_state = "m556" origin_tech = list(TECH_COMBAT = 2) mag_type = MAGAZINE caliber = "a556" @@ -325,14 +325,9 @@ max_ammo = 30 /obj/item/ammo_magazine/m556/small - name = "magazine (5.56)" - icon_state = "c5.56" // This icon is named wrongly. Change later. - mag_type = MAGAZINE - caliber = "a762" + icon_state = "m556-small" matter = list(DEFAULT_WALL_MATERIAL = 900) - ammo_type = /obj/item/ammo_casing/a762 max_ammo = 10 - multiple_sprites = 1 /obj/item/ammo_magazine/m556/small/empty initial_ammo = 0 @@ -342,7 +337,7 @@ ammo_type = /obj/item/ammo_casing/a556p /obj/item/ammo_magazine/m556/small/ap - name = "magazine (7.62mm armor-piercing)" + name = "magazine (5.56mm armor-piercing)" ammo_type = /obj/item/ammo_casing/a556/ap /obj/item/ammo_magazine/clip/c556 @@ -411,7 +406,7 @@ /obj/item/ammo_magazine/m762 name = "magazine (7.62mm)" - icon_state = "c7.62" + icon_state = "m762-small" mag_type = MAGAZINE caliber = "a762" matter = list(DEFAULT_WALL_MATERIAL = 2000) @@ -426,6 +421,23 @@ /obj/item/ammo_magazine/m762/empty initial_ammo = 0 +/obj/item/ammo_magazine/m762m // Intentionally not a subtype of m762 because it's supposed to be incompatible with the Z8 Bulldog rifle. + name = "magazine (7.62mm)" + icon_state = "m762" + mag_type = MAGAZINE + caliber = "a762" + matter = list(DEFAULT_WALL_MATERIAL = 4000) + ammo_type = /obj/item/ammo_casing/a762 + max_ammo = 20 + multiple_sprites = 1 + +/obj/item/ammo_magazine/m762m/ap + name = "magazine (7.62mm armor-piercing)" + ammo_type = /obj/item/ammo_casing/a762/ap + +/obj/item/ammo_magazine/m762m/empty + initial_ammo = 0 + /obj/item/ammo_magazine/clip/c762 name = "ammo clip (7.62mm)" icon_state = "clip_rifle" diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm index 373e0bff8e..a3e1f671ec 100644 --- a/code/modules/projectiles/guns/projectile/automatic.dm +++ b/code/modules/projectiles/guns/projectile/automatic.dm @@ -73,8 +73,8 @@ /obj/item/weapon/gun/projectile/automatic/sts35/update_icon(var/ignore_inhands) ..() - if(istype(ammo_magazine,/obj/item/ammo_magazine/s762)) - icon_state = "arifle-small" + if(istype(ammo_magazine,/obj/item/ammo_magazine/m556/small)) + icon_state = "arifle-small" // If using the small magazines, use the small magazine sprite. else icon_state = (ammo_magazine)? "arifle" : "arifle-empty" if(!ignore_inhands) update_held_icon() @@ -343,7 +343,7 @@ icon_state = (ammo_magazine)? "tommygun" : "tommygun-empty" // update_held_icon() -/obj/item/weapon/gun/projectile/automatic/carbine +/obj/item/weapon/gun/projectile/automatic/carbine // Admin abuse assault rifle. ToDo: Make this less shit. Maybe remove its autofire, and make it spawn with only 10 rounds at start. name = "assault carbine" desc = "The bullpup configured GP3000 is a lightweight, compact, military-grade assault rifle produced by Gurov Projectile Weapons LLC. It is sold almost exclusively to standing armies. The serial number on this one has been scratched off. Uses 5.56mm rounds." icon_state = "bullpup" @@ -354,8 +354,8 @@ origin_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 1, TECH_ILLEGAL = 4) slot_flags = SLOT_BACK load_method = MAGAZINE - magazine_type = /obj/item/ammo_magazine/m762 - allowed_magazines = list(/obj/item/ammo_magazine/m762) + magazine_type = /obj/item/ammo_magazine/m762m + allowed_magazines = list(/obj/item/ammo_magazine/m762, /obj/item/ammo_magazine/m762m) one_handed_penalty = 4 @@ -366,9 +366,9 @@ /obj/item/weapon/gun/projectile/automatic/carbine/update_icon(var/ignore_inhands) ..() - if(ammo_magazine) - icon_state = "bullpup" + if(istype(ammo_magazine,/obj/item/ammo_magazine/m762)) + icon_state = "bullpup-small" // If using the smaller magazines, use the small mag sprite. else icon_state = "bullpup-empty" item_state = (ammo_magazine)? "bullpup" : "bullpup-empty" - if(!ignore_inhands) update_held_icon() + if(!ignore_inhands) update_held_icon() \ No newline at end of file diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi index a120049eeadead0db24447477966a735e0dc0969..dcdb20e070c02b8aa3396a1095a1e030b4260674 100644 GIT binary patch literal 24904 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 NjLsUC=-+t!{{Y&mKyd&7 literal 25318 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 TG7A2G1!QJ)!LaPC>w|v-il{R| diff --git a/icons/obj/gun.dmi b/icons/obj/gun.dmi index ba02b5a3246aeea1ab6d7ecc6b814ae1b440a32c..75f5005aa5794183a1504ec505ee657b66650f9b 100644 GIT binary patch delta 33101 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
  • &c9BvAY_;y3 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 OJ9oz5^e0W*2mcNK?<%$c delta 32917 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 bUL=jFF2?MSk4A9-0)Gs3jdb#~Y=ZtTdbVTq From bb2f19fe7d3f70d0d7c05663f314acd763d154ec Mon Sep 17 00:00:00 2001 From: Spades Date: Sat, 27 May 2017 05:14:51 -0400 Subject: [PATCH 18/82] Map fixes, and a comment removal --- code/modules/projectiles/ammunition/boxes.dm | 22 -------------------- maps/northern_star/polaris-1.dmm | 6 +++--- maps/northern_star/polaris-2.dmm | 6 +++--- 3 files changed, 6 insertions(+), 28 deletions(-) diff --git a/code/modules/projectiles/ammunition/boxes.dm b/code/modules/projectiles/ammunition/boxes.dm index a43741bbc2..46c94ed1e6 100644 --- a/code/modules/projectiles/ammunition/boxes.dm +++ b/code/modules/projectiles/ammunition/boxes.dm @@ -232,28 +232,6 @@ /obj/item/ammo_magazine/box/c9mm/empty initial_ammo = 0 -///////// 5mm ///////// -/* -/obj/item/ammo_magazine/c5mm - name = "magazine (5mm)" - icon_state = "fiveseven" - mag_type = MAGAZINE - ammo_type = /obj/item/ammo_casing/c5mm - matter = list(DEFAULT_WALL_MATERIAL = 1200) - caliber = "5mm" - max_ammo = 20 - //multiple_sprites = 1 - -/obj/item/ammo_magazine/clip/c5mm - name = "ammo clip (5mm)" - icon_state = "clip_pistol" - desc = "A stripper clip for reloading 5mm rounds into magazines." - caliber = "5mm" - ammo_type = /obj/item/ammo_casing/c5mm - matter = list(DEFAULT_WALL_MATERIAL = 540) // metal costs are very roughly based around one 5mm casing = 60 metal - max_ammo = 9 - multiple_sprites = 1 -*/ ///////// 10mm ///////// /obj/item/ammo_magazine/m10mm diff --git a/maps/northern_star/polaris-1.dmm b/maps/northern_star/polaris-1.dmm index 09fa0e217a..faa4589659 100644 --- a/maps/northern_star/polaris-1.dmm +++ b/maps/northern_star/polaris-1.dmm @@ -2311,7 +2311,7 @@ "aSw" = (/obj/structure/bed/chair{dir = 1},/obj/structure/closet/walllocker/emerglocker{pixel_x = 0; pixel_y = -32},/turf/simulated/shuttle/floor,/area/shuttle/large_escape_pod2/station) "aSx" = (/turf/simulated/wall/r_wall,/area/maintenance/substation/security) "aSy" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/machinery/light/small{dir = 8},/turf/simulated/floor,/area/maintenance/security_port) -"aSz" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 2; health = 1e+006},/obj/structure/window/reinforced{dir = 8},/obj/effect/floor_decal/corner/red/full,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/m45/rubber,/obj/item/ammo_magazine/m45/rubber,/obj/item/ammo_magazine/m45/rubber,/obj/item/ammo_magazine/m45/rubber,/obj/item/ammo_magazine/m45/rubber,/obj/item/ammo_magazine/m45/rubber,/obj/machinery/door/window/brigdoor/northleft{name = "Ammo"; req_access = list(2)},/turf/simulated/floor/tiled/dark,/area/security/armoury) +"aSz" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 2; health = 1e+006},/obj/structure/window/reinforced{dir = 8},/obj/effect/floor_decal/corner/red/full,/obj/item/ammo_magazine/m9mmt/rubber,/obj/item/ammo_magazine/m9mmt/rubber,/obj/item/ammo_magazine/m9mmt/rubber,/obj/item/ammo_magazine/m45/rubber,/obj/item/ammo_magazine/m45/rubber,/obj/item/ammo_magazine/m45/rubber,/obj/item/ammo_magazine/m45/rubber,/obj/item/ammo_magazine/m45/rubber,/obj/item/ammo_magazine/m45/rubber,/obj/machinery/door/window/brigdoor/northleft{name = "Ammo"; req_access = list(2)},/turf/simulated/floor/tiled/dark,/area/security/armoury) "aSA" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/primary/central_one) "aSB" = (/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) "aSC" = (/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) @@ -5255,7 +5255,7 @@ "bXc" = (/obj/effect/floor_decal/corner/pink{dir = 10},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/structure/closet/secure_closet/personal/patient,/turf/simulated/floor/tiled/white,/area/medical/patient_b) "bXd" = (/obj/effect/floor_decal/corner/pink{dir = 10},/obj/structure/table/glass,/obj/item/weapon/paper_bin,/obj/item/weapon/clipboard,/obj/item/weapon/pen,/turf/simulated/floor/tiled/white,/area/medical/patient_b) "bXe" = (/obj/machinery/computer/med_data/laptop,/obj/structure/table/glass,/obj/effect/floor_decal/corner/pink/full{dir = 4},/obj/machinery/light,/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 21},/turf/simulated/floor/tiled/white,/area/medical/patient_b) -"bXf" = (/obj/structure/table/reinforced,/obj/machinery/light{dir = 4},/obj/item/ammo_magazine/mc9mmt/practice,/obj/item/ammo_magazine/mc9mmt/practice,/obj/item/ammo_magazine/m45/practice,/obj/item/ammo_magazine/m45/practice,/obj/item/ammo_magazine/m45/practice,/obj/item/ammo_magazine/m45/practice,/obj/item/ammo_magazine/m45/practice,/obj/item/ammo_magazine/m45/practice,/turf/simulated/floor/tiled,/area/security/range) +"bXf" = (/obj/structure/table/reinforced,/obj/machinery/light{dir = 4},/obj/item/ammo_magazine/m9mmt/practice,/obj/item/ammo_magazine/m9mmt/practice,/obj/item/ammo_magazine/m45/practice,/obj/item/ammo_magazine/m45/practice,/obj/item/ammo_magazine/m45/practice,/obj/item/ammo_magazine/m45/practice,/obj/item/ammo_magazine/m45/practice,/obj/item/ammo_magazine/m45/practice,/turf/simulated/floor/tiled,/area/security/range) "bXg" = (/obj/item/weapon/storage/box/lights/mixed,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/structure/table/steel,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green,/obj/item/device/radio{frequency = 1487; icon_state = "med_walkietalkie"; name = "Medbay Emergency Radio Link"},/turf/simulated/floor/tiled/dark,/area/medical/biostorage) "bXh" = (/obj/structure/closet/crate{icon_state = "crateopen"; name = "Grenade Crate"; opened = 1},/obj/item/weapon/grenade/chem_grenade,/obj/item/weapon/grenade/chem_grenade,/obj/item/weapon/grenade/chem_grenade,/obj/item/weapon/grenade/chem_grenade,/obj/item/device/assembly/igniter,/obj/item/device/assembly/igniter,/obj/item/device/assembly/igniter,/obj/item/device/assembly/timer,/obj/item/device/assembly/timer,/obj/item/device/assembly/timer,/turf/simulated/floor/tiled/dark,/area/medical/biostorage) "bXi" = (/obj/structure/bed/chair/comfy/brown{dir = 1},/obj/item/device/radio/intercom{broadcasting = 0; canhear_range = 5; dir = 8; frequency = 1487; icon_state = "intercom"; listening = 0; name = "Station Intercom (Medbay)"; pixel_x = -21; pixel_y = 0},/turf/simulated/floor/carpet/blue,/area/medical/psych) @@ -6167,7 +6167,7 @@ "coE" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 26},/turf/simulated/floor/tiled/dark,/area/hallway/primary/central_three) "coF" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green,/turf/simulated/floor/tiled,/area/crew_quarters/heads/hop) "coG" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/crew_quarters/sleep/elevator) -"coH" = (/obj/effect/floor_decal/corner/green/full{dir = 4},/obj/structure/window/reinforced{dir = 2; health = 1e+006},/obj/structure/window/reinforced{dir = 4},/obj/structure/table/rack,/obj/item/ammo_magazine/m45,/obj/item/ammo_magazine/m45,/obj/item/ammo_magazine/m45,/obj/item/ammo_magazine/m45,/obj/item/ammo_magazine/m45,/obj/item/ammo_magazine/m45,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/machinery/door/window/brigdoor/northright{name = "Ammo"},/turf/simulated/floor/tiled/dark,/area/security/tactical) +"coH" = (/obj/effect/floor_decal/corner/green/full{dir = 4},/obj/structure/window/reinforced{dir = 2; health = 1e+006},/obj/structure/window/reinforced{dir = 4},/obj/structure/table/rack,/obj/item/ammo_magazine/m45,/obj/item/ammo_magazine/m45,/obj/item/ammo_magazine/m45,/obj/item/ammo_magazine/m45,/obj/item/ammo_magazine/m45,/obj/item/ammo_magazine/m45,/obj/item/ammo_magazine/m9mmt,/obj/item/ammo_magazine/m9mmt,/obj/item/ammo_magazine/m9mmt,/obj/machinery/door/window/brigdoor/northright{name = "Ammo"},/turf/simulated/floor/tiled/dark,/area/security/tactical) "coI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor,/area/maintenance/medbay_aft) "coJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/maintenance/medbay_aft) "coK" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor,/area/maintenance/medbay_aft) diff --git a/maps/northern_star/polaris-2.dmm b/maps/northern_star/polaris-2.dmm index 9708404aa3..edead8f198 100644 --- a/maps/northern_star/polaris-2.dmm +++ b/maps/northern_star/polaris-2.dmm @@ -859,7 +859,7 @@ "aqA" = (/obj/structure/table/rack,/obj/item/weapon/plastique,/obj/item/weapon/plastique,/obj/item/weapon/plastique,/obj/item/weapon/plastique,/obj/item/weapon/plastique,/obj/item/weapon/plastique,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "aqB" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/gun/energy/ionrifle,/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "aqC" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/table/rack,/obj/item/weapon/gun/projectile/automatic/wt550,/obj/item/weapon/gun/projectile/automatic/wt550,/obj/item/weapon/gun/projectile/automatic/wt550,/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"aqD" = (/obj/structure/table/rack,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"aqD" = (/obj/structure/table/rack,/obj/item/ammo_magazine/m9mmt,/obj/item/ammo_magazine/m9mmt,/obj/item/ammo_magazine/m9mmt,/obj/item/ammo_magazine/m9mmt,/obj/item/ammo_magazine/m9mmt,/obj/item/ammo_magazine/m9mmt,/obj/item/ammo_magazine/m9mmt,/obj/item/ammo_magazine/m9mmt,/obj/item/ammo_magazine/m9mmt,/obj/item/ammo_magazine/m9mmt/rubber,/obj/item/ammo_magazine/m9mmt/rubber,/obj/item/ammo_magazine/m9mmt/rubber,/obj/item/ammo_magazine/m9mmt/rubber,/obj/item/ammo_magazine/m9mmt/rubber,/obj/item/ammo_magazine/m9mmt/rubber,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "aqE" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 8},/obj/item/weapon/gun/launcher/grenade,/obj/item/weapon/gun/launcher/grenade,/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "aqF" = (/obj/structure/table/rack,/obj/item/weapon/storage/box/flashbangs,/obj/item/weapon/storage/box/flashbangs,/obj/item/weapon/storage/box/emps{pixel_x = 4; pixel_y = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/storage/box/frags,/obj/item/weapon/storage/box/smokes,/obj/item/weapon/storage/box/smokes,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "aqG" = (/obj/machinery/vending/security,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) @@ -872,7 +872,7 @@ "aqN" = (/obj/structure/table/rack,/obj/item/ammo_magazine/m762,/obj/item/ammo_magazine/m762,/obj/item/ammo_magazine/m762,/obj/item/ammo_magazine/m762,/obj/item/ammo_magazine/m762,/obj/item/ammo_magazine/m762,/obj/item/ammo_magazine/m762,/obj/item/ammo_magazine/m762,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "aqO" = (/obj/structure/table/rack,/obj/item/weapon/gun/projectile/automatic/z8,/obj/item/weapon/gun/projectile/automatic/z8,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "aqP" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/sniperrifle,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"aqQ" = (/obj/structure/table/rack,/obj/item/ammo_magazine/m9mmp90,/obj/item/ammo_magazine/m9mmp90,/obj/item/ammo_magazine/m9mmp90,/obj/item/ammo_magazine/m9mmp90,/obj/item/weapon/gun/projectile/automatic/m9mmp90,/obj/item/weapon/gun/projectile/automatic/m9mmp90,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"aqQ" = (/obj/structure/table/rack,/obj/item/ammo_magazine/m9mmp90,/obj/item/ammo_magazine/m9mmp90,/obj/item/ammo_magazine/m9mmp90,/obj/item/ammo_magazine/m9mmp90,/obj/item/weapon/gun/projectile/automatic/p90,/obj/item/weapon/gun/projectile/automatic/p90,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "aqR" = (/obj/structure/table/rack,/obj/item/ammo_magazine/m556saw,/obj/item/ammo_magazine/m556saw,/obj/item/ammo_magazine/m556saw,/obj/item/ammo_magazine/m556saw,/obj/item/weapon/gun/projectile/automatic/l6_saw,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "aqS" = (/obj/effect/wingrille_spawn/reinforced/crescent,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops) "aqT" = (/obj/structure/closet/crate,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/item/weapon/storage/box,/obj/item/weapon/storage/box,/obj/item/weapon/storage/box,/obj/item/weapon/storage/box,/obj/item/weapon/storage/box,/obj/item/weapon/storage/box,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) @@ -1179,7 +1179,7 @@ "awI" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/shuttle/floor/darkred,/area/syndicate_station/start) "awJ" = (/obj/structure/bed/chair{dir = 4},/obj/machinery/light{dir = 1},/turf/simulated/shuttle/floor/darkred,/area/syndicate_station/start) "awK" = (/obj/structure/closet/hydrant{pixel_y = 32},/turf/simulated/shuttle/floor/darkred,/area/syndicate_station/start) -"awL" = (/obj/structure/table/rack,/obj/item/weapon/storage/belt/security,/obj/item/weapon/storage/belt/security,/obj/item/ammo_magazine/mc9mm/flash,/obj/item/weapon/gun/projectile/pistol/flash,/turf/simulated/shuttle/floor/darkred,/area/syndicate_station/start) +"awL" = (/obj/structure/table/rack,/obj/item/weapon/storage/belt/security,/obj/item/weapon/storage/belt/security,/obj/item/ammo_magazine/m9mm/flash,/obj/item/weapon/gun/projectile/pistol/flash,/turf/simulated/shuttle/floor/darkred,/area/syndicate_station/start) "awM" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/syndicate_mothership) "awN" = (/obj/machinery/door/airlock/centcom{name = "Bathroom"; opacity = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership) "awO" = (/obj/machinery/shower{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership) From 48f668de9509e3668c844979d1be70fe0bf3824c Mon Sep 17 00:00:00 2001 From: Bromuzl Date: Sat, 27 May 2017 04:38:15 -0500 Subject: [PATCH 19/82] Adds ported high-tops to loadout Extends the high-top port to load-outs, --- .../preference_setup/loadout/loadout_shoes.dm | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/code/modules/client/preference_setup/loadout/loadout_shoes.dm b/code/modules/client/preference_setup/loadout/loadout_shoes.dm index 4de90fed9f..3b3e528403 100644 --- a/code/modules/client/preference_setup/loadout/loadout_shoes.dm +++ b/code/modules/client/preference_setup/loadout/loadout_shoes.dm @@ -77,6 +77,38 @@ display_name = "flats, black" path = /obj/item/clothing/shoes/flats +/datum/gear/shoes/hitops/ + display_name = "high-top, white" + path = /obj/item/clothing/shoes/hitops/ + +/datum/gear/shoes/hitops/red + display_name = "high-top, red" + path = /obj/item/clothing/shoes/hitops/red + +/datum/gear/shoes/hitops/black + display_name = "high-top, black" + path = /obj/item/clothing/shoes/hitops/black + +/datum/gear/shoes/hitops/orange + display_name = "high-top, orange" + path = /obj/item/clothing/shoes/hitops/orange + +/datum/gear/shoes/hitops/blue + display_name = "high-top, blue" + path = /obj/item/clothing/shoes/hitops/blue + +/datum/gear/shoes/hitops/green + display_name = "high-top, green" + path = /obj/item/clothing/shoes/hitops/green + +/datum/gear/shoes/hitops/purple + display_name = "high-top, purple" + path = /obj/item/clothing/shoes/hitops/purple + +/datum/gear/shoes/hitops/yellow + display_name = "high-top, yellow" + path = /obj/item/clothing/shoes/hitops/yellow + /datum/gear/shoes/flats/blue display_name = "flats, blue" path = /obj/item/clothing/shoes/flats/blue From cfab9dd6ac1a41ece3ffe8d7454d37b9936e7140 Mon Sep 17 00:00:00 2001 From: Bromuzl Date: Sat, 27 May 2017 04:46:20 -0500 Subject: [PATCH 20/82] High-top consistency tweak Adjusts background all references to "hitop" and in-game references to "high-tops" to maintain consistency. See icons/obj/clothing/shoes.dmi --- code/modules/clothing/shoes/colour.dm | 36 +++++++++++++-------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/code/modules/clothing/shoes/colour.dm b/code/modules/clothing/shoes/colour.dm index 91703336e1..6b4b270f97 100644 --- a/code/modules/clothing/shoes/colour.dm +++ b/code/modules/clothing/shoes/colour.dm @@ -123,39 +123,39 @@ if (istype(H, /obj/item/weapon/handcuffs)) attach_cuffs(H, user) -/obj/item/clothing/shoes/hightops - name = "white high tops" +/obj/item/clothing/shoes/hitops + name = "white high-tops" desc = "A pair of shoes that extends past the ankle. Based on a centuries-old, timeless design." icon_state = "whitehi" -/obj/item/clothing/shoes/hightops/red - name = "red high tops" +/obj/item/clothing/shoes/hitops/red + name = "red high-tops" icon_state = "redhi" -/obj/item/clothing/shoes/hightops/brown - name = "brown high tops" +/obj/item/clothing/shoes/hitops/brown + name = "brown high-tops" icon_state = "brownhi" -/obj/item/clothing/shoes/hightops/black - name = "black high tops" +/obj/item/clothing/shoes/hitops/black + name = "black high-tops" icon_state = "blackhi" -/obj/item/clothing/shoes/hightops/orange - name = "orange high tops" +/obj/item/clothing/shoes/hitops/orange + name = "orange high-tops" icon_state = "orangehi" -/obj/item/clothing/shoes/hightops/blue - name = "blue high tops" +/obj/item/clothing/shoes/hitops/blue + name = "blue high-tops" icon_state = "bluehi" -/obj/item/clothing/shoes/hightops/green - name = "green high tops" +/obj/item/clothing/shoes/hitops/green + name = "green high-tops" icon_state = "greenhi" -/obj/item/clothing/shoes/hightops/purple - name = "purple high tops" +/obj/item/clothing/shoes/hitops/purple + name = "purple high-tops" icon_state = "purplehi" -/obj/item/clothing/shoes/hightops/yellow - name = "yellow high tops" +/obj/item/clothing/shoes/hitops/yellow + name = "yellow high-tops" icon_state = "yellowhi" \ No newline at end of file From 36544bc7daf51665d676e9d93e0246975ed1fca2 Mon Sep 17 00:00:00 2001 From: Spades Date: Sat, 27 May 2017 16:23:39 -0400 Subject: [PATCH 21/82] Documentation, proper file naming, and more consistency --- .../ammunition/{boxes.dm => magazines.dm} | 995 +++++++++--------- .../ammunition/{bullets.dm => rounds.dm} | 610 ++++++----- .../projectiles/guns/projectile/automatic.dm | 2 +- .../projectiles/guns/projectile/revolver.dm | 4 +- .../projectiles/guns/projectile/shotgun.dm | 4 +- polaris.dme | 4 +- 6 files changed, 836 insertions(+), 783 deletions(-) rename code/modules/projectiles/ammunition/{boxes.dm => magazines.dm} (90%) rename code/modules/projectiles/ammunition/{bullets.dm => rounds.dm} (85%) diff --git a/code/modules/projectiles/ammunition/boxes.dm b/code/modules/projectiles/ammunition/magazines.dm similarity index 90% rename from code/modules/projectiles/ammunition/boxes.dm rename to code/modules/projectiles/ammunition/magazines.dm index 46c94ed1e6..92512b0dd1 100644 --- a/code/modules/projectiles/ammunition/boxes.dm +++ b/code/modules/projectiles/ammunition/magazines.dm @@ -1,487 +1,510 @@ -///////// .357 ///////// - -/obj/item/ammo_magazine/s357 - name = "speedloader (.357)" - desc = "A speedloader for .357 revolvers." - icon_state = "38" - caliber = "357" - ammo_type = /obj/item/ammo_casing/a357 - matter = list(DEFAULT_WALL_MATERIAL = 1260) - max_ammo = 6 - multiple_sprites = 1 - -///////// .38 ///////// - -/obj/item/ammo_magazine/s38 - name = "speedloader (.38)" - desc = "A speedloader for .38 revolvers." - icon_state = "38" - caliber = "38" - matter = list(DEFAULT_WALL_MATERIAL = 360) - ammo_type = /obj/item/ammo_casing/a38 - max_ammo = 6 - multiple_sprites = 1 - -/obj/item/ammo_magazine/s38/rubber - name = "speedloader (.38 rubber)" - ammo_type = /obj/item/ammo_casing/a38r - -/obj/item/ammo_magazine/s38/emp - name = "ammunition box (.38 haywire)" - ammo_type = /obj/item/ammo_casing/a38/emp - -///////// .45 ///////// - -/obj/item/ammo_magazine/m45 - name = "pistol magazine (.45)" - icon_state = "45" - mag_type = MAGAZINE - ammo_type = /obj/item/ammo_casing/a45 - matter = list(DEFAULT_WALL_MATERIAL = 525) //metal costs are very roughly based around 1 .45 casing = 75 metal - caliber = ".45" - max_ammo = 7 - multiple_sprites = 1 - -/obj/item/ammo_magazine/m45/empty - initial_ammo = 0 - -/obj/item/ammo_magazine/m45/rubber - name = "magazine (.45 rubber)" - ammo_type = /obj/item/ammo_casing/a45r - -/obj/item/ammo_magazine/m45/practice - name = "magazine (.45 practice)" - ammo_type = /obj/item/ammo_casing/a45p - -/obj/item/ammo_magazine/m45/flash - name = "magazine (.45 flash)" - ammo_type = /obj/item/ammo_casing/a45f - -/obj/item/ammo_magazine/m45/ap - name = "magazine (.45 AP)" - ammo_type = /obj/item/ammo_casing/a45ap - -/obj/item/ammo_magazine/box/emp/b45 - name = "ammunition box (.45 haywire)" - ammo_type = /obj/item/ammo_casing/a45/emp - -/obj/item/ammo_magazine/m45uzi - name = "stick magazine (.45)" - icon_state = "uzi45" - mag_type = MAGAZINE - ammo_type = /obj/item/ammo_casing/a45 - matter = list(DEFAULT_WALL_MATERIAL = 1200) - caliber = ".45" - max_ammo = 16 - multiple_sprites = 1 - -/obj/item/ammo_magazine/m45uzi/empty - initial_ammo = 0 - -/obj/item/ammo_magazine/m45tommy - name = "tommygun magazine (.45)" - icon_state = "tommy-mag" - mag_type = MAGAZINE - ammo_type = /obj/item/ammo_casing/a45 - matter = list(DEFAULT_WALL_MATERIAL = 1500) - caliber = ".45" - max_ammo = 20 - -/obj/item/ammo_magazine/m45tommy/ap - name = "tommygun magazine (.45 AP)" - ammo_type = /obj/item/ammo_casing/a45ap - -/obj/item/ammo_magazine/m45tommy/empty - initial_ammo = 0 - -/obj/item/ammo_magazine/m45tommydrum - name = "tommygun drum magazine (.45)" - icon_state = "tommy-drum" - w_class = ITEMSIZE_NORMAL // Bulky ammo doesn't fit in your pockets! - mag_type = MAGAZINE - ammo_type = /obj/item/ammo_casing/a45 - matter = list(DEFAULT_WALL_MATERIAL = 3750) - caliber = ".45" - max_ammo = 50 - -/obj/item/ammo_magazine/m45tommydrum/ap - name = "tommygun drum magazine (.45 AP)" - ammo_type = /obj/item/ammo_casing/a45ap - -/obj/item/ammo_magazine/m45tommydrum/empty - initial_ammo = 0 - -/obj/item/ammo_magazine/clip/c45 - name = "ammo clip (.45)" - icon_state = "clip_pistol" - desc = "A stripper clip for reloading .45 rounds into magazines." - caliber = ".45" - ammo_type = /obj/item/ammo_casing/a45 - matter = list(DEFAULT_WALL_MATERIAL = 675) // metal costs very roughly based around one .45 casing = 75 metal - max_ammo = 9 - multiple_sprites = 1 - -/obj/item/ammo_magazine/clip/c45/rubber - name = "ammo clip (.45 rubber)" - ammo_type = /obj/item/ammo_casing/a45r - -/obj/item/ammo_magazine/clip/c45/practice - name = "ammo clip (.45 practice)" - ammo_type = /obj/item/ammo_casing/a45p - -/obj/item/ammo_magazine/clip/c45/flash - name = "ammo clip (.45 flash)" - ammo_type = /obj/item/ammo_casing/a45f - -///////// 9mm ///////// - -/obj/item/ammo_magazine/m9mm - name = "magazine (9mm)" - icon_state = "9x19p" - origin_tech = list(TECH_COMBAT = 2) - mag_type = MAGAZINE - matter = list(DEFAULT_WALL_MATERIAL = 480) - caliber = "9mm" - ammo_type = /obj/item/ammo_casing/a9mm - max_ammo = 8 - multiple_sprites = 1 - -/obj/item/ammo_magazine/m9mm/empty - initial_ammo = 0 - -/obj/item/ammo_magazine/m9mm/flash - ammo_type = /obj/item/ammo_casing/a9mmf - -/obj/item/ammo_magazine/m9mm/rubber - name = "magazine (9mm rubber)" - ammo_type = /obj/item/ammo_casing/a9mmr - -/obj/item/ammo_magazine/m9mm/practice - name = "magazine (9mm practice)" - ammo_type = /obj/item/ammo_casing/a9mmp - -/obj/item/ammo_magazine/m9mmt - name = "top mounted magazine (9mm)" - icon_state = "9mmt" - mag_type = MAGAZINE - ammo_type = /obj/item/ammo_casing/a9mm - matter = list(DEFAULT_WALL_MATERIAL = 1200) - caliber = "9mm" - max_ammo = 20 - multiple_sprites = 1 - -/obj/item/ammo_magazine/m9mmt/empty - initial_ammo = 0 - -/obj/item/ammo_magazine/m9mmt/rubber - name = "top mounted magazine (9mm rubber)" - ammo_type = /obj/item/ammo_casing/a9mmr - -/obj/item/ammo_magazine/m9mmt/flash - name = "top mounted magazine (9mm flash)" - ammo_type = /obj/item/ammo_casing/a9mmf - -/obj/item/ammo_magazine/m9mmt/practice - name = "top mounted magazine (9mm practice)" - ammo_type = /obj/item/ammo_casing/a9mmp - -/obj/item/ammo_magazine/m9mmp90 - name = "high capacity top mounted magazine (9mm armor-piercing)" - icon_state = "p90" - mag_type = MAGAZINE - ammo_type = /obj/item/ammo_casing/a9mm/ap - matter = list(DEFAULT_WALL_MATERIAL = 3000) - caliber = "9mm" - max_ammo = 50 - multiple_sprites = 1 - -/obj/item/ammo_magazine/m9mmp90/empty - initial_ammo = 0 - -/obj/item/ammo_magazine/clip/c9mm - name = "ammo clip (9mm)" - icon_state = "clip_pistol" - desc = "A stripper clip for reloading 9mm rounds into magazines." - caliber = "9mm" - ammo_type = /obj/item/ammo_casing/a9mm - matter = list(DEFAULT_WALL_MATERIAL = 540) // metal costs are very roughly based around one 9mm casing = 60 metal - max_ammo = 9 - multiple_sprites = 1 - -/obj/item/ammo_magazine/clip/c9mm/rubber - name = "ammo clip (.45 rubber)" - ammo_type = /obj/item/ammo_casing/a9mmr - -/obj/item/ammo_magazine/clip/c9mm/practice - name = "ammo clip (.45 practice)" - ammo_type = /obj/item/ammo_casing/a9mmp - -/obj/item/ammo_magazine/clip/c9mm/flash - name = "ammo clip (.45 flash)" - ammo_type = /obj/item/ammo_casing/a9mmf - -/obj/item/ammo_magazine/box/c9mm // Made by RnD for Prototype SMG and should probably be removed because why does it require DIAMONDS to make bullets? - name = "ammunition Box (9mm)" - icon_state = "9mm" - origin_tech = list(TECH_COMBAT = 2) - matter = list(DEFAULT_WALL_MATERIAL = 1800) - caliber = "9mm" - ammo_type = /obj/item/ammo_casing/a9mm - max_ammo = 30 - -/obj/item/ammo_magazine/box/c9mm/empty - initial_ammo = 0 - -///////// 10mm ///////// - -/obj/item/ammo_magazine/m10mm - name = "magazine (10mm)" - icon_state = "10mm" - origin_tech = list(TECH_COMBAT = 2) - mag_type = MAGAZINE - caliber = "10mm" - matter = list(DEFAULT_WALL_MATERIAL = 1500) - ammo_type = /obj/item/ammo_casing/a10mm - max_ammo = 20 - multiple_sprites = 1 - -/obj/item/ammo_magazine/m10mm/empty - initial_ammo = 0 - -/obj/item/ammo_magazine/clip/c10mm - name = "ammo clip (10mm)" - icon_state = "clip_pistol" - desc = "A stripper clip for reloading 5mm rounds into magazines." - caliber = "10mm" - ammo_type = /obj/item/ammo_casing/a10mm - matter = list(DEFAULT_WALL_MATERIAL = 675) // metal costs are very roughly based around one 10mm casing = 75 metal - max_ammo = 9 - multiple_sprites = 1 - -/obj/item/ammo_magazine/box/emp/b10 - name = "ammunition box (10mm haywire)" - ammo_type = /obj/item/ammo_casing/a10mm/emp - -///////// 5.56mm ///////// - -/obj/item/ammo_magazine/m556 - name = "magazine (5.56mm)" - icon_state = "m556" - origin_tech = list(TECH_COMBAT = 2) - mag_type = MAGAZINE - caliber = "a556" - matter = list(DEFAULT_WALL_MATERIAL = 1800) - ammo_type = /obj/item/ammo_casing/a556 - max_ammo = 20 - multiple_sprites = 1 - -/obj/item/ammo_magazine/m556/ext - name = "extended magazine (5.56mm)" - matter = list(DEFAULT_WALL_MATERIAL = 2700) - max_ammo = 30 - -/obj/item/ammo_magazine/m556/empty - initial_ammo = 0 - -/obj/item/ammo_magazine/m556/ext/empty - initial_ammo = 0 - -/obj/item/ammo_magazine/m556/practice - name = "magazine (5.56mm practice)" - ammo_type = /obj/item/ammo_casing/a556p - -/obj/item/ammo_magazine/m556/practice/ext - name = "extended magazine (5.56mm practice)" - max_ammo = 30 - -/obj/item/ammo_magazine/m556/ap - name = "magazine (5.56mm armor-piercing)" - ammo_type = /obj/item/ammo_casing/a556/ap - -/obj/item/ammo_magazine/m556/ap/ext - name = "extended magazine (5.56mm armor-piercing)" - max_ammo = 30 - -/obj/item/ammo_magazine/m556/small - icon_state = "m556-small" - matter = list(DEFAULT_WALL_MATERIAL = 900) - max_ammo = 10 - -/obj/item/ammo_magazine/m556/small/empty - initial_ammo = 0 - -/obj/item/ammo_magazine/m556/small/practice - name = "magazine (5.56mm practice)" - ammo_type = /obj/item/ammo_casing/a556p - -/obj/item/ammo_magazine/m556/small/ap - name = "magazine (5.56mm armor-piercing)" - ammo_type = /obj/item/ammo_casing/a556/ap - -/obj/item/ammo_magazine/clip/c556 - name = "ammo clip (5.56mm)" - icon_state = "clip_rifle" - caliber = "a556" - ammo_type = /obj/item/ammo_casing/a556 - matter = list(DEFAULT_WALL_MATERIAL = 450) // metal costs are very roughly based around one 10mm casing = 180 metal - max_ammo = 5 - multiple_sprites = 1 - -/obj/item/ammo_magazine/clip/c556/ap - name = "rifle clip (5.56mm armor-piercing)" - ammo_type = /obj/item/ammo_casing/a556/ap - -/obj/item/ammo_magazine/clip/c556/practice - name = "rifle clip (5.56mm practice)" - ammo_type = /obj/item/ammo_casing/a556 - -/obj/item/ammo_magazine/m556saw - name = "magazine box (5.56mm)" - icon_state = "a556" - origin_tech = list(TECH_COMBAT = 2) - mag_type = MAGAZINE - caliber = "a556" - matter = list(DEFAULT_WALL_MATERIAL = 10000) - ammo_type = /obj/item/ammo_casing/a556 - w_class = ITEMSIZE_NORMAL // This should NOT fit in your pocket!! - max_ammo = 50 - multiple_sprites = 1 - -/obj/item/ammo_magazine/m556saw/ap - name = "magazine box (5.56mm armor-piercing)" - ammo_type = /obj/item/ammo_casing/a556/ap - -/obj/item/ammo_magazine/m556saw/empty - initial_ammo = 0 - -///////// .50 AE ///////// - -/obj/item/ammo_magazine/m50 - name = "magazine (.50 AE)" - icon_state = "50ae" - origin_tech = list(TECH_COMBAT = 2) - mag_type = MAGAZINE - caliber = ".50" - matter = list(DEFAULT_WALL_MATERIAL = 1260) - ammo_type = /obj/item/ammo_casing/a50 - max_ammo = 7 - multiple_sprites = 1 - -/obj/item/ammo_magazine/m50/empty - initial_ammo = 0 - -/obj/item/ammo_magazine/clip/c50 - name = "ammo clip (.50 AE)" - icon_state = "clip_pistol" - desc = "A stripper clip for reloading .50 Action Express rounds into magazines." - caliber = ".50" - ammo_type = /obj/item/ammo_casing/a50 - matter = list(DEFAULT_WALL_MATERIAL = 1620) // metal costs are very roughly based around one .50 casing = 180 metal - max_ammo = 9 - multiple_sprites = 1 - -///////// 7.62mm ///////// - -/obj/item/ammo_magazine/m762 - name = "magazine (7.62mm)" - icon_state = "m762-small" - mag_type = MAGAZINE - caliber = "a762" - matter = list(DEFAULT_WALL_MATERIAL = 2000) - ammo_type = /obj/item/ammo_casing/a762 - max_ammo = 10 - multiple_sprites = 1 - -/obj/item/ammo_magazine/m762/ap - name = "magazine (7.62mm armor-piercing)" - ammo_type = /obj/item/ammo_casing/a762/ap - -/obj/item/ammo_magazine/m762/empty - initial_ammo = 0 - -/obj/item/ammo_magazine/m762m // Intentionally not a subtype of m762 because it's supposed to be incompatible with the Z8 Bulldog rifle. - name = "magazine (7.62mm)" - icon_state = "m762" - mag_type = MAGAZINE - caliber = "a762" - matter = list(DEFAULT_WALL_MATERIAL = 4000) - ammo_type = /obj/item/ammo_casing/a762 - max_ammo = 20 - multiple_sprites = 1 - -/obj/item/ammo_magazine/m762m/ap - name = "magazine (7.62mm armor-piercing)" - ammo_type = /obj/item/ammo_casing/a762/ap - -/obj/item/ammo_magazine/m762m/empty - initial_ammo = 0 - -/obj/item/ammo_magazine/clip/c762 - name = "ammo clip (7.62mm)" - icon_state = "clip_rifle" - caliber = "a762" - ammo_type = /obj/item/ammo_casing/a762 - matter = list(DEFAULT_WALL_MATERIAL = 1000) // metal costs are very roughly based around one 7.62 casing = 200 metal - max_ammo = 5 - multiple_sprites = 1 - -/obj/item/ammo_magazine/clip/c762/ap - name = "rifle clip (7.62mm armor-piercing)" - ammo_type = /obj/item/ammo_casing/a762/ap - -/obj/item/ammo_magazine/clip/c762/practice - name = "rifle clip (7.62mm practice)" - ammo_type = /obj/item/ammo_casing/a762p - -///////// 12g ///////// - -/obj/item/ammo_magazine/m12gdrum - name = "magazine (12 gauge)" - icon_state = "12g" - mag_type = MAGAZINE - caliber = "shotgun" - matter = list(DEFAULT_WALL_MATERIAL = 2200) - ammo_type = /obj/item/ammo_casing/a12g - max_ammo = 24 - multiple_sprites = 1 - -/obj/item/ammo_magazine/m12gdrum/beanbag - name = "magazine (12 gauge beanbag)" - ammo_type = /obj/item/ammo_casing/a12g/beanbag - -/obj/item/ammo_magazine/m12gdrum/pellet - name = "magazine (12 gauge pellet)" - ammo_type = /obj/item/ammo_casing/a12g/pellet - -/obj/item/ammo_magazine/m12gdrum/flash - name = "magazine (12 gauge flash)" - ammo_type = /obj/item/ammo_casing/a12g/flash - -/obj/item/ammo_magazine/m12gdrum/empty - initial_ammo = 0 - -///////// .75 Gyrojet ///////// - -/obj/item/ammo_magazine/m75 - name = "ammo magazine (.75 Gyrojet)" - icon_state = "75" - mag_type = MAGAZINE - caliber = "75" - ammo_type = /obj/item/ammo_casing/a75 - multiple_sprites = 1 - max_ammo = 4 - -/obj/item/ammo_magazine/m75/empty - initial_ammo = 0 - -///////// Misc. ///////// - -/obj/item/ammo_magazine/caps - name = "speedloader (caps)" - icon_state = "T38" - caliber = "caps" - color = "#FF0000" - ammo_type = /obj/item/ammo_casing/cap - matter = list(DEFAULT_WALL_MATERIAL = 600) - max_ammo = 7 +/************************************************************************/ +/* +# An explaination of the naming format for guns and ammo: +# +# a = Ammo, as in individual rounds of ammunition. +# b = Box, intended to have ammo taken out one at a time by hand. +# c = Clips, intended to reload magazines or guns quickly. +# m = Magazine, intended to hold rounds of ammo. +# s = Speedloaders, intended to reload guns quickly. +# +# Use this format, followed by the caliber. For example, a shotgun's caliber +# variable is "12g" as a result. Ergo, a shotgun round's path would have "a12g", +# or a magazine with shotgun shells would be "m12g" instead. To avoid confusion +# for developers and in-game admins spawning these items, stick to this format. +# Likewise, when creating new rounds, the caliber variable should match whatever +# the name says. +# +# This comment is copied in magazines.dm as well. +*/ +/************************************************************************/ + + + +///////// .357 ///////// + +/obj/item/ammo_magazine/s357 + name = "speedloader (.357)" + desc = "A speedloader for .357 revolvers." + icon_state = "38" + caliber = "357" + ammo_type = /obj/item/ammo_casing/a357 + matter = list(DEFAULT_WALL_MATERIAL = 1260) + max_ammo = 6 + multiple_sprites = 1 + +///////// .38 ///////// + +/obj/item/ammo_magazine/s38 + name = "speedloader (.38)" + desc = "A speedloader for .38 revolvers." + icon_state = "38" + caliber = ".38" + matter = list(DEFAULT_WALL_MATERIAL = 360) + ammo_type = /obj/item/ammo_casing/a38 + max_ammo = 6 + multiple_sprites = 1 + +/obj/item/ammo_magazine/s38/rubber + name = "speedloader (.38 rubber)" + ammo_type = /obj/item/ammo_casing/a38r + +/obj/item/ammo_magazine/s38/emp + name = "speedloader (.38 haywire)" + ammo_type = /obj/item/ammo_casing/a38/emp + +///////// .45 ///////// + +/obj/item/ammo_magazine/m45 + name = "pistol magazine (.45)" + icon_state = "45" + mag_type = MAGAZINE + ammo_type = /obj/item/ammo_casing/a45 + matter = list(DEFAULT_WALL_MATERIAL = 525) //metal costs are very roughly based around 1 .45 casing = 75 metal + caliber = ".45" + max_ammo = 7 + multiple_sprites = 1 + +/obj/item/ammo_magazine/m45/empty + initial_ammo = 0 + +/obj/item/ammo_magazine/m45/rubber + name = "magazine (.45 rubber)" + ammo_type = /obj/item/ammo_casing/a45r + +/obj/item/ammo_magazine/m45/practice + name = "magazine (.45 practice)" + ammo_type = /obj/item/ammo_casing/a45p + +/obj/item/ammo_magazine/m45/flash + name = "magazine (.45 flash)" + ammo_type = /obj/item/ammo_casing/a45f + +/obj/item/ammo_magazine/m45/ap + name = "magazine (.45 AP)" + ammo_type = /obj/item/ammo_casing/a45ap + +/obj/item/ammo_magazine/box/emp/b45 + name = "ammunition box (.45 haywire)" + ammo_type = /obj/item/ammo_casing/a45/emp + +/obj/item/ammo_magazine/m45uzi + name = "stick magazine (.45)" + icon_state = "uzi45" + mag_type = MAGAZINE + ammo_type = /obj/item/ammo_casing/a45 + matter = list(DEFAULT_WALL_MATERIAL = 1200) + caliber = ".45" + max_ammo = 16 + multiple_sprites = 1 + +/obj/item/ammo_magazine/m45uzi/empty + initial_ammo = 0 + +/obj/item/ammo_magazine/m45tommy + name = "tommygun magazine (.45)" + icon_state = "tommy-mag" + mag_type = MAGAZINE + ammo_type = /obj/item/ammo_casing/a45 + matter = list(DEFAULT_WALL_MATERIAL = 1500) + caliber = ".45" + max_ammo = 20 + +/obj/item/ammo_magazine/m45tommy/ap + name = "tommygun magazine (.45 AP)" + ammo_type = /obj/item/ammo_casing/a45ap + +/obj/item/ammo_magazine/m45tommy/empty + initial_ammo = 0 + +/obj/item/ammo_magazine/m45tommydrum + name = "tommygun drum magazine (.45)" + icon_state = "tommy-drum" + w_class = ITEMSIZE_NORMAL // Bulky ammo doesn't fit in your pockets! + mag_type = MAGAZINE + ammo_type = /obj/item/ammo_casing/a45 + matter = list(DEFAULT_WALL_MATERIAL = 3750) + caliber = ".45" + max_ammo = 50 + +/obj/item/ammo_magazine/m45tommydrum/ap + name = "tommygun drum magazine (.45 AP)" + ammo_type = /obj/item/ammo_casing/a45ap + +/obj/item/ammo_magazine/m45tommydrum/empty + initial_ammo = 0 + +/obj/item/ammo_magazine/clip/c45 + name = "ammo clip (.45)" + icon_state = "clip_pistol" + desc = "A stripper clip for reloading .45 rounds into magazines." + caliber = ".45" + ammo_type = /obj/item/ammo_casing/a45 + matter = list(DEFAULT_WALL_MATERIAL = 675) // metal costs very roughly based around one .45 casing = 75 metal + max_ammo = 9 + multiple_sprites = 1 + +/obj/item/ammo_magazine/clip/c45/rubber + name = "ammo clip (.45 rubber)" + ammo_type = /obj/item/ammo_casing/a45r + +/obj/item/ammo_magazine/clip/c45/practice + name = "ammo clip (.45 practice)" + ammo_type = /obj/item/ammo_casing/a45p + +/obj/item/ammo_magazine/clip/c45/flash + name = "ammo clip (.45 flash)" + ammo_type = /obj/item/ammo_casing/a45f + +///////// 9mm ///////// + +/obj/item/ammo_magazine/m9mm + name = "magazine (9mm)" + icon_state = "9x19p" + origin_tech = list(TECH_COMBAT = 2) + mag_type = MAGAZINE + matter = list(DEFAULT_WALL_MATERIAL = 480) + caliber = "9mm" + ammo_type = /obj/item/ammo_casing/a9mm + max_ammo = 8 + multiple_sprites = 1 + +/obj/item/ammo_magazine/m9mm/empty + initial_ammo = 0 + +/obj/item/ammo_magazine/m9mm/flash + ammo_type = /obj/item/ammo_casing/a9mmf + +/obj/item/ammo_magazine/m9mm/rubber + name = "magazine (9mm rubber)" + ammo_type = /obj/item/ammo_casing/a9mmr + +/obj/item/ammo_magazine/m9mm/practice + name = "magazine (9mm practice)" + ammo_type = /obj/item/ammo_casing/a9mmp + +/obj/item/ammo_magazine/m9mmt + name = "top mounted magazine (9mm)" + icon_state = "9mmt" + mag_type = MAGAZINE + ammo_type = /obj/item/ammo_casing/a9mm + matter = list(DEFAULT_WALL_MATERIAL = 1200) + caliber = "9mm" + max_ammo = 20 + multiple_sprites = 1 + +/obj/item/ammo_magazine/m9mmt/empty + initial_ammo = 0 + +/obj/item/ammo_magazine/m9mmt/rubber + name = "top mounted magazine (9mm rubber)" + ammo_type = /obj/item/ammo_casing/a9mmr + +/obj/item/ammo_magazine/m9mmt/flash + name = "top mounted magazine (9mm flash)" + ammo_type = /obj/item/ammo_casing/a9mmf + +/obj/item/ammo_magazine/m9mmt/practice + name = "top mounted magazine (9mm practice)" + ammo_type = /obj/item/ammo_casing/a9mmp + +/obj/item/ammo_magazine/m9mmp90 + name = "high capacity top mounted magazine (9mm armor-piercing)" + icon_state = "p90" + mag_type = MAGAZINE + ammo_type = /obj/item/ammo_casing/a9mm/ap + matter = list(DEFAULT_WALL_MATERIAL = 3000) + caliber = "9mm" + max_ammo = 50 + multiple_sprites = 1 + +/obj/item/ammo_magazine/m9mmp90/empty + initial_ammo = 0 + +/obj/item/ammo_magazine/clip/c9mm + name = "ammo clip (9mm)" + icon_state = "clip_pistol" + desc = "A stripper clip for reloading 9mm rounds into magazines." + caliber = "9mm" + ammo_type = /obj/item/ammo_casing/a9mm + matter = list(DEFAULT_WALL_MATERIAL = 540) // metal costs are very roughly based around one 9mm casing = 60 metal + max_ammo = 9 + multiple_sprites = 1 + +/obj/item/ammo_magazine/clip/c9mm/rubber + name = "ammo clip (.45 rubber)" + ammo_type = /obj/item/ammo_casing/a9mmr + +/obj/item/ammo_magazine/clip/c9mm/practice + name = "ammo clip (.45 practice)" + ammo_type = /obj/item/ammo_casing/a9mmp + +/obj/item/ammo_magazine/clip/c9mm/flash + name = "ammo clip (.45 flash)" + ammo_type = /obj/item/ammo_casing/a9mmf + +/obj/item/ammo_magazine/box/c9mm // Made by RnD for Prototype SMG and should probably be removed because why does it require DIAMONDS to make bullets? + name = "ammunition Box (9mm)" + icon_state = "9mm" + origin_tech = list(TECH_COMBAT = 2) + matter = list(DEFAULT_WALL_MATERIAL = 1800) + caliber = "9mm" + ammo_type = /obj/item/ammo_casing/a9mm + max_ammo = 30 + +/obj/item/ammo_magazine/box/c9mm/empty + initial_ammo = 0 + +///////// 10mm ///////// + +/obj/item/ammo_magazine/m10mm + name = "magazine (10mm)" + icon_state = "10mm" + origin_tech = list(TECH_COMBAT = 2) + mag_type = MAGAZINE + caliber = "10mm" + matter = list(DEFAULT_WALL_MATERIAL = 1500) + ammo_type = /obj/item/ammo_casing/a10mm + max_ammo = 20 + multiple_sprites = 1 + +/obj/item/ammo_magazine/m10mm/empty + initial_ammo = 0 + +/obj/item/ammo_magazine/clip/c10mm + name = "ammo clip (10mm)" + icon_state = "clip_pistol" + desc = "A stripper clip for reloading 5mm rounds into magazines." + caliber = "10mm" + ammo_type = /obj/item/ammo_casing/a10mm + matter = list(DEFAULT_WALL_MATERIAL = 675) // metal costs are very roughly based around one 10mm casing = 75 metal + max_ammo = 9 + multiple_sprites = 1 + +/obj/item/ammo_magazine/box/emp/b10 + name = "ammunition box (10mm haywire)" + ammo_type = /obj/item/ammo_casing/a10mm/emp + +///////// 5.56mm ///////// + +/obj/item/ammo_magazine/m556 + name = "magazine (5.56mm)" + icon_state = "m556" + origin_tech = list(TECH_COMBAT = 2) + mag_type = MAGAZINE + caliber = "5.56mm" + matter = list(DEFAULT_WALL_MATERIAL = 1800) + ammo_type = /obj/item/ammo_casing/a556 + max_ammo = 20 + multiple_sprites = 1 + +/obj/item/ammo_magazine/m556/ext + name = "extended magazine (5.56mm)" + matter = list(DEFAULT_WALL_MATERIAL = 2700) + max_ammo = 30 + +/obj/item/ammo_magazine/m556/empty + initial_ammo = 0 + +/obj/item/ammo_magazine/m556/ext/empty + initial_ammo = 0 + +/obj/item/ammo_magazine/m556/practice + name = "magazine (5.56mm practice)" + ammo_type = /obj/item/ammo_casing/a556p + +/obj/item/ammo_magazine/m556/practice/ext + name = "extended magazine (5.56mm practice)" + max_ammo = 30 + +/obj/item/ammo_magazine/m556/ap + name = "magazine (5.56mm armor-piercing)" + ammo_type = /obj/item/ammo_casing/a556/ap + +/obj/item/ammo_magazine/m556/ap/ext + name = "extended magazine (5.56mm armor-piercing)" + max_ammo = 30 + +/obj/item/ammo_magazine/m556/small + icon_state = "m556-small" + matter = list(DEFAULT_WALL_MATERIAL = 900) + max_ammo = 10 + +/obj/item/ammo_magazine/m556/small/empty + initial_ammo = 0 + +/obj/item/ammo_magazine/m556/small/practice + name = "magazine (5.56mm practice)" + ammo_type = /obj/item/ammo_casing/a556p + +/obj/item/ammo_magazine/m556/small/ap + name = "magazine (5.56mm armor-piercing)" + ammo_type = /obj/item/ammo_casing/a556/ap + +/obj/item/ammo_magazine/clip/c556 + name = "ammo clip (5.56mm)" + icon_state = "clip_rifle" + caliber = "5.56mm" + ammo_type = /obj/item/ammo_casing/a556 + matter = list(DEFAULT_WALL_MATERIAL = 450) // metal costs are very roughly based around one 10mm casing = 180 metal + max_ammo = 5 + multiple_sprites = 1 + +/obj/item/ammo_magazine/clip/c556/ap + name = "rifle clip (5.56mm armor-piercing)" + ammo_type = /obj/item/ammo_casing/a556/ap + +/obj/item/ammo_magazine/clip/c556/practice + name = "rifle clip (5.56mm practice)" + ammo_type = /obj/item/ammo_casing/a556 + +/obj/item/ammo_magazine/m556saw + name = "magazine box (5.56mm)" + icon_state = "a556" + origin_tech = list(TECH_COMBAT = 2) + mag_type = MAGAZINE + caliber = "5.56mm" + matter = list(DEFAULT_WALL_MATERIAL = 10000) + ammo_type = /obj/item/ammo_casing/a556 + w_class = ITEMSIZE_NORMAL // This should NOT fit in your pocket!! + max_ammo = 50 + multiple_sprites = 1 + +/obj/item/ammo_magazine/m556saw/ap + name = "magazine box (5.56mm armor-piercing)" + ammo_type = /obj/item/ammo_casing/a556/ap + +/obj/item/ammo_magazine/m556saw/empty + initial_ammo = 0 + +///////// .50 AE ///////// + +/obj/item/ammo_magazine/m50 + name = "magazine (.50 AE)" + icon_state = "50ae" + origin_tech = list(TECH_COMBAT = 2) + mag_type = MAGAZINE + caliber = ".50AE" + matter = list(DEFAULT_WALL_MATERIAL = 1260) + ammo_type = /obj/item/ammo_casing/a50ae + max_ammo = 7 + multiple_sprites = 1 + +/obj/item/ammo_magazine/m50/empty + initial_ammo = 0 + +/obj/item/ammo_magazine/clip/c50 + name = "ammo clip (.50 AE)" + icon_state = "clip_pistol" + desc = "A stripper clip for reloading .50 Action Express rounds into magazines." + caliber = ".50AE" + ammo_type = /obj/item/ammo_casing/a50ae + matter = list(DEFAULT_WALL_MATERIAL = 1620) // metal costs are very roughly based around one .50 casing = 180 metal + max_ammo = 9 + multiple_sprites = 1 + +///////// 7.62mm ///////// + +/obj/item/ammo_magazine/m762 + name = "magazine (7.62mm)" + icon_state = "m762-small" + mag_type = MAGAZINE + caliber = "7.62mm" + matter = list(DEFAULT_WALL_MATERIAL = 2000) + ammo_type = /obj/item/ammo_casing/a762 + max_ammo = 10 + multiple_sprites = 1 + +/obj/item/ammo_magazine/m762/ap + name = "magazine (7.62mm armor-piercing)" + ammo_type = /obj/item/ammo_casing/a762/ap + +/obj/item/ammo_magazine/m762/empty + initial_ammo = 0 + +/obj/item/ammo_magazine/m762m // Intentionally not a subtype of m762 because it's supposed to be incompatible with the Z8 Bulldog rifle. + name = "magazine (7.62mm)" + icon_state = "m762" + mag_type = MAGAZINE + caliber = "7.62mm" + matter = list(DEFAULT_WALL_MATERIAL = 4000) + ammo_type = /obj/item/ammo_casing/a762 + max_ammo = 20 + multiple_sprites = 1 + +/obj/item/ammo_magazine/m762m/ap + name = "magazine (7.62mm armor-piercing)" + ammo_type = /obj/item/ammo_casing/a762/ap + +/obj/item/ammo_magazine/m762m/empty + initial_ammo = 0 + +/obj/item/ammo_magazine/clip/c762 + name = "ammo clip (7.62mm)" + icon_state = "clip_rifle" + caliber = "7.62mm" + ammo_type = /obj/item/ammo_casing/a762 + matter = list(DEFAULT_WALL_MATERIAL = 1000) // metal costs are very roughly based around one 7.62 casing = 200 metal + max_ammo = 5 + multiple_sprites = 1 + +/obj/item/ammo_magazine/clip/c762/ap + name = "rifle clip (7.62mm armor-piercing)" + ammo_type = /obj/item/ammo_casing/a762/ap + +/obj/item/ammo_magazine/clip/c762/practice + name = "rifle clip (7.62mm practice)" + ammo_type = /obj/item/ammo_casing/a762p + +///////// 12g ///////// + +/obj/item/ammo_magazine/m12gdrum + name = "magazine (12 gauge)" + icon_state = "12g" + mag_type = MAGAZINE + caliber = "12g" + matter = list(DEFAULT_WALL_MATERIAL = 2200) + ammo_type = /obj/item/ammo_casing/a12g + max_ammo = 24 + multiple_sprites = 1 + +/obj/item/ammo_magazine/m12gdrum/beanbag + name = "magazine (12 gauge beanbag)" + ammo_type = /obj/item/ammo_casing/a12g/beanbag + +/obj/item/ammo_magazine/m12gdrum/pellet + name = "magazine (12 gauge pellet)" + ammo_type = /obj/item/ammo_casing/a12g/pellet + +/obj/item/ammo_magazine/m12gdrum/flash + name = "magazine (12 gauge flash)" + ammo_type = /obj/item/ammo_casing/a12g/flash + +/obj/item/ammo_magazine/m12gdrum/empty + initial_ammo = 0 + +///////// .75 Gyrojet ///////// + +/obj/item/ammo_magazine/m75 + name = "ammo magazine (.75 Gyrojet)" + icon_state = "75" + mag_type = MAGAZINE + caliber = ".75" + ammo_type = /obj/item/ammo_casing/a75 + multiple_sprites = 1 + max_ammo = 4 + +/obj/item/ammo_magazine/m75/empty + initial_ammo = 0 + +///////// Misc. ///////// + +/obj/item/ammo_magazine/caps + name = "speedloader (caps)" + icon_state = "T38" + caliber = "caps" + color = "#FF0000" + ammo_type = /obj/item/ammo_casing/cap + matter = list(DEFAULT_WALL_MATERIAL = 600) + max_ammo = 7 multiple_sprites = 1 \ No newline at end of file diff --git a/code/modules/projectiles/ammunition/bullets.dm b/code/modules/projectiles/ammunition/rounds.dm similarity index 85% rename from code/modules/projectiles/ammunition/bullets.dm rename to code/modules/projectiles/ammunition/rounds.dm index aa34925cef..624c0e6f76 100644 --- a/code/modules/projectiles/ammunition/bullets.dm +++ b/code/modules/projectiles/ammunition/rounds.dm @@ -1,291 +1,321 @@ -/obj/item/ammo_casing/a357 - desc = "A .357 bullet casing." - caliber = "357" - projectile_type = /obj/item/projectile/bullet/pistol/strong - -/obj/item/ammo_casing/a50 - desc = "A .50AE bullet casing." - caliber = ".50" - projectile_type = /obj/item/projectile/bullet/pistol/strong - -/obj/item/ammo_casing/a75 - desc = "A .75 gyrojet rocket sheathe." - caliber = "75" - projectile_type = /obj/item/projectile/bullet/gyro - -/obj/item/ammo_casing/a38 - desc = "A .38 bullet casing." - caliber = "38" - projectile_type = /obj/item/projectile/bullet/pistol - -/obj/item/ammo_casing/a38r - desc = "A .38 rubber bullet casing." - caliber = "38" - icon_state = "r-casing" - projectile_type = /obj/item/projectile/bullet/pistol/rubber - -/obj/item/ammo_casing/a38/emp - name = ".38 haywire round" - desc = "A .38 bullet casing fitted with a single-use ion pulse generator." - icon_state = "empcasing" - projectile_type = /obj/item/projectile/ion/small - matter = list(DEFAULT_WALL_MATERIAL = 130, "uranium" = 100) - -/* - * 9mm - */ - -/obj/item/ammo_casing/a9mm - desc = "A 9mm bullet casing." - caliber = "9mm" - projectile_type = /obj/item/projectile/bullet/pistol - -/obj/item/ammo_casing/a9mm/ap - desc = "A 9mm armor-piercing bullet casing." - projectile_type = /obj/item/projectile/bullet/pistol/ap - -/obj/item/ammo_casing/a9mmf - desc = "A 9mm flash shell casing." - caliber = "9mm" - icon_state = "r-casing" - projectile_type = /obj/item/projectile/energy/flash - -/obj/item/ammo_casing/a9mmr - desc = "A 9mm rubber bullet casing." - caliber = "9mm" - icon_state = "r-casing" - projectile_type = /obj/item/projectile/bullet/pistol/rubber - -/obj/item/ammo_casing/a9mmp - desc = "A 9mm practice bullet casing." - caliber = "9mm" - icon_state = "r-casing" - projectile_type = /obj/item/projectile/bullet/pistol/practice - -/* -/obj/item/ammo_casing/c5mm - desc = "A 5mm bullet casing." - caliber = "5mm" - projectile_type = /obj/item/projectile/bullet/pistol/ap -*/ - -/* - * 45 ammo - */ - -/obj/item/ammo_casing/a45 - desc = "A .45 bullet casing." - caliber = ".45" - projectile_type = /obj/item/projectile/bullet/pistol/medium - -/obj/item/ammo_casing/a45ap - desc = "A .45 Armor-Piercing bullet casing." - caliber = ".45" - icon_state = "r-casing" - projectile_type = /obj/item/projectile/bullet/pistol/medium/ap - -/obj/item/ammo_casing/a45p - desc = "A .45 practice bullet casing." - caliber = ".45" - icon_state = "r-casing" - projectile_type = /obj/item/projectile/bullet/pistol/practice - -/obj/item/ammo_casing/a45r - desc = "A .45 rubber bullet casing." - caliber = ".45" - icon_state = "r-casing" - projectile_type = /obj/item/projectile/bullet/pistol/rubber - -/obj/item/ammo_casing/a45f - desc = "A .45 flash shell casing." - caliber = ".45" - icon_state = "r-casing" - projectile_type = /obj/item/projectile/energy/flash - -/obj/item/ammo_casing/a45/emp - name = ".45 haywire round" - desc = "A .45 bullet casing fitted with a single-use ion pulse generator." - projectile_type = /obj/item/projectile/ion/small - icon_state = "empcasing" - matter = list(DEFAULT_WALL_MATERIAL = 130, "uranium" = 100) - -/obj/item/ammo_casing/a45/hp - desc = "A .45 hollow-point bullet casing." - projectile_type = /obj/item/projectile/bullet/pistol/medium/hollow - - -/* - * 10mm - */ - -/obj/item/ammo_casing/a10mm - desc = "A 10mm bullet casing." - caliber = "10mm" - projectile_type = /obj/item/projectile/bullet/pistol/medium - -/obj/item/ammo_casing/a10mm/emp - name = "10mm haywire round" - desc = "A 10mm bullet casing fitted with a single-use ion pulse generator." - projectile_type = /obj/item/projectile/ion/small - icon_state = "empcasing" - matter = list(DEFAULT_WALL_MATERIAL = 130, "uranium" = 100) - -/* - * Shotguns - */ - -/obj/item/ammo_casing/a12g - name = "shotgun slug" - desc = "A 12 gauge slug." - icon_state = "slshell" - caliber = "shotgun" - projectile_type = /obj/item/projectile/bullet/shotgun - matter = list(DEFAULT_WALL_MATERIAL = 360) - -/obj/item/ammo_casing/a12g/pellet - name = "shotgun shell" - desc = "A 12 gauge shell." - icon_state = "gshell" - projectile_type = /obj/item/projectile/bullet/pellet/shotgun - matter = list(DEFAULT_WALL_MATERIAL = 360) - -/obj/item/ammo_casing/a12g/blank - name = "shotgun shell" - desc = "A blank shell." - icon_state = "blshell" - projectile_type = /obj/item/projectile/bullet/blank - matter = list(DEFAULT_WALL_MATERIAL = 90) - -/obj/item/ammo_casing/a12g/practice - name = "shotgun shell" - desc = "A practice shell." - icon_state = "pshell" - projectile_type = /obj/item/projectile/bullet/shotgun/practice - matter = list("metal" = 90) - -/obj/item/ammo_casing/a12g/beanbag - name = "beanbag shell" - desc = "A beanbag shell." - icon_state = "bshell" - projectile_type = /obj/item/projectile/bullet/shotgun/beanbag - matter = list(DEFAULT_WALL_MATERIAL = 180) - -//Can stun in one hit if aimed at the head, but -//is blocked by clothing that stops tasers and is vulnerable to EMP -/obj/item/ammo_casing/a12g/stunshell - name = "stun shell" - desc = "A 12 gauge taser cartridge." - icon_state = "stunshell" - projectile_type = /obj/item/projectile/energy/electrode/stunshot - matter = list(DEFAULT_WALL_MATERIAL = 360, "glass" = 720) - -/obj/item/ammo_casing/a12g/stunshell/emp_act(severity) - if(prob(100/severity)) BB = null - update_icon() - -//Does not stun, only blinds, but has area of effect. -/obj/item/ammo_casing/a12g/flash - name = "flash shell" - desc = "A chemical shell used to signal distress or provide illumination." - icon_state = "fshell" - projectile_type = /obj/item/projectile/energy/flash/flare - matter = list(DEFAULT_WALL_MATERIAL = 90, "glass" = 90) - -/obj/item/ammo_casing/a12g/emp - name = "ion shell" - desc = "An advanced shotgun round that creates a small EMP when it strikes a target." - icon_state = "empshell" - projectile_type = /obj/item/projectile/ion -// projectile_type = /obj/item/projectile/bullet/shotgun/ion - matter = list(DEFAULT_WALL_MATERIAL = 360, "uranium" = 240) - -/* - * 762mm - */ - -/obj/item/ammo_casing/a762 - desc = "A 7.62mm bullet casing." - caliber = "a762" - icon_state = "rifle-casing" - projectile_type = /obj/item/projectile/bullet/rifle/a762 - -/obj/item/ammo_casing/a762/ap - desc = "A 7.62mm armor-piercing bullet casing." - projectile_type = /obj/item/projectile/bullet/rifle/a762/ap - -/obj/item/ammo_casing/a762p - desc = "A 7.62mm practice bullet casing." - caliber = "a762" - icon_state = "rifle-casing" // Need to make an icon for these - projectile_type = /obj/item/projectile/bullet/rifle/practice - -/obj/item/ammo_casing/a762/blank - desc = "A blank 7.62mm bullet casing." - projectile_type = /obj/item/projectile/bullet/blank - matter = list(DEFAULT_WALL_MATERIAL = 90) - -/obj/item/ammo_casing/a762/hp - desc = "A 7.62mm hollow-point bullet casing." - projectile_type = /obj/item/projectile/bullet/rifle/a762/hollow - -//145mm - -/obj/item/ammo_casing/a145 - desc = "A 14.5mm shell." - icon_state = "lcasing" - caliber = "14.5mm" - projectile_type = /obj/item/projectile/bullet/rifle/a145 - matter = list(DEFAULT_WALL_MATERIAL = 1250) - -/* - * 556mm - */ - -/obj/item/ammo_casing/a556 - desc = "A 5.56mm bullet casing." - caliber = "a556" - icon_state = "rifle-casing" - projectile_type = /obj/item/projectile/bullet/rifle/a556 - -/obj/item/ammo_casing/a556/ap - desc = "A 5.56mm armor-piercing bullet casing." - projectile_type = /obj/item/projectile/bullet/rifle/a556/ap - -/obj/item/ammo_casing/a556p - desc = "A 5.56mm practice bullet casing." - caliber = "a556" - icon_state = "rifle-casing" // Need to make an icon for these - projectile_type = /obj/item/projectile/bullet/rifle/practice - -/obj/item/ammo_casing/a556/blank - desc = "A blank 5.56mm bullet casing." - projectile_type = /obj/item/projectile/bullet/blank - matter = list(DEFAULT_WALL_MATERIAL = 90) - -/obj/item/ammo_casing/a556/hp - desc = "A 5.56mm hollow-point bullet casing." - projectile_type = /obj/item/projectile/bullet/rifle/a556/hollow - -/* - * Misc - */ - -/obj/item/ammo_casing/rocket - name = "rocket shell" - desc = "A high explosive designed to be fired from a launcher." - icon_state = "rocketshell" - projectile_type = /obj/item/missile - caliber = "rocket" - -/obj/item/ammo_casing/cap - name = "cap" - desc = "A cap for children toys." - caliber = "caps" - icon_state = "r-casing" - color = "#FF0000" - projectile_type = /obj/item/projectile/bullet/pistol/cap - -/obj/item/ammo_casing/spent // For simple hostile mobs only, so they don't cough up usable bullets when firing. This is for literally nothing else. - icon_state = "s-casing-spent" - BB = null +/************************************************************************/ +/* +# An explaination of the naming format for guns and ammo: +# +# a = Ammo, as in individual rounds of ammunition. +# b = Box, intended to have ammo taken out one at a time by hand. +# c = Clips, intended to reload magazines or guns quickly. +# m = Magazine, intended to hold rounds of ammo. +# s = Speedloaders, intended to reload guns quickly. +# +# Use this format, followed by the caliber. For example, a shotgun's caliber +# variable is "12g" as a result. Ergo, a shotgun round's path would have "a12g", +# or a magazine with shotgun shells would be "m12g" instead. To avoid confusion +# for developers and in-game admins spawning these items, stick to this format. +# Likewise, when creating new rounds, the caliber variable should match whatever +# the name says. +# +# This comment is copied in magazines.dm as well. +*/ +/************************************************************************/ + +/* + * .357 + */ + +/obj/item/ammo_casing/a357 + desc = "A .357 bullet casing." + caliber = "357" + projectile_type = /obj/item/projectile/bullet/pistol/strong + +/* + * .38 + */ + +/obj/item/ammo_casing/a38 + desc = "A .38 bullet casing." + caliber = ".38" + projectile_type = /obj/item/projectile/bullet/pistol + +/obj/item/ammo_casing/a38r + desc = "A .38 rubber bullet casing." + caliber = ".38" + icon_state = "r-casing" + projectile_type = /obj/item/projectile/bullet/pistol/rubber + +/obj/item/ammo_casing/a38/emp + name = ".38 haywire round" + desc = "A .38 bullet casing fitted with a single-use ion pulse generator." + icon_state = "empcasing" + projectile_type = /obj/item/projectile/ion/small + matter = list(DEFAULT_WALL_MATERIAL = 130, "uranium" = 100) + +/* + * .50 Action Express + */ + +/obj/item/ammo_casing/a50ae + desc = "A .50AE bullet casing." + caliber = ".50AE" + projectile_type = /obj/item/projectile/bullet/pistol/strong + +/* + * .75 (aka Gyrojet Rockets, aka admin abuse) + */ + +/obj/item/ammo_casing/a75 + desc = "A .75 gyrojet rocket sheathe." + caliber = ".75" + projectile_type = /obj/item/projectile/bullet/gyro + +/* + * 9mm + */ + +/obj/item/ammo_casing/a9mm + desc = "A 9mm bullet casing." + caliber = "9mm" + projectile_type = /obj/item/projectile/bullet/pistol + +/obj/item/ammo_casing/a9mm/ap + desc = "A 9mm armor-piercing bullet casing." + projectile_type = /obj/item/projectile/bullet/pistol/ap + +/obj/item/ammo_casing/a9mmf + desc = "A 9mm flash shell casing." + caliber = "9mm" + icon_state = "r-casing" + projectile_type = /obj/item/projectile/energy/flash + +/obj/item/ammo_casing/a9mmr + desc = "A 9mm rubber bullet casing." + caliber = "9mm" + icon_state = "r-casing" + projectile_type = /obj/item/projectile/bullet/pistol/rubber + +/obj/item/ammo_casing/a9mmp + desc = "A 9mm practice bullet casing." + caliber = "9mm" + icon_state = "r-casing" + projectile_type = /obj/item/projectile/bullet/pistol/practice + +/* + * .45 + */ + +/obj/item/ammo_casing/a45 + desc = "A .45 bullet casing." + caliber = ".45" + projectile_type = /obj/item/projectile/bullet/pistol/medium + +/obj/item/ammo_casing/a45ap + desc = "A .45 Armor-Piercing bullet casing." + caliber = ".45" + icon_state = "r-casing" + projectile_type = /obj/item/projectile/bullet/pistol/medium/ap + +/obj/item/ammo_casing/a45p + desc = "A .45 practice bullet casing." + caliber = ".45" + icon_state = "r-casing" + projectile_type = /obj/item/projectile/bullet/pistol/practice + +/obj/item/ammo_casing/a45r + desc = "A .45 rubber bullet casing." + caliber = ".45" + icon_state = "r-casing" + projectile_type = /obj/item/projectile/bullet/pistol/rubber + +/obj/item/ammo_casing/a45f + desc = "A .45 flash shell casing." + caliber = ".45" + icon_state = "r-casing" + projectile_type = /obj/item/projectile/energy/flash + +/obj/item/ammo_casing/a45/emp + name = ".45 haywire round" + desc = "A .45 bullet casing fitted with a single-use ion pulse generator." + projectile_type = /obj/item/projectile/ion/small + icon_state = "empcasing" + matter = list(DEFAULT_WALL_MATERIAL = 130, "uranium" = 100) + +/obj/item/ammo_casing/a45/hp + desc = "A .45 hollow-point bullet casing." + projectile_type = /obj/item/projectile/bullet/pistol/medium/hollow + + +/* + * 10mm + */ + +/obj/item/ammo_casing/a10mm + desc = "A 10mm bullet casing." + caliber = "10mm" + projectile_type = /obj/item/projectile/bullet/pistol/medium + +/obj/item/ammo_casing/a10mm/emp + name = "10mm haywire round" + desc = "A 10mm bullet casing fitted with a single-use ion pulse generator." + projectile_type = /obj/item/projectile/ion/small + icon_state = "empcasing" + matter = list(DEFAULT_WALL_MATERIAL = 130, "uranium" = 100) + +/* + * 12g (aka shotgun ammo) + */ + +/obj/item/ammo_casing/a12g + name = "shotgun slug" + desc = "A 12 gauge slug." + icon_state = "slshell" + caliber = "12g" + projectile_type = /obj/item/projectile/bullet/shotgun + matter = list(DEFAULT_WALL_MATERIAL = 360) + +/obj/item/ammo_casing/a12g/pellet + name = "shotgun shell" + desc = "A 12 gauge shell." + icon_state = "gshell" + projectile_type = /obj/item/projectile/bullet/pellet/shotgun + matter = list(DEFAULT_WALL_MATERIAL = 360) + +/obj/item/ammo_casing/a12g/blank + name = "shotgun shell" + desc = "A blank shell." + icon_state = "blshell" + projectile_type = /obj/item/projectile/bullet/blank + matter = list(DEFAULT_WALL_MATERIAL = 90) + +/obj/item/ammo_casing/a12g/practice + name = "shotgun shell" + desc = "A practice shell." + icon_state = "pshell" + projectile_type = /obj/item/projectile/bullet/shotgun/practice + matter = list("metal" = 90) + +/obj/item/ammo_casing/a12g/beanbag + name = "beanbag shell" + desc = "A beanbag shell." + icon_state = "bshell" + projectile_type = /obj/item/projectile/bullet/shotgun/beanbag + matter = list(DEFAULT_WALL_MATERIAL = 180) + +//Can stun in one hit if aimed at the head, but +//is blocked by clothing that stops tasers and is vulnerable to EMP +/obj/item/ammo_casing/a12g/stunshell + name = "stun shell" + desc = "A 12 gauge taser cartridge." + icon_state = "stunshell" + projectile_type = /obj/item/projectile/energy/electrode/stunshot + matter = list(DEFAULT_WALL_MATERIAL = 360, "glass" = 720) + +/obj/item/ammo_casing/a12g/stunshell/emp_act(severity) + if(prob(100/severity)) BB = null + update_icon() + +//Does not stun, only blinds, but has area of effect. +/obj/item/ammo_casing/a12g/flash + name = "flash shell" + desc = "A chemical shell used to signal distress or provide illumination." + icon_state = "fshell" + projectile_type = /obj/item/projectile/energy/flash/flare + matter = list(DEFAULT_WALL_MATERIAL = 90, "glass" = 90) + +/obj/item/ammo_casing/a12g/emp + name = "ion shell" + desc = "An advanced shotgun round that creates a small EMP when it strikes a target." + icon_state = "empshell" + projectile_type = /obj/item/projectile/ion +// projectile_type = /obj/item/projectile/bullet/shotgun/ion + matter = list(DEFAULT_WALL_MATERIAL = 360, "uranium" = 240) + +/* + * 7.62mm + */ + +/obj/item/ammo_casing/a762 + desc = "A 7.62mm bullet casing." + caliber = "7.62mm" + icon_state = "rifle-casing" + projectile_type = /obj/item/projectile/bullet/rifle/a762 + +/obj/item/ammo_casing/a762/ap + desc = "A 7.62mm armor-piercing bullet casing." + projectile_type = /obj/item/projectile/bullet/rifle/a762/ap + +/obj/item/ammo_casing/a762p + desc = "A 7.62mm practice bullet casing." + caliber = "7.62mm" + icon_state = "rifle-casing" // Need to make an icon for these + projectile_type = /obj/item/projectile/bullet/rifle/practice + +/obj/item/ammo_casing/a762/blank + desc = "A blank 7.62mm bullet casing." + projectile_type = /obj/item/projectile/bullet/blank + matter = list(DEFAULT_WALL_MATERIAL = 90) + +/obj/item/ammo_casing/a762/hp + desc = "A 7.62mm hollow-point bullet casing." + projectile_type = /obj/item/projectile/bullet/rifle/a762/hollow + +//145mm + +/obj/item/ammo_casing/a145 + desc = "A 14.5mm shell." + icon_state = "lcasing" + caliber = "14.5mm" + projectile_type = /obj/item/projectile/bullet/rifle/a145 + matter = list(DEFAULT_WALL_MATERIAL = 1250) + +/* + * 5.56mm + */ + +/obj/item/ammo_casing/a556 + desc = "A 5.56mm bullet casing." + caliber = "5.56mm" + icon_state = "rifle-casing" + projectile_type = /obj/item/projectile/bullet/rifle/a556 + +/obj/item/ammo_casing/a556/ap + desc = "A 5.56mm armor-piercing bullet casing." + projectile_type = /obj/item/projectile/bullet/rifle/a556/ap + +/obj/item/ammo_casing/a556p + desc = "A 5.56mm practice bullet casing." + caliber = "5.56mm" + icon_state = "rifle-casing" // Need to make an icon for these + projectile_type = /obj/item/projectile/bullet/rifle/practice + +/obj/item/ammo_casing/a556/blank + desc = "A blank 5.56mm bullet casing." + projectile_type = /obj/item/projectile/bullet/blank + matter = list(DEFAULT_WALL_MATERIAL = 90) + +/obj/item/ammo_casing/a556/hp + desc = "A 5.56mm hollow-point bullet casing." + projectile_type = /obj/item/projectile/bullet/rifle/a556/hollow + +/* + * Misc + */ + +/obj/item/ammo_casing/rocket + name = "rocket shell" + desc = "A high explosive designed to be fired from a launcher." + icon_state = "rocketshell" + projectile_type = /obj/item/missile + caliber = "rocket" + +/obj/item/ammo_casing/cap + name = "cap" + desc = "A cap for children toys." + caliber = "caps" + icon_state = "r-casing" + color = "#FF0000" + projectile_type = /obj/item/projectile/bullet/pistol/cap + +/obj/item/ammo_casing/spent // For simple hostile mobs only, so they don't cough up usable bullets when firing. This is for literally nothing else. + icon_state = "s-casing-spent" + BB = null projectile_type = null \ No newline at end of file diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm index a3e1f671ec..9bb9862fd3 100644 --- a/code/modules/projectiles/guns/projectile/automatic.dm +++ b/code/modules/projectiles/guns/projectile/automatic.dm @@ -252,7 +252,7 @@ item_state = null w_class = ITEMSIZE_LARGE force = 10 - caliber = "shotgun" + caliber = "12g" fire_sound = 'sound/weapons/shotgun.ogg' origin_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 1, TECH_ILLEGAL = 4) slot_flags = SLOT_BACK diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm index a92e59982c..36a929af28 100644 --- a/code/modules/projectiles/guns/projectile/revolver.dm +++ b/code/modules/projectiles/guns/projectile/revolver.dm @@ -107,7 +107,7 @@ name = "\"The Judge\"" desc = "A revolving hand-shotgun by Cybersun Industries that packs the power of a 12 guage in the palm of your hand (if you don't break your wrist). Uses 12 shotgun rounds." icon_state = "judge" - caliber = "shotgun" + caliber = "12g" origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2, TECH_ILLEGAL = 4) max_shells = 5 fire_sound = 'sound/weapons/shotgun.ogg' @@ -127,7 +127,7 @@ caliber = "38" ammo_type = /obj/item/ammo_casing/a38 var/secondary_max_shells = 1 - var/secondary_caliber = "shotgun" + var/secondary_caliber = "12g" var/secondary_ammo_type = /obj/item/ammo_casing/a12g var/flipped_firing = 0 var/list/secondary_loaded = list() diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm index 80d1a09d78..bc14bb9425 100644 --- a/code/modules/projectiles/guns/projectile/shotgun.dm +++ b/code/modules/projectiles/guns/projectile/shotgun.dm @@ -8,7 +8,7 @@ force = 10 flags = CONDUCT slot_flags = SLOT_BACK - caliber = "shotgun" + caliber = "12g" origin_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 2) load_method = SINGLE_CASING ammo_type = /obj/item/ammo_casing/a12g/beanbag @@ -64,7 +64,7 @@ force = 10 flags = CONDUCT slot_flags = SLOT_BACK - caliber = "shotgun" + caliber = "12g" origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 1) ammo_type = /obj/item/ammo_casing/a12g/beanbag diff --git a/polaris.dme b/polaris.dme index 9f075b1d76..92abfde4f5 100644 --- a/polaris.dme +++ b/polaris.dme @@ -1876,8 +1876,8 @@ #include "code\modules\projectiles\effects.dm" #include "code\modules\projectiles\gun.dm" #include "code\modules\projectiles\projectile.dm" -#include "code\modules\projectiles\ammunition\boxes.dm" -#include "code\modules\projectiles\ammunition\bullets.dm" +#include "code\modules\projectiles\ammunition\magazines.dm" +#include "code\modules\projectiles\ammunition\rounds.dm" #include "code\modules\projectiles\guns\energy.dm" #include "code\modules\projectiles\guns\launcher.dm" #include "code\modules\projectiles\guns\projectile.dm" From ae3d877730869ab198896feb23e1bab5f3c94b15 Mon Sep 17 00:00:00 2001 From: Spades Date: Sat, 27 May 2017 16:25:38 -0400 Subject: [PATCH 22/82] Might be helpful if I clicked save on my files --- code/modules/projectiles/ammunition/rounds.dm | 4 +++- code/modules/projectiles/guns/projectile/automatic.dm | 8 ++++---- code/modules/projectiles/guns/projectile/boltaction.dm | 4 ++-- code/modules/projectiles/guns/projectile/pistol.dm | 4 ++-- code/modules/projectiles/guns/projectile/revolver.dm | 6 +++--- code/modules/projectiles/guns/projectile/sniper.dm | 2 +- 6 files changed, 15 insertions(+), 13 deletions(-) diff --git a/code/modules/projectiles/ammunition/rounds.dm b/code/modules/projectiles/ammunition/rounds.dm index 624c0e6f76..3230e6ed62 100644 --- a/code/modules/projectiles/ammunition/rounds.dm +++ b/code/modules/projectiles/ammunition/rounds.dm @@ -258,7 +258,9 @@ desc = "A 7.62mm hollow-point bullet casing." projectile_type = /obj/item/projectile/bullet/rifle/a762/hollow -//145mm +/* + * 14.5mm (anti-materiel rifle round) + */ /obj/item/ammo_casing/a145 desc = "A 14.5mm shell." diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm index 9bb9862fd3..5abcead8f3 100644 --- a/code/modules/projectiles/guns/projectile/automatic.dm +++ b/code/modules/projectiles/guns/projectile/automatic.dm @@ -56,7 +56,7 @@ item_state = null w_class = ITEMSIZE_LARGE force = 10 - caliber = "a556" + caliber = "5.56mm" origin_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 1, TECH_ILLEGAL = 4) slot_flags = SLOT_BACK load_method = MAGAZINE @@ -109,7 +109,7 @@ item_state = "z8carbine" w_class = ITEMSIZE_LARGE force = 10 - caliber = "a762" + caliber = "7.62mm" origin_tech = list(TECH_COMBAT = 8, TECH_MATERIAL = 3) ammo_type = "/obj/item/ammo_casing/a556" // Is this really needed anymore? fire_sound = 'sound/weapons/Gunshot.ogg' @@ -181,7 +181,7 @@ force = 10 slot_flags = 0 max_shells = 50 - caliber = "a556" + caliber = "5.56mm" origin_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 1, TECH_ILLEGAL = 2) slot_flags = SLOT_BACK ammo_type = "/obj/item/ammo_casing/a556" // Is this really needed anymore? @@ -350,7 +350,7 @@ item_state = "bullpup" w_class = ITEMSIZE_LARGE force = 10 - caliber = "a762" + caliber = "7.62mm" origin_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 1, TECH_ILLEGAL = 4) slot_flags = SLOT_BACK load_method = MAGAZINE diff --git a/code/modules/projectiles/guns/projectile/boltaction.dm b/code/modules/projectiles/guns/projectile/boltaction.dm index cbc403c4e0..17e2fe1234 100644 --- a/code/modules/projectiles/guns/projectile/boltaction.dm +++ b/code/modules/projectiles/guns/projectile/boltaction.dm @@ -7,7 +7,7 @@ icon_state = "boltaction" fire_sound = 'sound/weapons/rifleshot.ogg' max_shells = 5 - caliber = "a762" + caliber = "7.62mm" origin_tech = list(TECH_COMBAT = 1)// Old as shit rifle doesn't have very good tech. ammo_type = /obj/item/ammo_casing/a762 load_method = SINGLE_CASING|SPEEDLOADER @@ -60,7 +60,7 @@ icon_state = "leveraction" fire_sound = 'sound/weapons/rifleshot.ogg' max_shells = 5 - caliber = "a762" + caliber = "7.62mm" origin_tech = list(TECH_COMBAT = 1)// Old as shit rifle doesn't have very good tech. ammo_type = /obj/item/ammo_casing/a762 load_method = SINGLE_CASING|SPEEDLOADER diff --git a/code/modules/projectiles/guns/projectile/pistol.dm b/code/modules/projectiles/guns/projectile/pistol.dm index 69fa353a52..ba5f4f147d 100644 --- a/code/modules/projectiles/guns/projectile/pistol.dm +++ b/code/modules/projectiles/guns/projectile/pistol.dm @@ -120,7 +120,7 @@ icon_state = "deagle" item_state = "deagle" force = 14.0 - caliber = ".50" + caliber = ".50AE" load_method = MAGAZINE fire_sound = 'sound/weapons/deagle.ogg' magazine_type = /obj/item/ammo_magazine/m50 @@ -168,7 +168,7 @@ desc = "Speak softly, and carry a big gun. Fires rare .75 caliber self-propelled exploding bolts--because fuck you and everything around you." icon_state = "gyropistol" max_shells = 8 - caliber = "75" + caliber = ".75" fire_sound = 'sound/weapons/rpg.ogg' origin_tech = list(TECH_COMBAT = 3) ammo_type = "/obj/item/ammo_casing/a75" diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm index 36a929af28..3886450fcf 100644 --- a/code/modules/projectiles/guns/projectile/revolver.dm +++ b/code/modules/projectiles/guns/projectile/revolver.dm @@ -43,7 +43,7 @@ name = "revolver" desc = "A cheap Martian knock-off of a Smith & Wesson Model 10. Uses .38-Special rounds." icon_state = "detective" - caliber = "38" + caliber = ".38" origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2) fire_sound = 'sound/weapons/Gunshot_light.ogg' ammo_type = /obj/item/ammo_casing/a38 @@ -71,7 +71,7 @@ name = "Deckard .38" desc = "A custom-built revolver, based off the semi-popular Detective Special model." icon_state = "deckard-empty" - caliber = "38" + caliber = ".38" origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2) fire_sound = 'sound/weapons/Gunshot_light.ogg' ammo_type = /obj/item/ammo_casing/a38 @@ -124,7 +124,7 @@ origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2) handle_casings = CYCLE_CASINGS max_shells = 9 - caliber = "38" + caliber = ".38" ammo_type = /obj/item/ammo_casing/a38 var/secondary_max_shells = 1 var/secondary_caliber = "12g" diff --git a/code/modules/projectiles/guns/projectile/sniper.dm b/code/modules/projectiles/guns/projectile/sniper.dm index 8afda4b63b..9a16f68a4c 100644 --- a/code/modules/projectiles/guns/projectile/sniper.dm +++ b/code/modules/projectiles/guns/projectile/sniper.dm @@ -80,7 +80,7 @@ slot_flags = SLOT_BACK // Needs a sprite. origin_tech = list(TECH_COMBAT = 8, TECH_MATERIAL = 2, TECH_ILLEGAL = 8) recoil = 2 //extra kickback - caliber = "a762" + caliber = "7.62mm" load_method = MAGAZINE accuracy = -3 //shooting at the hip scoped_accuracy = 0 From cef9c4f98d0afa61c9369a60a677541d3472cffd Mon Sep 17 00:00:00 2001 From: Spades Date: Sat, 27 May 2017 16:27:05 -0400 Subject: [PATCH 23/82] One last thing. --- code/modules/projectiles/ammunition/magazines.dm | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/code/modules/projectiles/ammunition/magazines.dm b/code/modules/projectiles/ammunition/magazines.dm index 92512b0dd1..cd80854af3 100644 --- a/code/modules/projectiles/ammunition/magazines.dm +++ b/code/modules/projectiles/ammunition/magazines.dm @@ -15,7 +15,10 @@ # Likewise, when creating new rounds, the caliber variable should match whatever # the name says. # -# This comment is copied in magazines.dm as well. +# This comment is copied in rounds.dm as well. +# +# Also, if a magazine is only meant for a specific gun, include the name +# of the specific gun in the path. Example: m45uzi is only for the Uzi. */ /************************************************************************/ From 3a0bdf5cf963aca113d269d1d88556f60e1d5e1e Mon Sep 17 00:00:00 2001 From: Spades Date: Sat, 27 May 2017 16:31:17 -0400 Subject: [PATCH 24/82] Name tweak for Anewbe --- code/modules/projectiles/ammunition/magazines.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/projectiles/ammunition/magazines.dm b/code/modules/projectiles/ammunition/magazines.dm index cd80854af3..6202e03cde 100644 --- a/code/modules/projectiles/ammunition/magazines.dm +++ b/code/modules/projectiles/ammunition/magazines.dm @@ -329,6 +329,7 @@ max_ammo = 30 /obj/item/ammo_magazine/m556/small + name = "reduced magazine (5.56mm)" icon_state = "m556-small" matter = list(DEFAULT_WALL_MATERIAL = 900) max_ammo = 10 From ef2883ff7e796cf43addd7dfed0669ed2f664fe1 Mon Sep 17 00:00:00 2001 From: Yoshax Date: Tue, 30 May 2017 16:32:40 +0100 Subject: [PATCH 25/82] Drop pod issue fix --- code/modules/random_map/drop/drop_types.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/random_map/drop/drop_types.dm b/code/modules/random_map/drop/drop_types.dm index 43f89b4ec7..7c505607bd 100644 --- a/code/modules/random_map/drop/drop_types.dm +++ b/code/modules/random_map/drop/drop_types.dm @@ -71,7 +71,7 @@ var/global/list/datum/supply_drop_loot/supply_drop /datum/supply_drop_loot/heavy_warfare name = "Heavy Warfare" container = /obj/structure/largecrate -/datum/supply_drop_loot/armour/New() +/datum/supply_drop_loot/heavy_warfare/New() ..() contents = list( /obj/item/clothing/head/helmet/combat, @@ -99,7 +99,7 @@ var/global/list/datum/supply_drop_loot/supply_drop datum/supply_drop_loot/riot name = "Riot Gear" container = /obj/structure/largecrate -/datum/supply_drop_loot/armour/New() +/datum/supply_drop_loot/riot/New() ..() contents = list( /obj/item/clothing/head/helmet/riot, From 2c8df87899c35a0fde9b3f5ba796c48bc672fc25 Mon Sep 17 00:00:00 2001 From: Leshana Date: Tue, 30 May 2017 12:45:21 -0400 Subject: [PATCH 26/82] Tweak to Radiation Optimization * Optimized garbage collection of radiation sources until we get qdel() hints. * Made the RADIATION_LOWER_LIMIT configurable (option for people to save some cpu time) * Added some comments and broke the proccessor into separate procs for profiling purposes * Added a changelog. --- code/controllers/Processes/radiation.dm | 11 +++++++++-- code/controllers/configuration.dm | 3 +++ code/datums/repositories/radiation.dm | 13 ++++++++++--- config/example/config.txt | 3 +++ html/changelogs/Leshana-Radiation.yml | 5 +++++ 5 files changed, 30 insertions(+), 5 deletions(-) create mode 100644 html/changelogs/Leshana-Radiation.yml diff --git a/code/controllers/Processes/radiation.dm b/code/controllers/Processes/radiation.dm index e64f71ebb7..192acf5d5c 100644 --- a/code/controllers/Processes/radiation.dm +++ b/code/controllers/Processes/radiation.dm @@ -7,7 +7,12 @@ linked = radiation_repository /datum/controller/process/radiation/doWork() - // Step 1 - Sources Decay + sources_decay() + cache_expires() + irradiate_targets() + +// Step 1 - Sources Decay +/datum/controller/process/radiation/proc/sources_decay() var/list/sources = linked.sources for(var/thing in sources) if(deleted(thing)) @@ -20,7 +25,8 @@ sources.Remove(S) SCHECK // This scheck probably just wastes resources, but better safe than sorry in this case. - // Step 2 - Cache Expires +// Step 2 - Cache Expires +/datum/controller/process/radiation/proc/cache_expires() var/list/resistance_cache = linked.resistance_cache for(var/thing in resistance_cache) if(deleted(thing)) @@ -32,6 +38,7 @@ SCHECK // Step 3 - Registered irradiatable things are checked for radiation +/datum/controller/process/radiation/proc/irradiate_targets() var/list/registered_listeners = living_mob_list // For now just use this. Nothing else is interested anyway. if(length(linked.sources) > 0) for(var/thing in registered_listeners) diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index c22ac1bc81..51fc286928 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -720,6 +720,9 @@ var/list/gamemode_cache = list() if(values.len > 0) language_prefixes = values + if("radiation_lower_limit") + radiation_lower_limit = text2num(value) + else log_misc("Unknown setting in configuration: '[name]'") diff --git a/code/datums/repositories/radiation.dm b/code/datums/repositories/radiation.dm index 457e423b4e..5471282026 100644 --- a/code/datums/repositories/radiation.dm +++ b/code/datums/repositories/radiation.dm @@ -19,14 +19,23 @@ var/global/repository/radiation/radiation_repository = new() radiation_repository.sources -= src if(radiation_repository.sources_assoc[src.source_turf] == src) radiation_repository.sources -= src.source_turf + src.source_turf = null . = ..() +// TEMPORARY HACK - hard del()'ing sources is too expensive! Until we implement qdel() hints we need to override behavior here +/datum/radiation_source/finalize_qdel() + if(garbage_collector) + garbage_collector.AddTrash(src) + else + delayed_garbage |= src +// TEMPORARY HACK END + /datum/radiation_source/proc/update_rad_power(var/new_power = null) if(new_power != null && new_power != rad_power) rad_power = new_power . = 1 if(. && !flat) - range = min(round(sqrt(rad_power / config.radiation_lower_limit)), 31) + range = min(round(sqrt(rad_power / config.radiation_lower_limit)), 31) // R = rad_power / dist**2 - Solve for dist // Ray trace from all active radiation sources to T and return the strongest effect. /repository/radiation/proc/get_rads_at_turf(var/turf/T) @@ -76,7 +85,6 @@ var/global/repository/radiation/radiation_repository = new() S.source_turf = get_turf(source) S.update_rad_power(power) add_source(S) - return S // Sets the radiation in a range to a constant value. /repository/radiation/proc/flat_radiate(source, power, range, var/respect_maint = FALSE) @@ -89,7 +97,6 @@ var/global/repository/radiation/radiation_repository = new() S.source_turf = get_turf(source) S.update_rad_power(power) add_source(S) - return S // Irradiates a full Z-level. Hacky way of doing it, but not too expensive. /repository/radiation/proc/z_radiate(var/atom/source, power, var/respect_maint = FALSE) diff --git a/config/example/config.txt b/config/example/config.txt index 232d3c66ad..52892bc14a 100644 --- a/config/example/config.txt +++ b/config/example/config.txt @@ -36,6 +36,9 @@ JOBS_HAVE_MINIMAL_ACCESS Configure how fast explosion strength diminishes when travelling up/down z levels. All explosion distances are multiplied by this each time they go up/down z-levels. #MULTI_Z_EXPLOSION_SCALAR 0.5 +# Radiation weakens with distance from the source; stop calculating when the strength falls below this value. Lower values mean radiation reaches smaller (with increasingly trivial damage) at the cost of more CPU usage. Max range = DISTANCE^2 * POWER / RADIATION_LOWER_LIMIT +# RADIATION_LOWER_LIMIT 0.35 + ## log OOC channel LOG_OOC diff --git a/html/changelogs/Leshana-Radiation.yml b/html/changelogs/Leshana-Radiation.yml new file mode 100644 index 0000000000..d4d9c3589d --- /dev/null +++ b/html/changelogs/Leshana-Radiation.yml @@ -0,0 +1,5 @@ +author: Leshana +delete-after: True +changes: + - tweak: "Optimized the unified radiation system. Made the radiation cutoff level configurable." + - bugfix: "Standing still won't save you from radiation storms." From 64ff8bed081a0e72658143aef8ec661f50340580 Mon Sep 17 00:00:00 2001 From: Arokha Sieyes Date: Tue, 30 May 2017 16:25:55 -0400 Subject: [PATCH 27/82] Please let the blood go away You can't qdel lists. --- code/modules/mob/living/carbon/human/human.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 66abc50cab..aa9ec53cfe 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1015,7 +1015,8 @@ gunshot_residue = null if(clean_feet && !shoes && istype(feet_blood_DNA, /list) && feet_blood_DNA.len) feet_blood_color = null - qdel(feet_blood_DNA) + feet_blood_DNA.Cut() + feet_blood_DNA = null update_inv_shoes(1) return 1 From 90dff0ae632ad98b21bade60ae9871eec52d4b11 Mon Sep 17 00:00:00 2001 From: Leshana Date: Tue, 30 May 2017 21:00:37 -0400 Subject: [PATCH 28/82] Ports /tg's StonedMC Subsystem from Baystation12 * Partial port of @PsiOmegaDelta's https://github.com/Baystation12/Baystation12/pull/16820 * Only ports the StonedMC changes, not the garbage collector (forthcoming in future) --- code/__defines/MC.dm | 53 ++ code/__defines/math.dm | 10 + code/__defines/misc.dm | 2 + code/__defines/tick.dm | 7 + code/_helpers/lists.dm | 63 ++ code/_helpers/sorts/TimSort.dm | 17 + code/_helpers/sorts/__main.dm | 656 ++++++++++++++++++ code/_helpers/sorts/comparators.dm | 20 + code/_helpers/time.dm | 22 +- code/_macros.dm | 11 + .../ProcessScheduler/core/process.dm | 1 - code/controllers/Processes/ticker.dm | 3 + code/controllers/configuration.dm | 10 +- code/controllers/controller.dm | 19 + code/controllers/failsafe.dm | 102 +++ code/controllers/master.dm | 519 ++++++++++++++ code/controllers/master_controller.dm | 6 +- code/controllers/subsystem.dm | 192 +++++ code/controllers/subsystems.dm | 46 -- code/controllers/verbs.dm | 54 +- polaris.dme | 11 +- 21 files changed, 1763 insertions(+), 61 deletions(-) create mode 100644 code/__defines/MC.dm create mode 100644 code/__defines/math.dm create mode 100644 code/__defines/tick.dm create mode 100644 code/_helpers/sorts/TimSort.dm create mode 100644 code/_helpers/sorts/__main.dm create mode 100644 code/_helpers/sorts/comparators.dm create mode 100644 code/controllers/controller.dm create mode 100644 code/controllers/failsafe.dm create mode 100644 code/controllers/master.dm create mode 100644 code/controllers/subsystem.dm delete mode 100644 code/controllers/subsystems.dm diff --git a/code/__defines/MC.dm b/code/__defines/MC.dm new file mode 100644 index 0000000000..90724a2f98 --- /dev/null +++ b/code/__defines/MC.dm @@ -0,0 +1,53 @@ +#define MC_TICK_CHECK ( ( world.tick_usage > CURRENT_TICKLIMIT || src.state != SS_RUNNING ) ? pause() : 0 ) +// Used to smooth out costs to try and avoid oscillation. +#define MC_AVERAGE_FAST(average, current) (0.7 * (average) + 0.3 * (current)) +#define MC_AVERAGE(average, current) (0.8 * (average) + 0.2 * (current)) +#define MC_AVERAGE_SLOW(average, current) (0.9 * (average) + 0.1 * (current)) +#define NEW_SS_GLOBAL(varname) if(varname != src){if(istype(varname)){Recover();qdel(varname);}varname = src;} + +#define START_PROCESSING(Processor, Datum) if (!Datum.isprocessing) {Datum.isprocessing = 1;Processor.processing += Datum} +#define STOP_PROCESSING(Processor, Datum) Datum.isprocessing = 0;Processor.processing -= Datum + +//SubSystem flags (Please design any new flags so that the default is off, to make adding flags to subsystems easier) + +//subsystem should fire during pre-game lobby. +#define SS_FIRE_IN_LOBBY 1 + +//subsystem does not initialize. +#define SS_NO_INIT 2 + +//subsystem does not fire. +// (like can_fire = 0, but keeps it from getting added to the processing subsystems list) +// (Requires a MC restart to change) +#define SS_NO_FIRE 4 + +//subsystem only runs on spare cpu (after all non-background subsystems have ran that tick) +// SS_BACKGROUND has its own priority bracket +#define SS_BACKGROUND 8 + +//subsystem does not tick check, and should not run unless there is enough time (or its running behind (unless background)) +#define SS_NO_TICK_CHECK 16 + +//Treat wait as a tick count, not DS, run every wait ticks. +// (also forces it to run first in the tick, above even SS_NO_TICK_CHECK subsystems) +// (implies SS_FIRE_IN_LOBBY because of how it works) +// (overrides SS_BACKGROUND) +// This is designed for basically anything that works as a mini-mc (like SStimer) +#define SS_TICKER 32 + +//keep the subsystem's timing on point by firing early if it fired late last fire because of lag +// ie: if a 20ds subsystem fires say 5 ds late due to lag or what not, its next fire would be in 15ds, not 20ds. +#define SS_KEEP_TIMING 64 + +//Calculate its next fire after its fired. +// (IE: if a 5ds wait SS takes 2ds to run, its next fire should be 5ds away, not 3ds like it normally would be) +// This flag overrides SS_KEEP_TIMING +#define SS_POST_FIRE_TIMING 128 + +//SUBSYSTEM STATES +#define SS_IDLE 0 //aint doing shit. +#define SS_QUEUED 1 //queued to run +#define SS_RUNNING 2 //actively running +#define SS_PAUSED 3 //paused by mc_tick_check +#define SS_SLEEPING 4 //fire() slept. +#define SS_PAUSING 5 //in the middle of pausing diff --git a/code/__defines/math.dm b/code/__defines/math.dm new file mode 100644 index 0000000000..0729a4526d --- /dev/null +++ b/code/__defines/math.dm @@ -0,0 +1,10 @@ +//"fancy" math for calculating time in ms from tick_usage percentage and the length of ticks +//percent_of_tick_used * (ticklag * 100(to convert to ms)) / 100(percent ratio) +//collapsed to percent_of_tick_used * tick_lag +#define TICK_DELTA_TO_MS(percent_of_tick_used) ((percent_of_tick_used) * world.tick_lag) +#define TICK_USAGE_TO_MS(starting_tickusage) (TICK_DELTA_TO_MS(world.tick_usage-starting_tickusage)) + +//time of day but automatically adjusts to the server going into the next day within the same round. +//for when you need a reliable time number that doesn't depend on byond time. +#define REALTIMEOFDAY (world.timeofday + (MIDNIGHT_ROLLOVER * MIDNIGHT_ROLLOVER_CHECK)) +#define MIDNIGHT_ROLLOVER_CHECK ( rollovercheck_last_timeofday != world.timeofday ? update_midnight_rollover() : midnight_rollovers ) diff --git a/code/__defines/misc.dm b/code/__defines/misc.dm index f85ac5e7d4..12deebbfc1 100644 --- a/code/__defines/misc.dm +++ b/code/__defines/misc.dm @@ -196,3 +196,5 @@ #define TSC_MORPH "Morpheus" #define TSC_XION "Xion" // Not really needed but consistancy I guess. #define TSC_GIL "Gilthari" + +#define MIDNIGHT_ROLLOVER 864000 //number of deciseconds in a day diff --git a/code/__defines/tick.dm b/code/__defines/tick.dm new file mode 100644 index 0000000000..3fa6e21bf3 --- /dev/null +++ b/code/__defines/tick.dm @@ -0,0 +1,7 @@ +#define TICK_LIMIT_RUNNING 80 +#define TICK_LIMIT_TO_RUN 78 +#define TICK_LIMIT_MC 70 +#define TICK_LIMIT_MC_INIT_DEFAULT 98 + +#define TICK_CHECK ( world.tick_usage > CURRENT_TICKLIMIT ) +#define CHECK_TICK if TICK_CHECK stoplag() diff --git a/code/_helpers/lists.dm b/code/_helpers/lists.dm index 30df4693db..e647cd1df7 100644 --- a/code/_helpers/lists.dm +++ b/code/_helpers/lists.dm @@ -599,3 +599,66 @@ proc/dd_sortedTextList(list/incoming) for(var/path in subtypesof(prototype)) L += new path() return L + +//creates every subtype of prototype (excluding prototype) and adds it to list L as a type/instance pair. +//if no list/L is provided, one is created. +/proc/init_subtypes_assoc(prototype, list/L) + if(!istype(L)) L = list() + for(var/path in subtypesof(prototype)) + L[path] = new path() + return L + +//Move a single element from position fromIndex within a list, to position toIndex +//All elements in the range [1,toIndex) before the move will be before the pivot afterwards +//All elements in the range [toIndex, L.len+1) before the move will be after the pivot afterwards +//In other words, it's as if the range [fromIndex,toIndex) have been rotated using a <<< operation common to other languages. +//fromIndex and toIndex must be in the range [1,L.len+1] +//This will preserve associations ~Carnie +/proc/moveElement(list/L, fromIndex, toIndex) + if(fromIndex == toIndex || fromIndex+1 == toIndex) //no need to move + return + if(fromIndex > toIndex) + ++fromIndex //since a null will be inserted before fromIndex, the index needs to be nudged right by one + + L.Insert(toIndex, null) + L.Swap(fromIndex, toIndex) + L.Cut(fromIndex, fromIndex+1) + +//Move elements [fromIndex,fromIndex+len) to [toIndex-len, toIndex) +//Same as moveElement but for ranges of elements +//This will preserve associations ~Carnie +/proc/moveRange(list/L, fromIndex, toIndex, len=1) + var/distance = abs(toIndex - fromIndex) + if(len >= distance) //there are more elements to be moved than the distance to be moved. Therefore the same result can be achieved (with fewer operations) by moving elements between where we are and where we are going. The result being, our range we are moving is shifted left or right by dist elements + if(fromIndex <= toIndex) + return //no need to move + fromIndex += len //we want to shift left instead of right + + for(var/i=0, i toIndex) + fromIndex += len + + for(var/i=0, i= 2) + fromIndex = fromIndex % L.len + toIndex = toIndex % (L.len+1) + if(fromIndex <= 0) + fromIndex += L.len + if(toIndex <= 0) + toIndex += L.len + 1 + + sortInstance.L = L + sortInstance.cmp = cmp + sortInstance.associative = associative + + sortInstance.timSort(fromIndex, toIndex) + + return L diff --git a/code/_helpers/sorts/__main.dm b/code/_helpers/sorts/__main.dm new file mode 100644 index 0000000000..622d88f147 --- /dev/null +++ b/code/_helpers/sorts/__main.dm @@ -0,0 +1,656 @@ + //These are macros used to reduce on proc calls +#define fetchElement(L, i) (associative) ? L[L[i]] : L[i] + + //Minimum sized sequence that will be merged. Anything smaller than this will use binary-insertion sort. + //Should be a power of 2 +#define MIN_MERGE 32 + + //When we get into galloping mode, we stay there until both runs win less often than MIN_GALLOP consecutive times. +#define MIN_GALLOP 7 + + //This is a global instance to allow much of this code to be reused. The interfaces are kept separately +var/datum/sortInstance/sortInstance = new() +/datum/sortInstance + //The array being sorted. + var/list/L + + //The comparator proc-reference + var/cmp = /proc/cmp_numeric_asc + + //whether we are sorting list keys (0: L[i]) or associated values (1: L[L[i]]) + var/associative = 0 + + //This controls when we get *into* galloping mode. It is initialized to MIN_GALLOP. + //The mergeLo and mergeHi methods nudge it higher for random data, and lower for highly structured data. + var/minGallop = MIN_GALLOP + + //Stores information regarding runs yet to be merged. + //Run i starts at runBase[i] and extends for runLen[i] elements. + //runBase[i] + runLen[i] == runBase[i+1] + //var/stackSize + var/list/runBases = list() + var/list/runLens = list() + + +/datum/sortInstance/proc/timSort(start, end) + runBases.Cut() + runLens.Cut() + + var/remaining = end - start + + //If array is small, do a 'mini-TimSort' with no merges + if(remaining < MIN_MERGE) + var/initRunLen = countRunAndMakeAscending(start, end) + binarySort(start, end, start+initRunLen) + return + + //March over the array finding natural runs + //Extend any short natural runs to runs of length minRun + var/minRun = minRunLength(remaining) + + do + //identify next run + var/runLen = countRunAndMakeAscending(start, end) + + //if run is short, extend to min(minRun, remaining) + if(runLen < minRun) + var/force = (remaining <= minRun) ? remaining : minRun + + binarySort(start, start+force, start+runLen) + runLen = force + + //add data about run to queue + runBases.Add(start) + runLens.Add(runLen) + + //maybe merge + mergeCollapse() + + //Advance to find next run + start += runLen + remaining -= runLen + + while(remaining > 0) + + + //Merge all remaining runs to complete sort + //ASSERT(start == end) + mergeForceCollapse(); + //ASSERT(runBases.len == 1) + + //reset minGallop, for successive calls + minGallop = MIN_GALLOP + + return L + +/* +Sorts the specified portion of the specified array using a binary +insertion sort. This is the best method for sorting small numbers +of elements. It requires O(n log n) compares, but O(n^2) data +movement (worst case). + +If the initial part of the specified range is already sorted, +this method can take advantage of it: the method assumes that the +elements in range [lo,start) are already sorted + +lo the index of the first element in the range to be sorted +hi the index after the last element in the range to be sorted +start the index of the first element in the range that is not already known to be sorted +*/ +/datum/sortInstance/proc/binarySort(lo, hi, start) + //ASSERT(lo <= start && start <= hi) + if(start <= lo) + start = lo + 1 + + for(,start < hi, ++start) + var/pivot = fetchElement(L,start) + + //set left and right to the index where pivot belongs + var/left = lo + var/right = start + //ASSERT(left <= right) + + //[lo, left) elements <= pivot < [right, start) elements + //in other words, find where the pivot element should go using bisection search + while(left < right) + var/mid = (left + right) >> 1 //round((left+right)/2) + if(call(cmp)(fetchElement(L,mid), pivot) > 0) + right = mid + else + left = mid+1 + + //ASSERT(left == right) + moveElement(L, start, left) //move pivot element to correct location in the sorted range + +/* +Returns the length of the run beginning at the specified position and reverses the run if it is back-to-front + +A run is the longest ascending sequence with: + a[lo] <= a[lo + 1] <= a[lo + 2] <= ... +or the longest descending sequence with: + a[lo] > a[lo + 1] > a[lo + 2] > ... + +For its intended use in a stable mergesort, the strictness of the +definition of "descending" is needed so that the call can safely +reverse a descending sequence without violating stability. +*/ +/datum/sortInstance/proc/countRunAndMakeAscending(lo, hi) + //ASSERT(lo < hi) + + var/runHi = lo + 1 + if(runHi >= hi) + return 1 + + var/last = fetchElement(L,lo) + var/current = fetchElement(L,runHi++) + + if(call(cmp)(current, last) < 0) + while(runHi < hi) + last = current + current = fetchElement(L,runHi) + if(call(cmp)(current, last) >= 0) + break + ++runHi + reverseRange(L, lo, runHi) + else + while(runHi < hi) + last = current + current = fetchElement(L,runHi) + if(call(cmp)(current, last) < 0) + break + ++runHi + + return runHi - lo + +//Returns the minimum acceptable run length for an array of the specified length. +//Natural runs shorter than this will be extended with binarySort +/datum/sortInstance/proc/minRunLength(n) + //ASSERT(n >= 0) + var/r = 0 //becomes 1 if any bits are shifted off + while(n >= MIN_MERGE) + r |= (n & 1) + n >>= 1 + return n + r + +//Examines the stack of runs waiting to be merged and merges adjacent runs until the stack invariants are reestablished: +// runLen[i-3] > runLen[i-2] + runLen[i-1] +// runLen[i-2] > runLen[i-1] +//This method is called each time a new run is pushed onto the stack. +//So the invariants are guaranteed to hold for i= 2) + var/n = runBases.len - 1 + if(n > 1 && runLens[n-1] <= runLens[n] + runLens[n+1]) + if(runLens[n-1] < runLens[n+1]) + --n + mergeAt(n) + else if(runLens[n] <= runLens[n+1]) + mergeAt(n) + else + break //Invariant is established + + +//Merges all runs on the stack until only one remains. +//Called only once, to finalise the sort +/datum/sortInstance/proc/mergeForceCollapse() + while(runBases.len >= 2) + var/n = runBases.len - 1 + if(n > 1 && runLens[n-1] < runLens[n+1]) + --n + mergeAt(n) + + +//Merges the two consecutive runs at stack indices i and i+1 +//Run i must be the penultimate or antepenultimate run on the stack +//In other words, i must be equal to stackSize-2 or stackSize-3 +/datum/sortInstance/proc/mergeAt(i) + //ASSERT(runBases.len >= 2) + //ASSERT(i >= 1) + //ASSERT(i == runBases.len - 1 || i == runBases.len - 2) + + var/base1 = runBases[i] + var/base2 = runBases[i+1] + var/len1 = runLens[i] + var/len2 = runLens[i+1] + + //ASSERT(len1 > 0 && len2 > 0) + //ASSERT(base1 + len1 == base2) + + //Record the legth of the combined runs. If i is the 3rd last run now, also slide over the last run + //(which isn't involved in this merge). The current run (i+1) goes away in any case. + runLens[i] += runLens[i+1] + runLens.Cut(i+1, i+2) + runBases.Cut(i+1, i+2) + + + //Find where the first element of run2 goes in run1. + //Prior elements in run1 can be ignored (because they're already in place) + var/k = gallopRight(fetchElement(L,base2), base1, len1, 0) + //ASSERT(k >= 0) + base1 += k + len1 -= k + if(len1 == 0) + return + + //Find where the last element of run1 goes in run2. + //Subsequent elements in run2 can be ignored (because they're already in place) + len2 = gallopLeft(fetchElement(L,base1 + len1 - 1), base2, len2, len2-1) + //ASSERT(len2 >= 0) + if(len2 == 0) + return + + //Merge remaining runs, using tmp array with min(len1, len2) elements + if(len1 <= len2) + mergeLo(base1, len1, base2, len2) + else + mergeHi(base1, len1, base2, len2) + + +/* + Locates the position to insert key within the specified sorted range + If the range contains elements equal to key, this will return the index of the LEFTMOST of those elements + + key the element to be inserted into the sorted range + base the index of the first element of the sorted range + len the length of the sorted range, must be greater than 0 + hint the offset from base at which to begin the search, such that 0 <= hint < len; i.e. base <= hint < base+hint + + Returns the index at which to insert element 'key' +*/ +/datum/sortInstance/proc/gallopLeft(key, base, len, hint) + //ASSERT(len > 0 && hint >= 0 && hint < len) + + var/lastOffset = 0 + var/offset = 1 + if(call(cmp)(key, fetchElement(L,base+hint)) > 0) + var/maxOffset = len - hint + while(offset < maxOffset && call(cmp)(key, fetchElement(L,base+hint+offset)) > 0) + lastOffset = offset + offset = (offset << 1) + 1 + + if(offset > maxOffset) + offset = maxOffset + + lastOffset += hint + offset += hint + + else + var/maxOffset = hint + 1 + while(offset < maxOffset && call(cmp)(key, fetchElement(L,base+hint-offset)) <= 0) + lastOffset = offset + offset = (offset << 1) + 1 + + if(offset > maxOffset) + offset = maxOffset + + var/temp = lastOffset + lastOffset = hint - offset + offset = hint - temp + + //ASSERT(-1 <= lastOffset && lastOffset < offset && offset <= len) + + //Now L[base+lastOffset] < key <= L[base+offset], so key belongs somewhere to the right of lastOffset but no farther than + //offset. Do a binary search with invariant L[base+lastOffset-1] < key <= L[base+offset] + ++lastOffset + while(lastOffset < offset) + var/m = lastOffset + ((offset - lastOffset) >> 1) + + if(call(cmp)(key, fetchElement(L,base+m)) > 0) + lastOffset = m + 1 + else + offset = m + + //ASSERT(lastOffset == offset) + return offset + +/** + * Like gallopLeft, except that if the range contains an element equal to + * key, gallopRight returns the index after the rightmost equal element. + * + * @param key the key whose insertion point to search for + * @param a the array in which to search + * @param base the index of the first element in the range + * @param len the length of the range; must be > 0 + * @param hint the index at which to begin the search, 0 <= hint < n. + * The closer hint is to the result, the faster this method will run. + * @param c the comparator used to order the range, and to search + * @return the int k, 0 <= k <= n such that a[b + k - 1] <= key < a[b + k] + */ +/datum/sortInstance/proc/gallopRight(key, base, len, hint) + //ASSERT(len > 0 && hint >= 0 && hint < len) + + var/offset = 1 + var/lastOffset = 0 + if(call(cmp)(key, fetchElement(L,base+hint)) < 0) //key <= L[base+hint] + var/maxOffset = hint + 1 //therefore we want to insert somewhere in the range [base,base+hint] = [base+,base+(hint+1)) + while(offset < maxOffset && call(cmp)(key, fetchElement(L,base+hint-offset)) < 0) //we are iterating backwards + lastOffset = offset + offset = (offset << 1) + 1 //1 3 7 15 + //if(offset <= 0) //int overflow, not an issue here since we are using floats + // offset = maxOffset + + if(offset > maxOffset) + offset = maxOffset + + var/temp = lastOffset + lastOffset = hint - offset + offset = hint - temp + + else //key > L[base+hint] + var/maxOffset = len - hint //therefore we want to insert somewhere in the range (base+hint,base+len) = [base+hint+1, base+hint+(len-hint)) + while(offset < maxOffset && call(cmp)(key, fetchElement(L,base+hint+offset)) >= 0) + lastOffset = offset + offset = (offset << 1) + 1 + //if(offset <= 0) //int overflow, not an issue here since we are using floats + // offset = maxOffset + + if(offset > maxOffset) + offset = maxOffset + + lastOffset += hint + offset += hint + + //ASSERT(-1 <= lastOffset && lastOffset < offset && offset <= len) + + ++lastOffset + while(lastOffset < offset) + var/m = lastOffset + ((offset - lastOffset) >> 1) + + if(call(cmp)(key, fetchElement(L,base+m)) < 0) //key <= L[base+m] + offset = m + else //key > L[base+m] + lastOffset = m + 1 + + //ASSERT(lastOffset == offset) + + return offset + + +//Merges two adjacent runs in-place in a stable fashion. +//For performance this method should only be called when len1 <= len2! +/datum/sortInstance/proc/mergeLo(base1, len1, base2, len2) + //ASSERT(len1 > 0 && len2 > 0 && base1 + len1 == base2) + + var/cursor1 = base1 + var/cursor2 = base2 + + //degenerate cases + if(len2 == 1) + moveElement(L, cursor2, cursor1) + return + + if(len1 == 1) + moveElement(L, cursor1, cursor2+len2) + return + + + //Move first element of second run + moveElement(L, cursor2++, cursor1++) + --len2 + + outer: + while(1) + var/count1 = 0 //# of times in a row that first run won + var/count2 = 0 // " " " " " " second run won + + //do the straightfoward thin until one run starts winning consistently + + do + //ASSERT(len1 > 1 && len2 > 0) + if(call(cmp)(fetchElement(L,cursor2), fetchElement(L,cursor1)) < 0) + moveElement(L, cursor2++, cursor1++) + --len2 + + ++count2 + count1 = 0 + + if(len2 == 0) + break outer + else + ++cursor1 + + ++count1 + count2 = 0 + + if(--len1 == 1) + break outer + + while((count1 | count2) < minGallop) + + + //one run is winning consistently so galloping may provide huge benifits + //so try galloping, until such time as the run is no longer consistently winning + do + //ASSERT(len1 > 1 && len2 > 0) + + count1 = gallopRight(fetchElement(L,cursor2), cursor1, len1, 0) + if(count1) + cursor1 += count1 + len1 -= count1 + + if(len1 <= 1) + break outer + + moveElement(L, cursor2, cursor1) + ++cursor2 + ++cursor1 + if(--len2 == 0) + break outer + + count2 = gallopLeft(fetchElement(L,cursor1), cursor2, len2, 0) + if(count2) + moveRange(L, cursor2, cursor1, count2) + + cursor2 += count2 + cursor1 += count2 + len2 -= count2 + + if(len2 == 0) + break outer + + ++cursor1 + if(--len1 == 1) + break outer + + --minGallop + + while((count1|count2) > MIN_GALLOP) + + if(minGallop < 0) + minGallop = 0 + minGallop += 2; // Penalize for leaving gallop mode + + + if(len1 == 1) + //ASSERT(len2 > 0) + moveElement(L, cursor1, cursor2+len2) + + //else + //ASSERT(len2 == 0) + //ASSERT(len1 > 1) + + +/datum/sortInstance/proc/mergeHi(base1, len1, base2, len2) + //ASSERT(len1 > 0 && len2 > 0 && base1 + len1 == base2) + + var/cursor1 = base1 + len1 - 1 //start at end of sublists + var/cursor2 = base2 + len2 - 1 + + //degenerate cases + if(len2 == 1) + moveElement(L, base2, base1) + return + + if(len1 == 1) + moveElement(L, base1, cursor2+1) + return + + moveElement(L, cursor1--, cursor2-- + 1) + --len1 + + outer: + while(1) + var/count1 = 0 //# of times in a row that first run won + var/count2 = 0 // " " " " " " second run won + + //do the straightfoward thing until one run starts winning consistently + do + //ASSERT(len1 > 0 && len2 > 1) + if(call(cmp)(fetchElement(L,cursor2), fetchElement(L,cursor1)) < 0) + moveElement(L, cursor1--, cursor2-- + 1) + --len1 + + ++count1 + count2 = 0 + + if(len1 == 0) + break outer + else + --cursor2 + --len2 + + ++count2 + count1 = 0 + + if(len2 == 1) + break outer + while((count1 | count2) < minGallop) + + //one run is winning consistently so galloping may provide huge benifits + //so try galloping, until such time as the run is no longer consistently winning + do + //ASSERT(len1 > 0 && len2 > 1) + + count1 = len1 - gallopRight(fetchElement(L,cursor2), base1, len1, len1-1) //should cursor1 be base1? + if(count1) + cursor1 -= count1 + + moveRange(L, cursor1+1, cursor2+1, count1) //cursor1+1 == cursor2 by definition + + cursor2 -= count1 + len1 -= count1 + + if(len1 == 0) + break outer + + --cursor2 + + if(--len2 == 1) + break outer + + count2 = len2 - gallopLeft(fetchElement(L,cursor1), cursor1+1, len2, len2-1) + if(count2) + cursor2 -= count2 + len2 -= count2 + + if(len2 <= 1) + break outer + + moveElement(L, cursor1--, cursor2-- + 1) + --len1 + + if(len1 == 0) + break outer + + --minGallop + while((count1|count2) > MIN_GALLOP) + + if(minGallop < 0) + minGallop = 0 + minGallop += 2 // Penalize for leaving gallop mode + + if(len2 == 1) + //ASSERT(len1 > 0) + + cursor1 -= len1 + moveRange(L, cursor1+1, cursor2+1, len1) + + //else + //ASSERT(len1 == 0) + //ASSERT(len2 > 0) + + +/datum/sortInstance/proc/mergeSort(start, end) + var/remaining = end - start + + //If array is small, do an insertion sort + if(remaining < MIN_MERGE) + //var/initRunLen = countRunAndMakeAscending(start, end) + binarySort(start, end, start/*+initRunLen*/) + return + + var/minRun = minRunLength(remaining) + + do + var/runLen = (remaining <= minRun) ? remaining : minRun + + binarySort(start, start+runLen, start) + + //add data about run to queue + runBases.Add(start) + runLens.Add(runLen) + + //Advance to find next run + start += runLen + remaining -= runLen + + while(remaining > 0) + + while(runBases.len >= 2) + var/n = runBases.len - 1 + if(n > 1 && runLens[n-1] <= runLens[n] + runLens[n+1]) + if(runLens[n-1] < runLens[n+1]) + --n + mergeAt2(n) + else if(runLens[n] <= runLens[n+1]) + mergeAt2(n) + else + break //Invariant is established + + while(runBases.len >= 2) + var/n = runBases.len - 1 + if(n > 1 && runLens[n-1] < runLens[n+1]) + --n + mergeAt2(n) + + return L + +/datum/sortInstance/proc/mergeAt2(i) + var/cursor1 = runBases[i] + var/cursor2 = runBases[i+1] + + var/end1 = cursor1+runLens[i] + var/end2 = cursor2+runLens[i+1] + + var/val1 = fetchElement(L,cursor1) + var/val2 = fetchElement(L,cursor2) + + while(1) + if(call(cmp)(val1,val2) < 0) + if(++cursor1 >= end1) + break + val1 = fetchElement(L,cursor1) + else + moveElement(L,cursor2,cursor1) + + ++cursor2 + if(++cursor2 >= end2) + break + ++end1 + ++cursor1 + //if(++cursor1 >= end1) + // break + + val2 = fetchElement(L,cursor2) + + + //Record the legth of the combined runs. If i is the 3rd last run now, also slide over the last run + //(which isn't involved in this merge). The current run (i+1) goes away in any case. + runLens[i] += runLens[i+1] + runLens.Cut(i+1, i+2) + runBases.Cut(i+1, i+2) + +#undef MIN_GALLOP +#undef MIN_MERGE + +#undef fetchElement diff --git a/code/_helpers/sorts/comparators.dm b/code/_helpers/sorts/comparators.dm new file mode 100644 index 0000000000..8c1f954a00 --- /dev/null +++ b/code/_helpers/sorts/comparators.dm @@ -0,0 +1,20 @@ +// +// Comparators for use with /datum/sortInstance (or wherever you want) +// They should return negative, zero, or positive numbers for a < b, a == b, and a > b respectively. +// + +// Sorts numeric ascending +/proc/cmp_numeric_asc(a,b) + return a - b + +// Sorts subsystems alphabetically +/proc/cmp_subsystem_display(datum/controller/subsystem/a, datum/controller/subsystem/b) + return sorttext(b.name, a.name) + +// Sorts subsystems by init_order +/proc/cmp_subsystem_init(datum/controller/subsystem/a, datum/controller/subsystem/b) + return b.init_order - a.init_order + +// Sorts subsystems by priority +/proc/cmp_subsystem_priority(datum/controller/subsystem/a, datum/controller/subsystem/b) + return a.priority - b.priority diff --git a/code/_helpers/time.dm b/code/_helpers/time.dm index 991d64e20b..b3989a32a4 100644 --- a/code/_helpers/time.dm +++ b/code/_helpers/time.dm @@ -100,4 +100,24 @@ var/round_start_time = 0 /hook/startup/proc/set_roundstart_hour() roundstart_hour = pick(2,7,12,17) - return 1 \ No newline at end of file + return 1 + +/var/midnight_rollovers = 0 +/var/rollovercheck_last_timeofday = 0 +/proc/update_midnight_rollover() + if (world.timeofday < rollovercheck_last_timeofday) //TIME IS GOING BACKWARDS! + return midnight_rollovers++ + return midnight_rollovers + +//Increases delay as the server gets more overloaded, +//as sleeps aren't cheap and sleeping only to wake up and sleep again is wasteful +#define DELTA_CALC max(((max(world.tick_usage, world.cpu) / 100) * max(Master.sleep_delta,1)), 1) + +/proc/stoplag() + . = 0 + var/i = 1 + do + . += round(i*DELTA_CALC) + sleep(i*world.tick_lag*DELTA_CALC) + i *= 2 + while (world.tick_usage > min(TICK_LIMIT_TO_RUN, CURRENT_TICKLIMIT)) diff --git a/code/_macros.dm b/code/_macros.dm index 463a7da26d..befbc99a54 100644 --- a/code/_macros.dm +++ b/code/_macros.dm @@ -49,5 +49,16 @@ #define RANDOM_BLOOD_TYPE pick(4;"O-", 36;"O+", 3;"A-", 28;"A+", 1;"B-", 20;"B+", 1;"AB-", 5;"AB+") #define to_chat(target, message) target << message +#define to_world(message) world << message +#define to_world_log(message) world.log << message +// TODO - Baystation has this log to crazy places. For now lets just world.log, but maybe look into it later. +#define log_world(message) world.log << message + #define CanInteract(user, state) (CanUseTopic(user, state) == STATUS_INTERACTIVE) + +#define qdel_null_list(x) if(x) { for(var/y in x) { qdel(y) } ; x = null } + +#define qdel_null(x) if(x) { qdel(x) ; x = null } + +#define ARGS_DEBUG log_debug("[__FILE__] - [__LINE__]") ; for(var/arg in args) { log_debug("\t[log_info_line(arg)]") } diff --git a/code/controllers/ProcessScheduler/core/process.dm b/code/controllers/ProcessScheduler/core/process.dm index 323c5f7663..edcb8d703c 100644 --- a/code/controllers/ProcessScheduler/core/process.dm +++ b/code/controllers/ProcessScheduler/core/process.dm @@ -35,7 +35,6 @@ * Config vars */ // Process name - var/name // Process schedule interval // This controls how often the process would run under ideal conditions. diff --git a/code/controllers/Processes/ticker.dm b/code/controllers/Processes/ticker.dm index b7c45ba91a..6fa6d43237 100644 --- a/code/controllers/Processes/ticker.dm +++ b/code/controllers/Processes/ticker.dm @@ -33,3 +33,6 @@ var/global/datum/controller/process/ticker/tickerProcess /datum/controller/process/ticker/proc/getLastTickerTimeDuration() return lastTickerTimeDuration + +/world/proc/has_round_started() + return (ticker && ticker.current_state >= GAME_STATE_PLAYING) diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 5021453462..64ae30116a 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -46,7 +46,8 @@ var/list/gamemode_cache = list() var/continous_rounds = 0 // Gamemodes which end instantly will instead keep on going until the round ends by escape shuttle or nuke. var/allow_Metadata = 0 // Metadata is supported. var/popup_admin_pm = 0 //adminPMs to non-admins show in a pop-up 'reply' window when set to 1. - var/Ticklag = 0.9 + var/fps = 20 + var/tick_limit_mc_init = TICK_LIMIT_MC_INIT_DEFAULT //SSinitialization throttling var/Tickcomp = 0 var/socket_talk = 0 // use socket_talk to communicate with other processes var/list/resource_urls = null @@ -564,7 +565,12 @@ var/list/gamemode_cache = list() irc_bot_export = 1 if("ticklag") - Ticklag = text2num(value) + var/ticklag = text2num(value) + if(ticklag > 0) + fps = 10 / ticklag + + if("tick_limit_mc_init") + tick_limit_mc_init = text2num(value) if("allow_antag_hud") config.antag_hud_allowed = 1 diff --git a/code/controllers/controller.dm b/code/controllers/controller.dm new file mode 100644 index 0000000000..c9d5f1e565 --- /dev/null +++ b/code/controllers/controller.dm @@ -0,0 +1,19 @@ +/datum/controller + var/name + // The object used for the clickable stat() button. + var/obj/effect/statclick/statclick + +/datum/controller/proc/Initialize() + +//cleanup actions +/datum/controller/proc/Shutdown() + +//when we enter dmm_suite.load_map +/datum/controller/proc/StartLoadingMap() + +//when we exit dmm_suite.load_map +/datum/controller/proc/StopLoadingMap() + +/datum/controller/proc/Recover() + +/datum/controller/proc/stat_entry() diff --git a/code/controllers/failsafe.dm b/code/controllers/failsafe.dm new file mode 100644 index 0000000000..98c6a5d89d --- /dev/null +++ b/code/controllers/failsafe.dm @@ -0,0 +1,102 @@ + /** + * Failsafe + * + * Pretty much pokes the MC to make sure it's still alive. + **/ + +var/datum/controller/failsafe/Failsafe + +/datum/controller/failsafe // This thing pretty much just keeps poking the master controller + name = "Failsafe" + + // The length of time to check on the MC (in deciseconds). + // Set to 0 to disable. + var/processing_interval = 20 + // The alert level. For every failed poke, we drop a DEFCON level. Once we hit DEFCON 1, restart the MC. + var/defcon = 5 + //the world.time of the last check, so the mc can restart US if we hang. + // (Real friends look out for *eachother*) + var/lasttick = 0 + + // Track the MC iteration to make sure its still on track. + var/master_iteration = 0 + var/running = TRUE + +/datum/controller/failsafe/New() + // Highlander-style: there can only be one! Kill off the old and replace it with the new. + if(Failsafe != src) + if(istype(Failsafe)) + qdel(Failsafe) + Failsafe = src + Initialize() + +/datum/controller/failsafe/Initialize() + set waitfor = 0 + Failsafe.Loop() + if(!deleted(src)) + qdel(src) //when Loop() returns, we delete ourselves and let the mc recreate us + +/datum/controller/failsafe/Destroy() + running = FALSE + ..() + // return QDEL_HINT_HARDDEL_NOW // TODO - Once we port garbage.dm + +/datum/controller/failsafe/proc/Loop() + while(running) + lasttick = world.time + if(!Master) + // Replace the missing Master! This should never, ever happen. + new /datum/controller/master() + // Only poke it if overrides are not in effect. + if(processing_interval > 0) + if(Master.processing && Master.iteration) + // Check if processing is done yet. + if(Master.iteration == master_iteration) + switch(defcon) + if(4,5) + --defcon + if(3) + to_chat(admins, "Notice: DEFCON [defcon_pretty()]. The Master Controller has not fired in the last [(5-defcon) * processing_interval] ticks.") + --defcon + if(2) + to_chat(admins, "Warning: DEFCON [defcon_pretty()]. The Master Controller has not fired in the last [(5-defcon) * processing_interval] ticks. Automatic restart in [processing_interval] ticks.") + --defcon + if(1) + + to_chat(admins, "Warning: DEFCON [defcon_pretty()]. The Master Controller has still not fired within the last [(5-defcon) * processing_interval] ticks. Killing and restarting...") + --defcon + var/rtn = Recreate_MC() + if(rtn > 0) + defcon = 4 + master_iteration = 0 + to_chat(admins, "MC restarted successfully") + else if(rtn < 0) + log_game("FailSafe: Could not restart MC, runtime encountered. Entering defcon 0") + to_chat(admins, "ERROR: DEFCON [defcon_pretty()]. Could not restart MC, runtime encountered. I will silently keep retrying.") + //if the return number was 0, it just means the mc was restarted too recently, and it just needs some time before we try again + //no need to handle that specially when defcon 0 can handle it + if(0) //DEFCON 0! (mc failed to restart) + var/rtn = Recreate_MC() + if(rtn > 0) + defcon = 4 + master_iteration = 0 + to_chat(admins, "MC restarted successfully") + else + defcon = min(defcon + 1,5) + master_iteration = Master.iteration + if (defcon <= 1) + sleep(processing_interval*2) + else + sleep(processing_interval) + else + defcon = 5 + sleep(initial(processing_interval)) + +/datum/controller/failsafe/proc/defcon_pretty() + return defcon + +/datum/controller/failsafe/stat_entry() + if(!statclick) + statclick = new/obj/effect/statclick/debug(null, "Initializing...", src) + + stat("Failsafe Controller:", statclick.update("Defcon: [defcon_pretty()] (Interval: [Failsafe.processing_interval] | Iteration: [Failsafe.master_iteration])")) diff --git a/code/controllers/master.dm b/code/controllers/master.dm new file mode 100644 index 0000000000..4dcf58d45e --- /dev/null +++ b/code/controllers/master.dm @@ -0,0 +1,519 @@ + /** + * StonedMC + * + * Designed to properly split up a given tick among subsystems + * Note: if you read parts of this code and think "why is it doing it that way" + * Odds are, there is a reason + * + **/ +var/datum/controller/master/Master = new() +var/MC_restart_clear = 0 +var/MC_restart_timeout = 0 +var/MC_restart_count = 0 + + +//current tick limit, assigned by the queue controller before running a subsystem. +//used by check_tick as well so that the procs subsystems call can obey that SS's tick limits +var/CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING + +/datum/controller/master + name = "Master" + + // Are we processing (higher values increase the processing delay by n ticks) + var/processing = 1 + // How many times have we ran + var/iteration = 0 + + // world.time of last fire, for tracking lag outside of the mc + var/last_run + + // List of subsystems to process(). + var/list/subsystems + + // Vars for keeping track of tick drift. + var/init_timeofday + var/init_time + var/tickdrift = 0 + + var/sleep_delta + + var/make_runtime = 0 + + var/initializations_finished_with_no_players_logged_in //I wonder what this could be? + // Has round started? (So we know what subsystems to run) + var/round_started = 0 + + // The type of the last subsystem to be process()'d. + var/last_type_processed + + var/datum/controller/subsystem/queue_head //Start of queue linked list + var/datum/controller/subsystem/queue_tail //End of queue linked list (used for appending to the list) + var/queue_priority_count = 0 //Running total so that we don't have to loop thru the queue each run to split up the tick + var/queue_priority_count_bg = 0 //Same, but for background subsystems + var/map_loading = FALSE //Are we loading in a new map? + +/datum/controller/master/New() + // Highlander-style: there can only be one! Kill off the old and replace it with the new. + subsystems = list() + if (Master != src) + if (istype(Master)) + Recover() + qdel(Master) + else + init_subtypes(/datum/controller/subsystem, subsystems) + Master = src + +/datum/controller/master/Destroy() + ..() + // Tell qdel() to Del() this object. + // return QDEL_HINT_HARDDEL_NOW // TODO - Once we port garbage.dm + +/datum/controller/master/Shutdown() + processing = FALSE + for(var/datum/controller/subsystem/ss in subsystems) + ss.Shutdown() + +// Returns 1 if we created a new mc, 0 if we couldn't due to a recent restart, +// -1 if we encountered a runtime trying to recreate it +/proc/Recreate_MC() + . = -1 //so if we runtime, things know we failed + if (world.time < MC_restart_timeout) + return 0 + if (world.time < MC_restart_clear) + MC_restart_count *= 0.5 + + var/delay = 50 * ++MC_restart_count + MC_restart_timeout = world.time + delay + MC_restart_clear = world.time + (delay * 2) + Master.processing = 0 //stop ticking this one + try + new/datum/controller/master() + catch + return -1 + return 1 + + +/datum/controller/master/Recover() + var/msg = "## DEBUG: [time2text(world.timeofday)] MC restarted. Reports:\n" + for (var/varname in Master.vars) + switch (varname) + if("name", "tag", "bestF", "type", "parent_type", "vars", "statclick") // Built-in junk. + continue + else + var/varval = Master.vars[varname] + if (istype(varval, /datum)) // Check if it has a type var. + var/datum/D = varval + msg += "\t [varname] = [D]([D.type])\n" + else + msg += "\t [varname] = [varval]\n" + log_world(msg) + if (istype(Master.subsystems)) + subsystems = Master.subsystems + StartProcessing(10) + else + to_chat(world, "The Master Controller is having some issues, we will need to re-initialize EVERYTHING") + Initialize(20, TRUE) + + +// Please don't stuff random bullshit here, +// Make a subsystem, give it the SS_NO_FIRE flag, and do your work in it's Initialize() +/datum/controller/master/Initialize(delay, init_sss) + set waitfor = 0 + + if(delay) + sleep(delay) + + if(init_sss) + init_subtypes(/datum/controller/subsystem, subsystems) + + to_chat(world, "Initializing subsystems...") + + // Sort subsystems by init_order, so they initialize in the correct order. + sortTim(subsystems, /proc/cmp_subsystem_init) + + var/start_timeofday = REALTIMEOFDAY + // Initialize subsystems. + CURRENT_TICKLIMIT = config.tick_limit_mc_init + for (var/datum/controller/subsystem/SS in subsystems) + if (SS.flags & SS_NO_INIT) + continue + SS.Initialize(REALTIMEOFDAY) + CHECK_TICK + CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING + var/time = (REALTIMEOFDAY - start_timeofday) / 10 + + var/msg = "Initializations complete within [time] second[time == 1 ? "" : "s"]!" + to_chat(world, "[msg]") + log_world(msg) + + // Sort subsystems by display setting for easy access. + sortTim(subsystems, /proc/cmp_subsystem_display) + // Set world options. + world.sleep_offline = 1 + world.fps = config.fps + var/initialized_tod = REALTIMEOFDAY + sleep(1) + initializations_finished_with_no_players_logged_in = initialized_tod < REALTIMEOFDAY - 10 + // Loop. + Master.StartProcessing(0) + +// Notify the MC that the round has started. +/datum/controller/master/proc/RoundStart() + round_started = 1 + var/timer = world.time + for (var/datum/controller/subsystem/SS in subsystems) + if (SS.flags & SS_FIRE_IN_LOBBY || SS.flags & SS_TICKER) + continue //already firing + // Stagger subsystems. + timer += world.tick_lag * rand(1, 5) + SS.next_fire = timer + +// Starts the mc, and sticks around to restart it if the loop ever ends. +/datum/controller/master/proc/StartProcessing(delay) + set waitfor = 0 + if(delay) + sleep(delay) + var/rtn = Loop() + if (rtn > 0 || processing < 0) + return //this was suppose to happen. + //loop ended, restart the mc + log_game("MC crashed or runtimed, restarting") + message_admins("MC crashed or runtimed, restarting") + var/rtn2 = Recreate_MC() + if (rtn2 <= 0) + log_game("Failed to recreate MC (Error code: [rtn2]), it's up to the failsafe now") + message_admins("Failed to recreate MC (Error code: [rtn2]), it's up to the failsafe now") + Failsafe.defcon = 2 + +// Main loop. +/datum/controller/master/proc/Loop() + . = -1 + //Prep the loop (most of this is because we want MC restarts to reset as much state as we can, and because + // local vars rock + + // Schedule the first run of the Subsystems. + round_started = world.has_round_started() + //all this shit is here so that flag edits can be refreshed by restarting the MC. (and for speed) + var/list/tickersubsystems = list() + var/list/normalsubsystems = list() + var/list/lobbysubsystems = list() + var/timer = world.time + for (var/thing in subsystems) + var/datum/controller/subsystem/SS = thing + if (SS.flags & SS_NO_FIRE) + continue + SS.queued_time = 0 + SS.queue_next = null + SS.queue_prev = null + SS.state = SS_IDLE + if (SS.flags & SS_TICKER) + tickersubsystems += SS + timer += world.tick_lag * rand(1, 5) + SS.next_fire = timer + continue + if (SS.flags & SS_FIRE_IN_LOBBY) + lobbysubsystems += SS + timer += world.tick_lag * rand(1, 5) + SS.next_fire = timer + else if (round_started) + timer += world.tick_lag * rand(1, 5) + SS.next_fire = timer + normalsubsystems += SS + + queue_head = null + queue_tail = null + //these sort by lower priorities first to reduce the number of loops needed to add subsequent SS's to the queue + //(higher subsystems will be sooner in the queue, adding them later in the loop means we don't have to loop thru them next queue add) + sortTim(tickersubsystems, /proc/cmp_subsystem_priority) + sortTim(normalsubsystems, /proc/cmp_subsystem_priority) + sortTim(lobbysubsystems, /proc/cmp_subsystem_priority) + + normalsubsystems += tickersubsystems + lobbysubsystems += tickersubsystems + + init_timeofday = REALTIMEOFDAY + init_time = world.time + + iteration = 1 + var/error_level = 0 + var/sleep_delta = 0 + var/list/subsystems_to_check + //the actual loop. + while (1) + tickdrift = max(0, MC_AVERAGE_FAST(tickdrift, (((REALTIMEOFDAY - init_timeofday) - (world.time - init_time)) / world.tick_lag))) + if (processing <= 0) + CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING + sleep(10) + continue + + //if there are mutiple sleeping procs running before us hogging the cpu, we have to run later + // because sleeps are processed in the order received, so longer sleeps are more likely to run first + if (world.tick_usage > TICK_LIMIT_MC) + sleep_delta += 2 + CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING - (TICK_LIMIT_RUNNING * 0.5) + sleep(world.tick_lag * (processing + sleep_delta)) + continue + + sleep_delta = MC_AVERAGE_FAST(sleep_delta, 0) + if (last_run + (world.tick_lag * processing) > world.time) + sleep_delta += 1 + if (world.tick_usage > (TICK_LIMIT_MC*0.5)) + sleep_delta += 1 + + if (make_runtime) + var/datum/controller/subsystem/SS + SS.can_fire = 0 + if (!Failsafe || (Failsafe.processing_interval > 0 && (Failsafe.lasttick+(Failsafe.processing_interval*5)) < world.time)) + new/datum/controller/failsafe() // (re)Start the failsafe. + if (!queue_head || !(iteration % 3)) + if (round_started) + subsystems_to_check = normalsubsystems + else + subsystems_to_check = lobbysubsystems + else + subsystems_to_check = tickersubsystems + if (CheckQueue(subsystems_to_check) <= 0) + if (!SoftReset(tickersubsystems, normalsubsystems, lobbysubsystems)) + log_world("MC: SoftReset() failed, crashing") + return + if (!error_level) + iteration++ + error_level++ + CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING + sleep(10) + continue + + if (queue_head) + if (RunQueue() <= 0) + if (!SoftReset(tickersubsystems, normalsubsystems, lobbysubsystems)) + log_world("MC: SoftReset() failed, crashing") + return + if (!error_level) + iteration++ + error_level++ + CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING + sleep(10) + continue + error_level-- + if (!queue_head) //reset the counts if the queue is empty, in the off chance they get out of sync + queue_priority_count = 0 + queue_priority_count_bg = 0 + + iteration++ + last_run = world.time + src.sleep_delta = MC_AVERAGE_FAST(src.sleep_delta, sleep_delta) + CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING - (TICK_LIMIT_RUNNING * 0.25) //reserve the tail 1/4 of the next tick for the mc. + sleep(world.tick_lag * (processing + sleep_delta)) + + + + +// This is what decides if something should run. +/datum/controller/master/proc/CheckQueue(list/subsystemstocheck) + . = 0 //so the mc knows if we runtimed + + //we create our variables outside of the loops to save on overhead + var/datum/controller/subsystem/SS + var/SS_flags + + for (var/thing in subsystemstocheck) + if (!thing) + subsystemstocheck -= thing + SS = thing + if (SS.state != SS_IDLE) + continue + if (SS.can_fire <= 0) + continue + if (SS.next_fire > world.time) + continue + SS_flags = SS.flags + if (SS_flags & SS_NO_FIRE) + subsystemstocheck -= SS + continue + if (!(SS_flags & SS_TICKER) && (SS_flags & SS_KEEP_TIMING) && SS.last_fire + (SS.wait * 0.75) > world.time) + continue + SS.enqueue() + . = 1 + + +// Run thru the queue of subsystems to run, running them while balancing out their allocated tick precentage +/datum/controller/master/proc/RunQueue() + . = 0 + var/datum/controller/subsystem/queue_node + var/queue_node_flags + var/queue_node_priority + var/queue_node_paused + + var/current_tick_budget + var/tick_precentage + var/tick_remaining + var/ran = TRUE //this is right + var/ran_non_ticker = FALSE + var/bg_calc //have we swtiched current_tick_budget to background mode yet? + var/tick_usage + + //keep running while we have stuff to run and we haven't gone over a tick + // this is so subsystems paused eariler can use tick time that later subsystems never used + while (ran && queue_head && world.tick_usage < TICK_LIMIT_MC) + ran = FALSE + bg_calc = FALSE + current_tick_budget = queue_priority_count + queue_node = queue_head + while (queue_node) + if (ran && world.tick_usage > TICK_LIMIT_RUNNING) + break + + queue_node_flags = queue_node.flags + queue_node_priority = queue_node.queued_priority + + //super special case, subsystems where we can't make them pause mid way through + //if we can't run them this tick (without going over a tick) + //we bump up their priority and attempt to run them next tick + //(unless we haven't even ran anything this tick, since its unlikely they will ever be able run + // in those cases, so we just let them run) + if (queue_node_flags & SS_NO_TICK_CHECK) + if (queue_node.tick_usage > TICK_LIMIT_RUNNING - world.tick_usage && ran_non_ticker) + queue_node.queued_priority += queue_priority_count * 0.10 + queue_priority_count -= queue_node_priority + queue_priority_count += queue_node.queued_priority + current_tick_budget -= queue_node_priority + queue_node = queue_node.queue_next + continue + + if ((queue_node_flags & SS_BACKGROUND) && !bg_calc) + current_tick_budget = queue_priority_count_bg + bg_calc = TRUE + + tick_remaining = TICK_LIMIT_RUNNING - world.tick_usage + + if (current_tick_budget > 0 && queue_node_priority > 0) + tick_precentage = tick_remaining / (current_tick_budget / queue_node_priority) + else + tick_precentage = tick_remaining + + CURRENT_TICKLIMIT = world.tick_usage + tick_precentage + + if (!(queue_node_flags & SS_TICKER)) + ran_non_ticker = TRUE + ran = TRUE + tick_usage = world.tick_usage + queue_node_paused = (queue_node.state == SS_PAUSED || queue_node.state == SS_PAUSING) + last_type_processed = queue_node + + queue_node.state = SS_RUNNING + + var/state = queue_node.ignite(queue_node_paused) + if (state == SS_RUNNING) + state = SS_IDLE + current_tick_budget -= queue_node_priority + tick_usage = world.tick_usage - tick_usage + + if (tick_usage < 0) + tick_usage = 0 + + queue_node.state = state + + if (state == SS_PAUSED) + queue_node.paused_ticks++ + queue_node.paused_tick_usage += tick_usage + queue_node = queue_node.queue_next + continue + + queue_node.ticks = MC_AVERAGE(queue_node.ticks, queue_node.paused_ticks) + tick_usage += queue_node.paused_tick_usage + + queue_node.tick_usage = MC_AVERAGE_FAST(queue_node.tick_usage, tick_usage) + + queue_node.cost = MC_AVERAGE_FAST(queue_node.cost, TICK_DELTA_TO_MS(tick_usage)) + queue_node.paused_ticks = 0 + queue_node.paused_tick_usage = 0 + + if (queue_node_flags & SS_BACKGROUND) //update our running total + queue_priority_count_bg -= queue_node_priority + else + queue_priority_count -= queue_node_priority + + queue_node.last_fire = world.time + queue_node.times_fired++ + + if (queue_node_flags & SS_TICKER) + queue_node.next_fire = world.time + (world.tick_lag * queue_node.wait) + else if (queue_node_flags & SS_POST_FIRE_TIMING) + queue_node.next_fire = world.time + queue_node.wait + else if (queue_node_flags & SS_KEEP_TIMING) + queue_node.next_fire += queue_node.wait + else + queue_node.next_fire = queue_node.queued_time + queue_node.wait + + queue_node.queued_time = 0 + + //remove from queue + queue_node.dequeue() + + queue_node = queue_node.queue_next + + . = 1 + +//resets the queue, and all subsystems, while filtering out the subsystem lists +// called if any mc's queue procs runtime or exit improperly. +/datum/controller/master/proc/SoftReset(list/ticker_SS, list/normal_SS, list/lobby_SS) + . = 0 + log_world("MC: SoftReset called, resetting MC queue state.") + if (!istype(subsystems) || !istype(ticker_SS) || !istype(normal_SS) || !istype(lobby_SS)) + log_world("MC: SoftReset: Bad list contents: '[subsystems]' '[ticker_SS]' '[normal_SS]' '[lobby_SS]' Crashing!") + return + var/subsystemstocheck = subsystems + ticker_SS + normal_SS + lobby_SS + + for (var/thing in subsystemstocheck) + var/datum/controller/subsystem/SS = thing + if (!SS || !istype(SS)) + //list(SS) is so if a list makes it in the subsystem list, we remove the list, not the contents + subsystems -= list(SS) + ticker_SS -= list(SS) + normal_SS -= list(SS) + lobby_SS -= list(SS) + log_world("MC: SoftReset: Found bad entry in subsystem list, '[SS]'") + continue + if (SS.queue_next && !istype(SS.queue_next)) + log_world("MC: SoftReset: Found bad data in subsystem queue, queue_next = '[SS.queue_next]'") + SS.queue_next = null + if (SS.queue_prev && !istype(SS.queue_prev)) + log_world("MC: SoftReset: Found bad data in subsystem queue, queue_prev = '[SS.queue_prev]'") + SS.queue_prev = null + SS.queued_priority = 0 + SS.queued_time = 0 + SS.state = SS_IDLE + if (queue_head && !istype(queue_head)) + log_world("MC: SoftReset: Found bad data in subsystem queue, queue_head = '[queue_head]'") + queue_head = null + if (queue_tail && !istype(queue_tail)) + log_world("MC: SoftReset: Found bad data in subsystem queue, queue_tail = '[queue_tail]'") + queue_tail = null + queue_priority_count = 0 + queue_priority_count_bg = 0 + log_world("MC: SoftReset: Finished.") + . = 1 + + + +/datum/controller/master/stat_entry() + if(!statclick) + statclick = new/obj/effect/statclick/debug(null, "Initializing...", src) + + stat("Byond:", "(FPS:[world.fps]) (TickCount:[world.time/world.tick_lag]) (TickDrift:[round(Master.tickdrift,1)]([round((Master.tickdrift/(world.time/world.tick_lag))*100,0.1)]%))") + stat("Master Controller:", statclick.update("(TickRate:[Master.processing]) (Iteration:[Master.iteration])")) + +/datum/controller/master/StartLoadingMap() + //disallow more than one map to load at once, multithreading it will just cause race conditions + while(map_loading) + stoplag() + for(var/S in subsystems) + var/datum/controller/subsystem/SS = S + SS.StartLoadingMap() + map_loading = TRUE + +/datum/controller/master/StopLoadingMap(bounds = null) + map_loading = FALSE + for(var/S in subsystems) + var/datum/controller/subsystem/SS = S + SS.StopLoadingMap() diff --git a/code/controllers/master_controller.dm b/code/controllers/master_controller.dm index 62209a1014..3075682438 100644 --- a/code/controllers/master_controller.dm +++ b/code/controllers/master_controller.dm @@ -2,6 +2,10 @@ //It ensures master_controller.process() is never doubled up by killing the MC (hence terminating any of its sleeping procs) //WIP, needs lots of work still +// +// TODO - This will be completely replaced by master.dm in time. +// + var/global/datum/controller/game_controller/master_controller //Set in world.New() var/global/controller_iteration = 0 @@ -31,8 +35,6 @@ datum/controller/game_controller/New() if(!syndicate_code_response) syndicate_code_response = generate_code_phrase() datum/controller/game_controller/proc/setup() - world.tick_lag = config.Ticklag - spawn(20) createRandomZlevel() diff --git a/code/controllers/subsystem.dm b/code/controllers/subsystem.dm new file mode 100644 index 0000000000..ce9558ca4f --- /dev/null +++ b/code/controllers/subsystem.dm @@ -0,0 +1,192 @@ +/datum/controller/subsystem + // Metadata; you should define these. + name = "fire coderbus" //name of the subsystem + var/init_order = 0 //order of initialization. Higher numbers are initialized first, lower numbers later. Can be decimal and negative values. + var/wait = 20 //time to wait (in deciseconds) between each call to fire(). Must be a positive integer. + var/priority = 50 //When mutiple subsystems need to run in the same tick, higher priority subsystems will run first and be given a higher share of the tick before MC_TICK_CHECK triggers a sleep + + var/flags = 0 //see MC.dm in __DEFINES Most flags must be set on world start to take full effect. (You can also restart the mc to force them to process again) + + //set to 0 to prevent fire() calls, mostly for admin use or subsystems that may be resumed later + // use the SS_NO_FIRE flag instead for systems that never fire to keep it from even being added to the list + var/can_fire = TRUE + + // Bookkeeping variables; probably shouldn't mess with these. + var/last_fire = 0 //last world.time we called fire() + var/next_fire = 0 //scheduled world.time for next fire() + var/cost = 0 //average time to execute + var/tick_usage = 0 //average tick usage + var/state = SS_IDLE //tracks the current state of the ss, running, paused, etc. + var/paused_ticks = 0 //ticks this ss is taking to run right now. + var/paused_tick_usage //total tick_usage of all of our runs while pausing this run + var/ticks = 1 //how many ticks does this ss take to run on avg. + var/times_fired = 0 //number of times we have called fire() + var/queued_time = 0 //time we entered the queue, (for timing and priority reasons) + var/queued_priority //we keep a running total to make the math easier, if priority changes mid-fire that would break our running total, so we store it here + //linked list stuff for the queue + var/datum/controller/subsystem/queue_next + var/datum/controller/subsystem/queue_prev + +// Used to initialize the subsystem BEFORE the map has loaded +/datum/controller/subsystem/New() + +//This is used so the mc knows when the subsystem sleeps. do not override. +/datum/controller/subsystem/proc/ignite(resumed = 0) + set waitfor = 0 + . = SS_SLEEPING + fire(resumed) + . = state + if (state == SS_SLEEPING) + state = SS_IDLE + if (state == SS_PAUSING) + var/QT = queued_time + enqueue() + state = SS_PAUSED + queued_time = QT + +//previously, this would have been named 'process()' but that name is used everywhere for different things! +//fire() seems more suitable. This is the procedure that gets called every 'wait' deciseconds. +//Sleeping in here prevents future fires until returned. +/datum/controller/subsystem/proc/fire(resumed = 0) + flags |= SS_NO_FIRE + throw EXCEPTION("Subsystem [src]([type]) does not fire() but did not set the SS_NO_FIRE flag. Please add the SS_NO_FIRE flag to any subsystem that doesn't fire so it doesn't get added to the processing list and waste cpu.") + +/datum/controller/subsystem/Destroy() + dequeue() + can_fire = 0 + flags |= SS_NO_FIRE + Master.subsystems -= src + + +//Queue it to run. +// (we loop thru a linked list until we get to the end or find the right point) +// (this lets us sort our run order correctly without having to re-sort the entire already sorted list) +/datum/controller/subsystem/proc/enqueue() + var/SS_priority = priority + var/SS_flags = flags + var/datum/controller/subsystem/queue_node + var/queue_node_priority + var/queue_node_flags + + for (queue_node = Master.queue_head; queue_node; queue_node = queue_node.queue_next) + queue_node_priority = queue_node.queued_priority + queue_node_flags = queue_node.flags + + if (queue_node_flags & SS_TICKER) + if (!(SS_flags & SS_TICKER)) + continue + if (queue_node_priority < SS_priority) + break + + else if (queue_node_flags & SS_BACKGROUND) + if (!(SS_flags & SS_BACKGROUND)) + break + if (queue_node_priority < SS_priority) + break + + else + if (SS_flags & SS_BACKGROUND) + continue + if (SS_flags & SS_TICKER) + break + if (queue_node_priority < SS_priority) + break + + queued_time = world.time + queued_priority = SS_priority + state = SS_QUEUED + if (SS_flags & SS_BACKGROUND) //update our running total + Master.queue_priority_count_bg += SS_priority + else + Master.queue_priority_count += SS_priority + + queue_next = queue_node + if (!queue_node)//we stopped at the end, add to tail + queue_prev = Master.queue_tail + if (Master.queue_tail) + Master.queue_tail.queue_next = src + else //empty queue, we also need to set the head + Master.queue_head = src + Master.queue_tail = src + + else if (queue_node == Master.queue_head)//insert at start of list + Master.queue_head.queue_prev = src + Master.queue_head = src + queue_prev = null + else + queue_node.queue_prev.queue_next = src + queue_prev = queue_node.queue_prev + queue_node.queue_prev = src + + +/datum/controller/subsystem/proc/dequeue() + if (queue_next) + queue_next.queue_prev = queue_prev + if (queue_prev) + queue_prev.queue_next = queue_next + if (src == Master.queue_tail) + Master.queue_tail = queue_prev + if (src == Master.queue_head) + Master.queue_head = queue_next + queued_time = 0 + if (state == SS_QUEUED) + state = SS_IDLE + + +/datum/controller/subsystem/proc/pause() + . = 1 + switch(state) + if(SS_RUNNING) + state = SS_PAUSED + if(SS_SLEEPING) + state = SS_PAUSING + + +//used to initialize the subsystem AFTER the map has loaded +/datum/controller/subsystem/Initialize(start_timeofday) + var/time = (REALTIMEOFDAY - start_timeofday) / 10 + var/msg = "Initialized [name] subsystem within [time] second[time == 1 ? "" : "s"]!" + to_chat(world, "[msg]") + log_world(msg) + return time + +//hook for printing stats to the "MC" statuspanel for admins to see performance and related stats etc. +/datum/controller/subsystem/stat_entry(msg) + if(!statclick) + statclick = new/obj/effect/statclick/debug(null, "Initializing...", src) + + + + if(can_fire && !(SS_NO_FIRE in flags)) + msg = "[round(cost,1)]ms|[round(tick_usage,1)]%|[round(ticks,0.1)]\t[msg]" + else + msg = "OFFLINE\t[msg]" + + var/title = name + if (can_fire) + title = "\[[state_letter()]][title]" + + stat(title, statclick.update(msg)) + +/datum/controller/subsystem/proc/state_letter() + switch (state) + if (SS_RUNNING) + . = "R" + if (SS_QUEUED) + . = "Q" + if (SS_PAUSED, SS_PAUSING) + . = "P" + if (SS_SLEEPING) + . = "S" + if (SS_IDLE) + . = " " + +//could be used to postpone a costly subsystem for (default one) var/cycles, cycles +//for instance, during cpu intensive operations like explosions +/datum/controller/subsystem/proc/postpone(cycles = 1) + if(next_fire - world.time < wait) + next_fire += (wait*cycles) + +//usually called via datum/controller/subsystem/New() when replacing a subsystem (i.e. due to a recurring crash) +//should attempt to salvage what it can from the old instance of subsystem +/datum/controller/subsystem/Recover() diff --git a/code/controllers/subsystems.dm b/code/controllers/subsystems.dm deleted file mode 100644 index 11025d8d53..0000000000 --- a/code/controllers/subsystems.dm +++ /dev/null @@ -1,46 +0,0 @@ -#define NEW_SS_GLOBAL(varname) if(varname != src){if(istype(varname)){Recover();qdel(varname);}varname = src;} - -/datum/subsystem - //things you will want to define - var/name //name of the subsystem - var/priority = 0 //priority affects order of initialization. Higher priorities are initialized first, lower priorities later. Can be decimal and negative values. - var/wait = 20 //time to wait (in deciseconds) between each call to fire(). Must be a positive integer. - - //things you will probably want to leave alone - var/can_fire = 0 //prevent fire() calls - var/last_fire = 0 //last world.time we called fire() - var/next_fire = 0 //scheduled world.time for next fire() - var/cpu = 0 //cpu-usage stats (somewhat vague) - var/cost = 0 //average time to execute - var/times_fired = 0 //number of times we have called fire() - -//used to initialize the subsystem BEFORE the map has loaded -/datum/subsystem/New() - -//previously, this would have been named 'process()' but that name is used everywhere for different things! -//fire() seems more suitable. This is the procedure that gets called every 'wait' deciseconds. -//fire(), and the procs it calls, SHOULD NOT HAVE ANY SLEEP OPERATIONS in them! -//YE BE WARNED! -/datum/subsystem/proc/fire() - can_fire = 0 - -//used to initialize the subsystem AFTER the map has loaded -/datum/subsystem/proc/Initialize(start_timeofday) - var/time = (world.timeofday - start_timeofday) / 10 - var/msg = "Initialized [name] SubSystem within [time] seconds" - world << "[msg]" - world.log << msg - -//hook for printing stats to the "MC" statuspanel for admins to see performance and related stats etc. -/datum/subsystem/proc/stat_entry() - stat(name, "[round(cost,0.001)]ds\t(CPU:[round(cpu,1)]%)") - -//could be used to postpone a costly subsystem for one cycle -//for instance, during cpu intensive operations like explosions -/datum/subsystem/proc/postpone() - if(next_fire - world.time < wait) - next_fire += wait - -//usually called via datum/subsystem/New() when replacing a subsystem (i.e. due to a recurring crash) -//should attempt to salvage what it can from the old instance of subsystem -/datum/subsystem/proc/Recover() diff --git a/code/controllers/verbs.dm b/code/controllers/verbs.dm index f0d3cc3341..fcf239c88f 100644 --- a/code/controllers/verbs.dm +++ b/code/controllers/verbs.dm @@ -1,19 +1,57 @@ //TODO: rewrite and standardise all controller datums to the datum/controller type //TODO: allow all controllers to be deleted for clean restarts (see WIP master controller stuff) - MC done - lighting done -/client/proc/restart_controller(controller in list("Supply")) + +// Clickable stat() button. +/obj/effect/statclick + name = "Initializing..." + var/target + +/obj/effect/statclick/New(loc, text, target) //Don't port this to Initialize it's too critical + ..() + name = text + src.target = target + +/obj/effect/statclick/proc/update(text) + name = text + return src + +/obj/effect/statclick/debug + var/class + +/obj/effect/statclick/debug/Click() + if(!usr.client.holder || !target) + return + if(!class) + if(istype(target, /datum/controller/subsystem)) + class = "subsystem" + else if(istype(target, /datum/controller)) + class = "controller" + else if(istype(target, /datum)) + class = "datum" + else + class = "unknown" + + usr.client.debug_variables(target) + message_admins("Admin [key_name_admin(usr)] is debugging the [target] [class].") + + +// Debug verbs. +/client/proc/restart_controller(controller in list("Master", "Failsafe")) set category = "Debug" set name = "Restart Controller" set desc = "Restart one of the various periodic loop controllers for the game (be careful!)" - if(!holder) return - usr = null - src = null + if(!holder) + return switch(controller) - if("Supply") - supply_controller.process() - feedback_add_details("admin_verb","RSupply") + if("Master") + Recreate_MC() + feedback_add_details("admin_verb","RMC") + if("Failsafe") + new /datum/controller/failsafe() + feedback_add_details("admin_verb","RFailsafe") + message_admins("Admin [key_name_admin(usr)] has restarted the [controller] controller.") - return /client/proc/debug_antagonist_template(antag_type in all_antag_types) set category = "Debug" diff --git a/polaris.dme b/polaris.dme index 9f075b1d76..a60f9ef6e8 100644 --- a/polaris.dme +++ b/polaris.dme @@ -30,7 +30,9 @@ #include "code\__defines\lighting.dm" #include "code\__defines\machinery.dm" #include "code\__defines\map.dm" +#include "code\__defines\math.dm" #include "code\__defines\math_physics.dm" +#include "code\__defines\MC.dm" #include "code\__defines\misc.dm" #include "code\__defines\mobs.dm" #include "code\__defines\planets.dm" @@ -38,6 +40,7 @@ #include "code\__defines\research.dm" #include "code\__defines\species_languages.dm" #include "code\__defines\targeting.dm" +#include "code\__defines\tick.dm" #include "code\__defines\turfs.dm" #include "code\__defines\unit_tests.dm" #include "code\__defines\xenoarcheaology.dm" @@ -66,6 +69,9 @@ #include "code\_helpers\type2type.dm" #include "code\_helpers\unsorted.dm" #include "code\_helpers\vector.dm" +#include "code\_helpers\sorts\__main.dm" +#include "code\_helpers\sorts\comparators.dm" +#include "code\_helpers\sorts\TimSort.dm" #include "code\_onclick\_defines.dm" #include "code\_onclick\adjacent.dm" #include "code\_onclick\ai.dm" @@ -128,12 +134,15 @@ #include "code\controllers\autotransfer.dm" #include "code\controllers\communications.dm" #include "code\controllers\configuration.dm" +#include "code\controllers\controller.dm" #include "code\controllers\emergency_shuttle_controller.dm" +#include "code\controllers\failsafe.dm" #include "code\controllers\hooks-defs.dm" #include "code\controllers\hooks.dm" +#include "code\controllers\master.dm" #include "code\controllers\master_controller.dm" #include "code\controllers\shuttle_controller.dm" -#include "code\controllers\subsystems.dm" +#include "code\controllers\subsystem.dm" #include "code\controllers\verbs.dm" #include "code\controllers\voting.dm" #include "code\controllers\observer_listener\atom\observer.dm" From a0a390e8875908ba440588e58908bbecd0656e9b Mon Sep 17 00:00:00 2001 From: Neerti Date: Wed, 31 May 2017 17:41:02 -0400 Subject: [PATCH 29/82] Surgery Modifications Semi-rewrites how surgery failure works. Using an improper surface will call the surgery step's fail proc instead of just doing a melee attack. Adds 'surgery odds' var to objs, which determines effectiveness. The numbers for operating tables/roller beds/tables remain unchanged from the previous version, however doing it this way makes it cleaner to add new surfaces in the future. Adds a proc to get a surgery surface. Also makes burn repair on FBPs more efficent, so that one scorched robot does not take literally all of robotic's wires. --- code/_helpers/unsorted.dm | 20 ++++++++--- code/game/machinery/OpTable.dm | 1 + .../structures/stool_bed_chair_nest/bed.dm | 1 + code/modules/power/cable.dm | 4 +-- code/modules/surgery/surgery.dm | 33 +++++++++++++++---- code/modules/tables/tables.dm | 1 + 6 files changed, 46 insertions(+), 14 deletions(-) diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm index 6fa9d4ec0c..2b75414a7e 100644 --- a/code/_helpers/unsorted.dm +++ b/code/_helpers/unsorted.dm @@ -1157,12 +1157,22 @@ proc/is_hot(obj/item/W as obj) istype(W, /obj/item/weapon/surgical/bonesetter) ) -//check if mob is lying down on something we can operate him on. +// check if mob is lying down on something we can operate him on. +// The RNG with table/rollerbeds comes into play in do_surgery() so that fail_step() can be used instead. /proc/can_operate(mob/living/carbon/M) - return (M.lying && \ - locate(/obj/machinery/optable, M.loc) || \ - (locate(/obj/structure/bed/roller, M.loc) && prob(75)) || \ - (locate(/obj/structure/table/, M.loc) && prob(66))) + return M.lying + +// Returns an instance of a valid surgery surface. +/mob/living/proc/get_surgery_surface() + if(!lying) + return null // Not lying down means no surface. + var/obj/surface = null + for(var/obj/O in loc) // Looks for the best surface. + if(O.surgery_odds) + if(!surface || surface.surgery_odds < O) + surface = O + if(surface) + return surface /proc/reverse_direction(var/dir) switch(dir) diff --git a/code/game/machinery/OpTable.dm b/code/game/machinery/OpTable.dm index 4d56d6662d..5696892ddc 100644 --- a/code/game/machinery/OpTable.dm +++ b/code/game/machinery/OpTable.dm @@ -8,6 +8,7 @@ use_power = 1 idle_power_usage = 1 active_power_usage = 5 + surgery_odds = 100 var/mob/living/carbon/human/victim = null var/strapped = 0.0 var/obj/machinery/computer/operating/computer = null diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm index 8f91f12b26..1b9d897b99 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm @@ -203,6 +203,7 @@ icon = 'icons/obj/rollerbed.dmi' icon_state = "down" anchored = 0 + surgery_odds = 75 /obj/structure/bed/roller/update_icon() return // Doesn't care about material or anything else. diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 27bf4c0ab7..2d53277590 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -526,9 +526,9 @@ obj/structure/cable/proc/cableColor(var/colorC) if(!S || S.robotic < ORGAN_ROBOT || S.open == 3) return ..() - var/use_amt = min(src.amount, ceil(S.burn_dam/3), 5) + var/use_amt = min(src.amount, ceil(S.burn_dam/5), 5) if(can_use(use_amt)) - if(S.robo_repair(3*use_amt, BURN, "some damaged wiring", src, user)) + if(S.robo_repair(5*use_amt, BURN, "some damaged wiring", src, user)) src.use(use_amt) else diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm index 38b919823f..b9fe362031 100644 --- a/code/modules/surgery/surgery.dm +++ b/code/modules/surgery/surgery.dm @@ -1,5 +1,8 @@ /* SURGERY STEPS */ +/obj/ + var/surgery_odds = 0 // Used for tables/etc which can have surgery done of them. + /datum/surgery_step var/priority = 0 //steps with higher priority would be attempted first @@ -111,13 +114,29 @@ return 1 M.op_stage.in_progress += zone S.begin_step(user, M, zone, src) //start on it - //We had proper tools! (or RNG smiled.) and user did not move or change hands. - if(prob(S.tool_quality(src)) && do_mob(user, M, rand(S.min_duration, S.max_duration))) - S.end_step(user, M, zone, src) //finish successfully - else if ((src in user.contents) && user.Adjacent(M)) //or - S.fail_step(user, M, zone, src) //malpractice~ - else // This failing silently was a pain. - user << "You must remain close to your patient to conduct surgery." + var/success = TRUE + + // Bad tools make it less likely to succeed. + if(!prob(S.tool_quality(src))) + success = FALSE + + // Bad or no surface may mean failure as well. + var/obj/surface = M.get_surgery_surface() + if(!surface || !prob(surface.surgery_odds)) + success = FALSE + + // Not staying still fails you too. + if(success) + if(!do_mob(user, M, rand(S.min_duration, S.max_duration))) + success = FALSE + else + to_chat(user, "You must remain close to your patient to conduct surgery.") + + if(success) + S.end_step(user, M, zone, src) + else + S.fail_step(user, M, zone, src) + M.op_stage.in_progress -= zone // Clear the in-progress flag. if (ishuman(M)) var/mob/living/carbon/human/H = M diff --git a/code/modules/tables/tables.dm b/code/modules/tables/tables.dm index 72cc6dbf8b..db445e9f50 100644 --- a/code/modules/tables/tables.dm +++ b/code/modules/tables/tables.dm @@ -8,6 +8,7 @@ climbable = 1 layer = 2.8 throwpass = 1 + surgery_odds = 66 var/flipped = 0 var/maxhealth = 10 var/health = 10 From 9d8f4cfa539534374c69f77e86393b94a2f156b7 Mon Sep 17 00:00:00 2001 From: Anewbe Date: Wed, 31 May 2017 19:38:07 -0500 Subject: [PATCH 30/82] Fixes Death Alarms --- code/game/objects/items/weapons/implants/implant.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index 6554e80f8b..aff1f4bb31 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -452,11 +452,11 @@ the implant may become unstable and either pre-maturely inject the subject or si var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset/heads/captain(null) if(istype(t, /area/syndicate_station) || istype(t, /area/syndicate_mothership) || istype(t, /area/shuttle/syndicate_elite) ) //give the syndies a bit of stealth - a.autosay("[mobname] has died in Space!", "[mobname]'s Death Alarm", "General") + a.autosay("[mobname] has died in Space!", "[mobname]'s Death Alarm") // a.autosay("[mobname] has died in Space!", "[mobname]'s Death Alarm", "Security") // a.autosay("[mobname] has died in Space!", "[mobname]'s Death Alarm", "Medical") else - a.autosay("[mobname] has died in [t.name]!", "[mobname]'s Death Alarm", "General") + a.autosay("[mobname] has died in [t.name]!", "[mobname]'s Death Alarm") // a.autosay("[mobname] has died in [t.name]!", "[mobname]'s Death Alarm", "Security") // a.autosay("[mobname] has died in [t.name]!", "[mobname]'s Death Alarm", "Medical") qdel(a) @@ -464,13 +464,13 @@ the implant may become unstable and either pre-maturely inject the subject or si if ("emp") var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset/heads/captain(null) var/name = prob(50) ? t.name : pick(teleportlocs) - a.autosay("[mobname] has died in [name]!", "[mobname]'s Death Alarm", "General") + a.autosay("[mobname] has died in [name]!", "[mobname]'s Death Alarm") // a.autosay("[mobname] has died in [name]!", "[mobname]'s Death Alarm", "Security") // a.autosay("[mobname] has died in [name]!", "[mobname]'s Death Alarm", "Medical") qdel(a) else var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset/heads/captain(null) - a.autosay("[mobname] has died-zzzzt in-in-in...", "[mobname]'s Death Alarm", "General") + a.autosay("[mobname] has died-zzzzt in-in-in...", "[mobname]'s Death Alarm") // a.autosay("[mobname] has died-zzzzt in-in-in...", "[mobname]'s Death Alarm", "Security") // a.autosay("[mobname] has died-zzzzt in-in-in...", "[mobname]'s Death Alarm", "Medical") qdel(a) From 2bdfe8bfa3970313974c84131474f332f85a8cc0 Mon Sep 17 00:00:00 2001 From: LorenLuke Date: Wed, 31 May 2017 18:44:43 -0700 Subject: [PATCH 31/82] Prevents people from seeing names/examining cloaked changelings at range --- .../mob/living/carbon/human/examine.dm | 29 +++++++++++++++++-- code/modules/mob/living/carbon/human/human.dm | 2 ++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 2953591a5a..cb8c2ac767 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -1,4 +1,5 @@ /mob/living/carbon/human/examine(mob/user) + var/skipgloves = 0 var/skipsuitstorage = 0 var/skipjumpsuit = 0 @@ -17,6 +18,18 @@ var/skiparms = 0 var/skipfeet = 0 + + var/cloaked = 0 // 0 for normal, 1 for cloaked close + + if(mind.changeling && mind.changeling.cloaked && !istype(user, /mob/observer)) + var/distance = get_dist(user, src) + if(distance > 2) + src.loc.examine(user) + return + else + cloaked = 1 + + var/looks_synth = looksSynthetic() //exosuits and helmets obscure our view and stuff. @@ -79,9 +92,13 @@ var/list/msg = list("*---------*\nThis is ") + var/datum/gender/T = gender_datums[get_gender()] + if(skipjumpsuit && skipface) //big suits/masks/helmets make it hard to tell their gender T = gender_datums[PLURAL] + if(cloaked) + T = gender_datums[NEUTER] else if(species && species.ambiguous_genders) var/can_detect_gender = FALSE @@ -441,17 +458,25 @@ msg += "Medical records: \[View\] \[Add comment\]\n" - if(print_flavor_text()) msg += "[print_flavor_text()]\n" + if(print_flavor_text() && !cloaked) + msg += "[print_flavor_text()]\n" msg += "*---------*
    " msg += applying_pressure - if (pose) + if (pose && !cloaked) if( findtext(pose,".",lentext(pose)) == 0 && findtext(pose,"!",lentext(pose)) == 0 && findtext(pose,"?",lentext(pose)) == 0 ) pose = addtext(pose,".") //Makes sure all emotes end with a period. msg += "[T.He] [pose]" user << jointext(msg, null) + +/mob/living/carbon/human/get_description_fluff() + if(mind.changeling && mind.changeling.cloaked) + return "" + else + return ..() + //Helper procedure. Called by /mob/living/carbon/human/examine() and /mob/living/carbon/human/Topic() to determine HUD access to security and medical records. /proc/hasHUD(mob/M as mob, hudtype) if(istype(M, /mob/living/carbon/human)) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 66abc50cab..856cf3aa04 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -305,6 +305,8 @@ //repurposed proc. Now it combines get_id_name() and get_face_name() to determine a mob's name variable. Made into a seperate proc as it'll be useful elsewhere /mob/living/carbon/human/proc/get_visible_name() + if( mind.changeling && mind.changeling.cloaked) + return "Unknown" if( wear_mask && (wear_mask.flags_inv&HIDEFACE) ) //Wearing a mask which hides our face, use id-name if possible return get_id_name("Unknown") if( head && (head.flags_inv&HIDEFACE) ) From b5802fb1854ccaa26ec13967b961e986931b337f Mon Sep 17 00:00:00 2001 From: Neerti Date: Thu, 1 Jun 2017 15:05:51 -0400 Subject: [PATCH 32/82] Makes Mechs Fall Mechs now will fall when crossing an open tile. Anything below that tile will have a bad day. Also makes lighting overlays unable to fall just incase. --- code/modules/multiz/movement.dm | 50 +++++++++++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 3 deletions(-) diff --git a/code/modules/multiz/movement.dm b/code/modules/multiz/movement.dm index 122e1aa4cd..b54fc3efc1 100644 --- a/code/modules/multiz/movement.dm +++ b/code/modules/multiz/movement.dm @@ -23,12 +23,12 @@ if(!istype(start)) to_chat(src, "You are unable to move from here.") return 0 - + var/turf/destination = (direction == UP) ? GetAbove(src) : GetBelow(src) if(!destination) to_chat(src, "There is nothing of interest in this direction.") return 0 - + if(!start.CanZPass(src, direction)) to_chat(src, "\The [start] is in the way.") return 0 @@ -154,6 +154,28 @@ /obj/effect/decal/cleanable/can_fall() return TRUE +// These didn't fall anyways but better to nip this now just incase. +/atom/movable/lighting_overlay/can_fall() + return FALSE + +// Mechas are anchored, so we need to override. +/obj/mecha/can_fall() + var/obj/structure/lattice/lattice = locate(/obj/structure/lattice, loc) + if(lattice) + var/area/area = get_area(src) + if(area.has_gravity()) + // Lattices seem a bit too flimsy to hold up a massive exosuit. + lattice.visible_message("\The [lattice] collapses under the weight of \the [src]!") + qdel(lattice) + + // See if something prevents us from falling. + var/turf/below = GetBelow(src) + for(var/atom/A in below) + if(!A.CanPass(src, src.loc)) + return FALSE + + return TRUE + /obj/item/pipe/can_fall() var/turf/simulated/open/below = loc below = below.below @@ -195,4 +217,26 @@ apply_damage(rand(0, damage), BRUTE, BP_L_ARM) apply_damage(rand(0, damage), BRUTE, BP_R_ARM) Weaken(4) - updatehealth() \ No newline at end of file + updatehealth() + +/obj/mecha/handle_fall(var/turf/landing) + if(..()) + return + + // Tell the pilot that they just dropped down with a superheavy mecha. + if(occupant) + to_chat(occupant, "\The [src] crashed down onto \the [landing]!") + + // Anything on the same tile as the landing tile is gonna have a bad day. + for(var/mob/living/L in landing.contents) + L.visible_message("\The [src] crushes \the [L] as it lands on them!") + L.adjustBruteLoss(rand(70, 100)) + L.Weaken(8) + + // Now to hurt the mech. + take_damage(rand(15, 30)) + + // And hurt the floor. + if(istype(landing, /turf/simulated/floor)) + var/turf/simulated/floor/ground = landing + ground.break_tile() \ No newline at end of file From 8b3403d54f5674574a386ae5b121e57f9501f9b3 Mon Sep 17 00:00:00 2001 From: Leshana Date: Thu, 1 Jun 2017 15:52:38 -0400 Subject: [PATCH 33/82] Prevent returning null from get_authentification_rank() Make sure we return the no job value if they have an id without a rank that is in a PDA. Should fix https://github.com/PolarisSS13/Polaris/issues/3486 --- code/modules/mob/living/carbon/human/human.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 66abc50cab..83ce56e29e 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -261,7 +261,7 @@ var/obj/item/device/pda/pda = wear_id if (istype(pda)) if (pda.id) - return pda.id.rank + return pda.id.rank ? pda.id.rank : if_no_job else return pda.ownrank else From b17fb867214eb740c78671862d3a1c4d2ad1fad9 Mon Sep 17 00:00:00 2001 From: Leshana Date: Tue, 30 May 2017 23:54:59 -0400 Subject: [PATCH 34/82] Tweaks Statpanel and System Initialization --- code/controllers/master.dm | 4 ++++ code/modules/admin/verbs/modifyvariables.dm | 2 +- code/modules/client/client procs.dm | 12 ++++++++++++ code/modules/examine/examine.dm | 5 +++-- code/modules/mob/mob.dm | 17 +++++++++++++++++ code/world.dm | 3 +-- 6 files changed, 38 insertions(+), 5 deletions(-) diff --git a/code/controllers/master.dm b/code/controllers/master.dm index 4dcf58d45e..981cf6d2bb 100644 --- a/code/controllers/master.dm +++ b/code/controllers/master.dm @@ -149,7 +149,11 @@ var/CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING // Sort subsystems by display setting for easy access. sortTim(subsystems, /proc/cmp_subsystem_display) // Set world options. + #ifdef UNIT_TEST + world.sleep_offline = 0 + #else world.sleep_offline = 1 + #endif world.fps = config.fps var/initialized_tod = REALTIMEOFDAY sleep(1) diff --git a/code/modules/admin/verbs/modifyvariables.dm b/code/modules/admin/verbs/modifyvariables.dm index 51f1fbceb3..ecd26e9b56 100644 --- a/code/modules/admin/verbs/modifyvariables.dm +++ b/code/modules/admin/verbs/modifyvariables.dm @@ -4,7 +4,7 @@ var/list/forbidden_varedit_object_types = list( /datum/feedback_variable //Prevents people messing with feedback gathering, ) -var/list/VVlocked = list("vars", "client", "virus", "viruses", "cuffed", "last_eaten", "unlock_content", "bound_x", "bound_y", "step_x", "step_y", "force_ending") +var/list/VVlocked = list("vars", "client", "virus", "viruses", "cuffed", "last_eaten", "unlock_content", "bound_x", "bound_y", "step_x", "step_y", "force_ending", "queued_priority") var/list/VVicon_edit_lock = list("icon", "icon_state", "overlays", "underlays") var/list/VVckey_edit = list("key", "ckey") diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index 212e7a49e8..d908df1b3d 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -284,6 +284,18 @@ if(inactivity > duration) return inactivity return 0 +// Byond seemingly calls stat, each tick. +// Calling things each tick can get expensive real quick. +// So we slow this down a little. +// See: http://www.byond.com/docs/ref/info.html#/client/proc/Stat +/client/Stat() + . = ..() + if (holder) + sleep(1) + else + sleep(5) + stoplag() + /client/proc/last_activity_seconds() return inactivity / 10 diff --git a/code/modules/examine/examine.dm b/code/modules/examine/examine.dm index f09fce6cf3..ec64ffbe41 100644 --- a/code/modules/examine/examine.dm +++ b/code/modules/examine/examine.dm @@ -49,9 +49,10 @@ description_holders["icon"] = "\icon[A]" description_holders["desc"] = A.desc -/client/Stat() +/mob/Stat() . = ..() - if(usr && statpanel("Examine")) + if(client && statpanel("Examine")) + var/description_holders = client.description_holders stat(null,"[description_holders["icon"]] [description_holders["name"]]") //The name, written in big letters. stat(null,"[description_holders["desc"]]") //the default examine text. if(description_holders["info"]) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index f16af92a74..7574bb4c77 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -672,6 +672,23 @@ if(processScheduler) processScheduler.statProcesses() + if(statpanel("MC")) + stat("CPU:","[world.cpu]") + stat("Instances:","[world.contents.len]") + stat(null) + if(Master) + Master.stat_entry() + else + stat("Master Controller:", "ERROR") + if(Failsafe) + Failsafe.stat_entry() + else + stat("Failsafe Controller:", "ERROR") + if(Master) + stat(null) + for(var/datum/controller/subsystem/SS in Master.subsystems) + SS.stat_entry() + if(listed_turf && client) if(!TurfAdjacent(listed_turf)) listed_turf = null diff --git a/code/world.dm b/code/world.dm index 02ec2669a9..8d51f84b47 100644 --- a/code/world.dm +++ b/code/world.dm @@ -70,8 +70,6 @@ var/global/datum/global_init/init = new () #if UNIT_TEST log_unit_test("Unit Tests Enabled. This will destroy the world when testing is complete.") log_unit_test("If you did not intend to enable this please check code/__defines/unit_testing.dm") -#else - sleep_offline = 1 #endif // Set up roundstart seed list. @@ -116,6 +114,7 @@ var/global/datum/global_init/init = new () processScheduler = new master_controller = new /datum/controller/game_controller() + Master.Initialize(10, FALSE) spawn(1) processScheduler.deferSetupFor(/datum/controller/process/ticker) processScheduler.setup() From 8315abb352a612b269b0b3458493f94eaee1bc77 Mon Sep 17 00:00:00 2001 From: Leshana Date: Fri, 2 Jun 2017 07:56:09 -0400 Subject: [PATCH 35/82] Fix issues with radiation controller on multi-z maps. Radiation sources are by design z-level specific, the ray trace check needs to respect this. --- code/datums/repositories/radiation.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/datums/repositories/radiation.dm b/code/datums/repositories/radiation.dm index 5471282026..0245bb801c 100644 --- a/code/datums/repositories/radiation.dm +++ b/code/datums/repositories/radiation.dm @@ -46,6 +46,8 @@ var/global/repository/radiation/radiation_repository = new() var/datum/radiation_source/source = value if(source.rad_power < .) continue // Already being affected by a stronger source + if(source.source_turf.z != T.z) + continue // Radiation is not multi-z var/dist = get_dist(source.source_turf, T) if(dist > source.range) continue // Too far to possibly affect From 72c8b745ddcf2a640f397685e2ec3c597ae93402 Mon Sep 17 00:00:00 2001 From: Yoshax Date: Fri, 2 Jun 2017 19:18:29 +0100 Subject: [PATCH 36/82] Fixes an advanced medical scanner bug --- code/game/machinery/adv_med.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index b1cf9bac08..ed3ea420b3 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -287,8 +287,9 @@ var/bloodData[0] if(H.vessel) var/blood_volume = round(H.vessel.get_reagent_amount("blood")) + var/blood_max = H.species.blood_volume bloodData["volume"] = blood_volume - bloodData["percent"] = round(((blood_volume / 560)*100)) + bloodData["percent"] = round(((blood_volume / blood_max)*100)) occupantData["blood"] = bloodData From 4e6a5ab55b1e51daa4172537463e08d2cfa9377f Mon Sep 17 00:00:00 2001 From: BuildTools Date: Sat, 3 Jun 2017 01:15:27 -0400 Subject: [PATCH 37/82] Adds "treadwell" engiborg sprite. --- .../mob/living/silicon/robot/robot_modules.dm | 3 ++- icons/mob/robots.dmi | Bin 362727 -> 363965 bytes 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 4b2c7f6f79..1dc391f478 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -334,7 +334,8 @@ var/global/list/robot_modules = list( "Antique" = "engineerrobot", "Landmate" = "landmate", "Landmate - Treaded" = "engiborg+tread", - "Drone" = "drone-engineer" + "Drone" = "drone-engineer", + "Treadwell" = "treadwell" ) /obj/item/weapon/robot_module/robot/engineering/construction diff --git a/icons/mob/robots.dmi b/icons/mob/robots.dmi index 2b3dfe51d82b11cd8275bbcc5f1b0a06d6a8fabc..e742bdc8040bcca702513ab219e717d6cecc0d53 100644 GIT binary patch delta 17860 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 CEY*1c delta 16613 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 IH%xs04?MVJ6aWAK From 5ce5f87d4efa42c007a3a0acccf3381ff9957978 Mon Sep 17 00:00:00 2001 From: Yoshax Date: Fri, 2 Jun 2017 19:28:20 +0100 Subject: [PATCH 38/82] Fixes the printout too --- code/game/machinery/adv_med.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index ed3ea420b3..f980cfd0b1 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -460,7 +460,8 @@ if(occupant.vessel) var/blood_volume = round(occupant.vessel.get_reagent_amount("blood")) - var/blood_percent = blood_volume / 560 + var/blood_max = occupant.species.blood_volume + var/blood_percent = blood_volume / blood_max blood_percent *= 100 extra_font = " 448 ? "blue" : "red"]>" From 3a751fd403cf9befe59d6e579c3e9f2c4b6609cc Mon Sep 17 00:00:00 2001 From: Anewbe Date: Sat, 3 Jun 2017 18:30:16 -0500 Subject: [PATCH 39/82] Teshari can now be cloned properly --- code/game/machinery/cloning.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 1c3d957b98..1a1bd9a463 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -181,7 +181,7 @@ use_power(7500) //This might need tweaking. return - else if((occupant.health >= heal_level) && (!eject_wait)) + else if((occupant.health >= heal_level || occupant.health == occupant.maxHealth) && (!eject_wait)) playsound(src.loc, 'sound/machines/ding.ogg', 50, 1) audible_message("\The [src] signals that the cloning process is complete.") connected_message("Cloning Process Complete.") From e2860b30b3465e47b00d7fa5ae1083a18be8a5df Mon Sep 17 00:00:00 2001 From: Anewbe Date: Sat, 3 Jun 2017 19:42:17 -0500 Subject: [PATCH 40/82] Fixes a runtime --- code/modules/mob/living/carbon/human/human.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 6edc754447..ba7aed0250 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -305,7 +305,7 @@ //repurposed proc. Now it combines get_id_name() and get_face_name() to determine a mob's name variable. Made into a seperate proc as it'll be useful elsewhere /mob/living/carbon/human/proc/get_visible_name() - if( mind.changeling && mind.changeling.cloaked) + if( mind && mind.changeling && mind.changeling.cloaked) return "Unknown" if( wear_mask && (wear_mask.flags_inv&HIDEFACE) ) //Wearing a mask which hides our face, use id-name if possible return get_id_name("Unknown") From 5daea1a43d7ae19278fa8c64db7dae14c657d773 Mon Sep 17 00:00:00 2001 From: Yoshax Date: Sun, 4 Jun 2017 02:40:58 +0100 Subject: [PATCH 41/82] Lazyports artifact containers from Bay --- code/_onclick/drag_drop.dm | 10 +++++ .../xenoarcheaology/anomaly_container.dm | 43 +++++++++++++++++++ polaris.dme | 1 + 3 files changed, 54 insertions(+) create mode 100644 code/modules/xenoarcheaology/anomaly_container.dm diff --git a/code/_onclick/drag_drop.dm b/code/_onclick/drag_drop.dm index 42a0574f4d..65974fe009 100644 --- a/code/_onclick/drag_drop.dm +++ b/code/_onclick/drag_drop.dm @@ -5,6 +5,16 @@ recieving object instead, so that's the default action. This allows you to drag almost anything into a trash can. */ + +/atom/proc/CanMouseDrop(atom/over, var/mob/user = usr) + if(!user || !over) + return FALSE + if(user.incapacitated()) + return FALSE + if(!src.Adjacent(user) || !over.Adjacent(user)) + return FALSE // should stop you from dragging through windows + return TRUE + /atom/MouseDrop(atom/over) if(!usr || !over) return if(!Adjacent(usr) || !over.Adjacent(usr)) return // should stop you from dragging through windows diff --git a/code/modules/xenoarcheaology/anomaly_container.dm b/code/modules/xenoarcheaology/anomaly_container.dm new file mode 100644 index 0000000000..616b04b10d --- /dev/null +++ b/code/modules/xenoarcheaology/anomaly_container.dm @@ -0,0 +1,43 @@ +/obj/structure/anomaly_container + name = "anomaly container" + desc = "Used to safely contain and move anomalies." + icon = 'icons/obj/xenoarchaeology.dmi' + icon_state = "anomaly_container" + density = 1 + + var/obj/machinery/artifact/contained + +/obj/structure/anomaly_container/initialize() + ..() + + var/obj/machinery/artifact/A = locate() in loc + if(A) + contain(A) + +/obj/structure/anomaly_container/attack_hand(var/mob/user) + release() + +/obj/structure/anomaly_container/attack_robot(var/mob/user) + if(Adjacent(user)) + release() + +/obj/structure/anomaly_container/proc/contain(var/obj/machinery/artifact/artifact) + if(contained) + return + contained = artifact + artifact.forceMove(src) + underlays += image(artifact) + desc = "Used to safely contain and move anomalies. \The [contained] is kept inside." + +/obj/structure/anomaly_container/proc/release() + if(!contained) + return + contained.dropInto(src) + contained = null + underlays.Cut() + desc = initial(desc) + +/obj/machinery/artifact/MouseDrop(var/obj/structure/anomaly_container/over_object) + if(istype(over_object) && Adjacent(over_object) && CanMouseDrop(over_object, usr)) + Bumped(usr) + over_object.contain(src) \ No newline at end of file diff --git a/polaris.dme b/polaris.dme index 3d82655c4e..59cf36b9e8 100644 --- a/polaris.dme +++ b/polaris.dme @@ -2120,6 +2120,7 @@ #include "code\modules\virus2\helpers.dm" #include "code\modules\virus2\isolator.dm" #include "code\modules\virus2\items_devices.dm" +#include "code\modules\xenoarcheaology\anomaly_container.dm" #include "code\modules\xenoarcheaology\boulder.dm" #include "code\modules\xenoarcheaology\effect.dm" #include "code\modules\xenoarcheaology\manuals.dm" From 8d04339b1ca68b8a0f311bcddec57683e2e102c5 Mon Sep 17 00:00:00 2001 From: Yoshax Date: Sun, 4 Jun 2017 22:49:28 +0100 Subject: [PATCH 42/82] Commits missed file --- icons/obj/xenoarchaeology.dmi | Bin 63847 -> 64398 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/xenoarchaeology.dmi b/icons/obj/xenoarchaeology.dmi index a074f17c3f9cf368da35947f86207a09870dad38..24ebc6ef6cbea5362bf1c262be31a93dbadf2991 100644 GIT binary patch delta 23734 zcmZ^~1z1$w+c!EiC@I~kh#;VJ4oE6WOGqQ#4N`kZrAxX&1f)Z{Q9$W#X@(fO83w-X z^SuA}yzh6;xtNQoJ!|c~*1GTYi+jV5F`_RpV%gB{;vPbQm$o6VL-pyF<6>gISpBX? zz}Lo4c+L-x#TQ{Gb2N3vKV$4fXLm$v?K)jVGHY|v1rfKGIp~#G&1yXsvx9Exw(!}& zu!imEA{K)SNc)+DVSZzt5B{cE5s(*w+_048{R#P*L)t@P^%jF)+F)4P2y zF|W=rvBGiyMdASkJb9~E58kBakgRrS_-|fy2`IS~{1)y$Nj?dr6o+H+D8D{X?Am{T zxnZ6Ei|5@w&y-7c&Xee3m#mW;Kwpu&alP=PxALo>86zds$@&Otb?JL^_$0;5#~&Vi zAzjoHtHerAG&l5rp2z-V&%EFTIE)m9>2Ja)fz zC3=Y5lC=6noEy58dA;ys(V!YEa+YA2XMmt&LjyLclj%5hvw#=%xl{|W50hcI1Thab ze;hFrKM+Su55Az`kE5dW@5&9c2+dP`@bcbE^q1FK=S1NjTp*!m&JsBzOJ&~m!GiTw z7o9X61zKg#3550B8>S5%J61UUtT^q^6ROk_DW`_=HsmvQc-hB9Xh-t6v)ei4!Ec4aH$nFRcgVrAol$LJX&j-)XJO>OT=fe5w6y`S~?{i;rjbcf3KpZ#{ z@bV9egUUs_&~r+n4{xX6DtMuGzjfm*<&+RIBET6 zrq!L5-eR@B#LsoTsF*gqstYU5&CERY>A^~VNZGO;*dKZScH1=JI!CJQ;Qrjli0?Z~ zNr?i|+k7vZ%wyUaX1e=NPI(4!DJ8eRzbL3-#*oSe92ptqKJ4EC*a5F&KfZb4HVb)2~BH+^&|_^9E11kr%$0d%apd9b*DwRihedK_sWbm$Yg6@ z2q|D#x7#Vc<#ke3XEtGGv-47XgqgC$SaY$SHJiHl_wS8Mt5Jp7W>#kE@Pg~$fID=_ z#j+5n$(J;@v|Ov|Wr!%=6-s$0_~-j0m)Cg>&VKyFIMT$j*ee%E^TNzeajd-gH8rHu zMu3Eit7}|x^2e4Iad*Fw9O4mRIkTSjV%lgE~_#0)K`rLCJ+b z_)+h{gl_iTsUe%bYlPplnQ&QHy@(nc;vo=#3Gz}_TGMw^J1=84M(A!f&Qa6ax_GnO zP)#jP^O?ijw}~BM=$y(=#Kh*4x@%u}cz7)Mp$EX0FOVC?yr0I##)^D84|c(G%pU$& z^}aVRKOdtvnqEd%H}zY$%Mlm6jEHu-SIlB(qIe5|kaczClaHdoq9`vaiY@u}Ew3CP z`sC4e?PXSrferf_vql@ugxh7GwB(nM57CY$bDAxn!|$grzV#?RYq;r3PPyGmFIz>o4b2%UYBp*yZp7m z%GF?$f4jbxR_Ja;JA=EsJ1%z6a<`NU!2O5IPPXN}4i)4aF`I8wZM#}Q^y$DiK$!4y z%4f6R@n(AN^QNR@tEInY_`#HqU_XR-_uZxKn_hQP%uykeXwLH`3MRsNrQbr23>xXJ&3qo0uAs z`shB=x2f<#sVL6fPPA8xcpTyU-Mbk)iM3uDJ!JIUI;+zyp|F6xcN+Dcs~C2 zIE%;=?UP4Oy{~)^pVHN z@4^pI)3(PL7Yo$WPQQeA8}HiQxwlON{#-^n~t<|NKnU+0! zJAZ|aO?yW@8+>EUVEiB4lKxxBk_{e19~_ABM54&y2iLa>{ap~^Qs@_kwMJhye||V# zBxe(LvVSubD*)X1AksXcJ>+ih*JFU7Yi$>&?y32HU-gRC;>PB8&q;7q?g3QvxdDmUvJ9F&5@@?|FFZr}FEURAf zMZbwuaHJCh@8xSwLoXK&<@)b=yS1=7Zff=PRi_WV0H?H+KMAqq(|ly@nL>bwiGO

    jv-I`zlel;9-pIs6a9|+% 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 KwM#S|qy7gYhL-~X From 9795b3dbaf9bfbef30ecc23acd0100a42061a3fd Mon Sep 17 00:00:00 2001 From: MatchaFrappe Date: Mon, 5 Jun 2017 16:50:05 +1000 Subject: [PATCH 43/82] Add files via upload --- icons/mob/uniform.dmi | Bin 361135 -> 361289 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi index 37c85a0837210a7d1eaf977e4e551dea38da1d62..3aef9384f41d5c7b6f33ac398fe07634998094d2 100644 GIT binary patch delta 139982 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%0A0DV<` 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 z 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

    Xg0#hD; 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 From 199e929f0c4c67bf4eb8f9587065f5c6b342e53f Mon Sep 17 00:00:00 2001 From: MatchaFrappe Date: Mon, 5 Jun 2017 17:01:09 +1000 Subject: [PATCH 44/82] Update miscellaneous.dm --- code/modules/clothing/under/miscellaneous.dm | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index 6521bdf622..6a50570a2f 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -324,6 +324,11 @@ name = "maid uniform" desc = "A simple maid uniform for housekeeping." icon_state = "janimaid" + +/obj/item/clothing/under/dress/sexymaid + name = "sexy maid uniform" + desc = "You must be a bit risque teasing all of them in a maid uniform!" + icon_state = "sexymaid" /obj/item/clothing/under/dress/dress_fire name = "flame dress" @@ -764,4 +769,4 @@ desc = "A warm looking sweater and a pair of dark blue slacks." name = "sweater" icon_state = "turtleneck" - worn_state = "turtleneck" \ No newline at end of file + worn_state = "turtleneck" From 68310de0ae1f27c175e0078588d7312b8f23a79f Mon Sep 17 00:00:00 2001 From: MatchaFrappe Date: Mon, 5 Jun 2017 17:06:32 +1000 Subject: [PATCH 45/82] Update loadout_uniform.dm --- .../client/preference_setup/loadout/loadout_uniform.dm | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/code/modules/client/preference_setup/loadout/loadout_uniform.dm b/code/modules/client/preference_setup/loadout/loadout_uniform.dm index 8974cc004d..30b0a74f70 100644 --- a/code/modules/client/preference_setup/loadout/loadout_uniform.dm +++ b/code/modules/client/preference_setup/loadout/loadout_uniform.dm @@ -375,6 +375,10 @@ /datum/gear/uniform/dresses/janimaid display_name = "maid uniform" path = /obj/item/clothing/under/dress/janimaid + +/datum/gear/uniform/dresses/sexymaid + display_name = "sexy maid uniform" + path = /obj/item/clothing/under/dress/sexymaid /datum/gear/uniform/pt display_name = "pt uniform" @@ -458,4 +462,4 @@ /datum/gear/uniform/red_swept_dress display_name = "red swept dress" - path = /obj/item/clothing/under/dress/red_swept_dress \ No newline at end of file + path = /obj/item/clothing/under/dress/red_swept_dress From af52ade13750d13d70b1b16fbc3959e328c21d1f Mon Sep 17 00:00:00 2001 From: MatchaFrappe Date: Mon, 5 Jun 2017 17:59:34 +1000 Subject: [PATCH 46/82] Add files via upload --- icons/obj/clothing/uniforms.dmi | Bin 103151 -> 103528 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi index a7fed692adc4726fe32ae664e3e369b36e9bda3b..7c33803ebc15b7c65d7b01f8efc6c28dbff85245 100644 GIT binary patch delta 10910 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 delta 10530 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 G&;JWbS2gSa From c0bce69b7ae95489f50cc21ff800b3ae8dce37d5 Mon Sep 17 00:00:00 2001 From: Leshana Date: Thu, 25 May 2017 15:43:59 -0400 Subject: [PATCH 47/82] Fixes a typo in Guest Pass UI template. Fixes https://github.com/VOREStation/VOREStation/issues/1441 --- nano/templates/guest_pass.tmpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nano/templates/guest_pass.tmpl b/nano/templates/guest_pass.tmpl index 80525f5331..821ba0a474 100644 --- a/nano/templates/guest_pass.tmpl +++ b/nano/templates/guest_pass.tmpl @@ -19,7 +19,7 @@ {{else}}

    Guest pass terminal #{{:data.uid}}

    - {{:helper.link('View activity log', 'list', {'mode' : 1})}} {{:helper.link('Issure Pass', 'eject', {'action' : 'issue'})}} + {{:helper.link('View activity log', 'list', {'mode' : 1})}} {{:helper.link('Issue Pass', 'eject', {'action' : 'issue'})}}

    From 746571f53f1135a0878e2e0f0c5d371bfd3fcfee Mon Sep 17 00:00:00 2001 From: Leshana Date: Thu, 25 May 2017 15:44:47 -0400 Subject: [PATCH 48/82] Adds bedsheets to the list of washable items. Fixes https://github.com/VOREStation/VOREStation/issues/1456 --- code/game/machinery/washing_machine.dm | 2 +- html/changelogs/Leshana-smol-fixes.yml | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 html/changelogs/Leshana-smol-fixes.yml diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index cf96260358..f245682861 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -115,7 +115,7 @@ user << "You can't fit \the [W] inside." return - else if(istype(W, /obj/item/clothing)) + else if(istype(W, /obj/item/clothing) || istype(W, /obj/item/weapon/bedsheet)) if(washing.len < 5) if(state in list(1, 3)) user.drop_item() diff --git a/html/changelogs/Leshana-smol-fixes.yml b/html/changelogs/Leshana-smol-fixes.yml new file mode 100644 index 0000000000..9d972dec1a --- /dev/null +++ b/html/changelogs/Leshana-smol-fixes.yml @@ -0,0 +1,4 @@ +author: Leshana +delete-after: True +changes: + - bugfix: "Bedsheets can be put into washing machines again." From d438cba4062880b242ba6aaafbafc1139a80fb00 Mon Sep 17 00:00:00 2001 From: Leshana Date: Mon, 5 Jun 2017 15:04:29 -0400 Subject: [PATCH 49/82] Fix do_after exploits in Water-Coolers * Fixes https://github.com/VOREStation/VOREStation/issues/561 * Prevents multi-clicking from doing the construction steps multiple times (spawning multiple jugs, or emptying contents of jug multiplie times). * Prevents after-attack from transferring reagent from jug to cooler twice when putting a jug on. --- code/modules/reagents/reagent_dispenser.dm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 49d251d311..e84a963446 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -227,7 +227,7 @@ src.add_fingerprint(user) if(bottle) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - if(do_after(user, 20)) + if(do_after(user, 20) && bottle) user << "You unfasten the jug." var/obj/item/weapon/reagent_containers/glass/cooler_bottle/G = new /obj/item/weapon/reagent_containers/glass/cooler_bottle( src.loc ) for(var/datum/reagent/R in reagents.reagent_list) @@ -262,7 +262,7 @@ if(!bottle && !cupholder) playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) user << "You start taking the water-cooler apart." - if(do_after(user, 20)) + if(do_after(user, 20) && !bottle && !cupholder) user << "You take the water-cooler apart." new /obj/item/stack/material/plastic( src.loc, 4 ) qdel(src) @@ -274,7 +274,7 @@ if(anchored) var/obj/item/weapon/reagent_containers/glass/cooler_bottle/G = I user << "You start to screw the bottle onto the water-cooler." - if(do_after(user, 20)) + if(do_after(user, 20) && !bottle && anchored) bottle = 1 update_icon() user << "You screw the bottle onto the water-cooler!" @@ -286,7 +286,7 @@ user << "You need to wrench down the cooler first." else user << "There is already a bottle there!" - return + return 1 if(istype(I, /obj/item/stack/material/plastic)) if(!cupholder) @@ -295,7 +295,7 @@ src.add_fingerprint(user) user << "You start to attach a cup dispenser onto the water-cooler." playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) - if(do_after(user, 20)) + if(do_after(user, 20) && !cupholder && anchored) if (P.use(1)) user << "You attach a cup dispenser onto the water-cooler." cupholder = 1 From ef7b19926aec4952f74a090af058ac987dabe43f Mon Sep 17 00:00:00 2001 From: Anewbe Date: Mon, 5 Jun 2017 15:08:28 -0500 Subject: [PATCH 50/82] Fixes an examine runtime --- code/modules/mob/living/carbon/human/examine.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index cb8c2ac767..615a3ecf53 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -21,7 +21,7 @@ var/cloaked = 0 // 0 for normal, 1 for cloaked close - if(mind.changeling && mind.changeling.cloaked && !istype(user, /mob/observer)) + if(mind && mind.changeling && mind.changeling.cloaked && !istype(user, /mob/observer)) var/distance = get_dist(user, src) if(distance > 2) src.loc.examine(user) @@ -472,7 +472,7 @@ /mob/living/carbon/human/get_description_fluff() - if(mind.changeling && mind.changeling.cloaked) + if(mind && mind.changeling && mind.changeling.cloaked) return "" else return ..() From 914a291c1bc6c159d95a47938a6681c2bad681d3 Mon Sep 17 00:00:00 2001 From: Woodratt Date: Mon, 5 Jun 2017 17:03:58 -0700 Subject: [PATCH 51/82] WR Lighting changes and other tweaks - Adjusts the radius of lights - Roofs to shuttles - Allows placement of full windows in DM --- code/game/objects/structures/window.dm | 5 +++++ code/game/turfs/unsimulated/floor.dm | 3 +++ code/modules/power/lighting.dm | 6 +++--- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 809dd008a4..4c36a7ac15 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -472,6 +472,11 @@ if (constructed) state = 0 +/obj/structure/window/reinforced/full + dir = 5 + icon_state = "fwindow" + maxhealth = 60 + /obj/structure/window/reinforced/tinted name = "tinted window" desc = "It looks rather strong and opaque. Might take a few good hits to shatter it." diff --git a/code/game/turfs/unsimulated/floor.dm b/code/game/turfs/unsimulated/floor.dm index b2e7836334..bd4fdca814 100644 --- a/code/game/turfs/unsimulated/floor.dm +++ b/code/game/turfs/unsimulated/floor.dm @@ -7,3 +7,6 @@ name = "mask" icon = 'icons/turf/walls.dmi' icon_state = "rockvault" + +/turf/unsimulated/floor/shuttle_ceiling + icon_state = "reinforced" \ No newline at end of file diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 09921cf58b..1f4f8ec756 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -162,7 +162,7 @@ active_power_usage = 20 power_channel = LIGHT //Lights are calc'd via area so they dont need to be in the machine list var/on = 0 // 1 if on, 0 if off - var/brightness_range = 10 // luminosity when on, also used in power calculation + var/brightness_range = 6 // luminosity when on, also used in power calculation var/brightness_power = 3 var/brightness_color = null var/status = LIGHT_OK // LIGHT_OK, _EMPTY, _BURNED or _BROKEN @@ -180,7 +180,7 @@ icon_state = "bulb1" base_state = "bulb" fitting = "bulb" - brightness_range = 6 + brightness_range = 4 brightness_power = 2 brightness_color = "#FFF4E5" desc = "A small lighting fixture." @@ -199,7 +199,7 @@ var/lamp_shade = 1 /obj/machinery/light/small/emergency - brightness_range = 6 + brightness_range = 4 brightness_power = 2 brightness_color = "#da0205" From ebe5cc916de1a38bbcb1259fd0699f771211ad99 Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Sun, 2 Apr 2017 17:41:21 +0200 Subject: [PATCH 52/82] Port of @PsiOmegaDelta's Baystation12/Baystation12#16820 Ports tg's garbage collector subsystem and Destroy() returning qdel hints. --- code/ATMOSPHERICS/pipes.dm | 28 +- code/__defines/qdel.dm | 17 + code/_helpers/mobs.dm | 2 +- .../ProcessScheduler/core/process.dm | 2 +- code/controllers/Processes/garbage.dm | 254 ------------- code/controllers/Processes/machinery.dm | 6 +- code/controllers/Processes/mob.dm | 2 +- code/controllers/Processes/nanoui.dm | 2 +- code/controllers/Processes/obj.dm | 2 +- code/controllers/Processes/scheduler.dm | 4 +- code/controllers/failsafe.dm | 4 +- code/controllers/master.dm | 2 +- code/controllers/master_controller.dm | 6 +- code/controllers/subsystems/garbage.dm | 354 ++++++++++++++++++ code/datums/helper_datums/global_iterator.dm | 1 + code/datums/repositories/decls.dm | 2 +- code/datums/weakref.dm | 6 +- code/game/atoms_movable.dm | 12 +- .../endgame/supermatter_cascade/universe.dm | 1 - code/game/machinery/CableLayer.dm | 2 +- .../atmoalter/portable_atmospherics.dm | 11 +- code/game/machinery/doors/door.dm | 3 +- code/game/machinery/floor_light.dm | 2 +- code/game/machinery/pipe/construction.dm | 18 +- code/game/mecha/mecha.dm | 16 +- .../objects/items/devices/transfer_valve.dm | 2 +- .../objects/items/weapons/flamethrower.dm | 13 +- .../weapons/material/material_weapons.dm | 2 +- code/game/objects/structures.dm | 2 +- code/game/objects/structures/lattice.dm | 2 +- code/game/turfs/turf.dm | 1 + code/modules/admin/view_variables/helpers.dm | 7 - code/modules/assembly/signaler.dm | 2 +- code/modules/client/client defines.dm | 4 + code/modules/client/client procs.dm | 3 + .../hydroponics/spreading/spreading_growth.dm | 2 +- code/modules/lighting/lighting_overlay.dm | 2 +- .../mob/living/carbon/human/update_icons.dm | 2 +- .../living/silicon/robot/drone/drone_items.dm | 2 +- code/modules/mob/mob.dm | 1 + code/modules/mob/mob_grab.dm | 12 +- code/modules/organs/internal/brain.dm | 6 +- code/modules/reagents/Chemistry-Holder.dm | 2 +- code/modules/reagents/Chemistry-Machinery.dm | 2 +- code/modules/reagents/Chemistry-Reagents.dm | 2 +- .../reagent_containers/food/snacks.dm | 4 +- code/modules/shieldgen/emergency_shield.dm | 6 +- code/modules/tables/tables.dm | 2 +- polaris.dme | 3 +- 49 files changed, 479 insertions(+), 366 deletions(-) create mode 100644 code/__defines/qdel.dm delete mode 100644 code/controllers/Processes/garbage.dm create mode 100644 code/controllers/subsystems/garbage.dm diff --git a/code/ATMOSPHERICS/pipes.dm b/code/ATMOSPHERICS/pipes.dm index 105aaa8c8b..c23fc16555 100644 --- a/code/ATMOSPHERICS/pipes.dm +++ b/code/ATMOSPHERICS/pipes.dm @@ -63,11 +63,11 @@ return parent.return_network(reference) /obj/machinery/atmospherics/pipe/Destroy() - qdel(parent) + qdel_null(parent) if(air_temporary) loc.assume_air(air_temporary) - ..() + . = ..() /obj/machinery/atmospherics/pipe/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) if (istype(src, /obj/machinery/atmospherics/pipe/tank)) @@ -227,10 +227,12 @@ /obj/machinery/atmospherics/pipe/simple/Destroy() if(node1) node1.disconnect(src) + node1 = null if(node2) node2.disconnect(src) + node1 = null - ..() + . = ..() /obj/machinery/atmospherics/pipe/simple/pipeline_expansion() return list(node1, node2) @@ -461,12 +463,15 @@ /obj/machinery/atmospherics/pipe/manifold/Destroy() if(node1) node1.disconnect(src) + node1 = null if(node2) node2.disconnect(src) + node2 = null if(node3) node3.disconnect(src) + node3 = null - ..() + . = ..() /obj/machinery/atmospherics/pipe/manifold/disconnect(obj/machinery/atmospherics/reference) if(reference == node1) @@ -705,14 +710,18 @@ /obj/machinery/atmospherics/pipe/manifold4w/Destroy() if(node1) node1.disconnect(src) + node1 = null if(node2) node2.disconnect(src) + node2 = null if(node3) node3.disconnect(src) + node3 = null if(node4) node4.disconnect(src) + node4 = null - ..() + . = ..() /obj/machinery/atmospherics/pipe/manifold4w/disconnect(obj/machinery/atmospherics/reference) if(reference == node1) @@ -967,8 +976,9 @@ /obj/machinery/atmospherics/pipe/cap/Destroy() if(node) node.disconnect(src) + node = null - ..() + . = ..() /obj/machinery/atmospherics/pipe/cap/disconnect(obj/machinery/atmospherics/reference) if(reference == node) @@ -1081,8 +1091,9 @@ /obj/machinery/atmospherics/pipe/tank/Destroy() if(node1) node1.disconnect(src) + node1 = null - ..() + . = ..() /obj/machinery/atmospherics/pipe/tank/pipeline_expansion() return list(node1) @@ -1251,8 +1262,9 @@ /obj/machinery/atmospherics/pipe/vent/Destroy() if(node1) node1.disconnect(src) + node1 = null - ..() + . = ..() /obj/machinery/atmospherics/pipe/vent/pipeline_expansion() return list(node1) diff --git a/code/__defines/qdel.dm b/code/__defines/qdel.dm new file mode 100644 index 0000000000..168a6adf0c --- /dev/null +++ b/code/__defines/qdel.dm @@ -0,0 +1,17 @@ +//defines that give qdel hints. these can be given as a return in destory() or by calling + +#define QDEL_HINT_QUEUE 0 //qdel should queue the object for deletion. +#define QDEL_HINT_LETMELIVE 1 //qdel should let the object live after calling destory. +#define QDEL_HINT_IWILLGC 2 //functionally the same as the above. qdel should assume the object will gc on its own, and not check it. +#define QDEL_HINT_HARDDEL 3 //qdel should assume this object won't gc, and queue a hard delete using a hard reference. +#define QDEL_HINT_HARDDEL_NOW 4 //qdel should assume this object won't gc, and hard del it post haste. +#define QDEL_HINT_FINDREFERENCE 5 //functionally identical to QDEL_HINT_QUEUE if TESTING is not enabled in _compiler_options.dm. + //if TESTING is enabled, qdel will call this object's find_references() verb. +//defines for the gc_destroyed var + +#define GC_QUEUED_FOR_QUEUING -1 +#define GC_QUEUED_FOR_HARD_DEL -2 +#define GC_CURRENTLY_BEING_QDELETED -3 + +#define QDELETED(X) (!X || X.gc_destroyed) +#define QDESTROYING(X) (!X || X.gc_destroyed == GC_CURRENTLY_BEING_QDELETED) diff --git a/code/_helpers/mobs.dm b/code/_helpers/mobs.dm index d7fd20ac77..8ac42dc0b9 100644 --- a/code/_helpers/mobs.dm +++ b/code/_helpers/mobs.dm @@ -228,7 +228,7 @@ Proc for attack log creation, because really why not . = 0 break - if(target_loc && (!target || target_loc != target.loc)) + if(target_loc && (QDELETED(target) || target_loc != target.loc)) . = 0 break diff --git a/code/controllers/ProcessScheduler/core/process.dm b/code/controllers/ProcessScheduler/core/process.dm index edcb8d703c..9f08241978 100644 --- a/code/controllers/ProcessScheduler/core/process.dm +++ b/code/controllers/ProcessScheduler/core/process.dm @@ -387,6 +387,6 @@ exceptions[eid] = 0 /datum/controller/process/proc/catchBadType(var/datum/caught) - if(isnull(caught) || !istype(caught) || !isnull(caught.gcDestroyed)) + if(isnull(caught) || !istype(caught) || QDELETED(caught)) return // Only bother with types we can identify and that don't belong catchException("Type [caught.type] does not belong in process' queue") diff --git a/code/controllers/Processes/garbage.dm b/code/controllers/Processes/garbage.dm deleted file mode 100644 index 02f0411332..0000000000 --- a/code/controllers/Processes/garbage.dm +++ /dev/null @@ -1,254 +0,0 @@ -// The time a datum was destroyed by the GC, or null if it hasn't been -/datum/var/gcDestroyed - -#define GC_COLLECTIONS_PER_RUN 300 -#define GC_COLLECTION_TIMEOUT (30 SECONDS) -#define GC_FORCE_DEL_PER_RUN 30 - -var/datum/controller/process/garbage_collector/garbage_collector -var/list/delayed_garbage = list() - -/datum/controller/process/garbage_collector - var/garbage_collect = 1 // Whether or not to actually do work - var/total_dels = 0 // number of total del()'s - var/tick_dels = 0 // number of del()'s we've done this tick - var/soft_dels = 0 - var/hard_dels = 0 // number of hard dels in total - var/list/destroyed = list() // list of refID's of things that should be garbage collected - // refID's are associated with the time at which they time out and need to be manually del() - // we do this so we aren't constantly locating them and preventing them from being gc'd - - var/list/logging = list() // list of all types that have failed to GC associated with the number of times that's happened. - // the types are stored as strings - -/datum/controller/process/garbage_collector/setup() - name = "garbage" - schedule_interval = 5 SECONDS - start_delay = 3 - - if(!garbage_collector) - garbage_collector = src - - for(var/garbage in delayed_garbage) - qdel(garbage) - delayed_garbage.Cut() - delayed_garbage = null - -#ifdef GC_FINDREF -world/loop_checks = 0 -#endif - -/datum/controller/process/garbage_collector/doWork() - if(!garbage_collect) - return - - tick_dels = 0 - var/time_to_kill = world.time - GC_COLLECTION_TIMEOUT - var/checkRemain = GC_COLLECTIONS_PER_RUN - var/remaining_force_dels = GC_FORCE_DEL_PER_RUN - - - while(destroyed.len && --checkRemain >= 0) - if(remaining_force_dels <= 0) - #ifdef GC_DEBUG - testing("GC: Reached max force dels per tick [dels] vs [maxDels]") - #endif - break // Server's already pretty pounded, everything else can wait 2 seconds - var/refID = destroyed[1] - var/GCd_at_time = destroyed[refID] - if(GCd_at_time > time_to_kill) - #ifdef GC_DEBUG - testing("GC: [refID] not old enough, breaking at [world.time] for [GCd_at_time - time_to_kill] deciseconds until [GCd_at_time + collection_timeout]") - #endif - break // Everything else is newer, skip them - var/datum/A = locate(refID) - #ifdef GC_DEBUG - testing("GC: [refID] old enough to test: GCd_at_time: [GCd_at_time] time_to_kill: [time_to_kill] current: [world.time]") - #endif - if(A && A.gcDestroyed == GCd_at_time) // So if something else coincidently gets the same ref, it's not deleted by mistake - // Something's still referring to the qdel'd object. Kill it. - testing("GC: -- \ref[A] | [A.type] was unable to be GC'd and was deleted --") - logging["[A.type]"]++ - del(A) - - hard_dels++ - remaining_force_dels-- - else - #ifdef GC_DEBUG - testing("GC: [refID] properly GC'd at [world.time] with timeout [GCd_at_time]") - #endif - soft_dels++ - tick_dels++ - total_dels++ - destroyed.Cut(1, 2) - SCHECK - -#undef GC_FORCE_DEL_PER_TICK -#undef GC_COLLECTION_TIMEOUT -#undef GC_COLLECTIONS_PER_TICK - -#ifdef GC_FINDREF -/datum/controller/process/garbage_collector/proc/LookForRefs(var/datum/D, var/list/targ) - . = 0 - for(var/V in D.vars) - if(V == "contents") - continue - if(istype(D.vars[V], /atom)) - var/atom/A = D.vars[V] - if(A in targ) - testing("GC: [A] | [A.type] referenced by [D] | [D.type], var [V]") - . += 1 - else if(islist(D.vars[V])) - . += LookForListRefs(D.vars[V], targ, D, V) - -/datum/controller/process/garbage_collector/proc/LookForListRefs(var/list/L, var/list/targ, var/datum/D, var/V) - . = 0 - for(var/F in L) - if(istype(F, /atom)) - var/atom/A = F - if(A in targ) - testing("GC: [A] | [A.type] referenced by [D] | [D.type], list [V]") - . += 1 - if(islist(F)) - . += LookForListRefs(F, targ, D, "[F] in list [V]") -#endif - -/datum/controller/process/garbage_collector/proc/AddTrash(datum/A) - if(!istype(A) || !isnull(A.gcDestroyed)) - return - #ifdef GC_DEBUG - testing("GC: AddTrash(\ref[A] - [A.type])") - #endif - A.gcDestroyed = world.time - destroyed -= "\ref[A]" // Removing any previous references that were GC'd so that the current object will be at the end of the list. - destroyed["\ref[A]"] = world.time - -/datum/controller/process/garbage_collector/statProcess() - ..() - stat(null, "[garbage_collect ? "On" : "Off"], [destroyed.len] queued") - stat(null, "Dels: [total_dels], [soft_dels] soft, [hard_dels] hard, [tick_dels] last run") - - -// Tests if an atom has been deleted. -/proc/deleted(atom/A) - return !A || !isnull(A.gcDestroyed) - -// Should be treated as a replacement for the 'del' keyword. -// Datums passed to this will be given a chance to clean up references to allow the GC to collect them. -/proc/qdel(var/datum/A) - if(!A) - return - if(!istype(A)) - warning("qdel() passed object of type [A.type]. qdel() can only handle /datum types.") - crash_with("qdel() passed object of type [A.type]. qdel() can only handle /datum types.") - del(A) - if(garbage_collector) - garbage_collector.total_dels++ - garbage_collector.hard_dels++ - else if(isnull(A.gcDestroyed)) - // Let our friend know they're about to get collected - . = !A.Destroy() - if(. && A) - A.finalize_qdel() - -/datum/proc/finalize_qdel() - del(src) - -/atom/finalize_qdel() - if(garbage_collector) - garbage_collector.AddTrash(src) - else - delayed_garbage |= src - -/icon/finalize_qdel() - del(src) - -/image/finalize_qdel() - del(src) - -/mob/finalize_qdel() - del(src) - -/turf/finalize_qdel() - del(src) - -// Default implementation of clean-up code. -// This should be overridden to remove all references pointing to the object being destroyed. -// Return true if the the GC controller should allow the object to continue existing. -/datum/proc/Destroy() - nanomanager.close_uis(src) - tag = null - return - -#ifdef TESTING -/client/var/running_find_references - -/mob/verb/create_thing() - set category = "Debug" - set name = "Create Thing" - - var/path = input("Enter path") - var/atom/thing = new path(loc) - thing.find_references() - -/atom/verb/find_references() - set category = "Debug" - set name = "Find References" - set background = 1 - set src in world - - if(!usr || !usr.client) - return - - if(usr.client.running_find_references) - testing("CANCELLED search for references to a [usr.client.running_find_references].") - usr.client.running_find_references = null - return - - if(alert("Running this will create a lot of lag until it finishes. You can cancel it by running it again. Would you like to begin the search?", "Find References", "Yes", "No") == "No") - return - - // Remove this object from the list of things to be auto-deleted. - if(garbage_collector) - garbage_collector.destroyed -= "\ref[src]" - - usr.client.running_find_references = type - testing("Beginning search for references to a [type].") - var/list/things = list() - for(var/client/thing) - things += thing - for(var/datum/thing) - things += thing - for(var/atom/thing) - things += thing - testing("Collected list of things in search for references to a [type]. ([things.len] Thing\s)") - for(var/datum/thing in things) - if(!usr.client.running_find_references) return - for(var/varname in thing.vars) - var/variable = thing.vars[varname] - if(variable == src) - testing("Found [src.type] \ref[src] in [thing.type]'s [varname] var.") - else if(islist(variable)) - if(src in variable) - testing("Found [src.type] \ref[src] in [thing.type]'s [varname] list var.") - testing("Completed search for references to a [type].") - usr.client.running_find_references = null - -/client/verb/purge_all_destroyed_objects() - set category = "Debug" - if(garbage_collector) - while(garbage_collector.destroyed.len) - var/datum/o = locate(garbage_collector.destroyed[1]) - if(istype(o) && o.gcDestroyed) - del(o) - garbage_collector.dels++ - garbage_collector.destroyed.Cut(1, 2) -#endif - -#ifdef GC_DEBUG -#undef GC_DEBUG -#endif - -#ifdef GC_FINDREF -#undef GC_FINDREF -#endif \ No newline at end of file diff --git a/code/controllers/Processes/machinery.dm b/code/controllers/Processes/machinery.dm index 405615dc1f..1fd1f8ce45 100644 --- a/code/controllers/Processes/machinery.dm +++ b/code/controllers/Processes/machinery.dm @@ -20,7 +20,7 @@ /datum/controller/process/machinery/proc/internal_process_machinery() for(last_object in machines) var/obj/machinery/M = last_object - if(M && !M.gcDestroyed) + if(M && !QDELETED(M)) if(M.process() == PROCESS_KILL) //M.inMachineList = 0 We don't use this debugging function machines.Remove(M) @@ -34,7 +34,7 @@ /datum/controller/process/machinery/proc/internal_process_power() for(last_object in powernets) var/datum/powernet/powerNetwork = last_object - if(istype(powerNetwork) && isnull(powerNetwork.gcDestroyed)) + if(istype(powerNetwork) && !QDELETED(powerNetwork)) powerNetwork.reset() SCHECK continue @@ -52,7 +52,7 @@ /datum/controller/process/machinery/proc/internal_process_pipenets() for(last_object in pipe_networks) var/datum/pipe_network/pipeNetwork = last_object - if(istype(pipeNetwork) && isnull(pipeNetwork.gcDestroyed)) + if(istype(pipeNetwork) && !QDELETED(pipeNetwork)) pipeNetwork.process() SCHECK continue diff --git a/code/controllers/Processes/mob.dm b/code/controllers/Processes/mob.dm index 8681803ac4..6b623e7730 100644 --- a/code/controllers/Processes/mob.dm +++ b/code/controllers/Processes/mob.dm @@ -14,7 +14,7 @@ /datum/controller/process/mob/doWork() for(last_object in mob_list) var/mob/M = last_object - if(M && isnull(M.gcDestroyed)) + if(M && !QDELETED(M)) try M.Life() catch(var/exception/e) diff --git a/code/controllers/Processes/nanoui.dm b/code/controllers/Processes/nanoui.dm index 49b9048c07..21d2f8e5f0 100644 --- a/code/controllers/Processes/nanoui.dm +++ b/code/controllers/Processes/nanoui.dm @@ -9,7 +9,7 @@ /datum/controller/process/nanoui/doWork() for(last_object in nanomanager.processing_uis) var/datum/nanoui/NUI = last_object - if(istype(NUI) && isnull(NUI.gcDestroyed)) + if(istype(NUI) && !QDELETED(NUI)) try NUI.process() catch(var/exception/e) diff --git a/code/controllers/Processes/obj.dm b/code/controllers/Processes/obj.dm index 1010c8cc97..6032cbb541 100644 --- a/code/controllers/Processes/obj.dm +++ b/code/controllers/Processes/obj.dm @@ -11,7 +11,7 @@ /datum/controller/process/obj/doWork() for(last_object in processing_objects) var/datum/O = last_object - if(O && isnull(O.gcDestroyed)) + if(!QDELETED(O)) try O:process() catch(var/exception/e) diff --git a/code/controllers/Processes/scheduler.dm b/code/controllers/Processes/scheduler.dm index 276249bd55..fb9f85d7c4 100644 --- a/code/controllers/Processes/scheduler.dm +++ b/code/controllers/Processes/scheduler.dm @@ -30,8 +30,8 @@ // Note: We won't be informed about tasks being destroyed, but this is the best we can do. /datum/controller/process/scheduler/copyStateFrom(var/datum/controller/process/scheduler/target) scheduled_tasks = list() - for(var/st in target.scheduled_tasks) - if(!deleted(st) && istype(st, /datum/scheduled_task)) + for(var/datum/scheduled_task/st in target.scheduled_tasks) + if(!QDELETED(st) && istype(st)) schedule(st) scheduler = src diff --git a/code/controllers/failsafe.dm b/code/controllers/failsafe.dm index 98c6a5d89d..0589d5fa7f 100644 --- a/code/controllers/failsafe.dm +++ b/code/controllers/failsafe.dm @@ -33,13 +33,13 @@ var/datum/controller/failsafe/Failsafe /datum/controller/failsafe/Initialize() set waitfor = 0 Failsafe.Loop() - if(!deleted(src)) + if(!QDELETED(src)) qdel(src) //when Loop() returns, we delete ourselves and let the mc recreate us /datum/controller/failsafe/Destroy() running = FALSE ..() - // return QDEL_HINT_HARDDEL_NOW // TODO - Once we port garbage.dm + return QDEL_HINT_HARDDEL_NOW /datum/controller/failsafe/proc/Loop() while(running) diff --git a/code/controllers/master.dm b/code/controllers/master.dm index 981cf6d2bb..360b739bad 100644 --- a/code/controllers/master.dm +++ b/code/controllers/master.dm @@ -66,7 +66,7 @@ var/CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING /datum/controller/master/Destroy() ..() // Tell qdel() to Del() this object. - // return QDEL_HINT_HARDDEL_NOW // TODO - Once we port garbage.dm + return QDEL_HINT_HARDDEL_NOW /datum/controller/master/Shutdown() processing = FALSE diff --git a/code/controllers/master_controller.dm b/code/controllers/master_controller.dm index 3075682438..c2d04d9c93 100644 --- a/code/controllers/master_controller.dm +++ b/code/controllers/master_controller.dm @@ -49,7 +49,7 @@ datum/controller/game_controller/proc/setup_objects() admin_notice("Initializing objects", R_DEBUG) sleep(-1) for(var/atom/movable/object in world) - if(isnull(object.gcDestroyed)) + if(!QDELETED(object)) object.initialize() admin_notice("Initializing areas", R_DEBUG) @@ -80,8 +80,8 @@ datum/controller/game_controller/proc/setup_objects() admin_notice("Initializing turbolifts", R_DEBUG) for(var/thing in turbolifts) - if(!deleted(thing)) - var/obj/turbolift_map_holder/lift = thing + var/obj/turbolift_map_holder/lift = thing + if(!QDELETED(lift)) lift.initialize() sleep(-1) diff --git a/code/controllers/subsystems/garbage.dm b/code/controllers/subsystems/garbage.dm new file mode 100644 index 0000000000..e849b64be6 --- /dev/null +++ b/code/controllers/subsystems/garbage.dm @@ -0,0 +1,354 @@ +var/datum/controller/subsystem/garbage_collector/SSgarbage + +/datum/controller/subsystem/garbage_collector + name = "Garbage" + priority = 15 + wait = 5 + flags = SS_FIRE_IN_LOBBY|SS_POST_FIRE_TIMING|SS_BACKGROUND|SS_NO_INIT + + var/collection_timeout = 3000// deciseconds to wait to let running procs finish before we just say fuck it and force del() the object + var/delslasttick = 0 // number of del()'s we've done this tick + var/gcedlasttick = 0 // number of things that gc'ed last tick + var/totaldels = 0 + var/totalgcs = 0 + + var/highest_del_time = 0 + var/highest_del_tickusage = 0 + + var/list/queue = list() // list of refID's of things that should be garbage collected + // refID's are associated with the time at which they time out and need to be manually del() + // we do this so we aren't constantly locating them and preventing them from being gc'd + + var/list/tobequeued = list() //We store the references of things to be added to the queue seperately so we can spread out GC overhead over a few ticks + + var/list/didntgc = list() // list of all types that have failed to GC associated with the number of times that's happened. + // the types are stored as strings + var/list/sleptDestroy = list() //Same as above but these are paths that slept during their Destroy call + + var/list/noqdelhint = list()// list of all types that do not return a QDEL_HINT + // all types that did not respect qdel(A, force=TRUE) and returned one + // of the immortality qdel hints + var/list/noforcerespect = list() + +#ifdef TESTING + var/list/qdel_list = list() // list of all types that have been qdel()eted +#endif + +/datum/controller/subsystem/garbage_collector/New() + NEW_SS_GLOBAL(SSgarbage) + +/datum/controller/subsystem/garbage_collector/stat_entry(msg) + msg += "Q:[queue.len]|D:[delslasttick]|G:[gcedlasttick]|" + msg += "GR:" + if (!(delslasttick+gcedlasttick)) + msg += "n/a|" + else + msg += "[round((gcedlasttick/(delslasttick+gcedlasttick))*100, 0.01)]%|" + + msg += "TD:[totaldels]|TG:[totalgcs]|" + if (!(totaldels+totalgcs)) + msg += "n/a|" + else + msg += "TGR:[round((totalgcs/(totaldels+totalgcs))*100, 0.01)]%" + ..(msg) + +/datum/controller/subsystem/garbage_collector/fire() + HandleToBeQueued() + if(state == SS_RUNNING) + HandleQueue() + +//If you see this proc high on the profile, what you are really seeing is the garbage collection/soft delete overhead in byond. +//Don't attempt to optimize, not worth the effort. +/datum/controller/subsystem/garbage_collector/proc/HandleToBeQueued() + var/list/tobequeued = src.tobequeued + var/starttime = world.time + var/starttimeofday = world.timeofday + while(tobequeued.len && starttime == world.time && starttimeofday == world.timeofday) + if (MC_TICK_CHECK) + break + var/ref = tobequeued[1] + Queue(ref) + tobequeued.Cut(1, 2) + +/datum/controller/subsystem/garbage_collector/proc/HandleQueue() + delslasttick = 0 + gcedlasttick = 0 + var/time_to_kill = world.time - collection_timeout // Anything qdel() but not GC'd BEFORE this time needs to be manually del() + var/list/queue = src.queue + var/starttime = world.time + var/starttimeofday = world.timeofday + while(queue.len && starttime == world.time && starttimeofday == world.timeofday) + if (MC_TICK_CHECK) + break + var/refID = queue[1] + if (!refID) + queue.Cut(1, 2) + continue + + var/GCd_at_time = queue[refID] + if(GCd_at_time > time_to_kill) + break // Everything else is newer, skip them + queue.Cut(1, 2) + var/datum/A + A = locate(refID) + if (A && A.gc_destroyed == GCd_at_time) // So if something else coincidently gets the same ref, it's not deleted by mistake + #ifdef GC_FAILURE_HARD_LOOKUP + A.find_references() + #endif + + // Something's still referring to the qdel'd object. Kill it. + var/type = A.type + testing("GC: -- \ref[A] | [type] was unable to be GC'd and was deleted --") + didntgc["[type]"]++ + var/time = world.timeofday + var/tick = world.tick_usage + var/ticktime = world.time + del(A) + tick = (world.tick_usage-tick+((world.time-ticktime)/world.tick_lag*100)) + + if (tick > highest_del_tickusage) + highest_del_tickusage = tick + time = world.timeofday - time + if (!time && TICK_DELTA_TO_MS(tick) > 1) + time = TICK_DELTA_TO_MS(tick)/100 + if (time > highest_del_time) + highest_del_time = time + if (time > 10) + log_game("Error: [type]([refID]) took longer then 1 second to delete (took [time/10] seconds to delete)") + message_admins("Error: [type]([refID]) took longer then 1 second to delete (took [time/10] seconds to delete).") + postpone(time/5) + break + ++delslasttick + ++totaldels + else + ++gcedlasttick + ++totalgcs + +/datum/controller/subsystem/garbage_collector/proc/QueueForQueuing(datum/A) + if (istype(A) && A.gc_destroyed == GC_CURRENTLY_BEING_QDELETED) + tobequeued += A + A.gc_destroyed = GC_QUEUED_FOR_QUEUING + +/datum/controller/subsystem/garbage_collector/proc/Queue(datum/A) + if (!istype(A) || (!isnull(A.gc_destroyed) && A.gc_destroyed >= 0)) + return + if (A.gc_destroyed == GC_QUEUED_FOR_HARD_DEL) + del(A) + return + var/gctime = world.time + var/refid = "\ref[A]" + + A.gc_destroyed = gctime + + if (queue[refid]) + queue -= refid // Removing any previous references that were GC'd so that the current object will be at the end of the list. + + queue[refid] = gctime + +/datum/controller/subsystem/garbage_collector/proc/HardQueue(datum/A) + if (istype(A) && A.gc_destroyed == GC_CURRENTLY_BEING_QDELETED) + tobequeued += A + A.gc_destroyed = GC_QUEUED_FOR_HARD_DEL + +/datum/controller/subsystem/garbage_collector/Recover() + if (istype(SSgarbage.queue)) + queue |= SSgarbage.queue + if (istype(SSgarbage.tobequeued)) + tobequeued |= SSgarbage.tobequeued + +// Should be treated as a replacement for the 'del' keyword. +// Datums passed to this will be given a chance to clean up references to allow the GC to collect them. +/proc/qdel(datum/D, force=FALSE) + if(!D) + return +#ifdef TESTING + SSgarbage.qdel_list += D.type +#endif + if(!istype(D)) + log_debug("qdel() was passed [log_info_line(D)]. qdel() can only handle instances of (sub)type /datum.") + del(D) + else if(isnull(D.gc_destroyed)) + D.gc_destroyed = GC_CURRENTLY_BEING_QDELETED + var/start_time = world.time + var/hint = D.Destroy(force) // Let our friend know they're about to get fucked up. + if(world.time != start_time) + SSgarbage.sleptDestroy[D.type]++ + if(!D) + return + switch(hint) + if (QDEL_HINT_QUEUE) //qdel should queue the object for deletion. + SSgarbage.QueueForQueuing(D) + if (QDEL_HINT_IWILLGC) + D.gc_destroyed = world.time + return + if (QDEL_HINT_LETMELIVE) //qdel should let the object live after calling destory. + if(!force) + D.gc_destroyed = null //clear the gc variable (important!) + return + // Returning LETMELIVE after being told to force destroy + // indicates the objects Destroy() does not respect force + if(!SSgarbage.noforcerespect[D.type]) + SSgarbage.noforcerespect[D.type] = D.type + crash_with("[D.type] has been force deleted, but is \ + returning an immortal QDEL_HINT, indicating it does \ + not respect the force flag for qdel(). It has been \ + placed in the queue, further instances of this type \ + will also be queued.") + SSgarbage.QueueForQueuing(D) + if (QDEL_HINT_HARDDEL) //qdel should assume this object won't gc, and queue a hard delete using a hard reference to save time from the locate() + SSgarbage.HardQueue(D) + if (QDEL_HINT_HARDDEL_NOW) //qdel should assume this object won't gc, and hard del it post haste. + del(D) + if (QDEL_HINT_FINDREFERENCE)//qdel will, if TESTING is enabled, display all references to this object, then queue the object for deletion. + SSgarbage.QueueForQueuing(D) + #ifdef TESTING + D.find_references() + #endif + else + if(!SSgarbage.noqdelhint[D.type]) + SSgarbage.noqdelhint[D.type] = D.type + crash_with("[D.type] is not returning a qdel hint. It is being placed in the queue. Further instances of this type will also be queued.") + SSgarbage.QueueForQueuing(D) + else if(D.gc_destroyed == GC_CURRENTLY_BEING_QDELETED) + CRASH("[D.type] destroy proc was called multiple times, likely due to a qdel loop in the Destroy logic") + +// Default implementation of clean-up code. +// This should be overridden to remove all references pointing to the object being destroyed. +// Return the appropriate QDEL_HINT; in most cases this is QDEL_HINT_QUEUE. +/datum/proc/Destroy(force=FALSE) + tag = null + nanomanager.close_uis(src) + return QDEL_HINT_QUEUE + +/datum/var/gc_destroyed //Time when this object was destroyed. + +#ifdef TESTING +/datum/var/running_find_references +/datum/var/last_find_references = 0 + +/datum/verb/find_refs() + set category = "Debug" + set name = "Find References" + set background = 1 + set src in world + + find_references(FALSE) + +/datum/proc/find_references(skip_alert) + running_find_references = type + if(usr && usr.client) + if(usr.client.running_find_references) + testing("CANCELLED search for references to a [usr.client.running_find_references].") + usr.client.running_find_references = null + running_find_references = null + //restart the garbage collector + SSgarbage.can_fire = 1 + SSgarbage.next_fire = world.time + world.tick_lag + return + + if(!skip_alert) + if(alert("Running this will lock everything up for about 5 minutes. Would you like to begin the search?", "Find References", "Yes", "No") == "No") + running_find_references = null + return + + //this keeps the garbage collector from failing to collect objects being searched for in here + SSgarbage.can_fire = 0 + + if(usr && usr.client) + usr.client.running_find_references = type + + testing("Beginning search for references to a [type].") + last_find_references = world.time + find_references_in_globals() + for(var/datum/thing in world) + DoSearchVar(thing, "WorldRef: [thing]") + testing("Completed search for references to a [type].") + if(usr && usr.client) + usr.client.running_find_references = null + running_find_references = null + + //restart the garbage collector + SSgarbage.can_fire = 1 + SSgarbage.next_fire = world.time + world.tick_lag + +/client/verb/purge_all_destroyed_objects() + set category = "Debug" + if(SSgarbage) + while(SSgarbage.queue.len) + var/datum/o = locate(SSgarbage.queue[1]) + if(istype(o) && o.gc_destroyed) + del(o) + SSgarbage.totaldels++ + SSgarbage.queue.Cut(1, 2) + +/datum/verb/qdel_then_find_references() + set category = "Debug" + set name = "qdel() then Find References" + set background = 1 + set src in world + + qdel(src) + if(!running_find_references) + find_references(TRUE) + +/client/verb/show_qdeleted() + set category = "Debug" + set name = "Show qdel() Log" + set desc = "Render the qdel() log and display it" + + var/dat = "List of things that have been qdel()eted this round

    " + + var/tmplist = list() + for(var/elem in SSgarbage.qdel_list) + if(!(elem in tmplist)) + tmplist[elem] = 0 + tmplist[elem]++ + + for(var/path in tmplist) + dat += "[path] - [tmplist[path]] times
    " + + usr << browse(dat, "window=qdeletedlog") + +/datum/proc/DoSearchVar(X, Xname) + if(usr && usr.client && !usr.client.running_find_references) return + if(istype(X, /datum)) + var/datum/D = X + if(D.last_find_references == last_find_references) + return + D.last_find_references = last_find_references + for(var/V in D.vars) + for(var/varname in D.vars) + var/variable = D.vars[varname] + if(variable == src) + testing("Found [src.type] \ref[src] in [D.type]'s [varname] var. [Xname]") + else if(islist(variable)) + if(src in variable) + testing("Found [src.type] \ref[src] in [D.type]'s [varname] list var. Global: [Xname]") +#ifdef GC_FAILURE_HARD_LOOKUP + for(var/I in variable) + DoSearchVar(I, TRUE) + else + DoSearchVar(variable, "[Xname]: [varname]") +#endif + else if(islist(X)) + if(src in X) + testing("Found [src.type] \ref[src] in list [Xname].") +#ifdef GC_FAILURE_HARD_LOOKUP + for(var/I in X) + DoSearchVar(I, Xname + ": list") +#else + CHECK_TICK +#endif + +//if find_references isn't working for some datum +//update this list using tools/GenerateGlobalVarAccess +/datum/proc/find_references_in_globals() + // TODO - Impement Global Variable Access + // for(var/global_var in _all_globals) + // DoSearchVar(readglobal(global_var), "Global: [global_var]") +#endif + + +/image/Destroy() + ..() + return QDEL_HINT_HARDDEL_NOW diff --git a/code/datums/helper_datums/global_iterator.dm b/code/datums/helper_datums/global_iterator.dm index 3bf80f06d0..d511b5d233 100644 --- a/code/datums/helper_datums/global_iterator.dm +++ b/code/datums/helper_datums/global_iterator.dm @@ -155,4 +155,5 @@ Data storage vars: tag = null arg_list.Cut() stop() + return QDEL_HINT_LETMELIVE //Do not call ..() diff --git a/code/datums/repositories/decls.dm b/code/datums/repositories/decls.dm index e87be74f53..61b24c21e9 100644 --- a/code/datums/repositories/decls.dm +++ b/code/datums/repositories/decls.dm @@ -36,4 +36,4 @@ /decls/Destroy() crash_with("Prevented attempt to delete a decl instance: [log_info_line(src)]") - return 1 // Prevents Decl destruction \ No newline at end of file + return QDEL_HINT_LETMELIVE // Prevents Decl destruction diff --git a/code/datums/weakref.dm b/code/datums/weakref.dm index 1a7d844ca8..348d73b0b2 100644 --- a/code/datums/weakref.dm +++ b/code/datums/weakref.dm @@ -7,7 +7,9 @@ //obtain a weak reference to a datum /proc/weakref(datum/D) - if(D.gcDestroyed) + if(!istype(D)) + return + if(QDELETED(D)) return if(!D.weakref) D.weakref = new/weakref(D) @@ -22,7 +24,7 @@ /weakref/Destroy() // A weakref datum should not be manually destroyed as it is a shared resource, // rather it should be automatically collected by the BYOND GC when all references are gone. - return 0 + return QDEL_HINT_LETMELIVE /weakref/proc/resolve() var/datum/D = locate(ref) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index fe9f99b032..64ae0722f8 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -23,16 +23,6 @@ if(auto_init && ticker && ticker.current_state == GAME_STATE_PLAYING) initialize() -/atom/movable/Del() - if(isnull(gcDestroyed) && loc) - testing("GC: -- [type] was deleted via del() rather than qdel() --") - crash_with("GC: -- [type] was deleted via del() rather than qdel() --") // stick a stack trace in the runtime logs -// else if(isnull(gcDestroyed)) -// testing("GC: [type] was deleted via GC without qdel()") //Not really a huge issue but from now on, please qdel() -// else -// testing("GC: [type] was deleted via GC with qdel()") - ..() - /atom/movable/Destroy() . = ..() if(reagents) @@ -53,7 +43,7 @@ pulledby = null /atom/movable/proc/initialize() - if(!isnull(gcDestroyed)) + if(QDELETED(src)) crash_with("GC: -- [type] had initialize() called after qdel() --") /atom/movable/Bump(var/atom/A, yes) diff --git a/code/game/gamemodes/endgame/supermatter_cascade/universe.dm b/code/game/gamemodes/endgame/supermatter_cascade/universe.dm index 6f549d15f4..90ac43379f 100644 --- a/code/game/gamemodes/endgame/supermatter_cascade/universe.dm +++ b/code/game/gamemodes/endgame/supermatter_cascade/universe.dm @@ -37,7 +37,6 @@ var/global/universe_has_ended = 0 // Apply changes when entering state /datum/universal_state/supermatter_cascade/OnEnter() set background = 1 - garbage_collector.garbage_collect = 0 world << "You are blinded by a brilliant flash of energy." world << sound('sound/effects/cascade.ogg') diff --git a/code/game/machinery/CableLayer.dm b/code/game/machinery/CableLayer.dm index 2b4eae9a0d..2e10ed3b1b 100644 --- a/code/game/machinery/CableLayer.dm +++ b/code/game/machinery/CableLayer.dm @@ -73,7 +73,7 @@ visible_message("A red light flashes on \the [src].") return cable.use(amount) - if(deleted(cable)) + if(QDELETED(cable)) cable = null return 1 diff --git a/code/game/machinery/atmoalter/portable_atmospherics.dm b/code/game/machinery/atmoalter/portable_atmospherics.dm index b7bcc53e91..deee8ed76b 100644 --- a/code/game/machinery/atmoalter/portable_atmospherics.dm +++ b/code/game/machinery/atmoalter/portable_atmospherics.dm @@ -21,9 +21,9 @@ return 1 /obj/machinery/portable_atmospherics/Destroy() - qdel(air_contents) - qdel(holding) - ..() + qdel_null(air_contents) + qdel_null(holding) + . = ..() /obj/machinery/portable_atmospherics/initialize() . = ..() @@ -40,11 +40,6 @@ else update_icon() -/obj/machinery/portable_atmospherics/Destroy() - qdel(air_contents) - - ..() - /obj/machinery/portable_atmospherics/proc/StandardAirMix() return list( "oxygen" = O2STANDARD * MolesForPressure(), diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index cf7f96d52d..240610358f 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -73,8 +73,7 @@ /obj/machinery/door/Destroy() density = 0 update_nearby_tiles() - ..() - return + . = ..() /obj/machinery/door/process() if(close_door_at && world.time >= close_door_at) diff --git a/code/game/machinery/floor_light.dm b/code/game/machinery/floor_light.dm index a134e68e3f..fdaf284f3f 100644 --- a/code/game/machinery/floor_light.dm +++ b/code/game/machinery/floor_light.dm @@ -150,7 +150,7 @@ var/list/floor_light_cache = list() var/area/A = get_area(src) if(A) on = 0 - ..() + . = ..() /obj/machinery/floor_light/cultify() default_light_colour = "#FF0000" diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 4abdb685d0..06228dd86f 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -485,7 +485,7 @@ Buildable meters var/turf/T = P.loc P.level = !T.is_plating() ? 2 : 1 P.initialize() - if (deleted(P)) + if (QDELETED(P)) usr << pipefailtext return 1 P.build_network() @@ -504,7 +504,7 @@ Buildable meters var/turf/T = P.loc P.level = !T.is_plating() ? 2 : 1 P.initialize() - if (deleted(P)) + if (QDELETED(P)) usr << pipefailtext return 1 P.build_network() @@ -523,7 +523,7 @@ Buildable meters var/turf/T = P.loc P.level = !T.is_plating() ? 2 : 1 P.initialize() - if (deleted(P)) + if (QDELETED(P)) usr << pipefailtext return 1 P.build_network() @@ -542,7 +542,7 @@ Buildable meters var/turf/T = P.loc P.level = !T.is_plating() ? 2 : 1 P.initialize() - if (deleted(P)) + if (QDELETED(P)) usr << pipefailtext return 1 P.build_network() @@ -559,7 +559,7 @@ Buildable meters P.initialize_directions = pipe_dir //this var it's used to know if the pipe is bent or not P.initialize_directions_he = pipe_dir P.initialize() - if (deleted(P)) + if (QDELETED(P)) usr << pipefailtext return 1 P.build_network() @@ -594,7 +594,7 @@ Buildable meters var/turf/T = M.loc M.level = !T.is_plating() ? 2 : 1 M.initialize() - if (deleted(M)) + if (QDELETED(M)) usr << pipefailtext return 1 M.build_network() @@ -663,7 +663,7 @@ Buildable meters var/turf/T = M.loc M.level = !T.is_plating() ? 2 : 1 M.initialize() - if (deleted(M)) + if (QDELETED(M)) usr << pipefailtext return 1 M.build_network() @@ -740,7 +740,7 @@ Buildable meters P.initialize_directions = src.get_pdir() P.initialize_directions_he = src.get_hdir() P.initialize() - if (deleted(P)) + if (QDELETED(P)) usr << pipefailtext //"There's nothing to connect this pipe to! (with how the pipe code works, at least one end needs to be connected to something, otherwise the game deletes the segment)" return 1 P.build_network() @@ -922,7 +922,7 @@ Buildable meters var/turf/T = P.loc P.level = !T.is_plating() ? 2 : 1 P.initialize() - if (deleted(P)) + if (QDELETED(P)) usr << pipefailtext return 1 P.build_network() diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 09ff0075db..5d7d16a126 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -140,18 +140,14 @@ cell = null internal_tank = null - qdel(pr_int_temp_processor) - qdel(pr_inertial_movement) - qdel(pr_give_air) - qdel(pr_internal_damage) - qdel(spark_system) - pr_int_temp_processor = null - pr_give_air = null - pr_internal_damage = null - spark_system = null + qdel_null(pr_int_temp_processor) + qdel_null(pr_inertial_movement) + qdel_null(pr_give_air) + qdel_null(pr_internal_damage) + qdel_null(spark_system) mechas_list -= src //global mech list - ..() + . = ..() //////////////////////// ////// Helpers ///////// diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index 88b53bd342..35697914ee 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -169,7 +169,7 @@ valve_open = 0 - if(deleted(tank_one) || deleted(tank_two)) + if(QDELETED(tank_one) || QDELETED(tank_two)) return var/ratio1 = tank_one.air_contents.volume/tank_two.air_contents.volume diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm index 84bee72558..649b5677ca 100644 --- a/code/game/objects/items/weapons/flamethrower.dm +++ b/code/game/objects/items/weapons/flamethrower.dm @@ -27,15 +27,10 @@ /obj/item/weapon/flamethrower/Destroy() - if(weldtool) - qdel(weldtool) - if(igniter) - qdel(igniter) - if(ptank) - qdel(ptank) - ..() - return - + qdel_null(weldtool) + qdel_null(igniter) + qdel_null(ptank) + . = ..() /obj/item/weapon/flamethrower/process() if(!lit) diff --git a/code/game/objects/items/weapons/material/material_weapons.dm b/code/game/objects/items/weapons/material/material_weapons.dm index 31231964cb..c778ec07a9 100644 --- a/code/game/objects/items/weapons/material/material_weapons.dm +++ b/code/game/objects/items/weapons/material/material_weapons.dm @@ -71,7 +71,7 @@ /obj/item/weapon/material/Destroy() processing_objects -= src - ..() + . = ..() /obj/item/weapon/material/apply_hit_effect() ..() diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index 928246b2b5..eab315809f 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -10,7 +10,7 @@ /obj/structure/Destroy() if(parts) new parts(loc) - ..() + . = ..() /obj/structure/attack_hand(mob/user) if(breakable) diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index ec4652901d..35b8571a11 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -39,7 +39,7 @@ spawn(1) if(istype(O)) // If we built a new floor with the lattice, the open turf won't exist anymore. O.update() // This lattice may be supporting things on top of it. If it's being deleted, they need to fall down. - ..() + . = ..() /obj/structure/lattice/ex_act(severity) switch(severity) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 3f2e0064f2..d34b210b99 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -47,6 +47,7 @@ /turf/Destroy() turfs -= src ..() + return QDEL_HINT_IWILLGC /turf/ex_act(severity) return 0 diff --git a/code/modules/admin/view_variables/helpers.dm b/code/modules/admin/view_variables/helpers.dm index 67eefc018d..95945f82e0 100644 --- a/code/modules/admin/view_variables/helpers.dm +++ b/code/modules/admin/view_variables/helpers.dm @@ -1,8 +1,4 @@ -// Keep these two together, they *must* be defined on both -// If /client ever becomes /datum/client or similar, they can be merged -/client/proc/get_view_variables_header() - return "[src]" /datum/proc/get_view_variables_header() return "[src]" @@ -31,9 +27,6 @@ "} -// Same for these as for get_view_variables_header() above -/client/proc/get_view_variables_options() - return "" /datum/proc/get_view_variables_options() return "" diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm index 169ab9b6a0..1273b004a4 100644 --- a/code/modules/assembly/signaler.dm +++ b/code/modules/assembly/signaler.dm @@ -187,4 +187,4 @@ if(radio_controller) radio_controller.remove_object(src,frequency) frequency = 0 - ..() + . = ..() diff --git a/code/modules/client/client defines.dm b/code/modules/client/client defines.dm index b559652132..5e5a176128 100644 --- a/code/modules/client/client defines.dm +++ b/code/modules/client/client defines.dm @@ -1,4 +1,8 @@ /client + ////////////////////// + //BLACK MAGIC THINGS// + ////////////////////// + parent_type = /datum //////////////// //ADMIN THINGS// //////////////// diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index d908df1b3d..d6f9375e98 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -181,6 +181,9 @@ clients -= src return ..() +/client/Destroy() + ..() + return QDEL_HINT_HARDDEL_NOW // here because it's similar to below diff --git a/code/modules/hydroponics/spreading/spreading_growth.dm b/code/modules/hydroponics/spreading/spreading_growth.dm index fca9f3abaf..0dbe4c9eea 100644 --- a/code/modules/hydroponics/spreading/spreading_growth.dm +++ b/code/modules/hydroponics/spreading/spreading_growth.dm @@ -116,7 +116,7 @@ var/obj/effect/plant/child = new(get_turf(src),seed,parent) spawn(1) // This should do a little bit of animation. - if(deleted(child)) + if(QDELETED(child)) return //move out to the destination diff --git a/code/modules/lighting/lighting_overlay.dm b/code/modules/lighting/lighting_overlay.dm index 60c684fd86..6d912cd862 100644 --- a/code/modules/lighting/lighting_overlay.dm +++ b/code/modules/lighting/lighting_overlay.dm @@ -131,4 +131,4 @@ T.lighting_overlay = null T.luminosity = 1 - return ..() + . = ..() diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 8a2513a54a..9c372cf2e7 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -443,7 +443,7 @@ var/global/list/damage_icon_parts = list() //For legacy support. /mob/living/carbon/human/regenerate_icons() ..() - if(transforming) return + if(transforming || QDELETED(src)) return update_mutations(0) update_body(0) diff --git a/code/modules/mob/living/silicon/robot/drone/drone_items.dm b/code/modules/mob/living/silicon/robot/drone/drone_items.dm index c7fb1d6728..7d5c270f9b 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm @@ -184,7 +184,7 @@ wrapped.force = 0.0 wrapped.attack(M,user) M.attackby(wrapped, user) //attackby reportedly gets procced by being clicked on, at least according to Anewbe. - if(deleted(wrapped) || wrapped.loc != src.loc) + if(QDELETED(wrapped) || wrapped.loc != src.loc) wrapped = null return 1 return 0 diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 7574bb4c77..454b58a55c 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -14,6 +14,7 @@ spellremove(src) ghostize() ..() + return QDEL_HINT_HARDDEL_NOW /mob/proc/remove_screen_obj_references() hands = null diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index 80f68b979d..be114228de 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -83,7 +83,9 @@ //This makes sure that the grab screen object is displayed in the correct hand. -/obj/item/weapon/grab/proc/synch() +/obj/item/weapon/grab/proc/synch() //why is this needed? + if(QDELETED(src)) + return if(affecting) if(assailant.r_hand == src) hud.screen_loc = ui_rhand @@ -91,7 +93,7 @@ hud.screen_loc = ui_lhand /obj/item/weapon/grab/process() - if(gcDestroyed) // GC is trying to delete us, we'll kill our processing so we can cleanly GC + if(QDELETED(src)) // GC is trying to delete us, we'll kill our processing so we can cleanly GC return PROCESS_KILL confirm() @@ -221,6 +223,8 @@ animate(affecting, pixel_x =-shift, pixel_y = 0, 5, 1, LINEAR_EASING) /obj/item/weapon/grab/proc/s_click(obj/screen/S) + if(QDELETED(src)) + return if(!affecting) return if(state == GRAB_UPGRADING) @@ -291,6 +295,8 @@ return 1 /obj/item/weapon/grab/attack(mob/M, mob/living/user) + if(QDELETED(src)) + return if(!affecting) return if(world.time < (last_action + 20)) @@ -336,7 +342,7 @@ /obj/item/weapon/grab/dropped() loc = null - if(!destroying) + if(!QDELETED(src)) qdel(src) /obj/item/weapon/grab/proc/reset_kill_state() diff --git a/code/modules/organs/internal/brain.dm b/code/modules/organs/internal/brain.dm index 1390c89b29..e0809e32b5 100644 --- a/code/modules/organs/internal/brain.dm +++ b/code/modules/organs/internal/brain.dm @@ -67,10 +67,8 @@ brainmob.client.screen.len = null //clear the hud /obj/item/organ/internal/brain/Destroy() - if(brainmob) - qdel(brainmob) - brainmob = null - ..() + qdel_null(brainmob) + . = ..() /obj/item/organ/internal/brain/proc/transfer_identity(var/mob/living/carbon/H) diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index 49c1099184..60efe9893d 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -23,7 +23,7 @@ chemical_reagents_list[D.id] = D /datum/reagents/Destroy() - ..() + . = ..() if(chemistryProcess) chemistryProcess.active_holders -= src diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index 78b33ef36e..ccf7c62ac1 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -488,7 +488,7 @@ var/amount_to_take = max(0,min(stack.amount,round(remaining_volume/REAGENTS_PER_SHEET))) if(amount_to_take) stack.use(amount_to_take) - if(deleted(stack)) + if(QDELETED(stack)) holdingitems -= stack beaker.reagents.add_reagent(sheet_reagents[stack.type], (amount_to_take*REAGENTS_PER_SHEET)) continue diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 723db2ace7..f23e37f516 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -118,8 +118,8 @@ return null /datum/reagent/Destroy() // This should only be called by the holder, so it's already handled clearing its references - ..() holder = null + . = ..() /* DEPRECATED - TODO: REMOVE EVERYWHERE */ diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm index 3191442be8..ef07b03c4f 100644 --- a/code/modules/reagents/reagent_containers/food/snacks.dm +++ b/code/modules/reagents/reagent_containers/food/snacks.dm @@ -210,8 +210,8 @@ /obj/item/weapon/reagent_containers/food/snacks/Destroy() if(contents) for(var/atom/movable/something in contents) - something.loc = get_turf(src) - ..() + something.dropInto(loc) + . = ..() //////////////////////////////////////////////////////////////////////////////// /// FOOD END diff --git a/code/modules/shieldgen/emergency_shield.dm b/code/modules/shieldgen/emergency_shield.dm index 4872131429..d7ce2063b2 100644 --- a/code/modules/shieldgen/emergency_shield.dm +++ b/code/modules/shieldgen/emergency_shield.dm @@ -55,7 +55,7 @@ check_failure() set_opacity(1) - spawn(20) if(!deleted(src)) set_opacity(0) + spawn(20) if(!QDELETED(src)) set_opacity(0) ..() @@ -64,7 +64,7 @@ ..() check_failure() set_opacity(1) - spawn(20) if(!deleted(src)) set_opacity(0) + spawn(20) if(!QDELETED(src)) set_opacity(0) /obj/machinery/shield/ex_act(severity) switch(severity) @@ -114,7 +114,7 @@ //The shield becomes dense to absorb the blow.. purely asthetic. set_opacity(1) - spawn(20) if(!deleted(src)) set_opacity(0) + spawn(20) if(!QDELETED(src)) set_opacity(0) ..() return diff --git a/code/modules/tables/tables.dm b/code/modules/tables/tables.dm index db445e9f50..cea2c93559 100644 --- a/code/modules/tables/tables.dm +++ b/code/modules/tables/tables.dm @@ -79,7 +79,7 @@ update_connections(1) // Update tables around us to ignore us (material=null forces no connections) for(var/obj/structure/table/T in oview(src, 1)) T.update_icon() - ..() + . = ..() /obj/structure/table/examine(mob/user) . = ..() diff --git a/polaris.dme b/polaris.dme index 942ada13d4..9cb2df356d 100644 --- a/polaris.dme +++ b/polaris.dme @@ -37,6 +37,7 @@ #include "code\__defines\mobs.dm" #include "code\__defines\planets.dm" #include "code\__defines\process_scheduler.dm" +#include "code\__defines\qdel.dm" #include "code\__defines\research.dm" #include "code\__defines\species_languages.dm" #include "code\__defines\targeting.dm" @@ -152,7 +153,6 @@ #include "code\controllers\Processes\emergencyShuttle.dm" #include "code\controllers\Processes\event.dm" #include "code\controllers\Processes\game_master.dm" -#include "code\controllers\Processes\garbage.dm" #include "code\controllers\Processes\inactivity.dm" #include "code\controllers\Processes\lighting.dm" #include "code\controllers\Processes\machinery.dm" @@ -170,6 +170,7 @@ #include "code\controllers\Processes\vote.dm" #include "code\controllers\ProcessScheduler\core\process.dm" #include "code\controllers\ProcessScheduler\core\processScheduler.dm" +#include "code\controllers\subsystems\garbage.dm" #include "code\datums\ai_law_sets.dm" #include "code\datums\ai_laws.dm" #include "code\datums\browser.dm" From d4ebcac3f6964b1311e835d5378950c4da950919 Mon Sep 17 00:00:00 2001 From: Leshana Date: Mon, 5 Jun 2017 18:02:16 -0400 Subject: [PATCH 53/82] Update radiation system for the new garbage collector. --- code/controllers/Processes/radiation.dm | 18 +++++++++--------- code/datums/repositories/radiation.dm | 8 -------- 2 files changed, 9 insertions(+), 17 deletions(-) diff --git a/code/controllers/Processes/radiation.dm b/code/controllers/Processes/radiation.dm index 192acf5d5c..71d9c60233 100644 --- a/code/controllers/Processes/radiation.dm +++ b/code/controllers/Processes/radiation.dm @@ -15,10 +15,10 @@ /datum/controller/process/radiation/proc/sources_decay() var/list/sources = linked.sources for(var/thing in sources) - if(deleted(thing)) - sources.Remove(thing) - continue var/datum/radiation_source/S = thing + if(QDELETED(S)) + sources.Remove(S) + continue if(S.decay) S.update_rad_power(S.rad_power - config.radiation_decay_rate) if(S.rad_power <= config.radiation_lower_limit) @@ -29,22 +29,22 @@ /datum/controller/process/radiation/proc/cache_expires() var/list/resistance_cache = linked.resistance_cache for(var/thing in resistance_cache) - if(deleted(thing)) - resistance_cache.Remove(thing) - continue var/turf/T = thing + if(QDELETED(T)) + resistance_cache.Remove(T) + continue if((length(T.contents) + 1) != resistance_cache[T]) resistance_cache.Remove(T) // If its stale REMOVE it! It will get added if its needed. SCHECK - // Step 3 - Registered irradiatable things are checked for radiation +// Step 3 - Registered irradiatable things are checked for radiation /datum/controller/process/radiation/proc/irradiate_targets() var/list/registered_listeners = living_mob_list // For now just use this. Nothing else is interested anyway. if(length(linked.sources) > 0) for(var/thing in registered_listeners) - if(deleted(thing)) - continue var/atom/A = thing + if(QDELETED(A)) + continue var/turf/T = get_turf(thing) var/rads = linked.get_rads_at_turf(T) if(rads) diff --git a/code/datums/repositories/radiation.dm b/code/datums/repositories/radiation.dm index 0245bb801c..00c3532458 100644 --- a/code/datums/repositories/radiation.dm +++ b/code/datums/repositories/radiation.dm @@ -22,14 +22,6 @@ var/global/repository/radiation/radiation_repository = new() src.source_turf = null . = ..() -// TEMPORARY HACK - hard del()'ing sources is too expensive! Until we implement qdel() hints we need to override behavior here -/datum/radiation_source/finalize_qdel() - if(garbage_collector) - garbage_collector.AddTrash(src) - else - delayed_garbage |= src -// TEMPORARY HACK END - /datum/radiation_source/proc/update_rad_power(var/new_power = null) if(new_power != null && new_power != rad_power) rad_power = new_power From 733f69a4741b92f0309bb27d8c77f848531aca2b Mon Sep 17 00:00:00 2001 From: Leshana Date: Mon, 5 Jun 2017 17:55:34 -0400 Subject: [PATCH 54/82] Remove redundant cleanup of /atom/var/reagents * /datum/reagents/Destroy() does everything /datum/reagents/delete() does and more, and delete() is called only from /obj/effect/Destroy() which is *itself* redundant with its parent /atom/movable/Destroy() --- code/game/objects/effects/effect_system.dm | 5 ----- code/modules/reagents/Chemistry-Holder.dm | 6 ------ 2 files changed, 11 deletions(-) diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm index 2343871b95..4c930d23cf 100644 --- a/code/game/objects/effects/effect_system.dm +++ b/code/game/objects/effects/effect_system.dm @@ -13,11 +13,6 @@ would spawn and follow the beaker, even if it is carried or thrown. unacidable = 1//So effect are not targeted by alien acid. pass_flags = PASSTABLE | PASSGRILLE -/obj/effect/Destroy() - if(reagents) - reagents.delete() - return ..() - /datum/effect/effect/system var/number = 3 var/cardinals = 0 diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index 60efe9893d..d634711379 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -79,12 +79,6 @@ total_volume += R.volume return -/datum/reagents/proc/delete() - for(var/datum/reagent/R in reagent_list) - R.holder = null - if(my_atom) - my_atom.reagents = null - /datum/reagents/proc/handle_reactions() if(chemistryProcess) chemistryProcess.mark_for_update(src) From 8752999a14f58515c4f9dd441311810f3b2d1bd3 Mon Sep 17 00:00:00 2001 From: Leshana Date: Mon, 5 Jun 2017 21:50:38 -0400 Subject: [PATCH 55/82] Atmospherics Destroy() cleanup - return qdel hints. --- .../components/binary_devices/binary_atmos_base.dm | 4 +--- .../components/binary_devices/pipeturbine.dm | 4 +--- code/ATMOSPHERICS/components/omni_devices/filter.dm | 2 +- code/ATMOSPHERICS/components/portables_connector.dm | 4 +--- .../components/trinary_devices/trinary_base.dm | 4 +--- code/ATMOSPHERICS/components/tvalve.dm | 4 +--- code/ATMOSPHERICS/components/unary/unary_base.dm | 4 +--- code/ATMOSPHERICS/components/unary/vent_pump.dm | 12 ++++-------- code/ATMOSPHERICS/components/unary/vent_scrubber.dm | 13 ++++--------- code/ATMOSPHERICS/components/valve.dm | 4 +--- code/ATMOSPHERICS/datum_pipeline.dm | 6 ++---- 11 files changed, 18 insertions(+), 43 deletions(-) diff --git a/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm b/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm index 2ccfe0f2e8..ea604bc996 100644 --- a/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm +++ b/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm @@ -42,7 +42,7 @@ obj/machinery/atmospherics/binary return null Destroy() - loc = null + . = ..() if(node1) node1.disconnect(src) @@ -54,8 +54,6 @@ obj/machinery/atmospherics/binary node1 = null node2 = null - ..() - initialize() if(node1 && node2) return diff --git a/code/ATMOSPHERICS/components/binary_devices/pipeturbine.dm b/code/ATMOSPHERICS/components/binary_devices/pipeturbine.dm index 5768def1ec..d0417e14dd 100644 --- a/code/ATMOSPHERICS/components/binary_devices/pipeturbine.dm +++ b/code/ATMOSPHERICS/components/binary_devices/pipeturbine.dm @@ -36,7 +36,7 @@ initialize_directions = NORTH|SOUTH Destroy() - loc = null + . = ..() if(node1) node1.disconnect(src) @@ -48,8 +48,6 @@ node1 = null node2 = null - ..() - process() ..() if(anchored && !(stat&BROKEN)) diff --git a/code/ATMOSPHERICS/components/omni_devices/filter.dm b/code/ATMOSPHERICS/components/omni_devices/filter.dm index b2966ef431..feb1b5cb93 100644 --- a/code/ATMOSPHERICS/components/omni_devices/filter.dm +++ b/code/ATMOSPHERICS/components/omni_devices/filter.dm @@ -28,7 +28,7 @@ input = null output = null filters.Cut() - ..() + return ..() /obj/machinery/atmospherics/omni/filter/sort_ports() for(var/datum/omni_port/P in ports) diff --git a/code/ATMOSPHERICS/components/portables_connector.dm b/code/ATMOSPHERICS/components/portables_connector.dm index 4f6473fccf..9668f7a5a3 100644 --- a/code/ATMOSPHERICS/components/portables_connector.dm +++ b/code/ATMOSPHERICS/components/portables_connector.dm @@ -61,7 +61,7 @@ return null /obj/machinery/atmospherics/portables_connector/Destroy() - loc = null + . = ..() if(connected_device) connected_device.disconnect() @@ -72,8 +72,6 @@ node = null - ..() - /obj/machinery/atmospherics/portables_connector/initialize() if(node) return diff --git a/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm b/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm index fa066d978f..717540db69 100644 --- a/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm @@ -51,7 +51,7 @@ obj/machinery/atmospherics/trinary return null Destroy() - loc = null + . = ..() if(node1) node1.disconnect(src) @@ -67,8 +67,6 @@ obj/machinery/atmospherics/trinary node2 = null node3 = null - ..() - initialize() if(node1 && node2 && node3) return diff --git a/code/ATMOSPHERICS/components/tvalve.dm b/code/ATMOSPHERICS/components/tvalve.dm index f93970a93f..a7deb70aba 100644 --- a/code/ATMOSPHERICS/components/tvalve.dm +++ b/code/ATMOSPHERICS/components/tvalve.dm @@ -100,7 +100,7 @@ return null /obj/machinery/atmospherics/tvalve/Destroy() - loc = null + . = ..() if(node1) node1.disconnect(src) @@ -116,8 +116,6 @@ node2 = null node3 = null - ..() - /obj/machinery/atmospherics/tvalve/proc/go_to_side() if(state) return 0 diff --git a/code/ATMOSPHERICS/components/unary/unary_base.dm b/code/ATMOSPHERICS/components/unary/unary_base.dm index 20d37b309c..0372483c79 100644 --- a/code/ATMOSPHERICS/components/unary/unary_base.dm +++ b/code/ATMOSPHERICS/components/unary/unary_base.dm @@ -31,7 +31,7 @@ return null Destroy() - loc = null + . = ..() if(node) node.disconnect(src) @@ -39,8 +39,6 @@ node = null - ..() - initialize() if(node) return diff --git a/code/ATMOSPHERICS/components/unary/vent_pump.dm b/code/ATMOSPHERICS/components/unary/vent_pump.dm index 00bc7e5772..c6121dea31 100644 --- a/code/ATMOSPHERICS/components/unary/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary/vent_pump.dm @@ -80,7 +80,10 @@ /obj/machinery/atmospherics/unary/vent_pump/Destroy() unregister_radio(src, frequency) - ..() + if(initial_loc) + initial_loc.air_vent_info -= id_tag + initial_loc.air_vent_names -= id_tag + return ..() /obj/machinery/atmospherics/unary/vent_pump/high_volume name = "Large Air Vent" @@ -414,13 +417,6 @@ new /obj/item/pipe(loc, make_from=src) qdel(src) -/obj/machinery/atmospherics/unary/vent_pump/Destroy() - if(initial_loc) - initial_loc.air_vent_info -= id_tag - initial_loc.air_vent_names -= id_tag - ..() - return - #undef DEFAULT_PRESSURE_DELTA #undef EXTERNAL_PRESSURE_BOUND diff --git a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm index 06d1bce437..3fccbb50f3 100644 --- a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm +++ b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm @@ -44,8 +44,10 @@ /obj/machinery/atmospherics/unary/vent_scrubber/Destroy() unregister_radio(src, frequency) - ..() - + if(initial_loc) + initial_loc.air_scrub_info -= id_tag + initial_loc.air_scrub_names -= id_tag + return ..() /obj/machinery/atmospherics/unary/vent_scrubber/update_icon(var/safety = 0) if(!check_icon_cache()) @@ -285,10 +287,3 @@ user << "A small gauge in the corner reads [round(last_flow_rate, 0.1)] L/s; [round(last_power_draw)] W" else user << "You are too far away to read the gauge." - -/obj/machinery/atmospherics/unary/vent_scrubber/Destroy() - if(initial_loc) - initial_loc.air_scrub_info -= id_tag - initial_loc.air_scrub_names -= id_tag - ..() - return diff --git a/code/ATMOSPHERICS/components/valve.dm b/code/ATMOSPHERICS/components/valve.dm index 3cd77597b3..01e6e977bb 100644 --- a/code/ATMOSPHERICS/components/valve.dm +++ b/code/ATMOSPHERICS/components/valve.dm @@ -72,7 +72,7 @@ return null /obj/machinery/atmospherics/valve/Destroy() - loc = null + . = ..() if(node1) node1.disconnect(src) @@ -84,8 +84,6 @@ node1 = null node2 = null - ..() - /obj/machinery/atmospherics/valve/proc/open() if(open) return 0 diff --git a/code/ATMOSPHERICS/datum_pipeline.dm b/code/ATMOSPHERICS/datum_pipeline.dm index 44c7cd2590..0aece2d139 100644 --- a/code/ATMOSPHERICS/datum_pipeline.dm +++ b/code/ATMOSPHERICS/datum_pipeline.dm @@ -10,14 +10,12 @@ datum/pipeline var/alert_pressure = 0 Destroy() - if(network) - qdel(network) + qdel_null(network) if(air && air.volume) temporarily_store_air() - qdel(air) - ..() + . = ..() proc/process()//This use to be called called from the pipe networks From 010cca1d44757d346b0880c485c47f7438330b67 Mon Sep 17 00:00:00 2001 From: Leshana Date: Mon, 5 Jun 2017 21:51:00 -0400 Subject: [PATCH 56/82] Pipe network datum Destroy() cleanup * Every pipe in a pipeline has a reference to the pipeline. This needs to be cleared, both so the pipeline can be gc'd, and also so the pipes don't try and keep using the qdel'd pipeline. * Same story for each pipeline in a pipe network, and each machine in a pipe network. * Pipe networks are also in the pipe_networks global list. While the controller would detect and remove it from the list on the next tick, cleaning up ourselves is the responsible thing to do. --- code/ATMOSPHERICS/datum_pipe_network.dm | 9 +++++++++ code/ATMOSPHERICS/datum_pipeline.dm | 2 ++ 2 files changed, 11 insertions(+) diff --git a/code/ATMOSPHERICS/datum_pipe_network.dm b/code/ATMOSPHERICS/datum_pipe_network.dm index 7fe586733c..8441461342 100644 --- a/code/ATMOSPHERICS/datum_pipe_network.dm +++ b/code/ATMOSPHERICS/datum_pipe_network.dm @@ -16,6 +16,15 @@ datum/pipe_network ..() + Destroy() + pipe_networks -= src + for(var/datum/pipeline/line_member in line_members) + line_member.network = null + for(var/obj/machinery/atmospherics/normal_member in normal_members) + normal_member.reassign_network(src, null) + gases.Cut() // Do not qdel the gases, we don't own them + return ..() + proc/process() //Equalize gases amongst pipe if called for if(update) diff --git a/code/ATMOSPHERICS/datum_pipeline.dm b/code/ATMOSPHERICS/datum_pipeline.dm index 0aece2d139..0115c85c3d 100644 --- a/code/ATMOSPHERICS/datum_pipeline.dm +++ b/code/ATMOSPHERICS/datum_pipeline.dm @@ -14,6 +14,8 @@ datum/pipeline if(air && air.volume) temporarily_store_air() + for(var/obj/machinery/atmospherics/pipe/P in members) + P.parent = null . = ..() From e48b548f2b50236a35ee85bfb35b2708ea44a8e2 Mon Sep 17 00:00:00 2001 From: Leshana Date: Mon, 5 Jun 2017 21:55:18 -0400 Subject: [PATCH 57/82] More and more Destroy() cleanups all across the board - Return qdel hints. --- code/_helpers/unsorted.dm | 7 ++++++ code/_onclick/hud/ability_screen_objects.dm | 2 +- code/_onclick/hud/action.dm | 5 +++- code/_onclick/hud/hud.dm | 2 +- code/_onclick/hud/screen_objects.dm | 2 +- code/_onclick/hud/spell_screen_objects.dm | 4 ++-- code/controllers/communications.dm | 1 - code/controllers/voting.dm | 8 ++++++- code/datums/wires/wires.dm | 1 + code/game/machinery/doors/airlock_control.dm | 6 ++--- code/game/machinery/hologram.dm | 2 +- code/game/machinery/pipe/pipelayer.dm | 5 ++-- code/game/objects/buckling.dm | 5 ---- code/game/objects/items/devices/PDA/PDA.dm | 8 +++++-- code/game/objects/items/devices/PDA/cart.dm | 8 +++---- .../devices/communicator/communicator.dm | 2 +- .../objects/items/devices/radio/intercom.dm | 2 +- .../items/weapons/material/material_armor.dm | 2 +- code/game/objects/items/weapons/mop_deploy.dm | 12 +++++----- .../objects/items/weapons/storage/internal.dm | 2 +- .../objects/items/weapons/storage/storage.dm | 18 +++++++-------- .../game/objects/items/weapons/tanks/tanks.dm | 5 ++-- code/game/objects/structures.dm | 3 --- code/game/objects/structures/window.dm | 5 +--- .../spacesuits/rig/modules/utility.dm | 4 ++-- code/modules/lighting/lighting_corner.dm | 6 +++++ code/modules/lighting/lighting_overlay.dm | 23 +++++++++++-------- code/modules/mob/freelook/ai/eye.dm | 2 +- .../mob/freelook/ai/update_triggers.dm | 2 +- code/modules/mob/freelook/eye.dm | 6 ++++- .../mob/freelook/mask/update_triggers.dm | 2 +- code/modules/mob/freelook/update_triggers.dm | 4 ++-- code/modules/mob/freelook/visualnet.dm | 2 +- code/modules/mob/holder.dm | 2 +- code/modules/mob/living/silicon/ai/ai.dm | 23 ++++++++----------- code/modules/mob/living/silicon/silicon.dm | 2 +- .../mob/living/simple_animal/simple_animal.dm | 2 +- code/modules/mob/mob_grab.dm | 6 +---- code/modules/mob/modifiers.dm | 2 +- code/modules/power/breaker_box.dm | 2 +- code/modules/power/cable.dm | 2 +- code/modules/power/grid_checker.dm | 2 +- code/modules/power/lighting.dm | 2 +- code/modules/power/power.dm | 2 +- code/modules/power/singularity/collector.dm | 2 +- .../Chemistry-Reagents-Toxins.dm | 2 +- code/modules/tables/update_triggers.dm | 4 +--- code/world.dm | 3 ++- maps/RandomZLevels/stationCollision.dm | 4 ++-- maps/RandomZLevels/wildwest.dm | 2 +- maps/~map_system/maps.dm | 9 ++++++-- 51 files changed, 128 insertions(+), 113 deletions(-) diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm index 2b75414a7e..63bac6e134 100644 --- a/code/_helpers/unsorted.dm +++ b/code/_helpers/unsorted.dm @@ -1294,6 +1294,13 @@ var/mob/dview/dview_mob = new else living_mob_list -= src +/mob/dview/Destroy(var/force) + crash_with("Attempt to delete the dview_mob: [log_info_line(src)]") + if (!force) + return QDEL_HINT_LETMELIVE + global.dview_mob = new + return ..() + // call to generate a stack trace and print to runtime logs /proc/crash_with(msg) CRASH(msg) diff --git a/code/_onclick/hud/ability_screen_objects.dm b/code/_onclick/hud/ability_screen_objects.dm index 2081e011b3..d29ef9dd96 100644 --- a/code/_onclick/hud/ability_screen_objects.dm +++ b/code/_onclick/hud/ability_screen_objects.dm @@ -20,7 +20,7 @@ message_admins("ERROR: ability_master's New() was not given an owner argument. This is a bug.") /obj/screen/movable/ability_master/Destroy() - ..() + . = ..() //Get rid of the ability objects. remove_all_abilities() ability_objects.Cut() diff --git a/code/_onclick/hud/action.dm b/code/_onclick/hud/action.dm index 9781e9c236..7e03151fd6 100644 --- a/code/_onclick/hud/action.dm +++ b/code/_onclick/hud/action.dm @@ -30,6 +30,9 @@ /datum/action/Destroy() if(owner) Remove(owner) + target = null + qdel_null(button) + return ..() /datum/action/proc/Grant(mob/living/T) if(owner) @@ -45,7 +48,7 @@ if(button) if(T.client) T.client.screen -= button - del(button) + qdel_null(button) T.actions.Remove(src) T.update_action_buttons() owner = null diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 45c6f7e277..0f6990f681 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -155,7 +155,7 @@ datum/hud/New(mob/owner) ..() /datum/hud/Destroy() - ..() + . = ..() grab_intent = null hurt_intent = null disarm_intent = null diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index e55323fb3a..35ef300978 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -46,7 +46,7 @@ var/obj/item/owner /obj/screen/item_action/Destroy() - ..() + . = ..() owner = null /obj/screen/item_action/Click() diff --git a/code/_onclick/hud/spell_screen_objects.dm b/code/_onclick/hud/spell_screen_objects.dm index a599381730..e79db28713 100644 --- a/code/_onclick/hud/spell_screen_objects.dm +++ b/code/_onclick/hud/spell_screen_objects.dm @@ -13,7 +13,7 @@ var/mob/spell_holder /obj/screen/movable/spell_master/Destroy() - ..() + . = ..() for(var/obj/screen/spell/spells in spell_objects) spells.spellmaster = null spell_objects.Cut() @@ -156,7 +156,7 @@ var/icon/last_charged_icon /obj/screen/spell/Destroy() - ..() + . = ..() spell = null last_charged_icon = null if(spellmaster) diff --git a/code/controllers/communications.dm b/code/controllers/communications.dm index 796fb0b664..332ab9af52 100644 --- a/code/controllers/communications.dm +++ b/code/controllers/communications.dm @@ -314,7 +314,6 @@ var/global/datum/controller/radio/radio_controller devices_line -= null if (devices_line.len==0) devices -= devices_filter - del(devices_line) /datum/signal var/obj/source diff --git a/code/controllers/voting.dm b/code/controllers/voting.dm index aa06984f69..ba1bb23c33 100644 --- a/code/controllers/voting.dm +++ b/code/controllers/voting.dm @@ -23,9 +23,15 @@ var/global/list/round_voters = list() // Keeps track of the individuals voting f /datum/controller/vote/New() if(vote != src) if(istype(vote)) - del(vote) + Recover() + qdel(vote) vote = src +/datum/controller/vote/Destroy() + ..() + // Tell qdel() to Del() this object. + return QDEL_HINT_HARDDEL_NOW + /datum/controller/vote/proc/process() //called by master_controller if(mode) // No more change mode votes after the game has started. diff --git a/code/datums/wires/wires.dm b/code/datums/wires/wires.dm index 066c357a22..c1ee225dce 100644 --- a/code/datums/wires/wires.dm +++ b/code/datums/wires/wires.dm @@ -48,6 +48,7 @@ var/list/wireColours = list("red", "blue", "green", "darkred", "orange", "brown" /datum/wires/Destroy() holder = null + signallers.Cut() return ..() /datum/wires/proc/GenerateWires() diff --git a/code/game/machinery/doors/airlock_control.dm b/code/game/machinery/doors/airlock_control.dm index 805bb7dba9..ba8aa85b2c 100644 --- a/code/game/machinery/doors/airlock_control.dm +++ b/code/game/machinery/doors/airlock_control.dm @@ -145,7 +145,7 @@ obj/machinery/door/airlock/New() obj/machinery/door/airlock/Destroy() if(frequency && radio_controller) radio_controller.remove_object(src,frequency) - ..() + return ..() obj/machinery/airlock_sensor icon = 'icons/obj/airlock_machines.dmi' @@ -220,7 +220,7 @@ obj/machinery/airlock_sensor/New() obj/machinery/airlock_sensor/Destroy() if(radio_controller) radio_controller.remove_object(src,frequency) - ..() + return ..() obj/machinery/airlock_sensor/airlock_interior command = "cycle_interior" @@ -292,7 +292,7 @@ obj/machinery/access_button/New() obj/machinery/access_button/Destroy() if(radio_controller) radio_controller.remove_object(src, frequency) - ..() + return ..() obj/machinery/access_button/airlock_interior frequency = 1379 diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 158b718e83..e0156196d6 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -202,7 +202,7 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ /obj/machinery/hologram/holopad/Destroy() for (var/mob/living/silicon/ai/master in masters) clear_holo(master) - ..() + return ..() /* Holographic project of everything else. diff --git a/code/game/machinery/pipe/pipelayer.dm b/code/game/machinery/pipe/pipelayer.dm index 40726825a1..c960879e54 100644 --- a/code/game/machinery/pipe/pipelayer.dm +++ b/code/game/machinery/pipe/pipelayer.dm @@ -23,9 +23,8 @@ update_icon() /obj/machinery/pipelayer/Destroy() - qdel(W) - W = null - ..() + qdel_null(W) + . = ..() /obj/machinery/pipelayer/RefreshParts() var/mb_rating = 0 diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm index 8dfe627030..c963a902bb 100644 --- a/code/game/objects/buckling.dm +++ b/code/game/objects/buckling.dm @@ -21,11 +21,6 @@ if(can_buckle && istype(M)) user_buckle_mob(M, user) -//Cleanup -/obj/Del() - unbuckle_mob() - return ..() - /obj/Destroy() unbuckle_mob() return ..() diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 88f69d8011..7f1d83cc4a 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -1470,8 +1470,12 @@ var/global/list/obj/item/device/pda/PDAs = list() /obj/item/device/pda/Destroy() PDAs -= src if (src.id && prob(90)) //IDs are kept in 90% of the cases - src.id.loc = get_turf(src.loc) - ..() + src.id.forceMove(get_turf(src.loc)) + else + qdel_null(src.id) + qdel_null(src.cartridge) + qdel_null(src.pai) + return ..() /obj/item/device/pda/clown/Crossed(AM as mob|obj) //Clown PDA is slippery. if (istype(AM, /mob/living)) diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm index 2c4368736e..c53ba712db 100644 --- a/code/game/objects/items/devices/PDA/cart.dm +++ b/code/game/objects/items/devices/PDA/cart.dm @@ -78,6 +78,10 @@ var/list/civilian_cartridges = list( var/message2 var/list/stored_data = list() +/obj/item/weapon/cartridge/Destroy() + qdel_null(radio) + return ..() + /obj/item/weapon/cartridge/engineering name = "\improper Power-ON cartridge" icon_state = "cart-e" @@ -164,10 +168,6 @@ var/list/civilian_cartridges = list( radio = new /obj/item/radio/integrated/signal(src) ..() -/obj/item/weapon/cartridge/signal/Destroy() - qdel(radio) - ..() - /obj/item/weapon/cartridge/quartermaster name = "\improper Space Parts & Space Vendors cartridge" desc = "Perfect for the Quartermaster on the go!" diff --git a/code/game/objects/items/devices/communicator/communicator.dm b/code/game/objects/items/devices/communicator/communicator.dm index 018be58705..8630d6a602 100644 --- a/code/game/objects/items/devices/communicator/communicator.dm +++ b/code/game/objects/items/devices/communicator/communicator.dm @@ -803,7 +803,7 @@ var/global/list/obj/item/device/communicator/all_communicators = list() if(exonet) exonet.remove_address() exonet = null - ..() + return ..() // Proc: update_icon() // Parameters: None diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index 8e9a72d203..106d144834 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -96,7 +96,7 @@ /obj/item/device/radio/intercom/Destroy() processing_objects -= src - ..() + return ..() /obj/item/device/radio/intercom/attack_ai(mob/user as mob) src.add_fingerprint(user) diff --git a/code/game/objects/items/weapons/material/material_armor.dm b/code/game/objects/items/weapons/material/material_armor.dm index 1041fb5d1f..990ae37659 100644 --- a/code/game/objects/items/weapons/material/material_armor.dm +++ b/code/game/objects/items/weapons/material/material_armor.dm @@ -42,7 +42,7 @@ Protectiveness | Armor % /obj/item/clothing/Destroy() processing_objects -= src - ..() + return ..() /obj/item/clothing/get_material() return material diff --git a/code/game/objects/items/weapons/mop_deploy.dm b/code/game/objects/items/weapons/mop_deploy.dm index 8baab87528..30a6991a53 100644 --- a/code/game/objects/items/weapons/mop_deploy.dm +++ b/code/game/objects/items/weapons/mop_deploy.dm @@ -26,7 +26,7 @@ T.dirt = 0 for(var/obj/effect/O in src) if(istype(O,/obj/effect/rune) || istype(O,/obj/effect/decal/cleanable) || istype(O,/obj/effect/overlay)) - del(O) + qdel(O) /* //Reagent code changed at some point and the below doesn't work. To be fixed later. source.reagents.reaction(src, TOUCH, 10) //10 is the multiplier for the reaction effect. probably needed to wet the floor properly. source.reagents.remove_any(1) //reaction() doesn't use up the reagents @@ -47,16 +47,16 @@ return ..() -/obj/item/weapon/mop_deploy/Del() +/obj/item/weapon/mop_deploy/Destroy() processing_objects -= src - ..() + . = ..() /obj/item/weapon/mop_deploy/attack_self(mob/user as mob) user.drop_from_inventory(src) - spawn(1) if(src) del(src) + spawn(1) if(!QDELETED(src)) qdel(src) /obj/item/weapon/mop_deploy/dropped() - spawn(1) if(src) del(src) + spawn(1) if(!QDELETED(src)) qdel(src) /obj/item/weapon/mop_deploy/process() if(!creator || loc != creator || !creator.item_is_in_hands(src)) @@ -71,4 +71,4 @@ host.pinned -= src host.embedded -= src host.drop_from_inventory(src) - spawn(1) if(src) del(src) \ No newline at end of file + spawn(1) if(!QDELETED(src)) qdel(src) \ No newline at end of file diff --git a/code/game/objects/items/weapons/storage/internal.dm b/code/game/objects/items/weapons/storage/internal.dm index 8d1898fe4b..1f1a5f6963 100644 --- a/code/game/objects/items/weapons/storage/internal.dm +++ b/code/game/objects/items/weapons/storage/internal.dm @@ -12,7 +12,7 @@ /obj/item/weapon/storage/internal/Destroy() master_item = null - ..() + . = ..() /obj/item/weapon/storage/internal/attack_hand() return //make sure this is never picked up diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 3846a44d2b..db55e95b44 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -38,15 +38,15 @@ /obj/item/weapon/storage/Destroy() close_all() - qdel(boxes) - qdel(src.storage_start) - qdel(src.storage_continue) - qdel(src.storage_end) - qdel(src.stored_start) - qdel(src.stored_continue) - qdel(src.stored_end) - qdel(closer) - ..() + qdel_null(boxes) + qdel_null(src.storage_start) + qdel_null(src.storage_continue) + qdel_null(src.storage_end) + qdel_null(src.stored_start) + qdel_null(src.stored_continue) + qdel_null(src.stored_end) + qdel_null(closer) + . = ..() /obj/item/weapon/storage/MouseDrop(obj/over_object as obj) if(!canremove) diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index 57a5cf06a4..b8daa05d7f 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -44,8 +44,7 @@ var/list/global/tank_gauge_cache = list() return /obj/item/weapon/tank/Destroy() - if(air_contents) - qdel(air_contents) + qdel_null(air_contents) processing_objects.Remove(src) @@ -53,7 +52,7 @@ var/list/global/tank_gauge_cache = list() var/obj/item/device/transfer_valve/TTV = loc TTV.remove_tank(src) - ..() + return ..() /obj/item/weapon/tank/examine(mob/user) . = ..(user, 0) diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index eab315809f..b41743799b 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -49,9 +49,6 @@ if(climbable) verbs += /obj/structure/proc/climb_on -/obj/structure/Destroy() - ..() - /obj/structure/proc/climb_on() set name = "Climb structure" diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 809dd008a4..9175ddc28c 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -355,12 +355,9 @@ density = 0 update_nearby_tiles() var/turf/location = loc - loc = null + . = ..() for(var/obj/structure/window/W in orange(location, 1)) W.update_icon() - loc = location - ..() - /obj/structure/window/Move() var/ini_dir = dir diff --git a/code/modules/clothing/spacesuits/rig/modules/utility.dm b/code/modules/clothing/spacesuits/rig/modules/utility.dm index cec738479e..583f491d5e 100644 --- a/code/modules/clothing/spacesuits/rig/modules/utility.dm +++ b/code/modules/clothing/spacesuits/rig/modules/utility.dm @@ -477,7 +477,7 @@ for(var/obj/item/weapon/mop_deploy/blade in M.contents) M.drop_from_inventory(blade) - del(blade) + qdel(blade) //Space Cleaner Launcher @@ -520,7 +520,7 @@ user << "You slot \the [input_device] into the suit module." user.drop_from_inventory(input_device) - del(input_device) + qdel(input_device) accepted_item.charges++ return 1 diff --git a/code/modules/lighting/lighting_corner.dm b/code/modules/lighting/lighting_corner.dm index 63ce123253..088c53e521 100644 --- a/code/modules/lighting/lighting_corner.dm +++ b/code/modules/lighting/lighting_corner.dm @@ -131,3 +131,9 @@ /datum/lighting_corner/dummy/New() return + +/datum/lighting_corner/Destroy(var/force) + if (!force) + return QDEL_HINT_LETMELIVE + crash_with("Who decided to force qdel() a lighting corner? Why did you do this?") + return ..() diff --git a/code/modules/lighting/lighting_overlay.dm b/code/modules/lighting/lighting_overlay.dm index 6d912cd862..690eba9326 100644 --- a/code/modules/lighting/lighting_overlay.dm +++ b/code/modules/lighting/lighting_overlay.dm @@ -39,7 +39,7 @@ log_debug("A lighting overlay realised its loc was NOT a turf (actual loc: [loc][loc ? ", " + loc.type : "null"]) in update_overlay() and got qdel'ed!") else log_debug("A lighting overlay realised it was in nullspace in update_overlay() and got pooled!") - qdel(src) + qdel(src, force=TRUE) return // To the future coder who sees this and thinks @@ -121,14 +121,17 @@ /atom/movable/lighting_overlay/throw_at() return 0 -/atom/movable/lighting_overlay/Destroy() - total_lighting_overlays-- - global.lighting_update_overlays -= src - global.lighting_update_overlays_old -= src +/atom/movable/lighting_overlay/Destroy(var/force) + if (force) + total_lighting_overlays-- + global.lighting_update_overlays -= src + global.lighting_update_overlays_old -= src - var/turf/T = loc - if(istype(T)) - T.lighting_overlay = null - T.luminosity = 1 + var/turf/T = loc + if(istype(T)) + T.lighting_overlay = null + T.luminosity = 1 - . = ..() + return ..() + else + return QDEL_HINT_LETMELIVE diff --git a/code/modules/mob/freelook/ai/eye.dm b/code/modules/mob/freelook/ai/eye.dm index 62f0d93152..a1c28a4af3 100644 --- a/code/modules/mob/freelook/ai/eye.dm +++ b/code/modules/mob/freelook/ai/eye.dm @@ -59,7 +59,7 @@ /mob/living/silicon/ai/Destroy() destroy_eyeobj() - ..() + return ..() /atom/proc/move_camera_by_click() if(istype(usr, /mob/living/silicon/ai)) diff --git a/code/modules/mob/freelook/ai/update_triggers.dm b/code/modules/mob/freelook/ai/update_triggers.dm index f4fea0aa58..5c21c6784d 100644 --- a/code/modules/mob/freelook/ai/update_triggers.dm +++ b/code/modules/mob/freelook/ai/update_triggers.dm @@ -59,7 +59,7 @@ /obj/machinery/camera/Destroy() clear_all_networks() cameranet.cameras -= src - ..() + return ..() // Mobs /mob/living/silicon/ai/rejuvenate() diff --git a/code/modules/mob/freelook/eye.dm b/code/modules/mob/freelook/eye.dm index 0c38ad8033..ff8681d128 100644 --- a/code/modules/mob/freelook/eye.dm +++ b/code/modules/mob/freelook/eye.dm @@ -38,7 +38,11 @@ mob/observer/eye/Destroy() qdel(ghostimage) ghostimage = null updateallghostimages() - ..() + if(owner) + if(owner.eyeobj == src) + owner.eyeobj = null + owner = null + . = ..() /mob/observer/eye/Move(n, direct) if(owner == src) diff --git a/code/modules/mob/freelook/mask/update_triggers.dm b/code/modules/mob/freelook/mask/update_triggers.dm index 1142367164..1dd520e7f1 100644 --- a/code/modules/mob/freelook/mask/update_triggers.dm +++ b/code/modules/mob/freelook/mask/update_triggers.dm @@ -25,7 +25,7 @@ /mob/living/Destroy() cultnet.updateVisibility(src, 0) - ..() + return ..() /mob/living/rejuvenate() var/was_dead = stat == DEAD diff --git a/code/modules/mob/freelook/update_triggers.dm b/code/modules/mob/freelook/update_triggers.dm index 8408083ba8..482025426e 100644 --- a/code/modules/mob/freelook/update_triggers.dm +++ b/code/modules/mob/freelook/update_triggers.dm @@ -15,7 +15,7 @@ /turf/simulated/Destroy() updateVisibility(src) - ..() + return ..() /turf/simulated/New() ..() @@ -26,7 +26,7 @@ /obj/structure/Destroy() updateVisibility(src) - ..() + return ..() /obj/structure/New() ..() diff --git a/code/modules/mob/freelook/visualnet.dm b/code/modules/mob/freelook/visualnet.dm index 24ad252eda..0d53d1e48a 100644 --- a/code/modules/mob/freelook/visualnet.dm +++ b/code/modules/mob/freelook/visualnet.dm @@ -14,7 +14,7 @@ /datum/visualnet/Destroy() visual_nets -= src - ..() + return ..() // Checks if a chunk has been Generated in x, y, z. /datum/visualnet/proc/chunkGenerated(x, y, z) diff --git a/code/modules/mob/holder.dm b/code/modules/mob/holder.dm index 1998e7fe65..5d0796f77c 100644 --- a/code/modules/mob/holder.dm +++ b/code/modules/mob/holder.dm @@ -27,7 +27,7 @@ var/list/holder_mob_icon_cache = list() /obj/item/weapon/holder/Destroy() processing_objects.Remove(src) - ..() + return ..() /obj/item/weapon/holder/process() update_state() diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 8583521f85..a22011e8ab 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -215,20 +215,15 @@ var/list/ai_verbs_hidden = list( // For why this exists, refer to https://xkcd.c /mob/living/silicon/ai/Destroy() ai_list -= src - qdel(eyeobj) - eyeobj = null - - qdel(psupply) - psupply = null - - qdel(aiMulti) - aiMulti = null - - qdel(aiRadio) - aiRadio = null - - qdel(aiCamera) - aiCamera = null + qdel_null(announcement) + qdel_null(eyeobj) + qdel_null(psupply) + qdel_null(aiPDA) + qdel_null(aiCommunicator) + qdel_null(aiMulti) + qdel_null(aiRadio) + qdel_null(aiCamera) + hack = null return ..() diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 40b1852528..b74b7d6cf7 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -41,7 +41,7 @@ silicon_mob_list -= src for(var/datum/alarm_handler/AH in alarm_manager.all_handlers) AH.unregister_alarm(src) - ..() + return ..() /mob/living/silicon/proc/init_id() if(idcard) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 3ad6260813..0e121e1481 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -195,7 +195,7 @@ friends.Cut() //This one is not walk_list.Cut() languages.Cut() - ..() + return ..() //Client attached /mob/living/simple_animal/Login() diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index be114228de..890ff2e873 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -393,9 +393,6 @@ /obj/item/weapon/grab/proc/size_difference(mob/A, mob/B) return mob_size_difference(A.mob_size, B.mob_size) -/obj/item/weapon/grab - var/destroying = 0 - /obj/item/weapon/grab/Destroy() animate(affecting, pixel_x = 0, pixel_y = 0, 4, 1, LINEAR_EASING) affecting.layer = 4 @@ -408,5 +405,4 @@ assailant = null qdel(hud) hud = null - destroying = 1 // stops us calling qdel(src) on dropped() - ..() + return ..() diff --git a/code/modules/mob/modifiers.dm b/code/modules/mob/modifiers.dm index f67ffc374b..0b39c9e275 100644 --- a/code/modules/mob/modifiers.dm +++ b/code/modules/mob/modifiers.dm @@ -73,7 +73,7 @@ /mob/living/Destroy() remove_all_modifiers(TRUE) - ..() + return ..() // Called by Life(). /mob/living/proc/handle_modifiers() diff --git a/code/modules/power/breaker_box.dm b/code/modules/power/breaker_box.dm index e133f82e6e..2b10a9017d 100644 --- a/code/modules/power/breaker_box.dm +++ b/code/modules/power/breaker_box.dm @@ -20,7 +20,7 @@ var/update_locked = 0 /obj/machinery/power/breakerbox/Destroy() - ..() + . = ..() for(var/datum/nano_module/rcon/R in world) R.FindDevices() diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 2d53277590..ebfa533086 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -108,7 +108,7 @@ var/list/possible_cable_coil_colours = list( if(powernet) cut_cable_from_powernet() // update the powernets cable_list -= src //remove it from global cable list - ..() // then go ahead and delete the cable + return ..() // then go ahead and delete the cable // Ghost examining the cable -> tells him the power /obj/structure/cable/attack_ghost(mob/user) diff --git a/code/modules/power/grid_checker.dm b/code/modules/power/grid_checker.dm index 4d42d4ca3f..b8a123e02f 100644 --- a/code/modules/power/grid_checker.dm +++ b/code/modules/power/grid_checker.dm @@ -28,7 +28,7 @@ /obj/machinery/power/grid_checker/Destroy() qdel(wires) wires = null - ..() + return ..() /obj/machinery/power/grid_checker/update_icon() if(power_failing) diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 09921cf58b..850d7a84aa 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -248,7 +248,7 @@ if(A) on = 0 // A.update_lights() - ..() + return ..() /obj/machinery/light/update_icon() diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index 13213c2e7e..76320db479 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -19,7 +19,7 @@ disconnect_from_network() disconnect_terminal() - ..() + return ..() /////////////////////////////// // General procedures diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm index 47a9c08923..53e3dc29c9 100644 --- a/code/modules/power/singularity/collector.dm +++ b/code/modules/power/singularity/collector.dm @@ -23,7 +23,7 @@ var/global/list/rad_collectors = list() /obj/machinery/power/rad_collector/Destroy() rad_collectors -= src - ..() + return ..() /obj/machinery/power/rad_collector/process() //so that we don't zero out the meter if the SM is processed first. diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm index 12540c2d04..b6c45475cc 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm @@ -205,7 +205,7 @@ if(holder && holder.my_atom && ismob(holder.my_atom)) var/mob/M = holder.my_atom M.status_flags &= ~FAKEDEATH - ..() + return ..() /datum/reagent/toxin/fertilizer //Reagents used for plant fertilizers. name = "fertilizer" diff --git a/code/modules/tables/update_triggers.dm b/code/modules/tables/update_triggers.dm index a90e3eeb8a..b7c087f9c0 100644 --- a/code/modules/tables/update_triggers.dm +++ b/code/modules/tables/update_triggers.dm @@ -6,12 +6,10 @@ /obj/structure/window/Destroy() var/oldloc = loc - loc=null + . = ..() for(var/obj/structure/table/T in view(oldloc, 1)) T.update_connections() T.update_icon() - loc=oldloc - ..() /obj/structure/window/Move() var/oldloc = loc diff --git a/code/world.dm b/code/world.dm index 8d51f84b47..a11d875c51 100644 --- a/code/world.dm +++ b/code/world.dm @@ -26,7 +26,8 @@ var/global/datum/global_init/init = new () qdel(src) //we're done /datum/global_init/Destroy() - return 1 + global.init = null + return 2 // QDEL_HINT_IWILLGC /world mob = /mob/new_player diff --git a/maps/RandomZLevels/stationCollision.dm b/maps/RandomZLevels/stationCollision.dm index fa20f440ec..0ebf12f169 100644 --- a/maps/RandomZLevels/stationCollision.dm +++ b/maps/RandomZLevels/stationCollision.dm @@ -54,7 +54,7 @@ B.item_state = "melted" new /obj/item/weapon/paper/sc_safehint_paper_bible(B) new /obj/item/weapon/pen(B) - del(src) + qdel(src) /* * Guns - I'm making these specifically so that I dont spawn a pile of fully loaded weapons on the map. @@ -189,7 +189,7 @@ var/sc_safecode5 = "[rand(0,9)]" else if(istype(A,/obj/)) var/obj/O = A O.ex_act(1.0) - if(O) del(O) + if(O) qdel(O) else if(isturf(A)) var/turf/T = A if(T.intact) diff --git a/maps/RandomZLevels/wildwest.dm b/maps/RandomZLevels/wildwest.dm index b3ae83b9d7..51ac498fb2 100644 --- a/maps/RandomZLevels/wildwest.dm +++ b/maps/RandomZLevels/wildwest.dm @@ -133,7 +133,7 @@ s.start() explosion(mob, 1, 0, 0, 0) spawn(0) - del(src) + qdel(src) /obj/effect/meatgrinder name = "Meat Grinder" diff --git a/maps/~map_system/maps.dm b/maps/~map_system/maps.dm index 1a575b3578..65797ebafa 100644 --- a/maps/~map_system/maps.dm +++ b/maps/~map_system/maps.dm @@ -161,5 +161,10 @@ var/list/all_maps = list() if(transit_chance) map.accessible_z_levels["[z]"] = transit_chance -/datum/map_z_level/Destroy() - return TRUE // No. +/datum/map_z_level/Destroy(var/force) + crash_with("Attempt to delete a map_z_level instance [log_info_line(src)]") + if(!force) + return QDEL_HINT_LETMELIVE // No. + if (using_map.zlevels["[z]"] == src) + using_map.zlevels -= "[z]" + return ..() From ade7f6c1cd04c3deda193df8b86d5f974d3fc8ed Mon Sep 17 00:00:00 2001 From: Arokha Sieyes Date: Sun, 4 Jun 2017 18:00:16 -0400 Subject: [PATCH 58/82] Communicator QOL Tweak Call/Msg buttons on contacts list --- code/game/objects/items/devices/communicator/communicator.dm | 4 ++-- nano/templates/communicator.tmpl | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/code/game/objects/items/devices/communicator/communicator.dm b/code/game/objects/items/devices/communicator/communicator.dm index 018be58705..5df911cba8 100644 --- a/code/game/objects/items/devices/communicator/communicator.dm +++ b/code/game/objects/items/devices/communicator/communicator.dm @@ -261,7 +261,7 @@ var/global/list/obj/item/device/communicator/all_communicators = list() // Proc: ui_interact() // Parameters: 4 (standard NanoUI arguments) // Description: Uses a bunch of for loops to turn lists into lists of lists, so they can be displayed in nanoUI, then displays various buttons to the user. -/obj/item/device/communicator/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) +/obj/item/device/communicator/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/key_state = null) // this is the data which will be sent to the ui var/data[0] //General nanoUI information var/communicators[0] //List of communicators @@ -356,7 +356,7 @@ var/global/list/obj/item/device/communicator/all_communicators = list() if(!ui) // the ui does not exist, so we'll create a new() one // for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm - ui = new(user, src, ui_key, "communicator.tmpl", "Communicator", 475, 700) + ui = new(user, src, ui_key, "communicator.tmpl", "Communicator", 475, 700, state = key_state) // when the ui is first opened this is the data it will use ui.set_initial_data(data) // open the new ui window diff --git a/nano/templates/communicator.tmpl b/nano/templates/communicator.tmpl index 58b86a30d7..6157f45d61 100644 --- a/nano/templates/communicator.tmpl +++ b/nano/templates/communicator.tmpl @@ -152,7 +152,10 @@ Used In File(s): code\game\objects\items\devices\communicator\communicator.dm {{:value.name}}
    -
    {{:value.address}}
    {{:helper.link('Copy', 'pencil', {'copy' : value.address, 'switch_tab' : 2})}} +
    {{:value.address}}
    + {{:helper.link('Copy', 'pencil', {'copy' : value.address, 'switch_tab' : 2})}} + {{:helper.link('Call', 'phone', {'dial' : value.address, 'copy' : value.address, 'switch_tab' : 2})}} + {{:helper.link('Msg', 'mail-closed', {'copy' : value.address, 'copy_name' : value.name, 'switch_tab' : 40})}}
    {{/for}} From c829a195e1c24b9e0d15c5d3d0c03ceb6667d4f2 Mon Sep 17 00:00:00 2001 From: Arokha Sieyes Date: Sat, 3 Jun 2017 00:36:03 -0400 Subject: [PATCH 59/82] Polaris-able surgery fix --- code/modules/surgery/implant.dm | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/code/modules/surgery/implant.dm b/code/modules/surgery/implant.dm index 3e49482c75..48aca377ee 100644 --- a/code/modules/surgery/implant.dm +++ b/code/modules/surgery/implant.dm @@ -13,22 +13,22 @@ return affected && affected.open == (affected.encased ? 3 : 2) && !(affected.status & ORGAN_BLEEDING) proc/get_max_wclass(var/obj/item/organ/external/affected) - switch (affected.name) - if ("head") - return 1 - if ("upper body") - return 3 - if ("lower body") - return 2 + switch (affected.organ_tag) + if (BP_HEAD) + return ITEMSIZE_TINY + if (BP_TORSO) + return ITEMSIZE_NORMAL + if (BP_GROIN) + return ITEMSIZE_SMALL return 0 proc/get_cavity(var/obj/item/organ/external/affected) - switch (affected.name) - if ("head") + switch (affected.organ_tag) + if (BP_HEAD) return "cranial" - if ("upper body") + if (BP_TORSO) return "thoracic" - if ("lower body") + if (BP_GROIN) return "abdominal" return "" From d6b68dabdb5cec31ebc4de1d8a60f63956d6d904 Mon Sep 17 00:00:00 2001 From: Leshana Date: Wed, 7 Jun 2017 19:45:01 -0400 Subject: [PATCH 60/82] Standardize MC subsystem initialization boilerplate * Based on https://github.com/tgstation/tgstation/pull/25386 * Create macro for defining new subsystem types. * Create PreInit proc to handle setup that needs to be done before the map loads * Rename garbage_controller subsystem to garbage so it matches its global SSgarbage variable name. --- code/__defines/MC.dm | 8 ++++++++ code/controllers/subsystem.dm | 9 ++++++++- code/controllers/subsystems/garbage.dm | 26 ++++++++++++-------------- 3 files changed, 28 insertions(+), 15 deletions(-) diff --git a/code/__defines/MC.dm b/code/__defines/MC.dm index 90724a2f98..08b8d223ec 100644 --- a/code/__defines/MC.dm +++ b/code/__defines/MC.dm @@ -51,3 +51,11 @@ #define SS_PAUSED 3 //paused by mc_tick_check #define SS_SLEEPING 4 //fire() slept. #define SS_PAUSING 5 //in the middle of pausing + +// Standard way to define a global subsystem, keep boilerplate organized here! +#define SUBSYSTEM_DEF(X) var/datum/controller/subsystem/##X/SS##X;\ +/datum/controller/subsystem/##X/New(){\ + NEW_SS_GLOBAL(SS##X);\ + PreInit();\ +}\ +/datum/controller/subsystem/##X diff --git a/code/controllers/subsystem.dm b/code/controllers/subsystem.dm index ce9558ca4f..ff81fdc23e 100644 --- a/code/controllers/subsystem.dm +++ b/code/controllers/subsystem.dm @@ -27,8 +27,15 @@ var/datum/controller/subsystem/queue_next var/datum/controller/subsystem/queue_prev -// Used to initialize the subsystem BEFORE the map has loaded +//Do not override /datum/controller/subsystem/New() + return + +// Used to initialize the subsystem BEFORE the map has loaded +// Called AFTER Recover if that is called +// Prefer to use Initialize if possible +/datum/controller/subsystem/proc/PreInit() + return //This is used so the mc knows when the subsystem sleeps. do not override. /datum/controller/subsystem/proc/ignite(resumed = 0) diff --git a/code/controllers/subsystems/garbage.dm b/code/controllers/subsystems/garbage.dm index e849b64be6..117786c40c 100644 --- a/code/controllers/subsystems/garbage.dm +++ b/code/controllers/subsystems/garbage.dm @@ -1,6 +1,7 @@ -var/datum/controller/subsystem/garbage_collector/SSgarbage - -/datum/controller/subsystem/garbage_collector +// +// Garbage Collector Subsystem - Implements qdel() and the GC queue +// +SUBSYSTEM_DEF(garbage) name = "Garbage" priority = 15 wait = 5 @@ -34,10 +35,7 @@ var/datum/controller/subsystem/garbage_collector/SSgarbage var/list/qdel_list = list() // list of all types that have been qdel()eted #endif -/datum/controller/subsystem/garbage_collector/New() - NEW_SS_GLOBAL(SSgarbage) - -/datum/controller/subsystem/garbage_collector/stat_entry(msg) +/datum/controller/subsystem/garbage/stat_entry(msg) msg += "Q:[queue.len]|D:[delslasttick]|G:[gcedlasttick]|" msg += "GR:" if (!(delslasttick+gcedlasttick)) @@ -52,14 +50,14 @@ var/datum/controller/subsystem/garbage_collector/SSgarbage msg += "TGR:[round((totalgcs/(totaldels+totalgcs))*100, 0.01)]%" ..(msg) -/datum/controller/subsystem/garbage_collector/fire() +/datum/controller/subsystem/garbage/fire() HandleToBeQueued() if(state == SS_RUNNING) HandleQueue() //If you see this proc high on the profile, what you are really seeing is the garbage collection/soft delete overhead in byond. //Don't attempt to optimize, not worth the effort. -/datum/controller/subsystem/garbage_collector/proc/HandleToBeQueued() +/datum/controller/subsystem/garbage/proc/HandleToBeQueued() var/list/tobequeued = src.tobequeued var/starttime = world.time var/starttimeofday = world.timeofday @@ -70,7 +68,7 @@ var/datum/controller/subsystem/garbage_collector/SSgarbage Queue(ref) tobequeued.Cut(1, 2) -/datum/controller/subsystem/garbage_collector/proc/HandleQueue() +/datum/controller/subsystem/garbage/proc/HandleQueue() delslasttick = 0 gcedlasttick = 0 var/time_to_kill = world.time - collection_timeout // Anything qdel() but not GC'd BEFORE this time needs to be manually del() @@ -124,12 +122,12 @@ var/datum/controller/subsystem/garbage_collector/SSgarbage ++gcedlasttick ++totalgcs -/datum/controller/subsystem/garbage_collector/proc/QueueForQueuing(datum/A) +/datum/controller/subsystem/garbage/proc/QueueForQueuing(datum/A) if (istype(A) && A.gc_destroyed == GC_CURRENTLY_BEING_QDELETED) tobequeued += A A.gc_destroyed = GC_QUEUED_FOR_QUEUING -/datum/controller/subsystem/garbage_collector/proc/Queue(datum/A) +/datum/controller/subsystem/garbage/proc/Queue(datum/A) if (!istype(A) || (!isnull(A.gc_destroyed) && A.gc_destroyed >= 0)) return if (A.gc_destroyed == GC_QUEUED_FOR_HARD_DEL) @@ -145,12 +143,12 @@ var/datum/controller/subsystem/garbage_collector/SSgarbage queue[refid] = gctime -/datum/controller/subsystem/garbage_collector/proc/HardQueue(datum/A) +/datum/controller/subsystem/garbage/proc/HardQueue(datum/A) if (istype(A) && A.gc_destroyed == GC_CURRENTLY_BEING_QDELETED) tobequeued += A A.gc_destroyed = GC_QUEUED_FOR_HARD_DEL -/datum/controller/subsystem/garbage_collector/Recover() +/datum/controller/subsystem/garbage/Recover() if (istype(SSgarbage.queue)) queue |= SSgarbage.queue if (istype(SSgarbage.tobequeued)) From 60ffe4b00f13fc618bc44c73b82c921482d1d25e Mon Sep 17 00:00:00 2001 From: Leshana Date: Wed, 7 Jun 2017 23:27:27 -0400 Subject: [PATCH 61/82] Ports garbage collector improvements and bugfixes from tg * Writes a log of qdel() problems in a condensed format at the end of each round - tgstation/tgstation/pull/26135 * Moves hard dels into their own proc so that it can be profiled more easily, and uses it for the various types. Includes bugfixes too * https://github.com/tgstation/tgstation/pull/26210 * https://github.com/tgstation/tgstation/pull/26570 * Fix a bug with qdeling non-datums - https://github.com/tgstation/tgstation/pull/27434 * Fix typo - https://github.com/tgstation/tgstation/pull/27730 --- code/controllers/subsystems/garbage.dm | 75 +++++++++++++++++--------- 1 file changed, 50 insertions(+), 25 deletions(-) diff --git a/code/controllers/subsystems/garbage.dm b/code/controllers/subsystems/garbage.dm index 117786c40c..b07337e803 100644 --- a/code/controllers/subsystems/garbage.dm +++ b/code/controllers/subsystems/garbage.dm @@ -50,10 +50,28 @@ SUBSYSTEM_DEF(garbage) msg += "TGR:[round((totalgcs/(totaldels+totalgcs))*100, 0.01)]%" ..(msg) +/datum/controller/subsystem/garbage/Shutdown() + //Adds the del() log to world.log in a format condensable by the runtime condenser found in tools + if(didntgc.len || sleptDestroy.len) + var/list/dellog = list() + for(var/path in didntgc) + dellog += "Path : [path] \n" + dellog += "Failures : [didntgc[path]] \n" + if(path in sleptDestroy) + dellog += "Sleeps : [sleptDestroy[path]] \n" + sleptDestroy -= path + for(var/path in sleptDestroy) + dellog += "Path : [path] \n" + dellog += "Sleeps : [sleptDestroy[path]] \n" + log_misc(dellog.Join()) + /datum/controller/subsystem/garbage/fire() HandleToBeQueued() if(state == SS_RUNNING) HandleQueue() + + if (state == SS_PAUSED) //make us wait again before the next run. + state = SS_RUNNING //If you see this proc high on the profile, what you are really seeing is the garbage collection/soft delete overhead in byond. //Don't attempt to optimize, not worth the effort. @@ -98,24 +116,9 @@ SUBSYSTEM_DEF(garbage) var/type = A.type testing("GC: -- \ref[A] | [type] was unable to be GC'd and was deleted --") didntgc["[type]"]++ - var/time = world.timeofday - var/tick = world.tick_usage - var/ticktime = world.time - del(A) - tick = (world.tick_usage-tick+((world.time-ticktime)/world.tick_lag*100)) + + HardDelete(A) - if (tick > highest_del_tickusage) - highest_del_tickusage = tick - time = world.timeofday - time - if (!time && TICK_DELTA_TO_MS(tick) > 1) - time = TICK_DELTA_TO_MS(tick)/100 - if (time > highest_del_time) - highest_del_time = time - if (time > 10) - log_game("Error: [type]([refID]) took longer then 1 second to delete (took [time/10] seconds to delete)") - message_admins("Error: [type]([refID]) took longer then 1 second to delete (took [time/10] seconds to delete).") - postpone(time/5) - break ++delslasttick ++totaldels else @@ -128,10 +131,10 @@ SUBSYSTEM_DEF(garbage) A.gc_destroyed = GC_QUEUED_FOR_QUEUING /datum/controller/subsystem/garbage/proc/Queue(datum/A) - if (!istype(A) || (!isnull(A.gc_destroyed) && A.gc_destroyed >= 0)) + if (isnull(A) || (!isnull(A.gc_destroyed) && A.gc_destroyed >= 0)) return if (A.gc_destroyed == GC_QUEUED_FOR_HARD_DEL) - del(A) + HardDelete(A) return var/gctime = world.time var/refid = "\ref[A]" @@ -143,6 +146,30 @@ SUBSYSTEM_DEF(garbage) queue[refid] = gctime +//this is purely to seperate things profile wise. +/datum/controller/subsystem/garbage/proc/HardDelete(datum/A) + var/time = world.timeofday + var/tick = world.tick_usage + var/ticktime = world.time + + var/type = A.type + var/refID = "\ref[A]" + + del(A) + + tick = (world.tick_usage-tick+((world.time-ticktime)/world.tick_lag*100)) + if (tick > highest_del_tickusage) + highest_del_tickusage = tick + time = world.timeofday - time + if (!time && TICK_DELTA_TO_MS(tick) > 1) + time = TICK_DELTA_TO_MS(tick)/100 + if (time > highest_del_time) + highest_del_time = time + if (time > 10) + log_game("Error: [type]([refID]) took longer than 1 second to delete (took [time/10] seconds to delete)") + message_admins("Error: [type]([refID]) took longer than 1 second to delete (took [time/10] seconds to delete).") + postpone(time/5) + /datum/controller/subsystem/garbage/proc/HardQueue(datum/A) if (istype(A) && A.gc_destroyed == GC_CURRENTLY_BEING_QDELETED) tobequeued += A @@ -157,15 +184,13 @@ SUBSYSTEM_DEF(garbage) // Should be treated as a replacement for the 'del' keyword. // Datums passed to this will be given a chance to clean up references to allow the GC to collect them. /proc/qdel(datum/D, force=FALSE) - if(!D) + if(!istype(D)) + del(D) return #ifdef TESTING SSgarbage.qdel_list += D.type #endif - if(!istype(D)) - log_debug("qdel() was passed [log_info_line(D)]. qdel() can only handle instances of (sub)type /datum.") - del(D) - else if(isnull(D.gc_destroyed)) + if(isnull(D.gc_destroyed)) D.gc_destroyed = GC_CURRENTLY_BEING_QDELETED var/start_time = world.time var/hint = D.Destroy(force) // Let our friend know they're about to get fucked up. @@ -196,7 +221,7 @@ SUBSYSTEM_DEF(garbage) if (QDEL_HINT_HARDDEL) //qdel should assume this object won't gc, and queue a hard delete using a hard reference to save time from the locate() SSgarbage.HardQueue(D) if (QDEL_HINT_HARDDEL_NOW) //qdel should assume this object won't gc, and hard del it post haste. - del(D) + SSgarbage.HardDelete(D) if (QDEL_HINT_FINDREFERENCE)//qdel will, if TESTING is enabled, display all references to this object, then queue the object for deletion. SSgarbage.QueueForQueuing(D) #ifdef TESTING From 4e8d1c3cba2e2e88d7215f3f804dba304619a3db Mon Sep 17 00:00:00 2001 From: Belsima Date: Thu, 8 Jun 2017 09:23:25 -0400 Subject: [PATCH 62/82] Replaces lantern sprites. --- icons/obj/lighting.dmi | Bin 41526 -> 42859 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/lighting.dmi b/icons/obj/lighting.dmi index 736308440d23204a1f3eed1699680a47946d600f..cb4d4042c60c088428b2df0559a075e38f2a7689 100644 GIT binary patch delta 25689 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 delta 24345 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 Q-8po| Date: Thu, 8 Jun 2017 16:10:00 +0100 Subject: [PATCH 63/82] Makes the CEs hardsuit and Engineering hardsuit temperature resistant --- code/modules/clothing/spacesuits/rig/suits/station.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/clothing/spacesuits/rig/suits/station.dm b/code/modules/clothing/spacesuits/rig/suits/station.dm index 11dfbfb961..13eebc2e7d 100644 --- a/code/modules/clothing/spacesuits/rig/suits/station.dm +++ b/code/modules/clothing/spacesuits/rig/suits/station.dm @@ -100,6 +100,7 @@ req_access = list() req_one_access = list() + max_heat_protection_temperature = FIRE_HELMET_MAX_HEAT_PROTECTION_TEMPERATURE /obj/item/clothing/gloves/gauntlets/rig/eva name = "insulated gauntlets" @@ -135,6 +136,7 @@ req_access = list() req_one_access = list() + max_heat_protection_temperature = FIRE_HELMET_MAX_HEAT_PROTECTION_TEMPERATURE /obj/item/clothing/gloves/gauntlets/rig/ce name = "insulated gauntlets" From 96a9527d0bcf6aa1980e2bd0ebf75423a98ec662 Mon Sep 17 00:00:00 2001 From: Leshana Date: Thu, 8 Jun 2017 17:13:54 -0400 Subject: [PATCH 64/82] Adds macros to assist with lazily instantiating lists. * For various reasons its best to not instantiate lists until they are actually going to be used, especially if there is a good chance that a given list variable might *never* be used during the lifetime of an object. * These macros make it simple and concise to add remove and access entries in lazily created lists. --- code/_macros.dm | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/code/_macros.dm b/code/_macros.dm index befbc99a54..a3e4065544 100644 --- a/code/_macros.dm +++ b/code/_macros.dm @@ -62,3 +62,25 @@ #define qdel_null(x) if(x) { qdel(x) ; x = null } #define ARGS_DEBUG log_debug("[__FILE__] - [__LINE__]") ; for(var/arg in args) { log_debug("\t[log_info_line(arg)]") } + +// Helper macros to aid in optimizing lazy instantiation of lists. +// All of these are null-safe, you can use them without knowing if the list var is initialized yet + +//Picks from the list, with some safeties, and returns the "default" arg if it fails +#define DEFAULTPICK(L, default) ((istype(L, /list) && L:len) ? pick(L) : default) +// Ensures L is initailized after this point +#define LAZYINITLIST(L) if (!L) L = list() +// Sets a L back to null iff it is empty +#define UNSETEMPTY(L) if (L && !L.len) L = null +// Removes I from list L, and sets I to null if it is now empty +#define LAZYREMOVE(L, I) if(L) { L -= I; if(!L.len) { L = null; } } +// Adds I to L, initalizing I if necessary +#define LAZYADD(L, I) if(!L) { L = list(); } L += I; +// Reads I from L safely - Works with both associative and traditional lists. +#define LAZYACCESS(L, I) (L ? (isnum(I) ? (I > 0 && I <= L.len ? L[I] : null) : L[I]) : null) +// Reads the length of L, returning 0 if null +#define LAZYLEN(L) length(L) +// Null-safe L.Cut() +#define LAZYCLEARLIST(L) if(L) L.Cut() +// Reads L or an empty list if L is not a list. Note: Does NOT assign, L may be an expression. +#define SANITIZE_LIST(L) ( islist(L) ? L : list() ) From 3e84cbbbfd6bc27bb8ac37fa3ff9fcecc0f90295 Mon Sep 17 00:00:00 2001 From: Leshana Date: Thu, 8 Jun 2017 16:54:42 -0400 Subject: [PATCH 65/82] Converts area.all_doors list to be lazily instantiated as a simple example of using the lazy list macros. --- code/game/area/Space Station 13 areas.dm | 2 +- code/game/area/areas.dm | 4 ++++ code/game/machinery/doors/firedoor.dm | 6 +++--- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index b98b2370ce..610e5577f6 100755 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -48,7 +48,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station var/obj/machinery/power/apc/apc = null var/no_air = null // var/list/lights // list of all lights on this area - var/list/all_doors = list() //Added by Strumpetplaya - Alarm Change - Contains a list of doors adjacent to this area + var/list/all_doors = null //Added by Strumpetplaya - Alarm Change - Contains a list of doors adjacent to this area var/firedoors_closed = 0 var/list/ambience = list('sound/ambience/ambigen1.ogg','sound/ambience/ambigen3.ogg','sound/ambience/ambigen4.ogg','sound/ambience/ambigen5.ogg','sound/ambience/ambigen6.ogg','sound/ambience/ambigen7.ogg','sound/ambience/ambigen8.ogg','sound/ambience/ambigen9.ogg','sound/ambience/ambigen10.ogg','sound/ambience/ambigen11.ogg','sound/ambience/ambigen12.ogg','sound/ambience/ambigen14.ogg') var/list/forced_ambience = null diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 4a77ec2c84..6ce2de18d3 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -75,6 +75,8 @@ /area/proc/firedoors_close() if(!firedoors_closed) firedoors_closed = TRUE + if(!all_doors) + return for(var/obj/machinery/door/firedoor/E in all_doors) if(!E.blocked) if(E.operating) @@ -87,6 +89,8 @@ /area/proc/firedoors_open() if(firedoors_closed) firedoors_closed = FALSE + if(!all_doors) + return for(var/obj/machinery/door/firedoor/E in all_doors) if(!E.blocked) if(E.operating) diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 1162264dd7..6ccbb46ac1 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -60,18 +60,18 @@ var/area/A = get_area(src) ASSERT(istype(A)) - A.all_doors.Add(src) + LAZYADD(A.all_doors, src) areas_added = list(A) for(var/direction in cardinal) A = get_area(get_step(src,direction)) if(istype(A) && !(A in areas_added)) - A.all_doors.Add(src) + LAZYADD(A.all_doors, src) areas_added += A /obj/machinery/door/firedoor/Destroy() for(var/area/A in areas_added) - A.all_doors.Remove(src) + LAZYREMOVE(A.all_doors, src) . = ..() /obj/machinery/door/firedoor/get_material() From 7de82a599d1690b8afb73bc8aaab0d3da85a14a9 Mon Sep 17 00:00:00 2001 From: Arokha Sieyes Date: Thu, 8 Jun 2017 23:57:05 -0400 Subject: [PATCH 66/82] Greases up get_blahblah_fast Untypes lists, obj is more likely so it goes first, uses get_turf now that get_turf uses the get_step witchcraft method. --- code/_helpers/game.dm | 30 ++++++++++++++++-------------- code/modules/mob/emote.dm | 7 +++++-- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/code/_helpers/game.dm b/code/_helpers/game.dm index b59857c8f6..d7ee78ff8f 100644 --- a/code/_helpers/game.dm +++ b/code/_helpers/game.dm @@ -271,20 +271,22 @@ var/list/hear = dview(range,T,INVISIBILITY_MAXIMUM) var/list/hearturfs = list() - for(var/atom/movable/AM in hear) - if(ismob(AM)) - mobs += AM - hearturfs += AM.locs[1] - else if(isobj(AM)) - objs += AM - hearturfs += AM.locs[1] + for(var/thing in hear) + if(istype(thing,/obj)) + objs += thing + hearturfs += get_turf(thing) + else if(istype(thing,/mob)) + mobs += thing + hearturfs += get_turf(thing) //A list of every mob with a client - for(var/mob/M in player_list) - if(M.loc && M.locs[1] in hearturfs) - mobs |= M + for(var/mob in player_list) + if(get_turf(mob) in hearturfs) + mobs |= mob + continue - else if(M.stat == DEAD && !M.forbid_seeing_deadchat) + var/mob/M = mob + if(M.stat == DEAD && !M.forbid_seeing_deadchat) switch(type) if(1) //Audio messages use ghost_ears if(M.is_preference_enabled(/datum/client_preference/ghost_ears)) @@ -294,9 +296,9 @@ mobs |= M //For objects below the top level who still want to hear - for(var/obj/O in listening_objects) - if(O.loc && O.locs[1] in hearturfs) - objs |= O + for(var/obj in listening_objects) + if(get_turf(obj) in hearturfs) + objs |= obj return list("mobs" = mobs, "objs" = objs) diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm index b2748e6f06..4de1dcf595 100644 --- a/code/modules/mob/emote.dm +++ b/code/modules/mob/emote.dm @@ -34,11 +34,14 @@ var/list/m_viewers = in_range["mobs"] var/list/o_viewers = in_range["objs"] - for(var/mob/M in m_viewers) + for(var/mob in m_viewers) + var/mob/M = mob spawn(0) // It's possible that it could be deleted in the meantime, or that it runtimes. if(M) M.show_message(message, m_type) - for(var/obj/O in o_viewers) + + for(var/obj in o_viewers) + var/obj/O = obj spawn(0) if(O) O.see_emote(src, message, m_type) From 6d58df9f605911efd41304bd625dd4e4ba613dd8 Mon Sep 17 00:00:00 2001 From: Arokha Sieyes Date: Fri, 9 Jun 2017 02:10:09 -0400 Subject: [PATCH 67/82] Surgery and syringe fixes Fixes a line printed about staying close to your patient printed in error, and makes syringes work on laying patients again. The do_surgery overrides are from a bygone era. Tested == yes --- code/modules/mob/living/silicon/robot/analyzer.dm | 8 -------- code/modules/reagents/reagent_containers/hypospray.dm | 6 ------ code/modules/reagents/reagent_containers/pill.dm | 7 ------- code/modules/reagents/reagent_containers/syringes.dm | 7 ------- code/modules/surgery/surgery.dm | 1 - 5 files changed, 29 deletions(-) diff --git a/code/modules/mob/living/silicon/robot/analyzer.dm b/code/modules/mob/living/silicon/robot/analyzer.dm index 671f61e29c..3e1564b0cf 100644 --- a/code/modules/mob/living/silicon/robot/analyzer.dm +++ b/code/modules/mob/living/silicon/robot/analyzer.dm @@ -16,14 +16,6 @@ matter = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 200) var/mode = 1; - -/obj/item/device/robotanalyzer/do_surgery(mob/living/M, mob/living/user) - if(user.a_intent != I_HELP) //in case it is ever used as a surgery tool - return ..() - do_scan(M, user) //default surgery behaviour is just to scan as usual - return 1 - - /obj/item/device/robotanalyzer/attack(mob/living/M as mob, mob/living/user as mob) do_scan(M, user) diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 427d08d141..1c3151fee9 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -28,12 +28,6 @@ update_icon() return -/obj/item/weapon/reagent_containers/hypospray/do_surgery(mob/living/carbon/M, mob/living/user) - if(user.a_intent != I_HELP) //in case it is ever used as a surgery tool - return ..() - attack(M, user) - return 1 - /obj/item/weapon/reagent_containers/hypospray/attack(mob/living/M as mob, mob/user as mob) if(!reagents.total_volume) user << "[src] is empty." diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index 464e066264..e21baa48e2 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -19,13 +19,6 @@ if(!icon_state) icon_state = "pill[rand(1, 20)]" - -/obj/item/weapon/reagent_containers/pill/do_surgery(mob/M, mob/user) - if(user.a_intent != I_HELP) //in case it is ever used as a surgery tool - return ..() - attack(M, user) //default surgery behaviour is just to scan as usual - return 1 - /obj/item/weapon/reagent_containers/pill/attack(mob/M as mob, mob/user as mob) if(M == user) if(istype(M, /mob/living/carbon/human)) diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 058e09c6f7..dfe5dd0349 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -53,13 +53,6 @@ /obj/item/weapon/reagent_containers/syringe/attackby(obj/item/I as obj, mob/user as mob) return -/obj/item/weapon/reagent_containers/syringe/do_surgery(mob/living/carbon/M, mob/living/user) - if(user.a_intent == I_HURT) - return 0 - if(user.a_intent != I_HELP) //in case it is ever used as a surgery tool - return ..() - return 1 - /obj/item/weapon/reagent_containers/syringe/afterattack(obj/target, mob/user, proximity) if(!proximity || !target.reagents) return diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm index b9fe362031..19007addae 100644 --- a/code/modules/surgery/surgery.dm +++ b/code/modules/surgery/surgery.dm @@ -129,7 +129,6 @@ if(success) if(!do_mob(user, M, rand(S.min_duration, S.max_duration))) success = FALSE - else to_chat(user, "You must remain close to your patient to conduct surgery.") if(success) From 446f7b0a12c643589d34f3c181c54e2987edc82d Mon Sep 17 00:00:00 2001 From: Leshana Date: Fri, 9 Jun 2017 19:35:35 -0400 Subject: [PATCH 68/82] Eliminate init() proc from /datum/gas_mixture * Initializing a list in the type definition (of any type) incurs a hidden proc call ("init"). Simply by moving the init of the lists to /New() we speed up creation of /datum/gas_mixtures (which happens *often*) * The list variables still get initialized by the time the instance is created, so this has zero impact on other code, its just starightup faster with no downsides. --- code/modules/xgm/xgm_gas_mixture.dm | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/code/modules/xgm/xgm_gas_mixture.dm b/code/modules/xgm/xgm_gas_mixture.dm index cb600f254f..ca2ed06c5f 100644 --- a/code/modules/xgm/xgm_gas_mixture.dm +++ b/code/modules/xgm/xgm_gas_mixture.dm @@ -1,7 +1,7 @@ /datum/gas_mixture //Associative list of gas moles. //Gases with 0 moles are not tracked and are pruned by update_values() - var/list/gas = list() + var/list/gas //Temperature in Kelvin of this gas mix. var/temperature = 0 @@ -13,10 +13,12 @@ var/group_multiplier = 1 //List of active tile overlays for this gas_mixture. Updated by check_tile_graphic() - var/list/graphic = list() + var/list/graphic /datum/gas_mixture/New(vol = CELL_VOLUME) volume = vol + gas = list() + graphic = list() //Takes a gas string and the amount of moles to adjust by. Calls update_values() if update isn't 0. /datum/gas_mixture/proc/adjust_gas(gasid, moles, update = 1) From 1b8451bc9adc7e02e273a253ab77beb4c14b55af Mon Sep 17 00:00:00 2001 From: Leshana Date: Sat, 10 Jun 2017 10:13:55 -0400 Subject: [PATCH 69/82] Converts /datum/gas_mixture/var/graphic to a lazy list. * The vast majority of gas mixtures never use their `graphic` list. Prime candidate for making a lazy init list. * While we are here, add nullchecks to ZAS's use of the graphic list a bit. /turf/update_graphics was technically already null safe, but its even better to not bother calling it at all right? --- code/ZAS/Turf.dm | 4 ++-- code/ZAS/Zone.dm | 14 ++++++++++---- code/modules/xgm/xgm_gas_mixture.dm | 20 ++++++++------------ 3 files changed, 20 insertions(+), 18 deletions(-) diff --git a/code/ZAS/Turf.dm b/code/ZAS/Turf.dm index bb5eb5050e..a309cd3a08 100644 --- a/code/ZAS/Turf.dm +++ b/code/ZAS/Turf.dm @@ -5,9 +5,9 @@ /turf/var/datum/gas_mixture/air /turf/simulated/proc/update_graphic(list/graphic_add = null, list/graphic_remove = null) - if(graphic_add && graphic_add.len) + if(LAZYLEN(graphic_add)) overlays += graphic_add - if(graphic_remove && graphic_remove.len) + if(LAZYLEN(graphic_remove)) overlays -= graphic_remove /turf/proc/update_air_properties() diff --git a/code/ZAS/Zone.dm b/code/ZAS/Zone.dm index da39b868d3..18c5ab2899 100644 --- a/code/ZAS/Zone.dm +++ b/code/ZAS/Zone.dm @@ -77,7 +77,8 @@ Class Procs: fire_tiles.Add(T) air_master.active_fire_zones |= src if(fuel) fuel_objs += fuel - T.update_graphic(air.graphic) + if(air.graphic) + T.update_graphic(air.graphic) /zone/proc/remove(turf/simulated/T) #ifdef ZASDBG @@ -92,7 +93,8 @@ Class Procs: var/obj/effect/decal/cleanable/liquid_fuel/fuel = locate() in T fuel_objs -= fuel T.zone = null - T.update_graphic(graphic_remove = air.graphic) + if(air.graphic) + T.update_graphic(graphic_remove = air.graphic) if(contents.len) air.group_multiplier = contents.len else @@ -106,9 +108,11 @@ Class Procs: ASSERT(!into.invalid) #endif c_invalidate() + var/list/air_graphic = air.graphic // Cache for sanic speed for(var/turf/simulated/T in contents) into.add(T) - T.update_graphic(graphic_remove = air.graphic) + if(air_graphic) + T.update_graphic(graphic_remove = air_graphic) #ifdef ZASDBG T.dbg(merged) #endif @@ -131,8 +135,10 @@ Class Procs: /zone/proc/rebuild() if(invalid) return //Short circuit for explosions where rebuild is called many times over. c_invalidate() + var/list/air_graphic = air.graphic // Cache for sanic speed for(var/turf/simulated/T in contents) - T.update_graphic(graphic_remove = air.graphic) //we need to remove the overlays so they're not doubled when the zone is rebuilt + if(air_graphic) + T.update_graphic(graphic_remove = air_graphic) //we need to remove the overlays so they're not doubled when the zone is rebuilt //T.dbg(invalid_zone) T.needs_air_update = 0 //Reset the marker so that it will be added to the list. air_master.mark_for_update(T) diff --git a/code/modules/xgm/xgm_gas_mixture.dm b/code/modules/xgm/xgm_gas_mixture.dm index ca2ed06c5f..7fe1a96d0d 100644 --- a/code/modules/xgm/xgm_gas_mixture.dm +++ b/code/modules/xgm/xgm_gas_mixture.dm @@ -18,7 +18,6 @@ /datum/gas_mixture/New(vol = CELL_VOLUME) volume = vol gas = list() - graphic = list() //Takes a gas string and the amount of moles to adjust by. Calls update_values() if update isn't 0. /datum/gas_mixture/proc/adjust_gas(gasid, moles, update = 1) @@ -331,27 +330,24 @@ //Rechecks the gas_mixture and adjusts the graphic list if needed. //Two lists can be passed by reference if you need know specifically which graphics were added and removed. /datum/gas_mixture/proc/check_tile_graphic(list/graphic_add = null, list/graphic_remove = null) + var/list/cur_graphic = graphic // Cache for sanic speed for(var/g in gas_data.overlay_limit) - if(graphic.Find(gas_data.tile_overlay[g])) + if(cur_graphic && cur_graphic.Find(gas_data.tile_overlay[g])) //Overlay is already applied for this gas, check if it's still valid. if(gas[g] <= gas_data.overlay_limit[g]) - if(!graphic_remove) - graphic_remove = list() - graphic_remove += gas_data.tile_overlay[g] + LAZYADD(graphic_remove, gas_data.tile_overlay[g]) else //Overlay isn't applied for this gas, check if it's valid and needs to be added. if(gas[g] > gas_data.overlay_limit[g]) - if(!graphic_add) - graphic_add = list() - graphic_add += gas_data.tile_overlay[g] + LAZYADD(graphic_add, gas_data.tile_overlay[g]) . = 0 //Apply changes - if(graphic_add && graphic_add.len) - graphic += graphic_add + if(LAZYLEN(graphic_add)) + LAZYADD(graphic, graphic_add) . = 1 - if(graphic_remove && graphic_remove.len) - graphic -= graphic_remove + if(LAZYLEN(graphic_remove)) + LAZYREMOVE(graphic, graphic_remove) . = 1 From b996d5c6b2a34f9a1f3de2f88bfc347f0cdb1da5 Mon Sep 17 00:00:00 2001 From: Leshana Date: Wed, 7 Jun 2017 13:55:34 -0400 Subject: [PATCH 70/82] Ports utility macros to let subsystems divide their time among a few tasks Port of https://github.com/tgstation/tgstation/pull/26324 --- code/__defines/MC.dm | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/code/__defines/MC.dm b/code/__defines/MC.dm index 08b8d223ec..59fb0d4db7 100644 --- a/code/__defines/MC.dm +++ b/code/__defines/MC.dm @@ -1,4 +1,15 @@ #define MC_TICK_CHECK ( ( world.tick_usage > CURRENT_TICKLIMIT || src.state != SS_RUNNING ) ? pause() : 0 ) + +// Used for splitting up your remaining time into phases, if you want to evenly divide it. +#define MC_SPLIT_TICK_INIT(phase_count) var/original_tick_limit = CURRENT_TICKLIMIT; var/split_tick_phases = ##phase_count +#define MC_SPLIT_TICK \ + if(split_tick_phases > 1){\ + CURRENT_TICKLIMIT = ((original_tick_limit - world.tick_usage) / split_tick_phases) + world.tick_usage;\ + --split_tick_phases;\ + } else {\ + CURRENT_TICKLIMIT = original_tick_limit;\ + } + // Used to smooth out costs to try and avoid oscillation. #define MC_AVERAGE_FAST(average, current) (0.7 * (average) + 0.3 * (current)) #define MC_AVERAGE(average, current) (0.8 * (average) + 0.2 * (current)) From 82e90a206c1e24147b7073e948fc63c4f232ecdc Mon Sep 17 00:00:00 2001 From: Leshana Date: Wed, 7 Jun 2017 16:42:06 -0400 Subject: [PATCH 71/82] Ports "Better repeated MC crash handling" * From https://github.com/tgstation/tgstation/pull/25813 * If the MC crashes: The problem subsystem will be rebooted on its 2nd strike and disabled on its third. --- code/controllers/master.dm | 19 +++++++++++++++++++ code/controllers/subsystem.dm | 2 ++ 2 files changed, 21 insertions(+) diff --git a/code/controllers/master.dm b/code/controllers/master.dm index 360b739bad..fbf97f730c 100644 --- a/code/controllers/master.dm +++ b/code/controllers/master.dm @@ -107,7 +107,26 @@ var/CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING else msg += "\t [varname] = [varval]\n" log_world(msg) + + var/datum/controller/subsystem/BadBoy = Master.last_type_processed + var/FireHim = FALSE + if(istype(BadBoy)) + msg = null + switch(++BadBoy.failure_strikes) + if(2) + msg = "The [BadBoy.name] subsystem was the last to fire for 2 controller restarts. It will be recovered now and disabled if it happens again." + FireHim = TRUE + if(3) + msg = "The [BadBoy.name] subsystem seems to be destabilizing the MC and will be offlined." + BadBoy.flags |= SS_NO_FIRE + if(msg) + log_game(msg) + message_admins("[msg]") + log_world(msg) + if (istype(Master.subsystems)) + if(FireHim) + Master.subsystems += new BadBoy.type //NEW_SS_GLOBAL will remove the old one subsystems = Master.subsystems StartProcessing(10) else diff --git a/code/controllers/subsystem.dm b/code/controllers/subsystem.dm index ff81fdc23e..b3e27a0175 100644 --- a/code/controllers/subsystem.dm +++ b/code/controllers/subsystem.dm @@ -27,6 +27,8 @@ var/datum/controller/subsystem/queue_next var/datum/controller/subsystem/queue_prev + var/static/failure_strikes = 0 //How many times we suspect this subsystem has crashed the MC, 3 strikes and you're out! + //Do not override /datum/controller/subsystem/New() return From 6a8abd4f80ae8d9b0c244dd85505fa542a33cf35 Mon Sep 17 00:00:00 2001 From: Leshana Date: Wed, 7 Jun 2017 17:50:07 -0400 Subject: [PATCH 72/82] Ports tg improvements in StonedMC subsystem * Ports /tg StonedMC Enhancement - Runlevels - Lets services more precicely define when they want to fire - in the lobby, during game, only after, etc. Includes bugfixes from: * https://github.com/tgstation/tgstation/pull/27132 * https://github.com/tgstation/tgstation/pull/27338 * https://github.com/tgstation/tgstation/pull/27576 * https://github.com/tgstation/tgstation/pull/27519 * Ports Standardizes subsystem Shutdown order - https://github.com/tgstation/tgstation/pull/26228 --- code/__defines/MC.dm | 19 +++--- code/__defines/subsystems.dm | 13 ++++ code/controllers/master.dm | 94 +++++++++++++++----------- code/controllers/subsystem.dm | 1 + code/controllers/subsystems/garbage.dm | 3 +- polaris.dme | 1 + 6 files changed, 79 insertions(+), 52 deletions(-) create mode 100644 code/__defines/subsystems.dm diff --git a/code/__defines/MC.dm b/code/__defines/MC.dm index 59fb0d4db7..297f04c148 100644 --- a/code/__defines/MC.dm +++ b/code/__defines/MC.dm @@ -21,39 +21,36 @@ //SubSystem flags (Please design any new flags so that the default is off, to make adding flags to subsystems easier) -//subsystem should fire during pre-game lobby. -#define SS_FIRE_IN_LOBBY 1 - //subsystem does not initialize. -#define SS_NO_INIT 2 +#define SS_NO_INIT 1 //subsystem does not fire. // (like can_fire = 0, but keeps it from getting added to the processing subsystems list) // (Requires a MC restart to change) -#define SS_NO_FIRE 4 +#define SS_NO_FIRE 2 //subsystem only runs on spare cpu (after all non-background subsystems have ran that tick) // SS_BACKGROUND has its own priority bracket -#define SS_BACKGROUND 8 +#define SS_BACKGROUND 4 //subsystem does not tick check, and should not run unless there is enough time (or its running behind (unless background)) -#define SS_NO_TICK_CHECK 16 +#define SS_NO_TICK_CHECK 8 //Treat wait as a tick count, not DS, run every wait ticks. // (also forces it to run first in the tick, above even SS_NO_TICK_CHECK subsystems) -// (implies SS_FIRE_IN_LOBBY because of how it works) +// (implies all runlevels because of how it works) // (overrides SS_BACKGROUND) // This is designed for basically anything that works as a mini-mc (like SStimer) -#define SS_TICKER 32 +#define SS_TICKER 16 //keep the subsystem's timing on point by firing early if it fired late last fire because of lag // ie: if a 20ds subsystem fires say 5 ds late due to lag or what not, its next fire would be in 15ds, not 20ds. -#define SS_KEEP_TIMING 64 +#define SS_KEEP_TIMING 32 //Calculate its next fire after its fired. // (IE: if a 5ds wait SS takes 2ds to run, its next fire should be 5ds away, not 3ds like it normally would be) // This flag overrides SS_KEEP_TIMING -#define SS_POST_FIRE_TIMING 128 +#define SS_POST_FIRE_TIMING 64 //SUBSYSTEM STATES #define SS_IDLE 0 //aint doing shit. diff --git a/code/__defines/subsystems.dm b/code/__defines/subsystems.dm new file mode 100644 index 0000000000..8c546c9135 --- /dev/null +++ b/code/__defines/subsystems.dm @@ -0,0 +1,13 @@ + +// SS runlevels + +#define RUNLEVEL_INIT 0 // "Initialize Only" - Used for subsystems that should never be fired (Should also have SS_NO_FIRE set) +#define RUNLEVEL_LOBBY 1 // Initial runlevel before setup. Returns to here if setup fails. +#define RUNLEVEL_SETUP 2 // While the gamemode setup is running. I.E gameticker.setup() +#define RUNLEVEL_GAME 4 // After successful game ticker setup, while the round is running. +#define RUNLEVEL_POSTGAME 8 // When round completes but before reboot + +#define RUNLEVELS_DEFAULT (RUNLEVEL_SETUP | RUNLEVEL_GAME | RUNLEVEL_POSTGAME) + +var/global/list/runlevel_flags = list(RUNLEVEL_LOBBY, RUNLEVEL_SETUP, RUNLEVEL_GAME, RUNLEVEL_POSTGAME) +#define RUNLEVEL_FLAG_TO_INDEX(flag) (log(2, flag) + 1) // Convert from the runlevel bitfield constants to index in runlevel_flags list diff --git a/code/controllers/master.dm b/code/controllers/master.dm index fbf97f730c..6bcfb6ff0a 100644 --- a/code/controllers/master.dm +++ b/code/controllers/master.dm @@ -40,8 +40,6 @@ var/CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING var/make_runtime = 0 var/initializations_finished_with_no_players_logged_in //I wonder what this could be? - // Has round started? (So we know what subsystems to run) - var/round_started = 0 // The type of the last subsystem to be process()'d. var/last_type_processed @@ -52,6 +50,8 @@ var/CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING var/queue_priority_count_bg = 0 //Same, but for background subsystems var/map_loading = FALSE //Are we loading in a new map? + var/current_runlevel //for scheduling different subsystems for different stages of the round + /datum/controller/master/New() // Highlander-style: there can only be one! Kill off the old and replace it with the new. subsystems = list() @@ -70,6 +70,8 @@ var/CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING /datum/controller/master/Shutdown() processing = FALSE + sortTim(subsystems, /proc/cmp_subsystem_init) + reverseRange(subsystems) for(var/datum/controller/subsystem/ss in subsystems) ss.Shutdown() @@ -128,6 +130,7 @@ var/CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING if(FireHim) Master.subsystems += new BadBoy.type //NEW_SS_GLOBAL will remove the old one subsystems = Master.subsystems + current_runlevel = Master.current_runlevel StartProcessing(10) else to_chat(world, "The Master Controller is having some issues, we will need to re-initialize EVERYTHING") @@ -165,6 +168,9 @@ var/CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING to_chat(world, "[msg]") log_world(msg) + if (!current_runlevel) + SetRunLevel(RUNLEVEL_LOBBY) + // Sort subsystems by display setting for easy access. sortTim(subsystems, /proc/cmp_subsystem_display) // Set world options. @@ -180,16 +186,12 @@ var/CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING // Loop. Master.StartProcessing(0) -// Notify the MC that the round has started. -/datum/controller/master/proc/RoundStart() - round_started = 1 - var/timer = world.time - for (var/datum/controller/subsystem/SS in subsystems) - if (SS.flags & SS_FIRE_IN_LOBBY || SS.flags & SS_TICKER) - continue //already firing - // Stagger subsystems. - timer += world.tick_lag * rand(1, 5) - SS.next_fire = timer +/datum/controller/master/proc/SetRunLevel(new_runlevel) + var/old_runlevel = isnull(current_runlevel) ? "NULL" : runlevel_flags[current_runlevel] + testing("MC: Runlevel changed from [old_runlevel] to [new_runlevel]") + current_runlevel = RUNLEVEL_FLAG_TO_INDEX(new_runlevel) + if(current_runlevel < 1) + CRASH("Attempted to set invalid runlevel: [new_runlevel]") // Starts the mc, and sticks around to restart it if the loop ever ends. /datum/controller/master/proc/StartProcessing(delay) @@ -214,12 +216,9 @@ var/CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING //Prep the loop (most of this is because we want MC restarts to reset as much state as we can, and because // local vars rock - // Schedule the first run of the Subsystems. - round_started = world.has_round_started() //all this shit is here so that flag edits can be refreshed by restarting the MC. (and for speed) var/list/tickersubsystems = list() - var/list/normalsubsystems = list() - var/list/lobbysubsystems = list() + var/list/runlevel_sorted_subsystems = list(list()) //ensure we always have at least one runlevel var/timer = world.time for (var/thing in subsystems) var/datum/controller/subsystem/SS = thing @@ -234,25 +233,29 @@ var/CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING timer += world.tick_lag * rand(1, 5) SS.next_fire = timer continue - if (SS.flags & SS_FIRE_IN_LOBBY) - lobbysubsystems += SS - timer += world.tick_lag * rand(1, 5) - SS.next_fire = timer - else if (round_started) - timer += world.tick_lag * rand(1, 5) - SS.next_fire = timer - normalsubsystems += SS + + var/ss_runlevels = SS.runlevels + var/added_to_any = FALSE + for(var/I in 1 to global.runlevel_flags.len) + if(ss_runlevels & global.runlevel_flags[I]) + while(runlevel_sorted_subsystems.len < I) + runlevel_sorted_subsystems += list(list()) + runlevel_sorted_subsystems[I] += SS + added_to_any = TRUE + if(!added_to_any) + WARNING("[SS.name] subsystem is not SS_NO_FIRE but also does not have any runlevels set!") queue_head = null queue_tail = null //these sort by lower priorities first to reduce the number of loops needed to add subsequent SS's to the queue //(higher subsystems will be sooner in the queue, adding them later in the loop means we don't have to loop thru them next queue add) sortTim(tickersubsystems, /proc/cmp_subsystem_priority) - sortTim(normalsubsystems, /proc/cmp_subsystem_priority) - sortTim(lobbysubsystems, /proc/cmp_subsystem_priority) + for(var/I in runlevel_sorted_subsystems) + sortTim(runlevel_sorted_subsystems, /proc/cmp_subsystem_priority) + I += tickersubsystems - normalsubsystems += tickersubsystems - lobbysubsystems += tickersubsystems + var/cached_runlevel = current_runlevel + var/list/current_runlevel_subsystems = runlevel_sorted_subsystems[cached_runlevel] init_timeofday = REALTIMEOFDAY init_time = world.time @@ -289,14 +292,23 @@ var/CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING if (!Failsafe || (Failsafe.processing_interval > 0 && (Failsafe.lasttick+(Failsafe.processing_interval*5)) < world.time)) new/datum/controller/failsafe() // (re)Start the failsafe. if (!queue_head || !(iteration % 3)) - if (round_started) - subsystems_to_check = normalsubsystems - else - subsystems_to_check = lobbysubsystems + var/checking_runlevel = current_runlevel + if(cached_runlevel != checking_runlevel) + //resechedule subsystems + cached_runlevel = checking_runlevel + current_runlevel_subsystems = runlevel_sorted_subsystems[cached_runlevel] + var/stagger = world.time + for(var/I in current_runlevel_subsystems) + var/datum/controller/subsystem/SS = I + if(SS.next_fire <= world.time) + stagger += world.tick_lag * rand(1, 5) + SS.next_fire = stagger + + subsystems_to_check = current_runlevel_subsystems else subsystems_to_check = tickersubsystems if (CheckQueue(subsystems_to_check) <= 0) - if (!SoftReset(tickersubsystems, normalsubsystems, lobbysubsystems)) + if (!SoftReset(tickersubsystems, runlevel_sorted_subsystems)) log_world("MC: SoftReset() failed, crashing") return if (!error_level) @@ -308,7 +320,7 @@ var/CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING if (queue_head) if (RunQueue() <= 0) - if (!SoftReset(tickersubsystems, normalsubsystems, lobbysubsystems)) + if (!SoftReset(tickersubsystems, runlevel_sorted_subsystems)) log_world("MC: SoftReset() failed, crashing") return if (!error_level) @@ -479,13 +491,15 @@ var/CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING //resets the queue, and all subsystems, while filtering out the subsystem lists // called if any mc's queue procs runtime or exit improperly. -/datum/controller/master/proc/SoftReset(list/ticker_SS, list/normal_SS, list/lobby_SS) +/datum/controller/master/proc/SoftReset(list/ticker_SS, list/runlevel_SS) . = 0 log_world("MC: SoftReset called, resetting MC queue state.") - if (!istype(subsystems) || !istype(ticker_SS) || !istype(normal_SS) || !istype(lobby_SS)) - log_world("MC: SoftReset: Bad list contents: '[subsystems]' '[ticker_SS]' '[normal_SS]' '[lobby_SS]' Crashing!") + if (!istype(subsystems) || !istype(ticker_SS) || !istype(runlevel_SS)) + log_world("MC: SoftReset: Bad list contents: '[subsystems]' '[ticker_SS]' '[runlevel_SS]'") return - var/subsystemstocheck = subsystems + ticker_SS + normal_SS + lobby_SS + var/subsystemstocheck = subsystems + ticker_SS + for(var/I in runlevel_SS) + subsystemstocheck |= I for (var/thing in subsystemstocheck) var/datum/controller/subsystem/SS = thing @@ -493,8 +507,8 @@ var/CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING //list(SS) is so if a list makes it in the subsystem list, we remove the list, not the contents subsystems -= list(SS) ticker_SS -= list(SS) - normal_SS -= list(SS) - lobby_SS -= list(SS) + for(var/I in runlevel_SS) + I -= list(SS) log_world("MC: SoftReset: Found bad entry in subsystem list, '[SS]'") continue if (SS.queue_next && !istype(SS.queue_next)) diff --git a/code/controllers/subsystem.dm b/code/controllers/subsystem.dm index b3e27a0175..7dff609c76 100644 --- a/code/controllers/subsystem.dm +++ b/code/controllers/subsystem.dm @@ -6,6 +6,7 @@ var/priority = 50 //When mutiple subsystems need to run in the same tick, higher priority subsystems will run first and be given a higher share of the tick before MC_TICK_CHECK triggers a sleep var/flags = 0 //see MC.dm in __DEFINES Most flags must be set on world start to take full effect. (You can also restart the mc to force them to process again) + var/runlevels = RUNLEVELS_DEFAULT //points of the game at which the SS can fire //set to 0 to prevent fire() calls, mostly for admin use or subsystems that may be resumed later // use the SS_NO_FIRE flag instead for systems that never fire to keep it from even being added to the list diff --git a/code/controllers/subsystems/garbage.dm b/code/controllers/subsystems/garbage.dm index b07337e803..d6db860d5d 100644 --- a/code/controllers/subsystems/garbage.dm +++ b/code/controllers/subsystems/garbage.dm @@ -5,7 +5,8 @@ SUBSYSTEM_DEF(garbage) name = "Garbage" priority = 15 wait = 5 - flags = SS_FIRE_IN_LOBBY|SS_POST_FIRE_TIMING|SS_BACKGROUND|SS_NO_INIT + flags = SS_POST_FIRE_TIMING|SS_BACKGROUND|SS_NO_INIT + runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY var/collection_timeout = 3000// deciseconds to wait to let running procs finish before we just say fuck it and force del() the object var/delslasttick = 0 // number of del()'s we've done this tick diff --git a/polaris.dme b/polaris.dme index 3b49b9566b..83159a4621 100644 --- a/polaris.dme +++ b/polaris.dme @@ -40,6 +40,7 @@ #include "code\__defines\qdel.dm" #include "code\__defines\research.dm" #include "code\__defines\species_languages.dm" +#include "code\__defines\subsystems.dm" #include "code\__defines\targeting.dm" #include "code\__defines\tick.dm" #include "code\__defines\turfs.dm" From fb92653ac9a56d177277a7470134b310f802dc55 Mon Sep 17 00:00:00 2001 From: Leshana Date: Wed, 7 Jun 2017 18:26:28 -0400 Subject: [PATCH 73/82] Ports "Makes global master vars static" * https://github.com/tgstation/tgstation/pull/27523 --- code/__defines/MC.dm | 8 +++---- code/__defines/tick.dm | 2 +- code/_helpers/time.dm | 2 +- code/controllers/master.dm | 44 +++++++++++++++++++------------------- 4 files changed, 28 insertions(+), 28 deletions(-) diff --git a/code/__defines/MC.dm b/code/__defines/MC.dm index 297f04c148..fb15a693bf 100644 --- a/code/__defines/MC.dm +++ b/code/__defines/MC.dm @@ -1,13 +1,13 @@ -#define MC_TICK_CHECK ( ( world.tick_usage > CURRENT_TICKLIMIT || src.state != SS_RUNNING ) ? pause() : 0 ) +#define MC_TICK_CHECK ( ( world.tick_usage > Master.current_ticklimit || src.state != SS_RUNNING ) ? pause() : 0 ) // Used for splitting up your remaining time into phases, if you want to evenly divide it. -#define MC_SPLIT_TICK_INIT(phase_count) var/original_tick_limit = CURRENT_TICKLIMIT; var/split_tick_phases = ##phase_count +#define MC_SPLIT_TICK_INIT(phase_count) var/original_tick_limit = Master.current_ticklimit; var/split_tick_phases = ##phase_count #define MC_SPLIT_TICK \ if(split_tick_phases > 1){\ - CURRENT_TICKLIMIT = ((original_tick_limit - world.tick_usage) / split_tick_phases) + world.tick_usage;\ + Master.current_ticklimit = ((original_tick_limit - world.tick_usage) / split_tick_phases) + world.tick_usage;\ --split_tick_phases;\ } else {\ - CURRENT_TICKLIMIT = original_tick_limit;\ + Master.current_ticklimit = original_tick_limit;\ } // Used to smooth out costs to try and avoid oscillation. diff --git a/code/__defines/tick.dm b/code/__defines/tick.dm index 3fa6e21bf3..4c88fd643e 100644 --- a/code/__defines/tick.dm +++ b/code/__defines/tick.dm @@ -3,5 +3,5 @@ #define TICK_LIMIT_MC 70 #define TICK_LIMIT_MC_INIT_DEFAULT 98 -#define TICK_CHECK ( world.tick_usage > CURRENT_TICKLIMIT ) +#define TICK_CHECK ( world.tick_usage > Master.current_ticklimit ) #define CHECK_TICK if TICK_CHECK stoplag() diff --git a/code/_helpers/time.dm b/code/_helpers/time.dm index b3989a32a4..3a6bcedcd1 100644 --- a/code/_helpers/time.dm +++ b/code/_helpers/time.dm @@ -120,4 +120,4 @@ var/round_start_time = 0 . += round(i*DELTA_CALC) sleep(i*world.tick_lag*DELTA_CALC) i *= 2 - while (world.tick_usage > min(TICK_LIMIT_TO_RUN, CURRENT_TICKLIMIT)) + while (world.tick_usage > min(TICK_LIMIT_TO_RUN, Master.current_ticklimit)) diff --git a/code/controllers/master.dm b/code/controllers/master.dm index 6bcfb6ff0a..7c2bc86a65 100644 --- a/code/controllers/master.dm +++ b/code/controllers/master.dm @@ -7,14 +7,6 @@ * **/ var/datum/controller/master/Master = new() -var/MC_restart_clear = 0 -var/MC_restart_timeout = 0 -var/MC_restart_count = 0 - - -//current tick limit, assigned by the queue controller before running a subsystem. -//used by check_tick as well so that the procs subsystems call can obey that SS's tick limits -var/CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING /datum/controller/master name = "Master" @@ -52,6 +44,14 @@ var/CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING var/current_runlevel //for scheduling different subsystems for different stages of the round + var/static/restart_clear = 0 + var/static/restart_timeout = 0 + var/static/restart_count = 0 + + //current tick limit, assigned before running a subsystem. + //used by CHECK_TICK as well so that the procs subsystems call can obey that SS's tick limits + var/static/current_ticklimit = TICK_LIMIT_RUNNING + /datum/controller/master/New() // Highlander-style: there can only be one! Kill off the old and replace it with the new. subsystems = list() @@ -79,14 +79,14 @@ var/CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING // -1 if we encountered a runtime trying to recreate it /proc/Recreate_MC() . = -1 //so if we runtime, things know we failed - if (world.time < MC_restart_timeout) + if (world.time < Master.restart_timeout) return 0 - if (world.time < MC_restart_clear) - MC_restart_count *= 0.5 + if (world.time < Master.restart_clear) + Master.restart_count *= 0.5 - var/delay = 50 * ++MC_restart_count - MC_restart_timeout = world.time + delay - MC_restart_clear = world.time + (delay * 2) + var/delay = 50 * ++Master.restart_count + Master.restart_timeout = world.time + delay + Master.restart_clear = world.time + (delay * 2) Master.processing = 0 //stop ticking this one try new/datum/controller/master() @@ -155,13 +155,13 @@ var/CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING var/start_timeofday = REALTIMEOFDAY // Initialize subsystems. - CURRENT_TICKLIMIT = config.tick_limit_mc_init + current_ticklimit = config.tick_limit_mc_init for (var/datum/controller/subsystem/SS in subsystems) if (SS.flags & SS_NO_INIT) continue SS.Initialize(REALTIMEOFDAY) CHECK_TICK - CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING + current_ticklimit = TICK_LIMIT_RUNNING var/time = (REALTIMEOFDAY - start_timeofday) / 10 var/msg = "Initializations complete within [time] second[time == 1 ? "" : "s"]!" @@ -268,7 +268,7 @@ var/CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING while (1) tickdrift = max(0, MC_AVERAGE_FAST(tickdrift, (((REALTIMEOFDAY - init_timeofday) - (world.time - init_time)) / world.tick_lag))) if (processing <= 0) - CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING + current_ticklimit = TICK_LIMIT_RUNNING sleep(10) continue @@ -276,7 +276,7 @@ var/CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING // because sleeps are processed in the order received, so longer sleeps are more likely to run first if (world.tick_usage > TICK_LIMIT_MC) sleep_delta += 2 - CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING - (TICK_LIMIT_RUNNING * 0.5) + current_ticklimit = TICK_LIMIT_RUNNING * 0.5 sleep(world.tick_lag * (processing + sleep_delta)) continue @@ -314,7 +314,7 @@ var/CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING if (!error_level) iteration++ error_level++ - CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING + current_ticklimit = TICK_LIMIT_RUNNING sleep(10) continue @@ -326,7 +326,7 @@ var/CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING if (!error_level) iteration++ error_level++ - CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING + current_ticklimit = TICK_LIMIT_RUNNING sleep(10) continue error_level-- @@ -337,7 +337,7 @@ var/CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING iteration++ last_run = world.time src.sleep_delta = MC_AVERAGE_FAST(src.sleep_delta, sleep_delta) - CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING - (TICK_LIMIT_RUNNING * 0.25) //reserve the tail 1/4 of the next tick for the mc. + current_ticklimit = TICK_LIMIT_RUNNING - (TICK_LIMIT_RUNNING * 0.25) //reserve the tail 1/4 of the next tick for the mc. sleep(world.tick_lag * (processing + sleep_delta)) @@ -426,7 +426,7 @@ var/CURRENT_TICKLIMIT = TICK_LIMIT_RUNNING else tick_precentage = tick_remaining - CURRENT_TICKLIMIT = world.tick_usage + tick_precentage + current_ticklimit = world.tick_usage + tick_precentage if (!(queue_node_flags & SS_TICKER)) ran_non_ticker = TRUE From 82e6049821a7ab346f7550d0c26016c3d50bf788 Mon Sep 17 00:00:00 2001 From: Leshana Date: Wed, 7 Jun 2017 17:51:47 -0400 Subject: [PATCH 74/82] Actually hooks up the StonedMC to run its subsystems in Polaris * Hooks up informing Master the gameticker actually starts and stops the round subsystems will actually fire! What ho! * We should convert the gameticker as an MC subsystem someday, and probably completely rewrite it while we are at it becuase it is crazy. But this should bridge the gap until then. --- code/controllers/Processes/ticker.dm | 6 +++++- code/game/gamemodes/gameticker.dm | 7 +++++++ code/modules/admin/admin.dm | 1 + code/unit_tests/unit_test.dm | 1 + code/world.dm | 1 + 5 files changed, 15 insertions(+), 1 deletion(-) diff --git a/code/controllers/Processes/ticker.dm b/code/controllers/Processes/ticker.dm index 6fa6d43237..a70bb74c5f 100644 --- a/code/controllers/Processes/ticker.dm +++ b/code/controllers/Processes/ticker.dm @@ -34,5 +34,9 @@ var/global/datum/controller/process/ticker/tickerProcess /datum/controller/process/ticker/proc/getLastTickerTimeDuration() return lastTickerTimeDuration -/world/proc/has_round_started() +// Use these preferentially to directly examining ticker.current_state to help prepare for transition to ticker as subsystem! +/datum/controller/process/ticker/proc/HasRoundStarted() return (ticker && ticker.current_state >= GAME_STATE_PLAYING) + +/datum/controller/process/ticker/proc/IsRoundInProgress() + return (ticker && ticker.current_state == GAME_STATE_PLAYING) diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm index 9e4dff2ce5..4567a1da51 100644 --- a/code/game/gamemodes/gameticker.dm +++ b/code/game/gamemodes/gameticker.dm @@ -62,6 +62,7 @@ var/global/datum/controller/gameticker/ticker vote.process() if(pregame_timeleft <= 0) current_state = GAME_STATE_SETTING_UP + Master.SetRunLevel(RUNLEVEL_SETUP) while (!setup()) @@ -74,6 +75,7 @@ var/global/datum/controller/gameticker/ticker if((master_mode=="random") || (master_mode=="secret")) if(!runnable_modes.len) current_state = GAME_STATE_PREGAME + Master.SetRunLevel(RUNLEVEL_LOBBY) world << "Unable to choose playable game mode. Reverting to pre-game lobby." return 0 if(secret_force_mode != "secret") @@ -88,6 +90,7 @@ var/global/datum/controller/gameticker/ticker if(!src.mode) current_state = GAME_STATE_PREGAME + Master.SetRunLevel(RUNLEVEL_LOBBY) world << "Serious error in mode setup! Reverting to pre-game lobby." return 0 @@ -99,6 +102,7 @@ var/global/datum/controller/gameticker/ticker if(!src.mode.can_start()) world << "Unable to start [mode.name]. Not enough players, [mode.required_players] players needed. Reverting to pre-game lobby." current_state = GAME_STATE_PREGAME + Master.SetRunLevel(RUNLEVEL_LOBBY) mode.fail_setup() mode = null job_master.ResetOccupations() @@ -127,6 +131,7 @@ var/global/datum/controller/gameticker/ticker shuttle_controller.setup_shuttle_docks() + // TODO - Leshana - Dear God Fix This. Fix all of this. Not just this line, this entire proc. This entire file! spawn(0)//Forking here so we dont have to wait for this to finish mode.post_setup() //Cleanup some stuff @@ -155,6 +160,7 @@ var/global/datum/controller/gameticker/ticker */ processScheduler.start() + Master.SetRunLevel(RUNLEVEL_GAME) if(config.sql_enabled) statistic_cycle() // Polls population totals regularly and stores them in an SQL DB -- TLE @@ -319,6 +325,7 @@ var/global/datum/controller/gameticker/ticker if(!mode.explosion_in_progress && game_finished && (mode_finished || post_game)) current_state = GAME_STATE_FINISHED + Master.SetRunLevel(RUNLEVEL_POSTGAME) spawn declare_completion() diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index aea165e063..2f9bca5f01 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -783,6 +783,7 @@ proc/admin_notice(var/message, var/rights) return if(ticker.current_state == GAME_STATE_PREGAME) ticker.current_state = GAME_STATE_SETTING_UP + Master.SetRunLevel(RUNLEVEL_SETUP) log_admin("[usr.key] has started the game.") message_admins("[usr.key] has started the game.") feedback_add_details("admin_verb","SN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/unit_tests/unit_test.dm b/code/unit_tests/unit_test.dm index f05514ce74..605cf8fcac 100644 --- a/code/unit_tests/unit_test.dm +++ b/code/unit_tests/unit_test.dm @@ -45,6 +45,7 @@ var/total_unit_tests = 0 sleep(1) ticker.current_state = GAME_STATE_SETTING_UP + Master.SetRunLevel(RUNLEVEL_SETUP) log_unit_test("Round has been started. Waiting 10 seconds to start tests.") sleep(100) diff --git a/code/world.dm b/code/world.dm index a11d875c51..9a031dda0f 100644 --- a/code/world.dm +++ b/code/world.dm @@ -433,6 +433,7 @@ var/world_topic_spam_protect_time = world.timeofday */ processScheduler.stop() + Master.Shutdown() //run SS shutdowns for(var/client/C in clients) if(config.server) //if you set a server location in config.txt, it sends you there instead of trying to reconnect to the same world address. -- NeoFite From b7f74541b8874a4a5a22c1b14bb7876cc17f20b4 Mon Sep 17 00:00:00 2001 From: Neerti Date: Sun, 11 Jun 2017 02:52:53 -0400 Subject: [PATCH 75/82] Makes Examine Panel slightly more useful. The examine panel can now display different interactions with a few items, using icons, mostly as a proof of concept. --- code/game/machinery/doors/airlock.dm | 5 +- code/game/turfs/simulated/wall_attacks.dm | 9 ++++ .../examine/descriptions/engineering.dm | 47 ++++++++++++++++++- code/modules/examine/descriptions/turfs.dm | 34 +++++++++++++- code/modules/examine/examine.dm | 18 ++++++- code/modules/examine/stat_icons.dm | 18 ++++++- 6 files changed, 123 insertions(+), 8 deletions(-) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 5d8d068d49..5e43231ed6 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -753,6 +753,9 @@ About the new airlock wires panel: update_icon() return 1 +/obj/machinery/door/airlock/proc/can_remove_electronics() + return src.p_open && (operating < 0 || (!operating && welded && !src.arePowerSystemsOn() && density && (!src.locked || (stat & BROKEN)))) + /obj/machinery/door/airlock/attackby(C as obj, mob/user as mob) //world << text("airlock attackby src [] obj [] mob []", src, C, user) if(!istype(usr, /mob/living/silicon)) @@ -797,7 +800,7 @@ About the new airlock wires panel: var/obj/item/weapon/pai_cable/cable = C cable.plugin(src, user) else if(!repairing && istype(C, /obj/item/weapon/crowbar)) - if(src.p_open && (operating < 0 || (!operating && welded && !src.arePowerSystemsOn() && density && (!src.locked || (stat & BROKEN)))) ) + if(can_remove_electronics()) playsound(src.loc, 'sound/items/Crowbar.ogg', 75, 1) user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to remove electronics from the airlock assembly.") if(do_after(user,40)) diff --git a/code/game/turfs/simulated/wall_attacks.dm b/code/game/turfs/simulated/wall_attacks.dm index 890574d664..25b4915408 100644 --- a/code/game/turfs/simulated/wall_attacks.dm +++ b/code/game/turfs/simulated/wall_attacks.dm @@ -190,6 +190,7 @@ else user << "You need more welding fuel to complete this task." return + user.update_examine_panel(src) return // Basic dismantling. @@ -243,6 +244,7 @@ if (istype(W, /obj/item/weapon/wirecutters)) playsound(src, 'sound/items/Wirecutter.ogg', 100, 1) construction_stage = 5 + user.update_examine_panel(src) user << "You cut through the outer grille." update_icon() return @@ -253,11 +255,13 @@ if(!do_after(user,40) || !istype(src, /turf/simulated/wall) || construction_stage != 5) return construction_stage = 4 + user.update_examine_panel(src) update_icon() user << "You unscrew the support lines." return else if (istype(W, /obj/item/weapon/wirecutters)) construction_stage = 6 + user.update_examine_panel(src) user << "You mend the outer grille." update_icon() return @@ -280,6 +284,7 @@ if(!do_after(user, 60) || !istype(src, /turf/simulated/wall) || construction_stage != 4) return construction_stage = 3 + user.update_examine_panel(src) update_icon() user << "You press firmly on the cover, dislodging it." return @@ -289,6 +294,7 @@ if(!do_after(user,40) || !istype(src, /turf/simulated/wall) || construction_stage != 4) return construction_stage = 5 + user.update_examine_panel(src) update_icon() user << "You screw down the support lines." return @@ -299,6 +305,7 @@ if(!do_after(user,100) || !istype(src, /turf/simulated/wall) || construction_stage != 3) return construction_stage = 2 + user.update_examine_panel(src) update_icon() user << "You pry off the cover." return @@ -309,6 +316,7 @@ if(!do_after(user,40) || !istype(src, /turf/simulated/wall) || construction_stage != 2) return construction_stage = 1 + user.update_examine_panel(src) update_icon() user << "You remove the bolts anchoring the support rods." return @@ -329,6 +337,7 @@ if(!do_after(user,70) || !istype(src, /turf/simulated/wall) || construction_stage != 1) return construction_stage = 0 + user.update_examine_panel(src) update_icon() user << "The slice through the support rods." return diff --git a/code/modules/examine/descriptions/engineering.dm b/code/modules/examine/descriptions/engineering.dm index c3f9b9b21f..37e69f16f9 100644 --- a/code/modules/examine/descriptions/engineering.dm +++ b/code/modules/examine/descriptions/engineering.dm @@ -25,11 +25,54 @@ Wires can be pulsed remotely with a signaler attached to it. A powersink will also drain any APCs connected to the same wire the powersink is on." /obj/item/inflatable - description_info = "Inflate by using it in your hand. The inflatable barrier will inflate on your tile. To deflate it, use the 'deflate' verb." + description_info = "Inflate by using it in your hand. The inflatable barrier will inflate on your tile. To deflate it, use the 'deflate' verb. \ + You can also inflate this on an adjacent tile by clicking the tile." /obj/structure/inflatable - description_info = "To remove these safely, use the 'deflate' verb. Hitting these with any objects will probably puncture and break it forever." + description_info = "To remove these safely, use the 'deflate' verb, or alt-click on it. Hitting these with any objects will probably puncture and break it forever." /obj/structure/inflatable/door description_info = "Click the door to open or close it. It only stops air while closed.
    \ To remove these safely, use the 'deflate' verb. Hitting these with any objects will probably puncture and break it forever." + +/obj/machinery/door/get_description_interaction() + var/list/results = list() + if(!repairing && (health < maxhealth) && !(stat & BROKEN)) + results += "[desc_panel_image("metal sheet")]to start repairing damage (May require different material type)." + if(repairing && density) + results += "[desc_panel_image("welder")]to finish repairs." + results += "[desc_panel_image("crowbar")]to undo adding sheets for repairs." + + return results + +/obj/machinery/door/airlock/get_description_interaction() + var/list/results = list() + + if(can_remove_electronics()) + results += "[desc_panel_image("crowbar")]to remove the airlock electronics." + else + results += "[desc_panel_image("crowbar")]to open or close if unpowered/broken, and unbolted." + + if(welded) + results += "[desc_panel_image("welder")]to unweld, allowing it to open again." + else + results += "[desc_panel_image("welder")]to weld, preventing it from opening." + + if(p_open) + results += "[desc_panel_image("screwdriver")]to close the wire panel." + results += "[desc_panel_image("wirecutters")]to cut an internal wire while hacking." + results += "[desc_panel_image("multitool")]to pulse an internal wire while hacking." + else + results += "[desc_panel_image("screwdriver")]to open the wire panel, enabling the ability to hack." + + results += ..() + + return results + +/obj/machinery/portable_atmospherics/canister/get_description_interaction() + var/list/results = list() + + results += "[desc_panel_image("wrench")]to connect or disconnect from a connector port below." + results += "[desc_panel_image("air tank")]to fill the air tank from this canister." + + return results \ No newline at end of file diff --git a/code/modules/examine/descriptions/turfs.dm b/code/modules/examine/descriptions/turfs.dm index cccc43e073..4319c23ffe 100644 --- a/code/modules/examine/descriptions/turfs.dm +++ b/code/modules/examine/descriptions/turfs.dm @@ -1,3 +1,33 @@ /turf/simulated/wall - description_info = "You can deconstruct this by welding it, and then wrenching the girder.
    \ - You can build a wall by using metal sheets and making a girder, then adding more metal or plasteel." \ No newline at end of file + description_info = "You can build a wall by using metal sheets and making a girder, then adding more metal or plasteel." + +/turf/simulated/wall/get_description_interaction() + var/list/results = list() + if(damage) + results += "[desc_panel_image("welder")]to repair." + + if(isnull(construction_stage) || !reinf_material) + results += "[desc_panel_image("welder")]to deconstruct if undamaged." + else + switch(construction_stage) + if(6) + results += "[desc_panel_image("wirecutters")]to begin deconstruction." + if(5) + results += list( + "[desc_panel_image("screwdriver")]to continue deconstruction.", + "[desc_panel_image("wirecutters")]to reverse deconstruction." + ) + if(4) + results += list( + "[desc_panel_image("welder")]to continue deconstruction.", + "[desc_panel_image("screwdriver")]to reverse deconstruction." + ) + if(3) + results += "[desc_panel_image("crowbar")]to continue deconstruction." + if(2) + results += "[desc_panel_image("wrench")]to continue deconstruction." + if(1) + results += "[desc_panel_image("welder")]to continue deconstruction." + if(0) + results += "[desc_panel_image("crowbar")]to finish deconstruction." + return results \ No newline at end of file diff --git a/code/modules/examine/examine.dm b/code/modules/examine/examine.dm index ec64ffbe41..6e2df0b1fa 100644 --- a/code/modules/examine/examine.dm +++ b/code/modules/examine/examine.dm @@ -5,6 +5,7 @@ This means that this file can be unchecked, along with the other examine files, and can be removed entirely with no effort. */ +#define EXAMINE_PANEL_PADDING " " /atom/ var/description_info = null //Helpful blue text. @@ -27,6 +28,14 @@ return description_antag return +// This one is slightly different, in that it must return a list. +/atom/proc/get_description_interaction() + return list() + +// Quickly adds the boilerplate code to add an image and padding for the image. +/proc/desc_panel_image(var/icon_state) + return "\icon[description_icons[icon_state]][EXAMINE_PANEL_PADDING]" + /mob/living/get_description_fluff() if(flavor_text) //Get flavor text for the green text. return flavor_text @@ -44,6 +53,7 @@ description_holders["info"] = A.get_description_info() description_holders["fluff"] = A.get_description_fluff() description_holders["antag"] = (update_antag_info)? A.get_description_antag() : "" + description_holders["interactions"] = A.get_description_interaction() description_holders["name"] = "[A.name]" description_holders["icon"] = "\icon[A]" @@ -57,6 +67,9 @@ stat(null,"[description_holders["desc"]]") //the default examine text. if(description_holders["info"]) stat(null,"[description_holders["info"]]") //Blue, informative text. + if(description_holders["interactions"]) + for(var/line in description_holders["interactions"]) + stat(null, "[line]") if(description_holders["fluff"]) stat(null,"[description_holders["fluff"]]") //Yellow, fluff-related text. if(description_holders["antag"]) @@ -67,6 +80,9 @@ if(..()) return 1 - var/is_antag = ((mind && mind.special_role) || isobserver(src)) //ghosts don't have minds + update_examine_panel(A) + +/mob/proc/update_examine_panel(var/atom/A) if(client) + var/is_antag = ((mind && mind.special_role) || isobserver(src)) //ghosts don't have minds client.update_description_holders(A, is_antag) diff --git a/code/modules/examine/stat_icons.dm b/code/modules/examine/stat_icons.dm index 77d97fe0a1..ba09157d1c 100644 --- a/code/modules/examine/stat_icons.dm +++ b/code/modules/examine/stat_icons.dm @@ -6,5 +6,19 @@ var/global/list/description_icons = list( "energy_armor" = image(icon='icons/mob/screen1_stats.dmi',icon_state="energy_protection"), "bomb_armor" = image(icon='icons/mob/screen1_stats.dmi',icon_state="bomb_protection"), "radiation_armor" = image(icon='icons/mob/screen1_stats.dmi',icon_state="radiation_protection"), - "biohazard_armor" = image(icon='icons/mob/screen1_stats.dmi',icon_state="biohazard_protection") - ) \ No newline at end of file + "biohazard_armor" = image(icon='icons/mob/screen1_stats.dmi',icon_state="biohazard_protection"), + + "welder" = image(icon='icons/obj/items.dmi',icon_state="welder"), + "wirecutters" = image(icon='icons/obj/items.dmi',icon_state="cutters"), + "screwdriver" = image(icon='icons/obj/items.dmi',icon_state="screwdriver"), + "wrench" = image(icon='icons/obj/items.dmi',icon_state="wrench"), + "crowbar" = image(icon='icons/obj/items.dmi',icon_state="crowbar"), + "multitool" = image(icon='icons/obj/device.dmi',icon_state="multitool"), + + "metal sheet" = image(icon='icons/obj/items.dmi',icon_state="sheet-metal"), + "plasteel sheet" = image(icon='icons/obj/items.dmi',icon_state="sheet-plasteel"), + + "air tank" = image(icon='icons/obj/tank.dmi',icon_state="oxygen"), + + "connector" = image(icon='icons/obj/pipes.dmi',icon_state="connector") + ) From 18012fa1d16d61af16c7968c5d0c935e022411ed Mon Sep 17 00:00:00 2001 From: Neerti Date: Sun, 11 Jun 2017 04:47:52 -0400 Subject: [PATCH 76/82] Port's Bay's Shuttle Cleanup Shuttles now set themselves up upon being instantiated instead of relying on a monolithic proc in the shuttle controller. Shuttles can now be defined more cleanly on a per-map basis, as well. Accidentally fixes a broken admin shuttle. --- .../emergency_shuttle_controller.dm | 4 + code/controllers/shuttle_controller.dm | 317 +----------------- code/modules/shuttles/_defines.dm | 4 + code/modules/shuttles/escape_pods.dm | 20 +- code/modules/shuttles/shuttle.dm | 23 ++ code/modules/shuttles/shuttle_emergency.dm | 8 +- code/modules/shuttles/shuttle_ferry.dm | 12 +- code/modules/shuttles/shuttle_specops.dm | 6 +- code/modules/shuttles/shuttle_supply.dm | 21 +- code/modules/shuttles/shuttles_multi.dm | 8 +- maps/northern_star/northern_star.dm | 1 + maps/northern_star/northern_star_shuttles.dm | 272 +++++++++++++++ polaris.dme | 1 + 13 files changed, 365 insertions(+), 332 deletions(-) create mode 100644 code/modules/shuttles/_defines.dm create mode 100644 maps/northern_star/northern_star_shuttles.dm diff --git a/code/controllers/emergency_shuttle_controller.dm b/code/controllers/emergency_shuttle_controller.dm index 5b1b6a60d1..7fb3a56c61 100644 --- a/code/controllers/emergency_shuttle_controller.dm +++ b/code/controllers/emergency_shuttle_controller.dm @@ -22,6 +22,10 @@ var/global/datum/emergency_shuttle_controller/emergency_shuttle var/datum/announcement/priority/emergency_shuttle_called = new(0, new_sound = sound('sound/AI/shuttlecalled.ogg')) var/datum/announcement/priority/emergency_shuttle_recalled = new(0, new_sound = sound('sound/AI/shuttlerecalled.ogg')) +/datum/emergency_shuttle_controller/New() + escape_pods = list() + ..() + /datum/emergency_shuttle_controller/proc/process() if (wait_for_launch) if (evac && auto_recall && world.time >= auto_recall_time) diff --git a/code/controllers/shuttle_controller.dm b/code/controllers/shuttle_controller.dm index c95e4f242f..d881a65a4a 100644 --- a/code/controllers/shuttle_controller.dm +++ b/code/controllers/shuttle_controller.dm @@ -15,8 +15,13 @@ var/global/datum/shuttle_controller/shuttle_controller //This is called by gameticker after all the machines and radio frequencies have been properly initialized /datum/shuttle_controller/proc/setup_shuttle_docks() - for(var/shuttle_tag in shuttles) - var/datum/shuttle/shuttle = shuttles[shuttle_tag] +// for(var/shuttle_tag in shuttles) +// var/datum/shuttle/shuttle = shuttles[shuttle_tag] + for(var/shuttle_type in subtypesof(/datum/shuttle)) + var/datum/shuttle/shuttle = shuttle_type + if(initial(shuttle.category) == shuttle_type) + continue + shuttle = new shuttle() shuttle.init_docking_controllers() shuttle.dock() //makes all shuttles docked to something at round start go into the docked state @@ -28,311 +33,3 @@ var/global/datum/shuttle_controller/shuttle_controller shuttles = list() process_shuttles = list() - var/datum/shuttle/ferry/shuttle - - // Escape shuttle and pods - shuttle = new/datum/shuttle/ferry/emergency() - shuttle.location = 1 - shuttle.warmup_time = 10 - shuttle.area_offsite = locate(/area/shuttle/escape/centcom) - shuttle.area_station = locate(/area/shuttle/escape/station) - shuttle.area_transition = locate(/area/shuttle/escape/transit) - shuttle.docking_controller_tag = "escape_shuttle" - shuttle.dock_target_station = "escape_dock" - shuttle.dock_target_offsite = "centcom_dock" - shuttle.transit_direction = NORTH - shuttle.move_time = SHUTTLE_TRANSIT_DURATION_RETURN - //shuttle.docking_controller_tag = "supply_shuttle" - //shuttle.dock_target_station = "cargo_bay" - shuttles["Escape"] = shuttle - process_shuttles += shuttle - - shuttle = new/datum/shuttle/ferry/escape_pod() - shuttle.location = 0 - shuttle.warmup_time = 0 - shuttle.area_station = locate(/area/shuttle/escape_pod1/station) - shuttle.area_offsite = locate(/area/shuttle/escape_pod1/centcom) - shuttle.area_transition = locate(/area/shuttle/escape_pod1/transit) - shuttle.docking_controller_tag = "escape_pod_1" - shuttle.dock_target_station = "escape_pod_1_berth" - shuttle.dock_target_offsite = "escape_pod_1_recovery" - shuttle.transit_direction = NORTH - shuttle.move_time = SHUTTLE_TRANSIT_DURATION_RETURN + rand(-30, 60) //randomize this so it seems like the pods are being picked up one by one - process_shuttles += shuttle - shuttles["Escape Pod 1"] = shuttle - - shuttle = new/datum/shuttle/ferry/escape_pod() - shuttle.location = 0 - shuttle.warmup_time = 0 - shuttle.area_station = locate(/area/shuttle/escape_pod2/station) - shuttle.area_offsite = locate(/area/shuttle/escape_pod2/centcom) - shuttle.area_transition = locate(/area/shuttle/escape_pod2/transit) - shuttle.docking_controller_tag = "escape_pod_2" - shuttle.dock_target_station = "escape_pod_2_berth" - shuttle.dock_target_offsite = "escape_pod_2_recovery" - shuttle.transit_direction = NORTH - shuttle.move_time = SHUTTLE_TRANSIT_DURATION_RETURN + rand(-30, 60) //randomize this so it seems like the pods are being picked up one by one - process_shuttles += shuttle - shuttles["Escape Pod 2"] = shuttle - - shuttle = new/datum/shuttle/ferry/escape_pod() - shuttle.location = 0 - shuttle.warmup_time = 0 - shuttle.area_station = locate(/area/shuttle/escape_pod3/station) - shuttle.area_offsite = locate(/area/shuttle/escape_pod3/centcom) - shuttle.area_transition = locate(/area/shuttle/escape_pod3/transit) - shuttle.docking_controller_tag = "escape_pod_3" - shuttle.dock_target_station = "escape_pod_3_berth" - shuttle.dock_target_offsite = "escape_pod_3_recovery" - shuttle.transit_direction = NORTH - shuttle.move_time = SHUTTLE_TRANSIT_DURATION_RETURN + rand(-30, 60) //randomize this so it seems like the pods are being picked up one by one - process_shuttles += shuttle - shuttles["Escape Pod 3"] = shuttle - - shuttle = new/datum/shuttle/ferry/escape_pod() - shuttle.location = 0 - shuttle.warmup_time = 0 - shuttle.area_station = locate(/area/shuttle/escape_pod4/station) - shuttle.area_offsite = locate(/area/shuttle/escape_pod4/centcom) - shuttle.area_transition = locate(/area/shuttle/escape_pod4/transit) - shuttle.docking_controller_tag = "escape_pod_4" - shuttle.dock_target_station = "escape_pod_4_berth" - shuttle.dock_target_offsite = "escape_pod_4_recovery" - shuttle.transit_direction = NORTH //should this be SOUTH? I have no idea. - shuttle.move_time = SHUTTLE_TRANSIT_DURATION_RETURN + rand(-30, 60) //randomize this so it seems like the pods are being picked up one by one - process_shuttles += shuttle - shuttles["Escape Pod 4"] = shuttle - - shuttle = new/datum/shuttle/ferry/escape_pod() - shuttle.location = 0 - shuttle.warmup_time = 0 - shuttle.area_station = locate(/area/shuttle/escape_pod5/station) - shuttle.area_offsite = locate(/area/shuttle/escape_pod5/centcom) - shuttle.area_transition = locate(/area/shuttle/escape_pod5/transit) - shuttle.docking_controller_tag = "escape_pod_5" - shuttle.dock_target_station = "escape_pod_5_berth" - shuttle.dock_target_offsite = "escape_pod_5_recovery" - shuttle.transit_direction = NORTH //should this be WEST? I have no idea. - shuttle.move_time = SHUTTLE_TRANSIT_DURATION_RETURN + rand(-30, 60) //randomize this so it seems like the pods are being picked up one by one - process_shuttles += shuttle - shuttles["Escape Pod 5"] = shuttle - - shuttle = new/datum/shuttle/ferry/escape_pod() - shuttle.location = 0 - shuttle.warmup_time = 0 - shuttle.area_station = locate(/area/shuttle/escape_pod6/station) - shuttle.area_offsite = locate(/area/shuttle/escape_pod6/centcom) - shuttle.area_transition = locate(/area/shuttle/escape_pod6/transit) - shuttle.docking_controller_tag = "escape_pod_6" - shuttle.dock_target_station = "escape_pod_6_berth" - shuttle.dock_target_offsite = "escape_pod_6_recovery" - shuttle.transit_direction = NORTH //should this be WEST? I have no idea. - shuttle.move_time = SHUTTLE_TRANSIT_DURATION_RETURN + rand(-30, 60) //randomize this so it seems like the pods are being picked up one by one - process_shuttles += shuttle - shuttles["Escape Pod 6"] = shuttle - - shuttle = new/datum/shuttle/ferry/escape_pod() - shuttle.location = 0 - shuttle.warmup_time = 0 - shuttle.area_station = locate(/area/shuttle/cryo/station) - shuttle.area_offsite = locate(/area/shuttle/cryo/centcom) - shuttle.area_transition = locate(/area/shuttle/cryo/transit) - shuttle.docking_controller_tag = "cryostorage_shuttle" - shuttle.dock_target_station = "cryostorage_shuttle_berth" - shuttle.dock_target_offsite = "cryostorage_shuttle_recovery" - shuttle.transit_direction = NORTH //should this be WEST? I have no idea. - shuttle.move_time = SHUTTLE_TRANSIT_DURATION_RETURN + rand(-30, 60) //randomize this so it seems like the pods are being picked up one by one - process_shuttles += shuttle - shuttles["Cryostorage Shuttle"] = shuttle - - shuttle = new/datum/shuttle/ferry/escape_pod() - shuttle.location = 0 - shuttle.warmup_time = 0 - shuttle.area_station = locate(/area/shuttle/large_escape_pod1/station) - shuttle.area_offsite = locate(/area/shuttle/large_escape_pod1/centcom) - shuttle.area_transition = locate(/area/shuttle/large_escape_pod1/transit) - shuttle.docking_controller_tag = "large_escape_pod_1" - shuttle.dock_target_station = "large_escape_pod_1_berth" - shuttle.dock_target_offsite = "large_escape_pod_1_recovery" - shuttle.transit_direction = EAST //should this be WEST? I have no idea. - shuttle.move_time = SHUTTLE_TRANSIT_DURATION_RETURN + rand(-30, 60) //randomize this so it seems like the pods are being picked up one by one - process_shuttles += shuttle - shuttles["Large Escape Pod 1"] = shuttle - - shuttle = new/datum/shuttle/ferry/escape_pod() - shuttle.location = 0 - shuttle.warmup_time = 0 - shuttle.area_station = locate(/area/shuttle/large_escape_pod2/station) - shuttle.area_offsite = locate(/area/shuttle/large_escape_pod2/centcom) - shuttle.area_transition = locate(/area/shuttle/large_escape_pod2/transit) - shuttle.docking_controller_tag = "large_escape_pod_2" - shuttle.dock_target_station = "large_escape_pod_2_berth" - shuttle.dock_target_offsite = "large_escape_pod_2_recovery" - shuttle.transit_direction = EAST //should this be WEST? I have no idea. - shuttle.move_time = SHUTTLE_TRANSIT_DURATION_RETURN + rand(-30, 60) //randomize this so it seems like the pods are being picked up one by one - process_shuttles += shuttle - shuttles["Large Escape Pod 2"] = shuttle - - //give the emergency shuttle controller it's shuttles - emergency_shuttle.shuttle = shuttles["Escape"] - emergency_shuttle.escape_pods = list( - shuttles["Escape Pod 1"], - shuttles["Escape Pod 2"], - shuttles["Escape Pod 3"], - shuttles["Escape Pod 4"], - shuttles["Escape Pod 5"], - shuttles["Escape Pod 6"], - shuttles["Cryostorage Shuttle"], - shuttles["Large Escape Pod 1"], - shuttles["Large Escape Pod 2"], - ) - - // Supply shuttle - shuttle = new/datum/shuttle/ferry/supply() - shuttle.location = 1 - shuttle.warmup_time = 10 - shuttle.area_offsite = locate(/area/supply/dock) - shuttle.area_station = locate(/area/supply/station) - shuttle.docking_controller_tag = "supply_shuttle" - shuttle.dock_target_station = "cargo_bay" - shuttles["Supply"] = shuttle - process_shuttles += shuttle - - supply_controller.shuttle = shuttle - - // Admin shuttles. - shuttle = new() - shuttle.location = 1 - shuttle.warmup_time = 10 - shuttle.area_offsite = locate(/area/shuttle/transport1/centcom) - shuttle.area_station = locate(/area/shuttle/transport1/station) - shuttle.docking_controller_tag = "centcom_shuttle" - shuttle.dock_target_station = "centcom_shuttle_dock_airlock" - shuttle.dock_target_offsite = "centcom_shuttle_bay" - shuttles["CentCom"] = shuttle - process_shuttles += shuttle - - shuttle = new() - shuttle.location = 1 - shuttle.warmup_time = 10 //want some warmup time so people can cancel. - shuttle.area_offsite = locate(/area/shuttle/administration/centcom) - shuttle.area_station = locate(/area/shuttle/administration/station) - shuttle.docking_controller_tag = "admin_shuttle" - shuttle.dock_target_station = "admin_shuttle_dock_airlock" - shuttle.dock_target_offsite = "admin_shuttle_bay" - shuttles["Administration"] = shuttle - process_shuttles += shuttle - - shuttle = new() - shuttle.location = 1 - shuttle.warmup_time = 10 //want some warmup time so people can cancel. - shuttle.area_offsite = locate(/area/shuttle/trade/centcom) - shuttle.area_station = locate(/area/shuttle/trade/station) - shuttle.docking_controller_tag = "trade_shuttle" - shuttle.dock_target_station = "trade_shuttle_dock_airlock" - shuttle.dock_target_offsite = "trade_shuttle_bay" - shuttles["Trade"] = shuttle - process_shuttles += shuttle - - shuttle = new() - shuttle.area_offsite = locate(/area/shuttle/alien/base) - shuttle.area_station = locate(/area/shuttle/alien/mine) - shuttles["Alien"] = shuttle - //process_shuttles += shuttle //don't need to process this. It can only be moved using admin magic anyways. - - // Public shuttles - shuttle = new() - shuttle.warmup_time = 10 - shuttle.area_offsite = locate(/area/shuttle/constructionsite/site) - shuttle.area_station = locate(/area/shuttle/constructionsite/station) - shuttle.docking_controller_tag = "engineering_shuttle" - shuttle.dock_target_station = "engineering_dock_airlock" - shuttle.dock_target_offsite = "edock_airlock" - shuttles["Engineering"] = shuttle - process_shuttles += shuttle - - shuttle = new() - shuttle.warmup_time = 10 - shuttle.area_offsite = locate(/area/shuttle/mining/outpost) - shuttle.area_station = locate(/area/shuttle/mining/station) - shuttle.docking_controller_tag = "mining_shuttle" - shuttle.dock_target_station = "mining_dock_airlock" - shuttle.dock_target_offsite = "mining_outpost_airlock" - shuttles["Mining"] = shuttle - process_shuttles += shuttle - - shuttle = new() - shuttle.warmup_time = 10 - shuttle.area_offsite = locate(/area/shuttle/research/outpost) - shuttle.area_station = locate(/area/shuttle/research/station) - shuttle.docking_controller_tag = "research_shuttle" - shuttle.dock_target_station = "research_dock_airlock" - shuttle.dock_target_offsite = "research_outpost_dock" - shuttles["Research"] = shuttle - process_shuttles += shuttle - - // ERT Shuttle - var/datum/shuttle/ferry/multidock/specops/ERT = new() - ERT.location = 0 - ERT.warmup_time = 10 - ERT.area_offsite = locate(/area/shuttle/specops/station) //centcom is the home station, the player station is offsite - ERT.area_station = locate(/area/shuttle/specops/centcom) - ERT.docking_controller_tag = "specops_shuttle_port" - ERT.docking_controller_tag_station = "specops_shuttle_port" - ERT.docking_controller_tag_offsite = "specops_shuttle_fore" - ERT.dock_target_station = "specops_centcom_dock" - ERT.dock_target_offsite = "specops_dock_airlock" - shuttles["Special Operations"] = ERT - process_shuttles += ERT - - //Skipjack. - var/datum/shuttle/multi_shuttle/VS = new/datum/shuttle/multi_shuttle() - VS.origin = locate(/area/skipjack_station/start) - - VS.destinations = list( - "Fore Starboard Solars" = locate(/area/skipjack_station/northeast_solars), - "Fore Port Solars" = locate(/area/skipjack_station/northwest_solars), - "Aft Starboard Solars" = locate(/area/skipjack_station/southeast_solars), - "Aft Port Solars" = locate(/area/skipjack_station/southwest_solars), - "Mining Station" = locate(/area/skipjack_station/mining) - ) - - VS.announcer = "Colony Automated Radar Array" - VS.arrival_message = "Attention. Unidentified object approaching the colony." - VS.departure_message = "Attention. Unidentified object exiting local space. Unidentified object expected to escape Kara gravity well with current velocity." - VS.interim = locate(/area/skipjack_station/transit) - - VS.warmup_time = 0 - shuttles["Skipjack"] = VS - - //Nuke Ops shuttle. - var/datum/shuttle/multi_shuttle/MS = new/datum/shuttle/multi_shuttle() - MS.origin = locate(/area/syndicate_station/start) - MS.start_location = "Mercenary Base" - - MS.destinations = list( - "Northwest of the station" = locate(/area/syndicate_station/northwest), - "North of the station" = locate(/area/syndicate_station/north), - "Northeast of the station" = locate(/area/syndicate_station/northeast), - "Southwest of the station" = locate(/area/syndicate_station/southwest), - "South of the station" = locate(/area/syndicate_station/south), - "Southeast of the station" = locate(/area/syndicate_station/southeast), - "Telecomms Satellite" = locate(/area/syndicate_station/commssat), - "Mining Station" = locate(/area/syndicate_station/mining), - "Arrivals dock" = locate(/area/syndicate_station/arrivals_dock), - ) - - MS.docking_controller_tag = "merc_shuttle" - MS.destination_dock_targets = list( - "Mercenary Base" = "merc_base", - "Arrivals dock" = "nuke_shuttle_dock_airlock", - ) - - MS.announcer = "Automated Traffic Control" - MS.arrival_message = "Attention. A vessel is approaching the colony." - MS.departure_message = "Attention. A vessel is now leaving from the colony." - MS.interim = locate(/area/syndicate_station/transit) - - MS.warmup_time = 0 - shuttles["Mercenary"] = MS - diff --git a/code/modules/shuttles/_defines.dm b/code/modules/shuttles/_defines.dm new file mode 100644 index 0000000000..ad8c39466b --- /dev/null +++ b/code/modules/shuttles/_defines.dm @@ -0,0 +1,4 @@ +#define SHUTTLE_FLAGS_NONE 0 +#define SHUTTLE_FLAGS_PROCESS 1 +#define SHUTTLE_FLAGS_SUPPLY 2 +#define SHUTTLE_FLAGS_ALL (~SHUTTLE_FLAGS_NONE) \ No newline at end of file diff --git a/code/modules/shuttles/escape_pods.dm b/code/modules/shuttles/escape_pods.dm index fd6aabc4a2..b832e94dbd 100644 --- a/code/modules/shuttles/escape_pods.dm +++ b/code/modules/shuttles/escape_pods.dm @@ -1,16 +1,24 @@ /datum/shuttle/ferry/escape_pod var/datum/computer/file/embedded_program/docking/simple/escape_pod/arming_controller + category = /datum/shuttle/ferry/escape_pod + +/datum/shuttle/ferry/escape_pod/New() + move_time = move_time + rand(-30, 60) + if(name in emergency_shuttle.escape_pods) + CRASH("An escape pod with the name '[name]' has already been defined.") + emergency_shuttle.escape_pods[name] = src + ..() /datum/shuttle/ferry/escape_pod/init_docking_controllers() ..() arming_controller = locate(dock_target_station) if(!istype(arming_controller)) - world << "warning: escape pod with station dock tag [dock_target_station] could not find it's dock target!" - + warning("warning: escape pod with station dock tag [dock_target_station] could not find it's dock target!") + if(docking_controller) var/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod/controller_master = docking_controller.master if(!istype(controller_master)) - world << "warning: escape pod with docking tag [docking_controller_tag] could not find it's controller master!" + warning("warning: escape pod with docking tag [docking_controller_tag] could not find it's controller master!") else controller_master.pod = src @@ -29,7 +37,7 @@ /datum/shuttle/ferry/escape_pod/can_cancel() return 0 - + //This controller goes on the escape pod itself /obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod name = "escape pod controller" @@ -58,7 +66,7 @@ /obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod/Topic(href, href_list) if(..()) return 1 - + if("manual_arm") pod.arming_controller.arm() if("force_launch") @@ -87,7 +95,7 @@ if (istype(docking_program, /datum/computer/file/embedded_program/docking/simple/escape_pod)) var/datum/computer/file/embedded_program/docking/simple/escape_pod/P = docking_program armed = P.armed - + data = list( "docking_status" = docking_program.get_docking_status(), "override_enabled" = docking_program.override_enabled, diff --git a/code/modules/shuttles/shuttle.dm b/code/modules/shuttles/shuttle.dm index 8c6e611886..f7f655ba4d 100644 --- a/code/modules/shuttles/shuttle.dm +++ b/code/modules/shuttles/shuttle.dm @@ -4,6 +4,7 @@ //shuttle moving state defines are in setup.dm /datum/shuttle + var/name = "" var/warmup_time = 0 var/moving_status = SHUTTLE_IDLE @@ -12,6 +13,28 @@ var/arrive_time = 0 //the time at which the shuttle arrives when long jumping + var/flags = SHUTTLE_FLAGS_PROCESS + var/category = /datum/shuttle + +/datum/shuttle/New() + ..() + if(src.name in shuttle_controller.shuttles) + CRASH("A shuttle with the name '[name]' is already defined.") + shuttle_controller.shuttles[src.name] = src + if(flags & SHUTTLE_FLAGS_PROCESS) + shuttle_controller.process_shuttles += src + if(flags & SHUTTLE_FLAGS_SUPPLY) + if(supply_controller.shuttle) + CRASH("A supply shuttle is already defined.") + supply_controller.shuttle = src + +/datum/shuttle/Destroy() + shuttle_controller.shuttles -= src.name + shuttle_controller.process_shuttles -= src + if(supply_controller.shuttle == src) + supply_controller.shuttle = null + . = ..() + /datum/shuttle/proc/init_docking_controllers() if(docking_controller_tag) docking_controller = locate(docking_controller_tag) diff --git a/code/modules/shuttles/shuttle_emergency.dm b/code/modules/shuttles/shuttle_emergency.dm index beea1781b4..347243ae5c 100644 --- a/code/modules/shuttles/shuttle_emergency.dm +++ b/code/modules/shuttles/shuttle_emergency.dm @@ -1,5 +1,11 @@ /datum/shuttle/ferry/emergency - //pass + category = /datum/shuttle/ferry/emergency + +/datum/shuttle/ferry/emergency/New() + if(emergency_shuttle.shuttle) + CRASH("An emergency shuttle has already been defined.") + emergency_shuttle.shuttle = src + ..() /datum/shuttle/ferry/emergency/arrived() if (istype(in_use, /obj/machinery/computer/shuttle_control/emergency)) diff --git a/code/modules/shuttles/shuttle_ferry.dm b/code/modules/shuttles/shuttle_ferry.dm index 0a288a1ba9..d076357735 100644 --- a/code/modules/shuttles/shuttle_ferry.dm +++ b/code/modules/shuttles/shuttle_ferry.dm @@ -11,13 +11,21 @@ var/move_time = 0 //the time spent in the transition area var/transit_direction = null //needed for area/move_contents_to() to properly handle shuttle corners - not exactly sure how it works. - var/area_station - var/area_offsite + var/area/area_station + var/area/area_offsite //TODO: change location to a string and use a mapping for area and dock targets. var/dock_target_station var/dock_target_offsite var/last_dock_attempt_time = 0 + category = /datum/shuttle/ferry + +/datum/shuttle/ferry/New() + area_offsite = locate(area_offsite) + area_station = locate(area_station) + if(area_transition) + area_transition = locate(area_transition) + ..() /datum/shuttle/ferry/short_jump(var/area/origin,var/area/destination) if(isnull(location)) diff --git a/code/modules/shuttles/shuttle_specops.dm b/code/modules/shuttles/shuttle_specops.dm index 434bb37f42..d9cc121f79 100644 --- a/code/modules/shuttles/shuttle_specops.dm +++ b/code/modules/shuttles/shuttle_specops.dm @@ -13,16 +13,17 @@ var/docking_controller_tag_offsite var/datum/computer/file/embedded_program/docking/docking_controller_station var/datum/computer/file/embedded_program/docking/docking_controller_offsite + category = /datum/shuttle/ferry/multidock /datum/shuttle/ferry/multidock/init_docking_controllers() if(docking_controller_tag_station) docking_controller_station = locate(docking_controller_tag_station) if(!istype(docking_controller_station)) - world << "warning: shuttle with docking tag [docking_controller_station] could not find it's controller!" + warning("warning: shuttle with docking tag [docking_controller_station] could not find it's controller!") if(docking_controller_tag_offsite) docking_controller_offsite = locate(docking_controller_tag_offsite) if(!istype(docking_controller_offsite)) - world << "warning: shuttle with docking tag [docking_controller_offsite] could not find it's controller!" + warning("warning: shuttle with docking tag [docking_controller_offsite] could not find it's controller!") if (!location) docking_controller = docking_controller_station else @@ -43,6 +44,7 @@ var/reset_time = 0 //the world.time at which the shuttle will be ready to move again. var/launch_prep = 0 var/cancel_countdown = 0 + category = /datum/shuttle/ferry/multidock/specops /datum/shuttle/ferry/multidock/specops/New() ..() diff --git a/code/modules/shuttles/shuttle_supply.dm b/code/modules/shuttles/shuttle_supply.dm index c4122434e7..9a6b7f3380 100644 --- a/code/modules/shuttles/shuttle_supply.dm +++ b/code/modules/shuttles/shuttle_supply.dm @@ -2,11 +2,12 @@ var/away_location = 1 //the location to hide at while pretending to be in-transit var/late_chance = 80 var/max_late_time = 300 + category = /datum/shuttle/ferry/supply /datum/shuttle/ferry/supply/short_jump(var/area/origin,var/area/destination) if(moving_status != SHUTTLE_IDLE) return - + if(isnull(location)) return @@ -18,21 +19,21 @@ //it would be cool to play a sound here moving_status = SHUTTLE_WARMUP spawn(warmup_time*10) - if (moving_status == SHUTTLE_IDLE) + if (moving_status == SHUTTLE_IDLE) return //someone cancelled the launch - + if (at_station() && forbidden_atoms_check()) //cancel the launch because of forbidden atoms. announce over supply channel? moving_status = SHUTTLE_IDLE return - + if (!at_station()) //at centcom supply_controller.buy() - + //We pretend it's a long_jump by making the shuttle stay at centcom for the "in-transit" period. var/area/away_area = get_location_area(away_location) moving_status = SHUTTLE_INTRANSIT - + //If we are at the away_area then we are just pretending to move, otherwise actually do the move if (origin != away_area) move(origin, away_area) @@ -46,11 +47,11 @@ //late if (prob(late_chance)) sleep(rand(0,max_late_time)) - + move(away_area, destination) - + moving_status = SHUTTLE_IDLE - + if (!at_station()) //at centcom supply_controller.sell() @@ -58,7 +59,7 @@ /datum/shuttle/ferry/supply/proc/forbidden_atoms_check() if (!at_station()) return 0 //if badmins want to send mobs or a nuke on the supply shuttle from centcom we don't care - + return supply_controller.forbidden_atoms_check(get_location_area()) /datum/shuttle/ferry/supply/proc/at_station() diff --git a/code/modules/shuttles/shuttles_multi.dm b/code/modules/shuttles/shuttles_multi.dm index 47b430329a..9dc7e4312e 100644 --- a/code/modules/shuttles/shuttles_multi.dm +++ b/code/modules/shuttles/shuttles_multi.dm @@ -1,6 +1,7 @@ //This is a holder for things like the Skipjack and Nuke shuttle. /datum/shuttle/multi_shuttle + flags = SHUTTLE_FLAGS_NONE var/cloaked = 1 var/at_origin = 1 var/returned_home = 0 @@ -22,8 +23,13 @@ var/list/destination_dock_targets = list() var/area/origin var/return_warning = 0 + category = /datum/shuttle/multi_shuttle /datum/shuttle/multi_shuttle/New() + origin = locate(origin) + interim = locate(interim) + for(var/destination in destinations) + destinations[destination] = locate(destinations[destination]) ..() /datum/shuttle/multi_shuttle/init_docking_controllers() @@ -36,7 +42,7 @@ var/datum/computer/file/embedded_program/docking/C = locate(controller_tag) if(!istype(C)) - world << "warning: shuttle with docking tag [controller_tag] could not find it's controller!" + warning("warning: shuttle with docking tag [controller_tag] could not find it's controller!") else destination_dock_controllers[destination] = C diff --git a/maps/northern_star/northern_star.dm b/maps/northern_star/northern_star.dm index 2212774657..fe95bbaeb6 100644 --- a/maps/northern_star/northern_star.dm +++ b/maps/northern_star/northern_star.dm @@ -7,6 +7,7 @@ #include "polaris-5.dmm" #include "northern_star_defines.dm" + #include "northern_star_shuttles.dm" #define USING_MAP_DATUM /datum/map/northern_star diff --git a/maps/northern_star/northern_star_shuttles.dm b/maps/northern_star/northern_star_shuttles.dm new file mode 100644 index 0000000000..44a5e1a5bd --- /dev/null +++ b/maps/northern_star/northern_star_shuttles.dm @@ -0,0 +1,272 @@ +// Escape shuttle and pods +/datum/shuttle/ferry/emergency/centcom + name = "Escape" + location = 1 + warmup_time = 10 + area_offsite = /area/shuttle/escape/centcom + area_station = /area/shuttle/escape/station + area_transition = /area/shuttle/escape/transit + docking_controller_tag = "escape_shuttle" + dock_target_station = "escape_dock" + dock_target_offsite = "centcom_dock" + transit_direction = NORTH + move_time = SHUTTLE_TRANSIT_DURATION_RETURN + +/datum/shuttle/ferry/escape_pod/escape_pod_one + name = "Escape Pod 1" + location = 0 + warmup_time = 0 + area_station = /area/shuttle/escape_pod1/station + area_offsite = /area/shuttle/escape_pod1/centcom + area_transition = /area/shuttle/escape_pod1/transit + docking_controller_tag = "escape_pod_1" + dock_target_station = "escape_pod_1_berth" + dock_target_offsite = "escape_pod_1_recovery" + transit_direction = NORTH + move_time = SHUTTLE_TRANSIT_DURATION_RETURN + +/datum/shuttle/ferry/escape_pod/escape_pod_two + name = "Escape Pod 2" + location = 0 + warmup_time = 0 + area_station = /area/shuttle/escape_pod2/station + area_offsite = /area/shuttle/escape_pod2/centcom + area_transition = /area/shuttle/escape_pod2/transit + docking_controller_tag = "escape_pod_2" + dock_target_station = "escape_pod_2_berth" + dock_target_offsite = "escape_pod_2_recovery" + transit_direction = NORTH + move_time = SHUTTLE_TRANSIT_DURATION_RETURN + +/datum/shuttle/ferry/escape_pod/escape_pod_three + name = "Escape Pod 3" + location = 0 + warmup_time = 0 + area_station = /area/shuttle/escape_pod3/station + area_offsite = /area/shuttle/escape_pod3/centcom + area_transition = /area/shuttle/escape_pod3/transit + docking_controller_tag = "escape_pod_3" + dock_target_station = "escape_pod_3_berth" + dock_target_offsite = "escape_pod_3_recovery" + transit_direction = NORTH + move_time = SHUTTLE_TRANSIT_DURATION_RETURN + +/datum/shuttle/ferry/escape_pod/escape_pod_four + name = "Escape Pod 4" + location = 0 + warmup_time = 0 + area_station = /area/shuttle/escape_pod4/station + area_offsite = /area/shuttle/escape_pod4/centcom + area_transition = /area/shuttle/escape_pod4/transit + docking_controller_tag = "escape_pod_4" + dock_target_station = "escape_pod_4_berth" + dock_target_offsite = "escape_pod_4_recovery" + transit_direction = NORTH //should this be SOUTH? I have no idea. + move_time = SHUTTLE_TRANSIT_DURATION_RETURN + +/datum/shuttle/ferry/escape_pod/escape_pod_five + name = "Escape Pod 5" + location = 0 + warmup_time = 0 + area_station = /area/shuttle/escape_pod5/station + area_offsite = /area/shuttle/escape_pod5/centcom + area_transition = /area/shuttle/escape_pod5/transit + docking_controller_tag = "escape_pod_5" + dock_target_station = "escape_pod_5_berth" + dock_target_offsite = "escape_pod_5_recovery" + transit_direction = NORTH //should this be WEST? I have no idea. + move_time = SHUTTLE_TRANSIT_DURATION_RETURN + +/datum/shuttle/ferry/escape_pod/escape_pod_six + name = "Escape Pod 6" + location = 0 + warmup_time = 0 + area_station = /area/shuttle/escape_pod6/station + area_offsite = /area/shuttle/escape_pod6/centcom + area_transition = /area/shuttle/escape_pod6/transit + docking_controller_tag = "escape_pod_6" + dock_target_station = "escape_pod_6_berth" + dock_target_offsite = "escape_pod_6_recovery" + transit_direction = NORTH //should this be WEST? I have no idea. + move_time = SHUTTLE_TRANSIT_DURATION_RETURN + +/datum/shuttle/ferry/escape_pod/escape_pod_cryo + name = "Cryostorage Shuttle" + location = 0 + warmup_time = 0 + area_station = /area/shuttle/cryo/station + area_offsite = /area/shuttle/cryo/centcom + area_transition = /area/shuttle/cryo/transit + docking_controller_tag = "cryostorage_shuttle" + dock_target_station = "cryostorage_shuttle_berth" + dock_target_offsite = "cryostorage_shuttle_recovery" + transit_direction = NORTH + move_time = SHUTTLE_TRANSIT_DURATION_RETURN + +/datum/shuttle/ferry/escape_pod/large_escape_pod1 + name = "Large Escape Pod 1" + location = 0 + warmup_time = 0 + area_station = /area/shuttle/large_escape_pod1/station + area_offsite = /area/shuttle/large_escape_pod1/centcom + area_transition = /area/shuttle/large_escape_pod1/transit + docking_controller_tag = "large_escape_pod_1" + dock_target_station = "large_escape_pod_1_berth" + dock_target_offsite = "large_escape_pod_1_recovery" + transit_direction = EAST + move_time = SHUTTLE_TRANSIT_DURATION_RETURN + +/datum/shuttle/ferry/escape_pod/large_escape_pod2 + name = "Large Escape Pod 2" + location = 0 + warmup_time = 0 + area_station = /area/shuttle/large_escape_pod2/station + area_offsite = /area/shuttle/large_escape_pod2/centcom + area_transition = /area/shuttle/large_escape_pod2/transit + docking_controller_tag = "large_escape_pod_2" + dock_target_station = "large_escape_pod_2_berth" + dock_target_offsite = "large_escape_pod_2_recovery" + transit_direction = EAST + move_time = SHUTTLE_TRANSIT_DURATION_RETURN + +// Cargo shuttle. +/datum/shuttle/ferry/supply/cargo + name = "Supply" + location = 1 + warmup_time = 10 + area_offsite = /area/supply/dock + area_station = /area/supply/station + docking_controller_tag = "supply_shuttle" + dock_target_station = "cargo_bay" + flags = SHUTTLE_FLAGS_PROCESS|SHUTTLE_FLAGS_SUPPLY + +// The "Elevators" +/datum/shuttle/ferry/engineering + name = "Engineering" + warmup_time = 10 + area_offsite = /area/shuttle/constructionsite/site + area_station = /area/shuttle/constructionsite/station + docking_controller_tag = "engineering_shuttle" + dock_target_station = "engineering_dock_airlock" + dock_target_offsite = "edock_airlock" + +/datum/shuttle/ferry/mining + name = "Mining" + warmup_time = 10 + area_offsite = /area/shuttle/mining/outpost + area_station = /area/shuttle/mining/station + docking_controller_tag = "mining_shuttle" + dock_target_station = "mining_dock_airlock" + dock_target_offsite = "mining_outpost_airlock" + +/datum/shuttle/ferry/research + name = "Research" + warmup_time = 10 + area_offsite = /area/shuttle/research/outpost + area_station = /area/shuttle/research/station + docking_controller_tag = "research_shuttle" + dock_target_station = "research_dock_airlock" + dock_target_offsite = "research_outpost_dock" + +// Admin shuttles. +/datum/shuttle/ferry/centcom + name = "Centcom" + location = 1 + warmup_time = 10 + area_offsite = /area/shuttle/transport1/centcom + area_station = /area/shuttle/transport1/station + docking_controller_tag = "centcom_shuttle" + dock_target_station = "centcom_shuttle_dock_airlock" + dock_target_offsite = "centcom_shuttle_bay" + +/datum/shuttle/ferry/administration + name = "Administration" + location = 1 + warmup_time = 10 //want some warmup time so people can cancel. + area_offsite = /area/shuttle/administration/centcom + area_station = /area/shuttle/administration/station + docking_controller_tag = "admin_shuttle" + dock_target_station = "admin_shuttle_dock_airlock" + dock_target_offsite = "admin_shuttle_bay" + +// Traders +/datum/shuttle/ferry/trade + name = "Trade" + location = 1 + warmup_time = 10 //want some warmup time so people can cancel. + area_offsite = /area/shuttle/trade/centcom + area_station = /area/shuttle/trade/station + docking_controller_tag = "trade_shuttle" + dock_target_station = "trade_shuttle_dock_airlock" + dock_target_offsite = "trade_shuttle_bay" + +// Is this even used? +/datum/shuttle/ferry/alien + name = "Alien" + area_offsite = /area/shuttle/alien/base + area_station = /area/shuttle/alien/mine + flags = SHUTTLE_FLAGS_NONE + +// Mercenary +/datum/shuttle/multi_shuttle/mercenary + name = "Mercenary" + warmup_time = 0 + origin = /area/syndicate_station/start + interim = /area/syndicate_station/transit + start_location = "Mercenary Base" + destinations = list( + "Northwest of the station" = /area/syndicate_station/northwest, + "North of the station" = /area/syndicate_station/north, + "Northeast of the station" = /area/syndicate_station/northeast, + "Southwest of the station" = /area/syndicate_station/southwest, + "South of the station" = /area/syndicate_station/south, + "Southeast of the station" = /area/syndicate_station/southeast, + "Telecomms Satellite" = /area/syndicate_station/commssat, + "Mining Station" = /area/syndicate_station/mining, + "Arrivals dock" = /area/syndicate_station/arrivals_dock, + ) + docking_controller_tag = "merc_shuttle" + destination_dock_targets = list( + "Mercenary Base" = "merc_base", + "Arrivals dock" = "nuke_shuttle_dock_airlock", + ) + announcer = "Automated Traffic Control" + +/datum/shuttle/multi_shuttle/mercenary/New() + arrival_message = "Attention. A vessel is approaching the colony." + departure_message = "Attention. A vessel is now leaving from the colony." + ..() + +// Heist +/datum/shuttle/multi_shuttle/skipjack + name = "Skipjack" + warmup_time = 0 + origin = /area/skipjack_station/start + interim = /area/skipjack_station/transit + destinations = list( + "Fore Starboard Solars" = /area/skipjack_station/northeast_solars, + "Fore Port Solars" = /area/skipjack_station/northwest_solars, + "Aft Starboard Solars" = /area/skipjack_station/southeast_solars, + "Aft Port Solars" = /area/skipjack_station/southwest_solars, + "Mining Station" = /area/skipjack_station/mining + ) + announcer = "Automated Traffic Control" + +/datum/shuttle/multi_shuttle/skipjack/New() + arrival_message = "Attention. Unidentified object approaching the colony." + departure_message = "Attention. Unidentified object exiting local space. Unidentified object expected to escape Kara gravity well with current velocity." + ..() + +/datum/shuttle/ferry/multidock/specops/ert + name = "Special Operations" + location = 0 + warmup_time = 10 + area_offsite = /area/shuttle/specops/station //centcom is the home station, the Exodus is offsite + area_station = /area/shuttle/specops/centcom + docking_controller_tag = "specops_shuttle_port" + docking_controller_tag_station = "specops_shuttle_port" + docking_controller_tag_offsite = "specops_shuttle_fore" + dock_target_station = "specops_centcom_dock" + dock_target_offsite = "specops_dock_airlock" + + diff --git a/polaris.dme b/polaris.dme index 3b49b9566b..c9e1935850 100644 --- a/polaris.dme +++ b/polaris.dme @@ -2039,6 +2039,7 @@ #include "code\modules\shieldgen\shield_diffuser.dm" #include "code\modules\shieldgen\shield_gen.dm" #include "code\modules\shieldgen\shield_gen_external.dm" +#include "code\modules\shuttles\_defines.dm" #include "code\modules\shuttles\antagonist.dm" #include "code\modules\shuttles\departmental.dm" #include "code\modules\shuttles\escape_pods.dm" From c4c5dc098aa4cf6737352d2489e5a16c78513e22 Mon Sep 17 00:00:00 2001 From: Leshana Date: Thu, 8 Jun 2017 17:51:15 -0400 Subject: [PATCH 77/82] Fix runtimes in radiation controller * Fixes Baystation12/Baystation12/issues/17443 - Runtime in radiation.dm,30: illegal: sqrt(-2.857143) * Updating radiation power to below zero should simply delete the source. * Fixes at least one cause of Runtime in radiation.dm,41: Cannot read null.z in an effort to fix Baystation12/Baystation12/issues/17411 --- code/datums/repositories/radiation.dm | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/code/datums/repositories/radiation.dm b/code/datums/repositories/radiation.dm index 00c3532458..4e3259a6de 100644 --- a/code/datums/repositories/radiation.dm +++ b/code/datums/repositories/radiation.dm @@ -23,11 +23,14 @@ var/global/repository/radiation/radiation_repository = new() . = ..() /datum/radiation_source/proc/update_rad_power(var/new_power = null) - if(new_power != null && new_power != rad_power) + if(new_power == null || new_power == rad_power) + return // No change + else if(new_power <= 0) + qdel(src) // Decayed to nothing + else rad_power = new_power - . = 1 - if(. && !flat) - range = min(round(sqrt(rad_power / config.radiation_lower_limit)), 31) // R = rad_power / dist**2 - Solve for dist + if(!flat) + range = min(round(sqrt(rad_power / config.radiation_lower_limit)), 31) // R = rad_power / dist**2 - Solve for dist // Ray trace from all active radiation sources to T and return the strongest effect. /repository/radiation/proc/get_rads_at_turf(var/turf/T) @@ -65,6 +68,8 @@ var/global/repository/radiation/radiation_repository = new() // Add a radiation source instance to the repository. It will override any existing source on the same turf. /repository/radiation/proc/add_source(var/datum/radiation_source/S) + if(!isturf(S.source_turf)) + return var/datum/radiation_source/existing = sources_assoc[S.source_turf] if(existing) qdel(existing) From 2cd91c8bfcf68b845f6e5c9ae96a31fdc2b127dd Mon Sep 17 00:00:00 2001 From: Leshana Date: Sun, 11 Jun 2017 22:10:15 -0400 Subject: [PATCH 78/82] Fix /datum/scheduled_task was unable to be GC'd and was deleted. In addition to fixing the problem, it makes sense. The observer pattern is overkill for an object type we own; doing it directly in Destroy() is more efficient. --- code/controllers/Processes/scheduler.dm | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/code/controllers/Processes/scheduler.dm b/code/controllers/Processes/scheduler.dm index fb9f85d7c4..6031f2f4fe 100644 --- a/code/controllers/Processes/scheduler.dm +++ b/code/controllers/Processes/scheduler.dm @@ -46,12 +46,9 @@ /datum/controller/process/scheduler/proc/schedule(var/datum/scheduled_task/st) scheduled_tasks += st - destroyed_event.register(st, src, /datum/controller/process/scheduler/proc/unschedule) /datum/controller/process/scheduler/proc/unschedule(var/datum/scheduled_task/st) - if(st in scheduled_tasks) - scheduled_tasks -= st - destroyed_event.unregister(st, src) + scheduled_tasks -= st /********** * Helpers * @@ -102,6 +99,7 @@ task_after_process_args += src /datum/scheduled_task/Destroy() + scheduler.unschedule(src) procedure = null arguments.Cut() task_after_process = null From 4b46703d9d613f6ea2e67aa97b913bd8dacc6d1b Mon Sep 17 00:00:00 2001 From: Leshana Date: Sun, 11 Jun 2017 23:46:45 -0400 Subject: [PATCH 79/82] A plethora of Destroy() fixes - return qdel hints and clean stuff up. --- code/game/machinery/cryopod.dm | 2 +- code/game/machinery/doors/windowdoor.dm | 2 +- code/game/objects/items/devices/PDA/radio.dm | 2 +- .../items/devices/communicator/communicator.dm | 2 +- code/game/objects/items/devices/flashlight.dm | 2 +- code/game/objects/items/devices/paicard.dm | 3 ++- code/game/objects/items/devices/radio/jammer.dm | 6 ++---- code/game/objects/structures/inflatable.dm | 2 +- code/modules/clothing/suits/storage.dm | 5 ++--- code/modules/hydroponics/spreading/spreading.dm | 3 ++- .../integrated_electronics/subtypes/input_output.dm | 12 +++++------- code/modules/mob/dead/observer/observer.dm | 2 +- code/modules/mob/living/carbon/brain/MMI.dm | 6 ++---- code/modules/projectiles/guns/energy.dm | 2 +- code/modules/recycling/sortingmachinery.dm | 13 +++++-------- code/modules/shieldgen/energy_field.dm | 13 ++++++------- code/modules/shieldgen/shield_gen.dm | 6 ++---- 17 files changed, 36 insertions(+), 47 deletions(-) diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 672a6a425b..72c9ae47af 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -314,7 +314,7 @@ if(occupant) occupant.forceMove(loc) occupant.resting = 1 - ..() + return ..() /obj/machinery/cryopod/initialize() ..() diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 13352a1645..32ad7a2aae 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -60,7 +60,7 @@ /obj/machinery/door/window/Destroy() density = 0 update_nearby_tiles() - ..() + return ..() /obj/machinery/door/window/Bumped(atom/movable/AM as mob|obj) if (!( ismob(AM) )) diff --git a/code/game/objects/items/devices/PDA/radio.dm b/code/game/objects/items/devices/PDA/radio.dm index 5e7d63e1e9..33160a8ed0 100644 --- a/code/game/objects/items/devices/PDA/radio.dm +++ b/code/game/objects/items/devices/PDA/radio.dm @@ -103,7 +103,7 @@ /obj/item/radio/integrated/beepsky/Destroy() if(radio_controller) radio_controller.remove_object(src, control_freq) - ..() + return ..() /* * Radio Cartridge, essentially a signaler. diff --git a/code/game/objects/items/devices/communicator/communicator.dm b/code/game/objects/items/devices/communicator/communicator.dm index 6f8a4210be..49999f12de 100644 --- a/code/game/objects/items/devices/communicator/communicator.dm +++ b/code/game/objects/items/devices/communicator/communicator.dm @@ -256,7 +256,7 @@ var/global/list/obj/item/device/communicator/all_communicators = list() if(exonet) exonet.remove_address() exonet = null - ..() + return ..() // Proc: ui_interact() // Parameters: 4 (standard NanoUI arguments) diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index c3cbf5f7ef..996f848849 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -37,7 +37,7 @@ /obj/item/device/flashlight/Destroy() if(power_use) processing_objects -= src - ..() + return ..() /obj/item/device/flashlight/verb/toggle() set name = "Toggle Flashlight Brightness" diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm index e0e05ff467..8e1803ad40 100644 --- a/code/game/objects/items/devices/paicard.dm +++ b/code/game/objects/items/devices/paicard.dm @@ -27,7 +27,8 @@ //Will stop people throwing friend pAIs into the singularity so they can respawn if(!isnull(pai)) pai.death(0) - ..() + qdel_null(radio) + return ..() /obj/item/device/paicard/attack_self(mob/user) if (!in_range(src, user)) diff --git a/code/game/objects/items/devices/radio/jammer.dm b/code/game/objects/items/devices/radio/jammer.dm index 9e99e1837f..77879244d2 100644 --- a/code/game/objects/items/devices/radio/jammer.dm +++ b/code/game/objects/items/devices/radio/jammer.dm @@ -33,10 +33,8 @@ var/global/list/active_radio_jammers = list() /obj/item/device/radio_jammer/Destroy() if(on) turn_off() - if(power_source) - qdel(power_source) - power_source = null - ..() + qdel_null(power_source) + return ..() /obj/item/device/radio_jammer/proc/turn_off(mob/user) if(user) diff --git a/code/game/objects/structures/inflatable.dm b/code/game/objects/structures/inflatable.dm index 7fd68c305a..065b637e10 100644 --- a/code/game/objects/structures/inflatable.dm +++ b/code/game/objects/structures/inflatable.dm @@ -38,7 +38,7 @@ /obj/structure/inflatable/Destroy() update_nearby_tiles() - ..() + return ..() /obj/structure/inflatable/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) return 0 diff --git a/code/modules/clothing/suits/storage.dm b/code/modules/clothing/suits/storage.dm index be7da66f84..ca630dae77 100644 --- a/code/modules/clothing/suits/storage.dm +++ b/code/modules/clothing/suits/storage.dm @@ -8,9 +8,8 @@ pockets.max_storage_space = ITEMSIZE_COST_SMALL * 2 /obj/item/clothing/suit/storage/Destroy() - qdel(pockets) - pockets = null - ..() + qdel_null(pockets) + return ..() /obj/item/clothing/suit/storage/attack_hand(mob/user as mob) if (pockets.handle_attack_hand(user)) diff --git a/code/modules/hydroponics/spreading/spreading.dm b/code/modules/hydroponics/spreading/spreading.dm index 1cff4314af..b66abd61da 100644 --- a/code/modules/hydroponics/spreading/spreading.dm +++ b/code/modules/hydroponics/spreading/spreading.dm @@ -77,7 +77,8 @@ plant_controller.remove_plant(src) for(var/obj/effect/plant/neighbor in range(1,src)) plant_controller.add_plant(neighbor) - ..() + return ..() + /obj/effect/plant/single spread_chance = 0 diff --git a/code/modules/integrated_electronics/subtypes/input_output.dm b/code/modules/integrated_electronics/subtypes/input_output.dm index 456fae889f..1a4fdb7c45 100644 --- a/code/modules/integrated_electronics/subtypes/input_output.dm +++ b/code/modules/integrated_electronics/subtypes/input_output.dm @@ -304,7 +304,8 @@ if(exonet) exonet.remove_address() qdel(exonet) - ..() + exonet = null + return ..() /obj/item/integrated_circuit/input/EPv2/do_work() var/target_address = get_pin_data(IC_INPUT, 1) @@ -370,7 +371,7 @@ /obj/item/integrated_circuit/input/microphone/Destroy() listening_objects -= src - ..() + return ..() /obj/item/integrated_circuit/input/microphone/hear_talk(mob/living/M, msg, var/verb="says", datum/language/speaking=null) var/translated = FALSE @@ -483,9 +484,6 @@ var/light_rgb = "#FFFFFF" power_draw_idle = 0 // Adjusted based on brightness. -/obj/item/integrated_circuit/output/light/Destroy() - ..() - /obj/item/integrated_circuit/output/light/do_work() light_toggled = !light_toggled update_lighting() @@ -644,8 +642,8 @@ on_data_written() /obj/item/integrated_circuit/output/video_camera/Destroy() - qdel(camera) - ..() + qdel_null(camera) + return ..() /obj/item/integrated_circuit/output/video_camera/proc/set_camera_status(var/status) if(camera) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 4384151cbd..1928e8ea5d 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -132,7 +132,7 @@ var/global/list/image/ghost_sightless_images = list() //this is a list of images qdel(ghostimage) ghostimage = null updateallghostimages() - ..() + return ..() /mob/observer/dead/Topic(href, href_list) if (href_list["track"]) diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm index e74d6dab90..687fb7626d 100644 --- a/code/modules/mob/living/carbon/brain/MMI.dm +++ b/code/modules/mob/living/carbon/brain/MMI.dm @@ -110,10 +110,8 @@ if(isrobot(loc)) var/mob/living/silicon/robot/borg = loc borg.mmi = null - if(brainmob) - qdel(brainmob) - brainmob = null - ..() + qdel_null(brainmob) + return ..() /obj/item/device/mmi/radio_enabled name = "radio-enabled man-machine interface" diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 5636b68b94..bddc1fe490 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -45,7 +45,7 @@ /obj/item/weapon/gun/energy/Destroy() if(self_recharge) processing_objects.Remove(src) - ..() + return ..() /obj/item/weapon/gun/energy/process() if(self_recharge) //Every [recharge_time] ticks, recharge a shot for the battery diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index be3cfa72a8..2e29fdcad3 100755 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -18,11 +18,7 @@ unwrap() proc/unwrap() - if(wrapped) //sometimes items can disappear. For example, bombs. --rastaf0 - wrapped.loc = (get_turf(src.loc)) - if(istype(wrapped, /obj/structure/closet)) - var/obj/structure/closet/O = wrapped - O.welded = 0 + // Destroy will drop our wrapped object on the turf, so let it. qdel(src) attackby(obj/item/W as obj, mob/user as mob) @@ -312,14 +308,15 @@ /obj/structure/bigDelivery/Destroy() if(wrapped) //sometimes items can disappear. For example, bombs. --rastaf0 - wrapped.loc = (get_turf(loc)) + wrapped.forceMove(get_turf(src)) if(istype(wrapped, /obj/structure/closet)) var/obj/structure/closet/O = wrapped O.welded = 0 + wrapped = null var/turf/T = get_turf(src) for(var/atom/movable/AM in contents) - AM.loc = T - ..() + AM.forceMove(T) + return ..() /obj/item/device/destTagger name = "destination tagger" diff --git a/code/modules/shieldgen/energy_field.dm b/code/modules/shieldgen/energy_field.dm index 59f2f02ab6..5dc6af651d 100644 --- a/code/modules/shieldgen/energy_field.dm +++ b/code/modules/shieldgen/energy_field.dm @@ -32,13 +32,12 @@ my_gen.field.Remove(src) my_gen = null var/turf/current_loc = get_turf(src) - spawn(1) // Updates neightbors after we're gone. - for(var/direction in cardinal) - var/turf/T = get_step(current_loc, direction) - if(T) - for(var/obj/effect/energy_field/F in T) - F.update_icon() - ..() + . = ..() + for(var/direction in cardinal) + var/turf/T = get_step(current_loc, direction) + if(T) + for(var/obj/effect/energy_field/F in T) + F.update_icon() /obj/effect/energy_field/ex_act(var/severity) adjust_strength(-(4 - severity) * 4) diff --git a/code/modules/shieldgen/shield_gen.dm b/code/modules/shieldgen/shield_gen.dm index 1b50407be5..4592140d0d 100644 --- a/code/modules/shieldgen/shield_gen.dm +++ b/code/modules/shieldgen/shield_gen.dm @@ -38,10 +38,8 @@ ..() /obj/machinery/shield_gen/Destroy() - for(var/obj/effect/energy_field/D in field) - field.Remove(D) - D.loc = null - ..() + qdel_null_list(field) + return ..() /obj/machinery/shield_gen/emag_act(var/remaining_charges, var/mob/user) if(prob(75)) From c91dc333cdeaf4a72cffcd95d5bb58ea102ecb15 Mon Sep 17 00:00:00 2001 From: Leshana Date: Mon, 12 Jun 2017 10:48:02 -0400 Subject: [PATCH 80/82] Some more types which need Destroy to return qdel hints! --- code/game/machinery/computer/ai_core.dm | 2 +- code/game/machinery/requests_console.dm | 2 +- code/game/objects/effects/chem/foam.dm | 2 +- code/game/objects/items/bodybag.dm | 9 +++------ code/game/objects/items/devices/PDA/radio.dm | 2 +- .../items/weapons/grenades/chem_grenade.dm | 5 +++++ .../objects/items/weapons/implants/implant.dm | 2 +- code/game/objects/items/weapons/tanks/jetpack.dm | 4 ++-- code/game/objects/items/weapons/tools.dm | 2 +- code/game/objects/items/weapons/weaponry.dm | 2 +- code/modules/detectivework/tools/rag.dm | 2 +- code/modules/holodeck/HolodeckObjects.dm | 16 ++++------------ code/modules/mob/living/voice/voice.dm | 2 +- .../reagents/reagent_containers/borghydro.dm | 2 +- 14 files changed, 24 insertions(+), 30 deletions(-) diff --git a/code/game/machinery/computer/ai_core.dm b/code/game/machinery/computer/ai_core.dm index 009c12403d..34a9ebd58c 100644 --- a/code/game/machinery/computer/ai_core.dm +++ b/code/game/machinery/computer/ai_core.dm @@ -189,7 +189,7 @@ /obj/structure/AIcore/deactivated/Destroy() if(src in empty_playable_ai_cores) empty_playable_ai_cores -= src - ..() + return ..() /obj/structure/AIcore/deactivated/proc/load_ai(var/mob/living/silicon/ai/transfer, var/obj/item/device/aicard/card, var/mob/user) diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm index 2854d0ac25..64aecd9c0f 100644 --- a/code/game/machinery/requests_console.dm +++ b/code/game/machinery/requests_console.dm @@ -97,7 +97,7 @@ var/list/obj/machinery/requests_console/allConsoles = list() req_console_supplies -= department if(departmentType & RC_INFO) req_console_information -= department - ..() + return ..() /obj/machinery/requests_console/attack_hand(user as mob) if(..(user)) diff --git a/code/game/objects/effects/chem/foam.dm b/code/game/objects/effects/chem/foam.dm index 5f29bd6448..2c28dd7ecb 100644 --- a/code/game/objects/effects/chem/foam.dm +++ b/code/game/objects/effects/chem/foam.dm @@ -139,7 +139,7 @@ /obj/structure/foamedmetal/Destroy() density = 0 update_nearby_tiles(1) - ..() + return ..() /obj/structure/foamedmetal/proc/updateicon() if(metal == 1) diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm index 4d77da4ae9..16e27006b4 100644 --- a/code/game/objects/items/bodybag.dm +++ b/code/game/objects/items/bodybag.dm @@ -149,12 +149,9 @@ ..() /obj/structure/closet/body_bag/cryobag/Destroy() - if(syringe) - qdel(syringe) - syringe = null - qdel(tank) - tank = null - ..() + qdel_null(syringe) + qdel_null(tank) + return ..() /obj/structure/closet/body_bag/cryobag/open() . = ..() diff --git a/code/game/objects/items/devices/PDA/radio.dm b/code/game/objects/items/devices/PDA/radio.dm index 5e7d63e1e9..a9e1a4c7f5 100644 --- a/code/game/objects/items/devices/PDA/radio.dm +++ b/code/game/objects/items/devices/PDA/radio.dm @@ -152,4 +152,4 @@ /obj/item/radio/integrated/signal/Destroy() if(radio_controller) radio_controller.remove_object(src, frequency) - ..() + return ..() diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index 0ec3dc13df..9d6b5d6bd3 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -19,6 +19,11 @@ New() create_reagents(1000) + Destroy() + qdel_null(detonator) + qdel_null_list(beakers) + return ..() + attack_self(mob/user as mob) if(!stage || stage==1) if(detonator) diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index aff1f4bb31..806047ae37 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -52,7 +52,7 @@ /obj/item/weapon/implant/Destroy() if(part) part.implants.Remove(src) - ..() + return ..() /obj/item/weapon/implant/attackby(obj/item/I, mob/user) if(istype(I, /obj/item/weapon/implanter)) diff --git a/code/game/objects/items/weapons/tanks/jetpack.dm b/code/game/objects/items/weapons/tanks/jetpack.dm index 41c78ecd3b..b021424043 100644 --- a/code/game/objects/items/weapons/tanks/jetpack.dm +++ b/code/game/objects/items/weapons/tanks/jetpack.dm @@ -24,8 +24,8 @@ ion_trail.set_up(src) /obj/item/weapon/tank/jetpack/Destroy() - qdel(ion_trail) - ..() + qdel_null(ion_trail) + return ..() /obj/item/weapon/tank/jetpack/examine(mob/user) . = ..() diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index 8c4067187f..8148f7e493 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -435,7 +435,7 @@ /obj/item/weapon/weldingtool/experimental/Destroy() processing_objects -= src - ..() + return ..() /obj/item/weapon/weldingtool/experimental/process() ..() diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index 8dce565f2c..e8ce7430c9 100644 --- a/code/game/objects/items/weapons/weaponry.dm +++ b/code/game/objects/items/weapons/weaponry.dm @@ -116,7 +116,7 @@ unbuckle_mob() processing_objects -= src - ..() + return ..() /obj/effect/energy_net/process() if(isnull(buckled_mob) || buckled_mob.loc != loc) diff --git a/code/modules/detectivework/tools/rag.dm b/code/modules/detectivework/tools/rag.dm index 57af12525d..685f35d64b 100644 --- a/code/modules/detectivework/tools/rag.dm +++ b/code/modules/detectivework/tools/rag.dm @@ -35,7 +35,7 @@ /obj/item/weapon/reagent_containers/glass/rag/Destroy() processing_objects -= src //so we don't continue turning to ash while gc'd - ..() + return ..() /obj/item/weapon/reagent_containers/glass/rag/attack_self(mob/user as mob) if(on_fire) diff --git a/code/modules/holodeck/HolodeckObjects.dm b/code/modules/holodeck/HolodeckObjects.dm index a6273a7423..8889e8f0f5 100644 --- a/code/modules/holodeck/HolodeckObjects.dm +++ b/code/modules/holodeck/HolodeckObjects.dm @@ -127,9 +127,6 @@ ) item_state = "boxing" -/obj/structure/window/reinforced/holowindow/Destroy() - ..() - /obj/structure/window/reinforced/holowindow/attackby(obj/item/W as obj, mob/user as mob) if(!istype(W)) return//I really wish I did not need this if (istype(W, /obj/item/weapon/grab) && get_dist(src,user)<2) @@ -183,12 +180,6 @@ qdel(src) return -/obj/structure/window/reinforced/holowindow/disappearing/Destroy() - ..() - -/obj/machinery/door/window/holowindoor/Destroy() - ..() - /obj/machinery/door/window/holowindoor/attackby(obj/item/weapon/I as obj, mob/user as mob) if (src.operating == 1) @@ -224,9 +215,6 @@ visible_message("[src] fades away as it shatters!") qdel(src) -/obj/structure/bed/chair/holochair/Destroy() - ..() - /obj/structure/bed/chair/holochair/attackby(obj/item/weapon/W as obj, mob/user as mob) if(istype(W, /obj/item/weapon/wrench)) user << ("It's a holochair, you can't dismantle it!") @@ -419,6 +407,10 @@ for(var/mob/M in currentarea) M << "FIGHT!" +// A window that disappears when the ready button is pressed +/obj/structure/window/reinforced/holowindow/disappearing + name = "Event Window" + //Holocarp /mob/living/simple_animal/hostile/carp/holodeck diff --git a/code/modules/mob/living/voice/voice.dm b/code/modules/mob/living/voice/voice.dm index a27b0ffc94..802db9d099 100644 --- a/code/modules/mob/living/voice/voice.dm +++ b/code/modules/mob/living/voice/voice.dm @@ -51,7 +51,7 @@ // Description: Removes reference to the communicator, so it can qdel() successfully. /mob/living/voice/Destroy() comm = null - ..() + return ..() // Proc: ghostize() // Parameters: None diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm index 16a1cb3b26..d585effc91 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghydro.dm @@ -35,7 +35,7 @@ /obj/item/weapon/reagent_containers/borghypo/Destroy() processing_objects.Remove(src) - ..() + return ..() /obj/item/weapon/reagent_containers/borghypo/process() //Every [recharge_time] seconds, recharge some reagents for the cyborg+ if(++charge_tick < recharge_time) From 6a0cc39419b95f13465bef80cac5256a1acc902e Mon Sep 17 00:00:00 2001 From: Leshana Date: Wed, 14 Jun 2017 00:27:16 -0400 Subject: [PATCH 81/82] Fixes objects using walk_to() not being able to be garbage collected. * Okay evidently walk_to(A, B) doesn't stop when A reaches B, but keeps running in the background forever until it is manually canceled! Therefore in order to be garbage collected, we must cancel walking on any object that might have initiated it. * Fixes this on chemsmoke and spiders. * The same story applies to walk_towards; fixed for dust, meteors and immovablerod, and also to walk_away; fixed for flashbangs. * Also fixed chemsmoke actually getting qdeled at the right time. --- code/game/gamemodes/events/clang.dm | 4 ++++ code/game/gamemodes/events/dust.dm | 4 ++++ code/game/gamemodes/meteor/meteors.dm | 2 +- code/game/objects/effects/chem/chemsmoke.dm | 6 +++++- code/game/objects/effects/effect_system.dm | 6 ++++-- code/game/objects/effects/spiders.dm | 5 +++-- code/game/objects/items/weapons/grenades/flashbang.dm | 4 ++++ 7 files changed, 25 insertions(+), 6 deletions(-) diff --git a/code/game/gamemodes/events/clang.dm b/code/game/gamemodes/events/clang.dm index 8ab197a1cb..e88492e5d1 100644 --- a/code/game/gamemodes/events/clang.dm +++ b/code/game/gamemodes/events/clang.dm @@ -41,6 +41,10 @@ In my current plan for it, 'solid' will be defined as anything with density == 1 if(clong && prob(25)) src.loc = clong.loc + Destroy() + walk(src, 0) // Because we might have called walk_towards, we must stop the walk loop or BYOND keeps an internal reference to us forever. + return ..() + /proc/immovablerod() var/startx = 0 var/starty = 0 diff --git a/code/game/gamemodes/events/dust.dm b/code/game/gamemodes/events/dust.dm index 2397ae1a14..d7d551396e 100644 --- a/code/game/gamemodes/events/dust.dm +++ b/code/game/gamemodes/events/dust.dm @@ -90,6 +90,10 @@ The "dust" will damage the hull of the station causin minor hull breaches. walk_towards(src, goal, 1) return + Destroy() + walk(src, 0) // Because we might have called walk_towards, we must stop the walk loop or BYOND keeps an internal reference to us forever. + return ..() + touch_map_edge() qdel(src) diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm index c5096d12d8..f0135c5356 100644 --- a/code/game/gamemodes/meteor/meteors.dm +++ b/code/game/gamemodes/meteor/meteors.dm @@ -133,7 +133,7 @@ /obj/effect/meteor/Destroy() walk(src,0) //this cancels the walk_towards() proc - ..() + return ..() /obj/effect/meteor/New() ..() diff --git a/code/game/objects/effects/chem/chemsmoke.dm b/code/game/objects/effects/chem/chemsmoke.dm index 45cfcc8348..be7e759a63 100644 --- a/code/game/objects/effects/chem/chemsmoke.dm +++ b/code/game/objects/effects/chem/chemsmoke.dm @@ -12,6 +12,10 @@ create_reagents(500) return +/obj/effect/effect/smoke/chem/Destroy() + walk(src, 0) // Because we might have called walk_to, we must stop the walk loop or BYOND keeps an internal reference to us forever. + return ..() + /datum/effect/effect/system/smoke_spread/chem smoke_type = /obj/effect/effect/smoke/chem var/obj/chemholder @@ -166,7 +170,7 @@ sleep(150+rand(0,20)) // turning it off before it is deleted results in cleaner smoke.set_opacity(0) // lighting and view range updates fadeOut(smoke) - qdel(src) + qdel(smoke) /datum/effect/effect/system/smoke_spread/chem/spores/spawnSmoke(var/turf/T, var/icon/I, var/dist = 1) var/obj/effect/effect/smoke/chem/spores = new /obj/effect/effect/smoke/chem(location) diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm index 4c930d23cf..a3b3ab81cb 100644 --- a/code/game/objects/effects/effect_system.dm +++ b/code/game/objects/effects/effect_system.dm @@ -179,8 +179,10 @@ steam.start() -- spawns the effect /obj/effect/effect/smoke/New() ..() - spawn (time_to_live) - qdel(src) + if(time_to_live) + spawn (time_to_live) + if(!QDELETED(src)) + qdel(src) /obj/effect/effect/smoke/Crossed(mob/living/carbon/M as mob ) ..() diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index 4396465bc9..c38b07f402 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -94,7 +94,7 @@ var/obj/item/organ/external/O = loc O.implants -= src - ..() + return ..() /obj/effect/spider/eggcluster/process() amount_grown += rand(0,2) @@ -138,7 +138,8 @@ /obj/effect/spider/spiderling/Destroy() processing_objects -= src - ..() + walk(src, 0) // Because we might have called walk_to, we must stop the walk loop or BYOND keeps an internal reference to us forever. + return ..() /obj/effect/spider/spiderling/Bump(atom/user) if(istype(user, /obj/structure/table)) diff --git a/code/game/objects/items/weapons/grenades/flashbang.dm b/code/game/objects/items/weapons/grenades/flashbang.dm index d02ccf2185..940029e735 100644 --- a/code/game/objects/items/weapons/grenades/flashbang.dm +++ b/code/game/objects/items/weapons/grenades/flashbang.dm @@ -91,6 +91,10 @@ M << "Your ears start to ring!" M.update_icons() +/obj/item/weapon/grenade/flashbang/Destroy() + walk(src, 0) // Because we might have called walk_away, we must stop the walk loop or BYOND keeps an internal reference to us forever. + return ..() + /obj/item/weapon/grenade/flashbang/clusterbang//Created by Polymorph, fixed by Sieve desc = "Use of this weapon may constiute a war crime in your area, consult your local Colony Director." name = "clusterbang" From a910ed7ebbef52854678b79b0cdd4886d03ca70a Mon Sep 17 00:00:00 2001 From: Cameron653 Date: Sat, 17 Jun 2017 00:09:58 -0400 Subject: [PATCH 82/82] Removes a comma that allowed nuka_cola to spawn in No fun allowed. --- code/modules/reagents/reagent_containers/food/lunch.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/reagents/reagent_containers/food/lunch.dm b/code/modules/reagents/reagent_containers/food/lunch.dm index 1c82f6cded..9d97f528e3 100644 --- a/code/modules/reagents/reagent_containers/food/lunch.dm +++ b/code/modules/reagents/reagent_containers/food/lunch.dm @@ -58,7 +58,7 @@ var/list/lunchables_drink_reagents_ = list(/datum/reagent/drink/nothing, /datum/reagent/drink/dry_ramen, /datum/reagent/drink/hell_ramen, /datum/reagent/drink/hot_ramen, - /datum/reagent/drink/nuka_cola,) + /datum/reagent/drink/nuka_cola) // This default list is a bit different, it contains items we don't want var/list/lunchables_ethanol_reagents_ = list(/datum/reagent/ethanol/acid_spit,