diff --git a/.github/workflows/autochangelog.yml b/.github/workflows/autochangelog.yml
index 7953929ce5..71a53a5b2d 100644
--- a/.github/workflows/autochangelog.yml
+++ b/.github/workflows/autochangelog.yml
@@ -11,7 +11,7 @@ env:
jobs:
autochangelog:
name: Autochangelog
- runs-on: ubuntu-16.04
+ runs-on: ubuntu-20.04
if: github.event.pull_request.merged == true
steps:
- uses: /actions/checkout@v2
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 33b71bb2aa..59319c4b8b 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -10,7 +10,7 @@ env:
jobs:
file_tests:
name: Run Linters
- runs-on: ubuntu-18.04
+ runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v2
- name: Ensure +x on CI directory
@@ -26,7 +26,7 @@ jobs:
dreamchecker:
name: DreamChecker
- runs-on: ubuntu-18.04
+ runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v2
@@ -54,7 +54,7 @@ jobs:
unit_tests:
name: Integration Tests
- runs-on: ubuntu-18.04
+ runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v2
- name: Ensure +x on CI directory
@@ -69,7 +69,7 @@ jobs:
run: |
sudo dpkg --add-architecture i386
sudo apt update || true
- sudo apt install libc6:i386 libgcc1:i386 libstdc++6:i386 libssl1.0.0:i386 zlib1g:i386
+ sudo apt install zlib1g-dev:i386 libssl-dev:i386 pkg-config:i386
ldd librust_g.so
- name: Unit Tests
run: |
diff --git a/.github/workflows/render_nanomaps.yml b/.github/workflows/render_nanomaps.yml
index f3a50a5e94..fd5536ea48 100644
--- a/.github/workflows/render_nanomaps.yml
+++ b/.github/workflows/render_nanomaps.yml
@@ -14,7 +14,7 @@ on:
jobs:
generate_maps:
name: 'Generate NanoMaps'
- runs-on: ubuntu-18.04
+ runs-on: ubuntu-20.04
steps:
- name: Clone
uses: actions/checkout@v2
diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm
index 87332c776f..f023f3e395 100644
--- a/code/game/objects/structures.dm
+++ b/code/game/objects/structures.dm
@@ -7,7 +7,7 @@
var/climb_delay = 3.5 SECONDS
var/breakable
var/parts
- var/list/climbers = list()
+ var/list/climbers
var/block_turf_edges = FALSE // If true, turf edge icons will not be made on the turf this occupies.
var/list/connections = list("0", "0", "0", "0")
@@ -35,7 +35,7 @@
if(H.species.can_shred(user))
attack_generic(user,1,"slices")
- if(climbers.len && !(user in climbers))
+ if(LAZYLEN(climbers) && !(user in climbers))
user.visible_message("[user.name] shakes \the [src].", \
"You shake \the [src].")
structure_shaken()
@@ -103,21 +103,21 @@
return
usr.visible_message("[user] starts climbing onto \the [src]!")
- climbers |= user
+ LAZYDISTINCTADD(climbers, user)
if(!do_after(user,(issmall(user) ? climb_delay * 0.6 : climb_delay)))
- climbers -= user
+ LAZYREMOVE(climbers, user)
return
if (!can_climb(user, post_climb_check=1))
- climbers -= user
+ LAZYREMOVE(climbers, user)
return
usr.forceMove(get_turf(src))
if (get_turf(user) == get_turf(src))
usr.visible_message("[user] climbs onto \the [src]!")
- climbers -= user
+ LAZYREMOVE(climbers, user)
/obj/structure/proc/structure_shaken()
for(var/mob/living/M in climbers)
@@ -204,7 +204,7 @@
if(can_visually_connect_to(S))
if(S.can_visually_connect())
if(propagate)
- //S.update_connections() //Not here
+ S.update_connections()
S.update_icon()
dirs += get_dir(src, S)
diff --git a/code/game/objects/structures/artstuff.dm b/code/game/objects/structures/artstuff.dm
index eae0cc66cc..5873d395fc 100644
--- a/code/game/objects/structures/artstuff.dm
+++ b/code/game/objects/structures/artstuff.dm
@@ -56,9 +56,14 @@
///boolean that blocks persistence from saving it. enabled from printing copies, because we do not want to save copies.
var/no_save = FALSE
- // Painting overlay offset when framed
+ /// From the origin of the turf we're on, where should the left of the canvas pixel be
var/framed_offset_x = 11
+ /// From the origin of the turf we're on, where should the bottom of the canvas be
var/framed_offset_y = 10
+ /// The frame takes the painting's offset, then moves this X offset
+ var/frame_offset_x = -1
+ /// The frame takes the painting's offset, then moves this Y offset
+ var/frame_offset_y = -1
pixel_x = 10
pixel_y = 9
@@ -229,14 +234,16 @@
/obj/item/canvas/twentyfour_twentyfour
name = "ai universal standard canvas"
- desc = "Besides being very large, the AI can accept these as a display from their internal database after you've hung it up."
+ //desc = "Besides being very large, the AI can accept these as a display from their internal database after you've hung it up." // Not yet
icon_state = "24x24"
width = 24
height = 24
pixel_x = 2
- pixel_y = 1
+ pixel_y = 2
framed_offset_x = 4
- framed_offset_y = 5
+ framed_offset_y = 4
+ frame_offset_x = -2
+ frame_offset_y = -2
/obj/item/frame/painting
name = "painting frame"
@@ -370,8 +377,8 @@
MA.pixel_y = current_canvas.framed_offset_y
. += MA
var/mutable_appearance/frame = mutable_appearance(current_canvas.icon,"[current_canvas.icon_state]frame")
- frame.pixel_x = current_canvas.framed_offset_x - 1
- frame.pixel_y = current_canvas.framed_offset_y - 1
+ frame.pixel_x = current_canvas.framed_offset_x + current_canvas.frame_offset_x
+ frame.pixel_y = current_canvas.framed_offset_y + current_canvas.frame_offset_y
. += frame
add_overlay(.)
diff --git a/code/game/objects/structures/fitness_vr.dm b/code/game/objects/structures/fitness_vr.dm
index 6459cd469b..99978fe27c 100644
--- a/code/game/objects/structures/fitness_vr.dm
+++ b/code/game/objects/structures/fitness_vr.dm
@@ -26,14 +26,14 @@
return
usr.visible_message("[user] starts climbing onto \the [src]!")
- climbers |= user
+ LAZYDISTINCTADD(climbers, user)
if(!do_after(user,(issmall(user) ? 20 : 34)))
- climbers -= user
+ LAZYREMOVE(climbers, user)
return
if(!can_climb(user, post_climb_check=1))
- climbers -= user
+ LAZYREMOVE(climbers, user)
return
if(get_turf(user) == get_turf(src))
@@ -42,7 +42,7 @@
usr.forceMove(get_turf(src))
usr.visible_message("[user] climbed over \the [src]!")
- climbers -= user
+ LAZYREMOVE(climbers, user)
/obj/structure/fitness/boxing_ropes/can_climb(var/mob/living/user, post_climb_check=0) //Sets it to keep people from climbing over into the next turf if it is occupied.
if(!..())
@@ -84,14 +84,14 @@
return
usr.visible_message("[user] starts climbing onto \the [src]!")
- climbers |= user
+ LAZYDISTINCTADD(climbers, user)
if(!do_after(user,(issmall(user) ? 20 : 34)))
- climbers -= user
+ LAZYREMOVE(climbers, user)
return
if(!can_climb(user, post_climb_check=1))
- climbers -= user
+ LAZYREMOVE(climbers, user)
return
if(get_turf(user) == get_turf(src))
@@ -100,7 +100,7 @@
usr.forceMove(get_turf(src))
usr.visible_message("[user] climbed over \the [src]!")
- climbers -= user
+ LAZYREMOVE(climbers, user)
/obj/structure/fitness/boxing_ropes_bottom/can_climb(var/mob/living/user, post_climb_check=0)
if(!..())
@@ -143,14 +143,14 @@
return
usr.visible_message("[user] starts climbing onto \the [src]!")
- climbers |= user
+ LAZYDISTINCTADD(climbers, user)
if(!do_after(user,(issmall(user) ? 20 : 34)))
- climbers -= user
+ LAZYREMOVE(climbers, user)
return
if(!can_climb(user, post_climb_check=1))
- climbers -= user
+ LAZYREMOVE(climbers, user)
return
if(get_turf(user) == get_turf(src))
@@ -159,7 +159,7 @@
usr.forceMove(get_turf(src))
usr.visible_message("[user] climbed over \the [src]!")
- climbers -= user
+ LAZYREMOVE(climbers, user)
/obj/structure/fitness/boxing_turnbuckle/can_climb(var/mob/living/user, post_climb_check=0)
if(!..())
diff --git a/code/game/objects/structures/ledges.dm b/code/game/objects/structures/ledges.dm
index 1afa2efb01..cf7c88fc48 100644
--- a/code/game/objects/structures/ledges.dm
+++ b/code/game/objects/structures/ledges.dm
@@ -55,14 +55,14 @@
return
usr.visible_message("[user] starts climbing onto \the [src]!")
- climbers |= user
+ LAZYDISTINCTADD(climbers, user)
if(!do_after(user,(issmall(user) ? 20 : 34)))
- climbers -= user
+ LAZYREMOVE(climbers, user)
return
if(!can_climb(user, post_climb_check=1))
- climbers -= user
+ LAZYREMOVE(climbers, user)
return
if(get_turf(user) == get_turf(src))
@@ -71,7 +71,7 @@
usr.forceMove(get_turf(src))
usr.visible_message("[user] climbed over \the [src]!")
- climbers -= user
+ LAZYREMOVE(climbers, user)
/obj/structure/ledge/can_climb(var/mob/living/user, post_climb_check=0)
if(!..())
diff --git a/code/game/objects/structures/railing.dm b/code/game/objects/structures/railing.dm
index e039f7806f..c6c1e1aea5 100644
--- a/code/game/objects/structures/railing.dm
+++ b/code/game/objects/structures/railing.dm
@@ -286,14 +286,14 @@
return
usr.visible_message("[user] starts climbing onto \the [src]!")
- climbers |= user
+ LAZYDISTINCTADD(climbers, user)
if(!do_after(user,(issmall(user) ? 20 : 34)))
- climbers -= user
+ LAZYREMOVE(climbers, user)
return
if(!can_climb(user, post_climb_check=1))
- climbers -= user
+ LAZYREMOVE(climbers, user)
return
if(get_turf(user) == get_turf(src))
@@ -303,7 +303,7 @@
usr.visible_message("[user] climbed over \the [src]!")
if(!anchored) take_damage(maxhealth) // Fatboy
- climbers -= user
+ LAZYREMOVE(climbers, user)
/obj/structure/railing/can_climb(var/mob/living/user, post_climb_check=0)
if(!..())
diff --git a/code/game/turfs/turf_changing.dm b/code/game/turfs/turf_changing.dm
index e826867ab7..85292aa2b3 100644
--- a/code/game/turfs/turf_changing.dm
+++ b/code/game/turfs/turf_changing.dm
@@ -59,6 +59,7 @@
if(S.zone) S.zone.rebuild()
cut_overlays(TRUE)
+ RemoveElement(/datum/element/turf_z_transparency)
if(ispath(N, /turf/simulated/floor))
var/turf/simulated/W = new N( locate(src.x, src.y, src.z) )
diff --git a/code/modules/maps/tg/reader.dm b/code/modules/maps/tg/reader.dm
index 542a0b9582..bb320e27ae 100644
--- a/code/modules/maps/tg/reader.dm
+++ b/code/modules/maps/tg/reader.dm
@@ -152,7 +152,7 @@ GLOBAL_DATUM_INIT(_preloader, /dmm_suite/preloader, new)
if(xcrd > world.maxx)
if(cropMap)
break
- else
+ else if(!measureOnly)
world.maxx = xcrd
if(xcrd >= 1)
diff --git a/code/modules/mob/new_player/sprite_accessories_taur_vr.dm b/code/modules/mob/new_player/sprite_accessories_taur_vr.dm
index fc3994b528..1652fbfca9 100644
--- a/code/modules/mob/new_player/sprite_accessories_taur_vr.dm
+++ b/code/modules/mob/new_player/sprite_accessories_taur_vr.dm
@@ -57,7 +57,7 @@
suit_sprites = 'icons/mob/taursuits_wolf_vr.dmi'
icon_sprite_tag = "wolf"
-/datum/sprite_accessory/tail/taur/fatwolf
+/datum/sprite_accessory/tail/taur/wolf/fatwolf
name = "Fat Wolf (Taur)"
icon_state = "fatwolf_s"
icon_sprite_tag = "wolf" //This could be modified later.
@@ -83,7 +83,7 @@
extra_overlay2 = "synthwolf_glow"
//icon_sprite_tag = "synthwolf"
-/datum/sprite_accessory/tail/taur/ch/wolf/fatsynthwolf
+/datum/sprite_accessory/tail/taur/wolf/fatsynthwolf
name = "Fat SynthWolf dual-color (Taur)"
icon_state = "fatsynthwolf_s"
extra_overlay = "fatsynthwolf_markings"
@@ -219,11 +219,11 @@
extra_overlay = "lizard_markings"
//icon_sprite_tag = "lizard2c"
-/datum/sprite_accessory/tail/taur/ch/lizard/fat
+/datum/sprite_accessory/tail/taur/lizard/fatlizard
name = "Fat Lizard (Taur)"
icon_state = "fatlizard_s"
-/datum/sprite_accessory/tail/taur/ch/lizard/fat_2c
+/datum/sprite_accessory/tail/taur/lizard/fatlizard_2c
name = "Fat Lizard (Taur, dual-color)"
icon_state = "fatlizard_s"
extra_overlay= "fatlizard_markings"
@@ -235,7 +235,7 @@
extra_overlay2 = "synthlizard_glow"
//icon_sprite_tag = "synthlizard"
-/datum/sprite_accessory/tail/taur/ch/lizard/fatsynthlizard
+/datum/sprite_accessory/tail/taur/lizard/fatsynthlizard
name = "Fat SynthLizard dual-color (Taur)"
icon_state = "fatsynthlizard_s"
extra_overlay = "fatsynthlizard_markings"
@@ -326,7 +326,7 @@
extra_overlay2 = "synthfeline_glow"
//icon_sprite_tag = "synthfeline"
-/datum/sprite_accessory/tail/taur/ch/feline/fatsynthfeline
+/datum/sprite_accessory/tail/taur/feline/fatsynthfeline
name = "Fat SynthFeline dual-color (Taur)"
icon_state = "fatsynthfeline_s"
extra_overlay = "fatsynthfeline_markings"
diff --git a/code/modules/tables/tables.dm b/code/modules/tables/tables.dm
index e37b684d3d..47cba8bf46 100644
--- a/code/modules/tables/tables.dm
+++ b/code/modules/tables/tables.dm
@@ -333,6 +333,8 @@ var/list/table_icon_cache = list()
return FALSE
if(istype(src,/obj/structure/table/bench) && !istype(S,/obj/structure/table/bench))
return FALSE
+ if(istype(src,/obj/structure/table/rack) && !istype(S,/obj/structure/table/rack))
+ return FALSE
if(istype(S,/obj/structure/table))
return TRUE
..()
diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi
index b17ccaec61..f56f2beb41 100644
Binary files a/icons/mob/back.dmi and b/icons/mob/back.dmi differ
diff --git a/icons/obj/artstuff.dmi b/icons/obj/artstuff.dmi
index 847ebd5ca6..1397bb26ab 100644
Binary files a/icons/obj/artstuff.dmi and b/icons/obj/artstuff.dmi differ
diff --git a/librust_g.so b/librust_g.so
index 9d46da045f..239f12d713 100644
Binary files a/librust_g.so and b/librust_g.so differ
diff --git a/maps/submaps/admin_use_vr/guttersite.dmm b/maps/submaps/admin_use_vr/guttersite.dmm
index e1de319a18..4e485330e9 100644
--- a/maps/submaps/admin_use_vr/guttersite.dmm
+++ b/maps/submaps/admin_use_vr/guttersite.dmm
@@ -3843,7 +3843,7 @@
/area/tether_away/guttersite/unexplored)
"jo" = (
/obj/structure/table/rack/shelf/steel,
-/obj/item/weapon/reagent_containers/food/snacks/donut/cherryjelly,
+bj/item/weapon/reagent_containers/food/snacks/donut/plain/jelly/cherryjelly,
/obj/item/weapon/reagent_containers/food/snacks/donut/jelly,
/obj/item/weapon/reagent_containers/food/snacks/donut/normal,
/obj/item/weapon/reagent_containers/food/snacks/donut/poisonberry,
@@ -3851,7 +3851,7 @@
/area/tether_away/guttersite/security)
"jp" = (
/obj/structure/table/rack/shelf/steel,
-/obj/item/weapon/reagent_containers/food/snacks/donut/cherryjelly,
+bj/item/weapon/reagent_containers/food/snacks/donut/plain/jelly/cherryjelly,
/obj/item/weapon/reagent_containers/food/snacks/donut/jelly,
/obj/item/weapon/reagent_containers/food/snacks/donut/normal,
/obj/item/weapon/reagent_containers/food/snacks/donut/slimejelly,
@@ -3860,8 +3860,8 @@
"jq" = (
/obj/structure/table/rack/shelf/steel,
/obj/item/weapon/reagent_containers/food/snacks/donut/chaos,
-/obj/item/weapon/reagent_containers/food/snacks/donut/cherryjelly,
-/obj/item/weapon/reagent_containers/food/snacks/donut/cherryjelly,
+bj/item/weapon/reagent_containers/food/snacks/donut/plain/jelly/cherryjelly,
+bj/item/weapon/reagent_containers/food/snacks/donut/plain/jelly/cherryjelly,
/obj/item/weapon/reagent_containers/food/snacks/donut/jelly,
/obj/item/weapon/reagent_containers/food/snacks/donut/normal,
/turf/simulated/floor/tiled/eris/dark/gray_perforated,
diff --git a/maps/yw/submaps/space/guttersite.dmm b/maps/yw/submaps/space/guttersite.dmm
index d60d81a865..c999727ddd 100644
--- a/maps/yw/submaps/space/guttersite.dmm
+++ b/maps/yw/submaps/space/guttersite.dmm
@@ -3944,27 +3944,27 @@
/area/tether_away/guttersite/unexplored)
"jo" = (
/obj/structure/table/rack/shelf/steel,
-/obj/item/weapon/reagent_containers/food/snacks/donut/cherryjelly,
-/obj/item/weapon/reagent_containers/food/snacks/donut/jelly,
-/obj/item/weapon/reagent_containers/food/snacks/donut/normal,
-/obj/item/weapon/reagent_containers/food/snacks/donut/poisonberry,
+/obj/item/weapon/reagent_containers/food/snacks/donut/plain/jelly/cherryjelly,
+/obj/item/weapon/reagent_containers/food/snacks/donut/plain/jelly,
+/obj/item/weapon/reagent_containers/food/snacks/donut/plain,
+/obj/item/weapon/reagent_containers/food/snacks/donut/plain/jelly/poisonberry,
/turf/simulated/floor/tiled/eris/dark/gray_perforated,
/area/tether_away/guttersite/security)
"jp" = (
/obj/structure/table/rack/shelf/steel,
-/obj/item/weapon/reagent_containers/food/snacks/donut/cherryjelly,
-/obj/item/weapon/reagent_containers/food/snacks/donut/jelly,
-/obj/item/weapon/reagent_containers/food/snacks/donut/normal,
-/obj/item/weapon/reagent_containers/food/snacks/donut/slimejelly,
+/obj/item/weapon/reagent_containers/food/snacks/donut/plain/jelly/cherryjelly,
+/obj/item/weapon/reagent_containers/food/snacks/donut/plain/jelly,
+/obj/item/weapon/reagent_containers/food/snacks/donut/plain,
+/obj/item/weapon/reagent_containers/food/snacks/donut/plain/jelly/slimejelly,
/turf/simulated/floor/tiled/eris/dark/gray_perforated,
/area/tether_away/guttersite/security)
"jq" = (
/obj/structure/table/rack/shelf/steel,
/obj/item/weapon/reagent_containers/food/snacks/donut/chaos,
-/obj/item/weapon/reagent_containers/food/snacks/donut/cherryjelly,
-/obj/item/weapon/reagent_containers/food/snacks/donut/cherryjelly,
-/obj/item/weapon/reagent_containers/food/snacks/donut/jelly,
-/obj/item/weapon/reagent_containers/food/snacks/donut/normal,
+/obj/item/weapon/reagent_containers/food/snacks/donut/plain/jelly/cherryjelly,
+/obj/item/weapon/reagent_containers/food/snacks/donut/plain/jelly/cherryjelly,
+/obj/item/weapon/reagent_containers/food/snacks/donut/plain/jelly,
+/obj/item/weapon/reagent_containers/food/snacks/donut/plain,
/turf/simulated/floor/tiled/eris/dark/gray_perforated,
/area/tether_away/guttersite/security)
"jr" = (
diff --git a/maps/yw/submaps/space/pois/tinycarrier.dmm b/maps/yw/submaps/space/pois/tinycarrier.dmm
index 5be1f1456b..908afdd05d 100644
--- a/maps/yw/submaps/space/pois/tinycarrier.dmm
+++ b/maps/yw/submaps/space/pois/tinycarrier.dmm
@@ -1109,7 +1109,7 @@
/turf/simulated/floor/reinforced/airless,
/area/submap/debrisfield/tinyshuttle/hangar)
"bW" = (
-/obj/mecha/combat/fighter/baron/loaded/busted{
+/obj/mecha/combat/fighter/baron/busted{
dir = 8;
dir_in = 8
},
diff --git a/rust_g.dll b/rust_g.dll
index 5e60ff2cd4..ebb6c9fd19 100644
Binary files a/rust_g.dll and b/rust_g.dll differ
diff --git a/tools/TagMatcher/tag-matcher.py b/tools/TagMatcher/tag-matcher.py
index ddbe9cbc20..9de9169845 100644
--- a/tools/TagMatcher/tag-matcher.py
+++ b/tools/TagMatcher/tag-matcher.py
@@ -20,14 +20,15 @@ THE SOFTWARE.
import argparse, re, sys
from collections import defaultdict
from os import path, walk
+from codecs import open
opt = argparse.ArgumentParser()
opt.add_argument('dir', help='The directory to scan for *.dm files with non-matching spans')
args = opt.parse_args()
if(not path.isdir(args.dir)):
- print('Not a directory')
- sys.exit(1)
+ print('Not a directory')
+ sys.exit(1)
# These tuples are expected to be ordered as:
# A unique human readable name (henceforth referred to as tuple name), a regex pattern matching an opening tag, a regex pattern matching a closing tag
@@ -54,13 +55,13 @@ def get_tag_matches(line):
# Support def that simply checks if a given dictionary in the format tag/list of unmatched lines has mismatch entries.
def has_mismatch(match_list):
- for tag, list_of_mismatched_lines in match_list.iteritems():
+ for tag, list_of_mismatched_lines in match_list.items():
if(len(list_of_mismatched_lines) > 0):
return 1
return 0
def arrange_mismatches(mismatches_by_tag, mismatch_line, mismatch_counts):
- for tag, mismatch_count in mismatch_counts.iteritems():
+ for tag, mismatch_count in mismatch_counts.items():
stack_of_existing_mismatches = mismatches_by_tag[tag]
for i in range(0, abs(mismatch_count)):
if len(stack_of_existing_mismatches) == 0:
@@ -83,10 +84,10 @@ def arrange_mismatches(mismatches_by_tag, mismatch_line, mismatch_counts):
# This section parses all *.dm files in the given directory, recursively.
for root, subdirs, files in walk(args.dir):
- for filename in files:
- if filename.endswith('.dm'):
- file_path = path.join(root, filename)
- with open(file_path, 'r') as file:
+ for filename in files:
+ if filename.endswith('.dm'):
+ file_path = path.join(root, filename)
+ with open(file_path, 'r', encoding='utf-8', errors='ignore') as file:
mismatches_by_file[file_path] = defaultdict(list)
for line_number, line in enumerate(file, 1):
# Then for each line in the file, conduct the tuple open/close matching.
@@ -97,10 +98,10 @@ for root, subdirs, files in walk(args.dir):
# Loops over all matches and checks if there is a mismatch of tags.
# If so, then and only then is the corresponding file path printed along with the number of unmatched open/close tags.
total_mismatches = 0
-for file, mismatches_by_tag in mismatches_by_file.iteritems():
+for file, mismatches_by_tag in mismatches_by_file.items():
if has_mismatch(mismatches_by_tag):
print(file)
- for tag, mismatch_list in mismatches_by_tag.iteritems():
+ for tag, mismatch_list in mismatches_by_tag.items():
# A positive number means an excess of opening tag, a negative number means an excess of closing tags.
total_mismatches += len(mismatch_list)
if len(mismatch_list) > 0: