Support for generating creatures on the map, adding the game end screen.
支持在地图上生成生物了,加入了游戏结束的画面。
This commit is contained in:
parent
64688252f0
commit
74c85cd5a7
|
@ -22,3 +22,4 @@ player_spawn_debug,玩家{0}生成在{1}。,"Player {0} spawned at {1}.",プレ
|
||||||
player_packed_scene_not_exist,玩家预制场景不存在。,Player packed scene does not exist.,プレイヤーのパックされたシーンが存在しません。
|
player_packed_scene_not_exist,玩家预制场景不存在。,Player packed scene does not exist.,プレイヤーのパックされたシーンが存在しません。
|
||||||
exit_the_room_debug,节点{0}退出房间{1}。,"Node {0} exits room {1}.",ノード{0}が部屋{1}を退出します。
|
exit_the_room_debug,节点{0}退出房间{1}。,"Node {0} exits room {1}.",ノード{0}が部屋{1}を退出します。
|
||||||
enter_the_room_debug,节点{0}进入房间{1}。,"Node {0} enters room {1}.",ノード{0}が部屋{1}に入ります。
|
enter_the_room_debug,节点{0}进入房间{1}。,"Node {0} enters room {1}.",ノード{0}が部屋{1}に入ります。
|
||||||
|
death_info,生物{0}被{1}击败。,"Creature {0} was defeated by {1}.",生物{0}が{1}によって打ち負かされました。
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -32,3 +32,6 @@ re_create_map,重新创建地图,Re-create map,地図を再作成します
|
||||||
seed_info,种子:{0},Seed: {0},シード:{0}
|
seed_info,种子:{0},Seed: {0},シード:{0}
|
||||||
tags,标签,Tags,と呼ぶ
|
tags,标签,Tags,と呼ぶ
|
||||||
room_injection_processor,房间注入处理器,Room injection processor,部屋注入処理器
|
room_injection_processor,房间注入处理器,Room injection processor,部屋注入処理器
|
||||||
|
game_over_title,游戏结束!,Game Over!,ゲームオーバー!
|
||||||
|
death_info_describe,死因,death,死因
|
||||||
|
restart,重新开始,Restart,ぶり返す
|
||||||
|
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -1,6 +1,7 @@
|
||||||
[gd_scene load_steps=6 format=3 uid="uid://b0uurp551pku"]
|
[gd_scene load_steps=7 format=3 uid="uid://b0uurp551pku"]
|
||||||
|
|
||||||
[ext_resource type="TileSet" uid="uid://c4wpp12rr44hi" path="res://tileSets/dungeon.tres" id="1_a15hy"]
|
[ext_resource type="TileSet" uid="uid://c4wpp12rr44hi" path="res://tileSets/dungeon.tres" id="1_a15hy"]
|
||||||
|
[ext_resource type="Script" path="res://scripts/map/AiCharacterSpawn.cs" id="2_wamhd"]
|
||||||
|
|
||||||
[sub_resource type="RectangleShape2D" id="RectangleShape2D_kiih8"]
|
[sub_resource type="RectangleShape2D" id="RectangleShape2D_kiih8"]
|
||||||
size = Vector2(443, 118)
|
size = Vector2(443, 118)
|
||||||
|
@ -53,3 +54,8 @@ shape = SubResource("RectangleShape2D_30r3c")
|
||||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="RoomSlotList/Area2D3"]
|
[node name="CollisionShape2D" type="CollisionShape2D" parent="RoomSlotList/Area2D3"]
|
||||||
position = Vector2(193, 15)
|
position = Vector2(193, 15)
|
||||||
shape = SubResource("RectangleShape2D_7tsse")
|
shape = SubResource("RectangleShape2D_7tsse")
|
||||||
|
|
||||||
|
[node name="Marker2D" type="Marker2D" parent="."]
|
||||||
|
position = Vector2(220, 103)
|
||||||
|
script = ExtResource("2_wamhd")
|
||||||
|
metadata/ResPath = "res://prefab/entitys/DelivererOfDarkMagic.tscn"
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
[gd_scene load_steps=6 format=3 uid="uid://dslr5tdbp4noq"]
|
[gd_scene load_steps=7 format=3 uid="uid://dslr5tdbp4noq"]
|
||||||
|
|
||||||
[ext_resource type="TileSet" uid="uid://c4wpp12rr44hi" path="res://tileSets/dungeon.tres" id="1_rn2om"]
|
[ext_resource type="TileSet" uid="uid://c4wpp12rr44hi" path="res://tileSets/dungeon.tres" id="1_rn2om"]
|
||||||
|
[ext_resource type="Script" path="res://scripts/map/AiCharacterSpawn.cs" id="2_7q101"]
|
||||||
|
|
||||||
[sub_resource type="RectangleShape2D" id="RectangleShape2D_kiih8"]
|
[sub_resource type="RectangleShape2D" id="RectangleShape2D_kiih8"]
|
||||||
size = Vector2(441, 122)
|
size = Vector2(441, 122)
|
||||||
|
@ -54,3 +55,8 @@ position = Vector2(498, 109)
|
||||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="RoomSlotList/Area2D2"]
|
[node name="CollisionShape2D" type="CollisionShape2D" parent="RoomSlotList/Area2D2"]
|
||||||
position = Vector2(0, 17)
|
position = Vector2(0, 17)
|
||||||
shape = SubResource("RectangleShape2D_131jn")
|
shape = SubResource("RectangleShape2D_131jn")
|
||||||
|
|
||||||
|
[node name="Marker2D" type="Marker2D" parent="."]
|
||||||
|
position = Vector2(183, 72)
|
||||||
|
script = ExtResource("2_7q101")
|
||||||
|
metadata/ResPath = "res://prefab/entitys/DelivererOfDarkMagic.tscn"
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
[gd_scene load_steps=5 format=3 uid="uid://du5ldsp613fei"]
|
[gd_scene load_steps=6 format=3 uid="uid://du5ldsp613fei"]
|
||||||
|
|
||||||
[ext_resource type="TileSet" uid="uid://c4wpp12rr44hi" path="res://tileSets/dungeon.tres" id="1_rn2om"]
|
[ext_resource type="TileSet" uid="uid://c4wpp12rr44hi" path="res://tileSets/dungeon.tres" id="1_rn2om"]
|
||||||
[ext_resource type="Script" path="res://scripts/map/PlayerSpawn.cs" id="2_6p8mv"]
|
[ext_resource type="Script" path="res://scripts/map/PlayerSpawn.cs" id="2_6p8mv"]
|
||||||
|
[ext_resource type="PackedScene" uid="uid://dnnn2xyayiehk" path="res://prefab/weapons/staffOfTheUndead.tscn" id="3_ud0w8"]
|
||||||
|
|
||||||
[sub_resource type="RectangleShape2D" id="RectangleShape2D_kiih8"]
|
[sub_resource type="RectangleShape2D" id="RectangleShape2D_kiih8"]
|
||||||
size = Vector2(450, 191)
|
size = Vector2(450, 191)
|
||||||
|
@ -41,3 +42,6 @@ debug_color = Color(0.854902, 0.14902, 0.823529, 0.419608)
|
||||||
[node name="Marker2D" type="Marker2D" parent="."]
|
[node name="Marker2D" type="Marker2D" parent="."]
|
||||||
position = Vector2(216, 113)
|
position = Vector2(216, 113)
|
||||||
script = ExtResource("2_6p8mv")
|
script = ExtResource("2_6p8mv")
|
||||||
|
|
||||||
|
[node name="StaffOfTheUndead" parent="." instance=ExtResource("3_ud0w8")]
|
||||||
|
position = Vector2(231, 116)
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
[gd_scene load_steps=6 format=3 uid="uid://bnftvkj2cido7"]
|
[gd_scene load_steps=7 format=3 uid="uid://bnftvkj2cido7"]
|
||||||
|
|
||||||
[ext_resource type="Script" path="res://scripts/loader/sceneLoader/GameSceneLoader.cs" id="1_mqdgt"]
|
[ext_resource type="Script" path="res://scripts/loader/sceneLoader/GameSceneLoader.cs" id="1_mqdgt"]
|
||||||
[ext_resource type="Texture2D" uid="uid://cs6e0af876ss5" path="res://sprites/ui/HeartEmpty.png" id="2_n1yht"]
|
[ext_resource type="Texture2D" uid="uid://cs6e0af876ss5" path="res://sprites/ui/HeartEmpty.png" id="2_n1yht"]
|
||||||
[ext_resource type="Script" path="res://scripts/inventory/HotBar.cs" id="2_owrhq"]
|
[ext_resource type="Script" path="res://scripts/inventory/HotBar.cs" id="2_owrhq"]
|
||||||
[ext_resource type="Script" path="res://scripts/HealthBarUi.cs" id="2_xrm3v"]
|
[ext_resource type="Script" path="res://scripts/HealthBarUi.cs" id="2_xrm3v"]
|
||||||
[ext_resource type="Script" path="res://scripts/FpsLabel.cs" id="5_dis4v"]
|
[ext_resource type="Script" path="res://scripts/FpsLabel.cs" id="5_dis4v"]
|
||||||
|
[ext_resource type="PackedScene" uid="uid://bb188382q7btp" path="res://scenes/gameOverMenu.tscn" id="6_yjmrv"]
|
||||||
|
|
||||||
[node name="Game" type="Node2D"]
|
[node name="Game" type="Node2D"]
|
||||||
script = ExtResource("1_mqdgt")
|
script = ExtResource("1_mqdgt")
|
||||||
|
@ -83,6 +84,9 @@ offset_right = 20.0
|
||||||
offset_bottom = 25.0
|
offset_bottom = 25.0
|
||||||
grow_horizontal = 2
|
grow_horizontal = 2
|
||||||
|
|
||||||
|
[node name="GameOverMenu" parent="CanvasLayer" instance=ExtResource("6_yjmrv")]
|
||||||
|
visible = false
|
||||||
|
|
||||||
[node name="ProjectileContainer" type="Node2D" parent="."]
|
[node name="ProjectileContainer" type="Node2D" parent="."]
|
||||||
|
|
||||||
[node name="DamageNumberContainer" type="Node2D" parent="."]
|
[node name="DamageNumberContainer" type="Node2D" parent="."]
|
||||||
|
@ -90,3 +94,5 @@ grow_horizontal = 2
|
||||||
[node name="WeaponContainer" type="Node2D" parent="."]
|
[node name="WeaponContainer" type="Node2D" parent="."]
|
||||||
|
|
||||||
[node name="PlayerContainer" type="Node2D" parent="."]
|
[node name="PlayerContainer" type="Node2D" parent="."]
|
||||||
|
|
||||||
|
[node name="AICharacterContainer" type="Node2D" parent="."]
|
||||||
|
|
60
scenes/gameOverMenu.tscn
Normal file
60
scenes/gameOverMenu.tscn
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
[gd_scene load_steps=2 format=3 uid="uid://bb188382q7btp"]
|
||||||
|
|
||||||
|
[ext_resource type="Script" path="res://scripts/loader/uiLoader/GameOverLoaderMenuLoader.cs" id="1_vj6du"]
|
||||||
|
|
||||||
|
[node name="GameOverMenu" type="Control"]
|
||||||
|
layout_mode = 3
|
||||||
|
anchors_preset = 15
|
||||||
|
anchor_right = 1.0
|
||||||
|
anchor_bottom = 1.0
|
||||||
|
grow_horizontal = 2
|
||||||
|
grow_vertical = 2
|
||||||
|
script = ExtResource("1_vj6du")
|
||||||
|
|
||||||
|
[node name="ColorRect" type="ColorRect" parent="."]
|
||||||
|
layout_mode = 1
|
||||||
|
anchors_preset = 15
|
||||||
|
anchor_right = 1.0
|
||||||
|
anchor_bottom = 1.0
|
||||||
|
grow_horizontal = 2
|
||||||
|
grow_vertical = 2
|
||||||
|
color = Color(0.941176, 0.243137, 0.243137, 0.258824)
|
||||||
|
|
||||||
|
[node name="CenterContainer" type="CenterContainer" parent="."]
|
||||||
|
layout_mode = 1
|
||||||
|
anchors_preset = 15
|
||||||
|
anchor_right = 1.0
|
||||||
|
anchor_bottom = 1.0
|
||||||
|
grow_horizontal = 2
|
||||||
|
grow_vertical = 2
|
||||||
|
|
||||||
|
[node name="VBoxContainer" type="VBoxContainer" parent="CenterContainer"]
|
||||||
|
layout_mode = 2
|
||||||
|
|
||||||
|
[node name="CenterContainer" type="CenterContainer" parent="CenterContainer/VBoxContainer"]
|
||||||
|
layout_mode = 2
|
||||||
|
|
||||||
|
[node name="GameOverLabel" type="Label" parent="CenterContainer/VBoxContainer/CenterContainer"]
|
||||||
|
layout_mode = 2
|
||||||
|
theme_override_font_sizes/font_size = 30
|
||||||
|
text = "game_over_title"
|
||||||
|
|
||||||
|
[node name="MarginContainer" type="MarginContainer" parent="CenterContainer/VBoxContainer"]
|
||||||
|
layout_mode = 2
|
||||||
|
theme_override_constants/margin_top = 18
|
||||||
|
|
||||||
|
[node name="CenterContainer2" type="CenterContainer" parent="CenterContainer/VBoxContainer/MarginContainer"]
|
||||||
|
layout_mode = 2
|
||||||
|
|
||||||
|
[node name="DeathInfoLabel" type="Label" parent="CenterContainer/VBoxContainer/MarginContainer/CenterContainer2"]
|
||||||
|
layout_mode = 2
|
||||||
|
text = "death_info_describe"
|
||||||
|
|
||||||
|
[node name="MarginContainer2" type="MarginContainer" parent="CenterContainer/VBoxContainer"]
|
||||||
|
layout_mode = 2
|
||||||
|
theme_override_constants/margin_top = 10
|
||||||
|
theme_override_constants/margin_bottom = 150
|
||||||
|
|
||||||
|
[node name="Button" type="Button" parent="CenterContainer/VBoxContainer/MarginContainer2"]
|
||||||
|
layout_mode = 2
|
||||||
|
text = "restart"
|
27
scripts/EventManager.cs
Normal file
27
scripts/EventManager.cs
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
using System;
|
||||||
|
using ColdMint.scripts.map.events;
|
||||||
|
|
||||||
|
namespace ColdMint.scripts;
|
||||||
|
|
||||||
|
public class EventManager
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// <para>Event when the AI character is generated</para>
|
||||||
|
/// <para>AI角色生成事件</para>
|
||||||
|
/// </summary>
|
||||||
|
public static Action<AiCharacterGenerateEvent>? AiCharacterGenerateEvent;
|
||||||
|
|
||||||
|
public static Action<GameOverEvent>? GameOverEvent;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// <para>Map starts generating events</para>
|
||||||
|
/// <para>地图开始生成的事件</para>
|
||||||
|
/// </summary>
|
||||||
|
public static Action<MapGenerationStartEvent>? MapGenerationStartEvent;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// <para>Map generation completion event</para>
|
||||||
|
/// <para>地图生成完成事件</para>
|
||||||
|
/// </summary>
|
||||||
|
public static Action<MapGenerationCompleteEvent>? MapGenerationCompleteEvent;
|
||||||
|
}
|
|
@ -24,6 +24,12 @@ public static class GameSceneNodeHolder
|
||||||
|
|
||||||
public static Node2D? PlayerContainer { get; set; }
|
public static Node2D? PlayerContainer { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// <para>AICharacterContainer</para>
|
||||||
|
/// <para>AICharacter角色</para>
|
||||||
|
/// </summary>
|
||||||
|
public static Node2D? AICharacterContainer { get; set; }
|
||||||
|
|
||||||
public static HotBar? HotBar { get; set; }
|
public static HotBar? HotBar { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,7 @@ using ColdMint.scripts.damage;
|
||||||
using ColdMint.scripts.debug;
|
using ColdMint.scripts.debug;
|
||||||
using ColdMint.scripts.health;
|
using ColdMint.scripts.health;
|
||||||
using ColdMint.scripts.inventory;
|
using ColdMint.scripts.inventory;
|
||||||
|
using ColdMint.scripts.map.events;
|
||||||
using ColdMint.scripts.utils;
|
using ColdMint.scripts.utils;
|
||||||
using ColdMint.scripts.weapon;
|
using ColdMint.scripts.weapon;
|
||||||
using Godot;
|
using Godot;
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using ColdMint.scripts.damage;
|
using ColdMint.scripts.damage;
|
||||||
|
using ColdMint.scripts.map.events;
|
||||||
using ColdMint.scripts.utils;
|
using ColdMint.scripts.utils;
|
||||||
using ColdMint.scripts.weapon;
|
using ColdMint.scripts.weapon;
|
||||||
using Godot;
|
using Godot;
|
||||||
|
@ -100,7 +101,8 @@ public partial class Player : CharacterTemplate
|
||||||
operationTipBuilder.Append("[color=");
|
operationTipBuilder.Append("[color=");
|
||||||
operationTipBuilder.Append(Config.OperationTipActionColor);
|
operationTipBuilder.Append(Config.OperationTipActionColor);
|
||||||
operationTipBuilder.Append(']');
|
operationTipBuilder.Append(']');
|
||||||
operationTipBuilder.Append(TranslationServerUtils.Translate(InputMap.ActionGetEvents("ui_down")[0].AsText()));
|
operationTipBuilder.Append(
|
||||||
|
TranslationServerUtils.Translate(InputMap.ActionGetEvents("ui_down")[0].AsText()));
|
||||||
operationTipBuilder.Append("[/color]");
|
operationTipBuilder.Append("[/color]");
|
||||||
operationTipBuilder.Append(TranslationServerUtils.Translate("jump_down"));
|
operationTipBuilder.Append(TranslationServerUtils.Translate("jump_down"));
|
||||||
}
|
}
|
||||||
|
@ -292,6 +294,7 @@ public partial class Player : CharacterTemplate
|
||||||
rigidBody2D.LinearVelocity = GetThrowVelocity();
|
rigidBody2D.LinearVelocity = GetThrowVelocity();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
CurrentItem = null;
|
CurrentItem = null;
|
||||||
var hotBar = GameSceneNodeHolder.HotBar;
|
var hotBar = GameSceneNodeHolder.HotBar;
|
||||||
hotBar?.RemoveItemFromItemSlotBySelectIndex(1);
|
hotBar?.RemoveItemFromItemSlotBySelectIndex(1);
|
||||||
|
@ -363,6 +366,20 @@ public partial class Player : CharacterTemplate
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override void OnDie(DamageTemplate damageTemplate)
|
||||||
|
{
|
||||||
|
if (EventManager.GameOverEvent != null)
|
||||||
|
{
|
||||||
|
var gameOverEvent = new GameOverEvent
|
||||||
|
{
|
||||||
|
DeathInfo = "\"白纸\"失手将自己杀死。"
|
||||||
|
};
|
||||||
|
EventManager.GameOverEvent(gameOverEvent);
|
||||||
|
}
|
||||||
|
|
||||||
|
Visible = false;
|
||||||
|
}
|
||||||
|
|
||||||
protected override void EnterThePickingRangeBody(Node node)
|
protected override void EnterThePickingRangeBody(Node node)
|
||||||
{
|
{
|
||||||
base.EnterThePickingRangeBody(node);
|
base.EnterThePickingRangeBody(node);
|
||||||
|
|
|
@ -31,6 +31,10 @@ public partial class GameSceneLoader : SceneLoaderTemplate
|
||||||
//加载武器容器
|
//加载武器容器
|
||||||
var weaponContainer = GetNode<Node2D>("WeaponContainer");
|
var weaponContainer = GetNode<Node2D>("WeaponContainer");
|
||||||
GameSceneNodeHolder.WeaponContainer = weaponContainer;
|
GameSceneNodeHolder.WeaponContainer = weaponContainer;
|
||||||
|
//Load AICharacter container
|
||||||
|
//加载AICharacter容器
|
||||||
|
var aiCharacterContainer = GetNode<Node2D>("AICharacterContainer");
|
||||||
|
GameSceneNodeHolder.AICharacterContainer = aiCharacterContainer;
|
||||||
//Load player container
|
//Load player container
|
||||||
//加载玩家容器
|
//加载玩家容器
|
||||||
var playerContainer = GetNode<Node2D>("PlayerContainer");
|
var playerContainer = GetNode<Node2D>("PlayerContainer");
|
||||||
|
@ -58,13 +62,6 @@ public partial class GameSceneLoader : SceneLoaderTemplate
|
||||||
MapGenerator.LayoutStrategy = new TestLayoutStrategy();
|
MapGenerator.LayoutStrategy = new TestLayoutStrategy();
|
||||||
MapGenerator.LayoutParsingStrategy = new SequenceLayoutParsingStrategy();
|
MapGenerator.LayoutParsingStrategy = new SequenceLayoutParsingStrategy();
|
||||||
MapGenerator.RoomPlacementStrategy = new PatchworkRoomPlacementStrategy();
|
MapGenerator.RoomPlacementStrategy = new PatchworkRoomPlacementStrategy();
|
||||||
MapGenerator.MapGenerationCompleteEvent += (_) =>
|
|
||||||
{
|
|
||||||
};
|
|
||||||
MapGenerator.MapGenerationStartEvent+= (_) =>
|
|
||||||
{
|
|
||||||
|
|
||||||
};
|
|
||||||
await GenerateMap();
|
await GenerateMap();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
43
scripts/loader/uiLoader/GameOverLoaderMenuLoader.cs
Normal file
43
scripts/loader/uiLoader/GameOverLoaderMenuLoader.cs
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using ColdMint.scripts.map.events;
|
||||||
|
using Godot;
|
||||||
|
|
||||||
|
namespace ColdMint.scripts.loader.uiLoader;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// <para>GameOverLoaderMenuLoader</para>
|
||||||
|
/// <para>游戏结束菜单加载器</para>
|
||||||
|
/// </summary>
|
||||||
|
public partial class GameOverLoaderMenuLoader : UiLoaderTemplate
|
||||||
|
{
|
||||||
|
private Label? _deathInfoLabel;
|
||||||
|
|
||||||
|
public override void InitializeUi()
|
||||||
|
{
|
||||||
|
Visible = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void InitializeData()
|
||||||
|
{
|
||||||
|
_deathInfoLabel =
|
||||||
|
GetNode<Label>("CenterContainer/VBoxContainer/MarginContainer/CenterContainer2/DeathInfoLabel");
|
||||||
|
EventManager.GameOverEvent += OnGameOver;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnGameOver(GameOverEvent gameOverEvent)
|
||||||
|
{
|
||||||
|
if (_deathInfoLabel == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Visible = true;
|
||||||
|
_deathInfoLabel.Text = gameOverEvent.DeathInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void _ExitTree()
|
||||||
|
{
|
||||||
|
base._ExitTree();
|
||||||
|
EventManager.GameOverEvent -= OnGameOver;
|
||||||
|
}
|
||||||
|
}
|
54
scripts/map/AiCharacterSpawn.cs
Normal file
54
scripts/map/AiCharacterSpawn.cs
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
using ColdMint.scripts.character;
|
||||||
|
using ColdMint.scripts.debug;
|
||||||
|
using ColdMint.scripts.map.events;
|
||||||
|
using Godot;
|
||||||
|
|
||||||
|
namespace ColdMint.scripts.map;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// <para>Ai character generation point</para>
|
||||||
|
/// <para>Ai角色生成点</para>
|
||||||
|
/// </summary>
|
||||||
|
public partial class AiCharacterSpawn : Marker2D
|
||||||
|
{
|
||||||
|
private PackedScene? _packedScene;
|
||||||
|
|
||||||
|
public override void _Ready()
|
||||||
|
{
|
||||||
|
base._Ready();
|
||||||
|
var resPath = GetMeta("ResPath", Name).AsString();
|
||||||
|
if (!string.IsNullOrEmpty(resPath))
|
||||||
|
{
|
||||||
|
_packedScene = GD.Load<PackedScene>(resPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
EventManager.AiCharacterGenerateEvent += OnAiCharacterGenerateEvent;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// <para>When an event is triggered</para>
|
||||||
|
/// <para>当触发事件时</para>
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="aiCharacterGenerateEvent"></param>
|
||||||
|
public void OnAiCharacterGenerateEvent(AiCharacterGenerateEvent aiCharacterGenerateEvent)
|
||||||
|
{
|
||||||
|
var node = _packedScene?.Instantiate();
|
||||||
|
if (node is not AiCharacter aiCharacter)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GameSceneNodeHolder.AICharacterContainer == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
GameSceneNodeHolder.AICharacterContainer.AddChild(aiCharacter);
|
||||||
|
aiCharacter.Position = GlobalPosition;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void _ExitTree()
|
||||||
|
{
|
||||||
|
EventManager.AiCharacterGenerateEvent -= OnAiCharacterGenerateEvent;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,4 +1,5 @@
|
||||||
using System.Collections.Generic;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using ColdMint.scripts.debug;
|
using ColdMint.scripts.debug;
|
||||||
using ColdMint.scripts.levelGraphEditor;
|
using ColdMint.scripts.levelGraphEditor;
|
||||||
|
@ -83,21 +84,6 @@ public static class MapGenerator
|
||||||
return _roomInjectionProcessorsDictionary.Remove(id);
|
return _roomInjectionProcessorsDictionary.Remove(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
public delegate void MapGenerationStartEventHandler(MapGenerationStartEvent mapGenerationStartEvent);
|
|
||||||
|
|
||||||
public delegate void MapGenerationCompleteEventHandler(MapGenerationCompleteEvent mapGenerationCompleteEvent);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// <para>Map starts generating events</para>
|
|
||||||
/// <para>地图开始生成的事件</para>
|
|
||||||
/// </summary>
|
|
||||||
public static event MapGenerationStartEventHandler? MapGenerationStartEvent;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// <para>Map generation completion event</para>
|
|
||||||
/// <para>地图生成完成事件</para>
|
|
||||||
/// </summary>
|
|
||||||
public static event MapGenerationCompleteEventHandler? MapGenerationCompleteEvent;
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// <para>Set seed</para>
|
/// <para>Set seed</para>
|
||||||
|
@ -154,7 +140,7 @@ public static class MapGenerator
|
||||||
}
|
}
|
||||||
|
|
||||||
_running = true;
|
_running = true;
|
||||||
MapGenerationStartEvent?.Invoke(new MapGenerationStartEvent());
|
EventManager.MapGenerationStartEvent?.Invoke(new MapGenerationStartEvent());
|
||||||
if (_layoutStrategy == null || _roomPlacementStrategy == null || _layoutParsingStrategy == null ||
|
if (_layoutStrategy == null || _roomPlacementStrategy == null || _layoutParsingStrategy == null ||
|
||||||
_mapRoot == null)
|
_mapRoot == null)
|
||||||
{
|
{
|
||||||
|
@ -163,6 +149,11 @@ public static class MapGenerator
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (GameSceneNodeHolder.AICharacterContainer != null)
|
||||||
|
{
|
||||||
|
NodeUtils.DeleteAllChild(GameSceneNodeHolder.AICharacterContainer);
|
||||||
|
}
|
||||||
|
|
||||||
NodeUtils.DeleteAllChild(_mapRoot);
|
NodeUtils.DeleteAllChild(_mapRoot);
|
||||||
if (!await _roomPlacementStrategy.StartGeneration(_mapRoot))
|
if (!await _roomPlacementStrategy.StartGeneration(_mapRoot))
|
||||||
{
|
{
|
||||||
|
@ -238,18 +229,21 @@ public static class MapGenerator
|
||||||
{
|
{
|
||||||
foreach (var injectionProcessorData in roomInjectionProcessorDataArray)
|
foreach (var injectionProcessorData in roomInjectionProcessorDataArray)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrEmpty(injectionProcessorData.Id) || string.IsNullOrEmpty(injectionProcessorData.Config))
|
if (string.IsNullOrEmpty(injectionProcessorData.Id) ||
|
||||||
|
string.IsNullOrEmpty(injectionProcessorData.Config))
|
||||||
{
|
{
|
||||||
//The data is incomplete, and the injectionProcessorData is ignored.
|
//The data is incomplete, and the injectionProcessorData is ignored.
|
||||||
//数据不全,忽略injectionProcessorData。
|
//数据不全,忽略injectionProcessorData。
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!_roomInjectionProcessorsDictionary.TryGetValue(injectionProcessorData.Id,
|
if (!_roomInjectionProcessorsDictionary.TryGetValue(injectionProcessorData.Id,
|
||||||
out var roomInjectionProcessor))
|
out var roomInjectionProcessor))
|
||||||
{
|
{
|
||||||
//If the room injection processor cannot be found, a print error occurs.
|
//If the room injection processor cannot be found, a print error occurs.
|
||||||
//如果找不到房间注入处理器,那么打印错误。
|
//如果找不到房间注入处理器,那么打印错误。
|
||||||
LogCat.LogErrorWithFormat("room_injection_processor_does_not_exist", injectionProcessorData.Id);
|
LogCat.LogErrorWithFormat("room_injection_processor_does_not_exist",
|
||||||
|
injectionProcessorData.Id);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -262,10 +256,12 @@ public static class MapGenerator
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!canBePlaced)
|
if (!canBePlaced)
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
var nextParentNodeId = await _layoutParsingStrategy.GetNextParentNodeId();
|
var nextParentNodeId = await _layoutParsingStrategy.GetNextParentNodeId();
|
||||||
Room? parentRoomNode = null;
|
Room? parentRoomNode = null;
|
||||||
if (nextParentNodeId != null)
|
if (nextParentNodeId != null)
|
||||||
|
@ -300,7 +296,13 @@ public static class MapGenerator
|
||||||
{
|
{
|
||||||
RandomNumberGenerator = randomNumberGenerator
|
RandomNumberGenerator = randomNumberGenerator
|
||||||
};
|
};
|
||||||
MapGenerationCompleteEvent?.Invoke(eventObj);
|
EventManager.MapGenerationCompleteEvent?.Invoke(eventObj);
|
||||||
|
var aiCharacterGenerateEvent = new AiCharacterGenerateEvent
|
||||||
|
{
|
||||||
|
Tag = AiCharacterGenerateEvent.TagMapGenerationComplete
|
||||||
|
};
|
||||||
|
LogCat.Log("触发事件" + (EventManager.AiCharacterGenerateEvent == null));
|
||||||
|
EventManager.AiCharacterGenerateEvent?.Invoke(aiCharacterGenerateEvent);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
@ -17,12 +17,12 @@ public partial class PlayerSpawn : Marker2D
|
||||||
{
|
{
|
||||||
base._Ready();
|
base._Ready();
|
||||||
_playerPackedScene = GD.Load<PackedScene>("res://prefab/entitys/Character.tscn");
|
_playerPackedScene = GD.Load<PackedScene>("res://prefab/entitys/Character.tscn");
|
||||||
MapGenerator.MapGenerationCompleteEvent += MapGenerationCompleteEvent;
|
EventManager.MapGenerationCompleteEvent += MapGenerationCompleteEvent;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void MapGenerationCompleteEvent(MapGenerationCompleteEvent mapGenerationCompleteEvent)
|
private void MapGenerationCompleteEvent(MapGenerationCompleteEvent mapGenerationCompleteEvent)
|
||||||
{
|
{
|
||||||
MapGenerator.MapGenerationCompleteEvent -= MapGenerationCompleteEvent;
|
EventManager.MapGenerationCompleteEvent -= MapGenerationCompleteEvent;
|
||||||
//After the map is generated, create the player instance.
|
//After the map is generated, create the player instance.
|
||||||
//当地图生成完成后,创建玩家实例。
|
//当地图生成完成后,创建玩家实例。
|
||||||
if (GameSceneNodeHolder.Player != null)
|
if (GameSceneNodeHolder.Player != null)
|
||||||
|
@ -56,4 +56,10 @@ public partial class PlayerSpawn : Marker2D
|
||||||
player.Position = GlobalPosition;
|
player.Position = GlobalPosition;
|
||||||
LogCat.LogWithFormat("player_spawn_debug", player.ReadOnlyCharacterName, player.Position);
|
LogCat.LogWithFormat("player_spawn_debug", player.ReadOnlyCharacterName, player.Position);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void _ExitTree()
|
||||||
|
{
|
||||||
|
base._ExitTree();
|
||||||
|
EventManager.MapGenerationCompleteEvent -= MapGenerationCompleteEvent;
|
||||||
|
}
|
||||||
}
|
}
|
21
scripts/map/events/AiCharacterGenerateEvent.cs
Normal file
21
scripts/map/events/AiCharacterGenerateEvent.cs
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
namespace ColdMint.scripts.map.events;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// <para>AiCharacterGenerateEvent</para>
|
||||||
|
/// <para>Ai角色生成事件</para>
|
||||||
|
/// </summary>
|
||||||
|
public class AiCharacterGenerateEvent
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// <para>Map generation completed Tag</para>
|
||||||
|
/// <para>地图生成完成的Tag</para>
|
||||||
|
/// </summary>
|
||||||
|
public const string TagMapGenerationComplete = "MapGenerationComplete";
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// <para>The Tag used to generate the role</para>
|
||||||
|
/// <para>生成角色时使用的Tag</para>
|
||||||
|
/// </summary>
|
||||||
|
public string? Tag { get; set; }
|
||||||
|
}
|
14
scripts/map/events/GameOverEvent.cs
Normal file
14
scripts/map/events/GameOverEvent.cs
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
namespace ColdMint.scripts.map.events;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// <para>Game over event</para>
|
||||||
|
/// <para>游戏结束事件</para>
|
||||||
|
/// </summary>
|
||||||
|
public class GameOverEvent
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// <para>Death information</para>
|
||||||
|
/// <para>死亡信息</para>
|
||||||
|
/// </summary>
|
||||||
|
public string? DeathInfo { get; set; }
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user