+++---===---===---===---+++
  Old Skool Monsta Toolz
     Version: 1.4
+++---===---===---===---+++

The "Old Skool" monster toolset for Unreal Tournament 2004 by Glenn "SuperApe" Storm.
(see full credits below)

+=====================+
 Contents
+=====================+

  I.	Introduction
 II.	Tool Set
III.	Monster Manual
 IV.	Mapper Guide
  V.	Credits
 VI.	Legal


+=====================+
 Introduction
+=====================+

This is a package that includes a full toolset for mappers to implement Old Skool-style Unreal Monsters in maps.  In early versions of Unreal, the Monsters were a subclass of ScriptedPawn, an all-purpose scripted character class that contained sophisticated AI.  In later versions of Unreal, a new scheme split much of the functionality of ScriptedPawns into Pawn and Controller classes.  In UT2004, some of the original monster models were re-introduced in a gametype called Invasion, where these monsters simply attack the players in a succession of waves.  However, the UT2004 Invasion Monsters were not meant to be used in any other gametype or in custom maps.

This toolset redefines the available Monsters (and their MonsterController) to mimic the original ScriptedPawn functionality along with all the original unique monster behaviors and functionality.  To do this, a new Monster class (ScriptedMonster) and a new Controller class (ScriptedMonsterController) work in concert with several recreated UT Actors to provide the same sophisticated toolset that the early versions of Unreal had.

The goal of this project is twofold.  First, to restore the Monsters to their original state, with all the properties, Orders, states and behaviors that mappers of early versions of Unreal will recognize.  Second, to further these Monster's behaviors, components and attributes, where appropriate and in line with the original flavor of the Monsters.  All of the new Monsters re-enable animations that are available in UT2004, but are unused in Invasion.  Some Monsters are recreated variations of existing Invasion Monsters.  Most of the new Monsters have re-introduced properties and behaviors along with some new complementary behaviors.

As this project continues, more Monsters will be re-introduced.  Possibly completely new Monsters will be introduced as well, using the AI structure and functionality that these tools provide.  It should be noted that the original AI toolset and coding structure was expertly constructed by Steven Polge of Epic Games, Inc.  His brilliant AI framework appeared to be an indispensible mapping toolset and inspired me to recreate it in UT2004.  Thanks, Steven!

~ Glenn "SuperApe" Storm


+=====================+
 Tool Set
+=====================+

--- Class Tree ---

(Other)
  +- (Actor) >> (see below)
  +- (ScriptedAction)
      +- ACTION_AssignMonsterToTeam
      +- ACTION_DummyReset
      +- ACTION_ExitVehicle
      +- ACTION_GiveGoodie
      +- ACTION_HealPawn
      +- ACTION_IfGameDifficulty
      +- ACTION_IfMonsterSeesEnemy
      +- ACTION_IfNumPlayers
      +- ACTION_Monsterize
      +- ACTION_PossessPawn
      +- ACTION_SetOrders
      +- ACTION_SetEnemy
      +- ACTION_SpawnMonster
      +- ACTION_SubTitleSwitch
      +- ACTION_TryToDrive
      +- ACTION_VehicleFire
      +- ACTION_VehicleFireStop

(Actor)
  +- (Controller)
  |   +- (AIController)
  |       +- (ScriptedController)
  |           +- (MonsterController)
  |               +- ScriptedMonsterController
  +- (DamageType)
  |   +- (Burned)
  |   |   +- Burning
  |   +- (DamTypeKrallBolt)
  |   |   +- LesserBruteBoltDamage
  |   +- (DamTypeRocket)
  |   |   +- BehemothRocketDamage
  |   +- Poisoned
  |   +- Poisoning
  +- (Decoration)
  |   +- Carcass
  +- (Effects)
  |   +- PoisonEffect
  +- (Emitters)
  |   +- CarcassFlies
  |   +- KrallDice
  |   +- VehicleFactorySpawnEFX
  +- HintItem
  +- (Info)
  |   +- (GameInfo)
  |   |   +- (UnrealMPGameInfo)
  |   |       +- (Deathmatch)
  |   |           +- OSMGame
  |   +- (MapList)
  |   |   +- MapList_OSMAdventure
  |   +- (Mutator)
  |   |   +- OSMMutator
  |   +- OSMObjectiveManager
  |   +- (ReplicationInfo)
  |       +- (GameReplicationInfo)
  |           +- OSMGameReplicationInfo
  +- (Inventory)
  |   +- (Ammunition)
  |   |   +- (BruteAmmo)
  |   |   |   +- BehemothRocketAmmo
  |   |   +- (KrallAmmo)
  |   |   |   +- EliteKrallAmmo
  |   |   |   +- LesserBruteAmmo
  |   |   +- (SkaarjAmmo)
  |   |       +- IceSkaarjAmmo
  |   |       +- FireSkaarjAmmo
  |   +- Poison
  +- (KeyPoint)
  |   +- ThingFactory
  |       +- CreatureFactory
  +- (Mover)
  |   +- VariableTimedMover
  +- (NavigationPoint)
  |   +- AlertPoint
  |   +- AmbushPoint
  |   +- GuardPoint
  |   +- HomeBase
  |   +- PatrolPoint
  |   +- SpawnPoint
  +- (Pawn)
  |   +- Dummy
  |   +- (UnrealPawn)
  |       +- (xPawn)
  |           +- (Monster)
  |               +- ScriptedMonster >> (see below)
  +- (Pickup)
  |   +- (TournamentPickUp)
  |       +- (TournamentHealth)
  |           +- (MiniHealthPack)
  |               +- Antedote
  |               +- PoisonPickup
  +- (Projectile)
  |   +- (GasbagBelch)
  |   |    +- GiantGasbagBelch
  |   +- (KrallBolt)
  |   |    +- SmartEliteKrallBolt
  |   |        +- LesserBruteBolt
  |   +- (RocketProjectile)
  |        +- (SeekingRocketProj)
  |             +- BehemothRocketProj
  +- (SVehicleFactory)
  |   +- TeamVehicleFactory
  +- (Triggers)
      +- PoisonTrigger
      +- RandomTrigger
      +- (Trigger)
      |    +- ExclusionTrigger
      |    +- OSMEndGameTrigger
      |    +- OSMObjectiveTrigger
      |    +- PlayerAloneTrigger
      +- (UseTrigger)
           +- PlayerUseTrigger

 ScriptedMonster
  +- ScriptedCharacter
  +- SmartBrute
  |   +- SmartBehemoth
  |   +- SmartLesserBrute
  +- SmartFly
  +- SmartGasbag
  |   +- SmartGiantGasbag
  +- SmartKrall
  |   +- SmartEliteKrall
  +- SmartManta
  |   +- SmartCaveManta
  |   +- SmartGiantManta
  +- SmartNaliCow
  +- SmartPupae
  +- SmartSkaarj
  |   +- SmartIceSkaarj
  |   +- SmartSkaarjAssassin
  |   +- SmartSkaarjBerserker
  |   +- SmartSkaarjLord
  |   +- SmartSkaarjScout
  +- SmartWarlord


--- Actor Descriptions ---

=-=-= ScriptedActions =-=-=
This set of ScriptedActions includes the original attempt to implement UT2004 Monsters in non-Invasion gametypes, but most of their functionality is now obsolete.  Together with the Dummy Pawn, they provided a rudimentary method of spawning, controlling, unleashing and re-possessing Invasion Monsters.  This scheme originally used the standard Invasion Monsters and MonsterControllers, but these ScriptedActions have been modified to work only with the new ScriptedMonster and ScriptedMonsterController classes.  The ScriptedMonster and ScriptedMonsterController classes, along with the AI support actors provided in this package, are far superior tools to use to implement monsters in UT2004 non-Invasion gametypes.
== ACTION_AssignMonsterToTeam
This action will place a monster matching the given MonsterTag to the team matching the given TeamIndex.  Monsters assigned to teams will ignore original Orders.
== ACTION_DummyReset
This action is meant to re-associate a Dummy Pawn with a ScriptedSequence for the purpose of using the Dummy to spawn ScriptedMonsters.  This allows the same functionality as the CreatureFactory, although not as reliable.  Using a CreatureFactory is recommended instead.
== ACTION_ExitVehicle
This action is used to make a creature (ScriptedCharacter) exit a vehicle after driving.  This must be done before the creature can be Monsterized, as the ScriptedMonsterController expects to control a ScriptedMonster, not a vehicle.
== ACTION_GiveGoodie
This equips ScriptedMonsters with additional GoodieDrop array Pickup items.
== ACTION_HealPawn
This will heal the Pawn by a specified amount.  This does what ACTION_HealActor can't.
== ACTION_IfGameDifficulty
This conditional action returns True if the current game difficulty is equal to or higher than the given value. ( 0 = Novice, 7+ = Godlike )
== ACTION_IfMonsterSeesEnemy
This conditional action checks to see if the ScriptedMonster can see it's current Enemy Pawn.
== ACTION_IfNumPlayers
This conditional action returns True if the current number of Players (bot and human) is equal to or higher than the given value.
== ACTION_Monsterize
This action unpossess the ScriptedMonster from the ScriptedSequence, spawn a ScriptedMonsterController and have that possess the ScriptedMonster.  The net result is a Monster that is "loose" and will freely attack any Enemy it sees.
== ACTION_PossessPawn
This action is meant to recover "loose" ScriptedMonsters.  It makes the ScriptedSequence possess the ScriptedMonster while discarding it's ScriptedMonsterController.  This allows the ScriptedSequence to completely control the ScriptedMonster's movements, actions and sounds.
== ACTION_SetEnemy
This will selectively set the Enemy of a ScriptedMonster to any Pawn with a Tag matching the provided EnemyTag.  If EnemyTag is left blank, the ScriptedMonster will have its Enemy cleared.
== ACTION_SetOrders
This action allows a ScriptedController to set the Orders, OrderTag and AlarmTag properties of a ScriptedMonster.
== ACTION_SpawnMonster
This action is similar to Aciont_SpawnActor, but is specifically designed to spawn ScriptedMonsters.  A Pawn must be associated with the ScriptedSequence in order for either action to spawn something.  For convenience, a Dummy Pawn is provided in this toolset for exactly this purpose.
== ACTION_SubTitleSwitch
This action simply sets the currently active SceneSubtitle actor to help organize multiple subtitled cutscenes.
== ACTION_TryToDrive
This action is used to make a creature (ScriptedCharacter) enter a vehicle for driving.  Note: ScriptedMonsterControllers expect to control ScriptedMonsters, not vehicles, so this is not meant to be used to Monsterize creatures after driving.  You must use an ExitVehicle action first.  These vehicle-related actions are meant for scripted behavior only, as in cutscenes.
== ACTION_VehicleFire
This action is used to make the creature (ScriptedCharacter) fire a driven vehicle's weapon a given number of times, or until a VehicleFireStop action is used.  The target will be the current ViewTarget.  Use a SetViewTarget action to change this.
== ACTION_VehicleFireStop
This action is used to make the creature (ScriptedCharacter) stop firing a driven vehicle's weapon.

=-=-= ScriptedMonsterController =-=-=
This actor handles most of the generic new abilities and behaviors of these ScriptedMonsters.  It is automatically implemented when ScriptedMonsters are used.

=-=-= DamageTypes =-=-=
== Burning
Like Burned, but with bFlaming = true for better death effects.
== Poisoned
The continuous damage caused by poison.
== Poisoning
Normal damage that also gives the victim poison.

=-=-= Carcass =-=-=
A creature or character Mesh decoration that will play a specified animation sequence and stop on a frame.  With Collision properties set properly, can be made Pushable or Damageable.  If set to bFlies true, CarcassFlies will be spawned at map start and removed if the Carcass is destroyed.

=-=-= PoisonEffect =-=-=
Used by the Poisoning DamageType to give Poison to the victim.

=-=-= Emitters =-=-=
== CarcassFlies
The flies that buzz around a Carcass.
== KrallDice
This is a special effect sprite particle emitter used during Krall DiceGames. (see SmartKrall)
== VehicleFactorySpawnEFX
This is a the default spawn EFX for the TeamVehicleFactory.

=-=-= HintItem =-=-=
An item that can be Used by players to toggle a Material HUDOverlay, as if they were closely inspecting it.  Useful to give players clues or hints in story-driven adventures.

=-=-= Info =-=-=
== OSMGame
This is the OSM Adventure GameInfo actor responsible for the game rules, end game handling and description.
== MapList_OSMAdventure
This info actor saves the users current maplist for the OSM Adventure gametype.
== OSMMutator
This is a BaseMutator for OSMGame.
== OSMObjectiveManager
This handles PlayerStart toggling, Matinee triggering, Intro Matinee sequences and other advanced options for Objectives.
== OSMGameReplicationInfo
This actor is responsible for some of the settings disabled from Deathmatch.

=-=-= Inventory =-=-=
== Antedote
This will cure the player of the effects of all poison.
== PoisonPickup
This pickup looks like a MiniHealthPickup, but it will give the player poison.

=-=-= KeyPoints =-=-=
== ThingFactory
This keypoint is designed to spawn actors.  It can be set to spawn automatically or by trigger.  Associate Thing and CreatureFactories to SpawnPoints by matching their Tag values.  Up to 16 SpawnPoints can be associated to a Factory.
== CreatureFactory
This is a variation of ThingFactory designed specifically to spawn ScriptedMonsters.  Killing a creature spawned from this factory will trigger another creature to be spawned automatically, if bAutoRespawn is True and if it's Capacity hasn't been met.

=-=-= VariableTimedMover =-=-=
Allows variable timing on any number of keys and in all Mover states.

=-=-= NavigationPoints =-=-=
== AlarmPoint
This is a spot that an "Alarmed" creature (one who sees an Enemy) will move to and Attack from.  It can be used to have the creature activate a trigger when an Enemy is detected.
== AmbushPoint
This is a spot that an Ambushing creature will wait for an Enemy at.
== GuardPoint
A spot to guard an item from.  This actor is automatically placed by the Controller code and should not be placed by the mapper.
== HomeBase
This is a spot that a hurt or fearfull creature will Retreat to.
== PatrolPoint
This is a spot that a Patrolling creature will move to, wait a bit and move from to the next PatrolPoint in a series.
== SpawnPoint
This is a spot that a ThingFactory or CreatureFactory spawns things and creatures from.

=-=-= Pawns =-=-=
== Dummy
This Pawn is used by the included ScriptedActions to spawn ScriptedMonsters.  It was part of an early attempt to implement UT2004 Invasion Monsters in non-Invasion gametypes.  It is recommended that mappers use the CreatureFactory for this purpose instead.
== ScriptedMonster
This is the base class for all the new creatures.  See the Monster Manual below for individual descriptions of each.

=-=-= Projectiles =-=-=
== BehemothRocketProj
Seeking Rocket projectile.
== GiantGasbagBelch
This is a special projectile for the SmartGiantGasbag.
== LesserBruteBolt
Essentially the same as an EliteKrall bolts, but with proper DeathMessage.
== SmartEliteKrallBolt
Faster than normal bolt, fixes texture and lighting.  Fixes bug that altered normal Krall bolts.

=-=-= TeamVehicleFactory =-=-=
Allows vehicle spawning with many options including random vehicles, team setting, pre and post spawn events, etc.

=-=-= Triggers =-=-=
== ExclusionTrigger
This Trigger is able to exclude certain classes (like "Monster or ScriptedMonster") from activating it.
== OSMEndGameTrigger
This is a simple way to create the EndGame goal for an OSM Adventure map.  Either leave this available for the player to touch or trigger it via another trigger type that the player can instigate.
== OSMObjectiveTrigger
This is a special trigger only used by the OSMObjectiveManager.  It is not meant to be placed or used by mappers.
== PlayerAloneTrigger
Any Monster within the CollisionCylinder will disable this trigger.  Useful for making sure a Player has cleared all monsters before running cutscenes, etc.
== PlayerUseTrigger
A subclass of UseTrigger that will only allow Player Pawns to activate.  A setting is available to only allow Human Player Pawns to activate.
== PoisonTrigger
When triggered will poison the Instigator.  It is triggered externally.
== RandomTrigger
Triggers Events randomly from a dynamic list of Events.


+=====================+
 Monster Manual
+=====================+

The primary properties for mappers to use are Orders, OrderTag and AlarmTag.  Individual monsters may also has unique properties and abilities to use.

=-=-= ScriptedCharacters =-=-=
These are Non-player characters that can appear as any player.  Although they are friendly and allied to players by default, they are technically monsters and can just as easily be ruthless and mean.  They are able to use weapons in their inventory, but they cannot pick up items, take orders or score points/objectives like players do.  ScriptedCharacters are chatty and like to show off.  (Mappers should note that ScriptedCharacters can be used in OSM IntroCutScenes to represent the Player.  Just give it the Tag of "IntroCutScenePawn".)

=-=-= Brutes =-=-=
These are massive genetically engineered warriors.  They have two guns and a few damaging melee attacks.  They walk slowly unless provoked into a charge.  They are prone to fall asleep.
== SmartBrute
This is a average Brute with two rocket launchers for guns.
== SmartBehemoth
This is a huge Brute with twin Pulse rifles. (Skaarj projectiles).
== SmartLesserBrute
This is a smaller version of the normal brute.  It carries two blaster guns. (EliteKrall projectiles)

=-=-= Fly (aka Razorfly) =-=-=
== SmartFly
These are simple insects with a bad temper.  They can sting from the ground or by air, although their ground attack is more frequent.  Walk very slowly and fly at a moderate pace.  Sometimes "sentry" flies will alert the entire hive when attacked by an enemy.

=-=-= Gasbags =-=-=
These are large legless floating creatures that spit fireballs.
== SmartGasbag
This is the normal "beachball-sized" Gasbag.
== SmartGiantGasbag
This is the Granddaddy of Gasbags, about three times the size.  It can either spit our fireballs or Gasbags.  If waiting for a while, this creature may seek out Gasbags to swallow up again for later use.

=-=-= Krall =-=-=
These are Skaarj minions, a race of (mostly) obediant creatures that serve the Skaarj.  They run and can jump great distances, but their thin legs are prone to damage.  They carry a staff they use in melee attacks as well as to shoot energy bolts.  They like to sleep and play dice games.
== SmartKrall
This is a standard Krall.
== SmartEliteKrall
This is a more agile, tougher version of the standard Krall.

=-=-= Mantas =-=-=
These are flying reptiles.  They mostly fly, but can also land and lie in wait.  They have a couple different melee attack where their barbed tail is used.
== SmartManta
This is the standard Manta.
== SmartCaveManta
This is similar to the standard Manta, the difference being it's whiter coloring.
== SmartGiantManta
This is a huge Manta, about three times the size.

=-=-= NaliCow =-=-=
These are simple herd creatures used for food by the Skaarj and it's minions.  They are entirely docile and harmless.  They leave droppings from time to time.
== SmartNaliCow
Sometimes NaliCows are accompanied by baby cows, which will stay close to their mama.

=-=-= Pupae (aka SkaarjPupae) =-=-=
These are prepubescent Skaarj, still in a stage similar to a worm.  They crawl around fairly slowly, but may lunge while attacking.  They have a few different melee attacks involving their pincers and claws.
== SmartPupae
This creature sometimes feeds on its victims.

=-=-= Skaarj =-=-=
This is a main intelligent race of monsters.  The Skaarj are a cross between reptile and insect.  They run fast and jump far.  They have wrist blades they can use for melee attacks and to shoot energy pulses.  They sometimes lie in wait for their victims, feigning death.
== SmartSkaarj
This is a standard SkaarjWarrior.
== SmartIceSkaarj
This is a variation on the Skaarj that wears light armor and is used to inhabit cold temperatures.
== SmartSkaarjAssassin
This is a variation on the Skaarj wears armor.
== SmartSkaarjBerserker
This is a very large version of the standard Skaarj, about two and a half times the size.  It is prone to melee attack.
== SmartSkaarjLord
This is a variation on the Skaarj that wears heavy armor, is skilled and is meant to command other Skaarj.
== SmartSkaarjScout
This is a variation on the Skaarj that wears some light armor.

=-=-= Warlord =-=-=
This is a Skaarj that has been elevated to the level of commander.  They have large wings and can fly as well as run.  They also carry a seeking rocket launcher that contains a teleportation device.  Sometimes they will teleport to avoid attack, suprise an enemy or even to avoid death (by leaving the map).
== SmartWarlord
Sometimes this creature can be seen mutilating a victim long after it has killed it.


+=====================+
 Mapper Guide
+=====================+

Mappers are free to use these tools and the components in their custom maps.  However, the complete OSMT.zip file, *must* be included in the distribution of that custom map.  In addition, I give permission for mappers to use these tools in their custom map if they will also please credit me in their own ReadMe file for that custom map.

To use this toolset, simply install the package file in your .../UT2004/System directory.  In Ued, you will be able to open the OSMT.u package file from the Actor browser.  Once the package has been opened, all the toolset actors will be available to add to your custom map.

>>> Warning <<<: Any map that uses the components found in this toolset *must* be able to access to the OSMT.u, OSMT.ucl and OSMTex.utx package files or the map will fail to load properly.  Do not attempt to distribute a custom map with these components without the OSMT .zip file and installation instuctions or you will get complaints by end users that your map won't load.


== ScriptedMonster Orders and states

The Orders property is one of the most powerful "new" Old Skool Monster features.  In conjunction with the OrderTag, other properties and other actors, the Orders property can dramatically change the way ScriptedMonsters behave in your map.  Here are some of the available valid Orders:

- Waiting : (default) Wander or Camp nearby the placed spot until an Enemy is detected.  Attack and freely roam afterwards.
- Ambushing : Travel to an AmbushPoint (or spawn at one at map start) whose Tag matches OrderTag, wait for an Enemy, then Attack.  Find another AmbushPoint after combat and wait again.
- Guarding : Guard an actor whose Tag matches OrderTag.  They will remain near and return to their placed spot after combat.
- Patroling : Travel from one PatrolPoint (or spawn at one at map start) whose Tag matches OrderTag to the NextPatrol in a series, leave for combat and return to patrol after combat.

Other behaviors ScriptedMonsters will automatically demonstrate include the Retreating state, where hurt (and afraid) monsters will flee to a HomeBase whose Tag matches the monster's Tag, and the Alarm states (TriggerAlarm and AlarmPaused), where an "alarmed" monster (one who has seen an Enemy for the first time) moves to an AlarmPoint, whose Tag matches the monster's AlarmTag, at all costs and possibly shoot a target, activate a trigger, etc.

In addition to these general behaviors, individual monsters may also have special Orders or behaviors.  A couple examples include, the Krall which have a "Sleeping" Order that can be used in conjunction with one of the sleeping animations set in the StartingAnim property, and the Warlord has a "Mutilating" Order that will cause the Warlord to continually kick, punch and munch on a long dead carcass until an Enemy is seen.


== ScriptedMonster Skill, Intelligence and AttitudeToPlayer

ScriptedMonsters have Skill and Intelligence properties.  The Skill set on creature will be added to the starting game difficulty to make them greater at combat tactics.  The Intelligence can rank from Amoeba (or insect-like) to Human.  More intelligent creatures have the ability remember Player positions longer as well as take advantage of various abilities.  ScriptedMonsters also make use of a property, AttitudeToPlayer, to allow more flexibility to the mapper in terms of setting up complex behavior.  The Attitudes a creature can have toward players can vary from Fear to Hate to Ignore to Friendly and even Follow.  Friendly and Following creatures will greet players in some way instead of attacking.  This can change the Alarm behavior of creatures to lead Players to desirable items, etc.  More intelligent creatures set to Follow will then join the Player, following them around, attacking those who their Leader attacks, threatening "wild" creatures, etc.  Although these creatures act a little like Players, they are not Players, so they are not able to pickup items, drive vehicles, score points or achieve game objectives.


== Finding Information On Old Skool Unreal Stuff

One of the reasons to exactly recreate the old style of these tools was 1) to allow mappers used to the older versions of Unreal to "jump right in" without re-learning how to implement the monsters, and 2) to allow all mappers to find documentation and information on the use of this toolset by looking at old documentation online.  The primary source for information on these tools should be the Steven Polge document "Unreal Creature Care and Feeding Guide". ( http://unreal.epicgames.com/AI.htm )  Another fine resource for these tools, as well as both the inspiration and a source of information for its development is the Unreal Wiki. ( http://wiki.beyondunreal.com/wiki/ )  Also many other sources for information on these Monster AI tools can be found with a simple internet search, using keywords like, "Unreal AI ScriptedPawn".


== Example Installation Instructions

Your custom map should always be distributed with a ReadMe.txt file.  In that file, along with map information, your information, etc., you should always include installation instuctions.  To make distribution easier to remember and to avoid confusion by keeping OSMT elements separate from your map components, just add the OSMT .zip file to your map's .zip file.  Below is an example set of instructions that include installation of the required OSMT package files, so that your custom map will run properly on the end user's machine.

For the custom map named, "DM-Foo.ut2":

1. Unzip "DM-Foo.zip".
2. Place "DM-Foo.ut2" in your .../UT2004/Maps directory.
3. Unzip "OSMT_v1.0.zip" (or whichever version you include)
4. Place "OSMT.u" and "OSMT.ucl" in your .../UT2004/System directory.
5. Place "OSMTex.utx" in your .../UT2004/Textures directory.


== OSM Adventure Mapping Guide

The OSM Adventure gametype is designed for Players to "run the gauntlet" among monsters, traps and puzzles to get to the end and win.  They are given a limited number of lives and possible timelimits, but no goal (score) limit.  Players should start out with a limited number of weapons and other powerup items at their disposal.  The advercity they face should be likewise limited.  As they progress, the monsters, traps and puzzles can get more difficult and the powerups and items they find can get more powerful to help them.  At various stages within the map, after the player has achieved some goal, they should be allowed to start from that point, as opposed to starting fromt the beginning again.  Monsters, traps and puzzles should be combined to offer more variety, in other words, a simple trap often seems "unfair" to players, however a trap that is combined with a puzzle or a monster can be more interesting.  At the end of an adventure, use an OSMEndGameTrigger to end the map, either by leading the player to touch it or by using another trigger system (that the player instigates) to trigger it.

-- OSMObjectiveManager

This actor is meant to handle all aspects of the Objectives players can reach in an OSM Adventure map.  It is also designed to start an intro matinee cutscene for the map as well as intermediate cutscenes for each objective, if desired.  Set up Matinee cutscenes as normal.  The OSMObjectiveManager holds a series of optional properties for each Objective, including their ScoringValue, AdrenalineAward, PlayerStartTag (see below), NextObjectiveTimelimit and CutSceneTag.  There is an additional option to display the CutScene for that objective in "Bullet Time".  These Objectives can only be triggered once and the trigger should be instigated by the player, either directly or indirectly, to ensure adrenaline award, etc.  The Objectives can be reached in any order.

-- Progressive PlayerStart setup

As the player achieves Objectives and reaches a new area in the map, they will expect to be able to start from that point in the level in case they die afterward.  Use TriggeredPlayerStarts that will be triggered on/off as the player progresses through the level.  An OSMObjectiveManager can handle the toggling of these playerstarts for each Objective reached.  Make sure the only TriggeredPlayerStarts that are bEnabled at match start are the first ones.  You should place multiple TriggeredPlayerStarts in each Objective's start area, all set with matching Tags to be toggled by the OSMObjectiveManager.

-- IntroCutScenes, Intermediate cutscenes and DeathScenes

Cutscenes are Matinees used during OSM play to give the Player important information about their place in the adventure.  It's good to keep Players informed as they begin their adventure, are challenged by problems, achieve various goals and finish.  No cutscenes run during online play, so Players should be given some clue as to their progress and their next objective even without them.  Cutscene Matinees are set up as normal, via the Matinee gui and using the SceneManager actor.  Aside from the IntroCutScene, which has it's own IntroCutSceneTag and IntroCutSceneLength properties in OSMObjectiveManager, all cutscenes are set to launch from the OSMObjectiveManager through it's Objectives array.  All cutscenes must be launched by the OSMObjectiveManager; do not launch them from another trigger system.  The Player's Pawn can be controlled during a cutscene by simply setting up a ScriptedSequence to control the pawn, and matching the Tag of the script to the PlayerScriptTag property on the SceneManager.  As long as the cutscene is launched from the OSMObjectiveManager, it will force the script to control the Player's Pawn during the scene.  Be careful not to let the Pawn script last longer than the length of the cutscene.  The Intro can also include the Player's Pawn (even though it is not in game yet) by placing a ScriptedCharacter to control and giving it the Tag of "IntroCutScenePawn".  Most all ScriptedActions can be used to control the Player's pawn, such as SetViewTarget, Run, Crouch, Walk, ShootTarget, etc.  For proper operation online, remember never to trigger gameplay critical events from either the SceneManager or the Pawn's script because Cutscenes do not run online.  Use a ScriptedTrigger for those instead.  DeathScenes are just cutscenes that the OSMObjectiveManager will automatically run at death.  Just create a simple, short cutscene and match the Tag of to the OSMObjectiveManager's DeathSceneTag property.  DeathScenes are automatically set to BulletTime and they will be set to a fixed distance from the Player pawn, so your DeathScene movement should only be controlling the angle of view.

-- Cheats

OSM Adventure has an added cheat code (console command): "Comrade <CharacterName> (<bFavWeapon>) (<bFullAmmo>)"  This will spawn a ScriptedCharacter of any character profile and optionally give them their favorite weapon or full ammo.  They will ally themselves with the player and follow/fight alongside.  Since bots are not enabled in OSM Adventure, this is a simplified substitute for offline Cooperative play.

== Using OSMT in other gametypes

The Old Skool Monsta Toolz can be used in any gametype.  However, it is up to the mapper / level designer to implement them in a way that offers more interest and challenge to players, rather than serving to frustrate and distract from player's enjoyment of the gametype.  Be aware that monsters will attack all players equally, regardless of team.  In general, the monsters should be used to guard powerful alternative items or routes to game objectives, rather than to guard the game objectives themselves.  Be aware that gametypes that allow vehicles are inheritently more dangerous for players and monsters alike.  Most monsters are no match for vehicle weaponry and should be appropriately supported against players with vehicles.


+=====================+
 Credits
+=====================+

The original Unreal Monsters, animations, sounds and code structure by Epic Games, Inc.
The original AI structure was masterfully created by Steven Polge.
So these monsters, tools and other actors are loving adaptations by me (SuperApe), based mostly on second-hand knowledge and accounts of the original ScriptedPawn abilities, behaviors and components.
Some miscellaneous improvements to settings, code and behaviors are original additions by me, meant only to enhance the original flavor of these creatures.
Special thanks go to the OSMT Beta Testing crew, especially Lord_Simeon, and to all the helpful members and staff of UnrealPlayground.
Very special thanks go to my wife for all her support and understanding while I worked on this.


+=====================+
 Legal Stuff
+=====================+

Copyright ©2006 by Glenn 'SuperApe' Storm.  All rights reserved.

Authors MAY use these components in custom maps with credit to me for the Old Skool Monsta Toolz toolset in their ReadMe file.

Authors may NOT use these components as a base to build additional mods, mutators, or any other content without my expressed, written permission.

You are NOT authorized to distribute this package EXCEPT in its original, unmodified form with THIS file attached in its original, unmodified form.

You are NOT authorized to charge fees for the sale, use or distribution of this mutator without our expressed, written permission.  This includes, but is not limited to, compilation CD's, disks or software bundles.

--------
Unreal Tournament 2004 ©2004 Epic Games, Inc. Raleigh, N.C. USA. 

Unreal is a registered trademark of Epic Games, Inc. ALL RIGHTS RESERVED. 
All other trademarks are the property of their respective owners. 

--------
This mutator is not supported by Atari, Epic, or any such parties' subsidiaries.
