Fixed a bug where the last item always looted in the same loot group

修复了同一个掉落组中总是掉落最后一项的bug
This commit is contained in:
霧雨烨 2024-06-16 18:35:00 +08:00
parent 703c19d09f
commit ced2618a5e
8 changed files with 36 additions and 35 deletions

View File

@ -2,7 +2,15 @@
scene_path: res://prefab/weapons/staffOfTheUndead.tscn scene_path: res://prefab/weapons/staffOfTheUndead.tscn
icon_path: res://sprites/weapon/staffOfTheUndead_icon.png icon_path: res://sprites/weapon/staffOfTheUndead_icon.png
max_stack_value: 1 max_stack_value: 1
- id: degraded_staff_of_the_undead
scene_path: res://prefab/weapons/staffOfTheUndead.tscn
icon_path: res://sprites/weapon/staffOfTheUndead_icon.png
max_stack_value: 1
custom_args: custom_args:
- name: FiringIntervalAsMillisecond - name: FiringIntervalAsMillisecond
type: int type: int
value: 1000 value: 1000
- name: UniqueName
type: string
value: 劣化的死灵法杖

View File

@ -34,5 +34,6 @@ log_warning_node_cannot_cast_to,创建的物品{0}无法被转型为类型{1},Cr
log_start_item_register_from_file,开始从文件注册物品信息,Start registering item information from files,アイテム情報をファイルから登録開始 log_start_item_register_from_file,开始从文件注册物品信息,Start registering item information from files,アイテム情報をファイルから登録開始
log_found_files,找到{0}个文件,Found {0} files,{0}ファイルが見つかりました log_found_files,找到{0}个文件,Found {0} files,{0}ファイルが見つかりました
log_found_item_types,从文件中找到{0}个物品类型,Found {0} item types in files,ファイルから{0}個のアイテム・タイプが見つかった log_found_item_types,从文件中找到{0}个物品类型,Found {0} item types in files,ファイルから{0}個のアイテム・タイプが見つかった
log_register_item,注册物品类型{0}结果为{1},Registered item type {0}; results in {1},登録されたアイテム・タイプ {0} の結果は {1} です。
log_error_when_open_item_regs_dir,尝试打开物品信息目录时发生错误,Error when opening itemRegs dir,アイテム情報カタログを開こうとしてエラーが発生しました。 log_error_when_open_item_regs_dir,尝试打开物品信息目录时发生错误,Error when opening itemRegs dir,アイテム情報カタログを開こうとしてエラーが発生しました。
log_wrong_custom_arg,不匹配的参数:类型为{0}而值为{1},Mismatched parameter: type {0} and value {1},パラメータの不一致:型{0}と値{1}。 log_wrong_custom_arg,不匹配的参数:类型为{0}而值为{1},Mismatched parameter: type {0} and value {1},パラメータの不一致:型{0}と値{1}。
1 id zh en ja
34 log_error_when_open_item_regs_dir log_register_item 尝试打开物品信息目录时发生错误 注册物品类型{0}结果为{1} Error when opening itemRegs dir Registered item type {0}; results in {1} アイテム情報カタログを開こうとしてエラーが発生しました。 登録されたアイテム・タイプ {0} の結果は {1} です。
35 log_wrong_custom_arg log_error_when_open_item_regs_dir 不匹配的参数:类型为{0}而值为{1} 尝试打开物品信息目录时发生错误 Mismatched parameter: type {0} and value {1} Error when opening itemRegs dir パラメータの不一致:型{0}と値{1}。 アイテム情報カタログを開こうとしてエラーが発生しました。
36 log_wrong_custom_arg 不匹配的参数:类型为{0}而值为{1} Mismatched parameter: type {0} and value {1} パラメータの不一致:型{0}と値{1}。
37
38
39

View File

@ -15,9 +15,8 @@ collision_layer = 8
collision_mask = 34 collision_mask = 34
script = ExtResource("1_w8hhv") script = ExtResource("1_w8hhv")
ProjectileScenes = [ExtResource("2_34250")] ProjectileScenes = [ExtResource("2_34250")]
Id = "staff_of_the_undead"
FiringIntervalAsMillisecond = 300 FiringIntervalAsMillisecond = 300
metadata/Projectiles = PackedStringArray("res://prefab/projectile/curseOfTheUndead.tscn") Id = "staff_of_the_undead"
[node name="DamageArea2D" type="Area2D" parent="."] [node name="DamageArea2D" type="Area2D" parent="."]
collision_layer = 8 collision_layer = 8

View File

@ -22,7 +22,7 @@ public static class ItemTypeRegister
/// <para>在这里注册物品</para> /// <para>在这里注册物品</para>
/// </summary> /// </summary>
public static void StaticRegister() { } public static void StaticRegister() { }
/// <summary> /// <summary>
/// <para>Register items from yaml file</para> /// <para>Register items from yaml file</para>
/// <para>从文件注册物品</para> /// <para>从文件注册物品</para>
@ -66,7 +66,7 @@ public static class ItemTypeRegister
//Read & deserialize //Read & deserialize
var yamlString = yamlFile.GetAsText(); var yamlString = yamlFile.GetAsText();
var typeInfos = deserializer.Deserialize<IList<ItemTypeInfo>>(yamlString); var typeInfos = deserializer.Deserialize<IList<ItemTypeInfo>>(yamlString);
yamlFile.Close(); yamlFile.Close();
return typeInfos; return typeInfos;
} }
@ -76,7 +76,7 @@ public static class ItemTypeRegister
//Load scene and icon //Load scene and icon
var scene = ResourceLoader.Load<PackedScene>(typeInfo.ScenePath); var scene = ResourceLoader.Load<PackedScene>(typeInfo.ScenePath);
var icon = ResourceLoader.Load<Texture2D>(typeInfo.IconPath); var icon = ResourceLoader.Load<Texture2D>(typeInfo.IconPath);
//Create init delegate //Create init delegate
Func<IItem?> newItemFunc; Func<IItem?> newItemFunc;
if (typeInfo.CustomArgs is null or []) if (typeInfo.CustomArgs is null or [])
@ -104,7 +104,8 @@ public static class ItemTypeRegister
var itemType = new ItemType(typeInfo.Id, var itemType = new ItemType(typeInfo.Id,
newItemFunc, newItemFunc,
icon, typeInfo.MaxStackValue); icon, typeInfo.MaxStackValue);
ItemTypeManager.Register(itemType); var succeed = ItemTypeManager.Register(itemType);
LogCat.LogWithFormat("register_item", itemType.Id, succeed);
} }
//Use for yaml deserialization //Use for yaml deserialization

View File

@ -1,4 +1,5 @@
using System; using System;
using ColdMint.scripts.character; using ColdMint.scripts.character;
using ColdMint.scripts.pickable; using ColdMint.scripts.pickable;
using ColdMint.scripts.damage; using ColdMint.scripts.damage;
@ -14,6 +15,7 @@ namespace ColdMint.scripts.item.weapon;
public abstract partial class WeaponTemplate : PickAbleTemplate public abstract partial class WeaponTemplate : PickAbleTemplate
{ {
private float _gravity = ProjectSettings.GetSetting("physics/2d/default_gravity").AsSingle(); private float _gravity = ProjectSettings.GetSetting("physics/2d/default_gravity").AsSingle();
public override void Use(Node2D? owner, Vector2 targetGlobalPosition) public override void Use(Node2D? owner, Vector2 targetGlobalPosition)
{ {
Fire(owner, targetGlobalPosition); Fire(owner, targetGlobalPosition);
@ -49,16 +51,7 @@ public abstract partial class WeaponTemplate : PickAbleTemplate
/// </remarks> /// </remarks>
[Export] private Vector2 _recoil; [Export] private Vector2 _recoil;
public override void _Ready() public override void _Ready() { }
{
}
/// <summary> /// <summary>
/// <para>Discharge of the weapon</para> /// <para>Discharge of the weapon</para>

View File

@ -55,10 +55,9 @@ public readonly record struct LootGroup(double Chance, IEnumerable<LootEntry> En
foreach (var e in Entries) foreach (var e in Entries)
{ {
w -= e.Weight; w -= e.Weight;
if (w < 0) if (w >= 0) continue;
{ entry = e;
entry = e; break;
}
} }
var quantity = random.Next(entry.MinQuantity, entry.MaxQuantity + 1); var quantity = random.Next(entry.MinQuantity, entry.MaxQuantity + 1);

View File

@ -14,13 +14,13 @@ public static class LootRegister
if (Config.IsDebug()) if (Config.IsDebug())
{ {
IList<LootGroup> lootGroups = []; IList<LootGroup> lootGroups = [];
lootGroups.Add(new LootGroup(0.8,
[
new LootEntry("degraded_staff_of_the_undead", weight: 2), new LootEntry("staff_of_the_undead")
]));
lootGroups.Add(new LootGroup(1, lootGroups.Add(new LootGroup(1,
[ [
new LootEntry("packsack", weight: 2), new LootEntry("staff_of_the_undead", minQuantity: 2, maxQuantity: 4) new LootEntry("packsack", minQuantity: 2, maxQuantity: 4)
]));
lootGroups.Add(new LootGroup(0.3,
[
new LootEntry("packsack")
])); ]));
var testLootList = new LootList(Config.LootListId.Test, lootGroups); var testLootList = new LootList(Config.LootListId.Test, lootGroups);

View File

@ -1,8 +1,10 @@
using System; using System;
using ColdMint.scripts.camp; using ColdMint.scripts.camp;
using ColdMint.scripts.character; using ColdMint.scripts.character;
using ColdMint.scripts.damage; using ColdMint.scripts.damage;
using ColdMint.scripts.item; using ColdMint.scripts.item;
using Godot; using Godot;
namespace ColdMint.scripts.pickable; namespace ColdMint.scripts.pickable;
@ -14,12 +16,12 @@ namespace ColdMint.scripts.pickable;
public partial class PickAbleTemplate : RigidBody2D, IItem public partial class PickAbleTemplate : RigidBody2D, IItem
{ {
[Export] public virtual string Id { get; set; } = "ID"; [Export] public virtual string Id { get; set; } = "ID";
protected Texture2D? UniqueIcon { get; set; } [Export] protected Texture2D? UniqueIcon { get; set; }
public Texture2D Icon => UniqueIcon ?? ItemTypeManager.DefaultIconOf(Id); public Texture2D Icon => UniqueIcon ?? ItemTypeManager.DefaultIconOf(Id);
protected string? UniqueName { get; set; } [Export] protected string? UniqueName { get; set; }
public new string Name => UniqueName ?? ItemTypeManager.DefaultNameOf(Id); public new string Name => UniqueName ?? ItemTypeManager.DefaultNameOf(Id);
protected string? UniqueDescription { get; set; } [Export] protected string? UniqueDescription { get; set; }
/// <summary> /// <summary>
/// <para>Owner</para> /// <para>Owner</para>
/// <para>主人</para> /// <para>主人</para>
@ -55,9 +57,7 @@ public partial class PickAbleTemplate : RigidBody2D, IItem
/// </summary> /// </summary>
public bool Picked { get; set; } public bool Picked { get; set; }
public virtual void Use(Node2D? owner, Vector2 targetGlobalPosition) public virtual void Use(Node2D? owner, Vector2 targetGlobalPosition) { }
{
}
public override void _Ready() public override void _Ready()
{ {
@ -124,7 +124,7 @@ public partial class PickAbleTemplate : RigidBody2D, IItem
//Determine if your side can cause damage //Determine if your side can cause damage
//判断所属的阵营是否可以造成伤害 //判断所属的阵营是否可以造成伤害
var canCauseHarm = CampManager.CanCauseHarm(CampManager.GetCamp(ownerCharacterTemplate.CampId), var canCauseHarm = CampManager.CanCauseHarm(CampManager.GetCamp(ownerCharacterTemplate.CampId),
CampManager.GetCamp(characterTemplate.CampId)); CampManager.GetCamp(characterTemplate.CampId));
if (!canCauseHarm) if (!canCauseHarm)
{ {
return; return;
@ -147,8 +147,8 @@ public partial class PickAbleTemplate : RigidBody2D, IItem
LinearVelocity *= 1 - Config.ThrownItemsHitEnemiesReduceSpeedByPercentage; LinearVelocity *= 1 - Config.ThrownItemsHitEnemiesReduceSpeedByPercentage;
} }
} }
/// <summary> /// <summary>
/// <para>Flip item</para> /// <para>Flip item</para>
/// <para>翻转物品</para> /// <para>翻转物品</para>