diff --git a/components/Abstracts/FeedCardBase.tscn b/components/Abstracts/FeedCardBase.tscn index 17b401f..84e427e 100644 --- a/components/Abstracts/FeedCardBase.tscn +++ b/components/Abstracts/FeedCardBase.tscn @@ -45,7 +45,7 @@ texture = ExtResource("1_jonms") unique_name_in_owner = true layout_mode = 2 size_flags_horizontal = 4 -text = "香蕉" +text = "未命名饲料" [node name="fields" type="VBoxContainer" parent="container"] unique_name_in_owner = true diff --git a/components/Feeds/Banana.tscn b/components/Feeds/Banana.tscn new file mode 100644 index 0000000..2c1344e --- /dev/null +++ b/components/Feeds/Banana.tscn @@ -0,0 +1,15 @@ +[gd_scene load_steps=3 format=3 uid="uid://btisbc7ehj4fo"] + +[ext_resource type="PackedScene" uid="uid://b4cwipt17nh7g" path="res://components/Abstracts/FeedCardBase.tscn" id="1_tdrm3"] +[ext_resource type="Texture2D" uid="uid://b7vxserbhskol" path="res://resources/feeds/banana.svg" id="2_2mlfi"] + +[node name="Banana" instance=ExtResource("1_tdrm3")] +avatarTexture = ExtResource("2_2mlfi") +displayName = "香蕉" +fields = Array[int]([0, 3, 7]) +fieldValues = Array[float]([10.0, 0.1]) +costs = Array[int]([0, 1]) +costCounts = Array[int]([5, 10]) + +[node name="name" parent="container/info" index="1"] +text = "香蕉" diff --git a/components/UI/ItemShow.tscn b/components/UI/ItemShow.tscn index d602939..031d3ac 100644 --- a/components/UI/ItemShow.tscn +++ b/components/UI/ItemShow.tscn @@ -4,6 +4,8 @@ [ext_resource type="Texture2D" uid="uid://bks8jmctleina" path="res://resources/items/baseball.svg" id="1_hyowb"] [node name="ItemShow" type="HBoxContainer"] +size_flags_horizontal = 6 +size_flags_vertical = 6 script = ExtResource("1_2dhsb") [node name="avatar" type="TextureRect" parent="."] diff --git a/scripts/Statemachine/BulletBase.gd b/scripts/Statemachine/BulletBase.gd index 1c98407..d96b1dc 100644 --- a/scripts/Statemachine/BulletBase.gd +++ b/scripts/Statemachine/BulletBase.gd @@ -56,7 +56,7 @@ static func generate( var instance: BulletBase = bullet.instantiate() instance.launcher = launchBy instance.position = spawnPosition - instance.rotation = spawnRotation + instance.rotation = spawnRotation + randf_range(-launchBy.fields.get(FieldStore.Entity.OFFSET_SHOOT), launchBy.fields.get(FieldStore.Entity.OFFSET_SHOOT)) if addToWorld: WorldManager.rootNode.add_child(instance) return instance diff --git a/scripts/Statemachine/EntityBase.gd b/scripts/Statemachine/EntityBase.gd index fc2683f..5d1d8e8 100644 --- a/scripts/Statemachine/EntityBase.gd +++ b/scripts/Statemachine/EntityBase.gd @@ -9,6 +9,7 @@ var fields = { FieldStore.Entity.CRIT_RATE: 0.05, FieldStore.Entity.CRIT_DAMAGE: 1, FieldStore.Entity.PENERATE: 0, + FieldStore.Entity.OFFSET_SHOOT: 3 } @export var cooldownUnit: float = 100 # 100毫秒每次攻击 diff --git a/scripts/Statemachine/FieldShow.gd b/scripts/Statemachine/FieldShow.gd index 9bcf0b3..9eef6ae 100644 --- a/scripts/Statemachine/FieldShow.gd +++ b/scripts/Statemachine/FieldShow.gd @@ -1,12 +1,21 @@ @tool extends HBoxContainer +class_name FieldShow @export var field: FieldStore.Entity = FieldStore.Entity.MAX_HEALTH -@export var value: String = "" +@export var value: float = 0 @onready var nameLabel: Label = $"%name" @onready var valueLabel: Label = $"%value" -func _process(_delta): +func _ready(): nameLabel.text = FieldStore.entityMap[field] - valueLabel.text = value + var formattedValue: String + var dataType = FieldStore.entityMapType[field] + if dataType == FieldStore.DataType.VALUE: + formattedValue = str(value) + elif dataType == FieldStore.DataType.ANGLE: + formattedValue = str(value) + "°" + elif dataType == FieldStore.DataType.PERCENT: + formattedValue = "%.1f" % (value * 100) + "%" + valueLabel.text = formattedValue diff --git a/scripts/Statemachine/ItemShow.gd b/scripts/Statemachine/ItemShow.gd index e3380cd..6ef99c4 100644 --- a/scripts/Statemachine/ItemShow.gd +++ b/scripts/Statemachine/ItemShow.gd @@ -1,5 +1,6 @@ @tool extends HBoxContainer +class_name ItemShow @export var type: ItemStore.ItemType = ItemStore.ItemType.BASEBALL @export var count: int = 0 @@ -7,6 +8,6 @@ extends HBoxContainer @onready var avatarTexture: TextureRect = $"%avatar" @onready var countLabel: Label = $"%count" -func _process(_delta): +func _ready(): avatarTexture.texture = load("res://resources/items/%s.svg" % ItemStore.idMap[type]) countLabel.text = str(count) diff --git a/scripts/Structs/Feed.gd b/scripts/Structs/Feed.gd index ea3a527..19c539b 100644 --- a/scripts/Structs/Feed.gd +++ b/scripts/Structs/Feed.gd @@ -5,11 +5,33 @@ class_name Feed @export var avatarTexture: Texture2D = null @export var displayName: String = "未命名饲料" @export var fields: Array[FieldStore.Entity] = [] -@export var values: Array[float] = [] +@export var fieldValues: Array[float] = [] @export var costs: Array[ItemStore.ItemType] = [] -@export var counts: Array[int] = [] +@export var costCounts: Array[int] = [] -@onready var avatar: TextureRect = $"%avatar" +@onready var avatarRect: TextureRect = $"%avatar" @onready var nameLabel: Label = $"%name" @onready var fieldsBox: VBoxContainer = $"%fields" -@onready var costsBox: VBoxContainer = $"%costs" +@onready var costsBox: GridContainer = $"%costs" + +func _ready(): + avatarRect.texture = avatarTexture + nameLabel.text = displayName + for i in fieldsBox.get_children(): + i.queue_free() + for i in range(min(fields.size(), fieldValues.size())): + var field = fields[i] + var value = fieldValues[i] + var fieldShow: FieldShow = preload("res://components/UI/FieldShow.tscn").instantiate() + fieldShow.field = field + fieldShow.value = str(value) + fieldsBox.add_child(fieldShow) + for i in costsBox.get_children(): + i.queue_free() + for i in range(min(costs.size(), costCounts.size())): + var cost = costs[i] + var count = costCounts[i] + var costShow: ItemShow = preload("res://components/UI/ItemShow.tscn").instantiate() + costShow.type = cost + costShow.count = count + costsBox.add_child(costShow) diff --git a/scripts/Tools/FieldStore.gd b/scripts/Tools/FieldStore.gd index d703520..4640aa1 100644 --- a/scripts/Tools/FieldStore.gd +++ b/scripts/Tools/FieldStore.gd @@ -1,6 +1,11 @@ @tool class_name FieldStore +enum DataType { + VALUE, + PERCENT, + ANGLE +} enum Entity { MAX_HEALTH, DAMAGE_MULTIPILER, @@ -8,7 +13,8 @@ enum Entity { ATTACK_SPEED, CRIT_RATE, CRIT_DAMAGE, - PENERATE + PENERATE, + OFFSET_SHOOT } static var entityMap = { Entity.MAX_HEALTH: "最大生命值", @@ -17,7 +23,18 @@ static var entityMap = { Entity.ATTACK_SPEED: "攻击速度", Entity.CRIT_RATE: "暴击率", Entity.CRIT_DAMAGE: "暴击伤害", - Entity.PENERATE: "穿透" + Entity.PENERATE: "穿透", + Entity.OFFSET_SHOOT: "散射角" +} +static var entityMapType = { + Entity.MAX_HEALTH: DataType.VALUE, + Entity.DAMAGE_MULTIPILER: DataType.PERCENT, + Entity.MOVEMENT_SPEED: DataType.PERCENT, + Entity.ATTACK_SPEED: DataType.PERCENT, + Entity.CRIT_RATE: DataType.PERCENT, + Entity.CRIT_DAMAGE: DataType.PERCENT, + Entity.PENERATE: DataType.PERCENT, + Entity.OFFSET_SHOOT: DataType.ANGLE } enum Bullet { @@ -29,4 +46,9 @@ static var bulletMap = { Bullet.SPEED: "速度", Bullet.DAMAGE: "伤害", Bullet.PENERATE: "穿透" +} +static var bulletMapType = { + Bullet.SPEED: DataType.VALUE, + Bullet.DAMAGE: DataType.VALUE, + Bullet.PENERATE: DataType.PERCENT } \ No newline at end of file