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: