@@ -517,32 +517,42 @@ template `\`*(s: string): string =
517517 f.remove_suffix (" \n\n " )
518518 f
519519
520- template `?` * (self:ref ):bool =
521- not self.is_nil
520+ proc init * [T](_:type QueryAnswer , results: open_array[T]):QueryAnswer [T]=
521+ result .results= results.to_seq
522+ result .truthy= results.len> 0
522523
523- template `?` * (self:object ):bool =
524- self != self.type .default
524+ template `?` * [T: ref ] (self:T ):Answer [T] =
525+ Answer [T](truthy: not self.is_nil)
525526
526- template `?` * [T](option: Option [T] ):bool =
527- option.is_some
527+ template `?` * [T: object ](self: T ):Answer [T] =
528+ Answer [T](truthy: self != self. type .default)
528529
529- template `?` * (self:SomeNumber ):bool =
530- self!= 0
530+ template `?` * [T](option:Option [T]):Answer [T]=
531+ if option.is_some:
532+ Answer [T](truthy:true )
533+ else :
534+ Answer [T]()
535+
536+ template `?` * [T:SomeNumber ](self:SomeNumber ):Answer [T]=
537+ Answer [T](truthy: self!= 0 )
531538
532- template `?` * (self:string ):bool =
533- self!= " "
539+ template `?` * (self:string ):Answer [ string ] =
540+ Answer [ string ](truthy: self!= " " )
534541
535- template `?` * [T](self:open_array[T] ):bool =
536- self.len> 0
542+ template `?` * [T: open_array ](self:T ):Answer [T] =
543+ Answer [T](truthy: self.len> 0 )
537544
538- template `?` * (self:Table ):bool =
539- self.len> 0
545+ template `?` * [T: Table ] (self:T ):Answer [T] =
546+ Answer [T](truthy: self.len> 0 )
540547
541- template `?` * [T](self:set [T] ):bool =
542- self.card> 0
548+ template `?` * [T: set ](self:T ):Answer [T] =
549+ Answer [T](truthy: self.card> 0 )
543550
544- template `?` * [T](self:HashSet [T]):bool =
545- self.card> 0
551+ template `?` * [T:HashSet ](self: T):Answer [T]=
552+ Answer [T](truthy: self.card> 0 )
553+
554+ converter to_bool * (src:Answer ):bool =
555+ src.truthy
546556
547557proc `or` * [T:not bool ](a, b: T): T=
548558if ? a:
@@ -581,37 +591,50 @@ template query(T: type Unit, key: string, body: untyped): untyped =
581591 unit.query_results[key]= results.map_it (Unit (it))
582592result
583593
584- proc all * (_:type Bot ):Bot =
585- Bot .query (" all-bots" ):
586- all_bots ()
594+ iterator items * [T](self:QueryAnswer [T]): T=
595+ for itemin self.results:
596+ yield item
597+
598+ proc all * (_:type Bot ):QueryAnswer [Bot ]=
599+ QueryAnswer .init all_bots ()
587600
588- proc all * (T:type Build ):Build =
589- Build .query (" all-builds" ):
590- all_builds ()
601+ proc all * (T:type Build ):QueryAnswer [Build ]=
602+ QueryAnswer .init all_builds ()
591603
592- proc all * (_:type Sign ):Sign =
593- Sign .query (" all-signs" ):
594- all_signs ()
604+ proc all * (_:type Sign ):QueryAnswer [Sign ]=
605+ QueryAnswer .init all_signs ()
595606
596- proc all * (_:type Player ):Player =
597- Player .query (" all-players" ):
598- all_players ()
607+ proc all * (_:type Player ):QueryAnswer [Player ]=
608+ QueryAnswer .init all_players ()
599609
600- proc all * (_:type Unit ):Unit =
601- Unit .query (" all-units" ):
602- all_units ()
610+ proc all * (_:type Unit ):QueryAnswer [Unit ]=
611+ QueryAnswer .init all_units ()
603612
604- proc added * (_:type Player ):Player =
605- Player .query (" added-players" ):
606- added_units ().filter_it (itof Player ).map_it (Player (it))
613+ proc added * (_:type Player ):QueryAnswer [Player ]=
614+ QueryAnswer .init added_units ().filter_it (itof Player ).map_it (Player (it))
607615
608- proc hit * (_:type Player ):Player =
609- Player .query (" Player-hit" ):
610- active_unit ().current_colliders (" Player" ).map_it (Player (it))
616+ proc hit * (_:type Player ):QueryAnswer [Player ]=
617+ QueryAnswer .init active_unit ().current_colliders (" Player" ).map_it (Player (it))
611618
612619proc register_type [T:Unit ](unit: T)=
613620register_template_node (unit,$ T)
614621
622+ template `as` * [T](answer:QueryAnswer [T], name:untyped ):bool =
623+ if loop_context.is_nil:
624+ raise
625+ ObjectConversionDefect .init (" `as` can only be used inside an action loop" )
626+ let ans= answer
627+ let key= $ T& " -" & $ instantiation_info ()
628+ var result = false
629+ let name {.inject .}: T=
630+ if ans.truthy:
631+ result = true
632+ T.query (key):
633+ ans.results
634+ else :
635+ T.default
636+ result
637+
615638register_type Player ()
616639register_type Bot ()
617640register_type Build ()