Ejemplo n.º 1
0
END_TEST


START_TEST(setup_from_test)
  {
  job   pjob;
  char *str;

  memset(&pjob, 0, sizeof(pjob));
  strcpy(pjob.ji_qs.ji_fileprefix, "bob");
  str = setup_from(&pjob, "by");
  fail_unless(!strcmp(str, "bobby"));
  }
  //---------------------------------------------------------------------------------------
  // ActorComponent@from_tag()
  static void mthd_from_tag(SkInvokedMethod * scope_p, SkInstance ** result_pp)
    {
    if (result_pp) // Do nothing if result not desired
      {
      SkInstance * result_p = nullptr;

      AActor * actor_p = nullptr;
      SkClass * sk_class_p = nullptr;
      UClass * ue_class_p = nullptr;
      SkClass * known_sk_class_p = nullptr;
      if (setup_from(scope_p, &actor_p, &sk_class_p, &known_sk_class_p, &ue_class_p))
        {
        FName tag = scope_p->get_arg<SkUEName>(SkArg_2);

        const TSet<UActorComponent *> & components = actor_p->GetComponents();
        for (UActorComponent * component_p : components)
          {
          if (component_p && component_p->IsA(ue_class_p) && component_p->ComponentHasTag(tag))
            {
            // Is this a SkookumScriptBehaviorComponent?
            if (known_sk_class_p->is_component_class())
              {
              // Yes, check class of its instance
              SkInstance * instance_p = static_cast<USkookumScriptBehaviorComponent *>(component_p)->get_sk_component_instance();
              if (instance_p->get_class()->is_class(*sk_class_p))
                {
                result_p = instance_p;
                result_p->reference();
                break;
                }
              }
            else
              {
              result_p = SkUEActorComponent::new_instance(component_p);
              break;
              }
            }
          }
        }

      *result_pp = result_p ? result_p : SkBrain::ms_nil_p;
      }
    }
  //---------------------------------------------------------------------------------------
  // ActorComponent@list_from_tag()
  static void mthd_list_from_tag(SkInvokedMethod * scope_p, SkInstance ** result_pp)
    {
    if (result_pp) // Do nothing if result not desired
      {
      SkInstance * result_p = SkList::new_instance();

      AActor * actor_p = nullptr;
      SkClass * sk_class_p = nullptr;
      UClass * ue_class_p = nullptr;
      SkClass * known_sk_class_p = nullptr;
      if (setup_from(scope_p, &actor_p, &sk_class_p, &known_sk_class_p, &ue_class_p))
        {
        FName tag = scope_p->get_arg<SkUEName>(SkArg_2);

        const TSet<UActorComponent *> & components = actor_p->GetComponents();
        SkInstanceList & list = result_p->as<SkList>();
        list.ensure_size(components.Num()); // Safe bet, it's only pointers, so a few more won't hurt at all compared to reallocation performance hit
        for (UActorComponent * component_p : components)
          {
          if (component_p && component_p->IsA(ue_class_p) && component_p->ComponentHasTag(tag))
            {
            // Is this a SkookumScriptBehaviorComponent?
            if (known_sk_class_p->is_component_class())
              {
              // Yes, check class of its instance
              SkInstance * elem_p = static_cast<USkookumScriptBehaviorComponent *>(component_p)->get_sk_component_instance();
              if (elem_p->get_class()->is_class(*sk_class_p))
                {
                list.append(*elem_p, true);
                }
              }
            else
              {
              list.append(*SkUEActorComponent::new_instance(component_p), false);
              }
            }
          }
        }

      *result_pp = result_p;
      }
    }