Creating Looped Automatic Portals: Difference between revisions

From Valve Developer Community
Jump to navigation Jump to search
No edit summary
Tag: New redirect
 
Line 1: Line 1:
{{Back | Portal Level Creation}}
#REDIRECT [[Creating_An_Auto_Portal#Looped Automatic Portals]]
{{DISPLAYTITLE: Creating Looped Automatic Portals}}
{{toc-right}}
{{Tutorial Skill Level | skill=2}}
 
This tutorial will show step-by-step instructions on how to create '''linked portals''' similar to the ones seen in Test Chamber 01, in which the blue portals are seen switching on and off in a specific order. Following along with this tutorial will require some knowledge of how to use logic and math entities.
 
{{clr}}
 
==Construction==
===Step 1: Portal Frame===
[[Image:AutoPortals Step1.JPG|thumb|right|300px|The layout of the auto portal frames.]]
 
To start, select the [[Image: Hammer_entity.png | 30px]] entity tool, and create a [[prop_static]] for each portal you intend to have in your map. Set the model to "<code>models/props/autoportal_frame/autoportal_frame.mdl</code>" for each one.
The models should be placed and arranged at the locations the portals themselves will be.
 
{{clr}}
 
===Step 2: Creating the Portals===
[[Image:AutoPortals Step2.JPG|thumb|right|300px|Example of how the [[prop_portal]] should be positioned.]]
 
Next, create a [[prop_portal]] for each of your portals, one for your '''red portal''', and then any additional ones for your '''blue portals'''. For the sake of this tutorial, we will be creating 3 blue portals.
 
These ''prop_portals'' need to be positioned in the center of each portal frame, similar to the screenshot provided. They will also need to be rotated to be facing outward from the wall.
{{note| Rotating a ''prop_portal'' will make the portal look like it is in the same position in the Hammer Editor, you will have to rely on which direction the origin (yellow line in 2D view) is facing.}}
 
Name your red portal “''portal_red_0''”, and name the three blue portals “''portal_blue_0''”, “''portal_blue_1''”, and “''portal_blue_2''”. If you have extra auto portals in your map, you can increase the number in the name.
 
For the red portal, change its properties to the following settings:
{| class="standard-table sortable"
!  Property Name !! Value
|-
| Start Activated || Inactive
|-
| Portal Number || 2
|}
 
For the blue portals, change their properties to the following settings:
{| class="standard-table sortable"
!  Property Name !! Value
|-
| Start Activated || Inactive
|-
| Portal Number || 1
|}
 
{{clr}}
 
===Step 3: Creating the Logic Relays===
[[Image:AutoPortals Step3.JPG|thumb|right|300px|Diagram of how the [[logic_relay]]s will work.]]
 
In order to make our sequential auto portals work, we will be employing the use of several logic and math entities. The one we will begin with is [[logic_relay]].
 
To start, we are going to want to create four ''logic_relay'' entities for our blue portals:
*2 relays for the first blue portal. The '''first relay''' will be used to initialize the portal opening/closing sequence, while the '''second relay''' will open the first portal after the last portal has fizzled.
*1 relay for each of the remaining portals in the sequence.
 
For first portal’s initial relay, name it “<code>relay_blue_0_int</code>”, and give it the following I/O:
{| {{OutputsTable}}
| [[Image:Io11.png]] || OnTrigger || portal_blue_0 || SetActivatedState || 1 || 0.00 || No
|}
 
For the remaining relays, you will want to add an additional I/O to fizzle the previous blue portal as well. Name these relays “<code>relay_blue_1</code>”, “<code>relay_blue_2</code>”, and “<code>relay_blue_3</code>” respectively.
 
The I/Os for these should look like this:
 
'''<code>relay_blue_1</code>'''
{| {{OutputsTable}}
| [[Image:Io11.png]] || OnTrigger || portal_blue_1 || SetActivatedState || &nbsp; || 0.00 || No
|-
| [[Image:Io11.png]] || OnTrigger || portal_blue_0 || Fizzle || &nbsp; || 0.00 || No
|}
 
'''<code>relay_blue_2</code>'''
{| {{OutputsTable}}
| [[Image:Io11.png]] || OnTrigger || portal_blue_2 || SetActivatedState || &nbsp; || 0.00 || No
|-
| [[Image:Io11.png]] || OnTrigger || portal_blue_1 || Fizzle || &nbsp; || 0.00 || No
|}
 
'''<code>relay_blue_3</code>'''
{| {{OutputsTable}}
| [[Image:Io11.png]] || OnTrigger || portal_blue_0 || SetActivatedState || &nbsp; || 0.00 || No
|-
| [[Image:Io11.png]] || OnTrigger || portal_blue_2 || Fizzle || &nbsp; || 0.00 || No
|}
 
{{clr}}
 
===Step 4: Create the Logic_Case Entity===
[[Image:AutoPortals Step4.JPG|thumb|right|300px|The logic entities to be used.]]
 
Now that we have our relays set up, we can move onto adding the remaining logic entities we’ll need to make this work. The entities in question are:
*[[logic_timer]]
*[[logic_case]]
*[[math_counter]]
 
The first one we’ll create is the ''logic_case''. This entity will be responsible for triggering the relays on each portal. Create the ''logic_case'' entity, and give it the following parameters:
{| class="standard-table sortable"
!  Property Name !! Value
|-
| Name || case_spawn_portals
|-
| Case 01 || 1
|-
| Case 02 || 2
|-
| Case 03 || 3
|-
| Case 04 || 4
|}
 
Next, you will need to give it the following I/Os:
{| {{OutputsTable}}
| [[Image:Io11.png]] || OnCase01 || relay_blue_0_int || Trigger || &nbsp; || 0.00 || No
|-
| [[Image:Io11.png]] || OnCase02 || relay_blue_1 || Trigger || &nbsp; || 0.00 || No
|-
| [[Image:Io11.png]] || OnCase03 || relay_blue_3 || Trigger || &nbsp; || 0.00 || No
|-
| [[Image:Io11.png]] || OnCase04 || relay_blue_0 || Trigger || &nbsp; || 0.00 || No
|}
 
{{clr}}
 
===Step 5: Create the Logic_Timer Entity===
 
Next, we will make the ''logic_timer'' entity. Place one in your map, and give it the following parameters:
{| class="standard-table sortable"
!  Property Name !! Value
|-
| Name || portals_timer
|-
| Start Disabled || Yes
|-
| Use Random Time || No
|-
| Refire Interval || 5
|}
 
Then, give it the following I/O:
{| {{OutputsTable}}
| [[Image:Io12.png]] || OnTimer || portals_counter || Add || 1 || 0.00 || No
|}
 
{{clr}}
 
===Step 6: Create the Math_Counter Entity===
 
Finally, we add a ''math_counter'' entity, which will allow our setup cycle through the portals every time it has a value added to it (via the logic_timer).
 
Place one in your map, and give it the following parameters:
{| class="standard-table sortable"
!  Property Name !! Value
|-
| Name || portals_counter
|-
| Start Disabled || No
|-
| Initial Value || 0
|-
| Minimum Legal Value || 0
|-
| Maximum Legal Value || 5
|}
 
The reason we set the maximum value to five is to allow a looping point in the portal opening/closing sequence.
*A value of ''1'' triggers the initial relay for the first blue portal.
*A value of ''2'' triggers the relay for the second blue portal.
*A value of ''3'' triggers the relay for the third blue portal.
*A value of ''4'' trigger the second relay for the first blue portal.
*Finally, value of ''5'' triggers a self-reset of the counter, with the reset value being set to 2.
 
To sum up, you will want to set the “Maximum Legal Value” to how many relays you have set up, +1 to act as a looping point. This sequence will be kept running thanks to our ''logic_timer'' entity.
 
Add the following I/Os to the ''math_counter'' entity:
{| {{OutputsTable}}
| [[Image:Io11.png]] || OnHitMax || !self || SetValue || 2 || 0.00 || No
|-
| [[Image:Io11.png]] || OutValue || portals_case || InValue || &nbsp; || 0.00 || No
|}
 
{{clr}}
 
==Implementation==
Assuming that you have your auto-portals in their places (and have their entities set up), you can now make a trigger the player will walk into to start the sequence.
 
===Trigger the Auto-Portal Sequence===
[[Image:AutoPortals Step7.JPG|thumb|right|300px|The [[trigger_once]] that is used to activate the red portal and logic_timer.]]
 
Create a brush textured with <code>tools/toolstrigger</code>, and press {{key | Ctrl | T}} to turn it into a brush entity. Change this entity into a [[trigger_once]], and give it the following I/Os:
{| {{OutputsTable}}
| [[Image:Io11.png]] || OnStartTouch || portal_red_0 || SetActivatedState || 1 || 0.00 || No
|-
| [[Image:Io11.png]] || OnStartTouch || portals_timer || Enable || &nbsp; || 0.00 || No
|}
 
When the player walks into the trigger’s volume, it will activate the red portal first, then after 5 seconds, the blue portals will open and close in a looped sequence.
 
{{clr}}
 
===Fizzling the Auto-Portals===
Normally when you go through a cleanser field in-game, the portals you places with fizzle out. However, because of the particular way these auto portals are set up, walking through a a cleanser will not fizzle them. Because of this, we will need to create a workaround solution.
 
Fizzling the red portal is no issue, it can easily be fizzled on it’s own with a trigger brush. However, the blue portals will be more complicated, as simply making them fizzle with the aforementioned trigger with cause '''all''' of them to fizzle, regardless of whether they are active or not. The timer that runs the loop will also continue running if there isn’t something to disable it. To tackle the blue portals, we’ll need to employ the use of relays and [[logic_branch]]es..
 
[[Image:AutoPortals FizzleLogic.JPG|thumb|right|300px|The [[logic_branch]] and [[logic_relay]] used to manage the fizzling of a portal]]
 
To start, place a ''logic_branch'' near each of the blue portals you have placed down. Then, place an extra relay next to them as well. Name the branch entities "<code>branch_blue_0</code>", "<code>branch_blue_1</code>", and "<code>branch_blue_2</code>". Name the new relays "<code>relay_blue_0_fizzle</code>", "<code>relay_blue_1_fizzle</code>", and "<code>relay_blue_2_fizzle</code>".
*We will use the branch entities as a means of either enabling or disabling an accompanying relay.
 
For each portal’s branch, leave them with their default parameters, and give each of them I/Os similar to this:
{| {{OutputsTable}}
| [[Image:Io11.png]] || OnFalse || relay_blue_0_fizzle || Disable || &nbsp; || 0.00 || No
|-
| [[Image:Io11.png]] || OnTrue || relay_blue_0_fizzle || Enable || &nbsp; || 0.00 || No
|}
 
For the relays themselves, change the following parameter:
{| class="standard-table sortable"
!  Property Name !! Value
|-
| Start Disabled || Yes
|}
 
Then, add an I/O that looks similar to this to each of them:
{| {{OutputsTable}}
| [[Image:Io11.png]] || OnTrigger || portal_blue_0 || Fizzle || &nbsp; || 0.00 || No
|}
 
With this all set up, the you can now connect these relays to a trigger of your choosing. In this case, we’ll be connecting them to a [[trigger_portal_cleanser]].
 
To learn how to make a portal cleanser, go to [https://developer.valvesoftware.com/wiki/Creating_a_portal/object_fizzler this page] for more information.
 
Once you have created your portal cleanser, you’ll now be ready connect your relays and timer. To do this, insert the following I/Os into the ''trigger_portal_cleanser'':
{| {{OutputsTable}}
| [[Image:Io11.png]] || OnStartTouch || portal_red_1 || Fizzle || &nbsp; || 0.00 || Yes
|-
| [[Image:Io11.png]] || OnStartTouch || relay_blue_2_fizzle || Trigger || &nbsp; || 0.00 || Yes
|-
| [[Image:Io11.png]] || OnStartTouch || relay_blue_1_fizzle || Trigger || &nbsp; || 0.00 || Yes
|-
| [[Image:Io11.png]] || OnStartTouch || relay_blue_0_fizzle || Trigger || &nbsp; || 0.00 || Yes
|-
| [[Image:Io11.png]] || OnStartTouch || portals_timer || Disable || &nbsp; || 0.00 || Yes
|}
 
With this all added, your auto-portals should now fizzle out properly, depending on which ones are open and which ones are closed.
 
{{clr}}
 
== See Also ==
 
* [[Creating An Auto Portal | Automatic Portals]]
 
* [[Portal Level Creation]]
 
[[Category:Portal]]
[[Category:Level Design]]
[[Category:Level Design Tutorials]]
[[Category:Tutorials]]

Latest revision as of 15:45, 1 June 2022