AC Localization

AC Localization

//---------------------------------------------------------------------------------------
//  *********   FIRAXIS SOURCE CODE   ******************
//  FILE:    X2BodyPartTemplateManager.uc
//  AUTHOR:  Timothy Talley  --  11/04/2013
//---------------------------------------------------------------------------------------
//  Copyright (c) 2013 Firaxis Games Inc. All rights reserved.
//---------------------------------------------------------------------------------------

class X2BodyPartTemplateManager extends X2DataTemplateManager
    native(Core)
	config(Content);

var protected config array<X2PartInfo> BodyPartTemplateConfig;
var protected config array<string> ValidPartTypes;
var config bool DisableCharacterVoices; //Allow unilateral disabling of character voices from INI at Jake's request.
var config bool DisablePostProcessWhenCustomizing;
var private bool bPartTypeInitDone;

var private native Map_Mirror   BodyPartTemplateCache{TMap<FName, TMap<FName, UX2BodyPartTemplate*> *>};

native static function X2BodyPartTemplateManager GetBodyPartTemplateManager();

native function InitPartTypes( array<string> PartTypes);
native function bool AddUberTemplate(string BodyPartType, X2BodyPartTemplate Template, bool ReplaceDuplicate = false);
native function X2BodyPartTemplate FindUberTemplate(string BodyPartType, name PartName);
native function GetUberTemplates(string BodyPartType,  out array<X2BodyPartTemplate> Templates );
native function GetFilteredUberTemplates(string BodyPartType,  Object CallbackObject, delegate<X2BodyPartFilter.FilterCallback> CallbackFn, out array<X2BodyPartTemplate> Templates );
native function X2BodyPartTemplate GetRandomUberTemplate(string BodyPartType, Object CallbackObject, delegate<X2BodyPartFilter.FilterCallback> CallbackFn);
native function array<name> GetPartPackNames();

//Returns true if ArmorTemplates, gender, pristine, etc. all match up between the two templates
native static function bool DoArmorPartsMatch(X2BodyPartTemplate TemplateA, X2BodyPartTemplate TemplateB);

native function InitTemplates();

protected event InitTemplatesInternal()
{
	local int i;
	local X2PartInfo PartInfo;
	local X2BodyPartTemplate Template;

	InitPartTypes(ValidPartTypes);

	//== General Parts
	for (i = 0; i < BodyPartTemplateConfig.Length; ++i)
	{
		PartInfo = BodyPartTemplateConfig[i];

		// HAX: Load 'Torso', 'Arms' and 'Legs' templates the old way to prevent template name collisions:
		// TODO: @rmcfall - make all body part template names unique so they can be individually localized
		switch(PartInfo.PartType)
		{
		case "Torso":
		case "Arms":
		case "Legs":
			// Begin issue #328 - Check if the TemplateName indentifies the Part Type.
			if(InStr(PartInfo.TemplateName, PartInfo.PartType,, true)==INDEX_NONE)
			{
				// Instead of giving up, decorate TemplateName to get unique Object Name
				Template = new(None, string(PartInfo.TemplateName) $ "_" $ PartInfo.PartType) class'X2BodyPartTemplate';
				break;
			}
			// End issue #328 - Fall through to default case if template name indenties the part type
		default:
			// This is the "new", proper way of instantiating a template (requires unique TemplateName)
			Template = new(None, string(PartInfo.TemplateName)) class'X2BodyPartTemplate';
		}

		Template.PartType			= PartInfo.PartType;

		Template.Gender				= PartInfo.Gender;
		Template.Race				= PartInfo.Race;
		Template.ArchetypeName		= PartInfo.ArchetypeName;

		// Body template
		Template.Type				= PartInfo.CivilianType;

		// Hair template
		Template.bCanUseOnCivilian	= PartInfo.bCanUseOnCivilian;
		Template.bIsHelmet			= PartInfo.bIsHelmet;

		// Armor
		Template.bVeteran			= PartInfo.bVeteran;
		Template.bAnyArmor			= PartInfo.bAnyArmor;
		Template.ArmorTemplate		= PartInfo.ArmorTemplate;
		Template.CharacterTemplate  = PartInfo.CharacterTemplate;
		Template.SpecializedType	= PartInfo.SpecializedType;
		Template.Tech				= PartInfo.Tech;
		Template.ReqClass			= PartInfo.ReqClass;
		Template.SetNames			= PartInfo.SetNames;

		// Language
		Template.Language			= PartInfo.Language;

		// Which content pack this part belongs to, either DLC or Mod
		Template.DLCName			= name(PartInfo.DLCName);

		Template.bGhostPawn = PartInfo.bGhostPawn;

		Template.SetTemplateName(PartInfo.TemplateName);
		AddUberTemplate(Template.PartType, Template, true);

		`log(`location @ "Adding BodyPartTemplate: " @ `ShowVar(Template.DataName) @ `ShowVar(Template) @ `ShowVar(Template.PartType),,'XCom_Templates');
	}

}

function LoadAllContent()
{
	local array<X2BodyPartTemplate> TemplateList;
	local XComContentManager ContentMgr;
	local int Index, TemplateListIndex;

	ContentMgr = `CONTENT;
	for(Index = 0; Index < ValidPartTypes.Length; ++Index)
	{
		GetUberTemplates(ValidPartTypes[Index], TemplateList);

		//Skip voices, those will still be loaded on demand - as they are numerous and memory intensive
		if(ValidPartTypes[Index] == "Voice")
		{
			continue;
		}

		for(TemplateListIndex = 0; TemplateListIndex < TemplateList.Length; ++TemplateListIndex)
		{
			ContentMgr.RequestGameArchetype(TemplateList[TemplateListIndex].ArchetypeName, none, none, true);
		}
	}
}

cpptext
{
	TMap<FName, UX2BodyPartTemplate*> *GetPartMap( const TCHAR *BodyPartType );

}

defaultproperties
{
}

//---------------------------------------------------------------------------------------
//  *********   FIRAXIS SOURCE CODE   ******************
//  FILE:    X2BodyPartTemplateManager.uc
//  AUTHOR:  Timothy Talley  --  11/04/2013
//---------------------------------------------------------------------------------------
//  Copyright (c) 2013 Firaxis Games Inc. All rights reserved.
//---------------------------------------------------------------------------------------

class X2BodyPartTemplateManager extends X2DataTemplateManager
    native(Core)
	config(Content);

var protected config array<X2PartInfo> BodyPartTemplateConfig;
var protected config array<string> ValidPartTypes;
var config bool DisableCharacterVoices; //Allow unilateral disabling of character voices from INI at Jake's request.
var config bool DisablePostProcessWhenCustomizing;
var private bool bPartTypeInitDone;

var private native Map_Mirror   BodyPartTemplateCache{TMap<FName, TMap<FName, UX2BodyPartTemplate*> *>};

native static function X2BodyPartTemplateManager GetBodyPartTemplateManager();

native function InitPartTypes( array<string> PartTypes);
native function bool AddUberTemplate(string BodyPartType, X2BodyPartTemplate Template, bool ReplaceDuplicate = false);
native function X2BodyPartTemplate FindUberTemplate(string BodyPartType, name PartName);
native function GetUberTemplates(string BodyPartType,  out array<X2BodyPartTemplate> Templates );
native function GetFilteredUberTemplates(string BodyPartType,  Object CallbackObject, delegate<X2BodyPartFilter.FilterCallback> CallbackFn, out array<X2BodyPartTemplate> Templates );
native function X2BodyPartTemplate GetRandomUberTemplate(string BodyPartType, Object CallbackObject, delegate<X2BodyPartFilter.FilterCallback> CallbackFn);
native function array<name> GetPartPackNames();

//Returns true if ArmorTemplates, gender, pristine, etc. all match up between the two templates
native static function bool DoArmorPartsMatch(X2BodyPartTemplate TemplateA, X2BodyPartTemplate TemplateB);

native function InitTemplates();

protected event InitTemplatesInternal()
{
	local int i;
	local X2PartInfo PartInfo;
	local X2BodyPartTemplate Template;

	InitPartTypes(ValidPartTypes);

	//== General Parts
	for (i = 0; i < BodyPartTemplateConfig.Length; ++i)
	{
		PartInfo = BodyPartTemplateConfig[i];

		// HAX: Load 'Torso', 'Arms' and 'Legs' templates the old way to prevent template name collisions:
		// TODO: @rmcfall - make all body part template names unique so they can be individually localized
		switch(PartInfo.PartType)
		{
		case "Torso":
		case "Arms":
		case "Legs":
			// Single Line Change for issue '#328 Instad of giving up, decorate TemplateName to get unique Object Name
			Template = new(None, string(PartInfo.TemplateName) $ "_" $ PartInfo.PartType) class'X2BodyPartTemplate';
			break;
		default:
			// This is the "new", proper way of instantiating a template (requires unique TemplateName)
			Template = new(None, string(PartInfo.TemplateName)) class'X2BodyPartTemplate';
		}

		Template.PartType			= PartInfo.PartType;

		Template.Gender				= PartInfo.Gender;
		Template.Race				= PartInfo.Race;
		Template.ArchetypeName		= PartInfo.ArchetypeName;

		// Body template
		Template.Type				= PartInfo.CivilianType;

		// Hair template
		Template.bCanUseOnCivilian	= PartInfo.bCanUseOnCivilian;
		Template.bIsHelmet			= PartInfo.bIsHelmet;

		// Armor
		Template.bVeteran			= PartInfo.bVeteran;
		Template.bAnyArmor			= PartInfo.bAnyArmor;
		Template.ArmorTemplate		= PartInfo.ArmorTemplate;
		Template.CharacterTemplate  = PartInfo.CharacterTemplate;
		Template.SpecializedType	= PartInfo.SpecializedType;
		Template.Tech				= PartInfo.Tech;
		Template.ReqClass			= PartInfo.ReqClass;
		Template.SetNames			= PartInfo.SetNames;

		// Language
		Template.Language			= PartInfo.Language;

		// Which content pack this part belongs to, either DLC or Mod
		Template.DLCName			= name(PartInfo.DLCName);

		Template.bGhostPawn = PartInfo.bGhostPawn;

		Template.SetTemplateName(PartInfo.TemplateName);
		AddUberTemplate(Template.PartType, Template, true);

		`log(`location @ "Adding BodyPartTemplate: " @ `ShowVar(Template.DataName) @ `ShowVar(Template) @ `ShowVar(Template.PartType),,'XCom_Templates');
	}

}

function LoadAllContent()
{
	local array<X2BodyPartTemplate> TemplateList;
	local XComContentManager ContentMgr;
	local int Index, TemplateListIndex;

	ContentMgr = `CONTENT;
	for(Index = 0; Index < ValidPartTypes.Length; ++Index)
	{
		GetUberTemplates(ValidPartTypes[Index], TemplateList);

		//Skip voices, those will still be loaded on demand - as they are numerous and memory intensive
		if(ValidPartTypes[Index] == "Voice")
		{
			continue;
		}

		for(TemplateListIndex = 0; TemplateListIndex < TemplateList.Length; ++TemplateListIndex)
		{
			ContentMgr.RequestGameArchetype(TemplateList[TemplateListIndex].ArchetypeName, none, none, true);
		}
	}
}

cpptext
{
	TMap<FName, UX2BodyPartTemplate*> *GetPartMap( const TCHAR *BodyPartType );

}

defaultproperties
{
}


Clarify what CustomTargetStyles means for mod authors already using this

/// HL-Docs: feature:CustomTargetStyles; issue:763; tags:tactical,compatibility
/// Target styles are responsible for the initial target selection for tactical abilities.
/// The `AbilityTargetStyle` builds an initial target list (or none, for cursor-targeted abilities).
/// The `AbilityMultiTargetStyle` adds other targets to every target built by the `AbilityTargetStyle`
/// or the cursor target.
///
/// Even though the results are cached, this code is extremely performance-critical:
/// Every time a game state is added to the History, all cached results are invalidated.
/// Whenever the AI evaluates a unit, the player selects a unit, or a reaction ability checks for
/// valid targets, this code is run for every ability on the unit!
///
/// As a result, all of this code is native: The target styles themselves are native, and their functions
/// are called by the native `GatherAbilityTargets` function. This native code simply cannot see UnrealScript
/// implementations of target styles, so custom target styles are essentially ignored.
///
/// We can override `GatherAbilityTargets` in a subclass with the slower UnrealScript implementation
/// that Firaxis helpfully provided in a comment. Doing this with all abilities would seriously
/// degrade performance, so we use [CH_ClassIsNative](../misc/ClassIsNative.md) to check if any
/// target styles are non-native, and if so use a custom `XComGameState_Ability` subclass when instanciating
/// the game state object for an ability template.
///
/// TL;DR Custom, scripted ability target/multi-target styles magically start working.
///
/// ## Compatibility
///
/// In order to selectively override the `XComGameState_Ability` class, we modify
/// `X2AbilityTemplate:CreateInstanceFromTemplate`. If your mod overrides `CreateInstanceFromTemplate` in a subclass,
/// of `X2AbilityTemplate`, the Highlander will not be able to apply this enhancement to that ability. On the other
/// hand, if you override `CreateInstanceFromTemplate` precisely to instantiate your own ability state object with
/// `GatherAbilityTargets` de-nativized for custom target style, your abilities will keep working the same way.

class XComGameState_Ability_CH extends XComGameState_Ability;

simulated function name GatherAbilityTargets(out array<AvailableTarget> Targets, optional XComGameState_Unit OverrideOwnerState)
{
	local int i, j;
	local XComGameState_Unit kOwner;
	local name AvailableCode;
	local XComGameStateHistory History;

	GetMyTemplate();
	History = `XCOMHISTORY;
	kOwner = XComGameState_Unit(History.GetGameStateForObjectID(OwnerStateObject.ObjectID));
	if (OverrideOwnerState != none)
		kOwner = OverrideOwnerState;

	if (m_Template != None)
	{
		AvailableCode = m_Template.AbilityTargetStyle.GetPrimaryTargetOptions(self, Targets);
		if (AvailableCode != 'AA_Success')
			return AvailableCode;

		for (i = Targets.Length - 1; i >= 0; --i)
		{
			AvailableCode = m_Template.CheckTargetConditions(self, kOwner, History.GetGameStateForObjectID(Targets[i].PrimaryTarget.ObjectID));
			if (AvailableCode != 'AA_Success')
			{
				Targets.Remove(i, 1);
			}
		}

		if (m_Template.AbilityMultiTargetStyle != none)
		{
			m_Template.AbilityMultiTargetStyle.GetMultiTargetOptions(self, Targets);
			for (i = Targets.Length - 1; i >= 0; --i)
			{
				for (j = Targets[i].AdditionalTargets.Length - 1; j >= 0; --j)
				{
					AvailableCode = m_Template.CheckMultiTargetConditions(self, kOwner, History.GetGameStateForObjectID(Targets[i].AdditionalTargets[j].ObjectID));
					if (AvailableCode != 'AA_Success' || (Targets[i].AdditionalTargets[j].ObjectID == Targets[i].PrimaryTarget.ObjectID) && !m_Template.AbilityMultiTargetStyle.bAllowSameTarget)
					{
						Targets[i].AdditionalTargets.Remove(j, 1);
					}
				}

				AvailableCode = m_Template.AbilityMultiTargetStyle.CheckFilteredMultiTargets(self, Targets[i]);
				if (AvailableCode != 'AA_Success')
					Targets.Remove(i, 1);
			}
		}

		//The Multi-target style may have deemed some primary targets invalid in calls to CheckFilteredMultiTargets - so CheckFilteredPrimaryTargets must come afterwards.
		AvailableCode = m_Template.AbilityTargetStyle.CheckFilteredPrimaryTargets(self, Targets);
		if (AvailableCode != 'AA_Success')
			return AvailableCode;

		Targets.Sort(SortAvailableTargets);
	}
	return 'AA_Success';
}

simulated function int SortAvailableTargets(AvailableTarget TargetA, AvailableTarget TargetB)
{
	local XComGameStateHistory History;
	local XComGameState_Destructible DestructibleA, DestructibleB;
	local int HitChanceA, HitChanceB;
	local ShotBreakdown BreakdownA, BreakdownB;

	if (TargetA.PrimaryTarget.ObjectID != 0 && TargetB.PrimaryTarget.ObjectID == 0)
	{
		return -1;
	}
	if (TargetB.PrimaryTarget.ObjectID != 0 && TargetA.PrimaryTarget.ObjectID == 0)
	{
		return 1;
	}
	if (TargetA.PrimaryTarget.ObjectID == 0 && TargetB.PrimaryTarget.ObjectID == 0)
	{
		return 1;
	}
	History = `XCOMHISTORY;
	DestructibleA = XComGameState_Destructible(History.GetGameStateForObjectID(TargetA.PrimaryTarget.ObjectID));
	DestructibleB = XComGameState_Destructible(History.GetGameStateForObjectID(TargetB.PrimaryTarget.ObjectID));
	if (DestructibleA != none && DestructibleB == none)
	{
		return -1;
	}
	if (DestructibleB != none && DestructibleA == none)
	{
		return 1;
	}

	HitChanceA = GetShotBreakdown(TargetA, BreakdownA);
	HitChanceB = GetShotBreakdown(TargetB, BreakdownB);
	if (HitChanceA < HitChanceB)
	{
		return -1;
	}

	return 1;
}

/// HL-Docs: feature:CustomTargetStyles; issue:763; tags:tactical,compatibility
/// Target styles are responsible for the initial target selection for tactical abilities.
/// The `AbilityTargetStyle` builds an initial target list (or none, for cursor-targeted abilities).
/// The `AbilityMultiTargetStyle` adds other targets to every target built by the `AbilityTargetStyle`
/// or the cursor target.
///
/// Even though the results are cached, this code is extremely performance-critical:
/// Every time a game state is added to the History, all cached results are invalidated.
/// Whenever the AI evaluates a unit, the player selects a unit, or a reaction ability checks for
/// valid targets, this code is run for every ability on the unit!
///
/// As a result, all of this code is native: The target styles themselves are native, and their functions
/// are called by the native `GatherAbilityTargets` function. This native code simply cannot see UnrealScript
/// implementations of target styles, so custom target styles are essentially ignored.
///
/// We can override `GatherAbilityTargets` in a subclass with the slower UnrealScript implementation
/// that Firaxis helpfully provided in a comment. Doing this with all abilities would seriously
/// degrade performance, so we use [CH_ClassIsNative](../misc/ClassIsNative.md) to check if any
/// target styles are non-native, and if so use a custom `XComGameState_Ability` subclass when instanciating
/// the game state object for an ability template.
///
/// TL;DR Custom ability target/multi-target styles magically start working.
///
/// ## Compatibility
///
/// In order to selectively override the `XComGameState_Ability` class, we modify `X2AbilityTemplate:CreateInstanceFromTemplate`.
/// If your mod overrides `CreateInstanceFromTemplate` in a subclass, the Highlander will not be able to apply this enhancement
/// to that ability. On the other hand, if you override `CreateInstanceFromTemplate` precisely to instantiate your own
/// ability state object, things will keep working.

class XComGameState_Ability_CH extends XComGameState_Ability;

simulated function name GatherAbilityTargets(out array<AvailableTarget> Targets, optional XComGameState_Unit OverrideOwnerState)
{
	local int i, j;
	local XComGameState_Unit kOwner;
	local name AvailableCode;
	local XComGameStateHistory History;

	GetMyTemplate();
	History = `XCOMHISTORY;
	kOwner = XComGameState_Unit(History.GetGameStateForObjectID(OwnerStateObject.ObjectID));
	if (OverrideOwnerState != none)
		kOwner = OverrideOwnerState;

	if (m_Template != None)
	{
		AvailableCode = m_Template.AbilityTargetStyle.GetPrimaryTargetOptions(self, Targets);
		if (AvailableCode != 'AA_Success')
			return AvailableCode;

		for (i = Targets.Length - 1; i >= 0; --i)
		{
			AvailableCode = m_Template.CheckTargetConditions(self, kOwner, History.GetGameStateForObjectID(Targets[i].PrimaryTarget.ObjectID));
			if (AvailableCode != 'AA_Success')
			{
				Targets.Remove(i, 1);
			}
		}

		if (m_Template.AbilityMultiTargetStyle != none)
		{
			m_Template.AbilityMultiTargetStyle.GetMultiTargetOptions(self, Targets);
			for (i = Targets.Length - 1; i >= 0; --i)
			{
				for (j = Targets[i].AdditionalTargets.Length - 1; j >= 0; --j)
				{
					AvailableCode = m_Template.CheckMultiTargetConditions(self, kOwner, History.GetGameStateForObjectID(Targets[i].AdditionalTargets[j].ObjectID));
					if (AvailableCode != 'AA_Success' || (Targets[i].AdditionalTargets[j].ObjectID == Targets[i].PrimaryTarget.ObjectID) && !m_Template.AbilityMultiTargetStyle.bAllowSameTarget)
					{
						Targets[i].AdditionalTargets.Remove(j, 1);
					}
				}

				AvailableCode = m_Template.AbilityMultiTargetStyle.CheckFilteredMultiTargets(self, Targets[i]);
				if (AvailableCode != 'AA_Success')
					Targets.Remove(i, 1);
			}
		}

		//The Multi-target style may have deemed some primary targets invalid in calls to CheckFilteredMultiTargets - so CheckFilteredPrimaryTargets must come afterwards.
		AvailableCode = m_Template.AbilityTargetStyle.CheckFilteredPrimaryTargets(self, Targets);
		if (AvailableCode != 'AA_Success')
			return AvailableCode;

		Targets.Sort(SortAvailableTargets);
	}
	return 'AA_Success';
}

simulated function int SortAvailableTargets(AvailableTarget TargetA, AvailableTarget TargetB)
{
	local XComGameStateHistory History;
	local XComGameState_Destructible DestructibleA, DestructibleB;
	local int HitChanceA, HitChanceB;
	local ShotBreakdown BreakdownA, BreakdownB;

	if (TargetA.PrimaryTarget.ObjectID != 0 && TargetB.PrimaryTarget.ObjectID == 0)
	{
		return -1;
	}
	if (TargetB.PrimaryTarget.ObjectID != 0 && TargetA.PrimaryTarget.ObjectID == 0)
	{
		return 1;
	}
	if (TargetA.PrimaryTarget.ObjectID == 0 && TargetB.PrimaryTarget.ObjectID == 0)
	{
		return 1;
	}
	History = `XCOMHISTORY;
	DestructibleA = XComGameState_Destructible(History.GetGameStateForObjectID(TargetA.PrimaryTarget.ObjectID));
	DestructibleB = XComGameState_Destructible(History.GetGameStateForObjectID(TargetB.PrimaryTarget.ObjectID));
	if (DestructibleA != none && DestructibleB == none)
	{
		return -1;
	}
	if (DestructibleB != none && DestructibleA == none)
	{
		return 1;
	}

	HitChanceA = GetShotBreakdown(TargetA, BreakdownA);
	HitChanceB = GetShotBreakdown(TargetB, BreakdownB);
	if (HitChanceA < HitChanceB)
	{
		return -1;
	}

	return 1;
}


Update interactive.uc

Update interactive.uc

Added implicit-convert.uc to list of transforms

# interactive.uc - uCalc Transformation file
# This file was saved with uCalc Transform 2.96 on 5/28/2014 10:50:51 AM
# Comment: Allows you to convert with a click of a button instead of a batch file

ExternalKeywords: Exclude, Comment, Selected, ParentChild, FindMode, InputFile, OutputFile, BatchAction, SEND
ExternalKeywords: Highlight, ForeColor, BackColor, FontName, FontSize, FontStyle
ExternalKeywords: FilterEndText, FilterSeparator, FilterSort, FilterSortFunc, FilterStartText, FilterUnique, FilterTally

FindMode: Replace

# Definitions

# Search Criteria

Criteria: 0
Enabled: True
Exclude: False
Comment: Allows you to convert with a click of a button instead of a batch file
Selected: False
Highlight: False
ForeColor: ControlText
BackColor: Aqua
FontName:
FontSize:
FontStyle:
CaseSensitive: False
QuoteSensitive: True
CodeBlockSensitive: True
FilterEndText:
FilterSeparator: {#10}
FilterSort: False
FilterSortFunc:
FilterStartText:
FilterUnique: False
FilterTally: False
Min: 0
Max: -1
MinSoft: 0
MaxSoft: -1
BatchAction: Transform
InputFile:
OutputFile:
SEND:
StartAfter: 0
StopAfter: -1
SkipOver: False
ParentChild: 0
Pass: 0
PassOnce: True
Precedence: 0
RightToLeft: False

Criteria: 1
Selected: True
Highlight: True
Find: {AllText}
Replace: {@Evaluate:
            Text = Transform({AllText}, "precompile.uc")
            Text = Transform(Text, "refactor.uc")
            Text = Transform(Text, "implicit-dim.uc")
            Text = Transform(Text, "typespecifiers.uc")
            Text = Transform(Text, "implicit-convert.uc")
            Text = Transform(Text, "strings.uc")
            Text = Transform(Text, "filehandler.uc")
            Text = Transform(Text, "math.uc")
            Text = Transform(Text, "print.uc")
            Text = Transform(Text, "pb-to-cpp.uc")
            Text = Transform(Text, "beautify.uc")
            Text
         }

# End Search

# interactive.uc - uCalc Transformation file
# This file was saved with uCalc Transform 2.96 on 5/20/2014 9:37:36 AM
# Comment: Allows you to convert with a click of a button instead of a batch file

ExternalKeywords: Exclude, Comment, Selected, ParentChild, FindMode, InputFile, OutputFile, BatchAction, SEND
ExternalKeywords: Highlight, ForeColor, BackColor, FontName, FontSize, FontStyle
ExternalKeywords: FilterEndText, FilterSeparator, FilterSort, FilterSortFunc, FilterStartText, FilterUnique, FilterTally

FindMode: Replace

# Definitions

# Search Criteria

Criteria: 0
Enabled: True
Exclude: False
Comment: Allows you to convert with a click of a button instead of a batch file
Selected: False
Highlight: False
ForeColor: ControlText
BackColor: Aqua
FontName:
FontSize:
FontStyle:
CaseSensitive: False
QuoteSensitive: True
CodeBlockSensitive: True
FilterEndText:
FilterSeparator: {#10}
FilterSort: False
FilterSortFunc:
FilterStartText:
FilterUnique: False
FilterTally: False
Min: 0
Max: -1
MinSoft: 0
MaxSoft: -1
BatchAction: Transform
InputFile:
OutputFile:
SEND:
StartAfter: 0
StopAfter: -1
SkipOver: False
ParentChild: 0
Pass: 0
PassOnce: True
Precedence: 0
RightToLeft: False

Criteria: 1
Selected: True
Highlight: True
Find: {AllText}
Replace: {@Evaluate:
            Text = Transform({AllText}, "precompile.uc")
            Text = Transform(Text, "refactor.uc")
            Text = Transform(Text, "implicit-dim.uc")
            Text = Transform(Text, "typespecifiers.uc")
            Text = Transform(Text, "strings.uc")
            Text = Transform(Text, "filehandler.uc")
            Text = Transform(Text, "math.uc")
            Text = Transform(Text, "print.uc")
            Text = Transform(Text, "pb-to-cpp.uc")
            Text = Transform(Text, "beautify.uc")
            Text
         }

# End Search