From bd87ccf8715a4a015c3efbaf694992bf9bfff103 Mon Sep 17 00:00:00 2001 From: Rendo Date: Thu, 15 Jan 2026 04:27:20 +0500 Subject: [PATCH] Reactions done --- assets/meshes/jar.res | Bin 20238 -> 20242 bytes assets/meshes/jar_fill.res | Bin 6771 -> 6780 bytes assets/meshes/spoon.res | Bin 30510 -> 30516 bytes assets/meshes/spoon_fill.res | Bin 4337 -> 4348 bytes src/inventory.gd | 58 ++++++++++++++++++++++++++++++++--- src/reaction_registry.gd | 10 ++++-- src/resources/reaction.gd | 2 +- 7 files changed, 63 insertions(+), 7 deletions(-) diff --git a/assets/meshes/jar.res b/assets/meshes/jar.res index be213055141cd09610ddeed915cb4258f4010b7d..c6ca6a6d19d12af53e8d693f306afa0c3ce8abb8 100644 GIT binary patch delta 56 zcmeC1$2e&o?U?2k|i&BfN^z{>qi&IOA^>b5;Gg6E7vl5H+fZ_})o98eV G`2qmE7Z9`n delta 52 zcmbONDo diff --git a/assets/meshes/jar_fill.res b/assets/meshes/jar_fill.res index a4665cc6a5d04095d096647d5b8a7aad32a99c14..66a95532ce9e739c52a8c0fc58fa7b91afa7e2af 100644 GIT binary patch delta 72 zcmext^2cPu6mF)s+>>{4%a|CX78hhPg!3?ffg+GBN-eh1*H0`iPAw_c&rL1PNG;aS WN-T;`%go8q14=R^ZobPsjSm1sP#0kU delta 56 zcmexk^4Vm=6mG^Rlc#bktNQUUfPn;%%*jtq%(2qfcPuJOtn^JS&WJZIPN_6wh}is$ Hdm0}A>^Ko% diff --git a/assets/meshes/spoon.res b/assets/meshes/spoon.res index f9c0e49c3fcc6ef9597da50a9a3133eb7ff37084..0cb4bd33a79c7ce291039fb1543127f9be1eb638 100644 GIT binary patch delta 71 zcmZ4Yj&aL7#tl=rnO<>E-o-6rn3h_USHTd(`7U>0HULeO7n}e9 delta 58 zcmdn;j&a>P#tl=r8J|p^%B`&G&%*!)5>{4%a|2q6VgLXD delta 56 zcmeyP_)&4g6mG^Rlc#bktNQUUfPn;%%*jtq%(2qfcPuJOtn^JS&WJB4NXbcMFyH)w HTZ9z=<+~8- 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