public void UpdateTotal() { // Defaults total = is_value ? value : 0; valid_state = true; if (script_digit_upper != null) { Operator upper_op = script_digit_upper.GetOperator(); if (script_digit_upper.GetIsValue() && !is_value) { // Above block is value and current block is operator, transfer total valid_op = true; total = script_digit_upper.GetTotal(); } else if (!script_digit_upper.GetIsValue() && is_value && upper_op != Operator.invalid) { // Above block is operator and current block is value, perform operation and calculate new total total = ApplyOperation(upper_op, script_digit_upper.GetTotal(), value); } else // Invalid placement { valid_state = false; script_digit_upper.SetValidState(false); script_digit_upper.UpdateColor(); UpdateColor(); return; } } // Update lower block's total if exists if (script_digit_lower != null) { script_digit_lower.UpdateTotal(); } UpdateColor(); }