# Copyright 2020 Project U-Ray Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import re
import sys
import json

line_re = re.compile(r'F(0x[0-9A-Fa-f]+)W(\d+)B(\d+)')
frames_to_tiles = {}  # (start, size, tile, tile offset)

with open(sys.argv[1]) as tb_f:
    tbj = json.load(tb_f)

for tilename, tiledata in tbj.items():
    tile_offset = 0
    for chunk in tiledata:
        frame, start, size = chunk
        if frame not in frames_to_tiles:
            frames_to_tiles[frame] = []
        frames_to_tiles[frame].append((start, size, tilename, tile_offset))
        tile_offset += size

tile_bits = {}

with open(sys.argv[2]) as df:
    for line in df:
        m = line_re.match(line)
        if not m:
            continue
        frame = int(m[1], 16)
        if frame not in frames_to_tiles:
            continue
        framebit = int(m[2]) * 32 + int(m[3])
        for fb in frames_to_tiles[frame]:
            start, size, tile, toff = fb
            if framebit > start and framebit < (start + size):
                if tile not in tile_bits:
                    tile_bits[tile] = set()
                tile_bits[tile].add(toff + (framebit - start))

for tile, bits in sorted(tile_bits.items()):
    if "CLE" in tile:
        if 152 not in bits:
            print(tile)
    if "INT" in tile:
        if 3640 not in bits:
            print(tile)
