Live a week in the life of "The Postal Dude"; a hapless everyman just trying to check off some chores. Buying milk, returning an overdue library book, getting Gary Coleman's autograph, what could possibly go wrong? Blast, chop and piss your way through a freakshow of American caricatures in this darkly humorous first-person adventure. Meet Krotchy: the toy mascot gone bad, visit your Uncle Dave at his besieged religious cult compound and battle sewer-dwelling Taliban when you least expect them! Endure the sphincter-clenching challenge of cannibal rednecks, corrupt cops and berserker elephants. Accompanied by Champ, the Dude's semi-loyal pitbull, battle your way through open environments populated with amazingly unpredictable AI. Utilize an arsenal of weapons ranging from a humble shovel to a uniquely hilarious rocket launcher. Collect a pack of attack dogs! Use cats as silencers! Piss and pour gasoline on anything and everyone! YOU KNOW YOU WANT TO!

Post tutorial Report RSS Coding Tutorial 9: Making New Days and Errands

Tutorials using Unreal Script specific to POSTAL 2.

Posted by on - Advanced Client Side Coding

Tutorial originally released on Running With Scissor's Postal website. Was taken down more than 10 years ago. Mirrored here for archival purposes.

Making New Days and Errands

Code Tutorial 9

You must be running the new Share the Pain version of POSTAL 2 for any of this to be relevant. Using these tutorials with older code may cause you problems.

These tutorials are to be completed in succession with one another. If you jump ahead to a later tutorial, I will be discussing things from earlier tutorials that you may not recognize. Following each one in order should greatly improve your learning experience.

Well after finishing the proper way to hook our new expansion into the real game we need to… actually make a game! Right now, in MegaGameSP, you should have all the default properties from GamePlayerSingle.uc. That means lots and lots of things about all the days of the week and all the errands to be completed and all the goals for each errand.

What we’ll do here is to make an alternate Monday to play. If we pop open MegaGameSP.uc and look at the default properties at the very bottom, we should see something like this:

          //////////////////////////////////////////////////////////////////////
          //////////////////////////////////////////////////////////////////////
          // the week is defined here
          //////////////////////////////////////////////////////////////////////
          //////////////////////////////////////////////////////////////////////

          Days(0)=DayBase'DayBase0'
          Days(1)=DayBase'DayBase1'
          Days(2)=DayBase'DayBase2'
          Days(3)=DayBase'DayBase3'
          Days(4)=DayBase'DayBase4'

That’s the whole single player. That’s it! Of course, not really, but that’s the beginning. The name isn’t specified there. It’s specified above in text and in a texture as that day loads. That part you’ll have to do at home if you want to make a different day. We’re going to stick with Monday in our example.

Above, Monday is DayBase0. If we scroll up in the def props in MegaGameSP and look for the definition of that class we should see this:

            // Monday
            Begin Object Class=DayBase Name=DayBase0
                        Description="Monday"
                        UniqueName="DAY_A"
                        ExcludeDays[0]="DEMO"
                        Errands(0)=ErrandBase'ErrandBase0'
                        Errands(1)=ErrandBase'ErrandBase1'
                        Errands(2)=ErrandBase'ErrandBase2'
                        MapTex="p2misc_full.map_day1"
                        NewsTex="p2misc.newspaper_day_1"
                        DudeNewsComment="DudeDialog.dude_news_monday"
                        LoadTex="p2misc_full.loading1"
                        DudeStartComment="DudeDialog.dude_map_exit1"

                        PlayerInvList(0)=(InvClassName="Inventory.MoneyInv",NeededAmount=20)
                        PlayerInvList(1)=(InvClassName="Inventory.MapInv")
                        PlayerInvList(2)=(InvClassName="Inventory.HandsWeapon")
                        PlayerInvList(3)=(InvClassName="Inventory.CopClothesInv",bEnhancedOnly=true)
 
                        TakeFromPlayerList(0)=(InvClassName="Inventory.NewspaperInv")
                        TakeFromPlayerList(1)=(InvClassName="Inventory.GimpClothesInv")
                        TakeFromPlayerList(2)=(InvClassName="Inventory.DudeClothesInv")
                        TakeFromPlayerList(3)=(InvClassName="Inventory.MilkInv")
                        TakeFromPlayerList(4)=(InvClassName="Inventory.PaycheckInv")
            End Object

Okay, that’s definitely a lot more. That’s the beginning of Monday. Let’s look at some of the parts of it. UniqueName="DAY_A" means that things that this is known to game objects as day ‘A’, not day 1 or Monday. If an object in the game has Day_A in it’s object group, it will be included on that day for sure. Pop open a level and click on some pickups or pawns and look at their group names to see examples.

ExcludeDays[0]="DEMO" means that this day excludes anything with Demo in it’s group. If you look at the class GameSinglePlayerDemo, you’ll see that all the days there exclude other days like Day_A.

The errands are the core of the day. Errands(0)=ErrandBase'ErrandBase0' means that ErrandBase0 is the first errand for Monday. We’ll look that one in a minute in detail. We can see from the array that there are only three errands on Monday. Look at the other days for more examples.

MapTex, NewsTex, and LoadTex are all the textures to be used for the map, the newspaper pickup, and the load screen, respectively. The comments go with those also.

PlayerInvList are things the player gets at the start of that day. Those things are forced into the player’s inventory at that day start. It should make sense, as you can see that the player’s hands go in, the map that you use through the whole game, and 20 bucks.

There’s also a ‘secret’ addition at the end, which means that if your playing in Enhanced mode, you get the cop clothes on Monday.

Finally, TakeFromPlayerList, is the opposite. This makes sure to remove those items listed when you start this day. As you can see in each day, it makes sure to remove the newspaper from the previous day from your inventory, for example.

Let’s now look at the first errand to be completed in the retail version of POSTAL 2.

Scroll up some more in MegaGameSP to see this:

            //////////////////////////////////////////////////////////////////////
            //////////////////////////////////////////////////////////////////////
            // Monday errands
            //////////////////////////////////////////////////////////////////////
            //////////////////////////////////////////////////////////////////////
 
            // Get Paycheck
            Begin Object Class=ErrandGoalGetPickup Name=ErrandGoalGetPickup0
                        PickupTag="PaycheckPickup"
                        TriggerOnCompletionTag="PaycheckErrand_ProtestorsAttack"
                        HateClass="RWSProtestors"
                        HateDesTex="p2misc.map.Hate_Group1Name"
                        HatePicTex="p2misc.map.Hate_Group1Pic"
                        HateComment="DudeDialog.dude_map_hate1"
            End Object
            Begin Object Class=ErrandBase Name=ErrandBase0
                        UniqueName="GetPaycheck"
                        NameTex="p2misc.map.PickupCheck_text"
                        LocationTex="p2misc.map.PickupCheck_here"
                        LocationX=621
                        LocationY=246
                        LocationCrossTex="p2misc.map.hint_cross_1"
                        LocationCrossX=674
                        LocationCrossY=252
                        DudeStartComment="DudeDialog.dude_map_getcheck"
                        DudeWhereComment="DudeDialog.Dude_map_foundrws"  // sounds better before writing location on map
                        //DudeFoundComment=
                        DudeCompletedComment="DudeDialog.dude_map_anddone"
                        Goals(0)=ErrandGoalGetPickup'ErrandGoalGetPickup0'
            End Object

Ahh... now we’re getting somewhere. That specifically lists what needs to be done to complete the errand. This is the simplest type of errand. It has one Goal. At the top you should see the goals necessary to complete the errand. Here we have one: ErrandGoalGetPickup0. The ‘0’ at the end means that’s the specific version of that class. There are multiple ErrandGoalGetPickup’s in the whole game. Do a search to see.

Inside that goal we see that it’s looking for a pickup with the tag “PaycheckPickup”. The paycheck pickup happens to be tagged that. TriggerOnCompletionTag means that all actors with this tag are triggered. So more than likely a movie is started or enemies are spawned. HateClass means that the RWSProtestors now hate you on site and will get marked on your map at the end of the level. The rest of the Hate variables relate to that. Not all errands trigger hate groups, as you should be able to see when you scroll down.

That was the goal. Now we see the Errand it’s placed inside: ErrandBase0. Here we see that the name of this errand is “GetPaycheck”—this name must be unique for all errands in your game type in case script or level designers need to refer to it. Next are all the variables to place the texture for ‘Get Paycheck’ on the little yellow sticky in the lower left of the map screen. That’s the NameTex and all those Location variables. The following Comment variables are all things the dude says as he finds the errand on the map and then completes it later on. The important part at the end is placing the Goal from above in the goal array like this:

Goals(0)=ErrandGoalGetPickup'ErrandGoalGetPickup0'

Otherwise, the errand wouldn’t know about the goal to be completed.

That’s ‘Get your paycheck’ for Monday. If we scroll down just a little to see ‘Cash Paycheck’ we should see some differences.

            // Cash Paycheck
            Begin Object Class=ErrandGoalGiveInventory Name=ErrandGoalGiveInventory1
                        InvClassName="PaycheckInv"
                        GiveToMeTag="jenny"
                        TriggerOnCompletionTag="BankErrand_RobbersShowUp"
            End Object
            Begin Object Class=ErrandGoalGetPickup Name=ErrandGoalGetPickup3
                        PickupTag="BankDeposit"
                        TriggerOnCompletionTag="BankErrand_CopsShowUp"
            End Object
            Begin Object Class=ErrandBase Name=ErrandBase1
                        UniqueName="CashPaycheck"
                        NameTex="p2misc.map.CashCheck_text"
                        LocationTex="p2misc.map.CashCheck_here"
                        LocationX=523
                        LocationY=560
                        LocationCrossTex="p2misc.map.hint_cross_2"
                        LocationCrossX=580
                        LocationCrossY=588
                        DudeStartComment="DudeDialog.dude_map_cashcheck"
                        DudeWhereComment="DudeDialog.Dude_map_loc2"
                        DudeFoundComment="DudeDialog.Dude_map_found3"
                        DudeCompletedComment="DudeDialog.dude_map_missionaccom"
                        Goals(0)=ErrandGoalGiveInventory'ErrandGoalGiveInventory1'
                        Goals(1)=ErrandGoalGetPickup'ErrandGoalGetPickup3'
            End Object

This one has two goals. That’s the biggest difference. You can give the Paycheck to ‘Jenny’ the teller (the pawn’s tag must be jenny) or you could just get the pickup with the tag ‘BankDeposit’ (steal the money). Each goal triggers a different movie/event.

The rest looks pretty standard, but again, there’s no Hate groups triggered this time. And at the bottom both goals are put into the Goals array.

Making A New (tiny) Game

Ready to make a new game? Okay… that’s pretty misleading… but you will make a different game type separate from the original—it’ll just share all the assets of the original so it won’t feel completely new.

What we’ll do is basically make MegaGameSP be a POSTAL 2 game with only one errand and one day.

We start in MegaGameSP by changing the inheritance of the class. You extended it originally from GamePlayerSingle because you wanted all of its code and days. Since we’re making our own, we need to go back to its grandparent, P2GameInfoSingle. Change the extend line from this:

class MegaGameSP extends GamePlayerSingle;

to this:

class MegaGameSP extends P2GameInfoSingle;

Yeah, it may seem like we’re going backwards, but actually it’s opening up new possibilities for you.

Now, in the default properties let’s cut out everything except for the Paycheck goal and errand, the Monday day and the code at the bottom concerning the weeks and below. You should be left with this:

defaultproperties
                {
                //////////////////////////////////////////////////////////////////////
                //////////////////////////////////////////////////////////////////////
                // Monday errands
                //////////////////////////////////////////////////////////////////////
                //////////////////////////////////////////////////////////////////////
 
                // Get Paycheck
                Begin Object Class=ErrandGoalGetPickup Name=ErrandGoalGetPickup0
                                PickupTag="PaycheckPickup"
                                TriggerOnCompletionTag="PaycheckErrand_ProtestorsAttack"
                                HateClass="RWSProtestors"
                                HateDesTex="p2misc.map.Hate_Group1Name"
                                HatePicTex="p2misc.map.Hate_Group1Pic"
                                HateComment="DudeDialog.dude_map_hate1"
                End Object
                Begin Object Class=ErrandBase Name=ErrandBase0
                                UniqueName="GetPaycheck"
                                NameTex="p2misc.map.PickupCheck_text"
                                LocationTex="p2misc.map.PickupCheck_here"
                                LocationX=621
                                LocationY=246
                                LocationCrossTex="p2misc.map.hint_cross_1"
                                LocationCrossX=674
                                LocationCrossY=252
                                DudeStartComment="DudeDialog.dude_map_getcheck"
                                DudeWhereComment="DudeDialog.Dude_map_foundrws"   // sounds better before writing location on map
                                //DudeFoundComment=
                                DudeCompletedComment="DudeDialog.dude_map_anddone"
                                Goals(0)=ErrandGoalGetPickup'ErrandGoalGetPickup0'
                End Object
 
                //////////////////////////////////////////////////////////////////////
                //////////////////////////////////////////////////////////////////////
                // Days are defined here
                //////////////////////////////////////////////////////////////////////
                //////////////////////////////////////////////////////////////////////
 
                // Monday
                Begin Object Class=DayBase Name=DayBase0
                                Description="Monday"
                                UniqueName="DAY_A"
                                ExcludeDays[0]="DEMO"
                               
                                Errands(0)=ErrandBase'ErrandBase0'
                                Errands(1)=ErrandBase'ErrandBase1'
                                Errands(2)=ErrandBase'ErrandBase2'
                                MapTex="p2misc_full.map_day1"
                                NewsTex="p2misc.newspaper_day_1"
                                DudeNewsComment="DudeDialog.dude_news_monday"
                                LoadTex="p2misc_full.loading1"
                                DudeStartComment="DudeDialog.dude_map_exit1"
 
                                PlayerInvList(0)=(InvClassName="Inventory.MoneyInv",NeededAmount=20)
                                PlayerInvList(1)=(InvClassName="Inventory.MapInv")
                                PlayerInvList(2)=(InvClassName="Inventory.HandsWeapon")
                                PlayerInvList(3)=(InvClassName="Inventory.CopClothesInv",bEnhancedOnly=true)
 
                                TakeFromPlayerList(0)=(InvClassName="Inventory.NewspaperInv")
                                TakeFromPlayerList(1)=(InvClassName="Inventory.GimpClothesInv")
                                TakeFromPlayerList(2)=(InvClassName="Inventory.DudeClothesInv")
                                TakeFromPlayerList(3)=(InvClassName="Inventory.MilkInv")
                                TakeFromPlayerList(4)=(InvClassName="Inventory.PaycheckInv")
                End Object
 
                //////////////////////////////////////////////////////////////////////
                //////////////////////////////////////////////////////////////////////
                // the week is defined here
                //////////////////////////////////////////////////////////////////////
                //////////////////////////////////////////////////////////////////////
 
                Days(0)=DayBase'DayBase0'
                Days(1)=DayBase'DayBase1'
                Days(2)=DayBase'DayBase2'
                Days(3)=DayBase'DayBase3'
                Days(4)=DayBase'DayBase4'
 
                AutoAim=0.930000
                GameSpeed=1.000000
                MaxSpectators=2
                DefaultPlayerName="TheDude"
                GameName="Postal2 Single Player"
                PlayerControllerClassName="GameTypes.DudePlayer"
                IntroURL                                  = "Intro.fuk"
                StartFirstDayURL                    = "Suburbs-3.fuk"
                StartNextDayURL                    = "Suburbs-3.fuk"
                FinishedDayURL                      = "HomeAtNight.fuk"
                JailURL                                     = "Police.fuk#cell"
                //"Police.fuk#cell"
                //"jailtest.fuk#cell"
                }
 

We have a few more things to cut out. In Monday, cut out the following in bold.

                                Errands(0)=ErrandBase'ErrandBase0'
                                Errands(1)=ErrandBase'ErrandBase1'
                                Errands(2)=ErrandBase'ErrandBase2'
                                MapTex="p2misc_full.map_day1"

So we’ll keep the first errand but not the last two, right? Good. Next, at the bottom, we need to remove the other days.

                Days(0)=DayBase'DayBase0'
                Days(1)=DayBase'DayBase1'
                Days(2)=DayBase'DayBase2'
                Days(3)=DayBase'DayBase3'
                Days(4)=DayBase'DayBase4'
                AutoAim=0.930000

So you’re only keeping the first day. If we had not changed the inheritance from GameSinglePlayer back to P2GameInfoSingle, then our new game would have inherited all the days specified in GameSinglePlayer. This means that even if we had deleted them out of the default props in MegaGameSP they still would have carried over from the old class. This would have made our game not complete after one day like we’d want here. Now we can simply specify the exact number of days as we please.

Below that are some URLs. For the moment we need to change those around for you test levels. Change them as follows to match your test level:

                IntroURL                                  = "testbox.fuk"
                StartFirstDayURL                    = "testbox.fuk"
                StartNextDayURL                    = "testbox.fuk"
                FinishedDayURL                      = "HomeAtNight.fuk"
                JailURL                                     = "Police.fuk#cell"
 

What’s happening here we’ve directed everything to your test box. That’s not going to work completely correctly, but it’s good for a start.

In NewMenuStart we actually skipped IntroURL and went straight to StartFirstDayURL. That’s just for simplicities sake. In POSTAL 2, the intro level is opened, and a movie is played. In that first map, his is map is brought out and his errands are written down. Next, StartFirstDayURL is loaded. His map goes away and he starts Monday. After he completes Monday StartNextDayURL is loaded. When that is started however, he brings his map up in a movie at the beginning of a day. All of this is driven through the levels and ScriptedTriggers in those levels. That’s related to this but separate from the code. The best way to understand it is to look at what actually gets used in the levels in the game in Intro.fuk and Suburbs-3.fuk.

For us, by cutting out the code we listed above, we should be able to grab a paycheck in our test level; he’ll mark it off and say he needs to go home. Next, we’ll exit the level and the game will be over! Well… sort of… we’ll see.

Now it’s time to open PostEd to edit some levels.

You need a separate level from your test box. It can be as crappy and box-like as your test box, but should have different textures on the walls or something so you know it when you enter it. Call it ‘testmovies.fuk’. Build and save the level.

Now open your test level ‘testbox.fuk’ and place a PaycheckPickup somewhere to be grabbed by you. Next, place a Telepad object in the level, close to a pathnode. It will complain otherwise when you build the level. You need to link this telepad to your movie level. Open the attributes window for the Telepad. Under Teleporter change the URL to ‘testmovies#peer’ (without the single quotes). A good trick with hidden object like a Telepad is to set it to be visible while your testing it. Under Advanced(in telepad) set bHidden to false. Build and save the level.

Now that we have our test level hooked up to our movie level, we need to tell the game info about it. Go back to MegaGameSP. Near the bottom in the default properties, change this:

FinishedDayURL= "HomeAtNight.fuk"

To this

FinishedDayURL= "testmovies.fuk"

That will ensure that when you complete a day, you’ll head to your new level and not the original.

First Pass

We’re now ready to play our new game! But will it finish? Probably not… but it’s close.

Save and build SuperPack.u.

Start the game and select your new game type ‘Super Pack’. Enter the game and check your map. You should only see one errand on the map now!

Next, collect the paycheck pickup you placed in the level. The dude should mark it off the list and then say he needs to go home for the day. Walk to the telepad to complete the day. The map should pop and he will mark off the RWS Protestors as a hate group. Now the level will change and—you beat your game! Unfortunately we don’t have any of the movies or the decisions in the movies to complete it correctly.

How do we fix this? We need to make the game end properly. Let’s look at how POSTAL 2 ends to see what to do next.

Ending Days in POSTAL 2

If we look at the level HomeAtNight.fuk in the editor we should see all the logic that changes days and completes the game. Let’s open that now in the editor. ‘TestMovies.fuk’ is our equivalent level for testing.

This level actually handles all the logic on picking days and ending the game. Well.. it helps the game finish, at least. Do a search on an actor with the Tag ‘PickMovie’. You should end up with a ScriptedTrigger actor. PickMovie is actually triggered by the PlayerStart. If you look at the Event in the Playerstart, it should be PickMovie. The player spawning into this level starts the chain of events. Looking at the attributes in the PickMovie scripted trigger. Under the heading AIScript, you’ll see all the instructions this executes. The psuedo code of those instructions flows like this:

          Is it Day_E? (Friday, the last day in the game)
                   If so, trigger the EndOfGame movie
                   If not, trigger the PickDayMovie scripted trigger

EndOfGame is the tag of a movie that plays the last movie in the game. That shows the infamous ‘who shot who scene’ from outside the trailer home, and then rolls the credits. After you watch this movie, the end of the movie triggers another scripted trigger with the tag DoStatsScreen. Inside there, it calls an action ‘EndOfGame’ in the game info. You can pop open MoreGame\Classes\ACTION_EndOfGame.uc to see what happens. Basically it just calls the game info function EndOfGame to get things rolling. Let’s open Postal2Game\Classes\P2GameInfoSingle.uc to see what it does.

Essentially that saves that you beat the game, marks that you want to watch the stats, then prepares to send you back to the main menu, but shows you the stats first. You are then plopped back in the main menu. And yes, it evaluates along the way if you get enhanced mode (you can only have it you beat it on a difficult of Average or harder).

That’s how the game finishes, but let’s backtrack to see how it changes between days. Before in the PickMovie scripted trigger, if it’s not Friday, then it goes to another scripted trigger with the tag PickDayMovie. The psuedo code in there is pretty obvious and runs something like this:

          If its Day_A (Monday) then
                   Play Day1Movie
          end
          If its Day_B (Tuesday) then
                   Play Day2Movie
          end
          If its Day_C (Wednesday) then
                   Play Day3Movie
          end
          If its Day_D (Thursday) then
                   Play Day4Movie
          end
 

Looking at Day1Movie we see it plays the movie of the wife asking how work went. The NextSceneTag is set to NextDay. NextDay is the tag of a scripted trigger. If you open that one up, you’ll see it’s only action is to send the player to start the next day! Done!

How to End Our Game

We’re getting to the point that it leaves strict coding and ends up being how do you want your game to finish? Most of the entertainment here is provided through the movies. I will show you how to complete your game, show the stats, and head it back to the main menu. That technically will complete the game. You’ll need to add all the movie magic and flourishes as you wish.

We’ll be recreating the scripted trigger with the tag DoStatsScreen. It’s not always safe to copy and paste a scripted trigger, so we won’t use that here.

Open your movie level ‘testmovies.fuk’.

Place a new scripted trigger around your player start (just to make it easier to work with).

Scripted triggers are under KeyPoint::AIScript::ScriptedSequence.

Open the Events tab and set the Tag to DoStatsScreen.

Under the AIScript tab, create a new Action. (Click Add). Under it, select ACTION_EndOfGame. (Then click New.)

You’re finished with triggering the end of the game. Now you just need to link it in.

Select the PlayerStart actor. Under the Events tab set the Event to DoStatsScreen. (NOT the Tag, of course, that should stay PlayerStart).

That’s about it. Save the level.

Now, let’s run the game again, grab the pickup and exit the level to complete the game to see what happens.

Coooool! The stat screen comes up and the game ends! (You probably got the Jesus rating if you didn’t kill or piss). But right before it switches back to the main menu it shows the level you were just in… kinda ugly hmmm… well I’m not going to walk you through it, but here’s how we solved it in POSTAL 2. The last bit is actually a movie that fades to black. The movie is in a black hallway (you can see it in HomeAtNight.fuk). When the stats screen disappears and shows the level again, the level is just black it looks fine. You may want to do a similar thing.

So wait… are we really done? Did we just set up a separate game, complete with it’s own day, and it’s own errand? Yes! The only thing you may be wondering about is how to make all the other days and errands. Well I will say it takes lots of art to make them look good.

If you want a completely new errand, you’ll probably need a new pickup to grab or give or something. I’ve shown you in a previous tutorial how to make a new pickup.

Next, you need to make new art for the map screen to write the errands on the yellow notepad. Carefully mimic the original art in the P2Misc.utx package and it should be a piece of cake. You can reuse days like Monday through Friday or make a new loading screen for a new day. But you’ll have to add that in to your gameinfo’s default properties if you do. The middle movies between days rely heavily upon dialogue, but maybe you could script the dude through a movie (as he’s done in HomeAtNight, for reference) to do something funny and then just load the next day. I’ve walked you through how to make the game end. I’ve also explained how the next day is picked so between those two, you should be able to switch days pretty easily. Take tiny steps making sure everything works along the way to avoid frustration.

What about the errand goals themselves? Well they really are the meat of the game. But if you think about it, there’s only 4 real goals:

Get a pickup

Give a pickup to some one or some thing

Piss on something

Kill someone

Ahhhh….what a nice game… but seriously all the errands in MoreGame are based off this. Look at the names and study them to see how to use them. Look at the examples in GameSinglePlayer for your best bet.

Otherwise, you’re ready to rock! It’s all about you, your ideas, and… well... some art. From a magical friend that’s really good at art. Guess you better find him. I might write some more tutorials after this… we’ll see.

Wrapping Up

It’s nice to celebrate, you have just a little more work to do, if you want this game to be able to be run from the command line. Because we’ve changed the IntroURL to the testbox.fuk that we’re playing, you won’t be able to have the Postal2.ini specify the game type, MegaGameSP. Yeah, that was a mouthful. Let’s try again. Remember how you used to be able to say ‘postal2 testbox.fuk’ on the command line to run your level and bypass the start up menu? It’s great for testing! I know. But because we’ve changed the IntroURL in our MegaGameSP, now it won’t work. You’ll probably be stuck in place and unable to move. The way to fix that is simple.

Open the PostEd editor and open up your testbox.fuk. Save it as a new file ‘testintro.fuk’. You might want to change the wall textures again just to distinguish it.

Next, open MegaGameSP.uc. Scroll down to the bottom and change IntroURL to testintro.fuk to reflect our changes.

                IntroURL                                  = "testintro.fuk"
                StartFirstDayURL                    = "testbox.fuk"
                StartNextDayURL                    = "testbox.fuk"

NOW your ready to test! You should be able to access your game through the intro menu and through the command line like before.

Enjoy!
Nathan Fouts

Post a comment
Sign in or join with:

Only registered members can share their thoughts. So come on! Join the community today (totally free - or sign in with your social account on the right) and join in the conversation.

Follow Report Profile
Icon
POSTAL 2
Platforms
Windows, Mac, Linux
Developer & Publisher
Running With Scissors
Contact
Send Message
Release date
Game watch
Follow
Purchase
Tutorial
Browse
Tutorials
Report
Report
Views
16 (1 today)
Share
Related Games
POSTAL 2
POSTAL 2 First Person Shooter
Related Engines
Unreal Engine 2
Unreal Engine 2 Commercial
Related Groups
Running With Scissors
Running With Scissors Developer & Publisher