Needed this to run UnrealEd http://download.microsoft.com/download/vb50pro/utility/1/win98/EN-US/Msvbvm50.exe

for v1.4========================
x use minDamageThreshold of 60 for doors, it's what the seals in the ship use, door at the top of paris start is 75 though
x -50 can be broken by master sniper, 60 can still be broken with dragoon's tooth sword, max low tech skill, and max combat strength aug, 75 cannot
  -not just key-only doors or undefeatible doors, but all doors?

randomly remove medbots and repair bots
can/should I make it possible to not transmit the NSF signal at 04_NYC?
check if I'm copying the bHidden flag for cloning enemies and keys

x tooltips in the GUI? the controls screen does it, MenuUIWindow uses the FocusEnteredDescendant event and FocusLeftDescendant
x rename MenuSetupRando.uc to DXRMenuSetup.uc and MenuScreenNewGameRando to DXRMenuScreenNewGame so they're grouped together with the other files

add more tests? I should maybe make tests only run once per launch, maybe like on localURL == "DX" maybe the training area or liberty island cause some tests will need a world?
    -tests for ClassIsA, skill randomization, augs...

I can make more stuff data-driven
    -config to enable/disable modules? modules in a separate package?
    -DXRReduceItems could receive arguments/config for which classes of items to reduce and what %
    -each module should be in charge of their own flags and flagnames?
    -config value for enabling tests
    -I can display a crc hash of the configs and flags as a clientmessage, like how the seed is shown

split up the Swap function, support multiple classes for SwapAll? or just support NavigationPoints?

NavigationPoint (children: PathNode, PatrolPoint, AmbushPoint, InventorySpot) for extra positions where items can be placed?

    - https://docs.unrealengine.com/udk/Three/CharactersTechnicalGuide.html#Pawns%20and%20Possession
    - Pawn class - native(518) final function Actor FindPathTo(vector aPoint, optional bool bSinglePath, 
												optional bool bClearPaths);
    - FindPathTo [aPoint] [MaxPathLength] [bReturnPartial] - This calculates a path to the navigation node closest to the given destination and returns the next node along that path.

    - Pawn class - native(517) final function Actor FindPathToward(actor anActor, optional bool bSinglePath, 
												optional bool bClearPaths);
    - FindPathToward [anActor] [bWeightDetours] [MaxPathLength] [bReturnPartial] - This calculates a path to the navigation node closest to the given actor and returns the next node along that path.
    PointReachable [aPoint] - This returns whether the specified location is directly reachable given the Pawn’s movement capabilities. This function can be expensive and should be avoided in favor of ActorReachable() if possible.
    ActorReachable [anActor] - This returns whether the specified Actor is directly reachable given the Pawn’s movement capabilities. Though potentially more optimized than PointReachable(), this function also can be expensive and should be used sparingly.
    I can use FindPath to determine if I can do a key swap? find path from key to path in question, walk through the NavigationPoints and see if the door is in between any of them?
    -what does this do? native(525) final function NavigationPoint FindRandomDest(optional bool bClearPaths);
        -FindRandomDest - This returns a random node on the navigation network. This can be good for creating a state where the character roams the world.
    -I could find all the NavigationPoints within a small radius of the door, and whichever ones are farther from the key than the door is are bad points that should indicate a failed path finding
        -should this be done in a preparation loop, or while doing the pathfinding?

native(724) final function bool GetBoundingBox(out vector MinVect, out vector MaxVect,
                                               optional bool bExact,
                                               optional vector testLocation,
                                               optional rotator testRotation);

//
// Trace a line and see what it collides with first.
// Takes this actor's collision properties into account.
// Returns first hit actor, Level if hit level, or None if hit nothing.
//
native(277) final function Actor Trace
(
	out vector      HitLocation,
	out vector      HitNormal,
	vector          TraceEnd,
	optional vector TraceStart,
	optional bool   bTraceActors,
	optional vector Extent
);

TraceActors loop doesn't seem useful

native(533) final function bool CanSee(actor Other);

Keypoint, the base class of invisible actors which mark things.
    -LocationID - marks and names an area in a zone

// WarpZoneInfo. For making disjoint spaces appear as if they were connected;
// supports both in-level warp zones and cross-level warp zones.

track times per mission and overall (RTA or IGT?)

for v1.2========================

x start randomizing enemies? only add enemies?

x fix password generation for 14_VANDENBERG_SUB
x- check if the match on the password is touching a letter or number

x print out the flags when loading

x autosave
- MenuScreenSaveGame
- DeusExSaveInfo
can I randomize computer skill requirements? I can randomize the EAccessLevel, but it doesn't do anything? gonna need my class injector to make this clean

=============================

need a function for GiveRandomItem()
need a function for CloneNanoKey() (based on Engine.Pickup.SpawnCopy? no, that's for respawning items)
need to figure out how to modify conversations, datacubes, emails...
x should meme up the endings too (more?)

AI hearing and vision adjustment, enemy health
rando dragoon's tooth sword? nerf it?
actor class also has these:
    var const Actor           Base;          // Moving brush actor we're standing on.
    native(298) final function SetBase( actor NewBase );
    var const PointRegion     Region;        // Region this actor is in.
    var(Collision) const bool bCollideActors;   // Collides with other actors.
    var(Collision) bool       bCollideWorld;    // Collides with the world.
    var(Collision) bool       bBlockActors;	    // Blocks other nonplayer actors.
    var(Collision) bool       bBlockPlayers;    // Blocks other player actors.

exploded corpses drop keys?
bIsItemGoal?
should NanoKeys have buoyancy?
what does minDamageThreshold do for doors? important doors shouldn't be breakable by the dragoon's tooth
-cameras have a minDamageThreshold of 50

x I can use this for string hashing http://www.unrealtexture.com/Unreal/Downloads/3DEditing/UnrealEd/Tutorials/unrealwiki-offline/crc32.html

maybe I can rewrite this as a mutator?

https://docs.unrealengine.com/udk/Two/UnrealScriptReference.html

https://web.archive.org/web/20190407081013/http://www.unrealtexture.com/Unreal/Downloads/3DEditing/UnrealEd/Tutorials/unrealwiki-offline/unrealscript.html

http://www.unrealtexture.com/Unreal/Downloads/3DEditing/UnrealEd/Tutorials/unrealwiki-offline/unrealscript.html

https://ut99.org/viewtopic.php?t=5985

https://www.dx-revision.com/dxtutorials/constructor/tutorials.htm

charisma setting that disables random dialog options with low charisma?

https://forums.epicgames.com/unreal-tournament-3/unreal-tournament-3-programming-unrealscript/176322-decompile-u-files

https://ut99.org/viewtopic.php?t=12363

https://www.acordero.org/projects/unreal-tournament-package-tool/

https://www.oldunreal.com/wiki/index.php?title=UTPT

https://ut99.org/viewforum.php?f=58

https://ut99.org/viewtopic.php?t=6273

http://unreal.ut-files.com/3DEditing/Tutorials/unrealwiki-offline/ut-package-tool.html

https://www.dx-revision.com/dxtutorials/tack/


    /*foreach AllActors(class'ScriptedPawn', p)
    {
        if( p.bIsPlayer ) continue;
        inv = spawn(class'WeaponAssaultGun');
        inv.GiveTo(p);
        inv.SetBase(p);

        inv.AmmoType = spawn(inv.AmmoName);
        inv.AmmoType.InitialState='Idle2';
        inv.AmmoType.GiveTo(p);
        inv.AmmoType.SetBase(p);

        p.SetupWeapon(false);
    }*/

    /*foreach AllActors(class'DeusExCarcass', c)
    {
        inv = spawn(class'WeaponAssaultGun', self);
        c.AddInventory(inv);
    }*/