about summary refs log tree commit diff stats
path: root/data/maps/the_graveyard/doors.txtpb
blob: f06d40dd8d73af629a01b23b49819cd93fb926e8 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
doors {
  name: "Outside Puzzles"
  type: EVENT
  doors { map: "the_great" name: "Red Against Blue Gravestone" }
  doors { map: "the_great" name: "Into The Mouth Gravestone" }
  doors { map: "the_great" name: "The Landscapes Gravestone" }
  doors { map: "the_great" name: "The Maze Gravestone" }
  doors { map: "the_great" name: "Building Building Gravestone" }
  doors { map: "the_linear" name: "Behind The Keen Gravestone" }
  doors { map: "the_three_doors" name: "The Three Doors Gravestone" }
  doors { map: "the_tree" name: "The Tree Gravestone" }
}
doors {
  name: "Mausoleum Door"
  type: EVENT
  panels { room: "Outside" name: "FOOT" }
  panels { room: "Outside" name: "SEVERE" }
}
doors {
  name: "Double Letters"
  type: EVENT
  switches: "double_letters"
  # TODO: once again, not sure whether this is how it should work
}
55 } /* Generic.Prompt */ .highlight .gs { font-weight: bold } /* Generic.Strong */ .highlight .gu { color: #666666 } /* Generic.Subheading */ .highlight .gt { color: #aa0000 } /* Generic.Traceback */ .highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */ .highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */ .highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */ .highlight .kp { color: #008800 } /* Keyword.Pseudo */ .highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */ .highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */ .highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */ .highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */ .highlight .na { color: #336699 } /* Name.Attribute */ .highlight .nb { color: #003388 } /* Name.Builtin */ .highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */ .highlight .no { color: #003366; font-weight: bold } /* Name.Constant */ .highlight .nd { color: #555555 } /* Name.Decorator */ .highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */ .highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */ .highlight .nl { color: #336699; font-style: italic } /* Name.Label */ .highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */ .highlight .py { color: #336699; font-weight: bold } /* Name.Property */ .highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */ .highlight .nv { color: #336699 } /* Name.Variable */ .highlight .ow { color: #008800 } /* Operator.Word */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ .highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */ .highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */ .highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */ .highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */ .highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */ .highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */ .highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */ .highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */ .highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */ .highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */ .highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */ .highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */ .highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */ .highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */ .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */ .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
#include "Validator.h"
#include "Puzzle.h"

void Validator::Validate(Puzzle& p) {
    // console.log('Validating', puzzle);
    p.valid = true; // Assume valid until we find an invalid element
    p.invalidElements.clear();
    p.negations.clear();

    bool puzzleHasSymbols = false;
    bool puzzleHasStart = false;
    bool puzzleHasEnd = false;
  // Validate gap failures as an early exit.
    for (int x = 0; x < p.width; x++) {
        for (int y = 0; y < p.height; y++) {
            Cell cell = p.grid[x][y];
            auto decoration = cell.decoration;
            if (decoration) {
                if (decoration->type == Type::Stone ||
                    decoration->type == Type::Star ||
                    decoration->type == Type::Nega ||
                    decoration->type == Type::Poly ||
                    decoration->type == Type::Ylop) {
                    puzzleHasSymbols = true;
                    continue;
                }
                if (decoration->type == Type::Triangle) {
                    int actualCount = 0;
                    if (p.GetLine(x - 1, y) != Cell::Color::NONE) actualCount++;
                    if (p.GetLine(x + 1, y) != Cell::Color::NONE) actualCount++;
                    if (p.GetLine(x, y - 1) != Cell::Color::NONE) actualCount++;
                    if (p.GetLine(x, y + 1) != Cell::Color::NONE) actualCount++;
                    if (decoration->count != actualCount) {
                        // console.log('Triangle at grid['+x+']['+y+'] has', actualCount, 'borders')
                        p.invalidElements.emplace_back(x, y);
                    }
                }
            }
            if (cell.gap != Cell::Gap::NONE && cell.color != Cell::Color::NONE) {
                // console.log('Gap at', x, y, 'is covered')
                p.valid = false;
            }
            if (cell.dot != Cell::Dot::NONE) {
                if (cell.color == Cell::Color::NONE) {
                    // console.log('Dot at', x, y, 'is not covered')
                    p.invalidElements.emplace_back(x, y);
                } else if (cell.color == Cell::Color::BLUE && cell.dot == Cell::Dot::YELLOW) {
                    // console.log('Yellow dot at', x, y, 'is covered by blue line')
                    p.valid = false;
                } else if (cell.color == Cell::Color::YELLOW && cell.dot == Cell::Dot::BLUE) {
                    // console.log('Blue dot at', x, y, 'is covered by yellow line')
                    p.valid = false;
                }
            }
            if (cell.color != Cell::Color::NONE) {
                if (cell.start == true) puzzleHasStart = true;
                if (cell.end != Cell::Dir::NONE) puzzleHasEnd = true;
            }
        }
    }
    if (!puzzleHasStart || !puzzleHasEnd) {
        // console.log('There is no covered start or endpoint')
        p.valid = false;
    }

    // Perf optimization: We can skip computing regions if the grid has no symbols.
    if (!puzzleHasSymbols) { // No additional symbols, and we already checked dots & gaps
        p.valid &= (p.invalidElements.size() == 0);
    } else { // Additional symbols, so we need to discard dots & divide them by region
        /*
        p.invalidElements.clear();
        std::vector<Region> regions = p.GetRegions();
        // console.log('Found', regions.length, 'regions');
        // console.debug(regions);

        for (const Region& region : regions) {
          std::string key = region.grid.ToString();
          auto regionData = puzzle.regionCache[key];
          if (regionData == undefined) {
            console.log('Cache miss for region', region, 'key', key);
            regionData = _regionCheckNegations(puzzle, region);
            // Entirely for convenience
            regionData.valid = (regionData.invalidElements.size() == 0)
            // console.log('Region valid:', regionData.valid);

            if (!DISABLE_CACHE) {
              p.regionCache[key] = regionData;
            }
          }
          p.negations = p.negations.concat(regionData.negations);
          p.invalidElements = p.invalidElements.concat(regionData.invalidElements);
          p.valid = p.valid && regionData.valid;
        }
        */
    }
    // console.log('Puzzle has', puzzle.invalidElements.length, 'invalid elements')
}