extends Node var failures := 0 func check(ok: bool, message: String) -> void: if not ok: failures += 1 push_error(message) func _ready() -> void: GameState.save_locked = true call_deferred("run") func guest(room: Node, recipe: String, waited: float, weight: float) -> Customer: var person: Customer = load("res://scenes/restaurant/customer.tscn").instantiate() room.add_child(person) person.setup(str(DataCatalog.CUSTOMER_PROFILES.keys()[0]), room, -1, -1, Vector2.ZERO, Vector2.ZERO) person.force_waiting(recipe) person.set_process(false) person.cash = 100000 person.popularity_weight = weight person.order_wait_elapsed = waited room.customers.append(person) return person func deliver(room: Node, person: Customer, recipe: String) -> void: var dish: Dish = load("res://scenes/restaurant/dish.tscn").instantiate() dish.setup(recipe) room.add_child(dish) room.serve_customer(person, dish) func run() -> void: GameState._reset_progress_state() var room = load("res://scenes/restaurant/restaurant.tscn").instantiate() add_child(room) room.set_process(false) for existing: Customer in room.customers.duplicate(): existing.free() room.customers.clear() var recipe := str(DataCatalog.RECIPES.keys()[0]) var older := guest(room, recipe, 20.0, 5.0) var other_older := guest(room, recipe, 12.0, 2.0) var younger := guest(room, recipe, 4.0, 0.0) var eating := guest(room, recipe, 40.0, 100.0) eating.begin_eating(10.0) GameState.set_fact_value("restaurant_popularity", 100.0) deliver(room, younger, recipe) check(younger.state == Customer.State.EATING, "actual plate delivery succeeds") check(is_equal_approx(room.get_popularity(), 99.3), "each older waiting diner incurs a fractional minor loss") check(older.state == Customer.State.WAITING, "minor disappointment does not send the client away") check(is_zero_approx(younger.order_wait_elapsed), "a served meal ends the waiting period") var before: float = room.get_popularity() deliver(room, younger, recipe) check(is_equal_approx(room.get_popularity(), before), "repeated delivery to an eating client creates no second penalty") older.assign_order(recipe) check(is_equal_approx(older.order_wait_elapsed, 20.0), "forced reorder preserves service priority") older._process(0.25) check(is_equal_approx(older.order_wait_elapsed, 20.25), "waiting measures real time independently of patience") var saved := older.to_save_dictionary() var restored := guest(room, recipe, 0.0, 0.0) restored.apply_save_dictionary(JSON.parse_string(JSON.stringify(saved))) check(is_equal_approx(restored.order_wait_elapsed, 20.25), "waiting priority survives JSON save and restore") restored.begin_eating(10.0) older.popularity_weight = 0.0 deliver(room, older, recipe) check(is_equal_approx(room.get_popularity(), before), "serving the oldest client has no overtaking penalty") # A tied wait, and a client who arrived later, do not feel overtaken. var tied := guest(room, recipe, 12.0, 50.0) other_older.popularity_weight = 0.0 deliver(room, other_older, recipe) check(is_equal_approx(room.get_popularity(), before), "equal waiting times are not penalized") tied.popularity_weight = 5.0 var newest := guest(room, recipe, 0.0, 0.0) GameState.add_modifier("test:priority", "popularity_loss_multiplier", "scaling", -0.5) deliver(room, newest, recipe) check(is_equal_approx(room.get_popularity(), before - 0.25), "global loss upgrades apply to fractional overtaking penalties") var payload := GameState._build_save_payload() GameState._apply_save_payload(JSON.parse_string(JSON.stringify(payload))) check(is_equal_approx(room.get_popularity(), before - 0.25), "fractional reputation survives save loading") GameState.set_fact_value("restaurant_popularity", 10.25) room.hud._balance_shown.reputation = 10.25 room.hud._render_balances() check(room.hud.get_node("%ReputationLabel").text.ends_with(" 10"), "HUD keeps an integer display") GameState.remove_modifiers_by_source("test:priority") GameState.set_fact_value("restaurant_popularity", 0.0) var low_balance_guest := guest(room, recipe, 0.0, 5.0) deliver(room, low_balance_guest, recipe) var fast_gain := 5.0 * float(GameState.resolve_game_variable("popularity_coef_served_fast")) check(is_equal_approx(room.get_popularity(), fast_gain - 0.5), "zero starting reputation still receives the net service result") room.queue_free() await get_tree().process_frame print("SERVICE PRIORITY: ", "PASSED" if failures == 0 else "FAILED") get_tree().quit(0 if failures == 0 else 1)