public TurnBasedUnit BuildShip(ShipType shipType, BlueprintTemplate bpTemplate, Vector3 position, Quaternion rotation)
    {
        hullBeingBuilt = GameObject.Instantiate(bpTemplate.Hull, position, rotation) as Hull;
        #if FULL_DEBUG ||LOW_DEBUG
        if (!hullBeingBuilt)
        {
            Debug.LogError("ship null");
        }
        else
        {
            Debug.Log("Building ship from template " + bpTemplate.MetaData.BlueprintName);
        }
        #endif
        hullBeingBuilt.Init();

        bpTemplate.GetBlueprint(out blueprintBeingBuilt, hullBeingBuilt);

        return InstantiateShip(true, shipType, position, rotation);
    }
    private TurnBasedUnit InstantiateShip(bool hullSpawnedAlready, ShipType shipType, Vector3 position, Quaternion rotation)
    {
        if (!hullSpawnedAlready)
        {
            hullBeingBuilt = GameObject.Instantiate(blueprintBeingBuilt.Hull, position, rotation) as Hull;
            #if FULL_DEBUG ||LOW_DEBUG
            if (!hullBeingBuilt)
            {
                Debug.LogError("ship null");
            }
            #endif
            hullBeingBuilt.Init();
        }

        for (int i = 0; i < blueprintBeingBuilt.Slot_component_table.Count; i++)
        {
            var slot_component = blueprintBeingBuilt.Slot_component_table.ElementAt(i);
            int slotIndex = slot_component.Key.index;

        #if !NO_DEBUG
            if (hullBeingBuilt.index_slot_table.ContainsKey(slotIndex))
            {
                Transform slotTrans = hullBeingBuilt.index_slot_table[slotIndex].transform;
                ShipComponent builtComponent = GameObject.Instantiate(slot_component.Value, slotTrans.position, slotTrans.rotation) as ShipComponent;
                blueprintBeingBuilt.Slot_component_table[slot_component.Key] = builtComponent;
                builtComponent.transform.SetParent(slotTrans, true);
                builtComponent.Placement = slot_component.Key.Placement;
                builtComponent.CompSpecificType = slot_component.Value.CompSpecificType;
                slot_component.Key.InstalledComponent = slot_component.Value;
            }
            else
            {
                Debug.LogError("Slot " + slotIndex + " not found in Hull " + hullBeingBuilt.hullName);
            }
        #else
            Transform slotTrans = hullBeingBuilt.index_slot_table[slotIndex].transform;
            GameObject component = GameObject.Instantiate(slot_component.Value, slotTrans.position, slotTrans.rotation) as GameObject;
            component.transform.SetParent(slotTrans, true);
        #endif
        }

        return SetupScriptsOnShip(shipType);
    }