@@ -357,11 +357,23 @@ func next(ctx: ParleyContext, current_node: ParleyNodeAst = null, dry_run: bool
357357 continue
358358 var next_node : ParleyNodeAst = filtered_next_nodes .front ()
359359 var next_type : Type = next_node .type
360+ # TODO: handle in settings or move to ctx
361+ var should_translate : bool = true
360362 match next_type :
361363 Type .DIALOGUE :
362- next_nodes .append (next_node )
364+ if should_translate :
365+ var dialogue_node_ast : ParleyDialogueNodeAst = next_node
366+ var resolved_text : String = resolve_value (ctx , dialogue_node_ast .text , dialogue_node_ast , 'text' )
367+ next_nodes .append (dialogue_node_ast .to_resolved (resolved_text ))
368+ else :
369+ next_nodes .append (next_node )
363370 Type .DIALOGUE_OPTION :
364- next_nodes .append (next_node )
371+ if should_translate :
372+ var dialogue_option_node_ast : ParleyDialogueOptionNodeAst = next_node
373+ var resolved_text : String = resolve_value (ctx , dialogue_option_node_ast .text , dialogue_option_node_ast , 'text' )
374+ next_nodes .append (dialogue_option_node_ast .to_resolved (resolved_text ))
375+ else :
376+ next_nodes .append (next_node )
365377 Type .ACTION :
366378 if not dry_run :
367379 await _run_action (ctx , next_node )
@@ -479,12 +491,12 @@ func _evaluate_condition_node(ctx: ParleyContext, condition_node: ParleyConditio
479491 @warning_ignore ("REDUNDANT_AWAIT" )
480492 var result : Variant = await fact .evaluate (ctx , [])
481493 fact .free () # Previous this was call_deferred, although I'm not sure why
482- var evaluated_value : Variant = _evaluate_value ( value )
494+ var evaluated_value : Variant = resolve_value ( ctx , value )
483495 match operator :
484496 ParleyConditionNodeAst .Operator .EQUAL :
485497 results .append (typeof (result ) == typeof (evaluated_value ) and result == evaluated_value )
486498 ParleyConditionNodeAst .Operator .NOT_EQUAL :
487- results .append (typeof (result ) != typeof (evaluated_value ) or result != _evaluate_value ( value ))
499+ results .append (typeof (result ) != typeof (evaluated_value ) or result != resolve_value ( ctx , value ))
488500 _ :
489501 if not dry_run :
490502 print_rich (ParleyUtils .log .info_msg ("Operator of type %s is not supported" % [operator ]))
@@ -511,20 +523,43 @@ func _evaluate_match_node(ctx: ParleyContext, match_node: ParleyMatchNodeAst) ->
511523 @warning_ignore ("REDUNDANT_AWAIT" )
512524 var result : Variant = await fact .evaluate (ctx , [])
513525 fact .free () # Previous this was call_deferred, although I'm not sure why
514- var evaluated_result : Variant = _evaluate_value ( result )
526+ var evaluated_result : Variant = resolve_value ( ctx , result )
515527 var cases : Array = match_node .cases
516- var case_index : int = cases .map (func (case : Variant ) -> Variant : return _map_value ( case )).find (evaluated_result )
528+ var case_index : int = cases .map (func (case : Variant ) -> Variant : return resolve_value ( ctx , case )).find (evaluated_result )
517529 if case_index == - 1 :
518530 return cases .find (ParleyMatchNodeAst .fallback_key )
519531 return case_index
520532
521533
522- func _evaluate_value (value_expr : Variant ) -> Variant :
523- # TODO: add evaluation here
524- return _map_value (value_expr )
534+ func resolve_value (ctx : ParleyContext , value_expr : Variant , node_to_translate : ParleyNodeAst = null , field_to_translate : String = & "" ) -> Variant :
535+ var resolved_value : Variant = value_expr
536+ if is_instance_of (value_expr , TYPE_STRING ):
537+ # Resolve expressions
538+ var raw_expression : String = value_expr
539+ var value : String = _evaluate_expression (ctx , raw_expression )
540+ # Apply translations
541+ if node_to_translate :
542+ value = _translate_value (ctx , node_to_translate , field_to_translate , value )
543+ resolved_value = value
544+
545+ return _coerce_value (resolved_value )
546+
547+
548+ func _evaluate_expression (_ctx : ParleyContext , value_expr : String ) -> String :
549+ # TODO: to be handled in: https://github.com/bisterix-studio/parley/pull/26
550+ return value_expr
551+
552+
553+ # TODO: add translation key to NodeAst
554+ func _translate_value (_ctx : ParleyContext , translate_node : ParleyNodeAst , translate_field : String , value : String ) -> Variant :
555+ var translate_ctx : String = & ""
556+ if ResourceLoader .exists (self .resource_path ):
557+ var uid : String = ParleyUtils .resource .get_uid (self )
558+ translate_ctx = ParleyUtils .translation .get_msg_ctx (uid , translate_node , translate_field )
559+ return str (tr (value , translate_ctx ))
525560
526561
527- func _map_value (value_expr : Variant ) -> Variant :
562+ func _coerce_value (value_expr : Variant ) -> Variant :
528563 if value_expr is String and value_expr == 'true' :
529564 return true
530565 if value_expr is String and value_expr == 'false' :
0 commit comments