diff --git a/assets/meshes/jar.res b/assets/meshes/jar.res index be21305..c6ca6a6 100644 Binary files a/assets/meshes/jar.res and b/assets/meshes/jar.res differ diff --git a/assets/meshes/jar_fill.res b/assets/meshes/jar_fill.res index a4665cc..66a9553 100644 Binary files a/assets/meshes/jar_fill.res and b/assets/meshes/jar_fill.res differ diff --git a/assets/meshes/spoon.res b/assets/meshes/spoon.res index f9c0e49..0cb4bd3 100644 Binary files a/assets/meshes/spoon.res and b/assets/meshes/spoon.res differ diff --git a/assets/meshes/spoon_fill.res b/assets/meshes/spoon_fill.res index cc590af..6ff84b6 100644 Binary files a/assets/meshes/spoon_fill.res and b/assets/meshes/spoon_fill.res differ diff --git a/src/inventory.gd b/src/inventory.gd index d8c1651..c9087dc 100644 --- a/src/inventory.gd +++ b/src/inventory.gd @@ -32,6 +32,13 @@ func add_substance(data: RuntimeSubstanceData) -> void: recalculate_temperature() inventory_changed.emit(inventory.values()) +func add_substance_no_callback(data: RuntimeSubstanceData) -> void: + if data.substance.scientific_name in inventory: + inventory[data.substance.scientific_name].add(data) + else: + inventory[data.substance.scientific_name] = data + + func add_inventory(substances: Array[RuntimeSubstanceData]) -> void: for sub in substances: add_substance(sub) @@ -84,6 +91,21 @@ func extract_solid(amount: float) -> Array[RuntimeSubstanceData]: inventory_changed.emit(inventory.values()) return result +func extract_substance(key: String, extract_amount: float) -> RuntimeSubstanceData: + var substance: RuntimeSubstanceData = inventory[key] + var result_substance: RuntimeSubstanceData = substance.duplicate() + if substance.amount >= extract_amount: + result_substance.amount = extract_amount + inventory[result_substance.substance.scientific_name].amount -= extract_amount + else: + inventory[result_substance.substance.scientific_name].amount = 0 + if inventory[result_substance.substance.scientific_name].amount == 0: + inventory.erase(result_substance.substance.scientific_name) + + inventory_changed.emit(inventory.values()) + + return result_substance + func sort_by_amount(a: RuntimeSubstanceData, b: RuntimeSubstanceData) -> bool: return a.amount < b.amount @@ -108,7 +130,35 @@ func recalculate_temperature() -> void: mean_temperature = temperature_sum / len(inventory) func check_for_reactions() -> void: - print(ReactionRegistry.find_appropriate_reaction(inventory.values().map(runtime_to_substance),mean_temperature)) - -func runtime_to_substance(sub: RuntimeSubstanceData) -> Substance: - return sub.substance + var substances: Array[Substance] = [] + substances.resize(len(inventory)) + var temp_inv: Array[RuntimeSubstanceData] = inventory.values() + for i in range(len(temp_inv)): + substances[i] = temp_inv[i].substance + + var found_reaction = ReactionRegistry.find_appropriate_reaction(substances,mean_temperature) + + if found_reaction == null: + return + + var reagents: Dictionary[StringName, ReactionSubstance] = found_reaction.input_substances_dict() + var reaction_mass: float = INF + for key in reagents: + var reagent_mass: float = inventory[key].amount/reagents[key].coefficient + reaction_mass = min(reagent_mass,reaction_mass) + + for key in reagents: + extract_substance(key,reaction_mass * reagents[key].coefficient) + + for sub in found_reaction.output_substances: + var data: RuntimeSubstanceData = RuntimeSubstanceData.new() + + data.amount = sub.coefficient * reaction_mass + data.substance = sub.substance + data.temperature = mean_temperature + + add_substance_no_callback(data) + check_for_reactions() + recalculate_temperature() + inventory_changed.emit(inventory.values()) + print(inventory) diff --git a/src/reaction_registry.gd b/src/reaction_registry.gd index da28d9f..73ceade 100644 --- a/src/reaction_registry.gd +++ b/src/reaction_registry.gd @@ -9,11 +9,17 @@ func _ready() -> void: reactions.append(load(REACTIONS_DIRECTORY + file)) func find_appropriate_reaction(input_substances: Array[Substance], temperature: float) -> Reaction: + var has_all: Callable = func(compared_array: Array[ReactionSubstance]) -> bool: + for el in compared_array: + if not el.substance in input_substances: + return false + return true + var filter_func: Callable = func(reaction: Reaction) -> bool: if reaction.reaction_temperature != -1: - return (reaction.input_substances == input_substances) and temperature >= reaction.reaction_temperature + return (has_all.call(reaction.input_substances)) and temperature >= reaction.reaction_temperature else: - return reaction.input_substances == input_substances + return has_all.call(reaction.input_substances) var filtered: Array[Reaction] = reactions.filter(filter_func) diff --git a/src/resources/reaction.gd b/src/resources/reaction.gd index 88d8bf9..5398408 100644 --- a/src/resources/reaction.gd +++ b/src/resources/reaction.gd @@ -7,7 +7,7 @@ class_name Reaction @export var reaction_temperature: float = -1 func input_substances_dict() -> Dictionary[StringName, ReactionSubstance]: - var result = {} + var result: Dictionary[StringName, ReactionSubstance] = {} for el in input_substances: result[el.substance.scientific_name] = el