Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ tools/capture-factorio-oracle.sh --factorio /path/to/factorio.app
Notes on using it:

- **The committed fixture targets the experimental branch**, currently 2.1.14, not stable. That is deliberate: the bug reports come from 2.1 and that is where the game is heading. `captureInfo.factorioVersion` in the fixture records which build it came from.
- **Stable and experimental are not identical.** Comparing 2.0.77 stable against 2.1.14 experimental, everything the planner reads is byte-identical except one thing: the pumpjack's output fluid box went from 2 distinct corners to 4, one per rotation (FFF #442). That difference may mean the hardcoded terminal offsets in `Helpers.cs` are wrong for 2.1 - see issue #81. Capture any second version with `--factorio <path>` and `--out <path>` to compare.
- **Stable and experimental are not identical.** Comparing 2.0.77 stable against 2.1.14 experimental, everything the planner reads is byte-identical except one thing: the pumpjack's output fluid box went from 2 distinct corners to 4, one per rotation (FFF #442). That difference did mean the hardcoded terminal offsets in `Helpers.cs` were wrong for 2.1 on east and west, which is issue #81, now fixed. A probe mod settled it by reading `PipeConnection.target_position` out of both running games rather than deriving it; `FactorioOracleTest.TerminalOffsetsMatchTheFactorioOutputCorners` now pins the offsets to the fixture so the next corner move fails a test. Capture any second version with `--factorio <path>` and `--out <path>` to compare.
- **Re-capture after every Factorio update and commit the diff.** A changed fixture is the signal that a hardcoded constant needs review. `--check` answers "has the game moved past what we committed?" without dirtying the tree.
- **The installed binary is the authority** on which version gets captured. Steam updates it without asking, so it decides and everything else follows. Same convention as `scripts/sync-factorio-refs.sh` in FactorioMapWebUI.
- **It runs with user mods disabled** (`--mod-directory` pointed at an empty directory). Mods rewrite prototypes freely, so a capture that loads them describes one person's modded game rather than Factorio. The script prints which mods loaded; expect only `core base elevated-rails quality recycler space-age`.
Expand Down
23 changes: 19 additions & 4 deletions src/FactorioTools/OilField/Helpers.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,33 @@ public static class Helpers
public const int PumpjackHeight = 3;

/// <summary>
/// Where the pipe goes for each pumpjack orientation, relative to the pumpjack's
/// center tile.
///
/// . . . + .
/// . j j j +
/// . j J j .
/// + j j j .
/// . j J j .
/// . j j j +
/// . + . . .
///
/// Up is the top +, then clockwise: Right, Down, Left. The pattern is
/// rotationally symmetric because Factorio 2.1 gives every rotation its own
/// corner. Factorio 2.0 did not: east reused north's corner and west reused
/// south's, so the same picture had both right-hand + marks stacked at the top.
///
/// These are measured, not derived. A probe mod placed pumpjacks in all four
/// rotations and read PipeConnection.target_position - the tile the connecting
/// pipe actually occupies - from the running game. On 2.0.77 the game returns
/// (1,-2), (2,-1), (-1,2), (-2,1), which is what this list used to hold. On
/// 2.1.14 it returns the values below. See issue #81, and FFF #442 for why it
/// changed (entity mirroring).
/// </summary>
public static readonly IReadOnlyList<Tuple<Direction, Location>> TerminalOffsets = new List<Tuple<Direction, Location>>
{
Tuple.Create(Direction.Up, new Location(1, -2)),
Tuple.Create(Direction.Right, new Location(2, -1)),
Tuple.Create(Direction.Right, new Location(2, 1)),
Tuple.Create(Direction.Down, new Location(-1, 2)),
Tuple.Create(Direction.Left, new Location(-2, 1)),
Tuple.Create(Direction.Left, new Location(-2, -1)),
};

public static PumpjackCenter AddPumpjack(SquareGrid grid, Location center)
Expand Down
4 changes: 2 additions & 2 deletions src/lua/FactorioTools/Helpers.lua
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,9 @@ System.namespace("Knapcode.FactorioTools.OilField", function (namespace)
static = function (this)
local default = ListTuple()
default:Add(System.Tuple(0 --[[Direction.Up]], KnapcodeOilField.Location(1, - 2)))
default:Add(System.Tuple(2 --[[Direction.Right]], KnapcodeOilField.Location(2, - 1)))
default:Add(System.Tuple(2 --[[Direction.Right]], KnapcodeOilField.Location(2, 1)))
default:Add(System.Tuple(4 --[[Direction.Down]], KnapcodeOilField.Location(- 1, 2)))
default:Add(System.Tuple(6 --[[Direction.Left]], KnapcodeOilField.Location(- 2, 1)))
default:Add(System.Tuple(6 --[[Direction.Left]], KnapcodeOilField.Location(- 2, - 1)))
TerminalOffsets = default
this.TerminalOffsets = TerminalOffsets
end
Expand Down
Original file line number Diff line number Diff line change
@@ -1,89 +1,88 @@
 FBE -> FBE (effects: 165, beacons: 124, pipes: 68)
FBE -> FBE* (effects: 167, beacons: 126, pipes: 68)
FBE -> snug (effects: 154, beacons: 118, pipes: 68)
FBE -> optimize -> FBE (effects: 164, beacons: 123, pipes: 63)
FBE -> optimize -> FBE* (effects: 168, beacons: 126, pipes: 63)
FBE -> optimize -> snug (effects: 156, beacons: 118, pipes: 63)
FBE* -> FBE (effects: 165, beacons: 124, pipes: 64)
S FBE* -> FBE* (effects: 169, beacons: 127, pipes: 64)
FBE* -> snug (effects: 156, beacons: 118, pipes: 64)
FBE* -> optimize -> FBE (effects: 164, beacons: 123, pipes: 63)
FBE* -> optimize -> FBE* (effects: 168, beacons: 126, pipes: 63)
FBE* -> optimize -> snug (effects: 156, beacons: 118, pipes: 63)
CC-DT -> FBE (effects: 158, beacons: 120, pipes: 65)
CC-DT -> FBE* (effects: 164, beacons: 125, pipes: 65)
CC-DT -> snug (effects: 156, beacons: 118, pipes: 65)
CC-DT -> optimize -> FBE (effects: 160, beacons: 121, pipes: 64)
CC-DT -> optimize -> FBE* (effects: 163, beacons: 124, pipes: 64)
CC-DT -> optimize -> snug (effects: 160, beacons: 120, pipes: 64)
CC-DT-MST -> FBE (effects: 158, beacons: 120, pipes: 69)
CC-DT-MST -> FBE* (effects: 156, beacons: 118, pipes: 69)
CC-DT-MST -> snug (effects: 154, beacons: 120, pipes: 69)
CC-DT-MST -> optimize -> FBE (effects: 161, beacons: 121, pipes: 72)
CC-DT-MST -> optimize -> FBE* (effects: 160, beacons: 120, pipes: 72)
CC-DT-MST -> optimize -> snug (effects: 155, beacons: 118, pipes: 72)
CC-FLUTE -> FBE (effects: 161, beacons: 121, pipes: 69)
CC-FLUTE -> FBE* (effects: 161, beacons: 121, pipes: 69)
CC-FLUTE -> snug (effects: 158, beacons: 120, pipes: 69)
CC-FLUTE -> optimize -> FBE (effects: 163, beacons: 122, pipes: 65)
CC-FLUTE -> optimize -> FBE* (effects: 163, beacons: 122, pipes: 65)
CC-FLUTE -> optimize -> snug (effects: 159, beacons: 120, pipes: 65)
 FBE -> FBE (effects: 159, beacons: 120, pipes: 59)
FBE -> FBE* (effects: 160, beacons: 122, pipes: 59)
FBE -> snug (effects: 156, beacons: 116, pipes: 59)
FBE -> optimize -> FBE (effects: 161, beacons: 123, pipes: 64)
FBE -> optimize -> FBE* (effects: 159, beacons: 122, pipes: 64)
FBE -> optimize -> snug (effects: 156, beacons: 116, pipes: 64)
FBE* -> FBE (effects: 159, beacons: 120, pipes: 59)
FBE* -> FBE* (effects: 160, beacons: 122, pipes: 59)
FBE* -> snug (effects: 156, beacons: 116, pipes: 59)
FBE* -> optimize -> FBE (effects: 161, beacons: 123, pipes: 64)
FBE* -> optimize -> FBE* (effects: 159, beacons: 122, pipes: 64)
FBE* -> optimize -> snug (effects: 156, beacons: 116, pipes: 64)
CC-DT -> FBE (effects: 156, beacons: 119, pipes: 59)
CC-DT -> FBE* (effects: 157, beacons: 120, pipes: 59)
CC-DT -> snug (effects: 156, beacons: 118, pipes: 59)
CC-DT -> optimize -> FBE (effects: 159, beacons: 120, pipes: 58)
S CC-DT -> optimize -> FBE* (effects: 162, beacons: 122, pipes: 58)
CC-DT -> optimize -> snug (effects: 160, beacons: 120, pipes: 58)
CC-DT-MST -> FBE (effects: 161, beacons: 121, pipes: 70)
CC-DT-MST -> FBE* (effects: 159, beacons: 119, pipes: 70)
CC-DT-MST -> snug (effects: 153, beacons: 118, pipes: 70)
CC-DT-MST -> optimize -> FBE (effects: 161, beacons: 122, pipes: 68)
CC-DT-MST -> optimize -> FBE* (effects: 159, beacons: 120, pipes: 68)
CC-DT-MST -> optimize -> snug (effects: 155, beacons: 119, pipes: 68)
CC-FLUTE -> FBE (effects: 157, beacons: 118, pipes: 67)
CC-FLUTE -> FBE* (effects: 154, beacons: 115, pipes: 67)
CC-FLUTE -> snug (effects: 151, beacons: 117, pipes: 67)
CC-FLUTE -> optimize -> FBE (effects: 161, beacons: 121, pipes: 62)
CC-FLUTE -> optimize -> FBE* (effects: 159, beacons: 119, pipes: 62)
CC-FLUTE -> optimize -> snug (effects: 158, beacons: 120, pipes: 62)

. . . . . . . . . . . . . . . . . . . . . . . . . . b b b b b b . b b b b b b . . . . . . . . . . .
. . . . . . . . . . . . b b b b b b . b b b b b b . b B b b B b . b B b b B b . . . . . . . . . . .
. . . . . . . . . . . . b B b b B b . b B b b B b . b b b b b b . b b b b b b . . . . . . . . . . .
. . . . . . . . . E . . b b b b b b . b b b b b b . b b b . E . . . . . b b b . . . . . . . . . . .
. . . . . . . . . E . . b b b b b b . b b b b b b . b b b . . . . . . . b b b E . . . . . . . . . .
. . . . b b b b b b . b b b E . . . . . . . b b b . b B b . . . . . . . b B b . . . . . . . . . . .
. . . . b B b b B b . b B b b b b . . E . . b B b . b b b . . j j j E . b b b . . . . E . . . . . .
. . . . b b b b b b . b b b b B b j j j . . b b b . b b b . . j J j . . . . . . . . . . . . . . . .
. . . . b b b . . . . . . . b b b j J j . . . . E . b B b . + j j j b b b b b b . b b b b b b . . .
. . . . b B b . . . . . . b b b . j j j . . b b b . b b b . o b b b b B b b B b . b B b b B b . . .
. . . . b b b . . j j j < b B b > + < . . . b B b . . . > o o b B b b b b b b b . b b b b b b . . .
. . . . . . . . . j J j . b b b . ^ . b b b b b b . . b b b ^ b b b . . b b b . . . E . b b b . . .
. . . . b b b . . j j j b b b b b b . b B b b b b . . b B b . . . . . . b B b . . . . . b B b . . .
. . . . b B b . . E . . b B b b B b . b b b b B b . . b b b v . j j j . b b b j j j . . b b b . . .
. . . . b b b . . . E . b b b b b b . b b b b b b . . j j j + . j J j b b b . j J j . . . . . . . .
. . . . b b b b b b b b b . b b b . . b B b b b b . . j J j o . j j j b B b . j j j . . b b b . . .
. . . . b B b b B b b B b . b B b . . b b b b B b . . j j j o o + < . b b b > + . E . . b B b . . .
. . . . b b b b b b b b b . b b b v . E . . b b b . . b b b ^ b b b . E . . . . . . . . b b b . . .
. . . . . . . . . . . . . . . . . + o . . . b b b . . b B b E b B b b b b b b b . b b b b b b . . .
b b b b b b b b b b b b b b b j j j ^ b b b b B b . . b b b . b b b b B b b B b . b B b b B b . . .
b B b b B b b B b b B b b B b j J j E b B b b b b . . . . . . . . . b b b b b b . b b b b b b . . .
b b b b b b b b b b b b b b b j j j v b b b . b b b b b b . b b b b b b . . . . . . . . . . . . . .
b b b . . . . o < . . E . . b b b > o + b b b b B b b B b . b B b b B b . . . . . . . . . . . . . .
b B b E . . . + . . . . . . b B b j j j b B b b b b b b b . b b b b b b . . . . . . . . . . . . . .
b b b . . j j j . . b b b . b b b j J j b b b . . . . . . . v . . . . . . . . . . . . . . . . . . .
. . . . . j J j . . b B b b b b . j j j . . b b b o < . . > + b b b . . . . . . . . . . . . . . . .
b b b . . j j j E . b b b b B b . . E . . E b B b ^ . . j j j b B b . . . . . . . . . . . . . . . .
b B b . . . . . . . . . . b b b . . . . . . b b b b b b j J j b b b . . . . . . . . . . . . . . . .
b b b . . . . . . . . . . b b b b b b b b b b b b b B b j j j . . b b b . . . . . . . . . . . . . .
b b b b b b . b b b b b b b B b b B b b B b b B b b b b . b b b . b B b . . . . . . . . . . . . . .
b B b b B b . b B b b B b b b b b b b b b b b b b . j j j b B b E b b b . . . . . . . . . . . . . .
b b b b b b . b b b b b b . . . . . . . . . . . . v j J j b b b . b b b . . . . . . . . . . . . . .
. . . . . E . . . . . . . . . . . . . . . b b b E + j j j . b b b b B b . . . E . . . . . . E . . .
. . . . . . . . . . . . . . . . . . . . . b B b . ^ . . . . b B b b b b E b b b b b b . b b b b b b
. . . . . . . . . . . . . . . . . . . . . b b b b b b b b b b b b . b b b b B b b B b . b B b b B b
. . . . . . . . . . . . . . . . . . . . . b b b b B b b B b . b b b b B b b b b b b b . b b b b b b
. . . . . . . . . . . . . . . . . . . . . b B b b b b b b b . b B b b b b b b b . . . . . . . b b b
. . . . . . . . . . . . . . . . . . . . . b b b b b b . . . . b b b b b b b B b . . . . . E . b B b
. . . . . . . . . . . . . . . . . . . . . E . . b B b . . . . . . . b B b b b b . . j j j . . b b b
. . . . . . . . . . . . . . . . . . b b b b b b b b b . . j j j . . b b b . . . . . j J j . . . . .
. . . . . . . . . . . . . . . . . . b B b b B b . v . . . j J j . . E . . b b b o + j j j . . b b b
. . . . . . . . . . . . . . . . . . b b b b b b . o < . > j j j b b b . . b B b ^ b b b E . . b B b
. . . . . . . . . . . . . . . . . . b b b . . . . o . b b b . . b B b . . b b b . b B b . . . b b b
. . . . . . . . . . . . . . . . . . b B b . . . . + o b B b . . b b b . . . b b b b b b b b b b b b
. . . . . . . . . . . . . . . . . . b b b E . j j j ^ b b b . b b b b b b . b B b b b b b B b b B b
. . . . . . . . . b b b b b b b b b . . . . . j J j . . . . . b B b b B b . b b b b B b b b b b b b
. . . . . . . . . b B b b B b b B b b b b . . j j j E . b b b b b b b b b j j j . b b b . . . . . .
. . . . . . . . . b b b b b b b b b b B b . . . . . . . b B b . . . . . . j J j . . . . . . . . . .
. . . . . . . . . b b b . . . . . . b b b . . . . . v . b b b . b b b . E j j j v . b b b . . . . .
. . . . . . . . . b B b . . E . + < b b b b b b . > o < b b b . b B b . > + o o o . b B b . . E . .
. . . . . . . . . b b b . . j j j . b B b b B b . . . . b B b . b b b . . . . . . . b b b . . . . .
. . . . . . . . . . . . . . j J j . b b b b b b . . . . b b b . b b b b b b . b b b b b b . . . . .
. . . . b B b b B b . b B b b b b . . E . . b B b . b b b . E j j j . . b b b . . . . . . . . . . .
. . . . b b b b b b . b b b b B b j j j . . b b b . . . . . . j J j . . . . . . . . . . . . . . . .
. . . . b b b . . . . . . . b b b j J j . . . . . . . b b b E j j j . . b b b . . b b b b b b . . .
. . . . b B b . . . . . b b b . . j j j + < b b b . . b B b > + . . . . b B b . . b B b b B b . . .
. . . . b b b . . j j j b B b . . . . . o . b B b . . b b b . ^ b b b . b b b . . b b b b b b . . .
. . . . . . . . . j J j b b b . . . . . o . b b b b b b b b b . b B b . b b b . . . . . b b b . . .
. . . . b b b . . j j j < b b b . . > o o . b b b b B b b B b v b b b . b B b . . E . . b B b . . .
. . . . b B b . . E . . . b B b . . . ^ . . b B b b b b b b b + j j j . b b b j j j . . b b b . . .
. . . . b b b . . . b b b b b b . . . b b b b b b . . j j j . o j J j b b b . j J j . . . . . . . .
. . . . b b b b b b b B b . b b b . . b B b b b b . E j J j . o j j j b B b . j j j . . b b b . . .
. . . E b B b b B b b b b . b B b . . b b b b B b . . j j j + o < E . b b b > + . . . . b B b . . .
. . . . b b b b b b . . . . b b b . E . . . b b b . . . b b b ^ b b b E . . . . . . . . b b b . . .
. . . . . . E . . . . . . . . . . . b b b . b b b b b b b B b . b B b . . b b b . b b b b b b . . .
b b b b b b b b b b b b . . . j j j b B b . b B b b B b b b b . b b b . . b B b . b B b b B b . . .
b B b b B b b B b b B b b b b j J j b b b . b b b b b b . . . . . . . . . b b b . b b b b b b . . .
b b b b b b b b b b b b b B b j j j . v b b b b b b b b b . b b b b b b . . . . . . . E . . . . . .
b b b . . . . . . . . . b b b + < E > + b B b b B b b B b . b B b b B b . . . . . . . . . . . . . .
b B b . . . . + < . b b b . > o . j j j b b b b b b b b b . b b b b b b . . . . . . . . . . . . . .
b b b . . j j j E . b B b . b b b j J j b b b b b b . E . . . . . b b b . . . . . . . . . . . . . .
. . . . . j J j . . b b b E b B b j j j b B b b B b . . . . E . . b B b . . . . . . . . . . . . . .
b b b . . j j j . . b b b . b b b . . . b b b b b b . . j j j . . b b b . . . . . . . . . . . . . .
b B b . . E . . . . b B b . . . . . . . . b b b . b b b j J j v . . . . . . . . . . . . . . . . . .
b b b . . . . . . . b b b b b b b b b . . b B b . b B b j j j + . b b b . . . . . . . . . . . . . .
b b b b b b . b b b b b b b B b b B b . . b b b . b b b . . . ^ . b B b . . . . . . . . . . . . . .
b B b b B b . b B b b B b b b b b b b . . . . b b b j j j . . . . b b b . . . . . . . . . . . . . .
b b b b b b . b b b b b b . . . . . E . . . . b B b j J j . . v . b b b . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . b b b j j j + o o . b B b . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . E . . . . ^ E b b b . b b b b b b . b b b b b b
. . . . . . . . . . . E . . . . . . . . . . . . . . . . . . . b b b b b b b B b b B b . b B b b B b
. . . . . . . . . . . . . . . . . . . . . b b b b b b . b b b b B b b B b b b b b b b . b b b b b b
. . . . . . . . . . . . . . . . . . . . E b B b b B b . b B b b b b b b b b b b . . . . . . . b b b
. . . . . . . . . . . . . . . . . . . . . b b b b b b . b b b v . . b b b b B b E . . . . . . b B b
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + o < b B b b b b . > j j j E . b b b
. . . . . . . . . . . . . . . . . . b b b b b b . . . . . j j j ^ . b b b . . . . . j J j . . . . .
. . . . . . . . . . . . . . . . . . b B b b B b . . b b b j J j . . b b b b b b . . j j j . . b b b
. . . . . . . . . . . . . . . . . . b b b b b b . . b B b j j j . . b B b b B b . . b b b . . b B b
. . . . . . . . . . . . . . . . . . b b b . . . . . b b b . . E . . b b b b b b . . b B b . . b b b
. . . . . . . . . . . . . . . . . . b B b . . . . . b b b b b b . b b b . b b b . . b b b . . b b b
. . . . . . . . . . . . . . E . . . b b b . . j j j b B b b B b . b B b . b B b . . b b b . . b B b
. . . . . . . . . b b b b b b . . . b b b . . j J j b b b b b b v b b b . b b b . . b B b . . b b b
. . . . . . . . . b B b b B b . . . b B b . . j j j + < b b b > o < . . > j j j . . b b b . . . . E
. . . . . . . . . b b b b b b . o < b b b . . E . > o . b B b . . . . . . j J j . . . . . E . . . .
. . . . . . . . . b b b . . . . o . b b b . . . . . . . b b b . b b b . E j j j E . b b b . . . . .
. . . . . . . . . b B b . . . . + . b B b b b b . b b b b b b E b B b . . . . . . . b B b . . . . .
. . . . . . . . . b b b . . j j j . b b b b B b . b B b b B b . b b b . . . . . . . b b b . . . . .
. . . . . . . . . . . . . . j J j . . . . b b b E b b b b b b . b b b b b b . b b b b b b . . . . .
. . . . . . . . . b b b . . j j j . . b b b . . . . . . . . . . b B b b B b . b B b b B b . . . . .
. . . . . . . . . b B b . . . . . . E b B b . . . . . . . . . . b b b b b b . b b b b b b . . . . .
. . . . . . . . . b B b . . E . . . . b B b . . . . . . . . . . b b b b b b . b b b b b b . . . . .
. . . . . . . . . b b b . . . . . . . b b b . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . b b b b b b . b b b b b b . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . b B b b B b . b B b b B b . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . b B b b B b . b B b b B b E . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . b b b b b b . b b b b b b . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . E . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Loading