//---------------------------------------------------------------------------------------
void FSkookumScriptRuntime::on_world_cleanup(UWorld * world_p, bool session_ended_b, bool cleanup_resources_b)
  {
  //A_DPRINT("on_world_cleanup: %S %p\n", *world_p->GetName(), world_p);

  if (world_p->IsGameWorld())
    {
    // Keep track of how many game worlds we got
    --m_num_game_worlds;

    // Set world pointer to null if it was pointing to us
    if (m_game_world_p == world_p)
      {
      m_game_world_p->OnTickDispatch().Remove(m_game_tick_handle);
      m_game_world_p = nullptr;
      SkUEClassBindingHelper::set_world(nullptr);
      }

    // Restart SkookumScript if initialized
    if (m_num_game_worlds == 0 && is_skookum_initialized())
      {
      // Simple shutdown
      //SkookumScript::get_world()->clear_coroutines();
      A_DPRINT(
        "SkookumScript resetting session...\n"
        "  cleaning up...\n");
      SkookumScript::deinitialize_gameplay();
      SkookumScript::deinitialize_sim();
      SkookumScript::initialize_sim();
      A_DPRINT("  ...done!\n\n");
      }
    }
  else if (world_p->WorldType == EWorldType::Editor)
    {
    // Set world pointer to null if it was pointing to us
    if (m_editor_world_p == world_p)
      {
      m_editor_world_p->OnTickDispatch().Remove(m_editor_tick_handle);
      m_editor_world_p = nullptr;
      }
    }
  }