public function output()
 {
     $codeLines = [];
     $localScope = [];
     foreach ($this->localScope->getLocalVariables() as $localVariable) {
         $localScope[] = $localVariable->getPropertyType()->output() . ' ' . $localVariable->getPropertyName();
     }
     $localScope = '(' . implode(', ', $localScope) . ')';
     $codeLines[] = "Event " . $this->blockType . $localScope;
     $codeLines = array_merge($codeLines, $this->codeScope->output());
     $codeLines[] = "EndEvent";
     return $codeLines;
 }
 public function output()
 {
     $codeLines = [];
     $localScope = [];
     foreach ($this->localScope->getLocalVariables() as $localVariable) {
         $localScope[] = $localVariable->getPropertyType()->output() . ' ' . $localVariable->getPropertyName();
     }
     $localScope = '(' . implode(', ', $localScope) . ')';
     $functionReturnType = $this->returnType !== null ? $this->returnType->value() . ' ' : "";
     $codeLines[] = $functionReturnType . "Function " . $this->functionName . $localScope;
     $codeLines = array_merge($codeLines, $this->codeScope->output());
     $codeLines[] = "EndFunction";
     return $codeLines;
 }
 public function createFromFragmentType(TES5FragmentType $fragmentType)
 {
     $localScope = new TES5LocalScope();
     switch ($fragmentType) {
         case TES5FragmentType::T_TIF():
             $localScope->addVariable(new TES5LocalVariable("akSpeakerRef", TES5BasicType::T_OBJECTREFERENCE(), [TES5LocalVariableParameterMeaning::ACTIVATOR()]));
             break;
         case TES5FragmentType::T_PF():
             $localScope->addVariable(new TES5LocalVariable("akActor", TES5BasicType::T_ACTOR(), [TES5LocalVariableParameterMeaning::ACTIVATOR()]));
             break;
         case TES5FragmentType::T_QF():
             break;
     }
     return $localScope;
 }
 public function findVariableWithMeaning(TES5LocalVariableParameterMeaning $meaning)
 {
     return $this->localScope->findVariableWithMeaning($meaning);
 }
 public function createNewBlock($blockType, TES5LocalScope $localScope = null)
 {
     if ($localScope === null) {
         $localScope = new TES5LocalScope();
     } else {
         if ($localScope->getParentScope() !== null) {
             throw new ConversionException("TES5BlockFactory::createNewBlock - Local scope created must be the root, cannot be nested.");
         }
     }
     $newBlock = new TES5EventCodeBlock($blockType, $localScope, $this->codeScopeFactory->createCodeScope($this->blockLocalScopeFactory->createRecursiveScope($localScope)));
     return $newBlock;
 }
 public function createFromBlockType($blockType, TES5GlobalScope $globalScope)
 {
     $localScope = new TES5LocalScope();
     switch ($blockType) {
         case 'OnUpdate':
             break;
         case 'OnActivate':
             $localScope->addVariable(new TES5LocalVariable("akActivateRef", TES5BasicType::T_OBJECTREFERENCE(), [TES5LocalVariableParameterMeaning::ACTIVATOR()]));
             break;
         case 'OnInit':
             break;
         case 'OnSell':
             $localScope->addVariable(new TES5LocalVariable("akSeller", TES5BasicType::T_ACTOR(), [TES5LocalVariableParameterMeaning::ACTIVATOR()]));
             break;
         case 'OnDeath':
             $localScope->addVariable(new TES5LocalVariable("akKiller", TES5BasicType::T_ACTOR(), [TES5LocalVariableParameterMeaning::ACTIVATOR()]));
             break;
         case 'OnLoad':
             break;
         case 'OnObjectEquipped':
             $localScope->addVariable(new TES5LocalVariable("akBaseObject", TES5BasicType::T_FORM(), [TES5LocalVariableParameterMeaning::CONTAINER()]));
             $localScope->addVariable(new TES5LocalVariable("akReference", TES5BasicType::T_OBJECTREFERENCE()));
             break;
         case 'OnTriggerEnter':
             $localScope->addVariable(new TES5LocalVariable("akActivateRef", TES5BasicType::T_OBJECTREFERENCE(), [TES5LocalVariableParameterMeaning::ACTIVATOR(), TES5LocalVariableParameterMeaning::CONTAINER()]));
             break;
         case 'OnEquipped':
             $localScope->addVariable(new TES5LocalVariable("akActor", TES5BasicType::T_ACTOR(), [TES5LocalVariableParameterMeaning::ACTIVATOR(), TES5LocalVariableParameterMeaning::CONTAINER()]));
             break;
         case 'OnUnequipped':
             $localScope->addVariable(new TES5LocalVariable("akActor", TES5BasicType::T_ACTOR(), [TES5LocalVariableParameterMeaning::ACTIVATOR()]));
             break;
         case 'OnContainerChanged':
             $localScope->addVariable(new TES5LocalVariable("akNewContainer", TES5BasicType::T_OBJECTREFERENCE()));
             $localScope->addVariable(new TES5LocalVariable("akOldContainer", TES5BasicType::T_OBJECTREFERENCE()));
             break;
         case 'OnTrigger':
             $localScope->addVariable(new TES5LocalVariable("akActivateRef", TES5BasicType::T_OBJECTREFERENCE(), [TES5LocalVariableParameterMeaning::ACTIVATOR()]));
             break;
         case 'OnHit':
             $localScope->addVariable(new TES5LocalVariable("akAggressor", TES5BasicType::T_OBJECTREFERENCE(), [TES5LocalVariableParameterMeaning::ACTIVATOR()]));
             $localScope->addVariable(new TES5LocalVariable("akSource", TES5BasicType::T_FORM()));
             $localScope->addVariable(new TES5LocalVariable("akProjectile", TES5BasicType::T_PROJECTILE()));
             $localScope->addVariable(new TES5LocalVariable("abPowerAttack", TES5BasicType::T_BOOL()));
             $localScope->addVariable(new TES5LocalVariable("abSneakAttack", TES5BasicType::T_BOOL()));
             $localScope->addVariable(new TES5LocalVariable("abBashAttack", TES5BasicType::T_BOOL()));
             $localScope->addVariable(new TES5LocalVariable("abHitBlocked", TES5BasicType::T_BOOL()));
             break;
         case 'OnCombatStateChanged':
             $localScope->addVariable(new TES5LocalVariable("akTarget", TES5BasicType::T_ACTOR(), [TES5LocalVariableParameterMeaning::ACTIVATOR()]));
             $localScope->addVariable(new TES5LocalVariable("aeCombatState", TES5BasicType::T_INT()));
             break;
         case 'OnPackageStart':
             $localScope->addVariable(new TES5LocalVariable("akNewPackage", TES5BasicType::T_PACKAGE()));
             break;
         case 'OnPackageDone':
             $localScope->addVariable(new TES5LocalVariable("akDonePackage", TES5BasicType::T_PACKAGE()));
             break;
         case 'OnPackageEnd':
             $localScope->addVariable(new TES5LocalVariable("akOldPackage", TES5BasicType::T_PACKAGE()));
             break;
         case 'OnPackageChange':
             $localScope->addVariable(new TES5LocalVariable("akOldPackage", TES5BasicType::T_PACKAGE()));
             break;
         case 'OnMagicEffectApply':
             $localScope->addVariable(new TES5LocalVariable("akCaster", TES5BasicType::T_OBJECTREFERENCE(), [TES5LocalVariableParameterMeaning::ACTIVATOR()]));
             $localScope->addVariable(new TES5LocalVariable("akMagicEffect", TES5BasicType::T_MAGICEFFECT()));
             break;
         case 'OnReset':
             break;
         case 'OnEffectStart':
             $localScope->addVariable(new TES5LocalVariable("akTarget", TES5BasicType::T_ACTOR()));
             $localScope->addVariable(new TES5LocalVariable("akCaster", TES5BasicType::T_ACTOR(), [TES5LocalVariableParameterMeaning::ACTIVATOR()]));
             break;
         case 'OnEffectFinish':
             $localScope->addVariable(new TES5LocalVariable("akTarget", TES5BasicType::T_ACTOR()));
             $localScope->addVariable(new TES5LocalVariable("akCaster", TES5BasicType::T_ACTOR(), [TES5LocalVariableParameterMeaning::ACTIVATOR()]));
             break;
         default:
             throw new ConversionException("Cannot find new block type local scope variables out of " . $blockType);
     }
     return $localScope;
 }