Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/graph #327

Draft
wants to merge 10 commits into
base: refactor/mutliplayer
Choose a base branch
from
Draft
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
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
using engenious.Graphics;

using OctoAwesome.Basics.Definitions.Materials;
using OctoAwesome.Caching;
using OctoAwesome.Chunking;
using OctoAwesome.Definitions;
using OctoAwesome.Graphs;

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace OctoAwesome.Basics.Definitions.Blocks;
/// <summary>
/// Block definition for light on blocks.
/// </summary>
public class BatteryBlockDefinition : BlockDefinition, INetworkBlock<int>
{
/// <inheritdoc />
public override string Icon => "light_on";

/// <inheritdoc />
public override string DisplayName => "Akku";

/// <inheritdoc />
public override string[] Textures { get; } = ["light_off", "light_on", "light_off", "light_on", "light_off", "light_on", "light_off", "light_on"];

/// <inheritdoc />
public override IMaterialDefinition Material { get; }
public string[] TransferTypes { get; } = ["Energy"];

/// <summary>
/// Initializes a new instance of the <see cref="CactusBlockDefinition"/> class.
/// </summary>
/// <param name="material">The material definition for this cactus block definition.</param>
public BatteryBlockDefinition(CactusMaterialDefinition material)
{
Material = material;
}

/// <inheritdoc/>
public override int GetTextureIndex(Wall wall, ILocalChunkCache manager, int x, int y, int z)
{
var meta = manager.GetBlockMeta(x, y, z);
return meta & 7;
}

public NodeBase CreateNode()
{
return new BatteryNode();
}
}





internal partial class BatteryNode : Node<int>, ITargetNode<int>, ISourceNode<int>
{
const int MaxCharge = 30000;
const int MaxChargeRate = 100;
const int MaxDischargeRate = 500;

int currentCharge = 0;
private int canChargeThisRound;

int ITargetNode<int>.Priority { get; } = int.MaxValue;
int ISourceNode<int>.Priority { get; } = int.MaxValue;

public SourceInfo<int> GetCapacity(Simulation simulation)
{
currentCharge = Math.Min(MaxCharge, Math.Max(0, currentCharge));

return new SourceInfo<int>(default, default) { Node = this, Data = Math.Min(MaxDischargeRate, currentCharge) };
}

public TargetInfo<int> GetRequired()
{
canChargeThisRound = Math.Max(0, Math.Min(MaxCharge - currentCharge, MaxChargeRate));

return new EnergyTargetInfo(this, 1, canChargeThisRound, 0);
}

public void Use(SourceInfo<int> sourceInfo, IChunkColumn column)
{
currentCharge -= sourceInfo.UseInfo;
column.SetBlockMeta(Position, currentCharge / 3750);
}

public void Execute(TargetInfo<int> targetInfo, IChunkColumn column)
{
if (targetInfo is not EnergyTargetInfo energyInfo)
return;
currentCharge += energyInfo.RepeatedTimes;
column.SetBlockMeta(Position, currentCharge / 3750);

}

public override void Deserialize(BinaryReader reader)
{
base.Deserialize(reader);
currentCharge = reader.ReadInt32();
}

public override void Serialize(BinaryWriter writer)
{
base.Serialize(writer);
writer.Write(currentCharge);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@ public sealed class BirchWoodBlockDefinition : BlockDefinition
public override bool HasMetaData => true;

/// <inheritdoc />
public override string[] Textures { get; } = { "birch_wood_top",
"birch_wood_side" };
public override string[] Textures { get; } = [ "birch_wood_top",
"birch_wood_side" ];

/// <inheritdoc />
public override IMaterialDefinition Material { get; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public sealed class BlueCottonBlockDefinition : BlockDefinition
public override string Icon => "cotton_blue";

/// <inheritdoc />
public override string[] Textures { get; } = { "cotton_blue" };
public override string[] Textures { get; } = ["cotton_blue"];

/// <inheritdoc />
public override IMaterialDefinition Material { get; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public sealed class BrickBlockDefinition : BlockDefinition
public override string Icon => "brick_red";

/// <inheritdoc />
public override string[] Textures { get; } = { "brick_red", };
public override string[] Textures { get; } = ["brick_red",];

/// <inheritdoc />
public override IMaterialDefinition Material { get; }
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,21 @@
using OctoAwesome.Basics.Definitions.Materials;
using engenious.Content.Serialization;

using OctoAwesome.Basics.Definitions.Materials;
using OctoAwesome.Caching;
using OctoAwesome.Chunking;
using OctoAwesome.Definitions;
using OctoAwesome.Graphs;

using System.Data.Common;
using System.Diagnostics;
using System.Threading;

namespace OctoAwesome.Basics.Definitions.Blocks
{
/// <summary>
/// Block definition for cactus blocks.
/// </summary>
public class CactusBlockDefinition : BlockDefinition
public class CactusBlockDefinition : BlockDefinition, INetworkBlock<int>, INetworkBlock<Signal>
{
/// <inheritdoc />
public override string Icon => "cactus_inside";
Expand All @@ -16,10 +24,11 @@ public class CactusBlockDefinition : BlockDefinition
public override string DisplayName => Languages.OctoBasics.Cactus;

/// <inheritdoc />
public override string[] Textures { get; } = { "cactus_inside", "cactus_side", "cactus_top" };
public override string[] Textures { get; } = ["cactus_inside", "cactus_side", "cactus_top"];

/// <inheritdoc />
public override IMaterialDefinition Material { get; }
public string[] TransferTypes { get; } = ["Energy", "Signal"];

/// <summary>
/// Initializes a new instance of the <see cref="CactusBlockDefinition"/> class.
Expand All @@ -34,7 +43,12 @@ public CactusBlockDefinition(CactusMaterialDefinition material)
public override int GetTextureIndex(Wall wall, ILocalChunkCache manager,
int x, int y, int z)
{
OrientationFlags orientation = (OrientationFlags)manager.GetBlockMeta(x, y, z);
var meta = manager.GetBlockMeta(x, y, z);
OrientationFlags orientation = (OrientationFlags)(meta & 0xFF);
var rotData = (meta >> 7) & 2;

if (rotData > 0)
return rotData;

switch (wall)
{
Expand Down Expand Up @@ -210,5 +224,59 @@ public override int GetTextureRotation(Wall wall, ILocalChunkCache manager, int
return base.GetTextureRotation(wall, manager, x, y, z); //should never ever happen
}
}

public NodeBase CreateNode()
{
return new CactusBlockNode();
}

}

internal partial class CactusBlockNode : Node<int>, ISourceNode<int>, ITargetNode<Signal>
{
bool isOn = false;
bool signalEnabled = false;

public int Priority { get; } = 1;

public override void Interact()
{
isOn = !isOn;
}

public SourceInfo<int> GetCapacity(Simulation simulation)
{
return new SourceInfo<int>(this, isOn ? 100 : 0);
}

public void Use(SourceInfo<int> targetInfo, IChunkColumn? column)
{
var oldMeta = column.GetBlockMeta(Position.X, Position.Y, Position.Z);

var rotData = ((oldMeta >> 7) + 1) & 2;
if (isOn && rotData == 0)
rotData = 1;
else if (!isOn)
rotData = 0;

oldMeta = ((isOn ? rotData : 0) << 7) | (oldMeta & 0xFF);

column.SetBlockMeta(Position, oldMeta);
}


public void Execute(TargetInfo<Signal> targetInfo, IChunkColumn? column)
{
if(signalEnabled != targetInfo.Data.Enabled)
{
signalEnabled = !signalEnabled;
isOn = signalEnabled;
}
}

public TargetInfo<Signal> GetRequired()
{
return new TargetInfo<Signal>(this, new Signal { Channel = "Green" });
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public sealed class DirtBlockDefinition : BlockDefinition
public override string Icon => "dirt";

/// <inheritdoc />
public override string[] Textures { get; } = { "dirt" };
public override string[] Textures { get; } = ["dirt"];

/// <inheritdoc />
public override IMaterialDefinition Material { get; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@ public sealed class GrassBlockDefinition : BlockDefinition
public override string Icon => "grass_top";

/// <inheritdoc />
public override string[] Textures { get; } = { "grass_top",
public override string[] Textures { get; } = [ "grass_top",
"dirt",
"dirt_grass" };
"dirt_grass" ];

/// <inheritdoc />
public override IMaterialDefinition Material { get; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public sealed class GravelBlockDefinition : BlockDefinition
public override string Icon => "gravel";

/// <inheritdoc />
public override string[] Textures { get; } = { "gravel" };
public override string[] Textures { get; } = ["gravel"];

/// <inheritdoc />
public override IMaterialDefinition Material { get; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public sealed class GreenCottonBlockDefinition : BlockDefinition
public override string Icon => "cotton_green";

/// <inheritdoc />
public override string[] Textures { get; } = { "cotton_green" };
public override string[] Textures { get; } = ["cotton_green"];

/// <inheritdoc />
public override IMaterialDefinition Material { get; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public sealed class GreystoneBlockDefinition : BlockDefinition
public override string Icon => "greystone";

/// <inheritdoc />
public override string[] Textures { get; } = { "greystone" };
public override string[] Textures { get; } = ["greystone"];

/// <inheritdoc />
public override IMaterialDefinition Material { get; }
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
using OctoAwesome.Basics.Definitions.Materials;
using OctoAwesome.Caching;
using OctoAwesome.Definitions;
using OctoAwesome.Graphs;

using System.Resources;

namespace OctoAwesome.Basics.Definitions.Blocks
{
Expand All @@ -15,7 +19,7 @@ public sealed class IceBlockDefinition : BlockDefinition
public override string Icon => "ice";

/// <inheritdoc />
public override string[] Textures { get; } = { "ice" };
public override string[] Textures { get; } = ["ice"];

/// <inheritdoc />
public override IMaterialDefinition Material { get; }
Expand All @@ -30,4 +34,5 @@ public IceBlockDefinition(IceMaterialDefinition material)
}

}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
using OctoAwesome.Basics.Definitions.Materials;
using OctoAwesome.Caching;
using OctoAwesome.Definitions;
using OctoAwesome.EntityComponents;
using OctoAwesome.Graphs;

using System.Resources;

namespace OctoAwesome.Basics.Definitions.Blocks
{

/// <summary>
/// Block definition for signal cable blocks.
/// </summary>
public sealed class ItemCableDefinition : BlockDefinition, INetworkBlock<ItemTransfer>
{
/// <inheritdoc />
public override string DisplayName => "Item Cable";

/// <inheritdoc />
public override string Icon => "sand";

/// <inheritdoc />
public override string[] Textures { get; } = ["sand"];

/// <inheritdoc />
public override IMaterialDefinition Material { get; }
public string[] TransferTypes { get; } = ["ItemTransfer"];

/// <summary>
/// Initializes a new instance of the <see cref="ItemCableDefinition"/> class.
/// </summary>
/// <param name="material">The material definition for this signal block definition.</param>
public ItemCableDefinition(IceMaterialDefinition material)
{
Material = material;
}

public NodeBase CreateNode()
{
return new ItemCableNode();
}
}

internal partial class ItemCableNode : EmptyTransferNode<ItemTransfer>
{

}


}
Loading