public void Update() { if (!Active) { return; } var p = World.ScreenToWorld(Input.mousePosition); if (Input.GetMouseButtonDown(0)) { if (p.x >= 0 && p.y >= 0 && p.x < World.World.Size && p.y < World.World.Size) { Start = p; StartPlate = World.World.States[World.World.CurStateIndex].Plate[World.World.GetIndex(p.x, p.y)]; } else { StartPlate = -1; } } if (Input.GetMouseButton(0) && StartPlate >= 0) { World.World.ApplyInput((nextState) => { if (p != Start) { int nextStateIndex = World.World.AdvanceState(); Vector2 diff = new Vector2(p.x - Start.x, p.y - Start.y); Vector2Int move; if (Math.Abs(diff.x) > Math.Abs(diff.y)) { move = new Vector2Int(Math.Sign(diff.x), 0); } else { move = new Vector2Int(0, Math.Sign(diff.y)); } Sim.Geology.MovePlate(World.World, World.World.States[World.World.CurStateIndex], nextState, StartPlate, move); Start = p; World.World.CurStateIndex = nextStateIndex; } }); } }
// Update is called once per frame void Update() { if (!Active) { return; } var p = World.ScreenToWorld(Input.mousePosition); if (Input.GetMouseButton(0)) { World.World.ApplyInput((System.Action <World.State>)((nextState) => { for (int i = -Mathf.CeilToInt(BrushSize); i <= Mathf.CeilToInt(BrushSize); i++) { for (int j = -Mathf.CeilToInt(BrushSize); j <= Mathf.CeilToInt(BrushSize); j++) { float dist = Mathf.Sqrt(i * i + j * j); if (dist <= BrushSize) { float distT = (BrushSize == 0) ? 1.0f : (1.0f - Mathf.Pow(dist / BrushSize, 2)); int x = World.World.WrapX(p.x + i); int y = p.y + j; if (y < 0 || y >= World.World.Size) { continue; } int index = World.World.GetIndex(x, y); nextState.Elevation[index] += Direction * distT * DeltaPerSecond * Time.deltaTime; float oceanDepth = nextState.WaterDepth[index]; nextState.ShallowWaterEnergy[index] = Sim.Atmosphere.GetWaterEnergy(World.World, nextState.LowerAirTemperature[index], World.World.Data.DeepOceanDepth, nextState.ShallowSaltMass[index]); nextState.DeepWaterEnergy[index] = Sim.Atmosphere.GetWaterEnergy(World.World, World.World.Data.FreezingTemperature + 3, oceanDepth, 0); nextState.DeepSaltMass[index] = oceanDepth * 35; nextState.ShallowSaltMass[index] = World.World.Data.DeepOceanDepth * 35; } } } })); } }
public void Update() { if (!Active) { return; } var wp = World.ScreenToWorld(Input.mousePosition); var p = new Vector2Int((int)wp.x, (int)wp.y); if (Input.GetMouseButtonDown(0)) { _lastTileToggled = new Vector2Int(-1, 0); _toggleOn = true; var herd = World.World.States[World.World.CurStateIndex].Herds[World.HerdSelected]; for (int i = 0; i < herd.DesiredTileCount; i++) { if (herd.DesiredTiles[i] == p) { _toggleOn = false; } } } if (Input.GetMouseButton(0)) { World.World.ApplyInput((nextState) => { if (p != _lastTileToggled) { var herd = World.World.States[World.World.CurStateIndex].Herds[World.HerdSelected]; int desiredTileCount = herd.DesiredTileCount; if (_toggleOn) { if (desiredTileCount < Herd.MaxDesiredTiles) { for (int i = 0; i < herd.DesiredTileCount; i++) { if (herd.DesiredTiles[i] == p) { goto FoundIt; } } nextState.Herds[World.HerdSelected].DesiredTiles[desiredTileCount] = p; nextState.Herds[World.HerdSelected].DesiredTileCount = desiredTileCount + 1; FoundIt:; } } else { for (int i = 0; i < desiredTileCount; i++) { if (herd.DesiredTiles[i] == p) { for (int j = i; j < desiredTileCount - 1; j++) { nextState.Herds[World.HerdSelected].DesiredTiles[j] = herd.DesiredTiles[j + 1]; } nextState.Herds[World.HerdSelected].DesiredTileCount = desiredTileCount - 1; break; } } } _lastTileToggled = p; } }); } }