You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
183 lines
4.3 KiB
183 lines
4.3 KiB
using System.Collections.Generic;
|
|
using Babushka.scripts.CSharp.Common.Util;
|
|
using Godot;
|
|
|
|
namespace Babushka.scripts.CSharp.Common.Fight;
|
|
|
|
public partial class FightWorld : Node
|
|
{
|
|
public class World
|
|
{
|
|
public required List<Room> rooms;
|
|
}
|
|
|
|
public class Room
|
|
{
|
|
public required Dictionary<int, Room> paths;
|
|
public required List<EnemyGroup> enemyGroups;
|
|
}
|
|
|
|
public class EnemyGroup
|
|
{
|
|
public required List<Fighter> enemies;
|
|
}
|
|
|
|
public class FightHappeningData
|
|
{
|
|
public FightHappening.FightState fightState = FightHappening.FightState.None;
|
|
public FighterStack fighterStack = new();
|
|
public required EnemyGroup enemyGroup;
|
|
}
|
|
|
|
public class Fighter
|
|
{
|
|
public enum Type
|
|
{
|
|
Blob,
|
|
BigBlob,
|
|
Mavka,
|
|
YourMom,
|
|
Vesna
|
|
}
|
|
|
|
public required Type type;
|
|
public required int maxHealth;
|
|
public required bool isEnemy;
|
|
public required List<FighterAction> availableActions;
|
|
public int? health = null; // null => initialize to full health on spawn
|
|
public bool entered = false;
|
|
public int actionsLeft;
|
|
|
|
public FighterAction AutoSelectAction()
|
|
{
|
|
return availableActions.Random() ?? new FighterAction.Skip();
|
|
}
|
|
}
|
|
|
|
#region AutoLoad ( Contains _EnterTree() )
|
|
|
|
public static FightWorld Instance { get; private set; } = null!;
|
|
|
|
public override void _EnterTree()
|
|
{
|
|
Instance = this;
|
|
MyEnterTree();
|
|
}
|
|
|
|
#endregion
|
|
|
|
public World? world = null;
|
|
public Room? currentRoom = null;
|
|
public FightHappeningData? fightHappeningData = null;
|
|
|
|
public void MyEnterTree()
|
|
{
|
|
Generate();
|
|
currentRoom = world!.rooms[0];
|
|
}
|
|
|
|
public void Generate()
|
|
{
|
|
world = new Generator().GenerateWorld();
|
|
}
|
|
|
|
private class Generator
|
|
{
|
|
public World GenerateWorld()
|
|
{
|
|
var world = new World
|
|
{
|
|
rooms = GenerateRooms()
|
|
};
|
|
return world;
|
|
}
|
|
|
|
private List<Room> GenerateRooms()
|
|
{
|
|
var rooms = new List<Room>();
|
|
|
|
var roomCount = 2;
|
|
|
|
for (var i = 0; i < roomCount; i++)
|
|
{
|
|
rooms.Add(GenerateDisconnectedRoom());
|
|
}
|
|
|
|
// Connect rooms linearly
|
|
for (var i = 0; i < rooms.Count - 1; i++)
|
|
{
|
|
rooms[i].paths[0] = rooms[i + 1];
|
|
rooms[i + 1].paths[1] = rooms[i];
|
|
}
|
|
|
|
return rooms;
|
|
}
|
|
|
|
private Room GenerateDisconnectedRoom()
|
|
{
|
|
var room = new Room
|
|
{
|
|
paths = new Dictionary<int, Room>(),
|
|
enemyGroups = GenerateEnemyGroups()
|
|
};
|
|
return room;
|
|
}
|
|
|
|
private List<EnemyGroup> GenerateEnemyGroups()
|
|
{
|
|
var enemyGroups = new List<EnemyGroup>();
|
|
|
|
var enemyGroupCount = GD.RandRange(1, 3);
|
|
|
|
for (var i = 0; i < enemyGroupCount; i++)
|
|
{
|
|
enemyGroups.Add(GenerateSingleEnemyGroup());
|
|
}
|
|
|
|
return enemyGroups;
|
|
}
|
|
|
|
private EnemyGroup GenerateSingleEnemyGroup()
|
|
{
|
|
var enemyGroup = new EnemyGroup
|
|
{
|
|
enemies = []
|
|
};
|
|
|
|
var enemyCount = GD.RandRange(1, 3);
|
|
|
|
for (var i = 0; i < enemyCount; i++)
|
|
{
|
|
enemyGroup.enemies.Add(GenerateSingleEnemy());
|
|
}
|
|
|
|
return enemyGroup;
|
|
}
|
|
|
|
private Fighter GenerateSingleEnemy()
|
|
{
|
|
var typeRoll = GD.RandRange(0, 99);
|
|
|
|
var type = typeRoll switch
|
|
{
|
|
< 50 => Fighter.Type.Blob,
|
|
< 75 => Fighter.Type.BigBlob,
|
|
< 90 => Fighter.Type.Mavka,
|
|
_ => Fighter.Type.YourMom
|
|
};
|
|
|
|
var enemy = new Fighter
|
|
{
|
|
type = type,
|
|
health = null,
|
|
isEnemy = true,
|
|
maxHealth = 12,
|
|
availableActions = [
|
|
new FighterAction.Skip()
|
|
]
|
|
};
|
|
|
|
return enemy;
|
|
}
|
|
}
|
|
} |