Solutions
This commit is contained in:
parent
cc7c6af33f
commit
fcdd47e200
28 changed files with 88 additions and 60 deletions
|
|
@ -8,6 +8,7 @@ func _on_interaction_interacted(with: DraggableObject) -> void:
|
|||
subs.amount = add_amount
|
||||
subs.substance = $"../../SubstanceData".substance
|
||||
subs.temperature = 20
|
||||
subs.is_solution = subs.substance.is_solution
|
||||
with.get_node("%Inventory").add_substance(subs)
|
||||
$"../HBoxContainer/SpinBox".value = 0
|
||||
|
||||
|
|
|
|||
|
|
@ -23,6 +23,12 @@ var total_amount: float:
|
|||
signal inventory_changed(substances: Array[RuntimeSubstanceData])
|
||||
signal temperature_changed(to: float)
|
||||
|
||||
func update_solutions():
|
||||
var has_water = inventory.has("Вода")
|
||||
if has_water:
|
||||
for sub in inventory:
|
||||
inventory[sub].is_solution = ReactionRegistry.is_water_solution(inventory[sub].substance)
|
||||
|
||||
func add_substance(data: RuntimeSubstanceData) -> void:
|
||||
if data.substance.scientific_name in inventory:
|
||||
inventory[data.substance.scientific_name].add(data)
|
||||
|
|
@ -30,6 +36,7 @@ func add_substance(data: RuntimeSubstanceData) -> void:
|
|||
inventory[data.substance.scientific_name] = data
|
||||
check_for_reactions()
|
||||
recalculate_temperature()
|
||||
update_solutions()
|
||||
inventory_changed.emit(inventory.values())
|
||||
|
||||
func add_substance_no_callback(data: RuntimeSubstanceData) -> void:
|
||||
|
|
@ -41,7 +48,11 @@ func add_substance_no_callback(data: RuntimeSubstanceData) -> void:
|
|||
|
||||
func add_inventory(substances: Array[RuntimeSubstanceData]) -> void:
|
||||
for sub in substances:
|
||||
add_substance(sub)
|
||||
add_substance_no_callback(sub)
|
||||
check_for_reactions()
|
||||
recalculate_temperature()
|
||||
update_solutions()
|
||||
inventory_changed.emit(inventory.values())
|
||||
|
||||
func extract(amount: float) -> Array[RuntimeSubstanceData]:
|
||||
if len(inventory) == 0:
|
||||
|
|
@ -63,6 +74,7 @@ func extract(amount: float) -> Array[RuntimeSubstanceData]:
|
|||
if inventory[result_substance.substance.scientific_name].amount == 0:
|
||||
inventory.erase(result_substance.substance.scientific_name)
|
||||
|
||||
update_solutions()
|
||||
inventory_changed.emit(inventory.values())
|
||||
|
||||
return result
|
||||
|
|
@ -88,6 +100,7 @@ func extract_solid(amount: float) -> Array[RuntimeSubstanceData]:
|
|||
if inventory[result_substance.substance.scientific_name].amount == 0:
|
||||
inventory.erase(result_substance.substance.scientific_name)
|
||||
|
||||
update_solutions()
|
||||
inventory_changed.emit(inventory.values())
|
||||
return result
|
||||
|
||||
|
|
@ -102,6 +115,7 @@ func extract_substance(key: String, extract_amount: float) -> RuntimeSubstanceDa
|
|||
if inventory[result_substance.substance.scientific_name].amount == 0:
|
||||
inventory.erase(result_substance.substance.scientific_name)
|
||||
|
||||
update_solutions()
|
||||
inventory_changed.emit(inventory.values())
|
||||
|
||||
return result_substance
|
||||
|
|
@ -160,5 +174,6 @@ func check_for_reactions() -> void:
|
|||
add_substance_no_callback(data)
|
||||
check_for_reactions()
|
||||
recalculate_temperature()
|
||||
update_solutions()
|
||||
inventory_changed.emit(inventory.values())
|
||||
GuiSignalBus.push("Произошла реакция: " + found_reaction.formula())
|
||||
|
|
|
|||
|
|
@ -2,6 +2,8 @@ extends Node
|
|||
|
||||
const REACTIONS_DIRECTORY = "res://assets/reactions/"
|
||||
|
||||
@export var water_soluable: Array[Substance] = [preload("res://assets/substances/AgNO3.tres"),preload("res://assets/substances/CaCl.tres"),preload("res://assets/substances/CaCO3.tres"),preload("res://assets/substances/CH3COONa.tres"),preload("res://assets/substances/CuSO4.tres"),preload("res://assets/substances/FeSO4.tres"),preload("res://assets/substances/KCl.tres"),preload("res://assets/substances/KI.tres"),preload("res://assets/substances/KNO3.tres"),preload("res://assets/substances/LeadNitrate.tres"),preload("res://assets/substances/MethylOrange.tres"),preload("res://assets/substances/Na2CO3.tres"),preload("res://assets/substances/Na2S.tres"),preload("res://assets/substances/Na2SO4.tres"),preload("res://assets/substances/NaCl.tres"),preload("res://assets/substances/NaNO3.tres"),preload("res://assets/substances/NaOH.tres"),preload("res://assets/substances/NH4CL.tres"),preload("res://assets/substances/NH4OH.tres"),preload("res://assets/substances/Phenolphtalein.tres")]
|
||||
|
||||
var reactions: Array[Reaction]
|
||||
|
||||
func _ready() -> void:
|
||||
|
|
@ -27,3 +29,6 @@ func find_appropriate_reaction(input_substances: Array[Substance], temperature:
|
|||
return filtered[0]
|
||||
else:
|
||||
return null
|
||||
|
||||
func is_water_solution(substance: Substance):
|
||||
return water_soluable.has(substance)
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ class_name Substance
|
|||
@export var scientific_name: StringName
|
||||
@export var melting_point: float
|
||||
@export var boiling_point: float
|
||||
@export var liquid_transparency: float = 0.5
|
||||
@export_range(0,1,0.01) var color_influence: float = 0.5
|
||||
@export var pH: float = 7.0
|
||||
@export var pHIonicOverrides: Dictionary[Substance,float]
|
||||
@export var color: Color
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@ class_name RuntimeSubstanceData
|
|||
var substance: Substance
|
||||
var amount: float
|
||||
var temperature: float = 20.0
|
||||
var is_solution: bool = false
|
||||
|
||||
func add(data: RuntimeSubstanceData) -> void:
|
||||
temperature = (temperature + data.temperature)/2.0
|
||||
|
|
|
|||
|
|
@ -16,31 +16,37 @@ func update_material(substances: Array[RuntimeSubstanceData]) -> void:
|
|||
visible = true
|
||||
|
||||
var total_weight = 0
|
||||
var total_color = 0
|
||||
|
||||
for sub in substances:
|
||||
total_weight += sub.amount
|
||||
total_color += sub.substance.color_influence
|
||||
|
||||
var pH: float = 0
|
||||
var color: Color = Color(0,0,0,0)
|
||||
|
||||
|
||||
for sub: RuntimeSubstanceData in substances:
|
||||
var weight: float = sub.amount/total_weight
|
||||
pH += sub.substance.get_ph_runtime(substances) * weight
|
||||
|
||||
for sub: RuntimeSubstanceData in substances:
|
||||
var weight: float = sub.amount/total_weight
|
||||
if display_type == DisplayType.Fluid:
|
||||
pass
|
||||
var color_to_add: Color
|
||||
if sub.substance.pHColor != null:
|
||||
color += sub.substance.pHColor.sample(pH/14.0) * weight
|
||||
color_to_add = sub.substance.pHColor.sample(pH/14.0)
|
||||
else:
|
||||
color += sub.substance.color * weight
|
||||
|
||||
if display_type == DisplayType.Fluid:
|
||||
pass
|
||||
color_to_add = sub.substance.color
|
||||
|
||||
if display_type == DisplayType.Fluid and sub.is_solution:
|
||||
color_to_add.a = 0.5
|
||||
|
||||
#if color == Color(0,0,0,0):
|
||||
# color = color_to_add
|
||||
#else:
|
||||
# color = color.lerp(color_to_add,sub.substance.color_influence)
|
||||
color += color_to_add * sub.substance.color_influence
|
||||
|
||||
|
||||
mat.albedo_color = color
|
||||
mat.albedo_color = color / total_color
|
||||
|
||||
func update_material_unfiltered(substances: Array[RuntimeSubstanceData]):
|
||||
match display_type:
|
||||
|
|
@ -51,5 +57,5 @@ func update_material_unfiltered(substances: Array[RuntimeSubstanceData]):
|
|||
var solids = substances.filter(filter_solids)
|
||||
update_material(solids)
|
||||
|
||||
func filter_liquids(sub: RuntimeSubstanceData): return sub.substance.melting_point < sub.temperature or sub.substance.is_solution
|
||||
func filter_solids(sub: RuntimeSubstanceData): return sub.substance.melting_point > sub.temperature and not sub.substance.is_solution
|
||||
func filter_liquids(sub: RuntimeSubstanceData): return sub.substance.melting_point < sub.temperature or sub.is_solution
|
||||
func filter_solids(sub: RuntimeSubstanceData): return sub.substance.melting_point > sub.temperature and not sub.is_solution
|
||||
|
|
|
|||
|
|
@ -12,5 +12,6 @@ func _ready() -> void:
|
|||
|
||||
get_parent().add_to_group("solid_source")
|
||||
else:
|
||||
jar_fill_material.albedo_color.a = substance.liquid_transparency
|
||||
if substance.is_solution:
|
||||
jar_fill_material.albedo_color.a = 0.5
|
||||
get_parent().add_to_group("fluid_source")
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue