mirror of
https://github.com/DramaticShape/DramaticShapeVoxelMod.git
synced 2026-08-12 16:41:13 +02:00
197 lines
11 KiB
Lua
197 lines
11 KiB
Lua
-- Where each map's battles happen.
|
|
--
|
|
-- One authored spot per area, rather than whichever clearing happens to be
|
|
-- nearest the step the fight started on. A battle on Route 1 should look the
|
|
-- same every time it happens on Route 1 -- and, more importantly, "open
|
|
-- ground" is not the same question as "you can see the two of them": the
|
|
-- battle camera sits low and a long way back, so a hedge, a ledge lip or the
|
|
-- corner of a house anywhere along that sightline hides a Pokemon completely
|
|
-- while every cell it is standing on is perfectly walkable.
|
|
--
|
|
-- Each entry is the arena's north-west corner in map CELLS, and which of
|
|
-- BattleArena.SHAPES it is. Picked by tools/arena_pick (BattleArena.search
|
|
-- with the clearance test on, from the middle of the map) and then looked at,
|
|
-- one screenshot per map -- these are eyeballed answers, not just passing
|
|
-- ones. Grass and flowers around a mon's feet are fine and wanted; anything
|
|
-- that cuts into a body is not.
|
|
--
|
|
-- A map with no entry here falls back to the nearest-clear search at battle
|
|
-- time, so a mod that adds maps, or an entry that goes stale against an
|
|
-- edited map, degrades to the old behaviour rather than to no battle.
|
|
--
|
|
-- The entries below are generated; regenerate with
|
|
--
|
|
-- SHOT_DIR=.scratchpad/arenas \
|
|
-- POKEPORT_DRIVER=mods/DramaticShapeVoxelMod/tests/arena_pick.lua love .
|
|
|
|
-- `cam = "wide"` on an entry swaps the long default lens for the 44-degree
|
|
-- one (BattleCam.RIGS). Both frame the same composition -- the two mons land
|
|
-- on the same screen anchors either way -- so it is purely a choice about how
|
|
-- much of the place is in shot, at the cost of a smaller pair. Rooms the long
|
|
-- lens cannot stand back from NEED it; anywhere that simply reads better with
|
|
-- more of itself visible may ask for it.
|
|
--
|
|
-- Tall grass is never part of an arena (BattleArena.openCell rejects it), so
|
|
-- a route's spot is always its bare path rather than the field beside it --
|
|
-- grass is knee-high geometry to a Pokemon and this camera is nearly level
|
|
-- with the floor, so tufts on the mon's own tile stand between it and the
|
|
-- lens. Flowers are left alone: they are ankle height and read as ground.
|
|
|
|
return {
|
|
-- ------- routes
|
|
-- narrow, deliberately: the route's interior is a 3-cell-wide lane and the
|
|
-- wide shape only fits in the western connection border, which staged every
|
|
-- fight at the edge of the world instead of on the road.
|
|
--
|
|
-- Of the seventeen spots the route has outside that border, fourteen are
|
|
-- this one mid-route clearing and the other three bury the near mon behind
|
|
-- a hedge -- which the clearance test passes, since it measures terrain
|
|
-- height along the sightline and a hedge in the apron row is not terrain.
|
|
-- So the choice is where in the clearing, and this is its west end: tree
|
|
-- line square behind the pair, nothing crossing either of them.
|
|
["ROUTE_1"] = { x = 4, y = 14, shape = "narrow" },
|
|
["ROUTE_2"] = { x = 1, y = 49, shape = "wide" },
|
|
["ROUTE_3"] = { x = 57, y = 1, shape = "wide" },
|
|
["ROUTE_4"] = { x = 46, y = 7, shape = "wide" },
|
|
["ROUTE_5"] = { x = 13, y = 24, shape = "wide" },
|
|
["ROUTE_6"] = { x = 5, y = 17, shape = "narrow" },
|
|
["ROUTE_7"] = { x = 8, y = 8, shape = "narrow" },
|
|
["ROUTE_8"] = { x = 25, y = 7, shape = "wide" },
|
|
-- the whole route admits six bare wide arenas, all in the west cliff
|
|
-- corridor; this is the best of them. A flower cluster crosses the far
|
|
-- mon's hind legs, which the brief allows -- every alternative put a
|
|
-- terrace through the near mon's waist, which it does not.
|
|
["ROUTE_9"] = { x = 1, y = 11, shape = "wide", cam = "wide" },
|
|
["ROUTE_10"] = { x = 7, y = 40, shape = "wide" },
|
|
["ROUTE_11"] = { x = 9, y = 6, shape = "wide" },
|
|
["ROUTE_12"] = { x = 0, y = 73, shape = "wide" },
|
|
["ROUTE_13"] = { x = 50, y = 8, shape = "narrow" },
|
|
["ROUTE_14"] = { x = 11, y = 25, shape = "wide" },
|
|
["ROUTE_15"] = { x = 9, y = 10, shape = "wide" },
|
|
["ROUTE_16"] = { x = 6, y = 10, shape = "wide" },
|
|
["ROUTE_17"] = { x = 14, y = 70, shape = "wide" },
|
|
["ROUTE_18"] = { x = 11, y = 4, shape = "wide" },
|
|
|
|
-- ------- buildings and caves
|
|
--
|
|
-- Indoors the narrow shape earns its keep: a room with furniture, machinery
|
|
-- or gravestones in it rarely holds a 3x6 clearing whose whole width is
|
|
-- also SEEN, and giving up the apron is usually the difference between a
|
|
-- fight in the open and one behind a console.
|
|
["POKEMON_MANSION_1F"] = { x = 4, y = 12, shape = "wide" },
|
|
["POKEMON_MANSION_2F"] = { x = 15, y = 17, shape = "wide" },
|
|
["POKEMON_MANSION_3F"] = { x = 23, y = 2, shape = "narrow", cam = "wide" },
|
|
["POKEMON_MANSION_B1F"] = { x = 19, y = 10, shape = "wide" },
|
|
["POKEMON_TOWER_2F"] = { x = 4, y = 7, shape = "narrow" },
|
|
["POKEMON_TOWER_3F"] = { x = 4, y = 6, shape = "wide" },
|
|
-- every one of 4F's thirty candidate spots puts a gravestone through a
|
|
-- mon; the floor below is the same tower and has the room, so the fight
|
|
-- is shot there
|
|
["POKEMON_TOWER_4F"] = { map = "POKEMON_TOWER_3F", x = 4, y = 6,
|
|
shape = "wide" },
|
|
["POKEMON_TOWER_5F"] = { x = 10, y = 1, shape = "narrow" },
|
|
["POKEMON_TOWER_6F"] = { x = 14, y = 6, shape = "narrow" },
|
|
["POKEMON_TOWER_7F"] = { x = 9, y = 5, shape = "wide" },
|
|
["POWER_PLANT"] = { x = 18, y = 5, shape = "narrow" },
|
|
["ROCK_TUNNEL_1F"] = { x = 14, y = 15, shape = "wide" },
|
|
["ROCK_TUNNEL_B1F"] = { x = 20, y = 17, shape = "wide" },
|
|
["ROCKET_HIDEOUT_B1F"] = { x = 11, y = 6, shape = "narrow" },
|
|
["ROCKET_HIDEOUT_B2F"] = { x = 19, y = 7, shape = "narrow" },
|
|
["ROCKET_HIDEOUT_B3F"] = { x = 22, y = 11, shape = "narrow" },
|
|
["ROCKET_HIDEOUT_B4F"] = { x = 17, y = 3, shape = "narrow" },
|
|
["SAFARI_ZONE_CENTER"] = { x = 1, y = 8, shape = "wide" },
|
|
["SAFARI_ZONE_EAST"] = { x = 21, y = 8, shape = "wide" },
|
|
["SAFARI_ZONE_NORTH"] = { x = 19, y = 14, shape = "wide" },
|
|
["SAFARI_ZONE_WEST"] = { x = 18, y = 3, shape = "wide" },
|
|
["SEAFOAM_ISLANDS_1F"] = { x = 14, y = 7, shape = "wide" },
|
|
["SEAFOAM_ISLANDS_B1F"] = { x = 11, y = 1, shape = "wide" },
|
|
["SEAFOAM_ISLANDS_B2F"] = { x = 16, y = 2, shape = "wide" },
|
|
["SEAFOAM_ISLANDS_B3F"] = { x = 25, y = 7, shape = "wide" },
|
|
["SEAFOAM_ISLANDS_B4F"] = { x = 12, y = 6, shape = "narrow" },
|
|
-- Silph Co is office floors partitioned into small rooms, so the long lens
|
|
-- often lands outside the walls it is meant to be looking between; the
|
|
-- floors that could not be framed any other way ask for the wide one.
|
|
["SILPH_CO_2F"] = { x = 16, y = 8, shape = "narrow" },
|
|
["SILPH_CO_4F"] = { x = 24, y = 2, shape = "narrow" },
|
|
["SILPH_CO_5F"] = { x = 16, y = 7, shape = "wide" },
|
|
["SILPH_CO_6F"] = { x = 10, y = 8, shape = "narrow" },
|
|
["SILPH_CO_7F"] = { x = 1, y = 2, shape = "wide", cam = "wide" },
|
|
["SILPH_CO_8F"] = { x = 8, y = 6, shape = "narrow" },
|
|
["SILPH_CO_9F"] = { x = 20, y = 11, shape = "wide", cam = "wide" },
|
|
["SS_ANNE_1F_ROOMS"] = { x = 10, y = 1, shape = "narrow", cam = "wide" },
|
|
-- the ship is all two-cell corridors, so the wide arena shape fits nowhere
|
|
-- aboard and the long lens always lands outside the hull
|
|
["SS_ANNE_2F"] = { x = 36, y = 8, shape = "narrow", cam = "wide" },
|
|
-- these two decks are byte-identical geometry, so they take the same spot
|
|
["SS_ANNE_2F_ROOMS"] = { x = 11, y = 12, shape = "narrow" },
|
|
["SS_ANNE_B1F_ROOMS"] = { x = 11, y = 12, shape = "narrow" },
|
|
["SS_ANNE_BOW"] = { x = 8, y = 3, shape = "wide" },
|
|
["VICTORY_ROAD_2F"] = { x = 16, y = 6, shape = "wide" },
|
|
["VICTORY_ROAD_3F"] = { x = 20, y = 1, shape = "wide" },
|
|
|
|
-- ------- towns and the last interiors
|
|
["CERULEAN_CITY"] = { x = 15, y = 16, shape = "wide" },
|
|
["GAME_CORNER"] = { x = 8, y = 7, shape = "wide" },
|
|
-- the lab is ten cells by twelve, so the long lens is always off-map, and
|
|
-- on it a desk clipped one mon and a pillar the other
|
|
["OAKS_LAB"] = { x = 3, y = 2, shape = "narrow", cam = "wide" },
|
|
-- Saffron's gym is a grid of small walled cells: no wide shape exists
|
|
-- anywhere in it, and the long lens sits inside a divider
|
|
["SAFFRON_GYM"] = { x = 9, y = 7, shape = "narrow", cam = "wide" },
|
|
["SILPH_CO_3F"] = { x = 18, y = 11, shape = "wide", cam = "wide" },
|
|
["SILPH_CO_10F"] = { x = 1, y = 2, shape = "wide" },
|
|
["SILPH_CO_11F"] = { x = 1, y = 11, shape = "wide", cam = "wide" },
|
|
-- the upper corridor (cols 4-5, rows 1-4) is sealed at runtime by the
|
|
-- gym's barrier, so arenas there silently fail the fit test
|
|
["VERMILION_GYM"] = { x = 4, y = 11, shape = "narrow" },
|
|
["VICTORY_ROAD_1F"] = { x = 11, y = 2, shape = "narrow" },
|
|
["VIRIDIAN_FOREST"] = { x = 16, y = 34, shape = "narrow" },
|
|
|
|
-- ------- the remaining routes
|
|
["ROUTE_19"] = { x = 8, y = 6, shape = "narrow" },
|
|
-- the two surf routes fight AFLOAT, in the middle of their own sea rather
|
|
-- than on the rim of beach the land search would otherwise find
|
|
["ROUTE_20"] = { x = 23, y = 7, shape = "wide" },
|
|
["ROUTE_21"] = { x = 8, y = 46, shape = "wide" },
|
|
["ROUTE_22"] = { x = 35, y = 7, shape = "wide" },
|
|
["ROUTE_23"] = { x = 4, y = 36, shape = "wide" },
|
|
["ROUTE_24"] = { x = 13, y = 15, shape = "wide" },
|
|
["ROUTE_25"] = { x = 32, y = 2, shape = "wide", cam = "wide" },
|
|
|
|
-- ------- caves, gyms and the Elite Four
|
|
--
|
|
-- None of these tilesets has a grass tile at all, so the no-grass rule
|
|
-- constrained nothing here; what constrains them is furniture, rock
|
|
-- pillars and how small the rooms are.
|
|
["AGATHAS_ROOM"] = { x = 2, y = 1, shape = "narrow", cam = "wide" },
|
|
["BRUNOS_ROOM"] = { x = 3, y = 1, shape = "narrow" },
|
|
["CELADON_GYM"] = { x = 0, y = 3, shape = "narrow" },
|
|
["CERULEAN_CAVE_1F"] = { x = 1, y = 7, shape = "narrow" },
|
|
-- 2F is a maze of one-cell rock corridors; all 24 of its candidate spots
|
|
-- hide a mon, so it borrows the floor below -- the same cave
|
|
["CERULEAN_CAVE_2F"] = { map = "CERULEAN_CAVE_B1F", x = 2, y = 0,
|
|
shape = "wide" },
|
|
["CERULEAN_CAVE_B1F"] = { x = 2, y = 0, shape = "wide" },
|
|
["CERULEAN_GYM"] = { x = 0, y = 1, shape = "narrow" },
|
|
["CHAMPIONS_ROOM"] = { x = 2, y = 2, shape = "narrow", cam = "wide" },
|
|
["CINNABAR_GYM"] = { x = 18, y = 10, shape = "narrow" },
|
|
["DIGLETTS_CAVE"] = { x = 19, y = 16, shape = "wide" },
|
|
["FIGHTING_DOJO"] = { x = 4, y = 1, shape = "narrow" },
|
|
["LANCES_ROOM"] = { x = 5, y = 15, shape = "wide" },
|
|
["LORELEIS_ROOM"] = { x = 5, y = 2, shape = "narrow" },
|
|
["MT_MOON_1F"] = { x = 24, y = 17, shape = "wide" },
|
|
["MT_MOON_B1F"] = { x = 5, y = 12, shape = "wide" },
|
|
["MT_MOON_B2F"] = { x = 2, y = 16, shape = "wide" },
|
|
|
|
-- The three gyms the default rig cannot stand back from. Five blocks is
|
|
-- further than these rooms are wide, so the eye landed outside the map and
|
|
-- the border ring -- extruded into a cliff by this mode -- crossed the near
|
|
-- mon wherever it stood. `cam = "wide"` swaps in the 44-degree lens (see
|
|
-- BattleCam), which fits inside the room; the mons come out smaller and all
|
|
-- three became stageable. It is asked for HERE, per map, so every area that
|
|
-- does not ask keeps the long lens it was framed for.
|
|
["FUCHSIA_GYM"] = { x = 7, y = 6, shape = "narrow", cam = "wide" },
|
|
["PEWTER_GYM"] = { x = 4, y = 8, shape = "narrow", cam = "wide" },
|
|
["VIRIDIAN_GYM"] = { x = 10, y = 8, shape = "narrow", cam = "wide" },
|
|
}
|