/*-----------------------------------------------------------------------------
	tim@epicgames.com: Old work notes
-----------------------------------------------------------------------------*/

///////////////////////////////////////////////////////////////////////////////
Prior to 5-1-96: Work notes were on paper

///////////////////////////////////////////////////////////////////////////////
5-1-96

+	QuadHand, AutoMagHand properties
+	Use weapon offsets
X	Move Weapon with its parent (Child actors now ticked after parent, can handle this themselves)
+	DestroyActor destroy all child actors
+	AWeapon implementation
+	Pawn maintain Bob, inventory utilize

+	Inventory messages
+		PickupQuery: Root implementation, Pawn implementation
+		PickupNotify
+		AddInventory
+		DeleteInventory
+		PreemptPickupQuery
+		Activate
+		DeActivate
+		Use
+	'0' - '9' switch weapons
+	Autoswitch inventory based on priority

+	Multiple weapons sharing number key
+	Arbitrary DestroyActor calls must preserve inventory chain
+	Pickup message strings, simple text messaging

+	Weapons
+		Weapon up & weapon down upon activate/deactivate
+		Use 'Fire' anim sequences
+		Instant-hit function via raytracer with optional spawn-explosion-at-wall-minus-delta
+		Dispersion function for random weapons like shotgun

X	Pickup implementation -> save all of this for scripting
X		PickupSound, RespawnSound stubs
X		RespawnTime
X		RespawnNetOnly
X		Respawn FX

+	Root: On PreBeginPlay, server pass play flags and destroy unwanted actors
+	LevelSetState include difficulty and network play flags

+	Detect Windows NT and skip DirectMouse
+	Fix sheet brush display order, now draws semisolid coplanars after solids
+	Cloudcast bug?
+	DispDib error mention Win95 requirement

///////////////////////////////////////////////////////////////////////////////
5-2-96

+	Kill unused cameras after load-for-play
+	UnrealEd: Sort mesh viewer list
+	UnrealEd: Strip quotes from strings, reappend during export
+	UnrealEd: F4 cycle through list of result messages (Next Error)
+	UnrealEd: Class browser, no Close button
+	UnrealEd: String properties are acting up
+	UnrealEd: Map save-as + cancel doesn't work.  Other save-as's also? Check it out.
+	Actors have ambient brightness property
+	Set player's starting yaw accoring to PlayerStart
+	Implemented UClass::IsKindOf
+	Test all CPT_String references
X	InstantHit projectile class - use a function instead
+	Pyrotechnics class with
+		Explosion, TeleportIn, TeleportOut, WallDamage, MonsterDamage, PickupRespawn, PlayerRespawn, PlayerDie

+	Property arrays
+		ImportActorProperties
+		Don't allow editable arrays except for strings
+		AActor::QueryReferences
+		AddParentProperties
+		ExportActorProperty
+		ExportMultipleActors - skip arrays except for strings
+		Export headers & actors
+		Import
+		Test ugly stuff, including array of names + array of resources
+		Export class, only fwd declare classes that are necessary

///////////////////////////////////////////////////////////////////////////////
5-3-96

+	Don't use DMouse movement when mouse not captured
+	Auto-activate upon pickup
+	Auto-activate and deactivate upon switch
+	Expand zone list to include name and all other new info
+	Way of specifying particular actor class as a CPT_

+	UnrealEd: Preferences/No-checks mode
+	UnrealEd: Treat intrinsic classes as read-only unless no-checks mode is on, note *'s
+	UnrealEd: Is PF_HURT tag visible?

+	UnrealScript
+		support classed actor references

X	bWantTextMsgs
+	ILevel::GetZoneZoneDescriptor(iZone)
+	ILevel::GetActorZone(iActor)
+	Zone builder handle ZoneDescriptors
+	Is bClassPureVirtual being copied from parent class?
+	FZoneFilter::MergeAdjacentZones: Invalid back cut
+	Never destroy bStatic actors
+	Export actor: if exported parent, only export non-identical properties

+	Zone transitions
+		Actor Zone byte
+		MoveActor,FarMoveActor,SetState: Message ZoneChange, send ZoneChange right after BeginPlay
+		BeginPlay
+	Delete cone tracer stuff, replace with line tracer
+	FClassProperty::Compare
+	Fix 'Bump' message - only send once per call to MoveActor.
+	Spawn send ZoneChange
+	Projectile move with MoveActor
+	MoveActor, etc - validate Class after all SendMessage calls.

X	Const properties which are stored only in class data but not individual actors
X		Use for advanced pawn properties (stored in class only)
X		inline FClassProperty::GetData(Class,RawActor) instead of offset for *all* gates
X		Rename PropertyOffset
X		Shared properties
X		This would cause a huge slow mess in accessing stuff from C

X	Ammo system -> Save for scripting
X		Slurp ammo, deactivate when exausted
X		When deactivate with no dest weapon, pick highest priority other weapon

+	Plan damage system mechanics
+	Plan kill credit mechanics

///////////////////////////////////////////////////////////////////////////////
5-4-96

+	5 armor classes, 5 damage classes
+	PHit message

+	Classes
+		KeyPoints: BlockAll, BlockMonsters
+		Pickups class: Shells, Bullets, Health
+		GunFlashSmoke
+		Projectile const brightness

X	PF_MONSTER_NO_GO, implement in sphere/rod routine, use collision hints instead
+	Logo, GGfx.Logo
+	Impart momentum

+	Actor->bJustDeleted, SpawnActor prevent recycling of actors during a frame

+	2 fire button support with Use, UseExtra Ctrl+Space
X	CMB Damage = k/Distance? I think not.
+	Root route UseExtra to Use
+	Teleporter = intrinsic

+	New light sampler
+		Sample around lattice center for better consistency
X		Do X-jittered oversampler to hide lightmesh wall aliasing -> Not useful with 4X oversampler

///////////////////////////////////////////////////////////////////////////////
5-5-96

+	Rewrote light mesh supersampler

///////////////////////////////////////////////////////////////////////////////
5-6-96

+	Volumetric lighting works. Very cool.

///////////////////////////////////////////////////////////////////////////////
5-7-96

+	Reimplement diffusion dithering
+	WallHit actor = puff of smoke
+	Caught up on email. Email sucks.

///////////////////////////////////////////////////////////////////////////////
5-8-96

+	BSP cone tracer
+	InstantHit weapons hit walls, spawn smoke
+	InstantHit weapon properties: +Dispersion (0-1.0), +NumShots
+		InstantMomentum
+	InstantHit weapons hit actors
+		transfer momentum according to mass
+		do damage
+	Hit messaging
+	Actor functions to get view coords & get draw coords
+	Math PerturbVector function
X	Pyrotech needs acceleration vector -> just gravity multiplier
+	Raytracer handle fake backdrops
X	Optimize diffusion dithering routine -> give to Mark or Ammon

+	Added AActor::GetViewCoords for finding an actor's view coordinate system
+	Added AActor::GetLocalVector to transform a vector into the actor's coordinate system

+	InstantHit weapons need MeleeDamage,RangeDamage,FireDamage,ElectricDamage
+	No macro save camera open
+	Projectiles need uneditable damage attributes
+	Weapons must set projectile's damage attributes

+	UnrealEd minor stuff
+		Zone portals editable
+		Macros use .mac ext, not .MAC
+		Init common dialog directories at start, then leave them alone

///////////////////////////////////////////////////////////////////////////////
5-9-96

+	Monster zone clipping
+	Monster bounding boxes
+	Use per frame bounding box

+	Jason Emery help files (cool!)

+	Rotations need to be int's for script accessibility? Ugh.

///////////////////////////////////////////////////////////////////////////////
5-10-96

+	Validate function for all actors, reverse-sent like Spawn

+	Moving brushes
+		Mover's spawn function: set default keyframe position to location & rotation -> Zeroes
+		KeyCurrent = name
+			Validate name
X		UnrealEd UI -> Can do all of this with existing property system!
X			Display keyframer when 1 actor is selected and it's a mover - IsKindOf
X			'KEY ADD NAME=' 'KEY DELETE NAME=' 'KEY SHOW NAME='
X			UnrealEd UI for moving keyframes
+		bAdded, MoverInitialKeyPos
+		Utilize saved location/rotation only, no scale no sheer
+		Isn't exporting positions/rotations associated with keyframes?
+		Eval byte, int, float actor properties
+		All PText messages include iSourceActor
+		UnrealScript handle CPF_EditInPlay
+		UnrealEd Vector & Rotation editing dialog
+		Indexed property import

///////////////////////////////////////////////////////////////////////////////
5-11-96

+	Optimize:
+		Shadow cache builder, use bitmask
+		Use 1 simple mipmap decision
+		Build mip-reference list + ptrs to all needed textures in advance

+	Updated square root precalc
+	Visible polylites stat

///////////////////////////////////////////////////////////////////////////////
5-12-96

+	Merged sound code
+	Answered 150 waiting emails.  Email still sucks.

///////////////////////////////////////////////////////////////////////////////
5-13-96

+	Actor textures fuzz in distance
+	Actor chunk highlighting weirdness
+	Don't highlight selected stuff during play -> Root deselects all in BeginPlay
+	'Posessed' messages are dead
+	Fixed & optimized box-clipper near-clipped cases -> cool outcode union trick
+	V-fog toggle

+	Moving brush prelims
+		Place, move, and set InitialKeyPos in UnrealEd
+		UnrealEd Brush - no '...', use current call Map DupeBrush
+		Copy current brush (make a duplicate)
+		Brush bounding sphere
+		Set location, rotation properly
+		Export, import with actors properly
+		AActor::GetPropertyPtr(iproperty,element)
+		Test multi-select with property array - must ignore
+		CPF_ExportResource for resources, use for single elements and arrays
+		Wire render

+	Movers: Sinusoid frequency, phase option

///////////////////////////////////////////////////////////////////////////////
5-14-96

+	E3 prep
X	To do: -> Denied!
X		Basic sporadics class with realtime EdPoly CSG (slow):
X			AddAllBrushes
X			RemoveAllBrushes
X			MoveBrush
X		Merge Mark Randell's code
X		Import Cliff's maps or give Cliff the new UnrealEd

///////////////////////////////////////////////////////////////////////////////
5-15-96 through 5-18-96

+	At E3
+	Demos went ok but certainly not great
+	We have a hell of a lot of work to do before Unreal is truly impressive

///////////////////////////////////////////////////////////////////////////////
5-19-96

+	E3 recovery

///////////////////////////////////////////////////////////////////////////////
5-20-96

+	Look into box occlusion span merge slowdown -> Code is ok
+	GClasses: TextureRes, SoundRes, AmbientRes, LevelRes, ResourceRes
+	Class startup routine
+	Bump res version
X	Purely generic actor class needs Class pointer? -> Doesn't matter
+	Check registry
+	VC++ 4.1

+	CPUID MMX, +Pentium
X	Must use DirectDraw display pitch, can't assume == SXR
+	Should lock DirectDraw only during texture mapping, not setup
X	Parallel Resource class -> Overly complex

X	Angles as integers -> Later
+	UnBuild.h: REQUIRE_MMX, REQUIRE_3D
+	Scrap MipLevel in UnMMX.cpp
X	Use level gravity vector -> Later
X	Use Zone gravity override vector -> Later

X	Need a damned password in Unreal (registry) -> Nah

///////////////////////////////////////////////////////////////////////////////
5-21-96

+	DirectDraw, DirectSound & WinDiff crap
?	Need AnimDef for animating texture animation sequences?
X	Class flag: includable in actors -> Lame

///////////////////////////////////////////////////////////////////////////////
5-22-96

+	How to pass strings around? String constants? -> Predefined length
+	Must implement property frames for handling of globals, locals, and params -> Reworked
+	FClassProperty: support Init token & error result
+	FClassProperty::IsTrue

+	GetToken handle allowable resources
+	Resource(Name)
+	Vector(X,Y,Z), Rotation (P,Y,R)
+	Name(Name)
+	Resource type script-referencable flag
+	hack for dumping class during compile
+	dump support const, etc.
+	True,False are now integer constants

+	All vectors & rotations import/export in new format
+	New sound code
+	Fixed can't delete lights bug
+	Reduce memory thrashing

///////////////////////////////////////////////////////////////////////////////
5-23-96

+	GPF's screw up focus somehow when mouse is captured
+	RendSpanOccludeBSP crashes at 168 660
X	No duplicate VB & C error messages -> This is ok
	Unload DirectDraw if locked at crash time
X	Fix UnrealEd startup instability -> This is a Microsoft bug
+	Crash in FGlobalUnreal::Exit keeps task alive
+	Crash doesn't always kill timer?
+	FGlobalUnreal::Init double crash from VB
	
+	Separate EdSrv from GameSrv
+	WM_CANCELMODE
X	Run players at 70 fps, AI at 35 fps? -> Revisit later
+	pEnable/pDisable don't work with cams anymore.

///////////////////////////////////////////////////////////////////////////////
5-24-96

+	Add DD 800x600 and 1024x768
+	ILevel::SendMessage added class parameter
+	Malloc gate for *all* Unreal memory, leak check at end
+	Resource leak check and display
+	Texture properties: Ground friction & hit sound & footstep sound
+	UnrealEd: Never ending slow task disables cameras

+	_set_new_handler
+	_set_new_mode
X	Adjust player-control mouse response: faster rotation, slower movement -> Configurable

X	Parameters via: Link topics? Class properties? New system entirely? -> Dumb
X		Need way of saving defaults like sound/music volume
X		Need way of running macros

X	Wall damage dynamics
X	Muchos cheats
X		All-health, all-ammo, all-weapons, move-z, no collision

+	Cleaned up memory leaks
+	Fixed killing UnrealEd doesn't kill UnrealServer if log window is open

+	Resource purge function to clean all resources not owned by root

+	Actor messages are now enum'd and attached to root

///////////////////////////////////////////////////////////////////////////////
5-25-96

+	Now use PlayerStart's PlayerSpawnClass
X	Check all FIND_EXISTING, FIND_OPTIONAL -> All is well
+	No resource purge ever in UnrealEd

+	Scripting warm-up
+		Accept default values if not editable, require if const
X		Export const's as C++ enums -> overly complex
X		Allow const's as array dims -> overly complex

+	Functions & Operators
+		Function <name> () [Intrinsic] [Fast]
+		Operator <symbol> () [Intrinsic] [Fast]
+		Parse all comma-separated parameters
+		Prevent bad overrides in parameters
+		Allow defaults in parameters
+		Handle 'as returntype'

+	B1umped res version to 7
+	Moved gameInit/gameExit to FGlobalUnreal

X	FGlobalClasses now includes AllClasses and IntrinsicClasses -> Rearranged
+	Added to FGlobalPlatform: LockName, LockPassword, LockEncryption, PasswordDialog
+	Added to FGlobalPlatform: OpenSettings,CloseSettings,GetSetting,SetSetting
+	Uses REGISTRY_KEY_BASE, REGISTRY_KEY_COMPANY, REGISTRY_KEY_PRODUCT

///////////////////////////////////////////////////////////////////////////////
5-26-96

+	Catchup
+	Visual C++ 4.1 = unstable slow ass compiler from hell, reverted back to 4.0

///////////////////////////////////////////////////////////////////////////////
5-27-96

+	Max Z-based subdivision decision -> This rules!
X	Transparent smoothing is awesome!  May want to cache previous frame's
X		spans and render in two phases (one blended union, one normal diff).
X		This looks so damn cool in 320x200. Requires maintaining 2 buffers
X		for consistent averaging -> Check out later
+	Temporal H&V antialiasing
+	Temporal 2-way mipmap transitions

///////////////////////////////////////////////////////////////////////////////
5-28-96

+	Email, Intel discussion, experimentation with temoral antialiasing

///////////////////////////////////////////////////////////////////////////////
5-29-96

+	FScopeLink

X	Action/EndAction, Repeat <n> -> Messy implementation

X	Generic add-parent-properties that takes an iTree as input -> Overly complex

+	Scripting infrastructure (pre code gen)
+		Maintain FStackTree entry 0 (global)
+		PushNest, PopNest be cognizant of FStackTree
+			Parse all stack tree types correctly
+				If-ElseIf-Else-EndIf
+				While/Do-Loop/Until
+				Select/EndSelect
+				Case/Default
+				For/Next
+			Handle local variable dims
+			Resolve length-aware string parameter passing
+		Script disassembler called at end-of-compile:
+			Display stack tree dump
+			Display global variable dims (implemented in FClassProperty, not UClass)
+			Display local variable dims
+			Display var intialization values when nondefault

+	Detect end of script with bad nesting level
+	#dumpnest directive
X	First conditional remake remakes all due to pointer relocation. Avoidable? -> No.
+	Assemble script from +stack tree, +properties, and +data
+	Script->Decompile work (very basic)
+	Decompile local and global variables
+	Prevent states etc. in an intrinsic class, provide useful error messages
+	Proper errpr overloading of parent global variables
+	No whens in intrinsic classes
+	No states in intrinsic classes

+	No editable local properties
+	FClassProperty::ExportTCX needs to handle default values!
+	Must use SNODE_ flags

+	Parse intrinsic functions
+	Functions in intrinsic classes must be intrinsic and not
+	Stack tree flags, such as intrinsic, auto, editable
+	ALLOW_Return

+	Local properties and initialized data.
+		When push nesting level, allocate a data buffer
+		When popping nesting level, copy data buffer over
+		When popping nesting level, release any allocated memory
+		Upon completing the script compile, move all properties to the script and reallocate all offsets

///////////////////////////////////////////////////////////////////////////////
5-31-96

+	Timings:
+	    * Can write 4 cached megs at full speed = 1/2 cycle per dword write
+		* Can write 4 uncached megs in 50 msec = 8 cyc/dword written
+		* Can insert 7 cycles of cached instructions in the loop for free
+		* Time rises to 90 msec if you add one uncached read in the middle (write buffer
+		  and read buffers colliding).
+	    * Can read 4 uncached megs in 112 msec = 18 cyc/dword read
+		* 8 c/p = 17 msec/frame at 166 mhz
+		* Traversing the entire actor list 100 times takes 40 msec, and half of the time
+		  is due to the lack of caching.

+	Conclusions:
+		* Drawing 4x4 blocks across the screen, then copying to vid memory will just cost
+		  an additional f-ing 8 cycles per pixel.
+		* There's no point to having a texture mapper that writes faster than one DWORD
+		  or one QWORD per 8 cycles.
+		* Don't write a lot of data - better to compute stuff on the fly.

+	Reduced frame setup work by using a better point/vector caching system (no huge memclears)


///////////////////////////////////////////////////////////////////////////////
Unreal 0.75: Testing info

What's in this version:
	* Unreal installation
	* Optional DirectX II installation
	* Support for all 8- and 24-bit color video modes
	  - In-a-window
	  - Fullscreen via DirectDraw II
	* DirectSound support
	* DirectMouse support

Requested feedback:
	* For bugs:
		- Send Unreal\System\Unreal.log to UnTest@epicgames.com
		- Send beta report describing problems
	* For game play suggestions (non-bugs):
		- Post to Unreal@epicgames.com

Known limitations of 0.75:
	* Begin game, end game, open, save aren't in place
	* Always playing; no non-game state
	* Only included 1 level for testing
	* Creatures are invisible in 24-bit color
	* DirectInput support is stubbed out in this version due to known major bugs
	* Configurable input isn't in
	* Help files are very outdated
	* Playability needs a whole lot of work
	* Not tested on Windows NT
	* Sound pauses when game window loses focus
	* Audio properties dialog isn't in (volume controls)
	* Install program doesn't detect or require presence of MMX
	* Unreal doesn't require presence of MMX
	* No hardware 3D acceleration

Planned limitations in Unreal OPSD gold:
	* No network play
	* US English text only in initial release

Developers to contact on UnTest@epicgames.com:
	* Unreal engine: Tim Sweeney, tim@epicgames.com
	* Input system: Mark Randell, randell@computan.on.ca
	* Audio: Ammon Campbell, ammon@teleport.com
	* Gameplay & level design: cliffyb@earthlink.net

Minimum requirements
	* Windows 95
	* 16 megs of RAM
	* For decent video performance, you'll really want 2 megs of VRAM

///////////////////////////////////////////////////////////////////////////////
Unreal 0.75 notes & requests

Mark and Ammon:

	1. New portability info: Please arrange all your code so that all platform
	specific code (anything that relies on Windows, DirectX, Galaxy, etc) goes into
	the Windows project, and all platform independent code goes into the Engine project.
	For modules which rely on both platform-specific and platform-independent code (such
	as the input system and audio system), please create two global classes - one that
	is platform independent, and one that is platform specific.  Then, porting will only
	require rewriting the platform specific code.

	2. Make sure your code doesn't internally refer to any classes that aren't referenced
	in the global resource tree, i.e. the following will fail:

	    MuzzleEffectClass = new("MuzzleFlash",FIND_EXISTING)UClass;

	3. Once new build is posted, please move all code that's only needed by UnrealEd over 
	to the new Editor project and make sure that you place sufficient #ifdef EDITOR
	checks in your source so that everything compiles and works as intended both with and
	without UnrealEd support.  My code is completely moved over.

	4. Malloc(size,str) now needs a description string parameter which is used by Unreal's 
	memory allocation tracker.

	5. I moved all of the global functions from UnrealWn.cpp over to the FGlobalPlatform
	class in the Windows project.  Mark, if you've put hooks into the old UnrealWn.cpp project
	for keyboard/mouse support, you'll have to put them in again.

	6. I changed the spelling/naming of several resource types in order to improve the
	consistency.  The best way to find the changed names is to compile your code and see what
	breaks.

	7. Here's how to hook your platform-specific code in the Windows project to the
	engine in UnEngine.dll: Encapsulate all of the platform-specific functionality
	into a class and call it something like FGlobalFruitManager.  Make all of your
	functions virtual (so that they can be called through their virtual function
	table -- necessary since the Windows project is not a DLL and it cannot export
	functions). Then insert it into the FGlobalPlatform class defined in UnPlatfm.h, 
	after the other hooks, like this:
		...
		// ----------------------------
		// Platform-specific subsystems
		// ----------------------------
		//
		class FGlobalRenderDevice   *RenDev;
		class FGlobalCameraManager  *CameraManager;
		class FGlobalFruitManager   *Fruit; // Your class
		// Other global platform-specific classes go here...
	Then insert some init code into Windows to set App.Platform.FruitManager to a
	pointer to your class (a global variable).

	8. Renamed some projects & directories to make them more descriptive.
		UnrealEd -> Editor
		UnWn -> Windows
		UnLaunch -> Launcher

	9. I chaned the AUTOREGISTER_RESOURCE macro; it now needs 4 DWORD parameters
	comprising an Ole GUID.  Ammon, you can just copy the two updated
	AUTOREGISTER_RESOURCE macros into your code.

	10. Changed the way resource classes are defined, because the old method
	confused the VC++ class browser.  A class previously defined as:

		RESOURCE_DB_CLASS(UPalette,FColor,RES_Palette)
			void Register				(FResourceType *Type);
			// Other functions...
		END_RESOURCE_CLASS;

	is now defined as:

		class UNREAL_API UPalette : public UDatabase
			{
			RESOURCE_DB_CLASS(UPalette,FColor,RES_Palette)
			void Register				(FResourceType *Type);
			// Other functions...
			};

	Note that resource classes defined with RESOURCE_CLASS should be derived
	from UResource, and classes defined with RESOURCE_DB_CLASS should be
	derived from UDatabase.

	This has zero effect on how the resource subsystem works; I just had to
	move some stuff out of the macro for VC++ to recognize it.

Ammon:

	When GAudio.Init() is called in UnrealEd, the editor crashes when
	exiting about 50% of the time. When GAudio.Init() and GAudio.Exit()
	are removed (from Unreal.cpp) the problem goes away.  Please look into
	this; this kind of bug is scary.

	In USound::Register & UAmbient::Register, add the line:

		Type->TypeFlags = RTF_ScriptReferencable;

	This flag indicates that scripts are allowed to make references to that type of
	resource.

	I still need you to add a sound and music volume dialog (and any other audio 
	options you feel are needed in the UI) in the Windows project.  I put a stub dialog
	there, but it doesn't do anything yet.

	Note that I renamed BrAmbient.frm to BrAmbi (need 8.3 filenames).  If you've updated
	your file, just copy it over top to the new name.

	Pause and Unpause need a fadeout option so that audio can be paused and unpaused 
	unharshly.

Mark Randell:

	If you root.tcx is later than mine, make sure the Mover class contains the
	default property..
		Begin DefaultProperties
			DrawType=3
			...etc

	Config code:

		Please generalize your configuration-file code so that there's a nice
		general interface for reading and writing config values by
		topic, key, and value.  This will be handy in a lot of places.

	Note the new "Dim Me as Actor" definition in Root.tcx (and also in AActor).  This is
	a way for actors to figure out their own index easily (use iMe in C++).  This is the
	only change I've made to Root.tcx.  I also removed iActor from all AActor::Process 
	functions since that is now redundent.

	I added a Class property to SendMessage.  Set this to the class you want the
	message sent to, i.e. AShotgun could call SendMessage with Class=AWeapon
	to invoke parent processing:

		int	SendMessage(INDEX iActor,FName Message,void *Params,UClass *Class=NULL);

	NULL indicates 'use the actor's regular class'.

	Note vitally important changes to ActorDLLStartup in my code. This new prevents
	actor message names from being purged by GRes.Purge().

	How this impacts the UnActors.dll code:

		These are all the changes I've made in the actor code.  You should be able to merge
		our sets of coding by making only the iMe/iActor changes to your code; I didn't have 
		to make any other modifications to your code other than deleting the 'INDEX iActor' 
		from all ::Process functions and replacing 'iActor' with 'iMe'.

	How this impacts the engine code:

		You can see all of my iMe changes by searching for 'iMe' in the main Unreal files.  
		The really important ones are in ILevel::SpawnActor (which initializes iMe) and
		after all calls to ILevel::ImportActor (which fix iMe in case it was messed up).

	Check monster sizing.  Some monsters seem to be embedded in the floor in the version
	of Unreal I have (Skaarj especially).  This might not be the case in your version.

	Documentation for input system.  We'll need a text file describing any important 
	end-user aspects of the input system, including troubleshooting information for
	all known and anticipated problems, such as bugs in DirectInput.  This will
	later be laid out by someone else and included in the Unreal 
	documentation (on-disk or printed). A plain text file is ok.

	When I moved the code from UnrealWn.cpp to the Windows project:
		* I removed StoredKeys from UCamera - wasn't being used.
		* I moved the DirectMouse handlers over the FWindowsCameraManager.
		* Moved StoredMove, StoredPitch etc from UCamera.  These values can now
		  be obtained and reset from GCameraManager->GetStoredMove.  This is a
		  lot cleaner internally.
	I know this going to be a pain for you to update your input code (sorry!), but the
	UnrealWn code was just too much of a mess to keep as-is.  See the code in my UnInput.cpp
	for an example of how to use this:
		//
		// Local mouse movement
		//
		FVector			StoredMove;
		FFloatRotation	StoredRot;
		//
		GCameraManager->GetStoredMove(Camera,&StoedMove,&StoredRot);
		// etc

///////////////////////////////////////////////////////////////////////////////
5-30-96

+	Texture mapping experimentation

///////////////////////////////////////////////////////////////////////////////
6-1-96

+	Adapt mip transitions based on slope
+	Proper V-clipping
+	As optimized skip-in as possible
X	Cache lines rather than sides? -> Not useful, performance losses == gains.

///////////////////////////////////////////////////////////////////////////////
6-2-96

+	Functions
+		Use CPF_Initialized throughout
+		Parse 'function' & 'when' parameters as variable properties
+		Parse optional function return value
+		Optional params (params with default initializers), require to be last
+		Display function parameters in decompiler
+		Display optional function return value
+		String initializers either don't work or don't decompile
+		Allow Enums as constants
X		If function has return type, require Return as the last command -> Don't want to be forced
X			to decode the execution path to validate this.  If return isn't used, the function
X			returns the default value of its return type (i.e. zero, "", ZeroVector, etc).

///////////////////////////////////////////////////////////////////////////////
6-4-96

+	Scripting fundamental questions:
+		Can UnrealScript operate without a message queue? -> Yes, a message queue is only
+			needed for SendMessageDelayed and Hold/Unhold, but not for regular script
+			operation.
+		What happens if variable-time code calls a function which changes the state? -> State
+			transitions are made to the actor's FState and marked 'pending' but the permanent
+           thread's instruction pointer isn't updated right away.  Permanent-thread IP update 
+           occurs before each new variable-time command is grabbed in the Tick routine.
+		How is recursion and reentrancy handled? -> Via on-stack execution contexts

X	Rendering method of the day -> Slow
X		Draw-across with precision masked G continuous update, UV reload
X		Rect Mip Subdivider and separate drawer, triggered iff #mips > 0

///////////////////////////////////////////////////////////////////////////////
6-4-96

+	Conference calls all day long.  This is pissing me off beyond belief.
+	Got ATI Rage version of Unreal up and running

///////////////////////////////////////////////////////////////////////////////
6-5-96

+	Exit from server console with camera open causes appError
+		Due to Windows reentrancy crap with mouse/keyboard polls
+	appErrors in DirectDraw exit without closing log (Win16Mutex problem?)

+	Support 16 bpp 5-5-5 format on hardware
X	Support 16 bpp software rendering with cached 32K lighting lookup table -> l8r
+	HiColor and TrueColor font remapping right
+	Scrap TEXT_ junk
+	FColor HiColor() member
+	Must use Back-to-front sort order for 3D hardware

+	Triangle strips rather than simple triangles
+	Rage texture caching
+	Perfect u,v->s,t,w texture mapping
+	Hardware texture caching with fast 16-bit color remapping
+	Texture cache maintainer
+	Repair regular DirectDraw code

X	Rage mipmaps transitions look like hell without trilerp -> Wait for Rage 2

///////////////////////////////////////////////////////////////////////////////
6-6-96

+	Parse operators, enforce unary/binary relation and return type
+		Can only operate on one data type - all params and return values must be that type
X	Stack node iParent -> track in FState instead
+	IdentifierToC to handle weird operator chars
+	Figure out string passing to C, how to pass lengths -> Length is function specified
X	Maintain proper StackNodes in the script itself while compiling? -> Not needed
+	Make sure parent script stack nodes are never screwed with
+	When define a class node, function node, or state node, link in the parent class script's 
+		corresponding child links into its tree so that overrides can be determined with a fast 
+		linear search.
+	Function and event overrides are searched in the current state (for the current
+		script then all parents) and then the next lower state, in a fast linear search.

///////////////////////////////////////////////////////////////////////////////
6-7-96

+	Verify function uniqueness
+	Force overriden functions/when's to be parent/child/self-multi consistent
+	No function overloading
+	Root needs "Dim Me as Actor" (index to self)
X	NumParamProperties? -> Ditched it
+	When compiling script, error out if parent script is invalid
+	Force script make before play!
+	Make only care about script text crc to prevent linking from foiling make logic

+	Prevent function/when/operator clashing
+	No optional params in operators
+	Allow correct operator overloading, overriding, and overloaded overriding (bleh)
+	Compile all Script.txt operator definitions properly
+	Make must check Parent ScriptTextCRC

+	Manage code offsets properly everywhere
+	PopNest emit SC_END
+	Bogus instructions TestCmd and TestEval to test compile/decompile

///////////////////////////////////////////////////////////////////////////////
6-8-96

+	iMe, remove from messages
+	Changed FClassProperty.  PropertyType from DWORD to EClassPropertyType

+	TestEval expression evaluator: compiler and decompiler
+		All allowable constant types
X		Resources need to be typed in expr's? -> Not needed at the binary level
+		Global variables
+		Local variables
+		Variables with and without array subscripts
+		Parenthesis
+		Check operator fast requirement
+		Don't allow fasts to be overridden ever
+		Names either directly or as string constants
+		Function calls with exact-match: FToken::GetFunction
+		Regular and prebound fast function calls, get all emits right
+		Function call decompiler: EX_Function, EX_FastFunction
+		Allow overriding fast functions -> if overridden, prebound to nearest function in context
+		Unary operators, FToken::GetOperator

///////////////////////////////////////////////////////////////////////////////
6-8-96:	 Demo prep
6-9-96:  Wraparound
6-10-96: Microsoft
6-11-96: Interplay
6-12-96: Xatrix
6-13-96: Raven
6-14-96: Catch up, clean up, reinstall, business

///////////////////////////////////////////////////////////////////////////////
6-15-96

+	Added FGlobalPlatform::CheckMachineState
+	Added FGlobalPlatform::DebugBoxf
+	Removed sphere from bound
+   Added bound to brush
+	bspValidateBrush accept number param for level import status
+	Expand UModel to include DWORD flags, bounding sphere
X	4-align actor properties? -> No, root class definition is already aligned, and
X       misalignment penalty script properties is insignificant compared to script
X		execution overhead.

+	UnrealEd
X		Actor props form and results form needs a control box -> No can do with tool wins
X		Results window open up centered along bottom of screen -> Complex
+		Tex import, no "brighten"
+		Fixed AutoSave "Couldn't open file" error when run via shortcut
+		Fixed truncateing compiler result text when receives 2 blank lines together
+		Must refresh all script editor windows after load/import class/map
+		Opening multiple script editor windows tanks on exit
+		Help is lost from VB but sometimes works from edcam windows (weird)
+		Fixed UnrealEd crashing upon exit (message pump reentrancy bug)
+		Fixed texture panning loss
+		Still have an UnrealEd crashing on exit bug -> Ammon's (*#$&(#*&$#$#$@ bug
+		Does Unreal kill the timer before the server has a chance to exit? -> Yes
+		UnrealEd brush-load shortcut key
+		Smooth grid fading during zoom
+		Somtimes moving mouse with Tab down makes brush vanish
+			Windows bug: Holding Tab then pressing Ctrl generates a Ctrl-I which
+			UnrealEd interprets as the Intersect shortcut. Changed Intersect to Ctrl-N.

+	Added ICamera::GetOrthoNormal for getting camera view normal in orthogonal views
+	Added UModel::BuildBound for building brush bounds
+	UCamera::ResetModes() resets all stored movemements; called when player controls
+		are toggled to prevent stored movements from accumulating.

///////////////////////////////////////////////////////////////////////////////
6-16-96

+	UnrealEd
+		Wireframe mode optimizations
+			Don't draw solid FPoly slivers if far
+			Generates untransformed brush bounds in bspValidateBrush
+			Generate transformed bounds when placing/moving brushes
+			Replace rendDrawBrushFPolys bounds hack?
+			Brush bound outcode reject (3D) + ortho reject (2D)
+			Bound = intrinsic property of untransformed brush
+		Wireframe views are now 300% faster on average
+		Draw active brush as semitransparent
+		Fixed player being teleported to random place after pressing 'P' bug
+		Arrow brushes are being rejected unnecessarily
+		Need script editor find
+			Select 'find' text on open
+			Find dialog
+			Find highlight found word
+			Find & Replace
+			Find next
+		Go to error or to src if no error after script compile
+		Place message cursor on last line after compile
X		Remember camera mode so windows can be totally customized and saved in UnrealEd -> troublesome
+		Temporarily restored old lighting/shadowing code
+		Fix backdrop
+		Do not dither mipmaps

X		Use #ifdef RELEASE -> Only adds extra confusion
+		Check !!'s
+		Hid all unimplemented game options
+		UnrealEd lLight brightnesses back on par with UnrealEd 0.65

///////////////////////////////////////////////////////////////////////////////
6-17-96

+	Intel architects meeting

///////////////////////////////////////////////////////////////////////////////
6-18-96

X	Assimilate Mark's code -> No Mark's code to assimilate
+	Assimilate Ammon's code
+	Install License.doc viewer?
+		Bad window title
+	DirectDraw/DirectSound upgrade bugs. What a mess.

///////////////////////////////////////////////////////////////////////////////
6-19-96

+		Met with Microprose guys -> quite cool
+		FGlobalTopicTable::Exit wigs out on NT
X		Damn MMX detection install stub -> Later
+		UnrealEd on Windows NT?
+			Busted NT 3.51 detection
+			Fixed all NT incompatibilities
+		Lost results window in NT
+		Windows NT vs. 95 compatiblilty problems
+		Query available DirectDraw modes and fill menu according to 8/16/32-bit color
+		Hide all DirectDraw modes if unavailable
+		Hide DispDib if NT

///////////////////////////////////////////////////////////////////////////////
6-20-96

+	Intel VX wish list. That thing will truly ROCK!
+	Fast mymemset() function - use this instead of memset() if performance is critical
+	Bilinear chroma/lumina texture mapper - very promising, needs speed
X	Player tick framerate at 70 fps?

///////////////////////////////////////////////////////////////////////////////
6-21-96

+	Check out BSP rebuild bugs - bounding bug? -> Fixed
+	Cut down 2D map view clutter
+	Duplicate actors add an X&Y offset
+	Mover drawtype default to DT_Brush
+	In UnrealEd, also draw sprite for DT_Brush things
+	Show movable brushes in 2D views
+	UnrealEd XYZ editor, Z is screwed up
+	UnrealEd rotation editor
+	Console->Log
+	Need map load NoRefresh=on
+	First alt keypress screws up
+	Set focus to camera window on startup
+	Fixed DispDib bugs
+	Log doesn't crash if not initialized
+	Way optimized line drawer in map view
+	Implemented FGlobalCameraManager

///////////////////////////////////////////////////////////////////////////////
6-22-96 + 6-23-96 (Marathon)

+	Removed all Windows code from UnEngine to UnWn
+	Unreal resources are now all IUnknown-derived component objects
+	Fixed up RESOURCE_CLASS macros so they don't hose the VC++ class browser
+	Mouse and keyboard responsiveness now rule

+	Clean up render class
+		Moved stuff to FGlobalRender
+		Changed BspPoly to BspSurf
+		Stuck CmdLine in FGlobalPlatform
+		Scrap global variables
+		All windows.h dependencies out of Unreal
+		All editor code out of Unreal to GEditor
+		All edcam stuff belongs in GEditor
+		All bsp stuff belongs in GEditor

+	Moving brushes
+		Show moving brushes in a special color in edit views
+		Display brushes wireframe
+		Associate brushes with actors properly

+	Unreal 0.75 goals
+		All windows code separated into Windows project
+		All windows/hardware support code ready for beta feedback
+			DirectDraw support
+			DirectSound & Galaxy support
+		Resource purge in place

///////////////////////////////////////////////////////////////////////////////
6-24-96

+	Rewrote all DirectDraw support
+	Moved all Windows-specific code over to new classes
+	Windows code is finally clean and easily sharable
+	Cleaned up DirectMouse support
+	Improved mouse responsiveness
+	Updated GRenDev code to be modular
+	Added 'PlayerEntered' message, sent to zone descriptor when player enter
+	DirectDraw palettes
+	Mesh view realtime controls
+	Line Case 2 crash

///////////////////////////////////////////////////////////////////////////////
6-25-96

+	DirectDraw mode recognition and menu update after set truecolor/not
+	DirectDraw crash handler
+	Changed iPoly to iSurf
+	Fixed awry Zone messages
+	Fixed major sidelink bug that showed up in Dark
+	All UnrealEd code is externalized
+	Camera is now a Pawn
+	All configuration goes into
+	Added FGlobalPlatform GetProfile, SetProfile
+	Password check
+	New DirectDraw support seems very stable

///////////////////////////////////////////////////////////////////////////////
6-26-96

+	Completely separated editor from game
+	Added Console.Messagef
+	Unreal now handles APM messages properly, a major breakthrough in gaming...NOT!
+	Game works consistently with NULL GEditor

///////////////////////////////////////////////////////////////////////////////
6-27-96

+	Unreal source 0.75 post and last-minute fixes

///////////////////////////////////////////////////////////////////////////////
6-28-96

+	Created virtual FGame class to enable moving all game-specific stuff to DLL
+	Moved all player console stuff to Actor DLL (UnPCon.cpp)
+	Renamed Unreal.cpp to UnEngine.cpp
+	Renamed Actors project to Game project for clarity
+	Renamed UnActors.dll to UnGame.dll
+	Renamed UnrealEd.dll to UnEditor.dll
+	Now use \Unreal\Src\Lib directory for link libraries
+	Separated game rendering from editor rendering
+	Unreal is now 100% portable; just rewrite the Windows-project code

///////////////////////////////////////////////////////////////////////////////
6-29-96

+	Moved global actor functions like playerTick to GGame::PlayerTick
+	Camera console
+		Bring up, put down - overlapping
+		Pre and post render camera for proper sizing
+		[ ] keys scale screen border

///////////////////////////////////////////////////////////////////////////////
6-30-96

+	Camera console
+		Two-piece status bar
+		Only draws status bar when changed
+		Resizable window with variable stride
+		Implemented FOutputDevice, cool generalization of text output device
+		Merged all CON_xxx messages with LOG_xxx, now they're all LOG_
+		Completed the camera console code

///////////////////////////////////////////////////////////////////////////////
7-1-96

+	Refined console controls
+	Command handlers

+	Ole exec handler calls proper exec sequence
+	Command line handlers:
+		FGlobalPlatform::Exec
+		FCameraManager::Exec
+		FGlobalServer::Exec 'levels','players'
+		ULevel::Exec: Must implement up, down
+		FGlobalRender: stats, toggle, gamma, dither modes
+		UCamera::Exec: Implemented possess
+		FEditor::Exec: Return values and response handlers all implemented
+		Moved general purpose stuff out of EdSrv, into proper places
+		GGfx.Printf now clips to screen
+		Added VARARGS define for portability
+		Added GGfx.WrappedPrintf,GGfx.WrappedStrLen
+		All console I/O now word wraps
+		Added in console background texture

///////////////////////////////////////////////////////////////////////////////
7-2-96

+	Viacomm

///////////////////////////////////////////////////////////////////////////////
7-3-96

+	Replaced FDot with operator|
+	Replaced FCross with operator^
+	ATI Rage support rocks once again
+	Polished DirectDraw support for weird resolutions

///////////////////////////////////////////////////////////////////////////////
7-4-96

+	Happy 4th of July
+	Added exec support and status functions to NManager
+	NManager is now polled, and it polls NDrivers
+	Implemented Task manager init and exit
+	Implemented camera manager task
+	Can now telnet into UnrealServer and access server console directly

///////////////////////////////////////////////////////////////////////////////
7-5-96

+	Login & optional password from ini file
+	Prioritizes multi camera updates
+	Standard console spawn message
+	Net game setup
+	UnrealServer task

///////////////////////////////////////////////////////////////////////////////
7-6-96

X	3D Studio exporter -> No time for this!

+	Highlight scaled sprites properly
+	Fix scaled sprite positioning
+	Fixed camera prekill bug exiting UnrealEd
+	No filtering stuff like status bar
+	Use blit type
+	Editor - show moving brushes option in 3D views
+	Renamed bClassPureVirtual to bTemplateClass
+	Fadein glitch
+	Changed actor 'TagName' to 'EventName'
+	Debug version now compiled with asm
+	Scaled sprite drawing bug in TRasterSetup::Generate
+	EdTopicHandler::Get crashed after selecting texture
+	Changed bSpriteRope to bEventSource
+		Actors who often trigger events corresponding to their EventName
+		tag should have their bEventSource flag so that event lines may
+		be drawn between event sources and event sinks in UnrealEd.
+	No 'show grid' thing
+	Hide default brush when in actor modes
+	TRasterSetupT::Generate crash (Start=373, End=3497) -> Fixed! (Interval error)
+	Show event lines in actor modes - better color
+	Texture rotate mode
+	Added 'Diagonalize' option to poly props for rotating 45 degrees while keeping
+		original tiling size (Inoxx request)
+	Scale textures - can now enter expressions in the poly properties thing
+	Added '@' square root operator - enter '@2' for the square root of 2

+	Moving brushes continued:
+		Update properties: BaseLocation, BaseRotation, ShadowKeyPos
+		When drawing mover in ed, draw both sprite and brush
+		Added REND BRUSHWIRES command
+		Select brushes by actor or brush
+		Wire render with proper location and rotation
+		Mover has default brush
+		Brush set from current set location & rotation upon draw
+		All wireframe brush movement code + trigger interactions

///////////////////////////////////////////////////////////////////////////////
7-7-96

+	Odd bugs that seem to have disappeared
?		Log window fills up after a while and doesn't clear itself
?		Snapscale doesn't snap when scaling down, only up
?		Actors are disappearing in unzoned texture views for no reason
?		Unreal.exe sometimes forgets to shut down after UnrealEd exits -> Fixed?
?		texGetOriginalData 56 Basicw2a, 128x128: Error -> Fixed symptom, why problem??

+	Observations
+		High temporal resolution makes up for low screen resolution
+		Nyquist-limit is irrelevant in light of high temporal resolution
+		Computers are still slow

+	Fixed actor QueryReferences bug
+	Added Editable(Category) override to UnrealScript
+	Actor properties are now categorized to reduce clutter
X	Remember actor props to edit between sessions -> Not very useful
X	Sort actor properties in list? -> Too much work
X	Duplicate actor - create duplicate brush -> Want brush defs to be shared
X	Scaled sprites wrap slightly, ugh -> Art problem

+	Fixed mesh viewer movement
+	Fix key delay in realtime views
X	Show moving brushes regardless of 'show actors' setting
+	Fixed can't scroll down to last 1.5 elements in UnrealEd actor props bug

+	Fixed switching to camera mode doesn't clear snapscale mode
+	Tex browser trivial Y reject - shouldn't be so damn slow
+	Tex browser sorting optimization, now uses qsort -> *big* speedup
+	24-bit color editor backdrop is only 1/4 drawn
+	Are actor rotations lost on export/import? -> No

+	"Use current brush" - make a duplicate with a unique name
+	Reduced bilinear filter aliasing by 50%!

///////////////////////////////////////////////////////////////////////////////
7-9-96

+	Microprose Unreal license discussions
+	These are really cool guys

///////////////////////////////////////////////////////////////////////////////
7-10-96

+	Caught up on sleep. Aaaaaaaaah.
+	Scaled sprites are now just textures
+	No networking 'n stuff in UnrealEd
X	Task always needs an exec function?
+	Still tries to draw screen when SYR=0, when status thing is down

+	Net
+		Fixed telnet tasks aren't killed when they exit bug

+	Texture improvement and fixing:
+		Implemented ITexture for locking/unlocking textures
+			Can call GRenDev for hardware-specific locking features
+			This replaces and obsoletes UTexture::GetData

+	More moving brush logistics

///////////////////////////////////////////////////////////////////////////////
7-11-96

+	Actors need:
+		AActor->IsBrush()
+		AActor->IsMovingBrush()
+		Added ACTOR_PostEditMove message

+	Mo' moving brushes
+		edactMoveSelected be cognizant of moving brushes
+		Moving actor must move the associated brush with grid snapping
+		Fix gridsnapping
+		Moving brush around must update keypos delta from pos 0
+		Select pivot must update actor
+		Mover KeyPos and KeyRot are now uneditable

+	Freeform texture rotation
+	Arbitrary angle texture rotation mode + entry thing -> No entry thing

///////////////////////////////////////////////////////////////////////////////
7-12-96

+	Separated rendering code into separate DLL

///////////////////////////////////////////////////////////////////////////////
7-13-96

+	Optimization

+	General
X		Duplicate actor must duplicate brush -> Use same brush
X		Adding actor of Mover type must duplicate its default brush -> Use same brush
X		Clicker for nice editing of brush frames? -> Key position selector instead
+		When add mover, its default brush is in siberia
+		Mover actor sprites aren't sorted right in 3D views
+		Mover color should be green!

+	UnrealEd
+		Right-click on mover show Keyframe -> 1/2/3/4 popup
+		Add as moving brush icon!
+		Adding actor imm after UnrealEd starts doesn't set class!

+	Add as moving brush
+	Map edit copy to/from brush copy everything and update bounds
+	Add as moving brush copy brush rotation to actor
+	Perfect moving brush editing
+	Fixed dynamic lights are immensely brighter than lights with shadow maps
+	Stats to Render project
+	Stat grabbers on
+		Raster setup
+		ASM texture code
+		Lattice setup
+		SpanOccludeBSP
+	Fix stats

+	Optimizations
+		mymemeq -> memcmp
+		ftoi
+		timer funcs

///////////////////////////////////////////////////////////////////////////////
7-14-96

+	Rewrote moving brush code

+	AddBrush
+		Build transformation coordsys
+		Set surface vectors
+		Perform fpoly filter
+		Add sporadic node
+		VertPool logic
+		Permanent base point logic
+		UniquePlane logic
+		NF_IsNew logic set & cleanup
+		Why is brush being split by nonexistant stuff? -> fixed ftoi bug

+	Rover optimization

///////////////////////////////////////////////////////////////////////////////
Requests

Art crue:	
	Tweak both status bar graphics in game (need \Unreal\Graphics stuff)
		Brightness (is too bright as is)
		Appearance in 320x200 and 640x480
	Overlay sprites for status bar
	Number font
	Border texture for screen
	Background texture for console
	Need a great font (see \Unreal\Graphics\Medfont.pcx for format)
	Need Unreal icon (use VC++'s icon editing tools), needs to be *awesome*
	Logo???
	Need moving brush textures
		Buttons/Switches
		Doors

Level mappers:
	Use the 'unlit' tag on all big polygons that the player isn't supposed to
		see (such as the polys in the big cube you subtract your level from).
		The shadow maps on these polys are eating up over 200K in some levels.
	Really, really cut down on the number of lights hitting each polygon; this 
		is hurting performance dramatically in wide open areas.
	Use the NoLook tag a lot to prevent crazy view tilting.
	Use zones and portals! Big big speedup.
	Set bDirectional to false for all of your lights to get rid of the red arrows.
	For best performance, divide your levels up into 63 or fewer zones.  The more,
		the better, up to 63.  After 63, more zones = slower.
	Please report all crashes...trying to get everything 100% stable now.
	Moving brushes eat up CPU time whenever they move, so design them to only move
		when the player sees/affects them.  Moving brushes that are moving all
		the time are going to slow big levels down.
	Suggest useful moving brush options to build into Unreal.
	When dividing levels up into zones, it's a good idea to place portals 
	    in places where they'll be covered up by moving-brush doorways.
		This does two things: it improves performance when the doors are closed,
		and it will later enable sounds to be diminished when they occur behind
		closed doors (the flow of sound will be computed between zones based on
		whether the zones are physically connected or blocked off).
	Comment on Unreal 0.76 lighting brightnesses -- to bright? too dark?

How to place movable brushes: 

	Build a brush, or load one.  Click on the
	add-movable-brush icon on the top right side of the toolbar.  This adds
	to movable brush to the level.  Moving brushes consist of two
	separate things - the actor that controls it, and the brush you see.
	
	Now, you need to define its positions. Movable brushes can contain up
	to four positions, but only positions 0 and 1 are useful until
	scripting is complete.  Position 0 is "closed" and position 1 is "open".
	
	Select the moving brush's actor and select the move-actor icon on the
	toolbar.  Now place it where you want it to appear in the level in its
	"closed" position.

	Next, right-click on the moving brush's actor and set its to position
	1 (the second choice in the popup menu).  Now move the brush into its
	"open" position.  To see that the brush is placed properly, set it back
	to position 0 and verify that it moves back to where you originally
	placed it.

	Now, you need to say how the moving brush should respond to events
	that occur in the world.  Right-click on the moving brush's actor,
	select "Mover properties", and navigate to the "Mover" category.
	The interesting properties are:

	- MoverBumpType: Says what the moving brush should do when it's
	  moving and it's blocked by an actor.

	- MoverTriggerType: Says what events cause the mover to open and close.
	  The "proximity" options activate the mover when the player gets near
	  it (you'll need to go to the "Collision" category and set the mover's
	  collision radius to specify the exact proximity). The "trigger" options
	  cause the over to be activated by one or more external "Trigger" actors
	  with a matching "EventName" property.  For trigger options to work, 
	  you'll need to place one or more trigger actors in the level and adjust
	  their collision radius and EventName.

	- MoverGlideType: Says whether the mover should move abruptly, or
	  smoothly accelerate as it moves.

	- KeyNum: The current keyframe position you're editing.  Changing this
	  is equivalant to right-clicking on the actor and setting its keyframe.
	  Only positions 0-3 are valid.

	- MoverTime: The amount of time in ticks (1/35ths of seconds) that the
	  mover should take to move between its open and closed positions.

	- RemainOpenTime: How long the mover should remain open before
	  automatically closing.  Only has an effect if MoverTriggerType is
	  "ProximityOpenTimed" or "TriggerOpenTimed".

	- bCanInterruptMove: Says whether the mover can be interrupted and
	  ordered to reverse its motion while it's moving.

	- OpenSound: The sound effect that should be played when the mover
	  is sent to its open position. (No effect yet).

	- CloseSound: The sound effect that should be played when the mover
	  is sent to its closed position. (No effect yet).

	- MoveAmbient: The ambient sound to play while the mover is in motion.

	- FreeRotation: No effect yet.
	
	Position 0 is also the master keyframe; when in position 0, you can move
	and rotate the brush freely.  All other keyframe positions are relative
	to position 0.  When you want to place the moving brush somewhere in the
	level, make sure it's set to position 0.  When you want to set its other
	keyframes, go to the other positions.

How to easily replace your existing brushes with moving brushes: Go into map
	edit mode.  Select the static brush that you want to turn into a moving
	brush and make sure no other brushes are selected.  Click on the
	"Copy to brush" button, then the "Delete" button.  Now press the
	add-movable-brush icon on the toolbar.

Mark Randell:
		I moved a bunch more game-specific code over to the actors DLL:
			- The camera console (UnPCon.cpp) is now UnCon.cpp.

		The game-specific code now is called by the Unreal engine via several
		functions defined in FVirtualGame (the generic, virtual base class defined
		in the engine) and FGame (the specific class defined in the DLL), rather
		than via the ActorDllStartup routine.

		I renamed UnActDll.cpp and UnActDll.h to UnGame.cpp and UnGame.h for clarity.

		The GGame object (of class FGame) is now accessible throughout the Actors Dll.

		I moved global actor functions like playerTick to GGame::PlayerTick for clarity.
		This has no effect on their implementation.

	All CON_ enums were changed to LOG_ enums. Use LOG_Play instead of CON_Play.

	Need settable options (similar to keyboard/joystick/mouse options) for:
	 - Whether the player's view should automatically tilt when the player is
	   standing near an upward slope (such as stairs).

	For PlayerStart actors, bDirectional should be True.

	Can we have a bunch of useful game cheats?  These would go somewhere in the
	game DLL.  A few I can think of are...

		Health
		Gain weapon by name
		Morph into by name
		Ammo cheats
		Health
		Invincibility
		No collision
		Morph <pawn name>, freemove, hideme, showme, trigger, untrigger

	Discuss fractional player view movement.

	Note that I replaced the dot product function FDot with the | operator.
	So FDot(A,B) becomes (A|B). FCross is now ^.

	I made the following changes to your Root.tcx:

		* Changed EDamageType to:

			EnumDef ETextMsgType = LOG_None

		* Added "property editing categories" to all editable root properties. For
		  example, I changed

			Dim Class as Editable(Main) Class

		  to

			Dim Class as Editable Class

		  The "Editable(CategoryName)" says which category tab the property should
		  appear in in UnrealEd.  This affects editing display only and has no effect on
		  operation.

		* Removed the "editable" override from all properties that don't need to
		  be edited in UnrealEd, such as AnimBase.

		* Changed unused bSpriteRope to bEventSource to indicate which actors are
		  sources of events (for UnrealEd's display of event affector lines).

		* Added spaces ad blank lines for readability

		* Changed bClassPureVirtual to bTemplateClass for readability

		* Made numerous changes to Mover

	Changed UNACTOR_API to UNGAME_API

Ammon:

	Need volume controls

	In your sound browser's DoNext(), change "Hide Me" to "Unload Me" - otherwise
	UnrealEd refuses to unload because a hidden form is still active (that explains
	why Unreal wasn't unloading for you eh).

///////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////
7-15-96

+	Moving brush code cleanup & enhancement

///////////////////////////////////////////////////////////////////////////////
7-16-96

+	Moving brush optimizations

+	FlushBrush
+		Remove all sporadic stuff
+		Remove iFront, iBack, iPlane references
+		Debug fully
+	Fast SplitPolyWithPlane

+	Fixed nasty massive collision CPU overhead bug in SphereLeafFilter

///////////////////////////////////////////////////////////////////////////////
7-17-96

+	Fixed hairy bug preventing ACTOR_Touch from being recognized

+	Added NF_Bounded
+	Fixed flush all
+	Multibrush coordinated move
+	Fixed moving brush coplanar collision bugs
+	Check moving brush BeginPlay for position 0 forcing
+	Fix actor-actor collision near moving brushes
+	Build list of dynamic actor refs removed, then readd those actors

+	NF_UniquePlane
+	Scrap dynamic iUniquePlane tracking
+	Fix brush startup errors

+	Note: You can't spawn moving brush actors during gameplay. This is as intended.

+	Optimize finding actor nodes
+	Fixed opposing coplanars bug
+	NewVertPoolIndex: TopThing inconsistency
+	No max changing
+	Fixed bizarre overflow bugs
+	Precompute filter (standard UnPhys function) 
+	Debug precompute filter problems
+	Optimize precompute filter
+	Faster FPoly/FBspSurf traversal via edpoly refs

+	Import map with moving brushes overwrites level brushes with movable actor brushes.

///////////////////////////////////////////////////////////////////////////////
7-18-96

+	Added these actor messages and their root handlers:
+		SetParent			Sets this actors parent to the specified actor
+		GainedChild			Sent to a parent actor when another actor attaches to it
+		LostChild			Sent to a parent actor when another actor detaches from it
+		QueryChildActors	Causes kernel to call QueryActorCallback for all child actors
+		QueryEventActors	Causes kernel to call QueryActorCallback for all actors using an event
+		QueryNameActors		Causes kernel to call QueryActorCallback for all actors using a name
+		QueryCallback		Called by kernel in response to query messages

+	Standardized torture test, SLOW_GUARD
+	Handle server slowdown to <35 fps gracefully
+	Fixed console up/down is hosed
+	Mover bounding sphere prefiltering

+	Wasted huge amounts of time incorporating code changes
+	Nevermore

+	Note: Now using the __cdecl calling convention rather than __fastcall.

+	Cleanup directories
+	Cleanup headers
+	Cleanup source
+	CreateDibSection failures show out of memory error

+	Fixed mem overwrite in UnActLst.cpp
+	Fixed mem overwrite in UnWnCap.cpp
+	ActorList PostLoad snubs out NoSaveResource entries
+	Get Unreal working in the VC++ debugger again

///////////////////////////////////////////////////////////////////////////////
7-19-96

+	Remove UnRender.dll dependence from Game
+	Fix rendering msec
+	24-bit color status bar (hopefully) or force disable it
+	Player control in UnrealEd shouldn't call moving brush update
+	Running two copies of Unreal causes shared DibSection bug
+	Disable networking
+	Delete netplay menu if no networking!
+	DD install doesn't reboot if it should
+		Worked around the buggy Intel example install code that was meant to
+		work around the buggy Microsoft example install code.
+	Equalize brightnesses with 0.65!

+	Cleanup tcx
+	Cleanup log

+	Can now reference sounds in actor properties
+	DD choices disappeared - fixed

+	Tim Chalmers "Can't find Buffer Sinc" bug
+		Not a bug, was due to installing over top of outdated Unreal.gfx

///////////////////////////////////////////////////////////////////////////////
7-20-96

+	Slept

///////////////////////////////////////////////////////////////////////////////
7-21-96

+	Texture mapping optimizations & experimentation

///////////////////////////////////////////////////////////////////////////////
7-22-96

+	Overwrite (or overread) UBuffer "Shade"

+	UnrealEd
+		Polygon properties are now Surface properties
+		If load map and then try to get help, can't find UnrealEd.hlp
+		Rebuild installation

+	Consolidate all setup/rel files into one place

+	fix odl

+	.tcx & actor changes (Search for !!TIM for changes)
+		Added "Dim Floor as actor" to denote the moving-brush floor the player is on.
+		Expanded IModel::ZCollision to find moving brush actors are standing on
+		Added ACTOR_StandMover, ACTOR_UnStandMover for actors on moving brushes.
+		Added ACTOR_SteppedOn, ACTOR_UnSteppedOn for moving brushes.
+		Support MT_StandOpenTimed

///////////////////////////////////////////////////////////////////////////////
7-23-96

+	Lock level should lock moving brush tracker?
+	Crap

///////////////////////////////////////////////////////////////////////////////
7-24-96

+	More crap

///////////////////////////////////////////////////////////////////////////////
7-25-96

+	Note: Texture U and V "vectors" are actually planes, not vectors

+	Moving brush raytracing
+		ACTOR_PreRaytrace, ACTOR_PostRaytrace
+		ACTOR_RaytraceBrush, ACTOR_RaytraceWorld
+		If WorldRaytracePos=-1, raytrace world without brush
+		Raytrace world with brushes in their specified places
+		If BrushRaytracePos=-1, treat brush as unlit
+		Generate brush shadow maps

+	Need a USE key and USE triggers.
+	"Unreal maps (*.unr) | *.unr; All Files (*.*) | *.* ||"
+	"Unreal maps (*.unr) | *.unr; All Files (*.*) | *.* ||"
+	The semicolons should be vertical bars. Cheers ... Mark
+	FBspSurf: Changed Reserved to iActor

///////////////////////////////////////////////////////////////////////////////
7-26-96

+	Fixed those AScript::Process bugs James found

+	Now:
+	   Name = This actor's name
+	   EventName = Name of actors to send Trigger message to when event occurs

+	Split UnThings.cpp into UnThings.cpp and UnTrigs.cpp
+	Deleted bEventSource (not needed anymore)
+	bTriggerOnceOnly
+	Trigger messages include original triggering actor as PTouch param
+	Counter messages

+	Bigman is full of holes! Obey what meshmap data says.
+	Fixed mesh ambient brightness

X	Mover sounds -> damned sound system is broken again

///////////////////////////////////////////////////////////////////////////////
7-27-96

+	Took a day off and watched the Olympics...Cool stuff!

///////////////////////////////////////////////////////////////////////////////
7-28-96

+	Screwed up dlls, not an Unreal bug:
+		>More often than not Manual Texture Panning locks up.  Only response from
+		>While scrolling texture browser UnrealED crashes with a Run Time error: Ole
+		>Divide Overflow.  Followed by system wide crash.  Only recourse, Hard Boot.
+		>Log posted on FTP.
+	Fixed curved staircase window screwed up
+	Ctrl + left-mouse is brush movement!
+		>"Ctrl + L-Mouse" is camera eye movement.  No crash just annoying.

+	Just don't do this, why would you ever want to do this?	
+		>When I export a level from 0.65 into a .t3d file and then import it into 
+		>.76, rebuilding the geometry somehow joins together certain coplanar 
+		>polygons.  This normally wouldn't be a problem, except that these 
+		>polygons have differently oriented texture maps.  When joining them 
+		>together into a single polygons one of the textures become hopelessly 
+		>misaligned.  Since there is now a single polygon instead of two, it is 
+		>impossible to ever realign the polygons without cutting out the 
+		>offending pieces and readding them to the world so that they are 
+		>separate polygons. This error is 100% repeatable.

+	I don't see this problem, is it fixed?
+		I sent the original seti.t3d freshly converted from .75 to let you see the
+		original problem.

+	Fixed mipmap generation bug visible in IRON_F_1
+	Defuzz shadows
+	Logo misalignment on mode switch (centers?)
+	Fixed shadow alignment bugs on Inoxx levels (panning bug)

+	UnrealEd
+		If >1 mover is selected, still allow set keynum
+		Help Web -> Launch Web

///////////////////////////////////////////////////////////////////////////////
7-29-96

+	UnrealEd
?		Import brush bugs with active brush disappearing?
?		Eric Reuter saving brush hangs
X		Deintersect memory leak? -> Definitely not.
+		Ambient brightness overflows
+		Fixed Danc coplanar merging bug
+		Don't merge polys with disoriented textures or flags
+		Fixed UnrealEd not remembering last directories
+		Fixed major import-level memory leak (UActorList::Import)

+	Deleted bWorldShadows

///////////////////////////////////////////////////////////////////////////////
7-30-96

+	Optimization
+		Fixed dynamic lighting slowdown bug
+		Test Unreal 0.76 flatshade pipe & stats against 0.65
+		Copied player lighting settings from 0.65
+		Optimize bound rejection

+	UnrealEd
+		Light props got Invalid Row Value

///////////////////////////////////////////////////////////////////////////////
7-31-96

+	Don't check touch etc for bStatic things
+	BeginPlay turn off actor collision for all non-colliding movers
+	Fixed new mover box rejection bugs due to bounding boxes not reflecting hulls

///////////////////////////////////////////////////////////////////////////////
8-1-96

+	Optimization
X		Dynamic lighting per mesh not lattice -> Augh, much too slow!
+		Rasterizer setup
+	Reenergized

///////////////////////////////////////////////////////////////////////////////
8-2-96

+	Import textures merge with existing palettes
+	Check out collision for all classes
+	Stat for counting dynamic lights active
+	Asm lattice setup -> Way faster
+	512-byte mipmap table

+	Timing: Thrashing 64K takes approximately 1 msec

+	VC++ bug: Allows meaningless declarations like static const X[2]={0.1,0.2};
+	VC++ returns floating point result in st(0) with all other registers cleared

///////////////////////////////////////////////////////////////////////////////
8-3-96

+	Work around retarded C assymetric float rounding
+	Fast ftoi
+	Need /QIfdiv- switch
+	Test without GUARD & Stats
+	Subdivision error threshold - more sensitive to large stuff, less to tiny
+	Look at generated code

///////////////////////////////////////////////////////////////////////////////
8-4-96

+	Lighting optimization
+	First generate subrect span buffer and sublattice span buffer
+	Then generate rect spanbuffer and lattice span buffer from subrect

+	Notes
+		Note that fxch is virtual and does not stall even if source or dest are piped
+		FP and int instructions do not pair ever
+		fxch stalls 1 cycle if followed by int
+		Pentium caches are only 2-way associative, 128*2 sets (Pentium), 256*2 (MMX)
+		BTB only changes prediction if it misses two times in a row!
+		The deal with uncached write buffering:
+			Pentium has two write buffers, one for each pipeline.
+			* Therefore it makes sense to do consecutive writes in opposing pipes.
+			* Writes always are written out sequentially.
+			* Uncached reads wait till the write buffers are depleted before occuring.

///////////////////////////////////////////////////////////////////////////////
8-5-96

+	Generate & cache bogus power-of-two floating light meshes for testing
+	Do lattice setup for light mesh
+	Damned fast C descention texture mapper

///////////////////////////////////////////////////////////////////////////////
8-6-96

+	New *perfect* alias-free lighting method works
+	Sinc filter interpolator

+	Fixed:
+	>I was trying to figure out why my projectiles bounced oddly: they would
+	>bounce okay when they struck a wall with a particular orientation (normal
+	>along the x-axis) but they would stick to the wall with another
+	>orientation (normal along the y-axis). This behaviour has been in unreal
+	>for a longggg time (I remember when the floating eyeball would get stuck
+	>on walls). I traced the problem to FVector::Mirror, where a local
+	>OutFactor is defined as 2*x*normalx + y*normaly + z*normalz when it should
+	>be 2*(x*normalx y*normaly + z*normalz). Cheers ... Mark

///////////////////////////////////////////////////////////////////////////////
8-7-96

+	Hellish optimization
+	Properly Y-traverse sublattice including top skip-in
+	Update vertical properly as draw-across
+	High level optimize LightGen
+	Bilerp light mesh sampling in rendDrawAcross (C)
+	High-level optimize rendDrawAcross and prepare for asm port
+	Further optimize for clip -> draw many -> clip

+	Caveat: VC++ inline assembler assumes that registers aren't modified 
+	unless you explicitly reference them - wreaks havoc when calling masm
+	functions that modify unexpected registers.

///////////////////////////////////////////////////////////////////////////////
8-8-96

+	Asm inner loop
+	Major caveat: shr reg,32 and shl reg,32 don't affect reg (shifters are mod 32)
+	Fixed major bug in shadow smoothing which ridiculously oversmoothed shadows (oops!)
+	Optimized tmapper inner loop
+	Devised new CV clipper rendering scheme with 100% optimal rejection characteristics!

///////////////////////////////////////////////////////////////////////////////
8-9-96

+	Schedule wrap-around
+	Travelled to Waterloo

///////////////////////////////////////////////////////////////////////////////
8-10-96

+	Fixed UnrealEd not recognizing PF_Hurt
+	Reinstated adaptive dithering
+	Added TouchPlayerDamange to mover class - if nonzero, mover radius-damages 
+		player when they touch.
+	Clean up dithering setup
+	Fix Nonasm

///////////////////////////////////////////////////////////////////////////////
8-11-96

+	Statistical trilinear interpolation approximation
+	Properly handle textures >256 wide
+	Reduce trilerp overhead via only transitioning 1/2 of the time
+	Only setup referenced mipmaps
+	Brush origin is now highlighted if the brush is stretched or scaled
+	Use PRoutine for draw-across
+	Fix lighting undergen
+	Light presetup
+	rendDrawAcross skip-in
+	rendDrawAcross post effects via separate buffer
+		Blit
+		Masked
+		Blend
+		Masked blend
+		Fire

///////////////////////////////////////////////////////////////////////////////
8-12-96

+	TMapper optimization
+		Asm span loop
+	John Romero

///////////////////////////////////////////////////////////////////////////////
8-13-96

+	Slept

///////////////////////////////////////////////////////////////////////////////
8-14-96

+	Fixed line bug
+	Typing blank name in ed should change to none
+	Fixed small sprite bug
+	Fixed John/Inoxx FlushActorBrush bug
+	Refixed DirectDraw bugs
+	Added bTriggerOnceOnly to Mover
+	Jeremy War overflow bug
+	Goddamned DirectDraw mess

+	Fixed crashes in complex maps
+	Unlit stuff died
+	Asm trilerp
+	Lighting assymmetry?
+	Better smoothing to reduce aliasing

///////////////////////////////////////////////////////////////////////////////
8-15-96

+	Fixed moving brush triggers bTriggerOnce bug (War)
+	Lattice optimization

///////////////////////////////////////////////////////////////////////////////
8-16-96

+	Returned to USA
+	Travelling sucks

///////////////////////////////////////////////////////////////////////////////
8-17-96

+	Set up dual P6, installed new network

///////////////////////////////////////////////////////////////////////////////
8-18-96 to 9-8-96

+	Hardcore optimizing texture mapper, logs disabled.

///////////////////////////////////////////////////////////////////////////////
9-9-96

+	Merge textures to improve L2 cache performance and reduce code cache dumping
+	Investigated Java as an UnrealScript replacement - not commercially worthwhile

+	To display a message when compile with _DEBUG only, use debug(LOG_Debug,...) or debugf(LOG_Debug,...);
+		Mark, specifically see that I changed the code in UnPlatfm.cpp to reflect this.
+	Deleted bug() macro (use debug() instead)

+	Switched back to __fastcall calling convention (rather than __cdecl) for speed.  It's 2-3% faster.

+	Fixed GRend.Toggle bug in editor

X	Only 2 lines not 4, use 4 horizontal ditherbases
+	Optimize selfmod setup
+	PF_LowShadowDetail, PF_Dirty
+	Generate correct static light meshes

+	Light mesh alignment problems on large polys -> Stupid programmer!
+	Creature clipping bugs
+	Fix high shadow detail

+	Fix >400x300 bug
+	Added Camera->Caps and CC_ enums (CC_Hardware3D, CC_RGB565)
+	RGB 555 and 565 color detection and support with DirectDraw
+	32-bit color support
+	24-bit color support
+	Cut ASM selfmod overhead with 4 routines and minimal writes
+	Fast start and end clipping with conditional byte writes jump-in

X	Doing lighting incs before looking? Aliasing looks as if this is the case -> Looks ok

///////////////////////////////////////////////////////////////////////////////
9-10-96

+	Optimize setup
+	Organize, cleanup & comment, real subsystem init/exit
+	Asm light 4-averaging code (faster)

///////////////////////////////////////////////////////////////////////////////
9-11-96

+	Add special brush "invisible" option for collision-only brushes
+	Registering a new ShellExecute verb as the handler for a particular protocol
+	Cleanup & optimization

///////////////////////////////////////////////////////////////////////////////
9-12-96

+	All tasks are now timed, and stats are available in 'ps' command
+	Server tick time is shown when 'STATS' are on
+	Upgraded angles to DWORD's in anticipation of UnrealScript (typedef ANGLE_TYPE)
+	Posted prelim 0.82 build for MWR.

+	Can now select moving brushes by brush in addition to actor
X	Moving brushes desnapped upon reimport? -> Can't duplicate
X	All brushes are force aligned to grid when map editing mode is turned on? -> Can't duplicate, but fixed probable cause
+	Transact moving brushes before modifying them to prevent undo lapse
+	Rotation components as dwords
+	Prep for merge

X	Hide tex family names beginning with underscore, and have Mark hide all fx families
+	Parse Unreal.exe URL=...
+	Textures now have lock count

+	Import/merging bugs. Fixed split face problem.
+	Added ACTOR_PreEditMove

+	Chris Clark bug: Specially aligned textures don't work on moving brushes.

///////////////////////////////////////////////////////////////////////////////
9-13-96 to 9-15-96

+	Meeting in Europe
+	Made a $100,000,000 deal
+	'Nuff distractions, now back to work :)

///////////////////////////////////////////////////////////////////////////////
9-16-96

+	Integrated Robert's 2d editor fixes
+	Fixed UnrealEd help bugs

+	Left-clip dither bugs
+	Fix backdrop
+	Jorus mipmap bugs

+	Removed DispDib support.  DispDib was a holdover from ancient Unreal under Windows 3.1 and
+	it is made obsolete by DirectDraw.
+	Hide unavailable mode x modes in NT

///////////////////////////////////////////////////////////////////////////////
9-17-96

+	Fixed bizarre SetCooperativeLevel bug with NT 4.0
+	Light map wraparound bugs
+	Resource browser in god mode only
+	Must gen light meshes for polys that aren't hit by any light

+	Jorus mipmap bugs
+	Properly handle mipmapless textures
+	Crash upon add bug

///////////////////////////////////////////////////////////////////////////////
9-18-96

+	Fix cdepth change from within DirectDraw (hwnd already set)
+	Fix cdepth change within DirectDraw palette bug
+	Cdepth focus bug
+	Alt-Enter goes into and out of fullscreen (stolen from Age of Wonders)
+	Now force camera window aspect ratio to be in the range of 1.25 to 1.6
+	Fix show log select problems
+	Position camera windows somewhere nice upon startup
+	Tweaked wording of all Windows menus
+	ps msec timings are messed up
?	2 game camera windows open causes trouble -> Ask Mark if this is input sys problem

///////////////////////////////////////////////////////////////////////////////
9-19-96

+	Fix fonts in rgb555/rgb565
+	Dropped 24-bit color support in favor of 8/16/32
+	My next engine will be 32-bit color only!
+	Fixed tiled texture block code in all color depths	
+	Implemented 32-bit color asm draw-across code

///////////////////////////////////////////////////////////////////////////////
9-20-96

X	Use screen's color depth on startup, don't offer option when not fullscreen -> Default to 256-color
+	Added vector <-> color conversion routines for easier color manipulation
+	Can press ctrl-enter to switch in/out of fullscreen
+	Fixed flat polys in all cdepths
+	640x400 screen size option in menu
X	Should I support screen aspect ratios? -> Messy
+	Remember screen size changes and save them
+	Fixed net game detection error
+	Replaced my outdated profile code with MWR's
+	16-bit color line drawing, rect drawing
X	Delete FPalettePrecalc stuff?
+	Clean up UnGfx.h outdated stuff

+	Going into DDraw in UnrealEd 2nd time crashes
+	Totally fix DirectDraw support within UnrealEd!
+	Fixed far parallax is broken

+	Force window to have a reasonable aspect ratio range, prevent win size > supported 1024
+	When show/switchto log window, must clear selection
+	Log fills up and doesn't erase top stuff
+	Why does log window show up in task bar when hidden?

+	Params like -net shouldn't be case sensitive
X	Is there a 2X performance difference between game and editor rendering?

///////////////////////////////////////////////////////////////////////////////
9-22-96

+	Stat: Show # actor collision fragments and lots of useful level tick time stats
+	Clean up camera menus

+	8/16/32-bit color depth options in menu
+	Show color depth options in editor

+	16 & 32-bit color lines are messed up
+	Rect colors are wrong

+	Skip scaled sprites in unsupported cdepths

+	Fix UnrealEd show-actor modes

+	Show radii (collision & light) option in 2D views

X	Numeric "rotater" or values like 30 and 60 -> no time

+	C post fx - 256 & 16-bit

+	All moving brush view options in UnrealEd views
+	Show moving brushes wire display or hidden

X	Clicking on player controls icon doesn't turn it off -> MWR look into
X	Fix player control slowdown when not moving
X	Player controls in map edit mode crashing bug?

X	Use screen's color depth on startup

+	Torture test camera window user interface
+	Finalize camera window user interface elements

+	Fix mesh viewer disappearance problems
+	Actor properties/Display/Brush/Use Current now works nicely
+	Fixed terrible bug" using "save" option in UnrealEd and pressing escape still saved!
+	Texture browser now hides special textures by default

+	Scrapped UnrealEd sphere button in texture viewer, replace with show-all-families thing
+	SelectObject in ::SetPalette fails going out of DirectDraw

+	Texture browser gave overflow in 'All' group when tons of textures

///////////////////////////////////////////////////////////////////////////////
9-23-96

+	Learned how to indent code like a real man

+	Dynamic lighting
+		Fix dynamic lighting backface problem
+		Properly cache and pool light meshes and intermediaries
+		Work with bTempDynamicLight in editor!

+		Global lighting effects support
+		Fixed major light smoothing mipmap bug
+		New lighting looks AWESOME!

///////////////////////////////////////////////////////////////////////////////
9-24-96

+		Only compute global effects once per frame
+		Zero brightness lights cause major slowdown for some reason
+		Implement global lighting effects generically for point and mesh usage
+		Zero-radius light weirdness
+		Lights with large radii sometimes have darker area near them (SqrtOfs problem?)

+		Actor->bTempLightChanged force cache rebuild
+		Not all meshes are composited together (Kootch)?
+		Mesh gen stats

///////////////////////////////////////////////////////////////////////////////
9-25-96

+	GT, Cliff & James mtg

///////////////////////////////////////////////////////////////////////////////
9-26-96

+		Finish all hardcoded simple effects.
+		Start spatial effects code.
+		Separate all effects and clean them up.

+		Spatial bool.
+		All spatial lighting effects routines.
+		CloudCast effects are now unbelievably smooth!

+		Fix bSpecialLit
+		GServer now tracks time/date

+		Daylight, nightlight.
+		Make sure nothing crashes.

+		Cyllinder lightsources
+		Totally cool searchlight effect!

+		Clean up GLightManager external refs!

///////////////////////////////////////////////////////////////////////////////
9-27-96

+		Texture lattice effects: BigWavy, SmallWavy, all light effects
+		Adapt texture lattice to reasonable minimum size

+		Fix asm lattice xyz compute

+		Write all light-based texture warping routines

+		DoDynamicLighting optimization (don't go down nodes with no invisible polys).
+		Optimize SetupRectSampling, ComputeFromActor

+		DoDynamicLighting integration
+		Now only process dynamic lights as they apply to visible polys

///////////////////////////////////////////////////////////////////////////////
9-28-96

+	16&32-bit colored lights

+	Cached zone palette scalers

+	HSV -> RGB functions in palettized and nonpaletized varieties
+	Color scaling and ambient offset functions

+	Properly cache palettes in multiple zones in all color depths
+	Fix ambient algorithm; is fogging rather than scaling...

+	Double number of ramp entries
+	Fine-tune multicolored lighting

///////////////////////////////////////////////////////////////////////////////
9-29-96

+	Merging bugs
+	Must distribute NF_NoMerge to all affected nodes

+	Modify all palette table generators to support new ramps
+	All hicolor modes
+	Time litegen
+	Count meshes gen

+	iZone=0 loses lighting
X	Use zone 0 in textures mode -> looks better as is
X	Equalize 8-bit brightness -> will hack in later if 8-bit survives

+	start out in hicolor when appropriate
+	don't merge polys in different zones
+	ack! Was only using 40% of lighting table??
+	never show selection during gameplay!

+	textures mode is now ridiculously bright
+	fix fake backdrop and enviromap in editor

X	slightly dirty shadows always -> creates temporal problems
+	optimized dirty shadows always

+	Need hicolor/truecolor gamma correction support
+	totally prepare for assembly optimization
+	rendDrawHighlight crashes in non 8bit color depths
+	Zone ambient lights

+	Lattice texture fx
+	Lattice light fx

+	Allow light meshes over 256 on a side, as long as less than 64K overall
+	Raytrace extent bug (isn't using brush polys?)

+	Zone ambient lighting (R,G,B,White)
X	Zone portal bEnclosed flag and bound optimization! -> outdated

+	Fix broken effects and enforce minimum lattice size per effect (proutine,minx,miny)
+	textures mode is funny when starting new level

///////////////////////////////////////////////////////////////////////////////
Notes for others (10/1/96):

Mark:
	Many changes... I've been saving these up for the past 2 months.
	Please diff the .tcx's when merging; I made many changes the day I integrated
		with your 82z merge.

	Changed: KeyPoints.tcx (modified ZoneDescriptor, added LevelDescriptor, more).
	Changed: Root.tcx (Added SoundRadius, radius of the ambient sound, added
		ambient sound support code to ACTOR_PostBeginPlay, Dim Brush as ...Const...,
		added DefaultEdCategory).
	Changed: All calls to PlaySfxOrigined and PlaySfxLocated, to include the
		SoundRadius value.  The SoundRadius should apply only to true ambient sounds
		(played due to the AmbientSound property) such as the sound of a torch
		burning, and not to regular sound effects like gun shots.
	Changed: UnCon.cpp (Brightness level code, removal of fade in/out code).
	Changed: UnActor.h (AActorDraw::SoundRadius, AActorDraw::WorldSoundRadius)
	Changed: UnEngine.cpp (Order of calls to GAudio.Init and Level->SetState so
		that ambient sounds are inited properly).
	Changed: AmbientBrightness in Root to InherentBrightness to prevent naming conflict.
	Changed: Added FGame::CheckState to perform structure size checking. This enables
		the Root.ucx rebuild to succeed even if the contents of Root.h is outdated, avoiding
		a chicken-and-egg problem.
	Changed: ILevel::GetZoneDescriptor to fix bug.
	Changed: Separated ZoneDescriptor into its own root class and file, modified the
		associated Classes.mac.
	Added: ILevel::GetZoneGravityVector().  Use this for figuring out the gravity acceleration
		vector rather than the deleted GMath.GravityAcceleration.  This will enable us to change
		the gravity level per zone and per level.

	Requests:

	When DirectMouse is disabled, Unreal is run for gameplay, and multiple camera windows
		are opened up, controls in the non-focus window still go nuts. I think this is
		an input system bug...
	Move flame class into a subclass of Light and rename it into something more descriptive
		appropriate like TorchFlame...
	Avoid all unnecessary calls to ZCollision and other IModel physics functions; these eat up
		a lot of CPU time.  For example, the pickup class calls it every tick.  I recommend 
		adding in ALWAYS_BEGINTIME and ALWAYS_ENDTIME macros to check out the performance 
		impact of key pieces of code in levels populated with a lot of actors.
	Please go with the Un*.cpp and Un*.h file naming convention (not DArray.h, etc).

Ammon:

	Changed: FGlobalAudio::InitLevel to: int InitLevel(int MaxIndices), where MaxIndices is
		the maximum number of actor indices that are valid; all calls to the sound updating.
		routines will use indices where 0<=Index<MaxIndices.
	Changed: All actors now have a 'sound radius' property for their ambient sounds.  This is useful
		for reducing the number of sounds that are active at a time, since it allows level
		designers to explicitly set the sound radii while considering their level layouts,
		and it also enables far-away sound effects to be culled more efficiently.
		As a result, I added a FLOAT SoundRadius property to PlaySfxOrigined and
		PlaySfxLocated.  The SoundRadius value is in the same 'world units' as the Location vector.
		A value of 0 means "no radius" so that the existing sound-diminishing code should be
		used.  If SoundRadius is nonzero, then the sound effect volume should smoothly range from
		its maximum (at the sound location) to zero (at SoundRadius units away from the sound
		location). For performance, when updating sounds for a viewer, you may want to remember 
		SoundRadius*SoundRadius, and compare it to the value of (PlayerLocation-SoundLocation).SizeSquared()
		to avoid the penalty of a sqrt().
	Changed: Directory management code in all UnrealEd forms, user interface, some other tweaking to
		make the UI consistent with the other browsers.  When merging the VB source, please diff 
		the source and merge your code into mine to preserve the new form layout.

	To-do notes in order of importance...

	1. Panning seems to be exaggerated; unless a sound effect is directly in front of the 
		player, the sound seems to come out entirely through the left or right speaker.
		Panning should be more evenly distributed.
	2. As the player gets really close to an ambient sound, the sound's directionality should be
		diminished and the sound should be panned closer to the center.  Let's say that in
		the interval (1.0*Radius, 0.2*Radius) the panning is as-is (full panning), and in
		(0.2*Radius,0.1*Radius), the panning is smoothly adjusted between as it is and
		full-center, and in (0.1*Radius,0.0) the panning is full center.  This will give level
		designers control over volume sound sources, like roaring water etc.
	3. In the properties dialog, music/sound volumes need to take effect immediately as sliders 
		are adjusted, and the sampling rate combo should be fixed (or removed if no longer
		relevant); an interpolation on/off option would be good.
	4. Still need audio to work within UnrealEd so that level designers can hear the sound effects
		and ambient sounds from the sound browser while they are editing levels. Otherwise, adding
		sounds to levels is extremely tedious. This should be pretty easy (just check the hacked-in 
		calls that disables sound whenever the editor is running).
	5. The functions which play sound effects and which update a sound effects' positions should also 
		take an additional parameter, a scaling factor (from 0.0=inaudible to 1.0=full volume) which
		scale the sound effect's volume.  Passing a value of 1.0 should have the same effect as
		calling the function has now; values smaller than 1.0 should scale the volume down
		proportionally.  This is so that I can easily modulate ambient sound effects via script,
		for example ramping a torchlight's sound in proportion to the light's brightness.
	6. Sound property editing needs to happen natively in UnrealEd rather than through an external utility.
	7. The general sound system really needs to be finished and fully debugged/tested asap so that we can
		all move on.

Carlo/Ammon:
	Sound quality is still unstable (pops/clicking) on NT 4.0 with both DirectSound and WinMM
		in Unreal as well as the Galaxy player. This is not related to the known problem
		with IDirectDraw::Lock.  Mod4Win doesn't have this kind of problem on NT 4.0.
	Sound effects are really noisy when played at low volume.  Try placing an ambient sound then
	    walking up to it and away from it, and you can hear static noise increase as you walk
		away.  Very low-volume sounds are particularly bad.

Rebellious programmers: please use the following style for your file headings.
It's not any better/worse than other styles, but this is something we should keep
consistent for everyone working with the Unreal code base.

/*==============================================================================
UnAction.h: Player input actions
Used by: Player processing code

Copyright 1996 Epic MegaGames, Inc. This software is a trade secret.
Compiled with Visual C++ 4.0.

Description:

Revision history:
    * 05/30/96, Created by Mark
==============================================================================*/

#ifndef _INC_UnAction
#define _INC_UnAction
..etc...

///////////////////////////////////////////////////////////////////////////////
10/1/96

+	UnEngine.cpp: Now init Audio before ULevel::SetState so that actors
+		with ambient sounds are now properly inited.

+	Remove fadein code from UnCon.cpp
+	Gamma: No fullsc req, GCache.Flush();

+	Old notes:
X		KeyPos and KeyRot noneditable -> better to be editable
X		ACTOR_PostEditMove/ACTOR_PostEditMove -> ACTOR_EditPosChange -> ok as is
+		Clean up and rearrange root properties
+		Must upgrade FRotation components to 32-bit, needed for scripting
+		Import/export upgraded angles

+	Added SoundRadius to Root
+	Mesh viewer is dead again

+	Added ProductRequired to Teleporter to support teleporters that require a certain
+		product, such as the registered version of Unreal

+	Need a LevelDescriptor class, create in InitLevel
+	Need AmbientSound class
+	Text message actor class
+	Const Brush
+	DefaultCategory
+	LT_Strobe
+	Added GClasses.LevelDescriptor
+	My poor little actors are disappearing!

+	Killed bLightIsAmbient
+	LevelDescriptor, ZoneDescriptor lightning (added to ambient)

+	Set all DefaultEdCategory properties
+	Only cache MeshVoid if pure static

+	Sound browser import looks in wrong directory
+	UnrealEd Cliff DefaultEdCategory support
+	Texture family gets lost bug

+	ZoneDescriptor base class
+	Cliff: Added bUnlit property to prevent meshes from being affected by lighting.

X	Not showing actors in wire views before map rebuilt -> Doofus! You're in 16-bit color.

+	Added INDEX ILevel::GetLevelDescriptor(int iZone);
+	Added FVector ILevel::GetZoneVelocity(INDEX iActor);
+	Added FVector ILevel::GetZoneGravityAcceleration(INDEX iActor);

///////////////////////////////////////////////////////////////////////////////
10/2/96

+	Show span occlude time
+	Support bGravityZone, bVelocityZone

///////////////////////////////////////////////////////////////////////////////
10/3/96 - 10/5/96

+	Business stuff

///////////////////////////////////////////////////////////////////////////////
10/6/96

+	Slept

///////////////////////////////////////////////////////////////////////////////
10-7-96

+	Right-click poly show # polys selected & # lights affecting them
+	Autosave directory screwed up? Critical: FEditor::Exec(MAP SAVE FILE="u:\Unreal\Maps)

X	Right-click wire brush show options (copy to brush in place, copy to brush with move) -> Can live without it

+	Undoing past light rebuild -> Fixed transaction tracking reset bug
X	Lower shadow detail options? -> Can live without
X	esc abort slow rebuilds and imports if possible -> no
+	default per class prop tab
+	sheet brush tab order
+	texture browser starts up with empty family

X	Are my mesh texture coordinates off by +/- 0.5 or 1.0 from James' mesh editor??? -> James' textures need borders

+	lighting not autorebuilt when propchange sometimes
+	UnLine case 4 bugs

+	Fixed major coplanar portal bug
+	Improved numerical stability of geometry optimizer

X	Clipper crack bugs -> Were geometry optimizer precision problems

+	side linker still doesn't work with really cut up coplanars

+	"apply selected lights only" should apply all lights in zone of selected zonedescriptors,
+		update UnrealEd text

+	UnrealEd multiple instance problems! Fixed via SINGLEUSE_IMPLEMENT_OLECREATE
+	fix light updating in UnrealEd
+	If I undo to/beyond the point of my last lighting rebuild, the editor crashes.

X	>Also, if I have brushes snapped to say a grid unit
X	>of 4, if I go into map edit mode -- and forget to set the grid to 4 -- all
X	>of my brushes are snapped out of whack. This is all extremely
X	>time-consuming resetting brushes and what not. Any chance of a fix so that
X	>brushes stay put?

+	Freeing 64K aligned items crashes in debug ver
+	fake backdrop broken? -> No, only shows up when player controls are on

+		Counter
+			Displays optional text message
+			Optional countdown value
+			Separate trigger-in and trigger-out

+	make 8-bit color 15% darker 

///////////////////////////////////////////////////////////////////////////////
10-8-96

+	TFBS

///////////////////////////////////////////////////////////////////////////////
10-9-96

+	Support bNoSmooth when rendering actor sprites and meshes, now things like
+		guns can be set to be not smoothed.
+	UnrealEd prop cat thing needs < and > buttons

+	>An option that would give us the best of both worlds is a dialog box
+	>similar to the one used when importing brushes that has a check box for
+	>'merge coplanar' and 'don't merge coplanars'
+	I think this works as desired in all cases now. Let me know if otherwise.
+	However, this method of map design is not going to work well; it results in way more
+	polygons than Unreal can handle quickly.

+	Rewrote portal code to be far more robust and general. Volumetric solids may be 
+	added to the world as portals now, enabling easy creation of things like water zones
+	and in the future (if custom rendering support is added) clipping zones for volumetric
+	lighting and fog effects.

+	Any empty world is now classified as solid space rather than vacant space. Therefore,
+	you begin level design by subtracting stuff rather than adding it.  This is a significant
+	speed optimization.  As a result, you should delete all of the gigantic solid brushes
+	you're subtracting your world out of.  This will require level designers to rework
+	areas which are designed as outdoors.  One easy solution is to subtract a gigantic
+	cube surrounding the world, go into map edit mode, select just the gigantic cube,
+	and hit the 'to front' button to make it subtract first.  *Only* do this if you have
+	to; it's much better for performance to design levels subtractively.

+	All collision problems near semisolids should be fixed now...

+	Fix hull bounds overflowing bugs

+	Force palette rebuild if ZoneDescriptor temp change
+	Generate zones even if no portals so ZoneDescriptor works always

///////////////////////////////////////////////////////////////////////////////
10-10-96

+	Rename 'rectangle' to 'cube'
+	All brush builders default to solid

X	Support zone/level lightning ambient offset support for lightning etc (Lightning).

X	Z-collision code needs support for complex gravity vectors; use Raytrace
X		instead, add iActorHit support, and call special-case Z-collision where
X		possible. Also support underwater. -> Overly complex!

+	It seems as if moving brushes with their bTrigger property set to True
+	trigger the event that they are assigned, but the brush is not animated
+	(does not move).  I've called Cliff about this new UnEd 0.83 bug and it
+	appears that he is also experiencing the same problem. -> Works fine here, send example.

+	The only problem I have seen is when you create a moving brush or 2, then 
+	rebuild the map WITHOUT first setting the key 0 and 1 positions. If you do 
+	this, then the brush returns to its orientation it had when you first 
+	loaded it. I noticed this particularly with my large doors. The brush 
+	when loaded comes up laying flat, I have to roll and yaw the sucker to get 
+	it into position. If I forget to set the Key0 and 1 positions, after 
+	a rebuild, its laying flat again.

+	Note on zones with bWaterZone:
+	* Tiny wavy effect is applied to everything in water
X	* Watery shimmer light effect is applied to everything -> must be done explicitly

+	Implement PlayerEntered, PlayerLeaving
+	SetActorZone called upon initial entry?

+	Are node bounding spheres used/needed?
+	Reduce size of palette resource
+	Get rid of all diffusion dithering remnants
+		UPalette::BuildBrightnessTable
+		Bidirectional traversal when remapping
+	Import texture highlight texture family name, def to Untitled.

+	Fixed the awful boolean import bug. It occured whenever a boolean value had trailing tabs.
+	Ortho bounding rect rejection is now totally screwed up

X	There's an annoying bug that's been in the editor forever now, and dammit,
X	it's got to be fixed.
X	-Go into the 2d shape editor.
X	-Make a square (large enough to make a hallway you can walk through)
X	-Revolve it. (sides per 360= 12, number of sides = 6) This makes a "C"
X	shaped hallway. (viewed from above)
X	-Subtract this cool hallway from a solid cube.
X	-Walk through the hallway. The surfaces at the ends of the hall (that you'd
X	walk through) are screwed up 90% of the time. (either showing the grid
X	through them, or a warped texture...)
X
X	-> I can duplicate this.  It's a 2D editor numerical precision problem due to
X	roundoff error accumulating.  Robert.

+	Force ZoneDescriptor always to exist!

///////////////////////////////////////////////////////////////////////////////
10-11-96

+	Met with Legend Design.  Cool guys; hope we can do something together.

///////////////////////////////////////////////////////////////////////////////
10-12-96

+	Fixed texture blurring and slow import bug
+	Kill texture 'diffusion' in UnrealEd, fix importing-to-no-family bug
+	Delete GGfx.TrueColors etc

+	Need standard 16/32-bit palette cache routines; eliminate GGfx.TrueColorPalette and
+		terribly inefficient calls to HiColor565() in routines like DrawDepthLine.

X	Save-intrinsic-classes-only option for saving classes, to fully eliminate root.h/actor.h redundency? -> Later maybe.

///////////////////////////////////////////////////////////////////////////////
10-13-96

+	UnrealEd level 'View Links' work using results window, ACTOR_GetLink PString
+	UnrealEd resource browser is still broken -> Don't need it

+	UnrealEd Level properties use level descriptor, make actor props browser multi-instance 
+		embeddable with fixed size and hidden props tab.
+	Faster meshsprite qsort

+	In UnrealEd, log/new camera crashes

+	LevelDescriptor needs good default gravity; no hardcoded anything.
+	Kill GGfx.BackdropTexture.

///////////////////////////////////////////////////////////////////////////////
10-14-96

+	Class browser quicksort doesn't sort counts (oops!)

///////////////////////////////////////////////////////////////////////////////
10-15-96

+	Fix radius 0 lighting problems.

X	LevelDescriptor needs ramp/ambient info, background texture -> Just background palette.
+	Select-all don't select level descriptor

///////////////////////////////////////////////////////////////////////////////
10-16-96

+	Actor properties are now 4-aligned with #pragma pack (push,4). Justification: Portability
+	Endian hooks for Mac byte order
+	Add UResource::Flip(), byte swapper required for all resources.
+	Full postload and presave hooks

X	No-shadow, no-incidence-effects lights, i.e. for SpecialLit situations -> No
+	Expand querying functions for non-iMe callback

///////////////////////////////////////////////////////////////////////////////
10-17-96

X	Change backdrop colasecing to reflect inside-out world.

///////////////////////////////////////////////////////////////////////////////
10-18-96

+	Directional lighting works
+	Use cloud noise for dirty shadows!

+	Min, max, diff

+	Allow start grid for cloud noise and parameters to prevent full size clouding

+	All necessary class and Root.tcx changes for backdrops & satellites
+	Added 'AActor *Descriptor' to ILevel, points to level descriptor on NULL.
+	ULevel::Lock now grabs LevelDescriptor
+	Exporting enumeration to C++ header now includes tag_MAX

+	Finally bit the bullet and eliminated the AActor.h/Root.h redundency (sorry, Mark,
+	you were right all along!)  This required significant changes in AActor.h, but it doesn't
+	have much impact on any of the code.  From now on, everyone has to be careful not to
+	intermix game-specific code with the engine...

+	Deleted unused FActorAIStatus

+	Renamed math functions & templates Min, Max, etc and made global for consistency.
+	Removed FActorServerInfo, merged into ARoot.
+	LevelDescriptor time info is filled in each tick

+	Moved all AActor:: functions to the Game project for replaceability.
+	Renamed Root.tcx to Actor.tcx
+	The ARoot class no longer exists; it has been replaced directly with AActor.
+	Renamed Root.ucx to Unreal.ucx
X	Are there now circular dependencies?

+	New/restructured files:
+		UnActor.cpp: Implementation of the AActor class.
+		UnActor.h:   Definition of AActor class, includes Root.h etc.
+		UnActLst.h:  Definition of UActorList.
+		UnClass.h:   Definition of UClass.
+		UnClsPrp.h:  Definition of FClassProperty.
+		UnMsgPar.h:  Definitions of all actor actor message parameter structures.

///////////////////////////////////////////////////////////////////////////////
Supplement 10-19-96: Actor class hierarchy notes

I rearranged the class hierarchies to eliminate the duplicate definitions of
ARoot and AActor that were in Unreal prior to 0.84.  Now, each actor class
contains two C++ support classes:

	ClassnameHelper: A helper class derived from its parent's helper class,
	which contains only the actor's raw data.

	Classname: A class whose size is guaranteed to be sizeof(AActor).

Here is the derivation hierarchy:

	AActorHelper
		AActor
		ARootHelper
			ARoot
			AWomanHelper
				AWoman
			...etc
		ALightHelper
			ALight
		...etc

When referring to actors generically, use AActor.  You can always safely convert from
an actor class to a class above it in the derivation tree via typecast, and you can
convert an actor of class A to an arbitrary class B if B.IsKindOf(A).

Though the ClassnameHelper classes are of variable size, the Classname classes are of
fixed size = sizeof(AActor).

Files required:

	UnActor.h			-	Definitions of all actor related stuff. Includes 
							the following:
		Root.h			-	Definition of all actor classes, exported from UnrealEd 
							based on the scripts.  The scripts are contained in 
							Classes\*.tcx.  They are rebuild by running the UnrealEd 
							macro Classes\Classes.mac.
			UnRoot.h	-	Supplement to Root.h which enables you to add class 
							functions to the AActor class
		UnActLst.h		-	UActorList definition.
		UnClsPrp.h		-	FClassProperty definition.
		UnClass.h		-	UClass definition.

The reason I decided to go with this system and all its complexity is to enable
actor logic to be written in both UnrealScript and C++ and intermixed freely.
This necessitates defining all actor properties in the .ucx scripts, and making
UnrealEd generate C++ code based on them.  If all actor logic were written in C++,
the process would be much simpler, but my primary design goal in the actor system
is to enable designers and users to greatly extend the world via a flexible scripting
system.

In a ground-up redesign, it would be smarter to allocate actors from a dynamic
pool rather than using a fixed-length array, and it would be cleaner to do
away with the Actor indices and simply use pointers, but that chaging that
would mess up too much existing code.

-Tim

///////////////////////////////////////////////////////////////////////////////
10-19-96

+	Expanded CLASS_PROP_EXTRA.
+	Cleanup the headers.
+	Camera actor is now APawn.
+	Scapped FActorCameraStatus and stuck its stuff directly in APawn instead.
+	FActorPrivate class encapsulates all internal actor info.
+	Documented actor class derivation layout and file layout above

+	Moved Camera variable from ARoot to APawn.
X	Class default actor should be AActorHelper only -> Would require a lot of changes
X	without gaining much.

+	Note: You can now include an optional class parameter to ILevel::SendMessage
+	Which is useful for routing messages to a parent class.

+	SpawnActor handle Location=NULL
+	Kill GMath.DefaultCameraStart, build into Camera def props
+	ZoneDescriptor needs ZoneBreadth, ZoneReflectivity. Kill GetSoundProperties.

+	Now compiling with maximum warnings

///////////////////////////////////////////////////////////////////////////////
10-20-96

+	Better equalized 8-bit brightnesses.
+	Mipmapping now accounts for FOV (zoom fix).

+	Backdrop:
+		Get scaling and panning speeds completely settable via LevelDescriptors.
+		Specifiable backdrop texture via LevelDescriptor.
+		Tune scaling and panning to liking.
X		Scrapped interpolated daytime palette (lookup table slowdowns/discontinuities)
+		Specifiable sky palette via level descriptor.
+		Implement Satellite class for sun/moon
+		Proper day/night timing and scaling.

+		Make random number code available to all UnRender.

X		Cloud mesh, proper alpha mixing of sky and clouds -> Doesn't look that good.
X		Depth diminishing of cloud layer

///////////////////////////////////////////////////////////////////////////////
10-21-96

+		Backdrop diminish with 1/(Dist) not 1/Z
+		Delete cloud parameters in leveldescriptor
+		DayFraction, NightFraction
+		Set wavyness magnitude in LevelDescriptor
+		Added LT_Spotlight class
+		Sky fog for sky shading
X		Special alpha palette for sky brightening with ambients -> Fog shader works cool enough

///////////////////////////////////////////////////////////////////////////////
10-23-96 (schedule wraparound)

+		DrawForward alignment bug? Thanks for the fix Mark.
+		Scrapped unused 256-color glow, ghost and average effects.
+		Replaced unused far-ceiling effect.

+		Fog is now depth based - this is beyond cool!
+		ZoneDescriptor/LevelDescriptor bTempLightingChange cleared on 1st tex pal?

+		Awesome sun/moon lighting effects via rect sampled lighting
+			All PolyFlags effect and backdrop wavyness effect via ApplyLatticeEffects
+			Light list lighting via ApplyLatticeEffects
+			Consolidate water wavy, cloud wavy, and all that stuff PF_WaterWavy, PF_CloudWavy
+			With Backdrop SetupForPoly, still build fast light list of backdrop lights
+			CalcRectSample use fast light list
+			Simple positional effect
+			LE_Sattelite
+			Fine tune backdrop radial lighting
+			Satellite rotation

///////////////////////////////////////////////////////////////////////////////

>>Mark: [old]
	Opening multiple cameras during gameplay still acts funny.
	We'd be more memory-efficient if SpawnActor allocated actors from the begining
		of the list (i.e. starting with 0) rather than the top of the list. In
		the future, I can shorten the size of the actor lists on small levels, but
		that requires that the active actors be on the bottom of the list.
	Let's hold off on significant AI changes till scripting is done...
	In UnrealEd with player controls on, pause works but unpause doesn't.
	Could your actor lists seem to be leaking memory?  You could just allocate them to the
		size of Level->ActorList->Max so that they never need to be resized (I was 
		hoping to avoid all memory allocation during gameplay, so that once a level is up
		and running, there are no possible allocation/deallocation problems).
	Is bBehindView somewhat broken? Looking up/down seems to tilt the player mesh rather than just 
		the view as it was.
	Note that zoneDescriptor is once again a child class of Keypoint.
	New player control handling needed: When the player is in a zone whose zone descriptor
		has bWaterZone=1, the controls should function a bit differently:
		* Player's maximum speed should be reduced to 60% of its normal value.
		* 'friction' damping when moving should be cut in half so that the player
		  slides longer when he/she stops moving.
		* Player momentum should be tracked in all 3 axes (X, Y, Z) rather than just (X, Y)
		  as when the player is standing on the floor.  This enables the player to gain/lose
		  momentum vertically while swimming.
		* The look up and look down keys should not snap back.
		* When the player presses the forward/backward keys, she should be moved in the
		  full (X, Y, Z) direction vector generated by ViewRot rather than just (X, Y),
		  enabling you to swim in whatever direction you're looking.
		* The A & Z keys should enable the player to swim up and down (as happens in fly mode now).
	Note that INDEX_NONE is now MAXINT instead of 65535
	Note several replacements of MAXWORD with INDEX_NONE I made in the actor code
	Note minor changes to: Root.tcx
	All weapon classes need bNoSmooth=1 (to prevent dithering the weapon textures)
	Screenshot key needs to go altogether; it doesn't 't work in new color depths, and isn't worth fixing.
	UnMsgs changes:
		* Deleted LevelClosing, SetPlayMode, GetProp, SetProp, Day, Night,
		  Weapon, UnWeapon
		* Added new comments
		* Corresponding Root.cpp changes (minor).
	Added EnumDef EClientUpdateType to Root.tcx
	AWoman metrics: (1) Mesh needs to appear to stand exactly on the ground when added in
		a level, and (2) when you walk up to another AWoman, you should see exactly
		eye-to-eye.
	Exporting enumeration to C++ header now includes tag_MAX, so please use different
		enum prefixes on different enums (EAI_Task and EAI_Move both use EAI_...)
	Do you have any insight into how to create automatic conversion functions that could
		convert, for example, APawn's directly to AActor's without a cast?  I had to
		set up the inheretance chart this way so that the actor list can be traversed via
		AActor pointer walking:
		AActorHelper
			AActor
			APawnHelper
				APawn
				...etc
		The problem with this approach is that APawnHelper's aren't descendents of AActor's.
		This is messy but I wanted to assure that sizeof(APawn)==sizeof(AActor) etc.
	Note addition to Camera class in Pawn.utx default properties:
		Location=(-500.0,-300.0,300.0)
		DrawRot=(0,16384,0)

///////////////////////////////////////////////////////////////////////////////

>>Old: Mark & Ammon:
	Make sure all of your code compiles with no warnings at level 4.  If you need
		to use #pragma warning (disable : ####) that's fine.
	The only info that should appear in the log is info that will be useful to us
		in tracking down the cause of crashes.  Please remove any log messages that
		aren't directly useful, like the GetProfileInteger stuff, and add any in which
		will be useful, like major subsystem init/exit events.

>>Old: Mark:
	When playing in a window and mouse look is set to "always on", the view shouldn't
		snap back to looking forward when the mouse buttons are released.
	When gravity is reversed (i.e. GravityVector.Z >= 0.0), you should skip the
		ZCollision check and treat the player as if he is always falling. To test,
		go into "Level Properties" and set the level gravity's Z component to a
		positive number.
	New player control problems:
		* Yawing with the keyboard suddenly got really slippery. It should be the way it was...
		* All cheets lock up hard.
		* Mouse looking up/down should move 2X faster (mouse moving forward/backward is fine as is).
		* A lot of stairs which I could climb up previously are now unclimbable because they're too
		  high.  All stairs climbable in previous versions should still be climbable.

>>Old: Ammon:
	Stuff that includes <windows.h> needs to go in the Windows project.  If you need
		only a trivial function from Windows (GetTickCount? - this didn't seem to
		be referenced...) then let Mark or I know and we can add it to FGlobalPlatform
		so that you don't have to include the evil <windows.h>. :)
	Music needs to be loadable/savable/browsable by resource so that I can finish off the 
		new 'level properties' dialog.  You could either cram it into a UAmbient, or create
		a new resource type and browser for it.  I guess it might as well be a UAmbient, since
		that will simplify things.
	Note that I added a new stub function USound::Flip to the sound resource type. Thiss
		will be for byte order conversion.
	Can you make all of the audio parameters in the "audio properties" dialog take effect
		instantly? This is really needed for all options except for enabling/disabling
		DirectSound. Players need to get instant feedback on the effect of these settings.
	Need a selectable sampling rate (11K/22K/44K) since this will have a big impact
		on performance. People with slower machines may want to turn this down (or they may
		want to leave it up)...but either way, they need the option.
	Panning is still messed up.  The panning of a gunshot which I'm firing depends on the
		direction which I'm facing!  Obviously sounds emmanating from the player should not
		be panned.  I think you need to handle this as with ambients, when sounds fade towards
		center as they get really near to the player.

>>Lion Entertainment:
	* Let's start going with the "master source/platform-specific source" setup so that we're
	  working with a common version of all of the main Unreal source.
	* I hope your Mac compiler supports QWORD's (__int64's).  If not, make life easy and
	  create a C++ class called __int64 with all of the needed operators and conversions.
	  The rendering code makes heavy use of QWORD's.
	* Let's hope that our compiler allocate bitfields the same way...

///////////////////////////////////////////////////////////////////////////////
10-24-96

+			Unzoned polys are drawing with backdrop shading
+			DaySkyBrightness, NightSkyBrightness
+			Scale backdrop lights by brightness, use effects
+		Backdrop lights zero effect on surfaces
+		Finish up any remaining needed parametrization (level entry text)
+		Change BT_'s to remove ghost, glow.
+		Bumped MAX_CLASS_PROPERTIES=384.

+	Kill UnrealEd farceiling.
+	Rearranged UnrealEd surface flags
+	Mirror sky option
X	UnrealEd NoteClassChange leaves unwanted slider visible -> Gone?
+	No GServer refs in rendering code!

+	Merged Mark's latest code. Piece o' cake!
+	Added all .tcx files to a new 'Classes' project in project for convenience.

+	Better solution to requiring power of two textures in fonts -> now they don't show up in browser
+	Renamed bStaticActor to bStatic
+	Added bNoDelete to inhibit actor deletion
+	LevelDescriptor = non-static, nodelete

+	Pawn needs editable 'Camera' properties tab for fov and other cool params.
+	Changed unused bInactive to bSleeping, will be used to indicate that an actor need not be
+		ticked.
+	Changed bPegged to bUnused4.

+	Added ScriptRate, which defaults to 1. This is the number of ticks between script updating for
+	each actor, so that actor scripts don't have to continually execute for low priority actors.

+	Added ASpotlight to ALight

///////////////////////////////////////////////////////////////////////////////
10-25-96

+	Implemented volumetric lighting.  Unbelievably cool!
+	It is unlikely that anybody will accuse the volumetric lighting code of being too fast.
X	Only get 640x400x16 on 2meg cards? -> Must be your DirectDraw driver

///////////////////////////////////////////////////////////////////////////////
10-26-96

+	V-lighting improvements:
+		Sphere fast intersect rejection at the point level.
+		What's up with the random artifacts?
+		Adjust smoothly to avoid interior and edge aliasing of volumetric regions.
+		Any more inner loop optimizations

+		Separate volumetric and regular lighting via zone, systemize the code.

>	That virtual memory bug is on your list, right?
>	The bug where, if you scroll through the texture browser too much by holding
>	the slider bar, the editor crashes.
+	Fixed, I think. Send log if anyone sees this again.

+	Wavy bug in unshaded mode.

+	SIOBHAN26a.ZIP in my directory under /maps has this problem with the
+	rotating bridge... You'll see it as soon as you walk through the door and
+	come to the top of the ramp. (Doors and simple lifts aren't a problem. ) 

+	Fake Backdrop etc should equate to unlit.

+	no alt enter in camera children

+	Lessen ambient scaling, 0.5 or 0.3 (is this nonlinear?)

>	I get a 'Error 13 Type Mismatch' and a massive crash when I type two
>	periods (as in 1..0 instead of 1.0) in the custom scaling number fields
>	on the Polygon Properties request and then select 'apply' 
>	This is 100% reproducible. 
>	I attached the log if you need it.
+	Fixed

>	BTW An autosave with number will be cool : auto01 , auto02 ... (One more
>	Barracuda please :-)) - as an *option*.
+	One barracuda implemented, see preferences for option.

+	dbg ver fails link

///////////////////////////////////////////////////////////////////////////////
10-27-96

+	Renamed all FVirtualXyz classes to FXyzBase for better class browsing.
+	Renamed all AXyzHelper classes to AXyzBase for consistency.
+	Had to change UNGAME_API to DLL_EXPORT in Root.h to prevent linker errors.

+	Rewrote creature rendering code adding good support for 16/32-bit.
+	16/32-bit texture viewer works!

+	16/32-bit texture viewer and span drawing code (q&d)

///////////////////////////////////////////////////////////////////////////////
10-28-96

+	Changed cheetah to cheat. Quirky != fun.
+	Added FVector::Normalize.
+	Fix flatshaded drawing code.
+	Fix highlighting in high color modes.
+	Icons.

+	Creature optimization.
+		Build and save out span buffers, skipping empty span buffers.
+		Sped up creature rendering in the game by a factor of 2, with a
+			brilliant optimization -- stop drawing them twice per frame. :-P
X		Chunk pool, reuse nonleaf chunks as filter new ones down.
+		Prepare rasterization cutter for optimization.
+		Span clipped flat shaded.
+		Separate span rendering loop into two passes for better MMX support.

///////////////////////////////////////////////////////////////////////////////
10-29-96

+	Common sense optimizations:
+		MeshesGen!=0 with all static lighting! -> No player lightsource.
+		Eliminated stupid iUniquePlane usage.
+		Discovered and fixed many zone-related moving brush bugs. :-P
+		Fixed moving brushes
+		Fixed moving brush coplanar bug (Kootch et al)
+		Gack!!! Actor lighting code was performing O(n^3*log n) line of sight logic! I'm an idiot!
+		Optimize all physics code using PlaneDot!

+	Quick test: Rebuild bsp heuristic that tries hard to minimize the number of
+		zones that are shared between front and back. -> Bizarre unbalanced performance,
+		why???

///////////////////////////////////////////////////////////////////////////////

New rendering technique:

L1 cache thrashing due to span buffering and bsp traversal in the occlusion 
phase of Unreal is now the main performance bottleneck, and will become a 
larger and larger bottleneck as levels grow in complexity.  As a result, I am
trying to switch to a new, non-bsp portal rendering mechanism which has the 
following characteristics:

 - Generates seamless, not necessarily convex, zones bounded by occluding 
   polygons and by portals.

 - For game rendering, zones contain only linked sidelists, in no special order.

 - Begins by active-edge-table rendering the edges in the viewer's zone and 
   adding edges from adjacent zones as visible portals are encountered using
   seh.

 - Zoning process generates fewer zones than Bsp leaves, opting to merge adjacent
   convex volumes when generating portals would be wasteful.

 - Rebuilds the Bsp with the intent of minimizing portal area and balancing the tree.

 - Maybe perform interpenetration checking between world polys and moving brush polys so
   that moving brushes need not be added to the Bsp.

 - Eliminates redudent sides (sides which have the same surface on both sides).

 - Generates merged spans, as do the current routines.

 - Processes creatures using the same technique, by placing cutout feelers in the
   aet and using seh to generate creature polys on demand.

 - The resulting solid world spans are drawn in order of texture than light mesh,
   while masked spans are drawn in order of polygon z-sort.

Note that this requires no Bsp traversal, is entirely L1 cacheable, and can
be designed with o(n log n) sorting throughout.

On 3D hardware, the same setup can be used with a vertical intersection
algorithm to compute the numerically exact list of visible polys to render
without resorting to any rasterization or discretization.  Note that vertical
intersection can be ordered with o(n log n) sorting which requires only floating
point multiplies.  This is awesome for exploiting concurrency between the rendering
hardware and the processor.

On multiprocessor PC's, and on 3D accelerated PC's, one processor can be set to do 
all dynamic lighting calculations for the previous frame's set of visible polys 
(using a locked caching mechanism) and v-lighting, while the other performs 
visibility computations and texture mapping.

///////////////////////////////////////////////////////////////////////////////
10-30-96

+	Fixed way off msec timer
+	Edge list experimentation

///////////////////////////////////////////////////////////////////////////////
10-31-96 Halloween

+	Fixed sidelink crack bug.
+	Edge renderer work.
+	Note: 1000 polygons @ 640x480 = 300  pixels each, 25 scanlines each = 300K span buffer mem.
+	Note: 200 polygons  @ 640x480 = 1500 pixels each, 60 scanlines each = 150K span buffer mem.

///////////////////////////////////////////////////////////////////////////////
11-1-96 & 11-2-96 & 11-3-96

+	Optimized transformation cache.

	+	Worst case occlusion performance in Jorus at starting point =
	+	33.0 msec to begin with.
	+	25.0 with removal of intrasurface edges.
	+	23.0 with duplicate division removal.
	+	22.0 with assembly language clipper and outcode generator.
	+	21.0 with some FGlobalRender statics.
	+	20.5 with some branch minimization.
	+	19.5 with some lameass VC++ workarounds.
	+	19.0 with better cache alignment of FTransforms and extraneous edge removal.
	+	20.0 after implementing surface cache.
	+	18.5 after backface rejection.
	+	16.7 by changing backface order.
	+	20.5 after fixing bug preventing all vertices from being recognized. :-P
	+	20.4 after full, proper cosidal merge.
	+	19.9 by customizing optimization options (shouldn't have effect!) Augh.
	+	17.3 by disabling guard mechanism. Aha!
	+	17.2 with minor GetPoint optimization.
	+	15.4 after previous-frame coherent pretransformation outcode reject.
	+	14.4 with some simple reorg to appease the VC++ optimizer.
	+	14.3 by padding FTransform and performing memset optimizations.
	+	14.2 by merging duplicate surfs (should be a huge rendertime improvement though!).
	+	14.0 after merging duplicate points (expected more).
	+	13.9 by fixing broken merging code.
	+	13.8 by eliminating collapsed polygon fragments.
	+	11.5 by removing semisolids and reoptimizing Bsp. Wow!
	+	11.0 by hellishly optimizing Bsp.
	+	10.9 by modifying point cache code to improve branch prediction.
	+	10.8 by minor improving conditional branching.
	+	11.1 with surface cleanup routine (will be faster on average).
	+	Overall: 3X speedup, not bad.

	+	PentiumPro has some strange alignment<->performance characteristics. It often
	+		favors 8-aligned stuff for no apparent reason.
	X	Early backface reject based on side's last-frame backfacing. -> Complexity slowdown.
	+	Fast bitvector code (asm get/set).
	X	Optimize backface removal for caching with surface plane table -> Slowdown due to L2 usage.
	X	Optimize GetPoint. -> Slower for some reason.

+	Properly-clipped convex volume renderer:
+		Flatshade routine.
+		Properly set LeftSurf, RightSurf according to up/down facing.
+		Perfect unclipped convex volume rendering.

///////////////////////////////////////////////////////////////////////////////
11-4-96, 11-5-96

+	Active edge list x-clipper.
+	Struggling with active edge list clipping logistics.

///////////////////////////////////////////////////////////////////////////////
11-6-96

+	Phase 1.
+		Build list of all edges in the world excluding duplicates, pass to code.
+		Draw edges as 3D lines.
+		Clip edges as 3D lines.
+		Proper start bucket and active edge tracking and line rendering.

///////////////////////////////////////////////////////////////////////////////
11-7-96

+	Created IUnrealServer Ole interface to UnrealServer.

///////////////////////////////////////////////////////////////////////////////
11-8-96

+	Full UnrealGate user interface prototype.

///////////////////////////////////////////////////////////////////////////////
11-9-96

+	UnrealGate protocol design.
+	UnrealGate basic server implementation.

///////////////////////////////////////////////////////////////////////////////
11-10-96

+	UnrealGate client design.
+	UnrealGate client & server communication.

///////////////////////////////////////////////////////////////////////////////
11-11-96

+	Research RFC1459

+	Notes:
+		Spanning tree master server architecture or peer master servers?
+		Operator class users = server admins or dm's? Figure out hierarchy.
+		Freeform client channel creation? Reserved channels?
+		#channelname
+		invite & kick
+		topic

+		Names:
+		#Channel
+		*Server
+		@Operator
+		!Admin

+	Morn:
+	>  Well, we could have a basic rfc1459-like message format like this
+	>
+	>[:<nick>!<username>@<hostname>] <command> [<par1> [<par2> [...]]]
+	>[:<trailing>]
+	>
+	>  This is basically how IRC works... ok, now let's say someone enters a
+	>level/chatroom/whatever, the message would be
+	>
+	>  :Tim!tim@timpentium.epicgames.com JOIN 2
+	>
+	>  ..."2" being the level number on the server. Now every player on that
+	>level would get a message "Tim has joined the game. Feel his wrath". :)
+	>
+	>  A message would be this:
+	>
+	>  :Tim!tim@timpentium.epicgames.com SAY 2 :Hey guys... you will die now!
+	>
+	>  ...and everyone on that level (2) would get the message "Tim says: Hey
+	>guys... you will die now!".
+	>
+	>  A message to an "external" channel would work like this:
+	>
+	>  :Tim!tim@timpentium.epicgames.com INVITE Morn unreal.epicgames.com 12999
+	>
+	>  ...this would invite "Morn" to join the game running at
+	>unreal.epicgames.com port 12999... a message would pop up in Morn's client
+	>saying "Tim has invited you to join his game at unreal.epicgames.com. What
+	>would you like to do? Join/Get level info/Deny"... etc, I think you get the
+	>idea.

+	Neutral zones?
+	Cult homeworlds?
+	Cult skin accumulators?

+	UnrealGate testing & experimentation

///////////////////////////////////////////////////////////////////////////////
11-12-96 & 11-13-96

+	Speedup geometry rebuild while keeping exactness of bsp rebuild.

X	Reduce ULevel locks per frame to 1 (collision locking is very very slow).
X	Only perform collision and moving brush work when locking level for tick.
X	Don't lock collision stuff for rendering. -> Eliminated speed impact.

X	>Engine limitations may prevent this, but what would be truly 
X	>awesome and realistic, IMHO, is for light to flood a room
X	>when opening a door to a bright room, from say a very dark room.
X	>It would be truly incredible to do, to see a beam of light illuiminate
X	>a section of floor (fanning out) and perhaps cast a bright light on 
X	>an opposing wall in the room, perhaps revealing a secret etc....
X	>When the door closes, the light is gone, just as would happen in 
X	>a real situation. Is there any way to accomplish this?
X	-> Maybe later.

+	>>If I try to select "INVISIBLE COLLISION HULL" from the "ADD SPECIAL"
+	>>dialogue box, I get a RTE 380- Invalid Property Value.
+	Fixed invisible collision hulls.
	
+	Moving brush coplanar bug: Kootch entryway.
+	Fixed all known moving brush bugs.

///////////////////////////////////////////////////////////////////////////////
11-14-96

+	The CyberLore team are experiencing an UnrealEd crash when entering numbers
+	in the primitives properties boxes. This is on a fairly regular but random
+	basis. I've sent their log files (2) to the /bugs directory.
+	Line(4) bug, fixed.  What the heck is this about Windows font smoothing???

+	>>The other thing we're doing now is to save it as a T3D, and then import it
+	>>in the current map. What we need to do then is to select all brushes in this
+	>>sub-map, and move the whole selection around.
+	>When you import a new map into the current map, the new brushes should all
+	>be selected.  Are they not?
+	They're not selected when you import them into an existing map.

+	debugf (LOG_Info,"Error opening %s",DataFile);
+	where data file is of type FILE *.  -> Thanx Mike

///////////////////////////////////////////////////////////////////////////////
11-15-96

+	Gatekeeper protocol definition.
+	Gatekeeper experimentation.

///////////////////////////////////////////////////////////////////////////////
11-16-96

+	Gatekeeper Ole interface.

///////////////////////////////////////////////////////////////////////////////
11-17-96

+	Gatekeeper remote property editing and browsing.
+	Scrapped Ole interface in favor of cleaner TCP interface.

///////////////////////////////////////////////////////////////////////////////
11-18-96

+	Rewrote Gatekeeper using database/subscriber paradigm.

///////////////////////////////////////////////////////////////////////////////
11-19-96

+	Silhoette edge occluded experimentation
+	Integrated Eric's new spanbuffer code

///////////////////////////////////////////////////////////////////////////////
11-20-96

+	Gatekeeper database grid updating

///////////////////////////////////////////////////////////////////////////////
11-21-96

+	Researched HTTP protocol.
+	Researched FTP protocol.
+	Revised Gatekeeper protocol.

///////////////////////////////////////////////////////////////////////////////
11-22-96

+	Gatekeeper docs overhaul
+	Started gatekeeper discussion group
+	Experimented with edge rendering code some more

///////////////////////////////////////////////////////////////////////////////
11-23-96

+	Next generation gaming interview - cool!
+	Played a bunch of new games.
+		Sorry but Tomb Raiders looks and plays awful.
+		Amok is extremely cool - I think this team will go on to produce major hits.

///////////////////////////////////////////////////////////////////////////////
11-24-96

+	Worked on Gatekeeper stuff.

///////////////////////////////////////////////////////////////////////////////
11-25-96

+	Gatekeeper level launching and crash detection
+	Unreal 0.85 cleanup

///////////////////////////////////////////////////////////////////////////////
11-26-96

+	Can't click on menu-down in add-actors mode.
+	Highlight meshes in 3d views.

+	jschreiber bug indicates that 24-bit (or some weird colordepth?) crashes. -> Fixed it.
	
X	Texture browser needs Find filter (checkbox, goes to all). -> No it doesnt get out of
X	the DOS ages my friend.

X	>I can't select individual verticies of moving brushes in order to make them
X	>pivot on a particular vertex. (used to be able to)
X	-> You HAVE to select your pivot before you add it as a moving brush.

+	We used to be able to replace a moving brush in MapEdit mode by loading the
+	desired brush, going to Display on the moving brush properties, and then
+	hitting Use Current under Brush. This isn't working anymore, in case no one
+	else noticed (or did I miss an earlier post). -> Fixed

+	UnrealEd fixes
+		After load tex fam, try to go to that family
+		New Level while actor props dialog is up crashes

+	Rotating brushes need to move the player according to their rotation: Kootch.

X	Make copy-to-brush work w/ moving brushes. -> No way to select them.

+	Invisible polys: cast no shadows.
+	Eliminate unused special brush types.

+	Pawn:
+		Player-name=string
+		Player-team=string
+		Renamed Woman to Human.

+	ZoneDescriptor:
X		NoBot zones.
+		Team-only zones.

+	Zone color and volumetry screwed when not in a zone

+	Root:
X		MeshSkin1 & MeshSkin2 -> handle via team name associations (separate system).
+		SoundRadius, SoundVolume

+	Major actor class overhaul.

X	FName -> FName pointer! -> It's faster not to, since names can be hashed consistently.

+	Show actor selection with meshes by highlighting them.

///////////////////////////////////////////////////////////////////////////////
11-27-96

+	Gatekeeper level launching and management

///////////////////////////////////////////////////////////////////////////////
11-28-96

+	Scripting experimentation.
+	Played Tomb Raiders.
+	Played Amok.

///////////////////////////////////////////////////////////////////////////////
11-29-96

+	Thanksgiving and stuff.

///////////////////////////////////////////////////////////////////////////////
11-30-96

+	Pawn needs buttons & axes

+	FovAngle
+	Bump ResFile version
+	PF_Gouraud for Gouraud surfaces? This is getting messy...

+	Lighting fixes
X		Dynamic lights should have no incidence effects. -> Looks weird.

+	Test unguardf
+	Eliminate #ifdef PARANOID
+	Added string array support
+	Fixed alignment problem with class inheretance.

+	NameAddHardcoded "None!"
+	No purge hardcoded names.

+	Internal fixes
+		UnBuild version

+	Use IsPerActor! No AActorBase::EPropertyBins directly.
+	Remove (void)s
+	FClassProperty::IsTrue -> Deleted.
+	FClassProperty::Compare

+	Event lines are drawn with NAME_NONE!
+	Fix header exporting.

///////////////////////////////////////////////////////////////////////////////
12-1-96 & 12-2-96

+	Rewrote FMemoryCache
+		This is an example of the kind of subsystem implementation that is
+			appropriate for Unreal:
+			- Simple design.
+			- Algorithmically fast implementation.
+			- Minimal use of weird advanced C++ features.
+			- No extraneous class definitions, typedefs, etc.
+		Get is >4X faster!
+		Create is >50% faster.
+		Can see what's happening with the cache graphically.
+		Half as much code.
+		Time to implement and debug, 11 hours.

+	Importing maps needs to remap actor indices (right now to account for
+		leveldescriptors and for merge imports). Test carefully.
+	Sensible cache stats: Num gets, num creates, create time.

+	Load texture family is broken!
+	ExportActorProperty: Unknown name in light class.

+	Static variables - SCRAP THEM! AUGH!

X	Astoundingly bizarre frame of reference bug with moving brushes! -> Fixed.

///////////////////////////////////////////////////////////////////////////////
12-3-96

+	Flush: Unhashed item after rebuild.
+	After full flush assure that there's only one item.
+	Changing zone properties doesn't always cause relight.
+	No Actor Index=, just use Me=...
+	Weird new node disappearing rendering problem. Seems to have disappeared (great).
+	Delete old tmapping code.

+	Consolidated Cache ID's.
+	Now have a global system for assigning cache id's (no overwrites anymore).

+	Totally moronic bug found: The reason 8-bit color thrashes so horribly is because
+	I was allocating >10 times the amount of space that's actually required. 
+	(Stupid programmer!)

+	Full proper cache locking everywhere in highcolor.
+	Proper cache locking in 256-color (gets each texture 8 times).
+	16-bit palette scalers are busted.
+	Tex remapping allocating more space than needed for each mip?
+	Must allow for multiple locks properly - one unlock per lock. Underflow check.

+	Standard zone palette lookup table functions for actor shading.
+	UnrealEd with cache locking.

+	Is TexSetup doing unnecessary cache lookups?
+	FGlobalSpanTextureMapper::SetupForPoly needs to hold lock.

+	Get rid of GBlit.Setup stuff, use ITexture instead (somehow).
+	Get proper zone lighting table for actors.
+	Check !!
+	Compute and show fps even if stats not defined.

+	UnrealEd
+		PF_Gouraud
+		Version
+		Results window - move down.
+		curved stair text
+		Isn't going to default category on select anymore?

X	Add more noise to mips to hide shadow flaws.

X		AllowEdit, PreventEdit in scripts to retract/publish parent properties
X		Use saved last-CacheIDs
+		Proper cache item locking/unlocking
X		Need 'update zones' button
X		Semisolid -> 'detail' brush, allow subtractive?
+		Build and merge creature clipping span buffer as filter through BSP
+		Draw polys clipped to span, with 2-pass setup

+		Zone fog enabling, use existing ambient and nonambient parameters.
+	Fix player standing on moving brushes that rotate
+		Test touch/untouch carefully
+		The moving brushes sometimes disappear (when frame 0)?
+		The moving brushes disapppear when in same plane of Zone Portal?
+		Compute all light brightnesses once per frame, and share them
+	Implement NF_SEE_THROUGH, NF_SHOOT_THROUGH
+		Pause key & menu option FUnreal.Pause, IsPaused() (Mark did this)
+		Collision exclusion (blocks monsters, only triggered by players, only hit by projectiles)
+			(Mark did this)
+		Touch detection bugs - fixed a while ago
+		Object cache size impact on performance -> if working set exceeds cache size
+			then thrashing is the least of your problems.

+		Actor variables
+			ScriptCountdown for slow script execution
+			TimerCountdown for the user timer
X		Preload fire/alpha palettes.

X		Tasks -> No multitasking
X			Separate server task for each level?
X			Separate task for each remote player?
X			Proper player/camera associations in
X				Local server, local client
X				Local server, remote client
X				Remote server, local client
X			No server task in UnrealEd

X		UnrealEd External tools interface -> not very useful
X			Tools interface
X			Example tool
X			Tools documentation

+	Lighting fixes
+		Stat for palette and texture regens
+		Synchronize CloudCast, CloudReflect to backdrop.
+		Fixed cylinder lighting.
+		Make sure not rebuilding meshes unnecessarily.
X		CloudReflect? -> Killed it, didn't work out, new effect coming soon.
+		Cyllinder is static unless otherwise tagged dynamic.
+		Fine tune spotlight class -> Use LightCone! Very cool!
+		Static spotlights & dynamic spotlights.
X		Update brightness via tick, from day & night bright.
+		Count palette regenerates. Is this slowing things down? -> No.

///////////////////////////////////////////////////////////////////////////////
12-4-96

+		New properties: VolumetricRadius, VolumetricBrightness.
X		Investigate overwriting shadow meshes with lighting when possible.
+		New zone inconsistencies.
X		Move LightSqrt to GRender for speed.
+		Investigate second degree interpolation instead of SizeSquared() -> Done!
+		Good default light volumetric properties.
+		All lights act volumetric in fog zones, no special type.
+		Adaptive subdivision criteria in fog zones based on projected light v-radius.
+		Fix fog and ambients not coexisting.
+		WorldRaytraceKey works.

+	>I don't know exactly how to use the brushRaytrace key but it seems to be
+	>broken in 0.83, the brushes always have the lighting of the key "0"
+	Fixed all of this stuff.

+	Efficiency of RLE light mesh encoding vs. bitmask:
+		Timstros: 142K Meshpts, 12K Changes
+		SPQR: 142K/41K
+		Aug: 515K/135K
+		Conclusion: Bitmasks are fine.

///////////////////////////////////////////////////////////////////////////////
12-5-96

+	UnrealEd: When switching actors from zone descriptor to other, doesn't set
+		default category.

+	Subtracting huge brush gives error on EdcamMove - easily repeatable.

+	Sine fx use sine table.

X	Tag moving brush surfaces for relighting when they move (PF_DynamicLight).
X		-> This just exacerbases the lack of dynamic shadows.

+	Fix enviro map water.

+	UnrealEd command line for ignoring registry settings.

+	Rotate actor in UnrealEd set bTempLightingChange for static spotlights but
+		not bTempDynamicLight.

+	Test new .ucx.

+	Don't require .UCX for play.
+	Builtin classes referenced in FGlobalClasses:
+		Actor:				Must be in memory.
+		Camera:				Must be in memory.
+		LevelDescriptor:	Is required.
+		Light:				Editor only.
+		Projectile:			Not needed.
+		Pawn:				Not needed.
+		Human:				Not needed.
+		PlayerStart:		Not needed.
+		Inventory:			Not needed.
+		Weapon:				Not needed.
+		Pickup:				Not needed.
+		Mover:				Not needed.
+		ZoneDescriptor:		Not needed.
+		Ammo:				Not needed.
+		PowerUp:			Not needed.
+	Need: UClass.IsKindOfNamed, UClass.IsNamed (same for AActorBase).

+	Test possession.
+	Test basic gameplay.
+	Fix player scaling.
+	New KillMonsters bug.

+	Documented console commands in Console.txt.

///////////////////////////////////////////////////////////////////////////////
12-6-96

+	Meetings

///////////////////////////////////////////////////////////////////////////////
12-7-96

+	UnBlastC.cpp is overly bright without ASM.
+	Zone building code still isn't quite right (6) -> Fixed it!

+	Legend map:
+		I broke Unlit again.
X		Light numbers are mapped wrong! -> They are ok.
+		Fix spotlight class!
+		New disappearing polys problem is with bounds -> Fixed, was zoning bug.
+		Make Legend map work in 0.84 properly!
+		Panning >256? No. Keep textures <256x256 if you want to pan them. That's final.

///////////////////////////////////////////////////////////////////////////////
12-8-96

+	Mult shared sides = due to microslivers!
+	Opt geom after zoning?
+	Fixed that awful light edge bug.

+	MergeZonePortals should be redundent.

///////////////////////////////////////////////////////////////////////////////
12-9-96

X	Handle bTempLightChange for non-visible cached surfs (flush surf from cache!)
X	Lighting change propagation:
X		Set bTempLightChange in:
X			UnActLst.cpp (editing actor)
X		MakeCacheID(CID_ResultantMap,iLightMesh); <- How to change?
X		MakeCacheID(CID_StaticMap,iLightMesh); <- How to change?
X		MakeCacheID(CID_IlluminationMap,iLightMesh,Info-FirstLight); <- Could replace w/ iActor.
X		Zone palettes & zone scalers <- Easy enough.
X	Can do all of this later via update tagging.

X	Reintegrate creature dithering -> Later, will rewrite.

X	Wielding process often misses lots of sides. -> Expand later in gameopt rebuilder.

+	Internal fixes
+		Crashes with stats on when you make the window really small.
+		Resource services: Purge & display output, memory used by resource type & total.
+		Figure out Unreal and UnrealEd working set sizes.

+	Count items in cache.

+	Fixed Legend mesh import bug (was an overflow).
+	Fix busted timer in Win95.
+	Flush when change cdepth.

+	Unreal 0.84 prerelease.
+		Test import & rebuild.
+		UnrealEd sanity check.

///////////////////////////////////////////////////////////////////////////////
12-10-96

+	No .htm file, launch URL directly.
+	Kill screenshot key.

+	One cannot import a .3d file (from James' tool) into UnrealEd  if the .3d file 
+	is read-only. Makes storing .3d files in SourceSafe inconvenient. meshImport() 
+	opens the file with "r+b" permission which fails, though I don't think the .3d 
+	is ever modified. You might want to change it in the original source. -> Fixed.
+	Kill launch web.

+	Flame:
+	Light steady
+	Effect Fire Waver
+	Light Brightness 40
+	Light Radius 32

+	Fix ver - says 0.85.
+	VB remove unneeded control associations.
X	Set version number to autoincrement -> Couldn't find an option for this.
+	Downgrade to VC++ 4.0. :(
+	UNREAL.EXE
+	Make comprehensive file list.

X	Legend mesh backfacing problem -> This is not a bug, there's nothing
X	texture mapped on his back. Just texture map his back.

///////////////////////////////////////////////////////////////////////////////
12-11-96
+	ddExit no fail if crashing.
+	Mesh viewer contents has zone or backdrop tint.

+	Unreal 0.84 release
+		UnrealEd installation & test on clean system.
+		Unreal installation.
+		Graphics directory.
+		Models directory.
+		Classes directory.
+		UnSrc installation (include Gate).

///////////////////////////////////////////////////////////////////////////////
Major changes from 0.83 to 0.84:

Actor properties:
	* Setting bNoSmoth=True turns off dithering of the actor's mesh.

Rendering:
	* Creatures and sprites now render in 8, 16, and 32-bit color.
	* Volumetric fog now works. This is somewhat limited in its current incarnation
	  and only works decently in small levels. On non-MMX machines, fog and shadows
	  won't coexist so use for zone sparingly.
	* Cool new backdrop code: go into "Level Properties" to fool around with the sky
	  properties. Everything is very versatile now.
	* Static and dynamic spotlights are now supported, with adjustable beam width.
	* Fixed all known portal bugs.
	* New Cylinder lights - great for placing near light textures on walls.

Optimizations:
	* Rewrote and optimized caching.
	* Optimized a lot of the dynamic lighting code, but many more optimizations remain.
	* Fixed major problem that caused 8-bit color to be extremely slow.

UnrealEd:
	* Check out the cool new "Level Properties" options!
     	* In the 'surface properties' popup, 'editor' tab, you can see how many static and dynamic lights are incident on the surfaces you have selected, as well as the amount of memory 
     	  occupied by the light meshes.
	* The world now starts out "filled" and you begin level building by subtracting
	  rather than adding. This shouldn't impact any existing maps (you can just
	  delete your world cubes now).
	* New "Level Properties" dialog.
	* Run UnrealEd with the parameter "Reset", i.e. "UnrealEd RESET", to
	  reset all of your settings to their defaults. Useful if your settings
	  get corrupted somehow.
	* Show-radii modes now shows collision and light radii.
     	* Fixed major bug in portals that are flush with other surfaces in the world. Coplanar portals are now ok, and more efficient than non-flush portals.

Level design recommendations:
	* Don't cut holes in the floor, ceiling, and walls for your moving brushes to
	  go into. This adds a lot of polygons and messes up collision. The better
	  approach is to design your moving brushes so that they never go completely
	  through the wall. That way, they look physically realistic, and they don't
	  require extra polygons.
	Use low shadow detail everywhere you can, especially in large areas.
	    Shadowing/lighting time is killing performance in a lot of our levels.

Limitations:
	* Fog zones don't mix properly with:
	  - Portals to non-fog zones.
	  - The sky.
	  - Environment mapped water.
	  This is a general limitation with the fogging method on non-MMX machines and
	  this is not going to change, so restrict levels accordingly.

Known problems:
	* When you reimport maps in 0.84, you will need to manually reset the "Event"
	  properties of all of your triggers and moving brushes which trigger other
	  properties. Alternatively: If you have a lot of triggers, that would be a
	  pain, so you can update your .t3d file manually. Just:
	  1. Edit your *.t3d file with Notepad or Wordpad.
	  2. Replace all occurances of "EventName=" with "Event=".
      3. Save it.
	  4. Import it.
	* Player collision is still sloppy.
	* The player jumping and rotation controls aren't scaled well.
	* Texture mapping and visibility code needs major optimizations.
	* I haven't integrated with the new version of the sound system, so sound
	  support is the same (still limited) as 0.83. I'll have an update soon
	  once I've merged Ammon's latest code into 0.84.
	* Creature drawing code needs major optimizations.
	* UnrealEd is still quite the memory hog. If you get messages like
	  "Unreal has run out of virtual memory; you need to free up more hard disk space"
	  then that means, surprise! Unreal has run out of memory; you need to free up
	  more hard disk space. This is not a bug.
	* Creatures are always unlit. Creature lighting will be back later.
	* Transparent and masked textures don't display in most video modes. They will be 
	  back much later.

I will attend to the above once scripting is done.  I want to get the engine 
feature complete first, and then work on perfecting it, so that we can all get the 
most work done in parallel. Otherwise we'll be 6 months down the road and have the 
fastest rendering and physics engine around but no game elements and scripting 
language.  The current approach is the lesser of the two evils...

///////////////////////////////////////////////////////////////////////////////

>>Mark & Ammon:
	Anything that includes <windows.h> or relies on any of the Windows DLL's (winmm.dll,
		etc) needs to go in the Windows project.

>>Ammon:
	Can you always include a debug version of SoundEng.lib along with the release
		version in the future? Just name it dSound.lib.
	The sound system has been acting quite stably since the last merge, good job
		Ammon & Carlo!

>>Mark:
	It's not worthwhile merging any of the stuff in the Game project at the moment.
		As I prepare for scripting, this is going to undergo so many changes that the
		best strategy is to reconcile all of the code after my work on scripting
		is done. In the meantime the code in the Game project is a warzone.

	I'm not sure that I merged your Delta84 properly, because I found that most of the files
		I'd checked were unchanged changed (relative to the original I posted)...

	I merged some of my debugging code into your UnChecks.h, and now that's available 
		everywhere for convenience.

	Note the new "#if defined(_DEBUG) || defined(CHECK_ALL)" in UnChecks.h - CHECK_ALL is
		useful for enabling checks in individual files during development.

	You have some memory leaks. See the "Unfreed:" entries in the log upon exit for a 
		list of them.

	And now we need a "Video" tab with these options...
		Texture smoothing (note: no performance impact)
			Full texture smoothing
			Adaptive texture smoothing (high-res only) <- default
			No texture smoothing
		Default color depth
			8-bit color
			16-bit color (recommended on Pentiums)
			32-bit color (recommended on PentiumPro's)
			Always use current Windows color depth <- default
		Use MMX Multimedia Extensions (a checkbox; default is checked, but must 
			be greyed when no MMX support is available. You can detect this with GApp->MMX).
		Use Direct3D Hardware Acceleration (a checkbox; default is checked, but must be 
			greyed when no Direct3D support is available. This isn't detectable yet.)

///////////////////////////////////////////////////////////////////////////////

>>Changes to be wary of for error symptoms

	Transaction tracking changes
	Infinitely resizable resources
	New fast actor list code
	Resource alignment and realignment
	UModel-ULevel merging
	IModel, ILevel, ICamera deletion
	Property bin changes.
	INDEX_NONE = MAXDWORD
	ARoot/AActor reorg
	FClassProperty::AddToFrame change
	Actor properties are now 4-aligned with #pragma pack (push,4)
	Actors.Num != Actors.Max
	GClasses.Associate,GGame.Init order
	UnEngine.cpp game init order
	Debugger says overreading/overwriting ShadeData
	NF_Bounded
	Unres.cpp: UnclaimedNames->Element(i).Kill();

///////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////
12-12-96

+	Cleaned up the installers.
+	Installer icons.
+	Installer launch links.
+	Palettes and backdrops fixes.

///////////////////////////////////////////////////////////////////////////////
12-13-96

+	Refuse to play level if scripts aren't up-to-date (no recompile in play).
+	Added stub FRoutingNode, FReachSpec, URoutingTable, UReachSpecTable for Steven.
+	Extra ULevel additions - did this break the level format?
+	ULevel::Lock & Unlock.

///////////////////////////////////////////////////////////////////////////////
12-14-96

+	Removed
+		AiAnimat.cpp
+		UnActPro.cpp
+		UnFActor.h
+		UnCheat.h
+		UnCheat.cpp
+		UnFActor.cpp
+		UnDecora.cpp
+		UnExplos.cpp
+		UnGCheat.cpp
+		ai struct
+		UnPawns.cpp
+		UnRandom.cpp
+		UnRandom.h
+		UnInv.cpp
+		GLevel
+		CollidingActors

+	Classes
+		Cleanup Actor
+		Cleanup Pawn
+		Make most stuff nonintrinsic.

+	Cleanup
+		Recompile Root.tcx.
+		Delete PBeginPlay.
+		Update PPlayerTick to include time delta.
+		PlayerTick and Tick TimeDelta.
+		No special PlayerTick - just use Tick.		
+		GAudio.SfxMoveActor(iMe,&Location) out of Tick
+		Check location of all GAudio calls.
+		GAudio.SetOrigin in UnrealEd for current window only.
+		GAudio.SfxStopActor when kill.
+		GAudio.PlaySfxLocated for ambients.
+		Cleanup SourceSafe files.

+	LevelDescriptor
+		BeginPlay parameters

+	Classes & Messages
+		LevelDescriptor: GameTickRate, RestartLevel, JumpToLevel
+		Pawn: bLocalMovement, bLocalRotation
+		Messages: Sound playing messages
+			PlaySound(USound,Radius,Scale)
+			PlaySoundFar(USound,FVector,Radius,Scale)
+			PlaySoundNowhere(USound,Scale)
+		const Parent, Target, Me, Class, touching actors, bStatic, bCollideActors, etc.
+		ACTOR_Spawned, ACTOR_Destroyed, ACTOR_SetCollision
+		Spawn actor message for spawning actors.
+		Can't spawn actors of template classes.
+		Actors spawned during play cannot be static.
+		Remove movement stuff from Tick, go back to PlayerTick.
+		Remove movement stuff from pawn class.
+		Design new movement packet: boolean array and float array.
+		Early GDefaults init.
+		Variable tickrate via command line.
+		ACTOR_Spawn
+		ACTOR_Damage, PDamage
+		ACTOR_InternetSend(IpStr,NameStr,Text)
+		ACTOR_InternetReceive(IpStr,Text)
+		ACTOR_StateExists, ACTOR_LabelExists, ACTOR_StateAndLevelExist
+		ACTOR_Goto, ACTOR_BreakTo

+	Todo
+		Cleanup AActor::Process mess
+		BeginPlay killing.
+		Check todo's.
+		PHit?
+		EDamageType? Figure out damage stuff.
+		Cleanup UnMsgPar.h
+		Cleanup UnMsgs.h

+	Special support:
+		ChanceOfExistence, RandomDivider, RandomRemainder

///////////////////////////////////////////////////////////////////////////////

Status report
-------------

I'm making fast progress on UnrealScript. The following items are done.

	Script Compiler:
	- Global, local, and static variables of the following types:
	  Byte, Integer, Boolean, Real, Actor (of any class), Resource (of
	  any type including textures, actor classes, sound effects, etc),
	  Names, Strings, Vectors, Rotations.
	- Functions with parameters and return values.
	- Planned the remaining details out.
	- Built-in functions.

	Preparation work:
	- Set up some basic facilities so that Steven's work can begin soon.

	Script executor:
	- Planned how everything will fit together.

I'm at the point now where I know what most of the language's final capabilities 
will be. And the future is bright! Here are some of the cool UnrealScript
possibilities:

	- You'll be able to script AI, moving brushes, triggers, player movement, and
	  just about anything else you can think up.

	- Everything that's accessible in the "Actor Properties" window is accessible
	  via script code, so you can use scripts to modify just about anything about
	  an actor.

	- Once Steven's routing code is complete, you'll be able to write AI scripts
	  at an extraordinarily high level: For example, in one command, you could tell
	  an actor to go find its way to a certain switch in a level, then in one more
	  command tell him to press the switch, and the actor will find its way through
	  the level and go do what you asked. This will be awesome for prescripting actors
	  to occur in levels -- it now looks like that will be *very* possible, whereas 
	  before it seemed prohibitively difficult and time consuming to program.

	- The scripting language will be object oriented with single inheretance, so you'll
	  be able to write new scripts that expand on existing scripts very easily.
	  This also means that properly-written user patches will be able to coexist with
	  one another.

	- Programming complex sequences of animations and sound effects is a breeze.

	- There will be a function for sending data over the Internet to other levels, and
	  for receiving data. This will enable UnrealServers to actually communicate with
	  other UnrealServers, for coordinating multi-level events.

Unreal long-term outlook
------------------------

	After Unreal 1 is finished, my next project will be, surprise! More Unreal.
	In designing the engine, a major priority has been designing it to be
	very expandable and component-based. On future projects, I plan to rip
	out and rewrite several core parts of the engine, leaving the rest
	intact. While Unreal will eventually become outdated technology, I don't
	forsee that happening in the next 30 months: Until CPUs and 3D hardware
	become >10 times faster, 3d games will continue to revolve around drawing
	relatively low-detail (in absolute standards) polygon environments.

	Some technologies I'll be exploring after Unreal 1:

	- NURBS creatures with skin-and-bones interpolated rendering (20X the
	  visible creature detail in the same RAM!)
	- Truecolor radiosity preprocessing.
	- Fractal objects.
	- Bump mapping. -> Note on 1/5/96: Already added this to Unreal 1!
	- Solid volume surface-differential dynamic volumetric lighting.
	- Dynamic moving brush shadows.
	- Dynamic actor shadows.
	- Fourier synthesis texture mapping.
	- Level of detail support in UnrealEd for greater scalability.
	- Analytic edge antialiasing and postprocess sinc antialiasing.
	- Persistent multiplayer stats support.
	- Jpeg style texture compression to enable levels to have 5X more textures in same space.
	- Stoichastic motion oversampling.
	- Microtexturing.
	- Microfaceting.
	- Inverse kinematics.

///////////////////////////////////////////////////////////////////////////////
12-15-96

+	Class changes.
+
+		LevelDescriptor: LevelState, ELevelState, bInternet
+		Actor: State

+	AActor::IsParentOf(iTestActor)

+	SpawnXActor return AActor, not iActor.
+	Level dynamics should refer directly to AActors, not iActors.
+	iTouchActors
+	TempActors
+	AddActorSphere
+	DestroyActor
+	Retest moving brushes
+	Camera->Actor, not iActor
+	SetBinPointers optional parms.
+	BeginTouch, EndTouch.
+	Possession
+	GetLevelStateDescription
+	XMoveActor
+	iActiveActor
+	All ILevel functions use AActors, not iActors.
+	Why is APawn* -> AActor* not working?
+	Eliminate all unnecessary actor casts.

+	Implement:
+		ACTOR_QueryActors(UClass,DynamicOnly) for iterating through actors.
+		ACTOR_QueryTouchActors
X		ACTOR_QueryTrace, PQueryTrace -> Replace with Trace.
+		ACTOR_Trace, PTrace
+		ACTOR_QueryRadial, PQueryRadial
+		Check that all crucial messages are implemented in UnRoot.cpp.
+		UnrealScript now supports boolean arrays. They are not packed but that's ok.

+	Cleanup:
+		IModel remove redundent junk.
+		Nice element operator.
+		Now using smart pointers throughout.
+		No UModel::Kill.
+		UVertPool -> UVerts

///////////////////////////////////////////////////////////////////////////////
12-16-96 & 12-17-96

+		Finish Editor files
+		Eliminate redundent IModel and UModel.
+		Eliminate redundent Trans and LockType.
+		Added UnModel.h
+		Test undo/redo
+		Use UActors smart pointers.
+		Use smart pointers throughout resource headers.
+		Actors.
+		UResource::Kill as private?
+		Eliminate ILevel
+		Eliminate ILevel.
+		Camera->Level pointer.
+		Eliminate duplicity in ULevel::Lock.
+		Actor process functions take ULevel&
+		GServer.SetLevel, GServer.GetLevel encapsulation.
+		Eliminate ICamera.
+			Locked
+			CameraInfo
+			ModelInfo

+		When finding zone descriptors, ignore actor 0.
+		Assign LevelDescriptor to all ZoneDescriptorless zones.

+		Rebuild root.

+		Options/level crash!
+		Retest zone gravity and zone handling.

X		GetActorZone() performance? -> Eliminated it.
+		LevelDescriptor expands ZoneDescriptor, so GetZoneDescriptor never fails.

+		Make ULevel a child class of UModel to flatten the unnecessary hierarchy.
+			Make sure everything works with resource inheretance.
+			Remove ULevel::Model, set up constructors, init/exit, and resource functions.
+			Gravity is messed up.

+		Class changes.
+			DrawRot -> Rotation
+			Placed crucial actor properties in top 32 bytes of struct.
+			ViewRot -> ViewRotation (Pawn)
+			Retest Undo
			Retest moving brushes

+		Always 32-align all resource data.
+		Realloc needs to reshuffle aligned data properly.
+		FGlobalPlatform, reallocaligned and fixed bug allocaligned overallocation problem.
+		Actor++, Actors->Element(0) elimination.

X		Stick a ULevel* in actors so that ::Process funcs are context free?
X		-> No, this doesn't add anything useful.

+		::Process take PMessageParms *
+		SendMessage funcs take PMessageParms *

///////////////////////////////////////////////////////////////////////////////
12-18-96

+	Decided to stick with actor indices rather than convert to actor pointers.
+		Avoids a can of worms conversion attempt.
+		Makes actors fully relocatable.

+		QueryTouchingActors serious bug
+		Hardcoded 16 slaves
+		ULevel::DestroyActor touching actors notify bug
+		Check all GetPropertyPtr

+	Stick crucial stuff at top of actor structure for cache coherence

+	Level
+		Make the global moving brush class a class, remove redundency, cleanup Actors.
+		Undo selecting a poly crash: TestLev is already locked
+		Zone as actor reference.
+		SetActorZone bForce parm

+	StatusDescriptor chain!
+	bOnlyParentCanSee flag for rendering weapons etc, rather than current hack.

+	UCamera, ULevel, UModel, FGlobalServer inlines where needed, cleanup lock and init,
+		comment stuff.
+	Alloc reachspec and routing table in ULevel code.

+	Better def tex, don't remap.

+	Deal with 8-bit palettes as 5-6-5 palettes, with a 64K lookup table!
+	No special 8-bit color shader resource.
+	No preremapping of textures, remap on the fly with the shader.
+	->	Did it, looks kinda weird. Have the guys check it out and comment on whether
+		this is an improvement (go into 8bit and type REND EXTRA4).

+	Check all FirstActive
+	Handle just deleted actors
+	Script editor tabs=4
+	Paranoid

+	UnArray.h
+	Quick actor lists:
+		Replaced admin lists with doubly linked list for speed & simplicity.
+		SpawnActor, DestroyActor, just-deleted code.
+		Wherever we copy actor default properties.
+		No import, export PrevID, NextID.
+		After import, relist.

+	PlayerTick in UnrealEd crashes in Timstro due to iZone -1.

X	Expanded property bin support.
X		UClass needs UBuffer *StaticData.
X		New Global property bin, ULevel *GlobalData, can later be used by global code modules?
X		Need static variables, init once per class. Can be edited, but only in default props.
X		Need static const's.
X		Variable size static consts, just cram into a class-attached buffer of variable size.
X		-> Don't need statics at all.

+	Engine
+		Always set actor's iLevel=0.
+		AddParentProperties, modify actor's iMe class type.

///////////////////////////////////////////////////////////////////////////////
12-19-96

+	Replace IDD_UNWN_DIALOG with IDD_LOG
+	Renamed SoundEng.lib to UnSound.lib for consistency.
+	Remove debug .libs from source.
+	Misses default category on LevelDescriptor because the category was retracted!
+	Renamed Purge to GarbageCollect.
+	Kill all ancient QueryRes stuff
+		UnRes.cpp
+		UnClass.cpp
+		Add class
+		Res browser and class browser initial expansion
+		Script ed selection
+		LaunchScriptEd figure out if editable
+		If not god mode, allow edit script in read-only mode.
+	Kill all remaining global link query variables.
+	Killed UnTexEd
+	AudioCmdLine -> FGlobalAudio::EditorExec
+	FTopic char *Topic is unnecessary?
+	Fix UnrealEd res browser.
+	Check all resource kills.

X	Non-class code modules? -> Not needed, Java gets along without them.
X	State-local variables?
X	Resource purge after destroying cameras.

+	Split RTF_ScriptReferenceable to RTF_ScriptReadable and RTF_ScriptWritable
X	Element as Template ResPtr<>? -> Fixed TArray instead

+	Compression test: PKZIP
+		Unreal.ucx 48%
+		Unreal.unr 87%
+		Mine.utx   46%

+	Camera PreKill don't try to lock level if we're exiting/purging - how to handle this well?
+		RTF_PreKill denotes resources that have a nondefault PreKill routine.
+		GarbageCollect destroys all RTF_PreKill resources before all other resources.
+		This solves all order-of-destruction problems except for RTF_PreKill circular references.
+		The engine in its current incarnation has no RTF_PreKill circular references though.
+	Clean up exit GarbageCollect.

///////////////////////////////////////////////////////////////////////////////
12-20-97

+	Bump resfile version.
+	UTextBuffer now implements FOutputDevice.

+	int  RefCount(UResource *Res); // Count references to UResource.
+	int  AttempPurge(UResource *&Res); // Purge iff unreferenced, not counting the one reference at *Res.
+	Clean up any dangling allocs - malloc? new?
+	Logf(CONSOLE_SPAWN_1);
+	Logf(CONSOLE_SPAWN_2);

+	Export stuff using UTextBuffer rather than fixed length strings.
+	FPoly::Finalize no longer sets base.
+	All FOutputDevice methods must use Write.
+	Link topic return value should be a FOutputDevice.
+	Retest import/export
+	Retest 2D editor, complex brush builders.
+	Retest texture alignment.
+	Retest scripting.

+	ExportActor.
+	Test imports and exports.

+	strhash case insensitivity.
+	Check MAXSWORD

+	Why use private variables: No I'm not becoming a C++ freak. Variables declared
+	private are done so for one of the following reasons:
+	-	The stuff there is likely to change.
+	-	The stuff there is fragile and changing it directly rather than through the
+		class's interface is dangerous.

+	UDatabase::IsValidIndex
+	Better resource and name mapping.
+		UArray:		Maps indices to resources.
+		UEnum:		Maps indices to names.
+		ULinker:	Links and delinks resources.

+	Int resindex

+	appMessageBox,appMessageBoxf

+	Implement resource linker.
+	::QueryHeaderReferences must call parent class QueryHeaderReferences.

+	Kill RegisterType
+	ULinker::PreKill, close file (if any).
+	Eliminate UResource::Flip

+	The reason 0.84 was so slow going around corners was the anal debugging code
+	in the new caching code, which is now disabled.

+	UResource needs recordsize 0
+	Cleanup AUTOREGISTER_TYPE
+	Call GRes.Tick.

+	ULinker::Link, Delink: int DoHeader, int DoData.
+	Eliminate UResource::Register

+	Use linker class for load-linking
+	Fix new camera PreKill(?) bug.

+	ULevel::Unlock cleanup actor list.
+	Eliminated bJustDeleted.

+	Fix busted Actor->Next() logic:
+		No bJustDeleted list: Keep Deleted actors in ActiveActors.
+		Move bJustDeleted actors over at end of tick.

+	Sort surfs by zone->palette->texture for greater coherence.

+	Saver use ULinker, optionally return the ULinker.
+	UDatabase needs:
+		Empty()
+		Shrink()
+		Add(int Num=1) that performs conditional realloc.
+		AddItem
+		AddUniqueItem
+		Delete
+		DeleteItem

+	Properly encapsulate resource linker and its query routines.
+	Privatize all of the necessary UResource info.
+		Type  -> GetType()
+		Name  -> GetName()
+		Data  -> pre-existing GetData()
+		Index -> GetIndex()
+		Flags -> GetFlags()
+		Version -> GetVersion()
+	Check overhead of Element(), Ptr() -> No overhead. VC++ rules!
+	Res ArrayAdd
+	Kill UTexture::Class
+	Kill UTexture junk.
+	Increase UTexture MaxMips to 12 so D3D will have a full set.
+	UTexture -> Database
+	Deleted texture family name

///////////////////////////////////////////////////////////////////////////////

+	Mesh view is broken too.

+	While I'm about fixing the mesh viewer, may as well add editing
+	capability...
+		New mesh resouce variables
+			CurPoly (or INDEX_NONE)
+			CurVertex (or INDEX_NONE)
		Polygons mode
			Show texture associations as colors
		Mesh viewer
			Highlight on/off toggle
			Highlight current polygon
			Allow selecting polygons
			Show all vertices
			Allow selecting vertices
		Move around modes
			Rotate around
			Freeform move
		Texture view
			New texture view act as slave to mesh view.
			Show current texture
		Buttons
?			Show Selection
?			View It/Texture It
?			Browse textures
			Apply texture
			Add texture
			Remove texture
			Pan button
?		Menu
			File
				Load meshmap
				Save meshmap
				Clone new meshmap (warn of texture associations)
				Import meshmap from directory (origin X/Y/Z/P/Y/R)
			Edit
				Add animation sequence
				Edit animation sequence
				Delete animation sequence
				Origin/Scaling
		Advanced
?			Home
?			Set scale X/Y/Z
?			Add/Edit sequences (seqname, startframe, nframes, rate)

1. Basic UI hooks.
2. Resource changes and improvements.

	Sky fog start later
///////////////////////////////////////////////////////////////////////////////
12-21-96

+	UMeshMap texture array
+	Unlimited nodes
+	Unlimited surfs
+	Unlimited points and vectors
+	Unlimited verts, ubounds

+	Empty model shrink tables
+	Empty resource shrink tables
+	SlowTask reentrancy problem?

+	BspRefresh only refresh
+	Fixed undo buffer overflow bug.

X	Improve Bsp speed in huge levels. -> Difficult.
+	ULevel::Shrink (call before saving) fixup, UModel.shrink
+	BrushArray shrinkable

+	Note that resource ctor calls InitHeader upon creation.

+	New optgeom bug?
+	Fixed transaction buffer NoteSingleChange crash.
+	Fixed optgeom bug with portals

+	Polys->Num

+	Unlimited polys
+	Cleanup editor Poly refs

+	Retest goddamn asc importer
+	->Add() -> AddItem where circular

///////////////////////////////////////////////////////////////////////////////
12-22-96 & 12-23-96

+	Intersect/deintersect fail
+	Better manage TempModel

+	Fix all new unlimited poly bugs
+	Moving brush code fails

+	Test rebuild classes

+	Encapsulate FFont:
+	void Cout(UTexture *DestTexture,int X, int Y, int XSpace, UFont *Font, int Color, char C,RAINBOW_PTR Palette);
+	UFont *MakeFontFromTexture (UTexture *Texture);
+	void StrLen(int *XL, int *YL, int XSpace, int YSpace, UFont *Font, const char *Text);
+	void WrappedStrLen(int *XL, int *YL, int XSpace, int YSpace, UFont *Font, int Width, const char *Text);
+	void VARARGS Printf(UTexture *DestTexture,int X, int Y, int XSpace, UFont *Font, int Color, const char *Fmt,...);
+	void VARARGS WrappedPrintf(UTexture *DestTexture,int X, int Y, int XSpace, int YSpace, UFont *Font, int Color, int Width, int Center, const char *Fmt,...);
+	Retest font code

+	Kill UActorList::Trans
+	::InitHeader *always* call parent.

+	UResource::InitHeader set LockType=LOCK_None.
+	UDatabase::InitHeader set Num, Max

====0.84e

+	UnLevAct don't use GTrans explicitly
+	Fixed new actor undo bugs

+	UDatabase::Modify(Index)
+	Get rid of UActors::Lock
+	UResource::Modify
+	UResource::Lock, UResource::Unlock.
+	UModel::Lock, ULevel::Lock, UCamera::Lock lock the appropriate subresources.
+	Get rid of spurious SetLockType calls

====0.84f
+	UDatabase::ModifyAll
+	UActorList::ModifyAll
+	UBspSurfs::ModifySelected
+	Eliminated CPT_NoSave
+	FGlobalResourceManager saver automatically handles RTF_NoSave
+	RTF_NoSave: Camera, ULinker, UTransBuffer

+	Always fixup max

+	Fix Bsp undo bug.

====0.84g
+	Remove old NoteXX functions from UnEdTranc.cpp
+	UDatabase::PostLoadItem
+	Transaction tracking handle reallocated resources
+	Encapsulate resource transactionality?

+	UActors: PostLoadItem, PostLoadHeader
+	UClass: PostLoadHeader
+	UDatabase::PostLoadData

+	Shrink TempModel after bsp ops.
+	Shrink everything after bsp or geometry rebuild, bap er

====0.84h
X	UResource::InitData automatic
+	Eliminated UResource::InitData
+	UClass ctor
+	Check all appMallocs
+	Replaced redundent AllocData with ReallocData
+	Shorten memory pools in Unreal and UnrealEd

====0.84i
+	UTransBuffer ctor instead of init
+	Intersect and deintersect and screwed up
+	ResNames - 320K = excessive, now dynamically allocate.

+	Automatic UDatabase::QuerySize, QueryMinSize
+	No hardcoded UArray sizes.
X	Autoexpandable UActors.
+	Undo/redo isn't affecting brush array
+	Auto-transact Delete
+	Adding/removing points/vectors needs to modify?

+	UModel::PostLoadHeader
+	UBspNodes::PostLoadItem
+	UnLevel.cpp, UnModel.cpp: No need to postmodify stuff.
+	UResource::Lock error if LOCK_Trans and not GTrans; not GTrans checking elsewhere.

====0.84j
X	NoSave UBounds, just create on postload -> Shaky.

///////////////////////////////////////////////////////////////////////////////
12-24-96

+	Watch out for Actors->Max trap!

====0.84k
+	Cleanup FResourceCallback args
+	FResourceCallback -> FArchive
+	Eliminate ParentRes from resource query

====0.84l
+	Cleaned up FArchive calling.

+	RESOURCE_DB_CLASS() creates automatic SerializeData.
+	UClass::SerializeData    -> Can use FClassProperty <<
+	UEnum::SerializeData     -> Can use UEnum <<
+	UArray::SerializeData    -> Can use UResource <<
+	UPolys::SerializeData    -> Can use FPoly <<
+	UBspSurfs::SerializeData -> Can use FBspSurf <<
+	UActors::SerializeData   -> Can use IsEmptyItem()
+	Class rebuild

====0.84m
+	UMesh separate header.

///////////////////////////////////////////////////////////////////////////////
12-25-96

+	Merry Christmas.

///////////////////////////////////////////////////////////////////////////////
12-26-96

+	Cleaned up resource declarations:
+		Replaced RESOURCE_CLASS with DECLARE_CLASS
+		Replaced RESOURCE_DB_CLASS with DECLARE_DB_CLASS
+		Replaced AUTOREGISTER_RESOURCE with IMPLEMENT_CLASS
+		Replaced AUTOREGISTER_DB_RESOURCE with IMPLEMENT_DB_RESOURCE
+		Motivation for this: To make it easier to create and modify Unreal 
+			resource classes.

+	Note:
+		The two recent changes I've made to the Unreal architecture, the
+		new resource class declaration method and the serialization system,
+		are designed to make it easier to create new resource classes and
+		modify existing ones without breaking binary file compatibility.
+		Though this has not been necessary in early Unreal development, 
+		it will become increasingly important as the technology evolves.
+		This has resulted in more sweeping engine-level changes than I would
+		have liked, but the end result is worth it.

+	Separated FMeshVerts into a subresource.

====0.84n
+	Separated UMeshTris into a subresource.

====0.84m
+	Separated UMeshAnimSeqs into a subresource.

====0.84o
+	AnimFrames
+	Separated UMeshVertConnects into a subresource.

====0.84p
+	Separated UBounds into a subresource.
+	Created UWords, separated FVertLink into subresource.

====0.84q
+	Eliminate IMesh, IMeshMap.
+	Mesh lock, unlock properly.

====0.84r
+	Merge UMesh and UMeshMap.
+	Init texture array.
+	Rebuild classes.
+	Kill RES_MeshMap.
+	meshImport, meshBuildBounds -> GEditor
+	new(name,base,DUPLICATE_Unique/DUPLICATE_Replace)

+	Eliminate CopyHeaderFrom since Duplicate does the job.
+	DECLARE_DB_CLASS use DECLARE_CLASS for standard initialization.
+	All resources are now IUnknown derivative and expose an OleRefCount.

+	The engine is now set up so that it would be very easy to make all
+	Unreal resources into Component Object Model objects. However I don't
+	plan to do that unless there is a compelling reason.

+	UResource no longer tracks MaxFiles.
+	Make global resource table infinitely expandable.
+	Rebuild out of virtual memory bug -> Was CleanupNodes side link bug
+	ULinker::LoadHeader, SaveHeader
+	ULinker::LoadData, SaveData
+	Separate FUnknown into its own class.
+	Cleanup UnResTyp.h.
+	UMesh ctor for allocation.

====0.84s
+	Kill GDefaults.MaxRes, MaxFiles.
+	Res list type show detailed summary of the type's resources.

====0.84p
+	Improved memory pool logic by adding FMemMarker for marking the current 
+		position in the pool. This will make it possible to merge the GMem,
+		GDynMem, and GCache memory into one big pool without any engine changes,
+		while will both greatly reduce memory allocations and increase the
+		maximum size of each pool.

====0.84r
+	Fixed raytrace bug with moving brush tracker overflowing.
+	VC++ _alloca doesn't seem very stable, get rid of it.

///////////////////////////////////////////////////////////////////////////////
12-27-96

+	Break out resource headers so they are individually loadable.

====0.84t
+	Stick file summary at top of file.
+	Random access order loading of data.
+	Random access loading of headers.

====0.84u
+	GetActualResource -> GetActualResource, PreloadHeader, PreloadData
+	No special casing of actual resource getting.
+		Resources must not preload other resources circularly in their
+		serializers, because this makes it impossible to load a resource
+		file. Note that none of the existing Unreal resources exhibit 
+		circularity. Don't create circular preload dependencies in serializers.

====0.84v
+	Wrote all resource and data item serializers.
+	String serialization function.
+	AActor serializer.

///////////////////////////////////////////////////////////////////////////////
12-28-96

====0.84w
+	Got rid of buggy ASM mymemset, mymemeq.

====0.84x
+	Set up Unreal.cpp as a precompiled header (full rebuilds are now 5X faster!)

====0.84y
+	Now generate debug info for release build so it's easily debuggable.

====0.84z
+	Modularize linker's saver code.
+	Cleanup saver code.

====0.842a
+	Serialize names, misc records.

====0.842b
+	Note: UClass *Class must be the first variable in AActor.
+	Fixed actor serializer.

====0.842c
+	Serialize resource data on load/save.

///////////////////////////////////////////////////////////////////////////////
12-29-96

====0.842d
+	Eliminate GSave

====0.842e
+	Replaced FResFileEntry with new UResourceBase.
+	Serialize resource headers.
+	Thank God that's done with.

====0.842h
+	Eliminate GetActualResource.
+	Fixup res flags when saving.

+	Move file data offset and size into UResourceBase.
+	Eliminate that TempRes stuff.
+	Postload fixup level state
+	Eliminate ParentRes in PreLoaders

====0.842i
+	Separated ULinker into ULinkerLoad, ULinkerSave.

====0.842j
+	Cleaned up ULinkerLoad, ULinkerSave.

====0.842k
+	Merged ULinkerLoad and FArchiveLoadLink.

====0.842l
+	Merged ULinkerSave with FArchiveSaveDelink.
+	Loading and saving are now extremely clean concepts.

====0.842m
+	ULinkerLoad subclasses FArchiveFileLoad.

====0.842n
+	ULinkerSave subclasses FArchiveFileSave.
+	AddFile must have the try{} since ctor may throw.

====0.842o
+	Write and verify FileHeaderSize, FileDataSize during load.
+	Serializers must never serialize internal vars (would cause CRC problems).
+	Test byte order reversing.

+	Postloaders & remove:
+		Bsp: iDynamic
+		ULightMesh DB class

====0.842p
+	Way optimized serializer for db's with element size 1 (byte).

///////////////////////////////////////////////////////////////////////////////
Summary of the resource code changes:

Unreal resource files are no longer a binary dump of Unreal's internal
structures. The improvements are:
    - It's now easy to support backwards file format compatibility.
	- Byte order conversion for N64/Mac is now automatic.
	- Resource file loading/saving is not tied to the file system, so
	  it will be easier to move the code over to other platforms.
	- Much greater support for garbage collection is in place, a requirement
	  for UnrealScript.

///////////////////////////////////////////////////////////////////////////////
>> What is true though is that the techno frenzy of the gaming industry is 
coming to an end. We went through CGA, EGA, VGA, SVGA, 3D VGA, 3D SVGA, 
now 3D SVGA HiColor. Whats next? There is nothing, end of it, more performance, 
so what? 20 frames/sec or 30, doesn't matter really. <<

Sounds reasonable, yet that's what people were saying that back when 320x200, 
256-color VGA games were the great new thing - "who will ever need more than 
256 colors?"  It's like in the 1940's after the equation governing the motion 
of the electron had been discovered - it was widely believe that physics 
would be "over" in a few months - once the proton's equation was found.

There are more innovations coming in the future for realtime computer graphics 
than there have been in sum in the past.  Here we are in 640x480, 16-bit color 
looking forward to 800x600, 24-bit color, but there is so much cool stuff 
coming to enhance the realism of 3D in addition to higher res that our current 
technology seems almost pitiful: edge antialiasing, specular bump mapping, 
NURBS objects, fractal objects, volume rendering, radiosity rendered 
environments - we'll see all of these things in commercial use in realtime 
by the end of the century.  I can't begin to envision what's after that, 
but it's certainly not "nothing".

We are so far away from photorealism that a 100X improvement in processing 
powerful wouldn't be enough to get us there. To do the coolest special 
effects from movies in realtime would require more like a 10,000X performance 
improvement. Even with that, current state of the art algorithms fall very short 
of being able to model truly realistic experiences in many areas, like human 
interaction.

The major thing which is cool about the current development environment is that 
the leading edge and the mainstream are surprisingly near each other.  Ten 
years ago, the top of the line graphics hardware was 6+ years ahead of what 
consumers had. Now it's more like 2-3 years, and the gap is shrinking.  In 
a few years, I don't think there will be any gap.  Right now the world's 
fastest supercomputer is a tightly coupled network of 5000 PentiumPro's, 
the same computer most of us are using to develop stuff on.

The future is bright.
-Tim

///////////////////////////////////////////////////////////////////////////////
12-30-96

+	Email.

///////////////////////////////////////////////////////////////////////////////
12-31-96

====0.842q
+	Clicking stops working.
+	UnrealEd new map & camera opening bugs.
+	UnrealEd plyr ctrl icon is wacked

+	TextureSets.
+	(All)
+	Kill & purge.
+	Finish all texture stuff in UnrealEd.
+	FGlobalEditor::Cleanse

///////////////////////////////////////////////////////////////////////////////
1-1-97: Happy New Year.

+	ECreateResource    CREATE_MakeUnique
+	EImportResource    IMPORT_MakeUnique
+	EDuplicateResource DUPLICATE_MakeUnique

+	Load Classes.ucx and keep the linker around.

====0.844a
+	UnrealEd garbage collection - auto flush/gc/redraw
+	Eliminated all remaining old GUARD code.
+	Properly purge classes and textures without killing undo.

====0.844b
+	FArchive serialization flags and version padding.
+		int Ver        The version of the parent resource we're serializing, =current version unless loading.
+		int FileVer    The version of the resource file, =current version unless loading.
+		int IsLoading  Whether we're loading.
+		int IsSaving   Whether we're saving.
+		int ForEdit    Loading/saving for editing.
+		int ForClient  Loading for client playing.
+		int ForServer  Loading for server playing.

+	ULinker set FArchive version from file.
+	Fixed Make a macro file with a CLASS LOAD FILE= pointing to a path that is invalid

+	Load cache flushing problem.
+	Delete-texture-set button.
+	Rebuilder stats are wacked.
+	Test UTexture::Export.
	
X	Experiment with random variation in SincData -> Can I use this for
X	zero cpu time microtexturing? -> No silly rabbit you're just 
X	distorting the bilinear alpha values.

+	UnrealEd Garbage collection safe
+		Texture family = UTexture array.
+		Enable purge at proper times (after load, etc).

====0.844c
+	Replaced PARANOID with CHECK_ALL
+	RTF_Swappable
+	In debug ver, fail Element() and GetData() calls for swappable 
+		non-locked resources!
+	Test rebuild.

///////////////////////////////////////////////////////////////////////////////
1-2-97

+	Critical error flushing problem.
+	CRC archiver archives ucase res/names as ucase text.
+	Doesn't autosave light in levels for intrinsic classes
+	Ed: No poly set item names

///////////////////////////////////////////////////////////////////////////////
1-3-97

====0.844d
+	snap, grid & rotgrid broken?
+	dupe actors is screwed up.
+	Major UnMath.cpp, UnMath.h cleanup.

====0.844e
+	Got rid of obsolete FFloatRotation
+	Found that bounding box rejection problem.

	Memory pool strategy: I'm modifying the FMemPool code so that it will
	allocate large chunks of memory from GCache and then divy up the chunks
	for small allocations.  This will enable all of the temporary
	memory allocations to come out of a single buffer, greatly reducing
	overall memory usage.

====0.844f
+	New color model in 256-colors is much more precise!
+	PostLoad UMesh check that all sizes are correct.
+	Killed RF_NoReplace, RK_64KAligned
+	Killed all aligned malloc functions.
+	Make all of the allocation tracking optional via CHECK_ALLOCS
+	Simplified mesh rendering code.
+	New typesafe pool memory allocation: new(GMem,align).
+	Renamed FMemPool to FMemStack because, surprise! It acts like a stack
+		rather than a pool.

	Note: Much of my recent work has been oriented towards making Unreal
	far more scalable to low-memory systems, and portable to other architectures
	like Mac and N64.  Though this has required some significant architectural
	changes to the engine, the result is a much more robust, scalable engine.

====0.844g
+	Removed old pool calls from rendering code.

====0.844h
+	Removed all remaining old pool calls.

====0.84i
+	New spqr & timstro poly dropouts? -> Assume no aliasing across functions bug.
+	Kill GMem.Get(0)'s.

///////////////////////////////////////////////////////////////////////////////
1-4-97

====0.844j
+	Memory pools.
+		FMemoryCache now takes a MaxCreateSize parm.
+		Tick memory pools for overflow checking - no gettop stuff.

====0.844k
+	Merge mem pools and GCache
+	Tick verify steadystate.
+	That reduced in-game memory usage by 40%!

====0.844l
+	Eliminate FVF_Cached
+	Why is GMem usage so high in game? -> Huge FTransform cache. Eliminated it.
+	Use two new memory stacks for transformed points/vectors.

====0.844m
+	Stamped array for FVector/FPoint transform cache.
+	New lightmesh bit compression is great! Sky8 only takes up 200K!

///////////////////////////////////////////////////////////////////////////////
1-5-97

====0.844n
+	Resource manager
+		RF_ForClient, RF_ForServer, RF_ForEdit - presave set these.
+			Brush array: NotForClient,NotForServer
+			Individual brushes: NotForClient,NotForServer
+			Individual brush polys: NotForClient,NotForServer
+			ScriptText: NotForClient,NotForServer

====0.844o
+	Expanded resource load-context flags so that context flag
+		filtering is exact and names are properly filtered too.
+		This is now very versatile.

+	Eliminated LevelLockType.
+	FUnrealEngine no longer creates the level.

====0.844p
+	Get rid of MF_PostScale
+	New struct IMip.
+	Replaced FreeData with UnloadData.
X	Properly RF_Modified tag everything, CRC verifier on tick. -> Later on.
X	Resource caching via GCache! -> Later on.
X	Merge PreKill, Kill into overridable Kill. -> Need PreKill as is.
X	Resize actors in editor somehow? -> Shaky due to camera double links.
X	Set Res->Linker when load, NULL when RF_Modify, reload, new. -> Later on.
X	PostRealloc for realloc and trans? -> Maybe, later on.
X	Swap the 256-color buffers (remap etc). -> Maybe, later on.

+	Sound system is temporarily hosed (reports CSound errors?)

+	Open new level via Windows UI.
+	Fix any loading/saving memory leaks.

///////////////////////////////////////////////////////////////////////////////
1-6-97

====0.844q
Gary @ 3dfx: Suggests using a 16x16x1 palette for multiple colored,
intermixed non-local lightsource bump mapping. Interestingly enough, I was 
experimenting with this technique in 1993 after finishing up Jill of the
Jungle, for applying 2D lighting effects to tile maps, but abandoned it for
lack of a practical use in a 2D game.

Problems to work around:
	- Bump map lighting wouldn't be properly attenuated by shadow maps.
	  Solution: Clip all bump palettes to the overall shadow attenudation.
    - Specular lighting won't be apparent, because the bump map palette
	  isn't shifted as a function of space.

New tricks discovered: 

You can combine two unlit 16-color palettized textures 
into one resultant texture and freely constant alpha blend between the two
just by modifying the palette.

By building a palette lookup table and using the lighting interpolator as 
an alpha blend interpolator, you can freely variable alpha blend between
the two.

Initial bump map research conclusions: 

1. It looks quite cool, though the effect is only convincing when textures 
are minified - the pixelization destroys the effect under magnification, 
even with dithering. I don't think that bilinear filtering of mipmaps would 
help much either, it would just blur everything. Conclusion: Until hardware 
is such that we can get away with extremely high res textures, bump mapping 
is mainly useful for microtexture detail.

2. Discretizing bumpmaps down to a fixed 16x16 normal palette results in
major, visible discretization problems (large areas of constant gradient).
Bilinear filtering won't help with this.  This especially highlights the
method's lack of directional variance.  Conclision: Use standard palette
quantization techniques to quantize a custom bump map normal palette for
each microtexture.

A result that's immediately usable:

* Very limited-case 1D-normal bump mapping: For walking along a platform
  above a fiery pit. There is flickering orange light below

+	Wrote adaprive binary quantization template and bump map
+		normal quantizer. Works like a charm, can be extended
+		to palettes very easily.

+	Changed the dither code and added a super-cool enhancement. Unreal
+		software-rendered textures in 16-bit color look 100% as smooth
+		as Rendition bilinear-filtered textures in 16-bit color!

+	The Unreal engine now supports intermixed, multicolored specular
+		highlight bumpmapping using non-local lightsources! This
+		looks totally cool!

///////////////////////////////////////////////////////////////////////////////
1-7-97

====0.844r
+	Bump mapping research continues.
+	Bump mapping looks *awesome* for:
+		Cracks.pcx: Highlighting cracks in a wall.
+		Curtains.pcx: Wavy curtains. Bump texture could be animated.
+		Carvings.pcx, crucfxn1.pcx: Highlighting carved hyroglyphics or sculptures on the wall.
+		SandFlor.pcx: Sandy or muddy ground.
+		LimeSton.pcx: Water damaged limestone walls with drip patterns.
+		FloorTil.pcx: Highlighting floor tiles.
+		Lava.pcx: Cracked hardened lava.
+		Solder.pcx, Unknown.pcx: Whatever the hell it is, it sure looks cool!
+	Cool bump mapping situations:
+		Lava on the ground below illuminates walls of a chasm.

+	Bump mapping generalization.
+		Don't bother building full palette table if unlit?

+	Texture Bump Source=tim2 dest=Tim Set=BumpMaps

====0.844s
+	Added new "Detail high/medium/low" command, helps performance a bit.
+	Eliminate GBlit.Mips
+	New texture mipmapping system.

====0.844t
+	New texture locking code.
+	PostLockTexture, PreUnlockTexture
+	PostLoadTexture, PreKillTexture

+	After import or create new texture, must postload it.
+	Bumpmap texture sets.
+	UnrealEd bump map import ui.
X	Store mips in smallest to largest order for easier low-res dropping. -> Already doing it!

+	I have discovered a new law of physics: Conservation of stuff left to program. :)

///////////////////////////////////////////////////////////////////////////////
Work to do later:

	Load/save:
		Open saved game via Windows UI.
		Save game via Windows UI.
		Don't use FName's for players and cameras.

	Resource manager:
		Multiple resource lock/unlock stack via GCache ICacheItem, IResource?
		Hold classes via a list (from Root.ucx and any other explicitly loaded files),
			and let non-explicitly-loaded classes get gc'd.
		Don't do that Kill() thing all over the place!
		Be very suspicious of calls to Kill.
		Delete texture, class: Remove it from holding table and collect 
			garbage; if it still exists then it's in use (cool!)
		Still need to torture test UnrealEd intersect/add/trans, there is at
			least one transaction tracking system bug left.

///////////////////////////////////////////////////////////////////////////////
1-8-97
+	Email, etc.

///////////////////////////////////////////////////////////////////////////////
Todo:
	Get a pager.
	Get an 8meg video card.
	Get a 3dfx.
	Figure out when Gary McT is coming to Epic.
	Talk to Steven Polge.
///////////////////////////////////////////////////////////////////////////////
N64 Porting Note:

DMA has opted to rewrite the engine from the ground up for N64, with the
exception of the AI code and script interpretter.  While this is going to be
a lot of work, it's unfortunately necessary given the N64's relative 
limitations compared to the PC: Only 1 meg available for code, and a direct 
mapped cache which places a premium on careful code layout. Unreal code currently
compiles to 4 megs on the PC, and would probably be 4 megs on a RISC chip even
if all of the nonvital code were stripped out.  This situation highlights
the disadvantage of an architecture like Unreal which highly integrates
an editor and extended platform-specific functionality with a game engine.
But, the coolness on the PC platform helps compensate for that.

///////////////////////////////////////////////////////////////////////////////
1-9-97

====0.845a
+	Getting medieval on UnrealScript.
+	Rewrote class property system to support multiple bins.
+	Guard the script compiler.
+	Rebuild the classes with the new script compiler.

///////////////////////////////////////////////////////////////////////////////
1-10-97

====0.845b
+	UnrealScript
+		Class property list now grows on demand.

+	Stack trees
+		Implement UStackTree resource.
+		Scripts don't reference a class.
+		Shrink script related resources after compile.
+		Eliminated hardcoded maxima.

====0.0845c

+	Classes
+		GetLastProperty(Bin) properly support multiple bins.
+		Repair FClassProperty::IsPerActor
+		FindParams cleaned up.
+		Modernized FindStackNode.

+	Met with Gary@3dfx.
+	Worked on 3dfx support code.

///////////////////////////////////////////////////////////////////////////////
1-11-96

	Things which Unreal software rendering can do that Quake can't:
	1.	Software bilinear filtering.
	2.	Software trilinear filtering.
	3.	Bump mapping.
	4.	Translucent and transparent polygons.
	5.	Dithered lighting.
	6.	Hicolor and truecolor for greater texture variety.
	7.	Ambient lighting.
	8.	Colored lighting.
	9.	Volumetric lighting and volumetric fog.

	Things which Unreal software rendering can do that Rendition can't:
	1.	Software trilinear filtering.
	2.	Texture size limited only my RAM.

	Things which Unreal software rendering can do that 3dfx can't:
	1.	Truecolor rendering.
	2.	Trilinear filtering.

	Where Unreal is behind.
	1.	Quake: Speed.
	2.	Rendition: Edge antialiasing.
	3.	3dfx: Speed.

====0.845d
+	Scripting.
+		Fix copying parent stack nodes.
+		Fix code top.
+		I now serialize most enums as bytes to save space.
+		UScript scrap Emit* and use operator<< instead.

====0.845e
+	Decisions:
+		Do support state-local variables.
+			State-local variables are inhereted.
+			Requires initializing/serializing multiple class property spans on state switches.
+			Requires searching multiple class property spans for vars during compile.
+		Labels are fully inhereted and overridable.

+	Class property bins.
+		Created new UProperties resource.
+		Use UClass::SerializeBin for serializing actor properties.

====0.845f
+	Class property bins.
+		Replace DefaultActor with a bin.
+		UClass::AddProperty expand the UProperties.
+		AddParentProperties expand the UProperties.
+		Compiler verify that peractor size < sizeof(AActorBase + extra)
+		UClass::Shrink.
+		Eliminated AActorBase::Init.
+		Allow overriding UDatabase StandardSerializeData.
+		UScript is now derived from UBuffer.
+		Fixed script CRC bug.
+		UProperties is now derived from UBuffer.
+		UClass::AllocBins

====0.845g
+	Statics.
+		PerActor -> Bins[PROPBIN_MAX].
+		Always assure non-NULL class PerActor, PerClass, PerFunction.
+		UnrealScript terminology: PerActor, PerClass, PerFunction, PerWorld.

====0.845h
+		AddParentProperties must duplicate PerClass bin.
+		SetBinPointers work, check all uses to verify proper loading.
X		UnrealScript explicit overrides using the above terminology -> Dim, Static only.
+		UClass::GetBins.
+		ExportActor, ExportMultipleActors heed WhichBins.
+		Actor properties & default actor properties: Statics.
+		Import T3D: Statics.
+		Export T3D: Statics.
+		Load UCX: Statics.
+		Save UCX: Statics.
+		Export H: Statics.
+		Recompile class: Keep statics.

+	CPF_Private
+	Don't export privates: NextID,PrevID.

///////////////////////////////////////////////////////////////////////////////
1-12-97

+	Tried Gouraud-shaded polygon terrain - ok speed, looks *great*, easy
	to integrate with the rest of the engine. A cinch to use with hardware
	acceleration.
+	Tried raycasted Comanche-style terrain - slow, looks gross. Very hard
	to integrate with the rest of the engine. Difficult for hardware
	acceleration.
+	Tried bilinear-interpolated Comanche-style terrain - slower, looks ok.
+	Tried raycaster with a vertical span texture mapper. Looks just like poly
	terrain, only slower and not 6D0F.

Terrain conclusions:
*	An all-polygon terrain is the way to go.
*	Need to investigate C1-continuous adaptive subdivision for level of 
	detail control - can get more detail on average without bogging down.
*	Think about how to integrate terrain system with active edge code without
	increasing sorting overhead since terrain sorting order is preknown.
*	Can't do depth cutoff, because the backdrop exposes the cheat. Must
	adaptively subdivide.

Terrain thoughts:
*	Need to do adaptive polygon subdivision with fractal subheightmap detail.
*	Polygon budget based subdivision routine with error threshold.
*	Scanline-oriented approach, not polygon coherent approach.

Raycast mip descention with chunk postrenderer for pitch/roll correction?
*	Upclose: Gouraud shaded microtexture.
*	Medium:  Oversampled macrotexture.
*	Far:     Mipmapped macrotextures.

Terrain things needed:
*	Terrain resource type in level.
*	Bsp terrain cutter. NF_Terrabound, terrain CSG operation.
*	Terrain exporter (.pcx heightmap, .pcx tmap, text association list).
*	Stick textures on the terrain in UnrealEd.
*	Raytrace terrain WRT terrain and world using satellite settings, just
	like a normal lightmesh.
*	Terrain utilize normal lightmeshes.
*	Up to 3 layers of terrain (one = water), water anim.

//oversample!!
+	Temporal oversampling:
+		Texture coordinate for better bilinear approximation.
+		Shading.
X		Stochaistic anisotropic filtering? -> Not possible.
+		Do 4-way.
+		Horizontal edge[4]?
X		Vertical edge[4]? -> Ugly!
X		Far surface space delta based temporal oversampling. -> Ugly!
+		Trilinear interpolation.

///////////////////////////////////////////////////////////////////////////////
1-13-97

====0.845i
+	FClassProperty::Compare.
X	ImportActor, ExportActor, ImportMultipleActors: int Statics.
X	DefaultProperties transactionally save statics, too -> DefaultProperties
X		cannot be transactional.
+	UResource::Lock multilock support.
+	UResource::Unlock.
+	Resource browser locking problem.
+	Lock return success int.
+	Unlock no return value.
?	UResource::Unlock - does it need to modifyheader??

+	GRes.Tick check locks.
+	Render: Temporal needs to be an option.
+	LOCK_CanFail ::Lock, ::Unlock handle it. UCamera::Lock.
X	Private NoteResHeader?

+	Torture test transaction system.
+	Fixed transaction overflow bug.

+	Realloc, Kill, UnloadData fail if locked.

X	Intersect transacts a gigantic number of polys - is it saving each item
X		that's added? That is not necessary. -> Saving header on each ::Add call.

+	Test level: 4 copies of Sky8 intersected:
+		17 meg filesize.
+		53K nodes.
+		66K points.
+		19K sides.
+		1682 surfaces(???)
+		29K brush polys.
+		Rebuild worked flawlessly (slow as hell, as would be expected).

///////////////////////////////////////////////////////////////////////////////
Schedule thing

tues gt
Feb 10th-11th ms tech ovrebiew.
Feb 11-13th hw testing thing at MSoft.

///////////////////////////////////////////////////////////////////////////////
1-14-97

+	Input system
+		UnBuild.h bindings fname.
+		UCamera Input member.
+		UCamera::ExecMacro.
+		UCamera::Exec <macrofilename> command.
+		Exec to globalinput on camera contexts.
+		Bind command work.
+		Free bindings on exit
X		Save bindings -> Later.
+		Don't crash on keys out of bounds.

+	Command chaining via '|'.

	Input system notes:

	Why I rewrote the input system:
	*	System was overly abstract, to the extent that I couldn't figure out
		how to extract keys and mouse movements from the system.
	*	System was overly configurable, resulting in a set of configuration
		menus that was much harder to figure out and use than Quake or Duke Nukum.
	*	Too much code tied into too many different places in the engine.
	*	Timed input combo system idea wasn't applicable in general to Unreal.

	The new input subsystem resides in FInput. One instance of FInput exists for each
	UCamera resource (UCameras correspond to game windows on the screen). That instance
	of FInput is notified of input from the platform-specific code, and the game code
	grabs the input out as it's needed.  The current relationship is:

	How input gets into the input system: The platform-specific code captures
	keypresses, mouse movement, joystick movement, and any other motion and sends
	it to the input subsystem solely via SetInputState() and Exec().
		When a key/button is initially pressed:
			The input subsystem's InputState enum is set to IST_Press and the command 
			line is executed on the specified camera. The input system intercepts the 
			following commands; any other commands are executed according to their
			existing Exec handler.
				Button: Sets the specified button value to on.
				Toggle: Toggles the specified button value.
		When a key/button is held:
			The InputState enum is set to IST_Hold and the command line is selectively
			executed once per tick; only the following commands are interpretted:
				Axis: Applies the specified axis movement.
		When a key/button is released:
			The InputState enum is set to IST_Release and the command line is selectively
			executed; only the following commands are interpretted:
				Button: Sets the specified button value to off.
		When the mouse or joystick is moved:
			The InputState enum is set to IST_Axis and the command line is selectively
			executed; only the following commands are interpretted:
				Axis: Applies the specified axis movement.
		At all other times, the Action enum is set to IST_None.

	How input gets out of the input system: The engine's ULevel::Tick function calls the 
		game code's input reading routine, which calls the input system's ReadInput, which
		fills in the specified list of buttons and axis movements.  At this point,
		the game code postprocesses the input.  This is where raw axis movements
		are turned into meaningful axis movements, for example translating mouse movements
		into turning or strafing depending on the state of the strafe button.

	Design notes:
		*	The goal of this redesign is to simplify the input system.
		*	This design does not support fighting-game style movement combos like
			Up-Up-Punch at the input system level. That kind of thing is very
			game-specific (and not needed for Unreal) so it can best be
			supported at either the FGame level, or at the UnrealScript level.

///////////////////////////////////////////////////////////////////////////////
1-15-97

+	Decisions to make:
+		How to optionally short-circuit rotation? -> Selective flagged ReadInput.
+		How to optionally short-circuit movement? -> Selective flagged ReadInput.
+		How to OR multiple button feeds -> Button hold count.
+		XOR multiple toggle feeds -> Button hold count & 1.
+		How to selectively pass input to game console before input system? -> Game
+			console prefilters the input.

====0.845j
+	Decisions:
+		How to handle one shots vs held buttons -> OneShot command.
+		How to accumulate axis movements -> button holds plus mouse/joystick movements.
+		How to distinguish between absolute mouse movements and time-variant joystick movements? ->
+			Direction command vs. Axis command.
+		How/whether to handle button macros with built-in delays? -> "|>" separator and
+			non-interruptable tick-based execution queue.
+		Whether to allow quake-style bind-simple-command-to-string? -> yes, via expandable bindings list.
+		How to reset the input system? -> ResetInput.

///////////////////////////////////////////////////////////////////////////////
1-16-97

+	Input system implementation:
+		Replace UCamera::Key with new input system equivalant.
+		Enter.
+		Cleaned up LOG_ enums.
+		Replaced K_ enums with better IK_ enums.
+		Updated PPlayerTick.
+		Keypresses/releases properly call FInput.

///////////////////////////////////////////////////////////////////////////////
1-17-97

====0.845k
+	Input system
+		Cleanse old input code.

///////////////////////////////////////////////////////////////////////////////
1-18-97

+	The pixel is alive and well.

+	ULevel now implements FOutputDevice, for sending text to all players in
+		the level!

+	UCamera now implements FOutputDevice.
+	UCamera ReadInput, FGame PostReadInput.

+	KeyDown, KeyPressed now go into FInput.

+	Input system.
+		UnCon.cpp: ConsoleFull, ConsoleHalf, Type, Chat.
+		Fix history.
+		Type no echo 't', don't get interrupted by 't' - only exec bindings when CK_None.
+		Shift~ fullconsole
+		No input processing when when CK_Type.
+		Simple buttons.
+		Simple toggles.
+		Simple oneshots.
+		Bind.mac reset bindings.

+	Game console bindings?
+		F11: Brightness.
+		Esc -> "Cancel" command, end fullscreen and up the console.
+		Tilde: Console up.
+		Alt-Enter: Toggle fullscreen.
+		ViewUp, ViewDown.

///////////////////////////////////////////////////////////////////////////////
1-19-97

	Short-circuit input reading:

	The new input system is set up so that one can read certain categories
	of input (rotation, movement, and buttons) without affecting the state
	of the other inputs. This enables certain inputs to be processed ahead
	of others, to reduce latency. For example, I update the player's rotation
	immediately before rendering, while player movement only occurs during
	level updates.  This special handling is necessary because there are three 
	very different kinds of input in the engine:

	* Key/button presses, which come in asynchronously. When mapped to axis
	  motions, the magnitudes time variant.
	* Mouse movements, which come in either asynchronously or synchronously
	  depending on DirectMouse usage, whose magnitudes are time invariant.
	* Joystick movements, which come in synchronously, whose magnitudes are
	  time variant.

	At the same time, inputs can be adjusted nonlinearly (via a Gamma correction
	exponent). However, it is the input *velocity* that is adjusted nonlinear,
	rather than input magnitude, because magnitude is sometimes time variant.

///////////////////////////////////////////////////////////////////////////////
1-20-97

====0.845l
+	Input system
+		Elimintated KnownButtons hack.
+		Support Direction command as well as Axis.
+		Eliminate KeyPressedTable
+		Fixed that dag blasted ongoing focus bug!
+		Fix UnrealEd key forwarding.

///////////////////////////////////////////////////////////////////////////////
Physics notes

	Here is a list of the Unreal physics modes, and the special
	messages that the physics system generates in each mode. We don't
	list messages which are generated by the physics system
	in all modes.

	PHYS_None: No automatic physics.
		- Physics system doesn't perform any movement.
		- Moving brushes move through the actor freely.
		- Scripts may perform any kind of movement manually.

	PHYS_Walking: Walking around on the ground.
		- Collision logic if bCollideWorld, bCollideActors.
		- Moving brush logic with actual base velocity for consistent jumping.
		- Falling detection.
		- Stairclimbing logic.
		- Gravity logic.
		- Actors properly move with moving brushes they are standing on.
		* If actor hits wall, sends ACTOR_HitWall.
		* If actor walks off ledge:
		*	If bAvoidLedges and actor can avoid ledge, sends ACTOR_HitLedge and doesn't fall.
		*	Otherwise, sends ACTOR_Fall and sets PHYS_Falling.
		* Sends ACTOR_StandMover when actor stands on moving brush (moving brush gets ACTOR_SteppedOn).
		* Sends ACTOR_UnStandMover when actor stands on moving brush (moving brush getd ACTOR_UnSteppedOn).

	PHYS_Falling: Jumping up or falling down.
		- Collision logic.
		- Gravity logic.
		- Landing detection.
		* If actor lands:
		*    If bBounces and actor is moving fast, sends ACTOR_Bounce and bounces up.
		*    Otherwise, sends ACTOR_Land and sets PHYS_Walking.

	PHYS_Swimming: Swimming through water.
		- Collision logic.
		- Buoyancy logic.
		- OnSurface logic.
		- ACTOR_Falling if actor starts to fall.
		* If actor starts walking, sends ACTOR_Walk and sets PHYS_Walking.
		* If actor starts falling, sends ACTOR_Fall and sets PHYS_Falling.

	PHYS_Flying
		- Collision logic.
		- Banked movement etc.

	PHYS_Interpolating
		- Smooth alpha-motion between two locations and rotations.
		- Handles collision.
		* When arrives at destination, sends ACTOR_Arrived.

	Flags that affect physics:

	bAvoidLedges - actor refuses to walk off ledges.
	bBounces     - actor bounces when it hits the ground going fast.
	bPitches     - lets actor pitch in response to physics.
	bYaws        - lets actor yaw in response to physics.
	bRolls       - lets actor roll in response to physics.
	bMomentum    - enables momentum transfer during collisions, explosions.

///////////////////////////////////////////////////////////////////////////////
1-21-97

+	UnrealEd
+		Fixed focus bug.
+		DeleteTrackedAllocation problem!
+		Window/NewCamera/Close crashes hard
+		Actor props window opens up in zimbabwe

+	It'd be awfully nice if, when I go into MAP EDIT MODE, any brushes that I
+	have selected the previous time would be deselected so I don't inadvertently
+	move or manipulate innocent brushes.
+	The reason I took this feature OUT was because so many people were
+	complaining about going into map edit mode losing their selection, 
+	just hit the damn deselect button if you don't want your frigging
+	brushes selected!

+	Input system.
+		Mouse produce axis movements.
+		Proper PostReadInput.
+		Doubled number of angles to improve precision.
+		Redouble angle table, cut size in 1/16th.

+	Full edge antialiasing: WORKS!

///////////////////////////////////////////////////////////////////////////////
1-22-97 & 1-23-97

+	Edge aa optimizations:
+		Fix the occasional overflow problems.
X		Is 2-way cross convolving necessary? -> Fortunately, no.
+		8/16/32-bit color edge aa.

====0.845m
+	Research:
+		Added FPoly::SplitWithNode.
+		Check # portals vs # nodes in Sky8.
+			4206 surfs, 5682 portals, 9357 nodes - yeesh!
+		Portal building code.
+		Conclusion: Explicit portal rendering would add an awful lot of
+			polygons to process in realtime. Better to just go the Quake 
+			route and precompute the visibilty.
+		Computing leaf-to-leaf visibility is also useful for: Creature
+			visibility reject, dynamic light possible extent, rendering
+			early rejection, network visibility.

///////////////////////////////////////////////////////////////////////////////
1-24-97

	Interesting but useless trick:
		You can design a square n*n array so that elements can be addressed without
		actually knowning the dimension n by using a binomal trick:
		template<class T> class BinomialArray
		{
			T* Data;
			T& operator()( int i, int j )
				{return i<=j ? Data[2*i+j*(j+1)] : Data[2*j+i*(i+1)+1];}
			void Alloc( int n )
				{Data = new T[n*(n+1)];}
		}

	Fourier subdivision texture mapping, based on the thought that
	only a few components need to be computed at the pixel level, and
	the others can be computed per several pixels. YUV space, Y high res,
	UV low res.

	Feasibility of rendering 3d fractals into framebuffer using fif fine
	structure transform? A bit like shade bobs.

///////////////////////////////////////////////////////////////////////////////
1-25-97

	Visibility precomputation preliminaries.

	Problem 1: Plane view convolution. Given a convex m-sided source polygon 
		and a convex n-sided clipping polygon, describe the exact planar-bounded 
		volume on the far side of the clipping polygon in which the source polygon 
		is visible through the clipping polygon.

	Solution 1: The volume is the volume on the far half-space of the clipping
		polygon which is in the union formed by all of the following volumes:
		1.	For each of the m source points, the intersection of the n
			half-spaces bounded by a plane passing through the source point
			and each of the n sides of the clipping polygon.
			Problem 2: What is the sign convention?
		2.	For each of the m source sides, the intersection of the n
			half-spaces bounded by a plane passing through the source side
			and each of the n points of the clipping polygon.
			Problem 3: What is the sign convention?
		Assertion: The above volume is convex.
		Problem 4: How do we eliminate redundent information and describe the
			volume by its minimum convex hull?
		Problem 5: How to implement the above as a numerically stable algorithm?

	Solution 2: It's consistently one or the other, figure out manually.
	Solution 3: It's consistently one or the other, figure out manually.
	Solution 4: This is the maximal sheet wrapping solution below.
	Solution 5: Can't avoid numerical precision errors, so consider always slightly
	    underclipping portals, so that the stored visibility is always a slight
		overestimate, rather than a random overestimate/underestimate.

	Definition: Sheet wrapping volume.  Define a sheet wrapping volume as
		the intersection of all half-planes created by moving a sheet around the source
		polygon and the clipping polygon such that the sheet always touches one
		side of the source or clipping polygon, and one vertex of the other polygon,
		without penetrating either polygon. Define a maximal sheet wrapping as that 
		formed by a sheet in partitioning the source and clipping polygon, and a minimal 
		sheet wrapping as that formed by a sheet not partitioning the source and 
		clipping polygon. The volume enclosed by a maximal sheet wrapping and behind 
		the clipping polygon is the complete volume in which the source polygon is 
		all or partially visible, and the volume enclosed by a minimal sheet wrapping 
		and behind the clipping polygon is the complete volume in which the source 
		polygon is fully visibile. The difference between the minimal and maximal 
		volumes is the visibility penumbra volume of the source polygon.

	Three-polygon visibility associativity: Given three polygons A, B, and C, and
		maximal sheet wrapping volumes AB and BC, C intersects with AB <-> A 
		intersects with BC.

+	Visibility check (source leaf L, source portal S, clipping leaf M, clipping portal C):
+	Let SEES(L,M)=True.
+	For each noncoplanar outward-facing portal C' in leaf M except C:
+		If C' and S face in the same direction:
+			Let S' = S clipped to maximal sheet wrapping CC'
+			If S' is nonempty:
+				Let M' = leaf on opposite side of portal C'
+				Assert: M'<>M, M'<>L
+				Visibility check( L, S', M', C')
+			EndIf
+		EndIf
+	Next
+	Return

+	Portal visibility floodfill:
+	For each leaf L:
+		Let Sees(L,L) = True (each leaf sees itself)
+		For each outward-pointing portal S in L:
+			Let B = leaf on opposite side of S:
+			Assert: B<>L
+			Let SEES(L,B) = True (all neighbors see each other)
+			For each noncoplanar outward-pointing portal C in leaf B except S:
+				If C and L face in the same direction:
+					Let M = leaf on opposite side of portal T
+					Assert: M<>L, M<>B
+					Visibility check(L, S, M, C)
+				EndIf
+			Next
+		Next
+	Next
+	Return

+	Portal IsTesting flag to avoid portal recursion.

+	Count # leaves whose visibility status is identical to another leaf:
+		There are very few (0.1~) redundent leaves.
+	NormalOf.

+	50%-60% of the clip tests clip to nil.

?	Is it worth implementing a fast trivial clip accept?
+		Yes, if a partitioning plane between A and B|C can be found quickly!

///////////////////////////////////////////////////////////////////////////////
1-26-97

+	Edge rendering experimentation.
+	Moved edge code to UnVisi.cpp

+	Modified ambient lighting to add more of an overcast, well, "ambient" effect
+		that brightens dark areas better. The new effect is far less dependent on
+		texture color.

+	Created StatusInfo, UnrealStatusInfo.

+	CPF_Client, CPF_ClientSelf.

	Leaf visibility rules:
	0.	Init: By default, a leaf sees no other leaves.
	1.	Self: Leaf A always sees itself.
	2.  Connectivity: Leaf A sees leaf B if there exist a portal connecting A and B.
	3.	Transitivity: A sees B implies B sees A.
	4.	Portals: If a portal P of A sees a portal Q of B, then A sees B.

	Notes on this algorithm:
	1.	This is going to do a gigantic amount of in areas that aren't tightly occluded.
	2.	Investigate: is this how Quake does its visibility precomputation?3
	3.	This is worst case O(2^n) in unoccluded areas, typical O(n) in highly occluded areas.

	Other visibility thoughts:
	1.	To reduce size of visibility list, can merge physical leaves into
	    their parent nodes, based on minimizing the # of potentially visibile 
		edges. It looks like typical levels will have many leaves which can be
		merged up the tree without any increase in visible edges.
	2.	In a connected world, Portals >= Leaves always.
	3.	Any leaf that has no portals is disjoint.
	4.	A level may have multiple disjoint volumes.
	5.	I could exclude semisolid brushes when computing visibility, to save time.
		Small, complex Bsp'd objects like Eric's Sky8 chairs add little value to the
		visibility computations.

///////////////////////////////////////////////////////////////////////////////
1-27-97

Note: 30-40% of edges are interleaf in occluded maps, 60% in unoccluded.

====0.845o
+	Actually use ZoneFog in fog zones.
+	Implemented leaf edge filtering.
+	Added UModel::PointLeaf.

+	To do:
+		Filter Bsp surfaces down front (+back if two-sided) for edge refs.
+		Figure out and display which leaf # the player is in.

+	There are some purely overestimated edge refs.
+	Plus some purely underestimated edge refs. Coplanar related bug?
+		This was a bug in the debugging code! Note to self: Don't let bugs creep
+		into the debugging code you fool!

+	TestG.unr: Problem with perpendicular surfaces, still rejecting them?
+		This was a dumb error in IsCoplanar.

+	Starship still has major underestimates -> Fixed them all!
+	Rebuilding with minimum cuts is a big speedup.

///////////////////////////////////////////////////////////////////////////////
1-28-97

+	balzar without multiclip:  375.418173 seconds
+	balzar with multiclip: 232.412631 seconds
+	balzar with proper signing: 180.302004 seconds
+	balzar after precision adjustment: 292.0 seconds

+	Tons of visibility experiments.

+ Info: Visibility: 257 portals, 93 leaves, 717 nodes
+ Info: Visibility: 42 avg vis, 67 max vis, 0K (11.141615% ratio)
+ Info: Visibility: 21,289,516 clip tests (82% passed, 58% unclipped), 226,484 per leaf
+ Info: Visibility: 1657 edges, 2665 leaf edges

///////////////////////////////////////////////////////////////////////////////
1-29-97

	Sky8:
		Full visibility:
			Info: Visibility: 5292 portals, 2239 leaves, 9144 nodes
			Info: Visibility: 122 avg vis, 369 max vis, 50K (2.077139% ratio)
			Info: Visibility: 131051356 clip tests (9% passed, 9% unclipped), 58505 per leaf
			Info: Visibility: 14673.844189 seconds <- !!!!!!
		Zone visibility:
			Info: Testing visibility
			Info: Visibility: 5292 portals (144 sources), 2239 leaves (22 logical), 9144 nodes
			Info: Visibility: 272 avg vis, 550 max vis, 51K (2.121921% ratio)
			Info: Visibility: 1005455 clip tests (68% passed, 68% unclipped), 43715 per leaf
			Info: Visibility: 75.312272 seconds

+	Now have logical + physical leaves to enable leaf merging.
+	After done, merge logical visibility into physical visibility.

///////////////////////////////////////////////////////////////////////////////
1-30-97

====0.845p
+	Figured out a totally cool winged edge / multiply linked list data structure.
+	Rewrote visibility code using new structures.
+	Generalized ClipToMaximalSheetWrapping.

	Balzar before bsp visibility:
		 Info: Visibility: 495 portals (990 sources), 196 leaves (196 logical), 798 nodes
		 Info: Visibility: 92 avg vis, 151 max vis, 2K (12.654097% ratio)
		 Info: Visibility: 5005948 clip tests (73% passed, 73% unclipped), 25410 per leaf
		 Info: Visibility: 268.050164 seconds
		 Info: Visibility: 1899 edges, 4118 leaf edges
	Balzar after bsp visibility:
		 Info: Visibility: 495 portals (0 sources), 196 leaves (196 logical), 798 nodes
		 Info: Visibility: 94 avg vis, 151 max vis, 2K (12.705895% ratio)
		 Info: Visibility: 2571297 clip tests (75% passed, 75% unclipped), 13052 per leaf
		 Info: Visibility: 145.337169 seconds
		 Info: Visibility: 1899 edges, 4118 leaf edges
	Balzar after bsp visibility reordering:
		 Info: Visibility: 495 portals (0 sources), 196 leaves (196 logical), 798 nodes
		 Info: Visibility: 94 avg vis, 151 max vis, 2K (12.705895% ratio)
		 Info: Visibility: 2567110 clip tests (75% passed, 75% unclipped), 13031 per leaf
		 Info: Visibility: 142.978974 seconds
		 Info: Visibility: 1899 edges, 4118 leaf edges
		 Info: Begin transaction Poly Click
	Balzar after rejection improvements:
		 Info: Visibility: 495 portals (0 sources), 196 leaves (196 logical), 798 nodes
		 Info: Visibility: 93 avg vis, 151 max vis, 2K (12.799130% ratio)
		 Info: Visibility: 2528242 clip tests (76% passed, 76% unclipped), 12833 per leaf
		 Info: Visibility: 140.681775 seconds
		 Info: Visibility: 1899 edges, 4118 leaf edges

====0.845q
+	Totally cool new hierarchical bsp based visibility algorithm:

+	Old faces convention: >>source>> >>clip>> >>test>>
+	New faces convetion:  >>back>> >>clip>> >>front>>

+	BspCrossVisibility(FrontLeaf, BackLeaf, FrontPoly, ClipPoly, BackPoly)
+		Let SEES(BackLeaf, FrontLeaf) = True
+		If Reverse(BackPoly) faces Reverse(FrontPoly):
+			If ClipAllToMaximalSheetWrapping(BackPoly, ClipPoly, FrontPoly)
+				For each new portal FrontPortal of FrontLeaf
+					Let NewFrontPoly = PolyOf(FrontPortal,FrontLeaf)
+					If NewFrontPoly faces Clip:
+						Let NewFrontLeaf = LeafOnOtherSideOf(FrontPortal,FrontLeaf)
+						BspCrossVisibility(NewFrontLeaf,BackLeaf, NewFrontPoly, FrontPoly, BackPoly)
+					EndIf
+				Next
+				For each new portal BackPortal of BackLeaf which faces(??) Clip:
+					Let NewBackPoly = PolyOf(BackPortal)
+					If BackPoly faces Reverse(Clip):
+						Let NewBackLeaf = LeafOnOtherSideOf(BackPortal,BackLeaf)
+						BspCrossVisibility(FrontLeaf,NewBackLeaf,FrontPoly,BackPoly,NewBackPoly)
+					EndIf
+				Next
+			EndIf
+		EndIf
+	Return

+	BspVisibility(Node Node) =
+		For each portal Clip at this node (in plane and confined to node's volume):
+			Let FrontLeaf = FrontLeafOf(Clip)
+			Let BackLeaf  = BackLeafOf (Clip)
+			For each new portal FrontPortal of FrontLeaf:
+				Let FrontPoly = PolyOf(FrontPortal)
+				If Reverse(FrontPoly) faces Clip:
+					For each new portal BackPortal of BackLeaf:
+						Let BackPoly  = PolyOf(BackPortal)
+						If BackPoly faces Reverse(Clip):
+							BspCrossVisibility(FrontLeaf, BackLeaf, FrontPoly, Clip, BackPoly )
+						EndIf
+					Next
+			Next
+		Next
+		BspSubVisibility(Front)
+		BspSubVisibility(Back)
+	Return

+	FullVisibility =
+		For each leaf Leaf
+			Let SEES(Leaf, Leaf) = True
+		Next 
+		BspVisibility(Root)
+	Return

+	Doing everything 2X as a result of ValidPolys logic.
+	Restrict visibility propagation to proper subtree!

///////////////////////////////////////////////////////////////////////////////
1-31-97

	New rebuild pass:
	* Csg the main brushes.
	* Rebuild Bsp to minimize cuts.
	* Assign leaves.
	* Portalize the bsp.
	* Build visibility.
	* Csg the detail brushes.
	* Optimize the sub bsp's.

	* Can we substructure the above calculations to avoid duplicate faces tests, by
	  recursing through the Bsp? Note that portals ARE strongly ordered as a result
	  of the hierarchical tree traversal! This implies that a full visibility clip

	* Clip portals *can* be merged globally, but not locally. This would eliminate
	  the worst-case factorial running time!

	* Count node portals to make sure bsp is ok.

	* Could use 2d bsp for node portal structure to further speed up the running time.

	Investigate p.:
		Bsp based visibility precomputation.
		Hierarchical lattice subdivision rendering.

	Note that this algorithm is typically over 1000 times faster than Quake's Vis
	utility.  While id boasts of having a 300 mHz 4-processor DEC Alpha dedicated to 
	visibility computation, we could get the same performance on an Apple ][+.

	Can get 2x speedup per node traversed by figuring out a unidirectional start order.
		Is this true? Test it out.
	Option to only visibility test zone portals.
	UBspNodes::KillPrecomputes
	UModel::KillPrecomputes
	bsp balancer, give credit to axial nodes and nodes w/ many coplanars.

leaf->zone visibility: more efficient than zone->zone and no extra cost, but asymmetric.

test visibility in bsp order only, avoiding redundent tests??
NodePortals[per iNode] for bsp order traversal??
Planar zone portals are rebuilding wrong: See TimLight.unr.

* Could even merge this algorithm with portal building for ridiculous speed.

can easily get 2x speedup by only start-testing forward portals.

Info: Visibility: 140 portals (280 tested), 65 leaves, 466 nodes

	Visibility ShouldTest flags:

Stats
	balzar:
	 latest code
	  Info: Visibility: 495 portals, 196 leaves, 798 nodes
	  Info: Visibility: 123 avg vis, 182 max vis, 2K (13.503574% ratio)
	  Info: Visibility: 11308729 clip tests (76% passed, 54% unclipped), 57404 per leaf
	  Info: Visibility: 1899 edges, 4118 leaf edges
	sky8
	 bsp minimum cuts:
	  Info: Visibility: 5123 portals, 2094 leaves, 8759 nodes
	  Info: Visibility: 77 avg vis, 290 max vis, 38K (1.785366% ratio)
	  Info: Visibility: 5966711 clip tests, 2849 per leaf
	  Info: Visibility: 5708 portals, 2320 leaves, 9357 nodes
	 as is:
	  Info: Visibility: 87 avg vis, 264 max vis, 47K (1.817588% ratio)
      Info: Visibility: 11917276 clip tests (68% passed, 46% unclipped), 5134 per leaf
      Info: Coplanar leaf edge
      Info: Coplanar leaf edge
	spqr
	  Info: Visibility: 1459 portals, 546 leaves, 2166 nodes
	  Info: Visibility: 173 avg vis, 302 max vis, 7K (5.341155% ratio)
	  Info: Visibility: 36922017 clip tests (-51% passed, -51% unclipped), 67499 per leaf
	  Info: Visibility: 2340.546190 seconds
	spqr 
	  Info: Visibility: 1459 portals (0 sources), 546 leaves (546 logical), 2166 nodes
	  Info: Visibility: 177 avg vis, 312 max vis, 7K (5.106107% ratio)
	  Info: Visibility: 20639616 clip tests (66% passed, 66% unclipped), 37732 per leaf
	  Info: Visibility: 671093 max fragments, 1048.977777 seconds
	  Info: Visibility: 8602 edges, 11217 leaf edges

		4200 surfs
		5682 portals
		2320 leaves
		9357 nodes
		>50% of vertices are non-primitive (tee-points)

///////////////////////////////////////////////////////////////////////////////
	Visibility precomputation thoughts.

2d revolver portal hints!

That routine was a bitch to write and get working flawlessly.

Overall, I'm not too happy with visibility precomputation.  The CPU time 
required to get a complete, theoretically minimal convex volume visibility 
information is insane.  Though my code could be optimized by a factor of
10 with some straightforward algorithmic improvements, obtaining a significant
speed increase, i.e. factor of 100, is out of reach without resorting to
terribly difficult 5d geometry, and imposing a 2-3 hour waiting period
between modeling a level and playtesting it will put a damper on 
creativity.

The other major drawback to convex volume visibility precomputation is that
it overestimates the number of polygons visible to a given viewpoint by on average 
2X-3X, and it typically overestimates the number of polygons visible to a given view 
frustrum by 12X.

Zones and manually placed portals aren't so bad after all.

The existing portal system can be integrated with Unreal's new edge rendering
code pretty easily, so that new zones are introduced into the active edge 
table as soon as the first span of their portal becomes visible.

Benefits:
 * No need to wait hours for visibility preprocessing.
 * 

Drawbacks:
 * No visibility table available for fast line-of-sight rejection, and
   fast network play visibility.

Knowledge/ideas gained:
 * How to perform 3D portal-based view convolution.
 * Portals can be used in a straightforward way to determine which leaves
   a light affects, for light-leaf association.

///////////////////////////////////////////////////////////////////////////////

	Edge elimination.
		Eliminate intrasurface, intraleaf edges in preprocessing stage.
		Eliminate intrasurface, purely visibile interleaf edges at coalescing stage.
		Confine edges to leaves.

///////////////////////////////////////////////////////////////////////////////
Thoughts

====0.845n
	// Only a partitioning plane.
	FBspNode: Can be 8 bytes (a nice savings over the current 64!)
		word iPlane     : index into plane table of node's plane
		word iFront     : front node, or front leaf, or none
		word iBack      : back node, or back leaf, or none
		word Flags      : front_is_leaf, back_is_leaf

	// An interior Bsp leaf.
	FBspLeaf:
		word  Flags     : flags for the leaf
		word  NumSides  : number of sides
		dword iSidePool : index of first side in this leaf

	// A side.
	// Using this representation you don't need to mess with t-point removal since
	// t-points can be accounted for exactly.
	FSide:
		word iVertex0   : first vertex of side
		word iVertex1   : second vertex of side
		word Alpha0     : alpha of first vertex
		word Alpha1     : alpha of second vertex
		word iSurf0     : first surface
		word iSurf1     : second surface

	Edge code.
		Only antialias intersurface edges, only once per edge.
		Mesh edge aa, silhoette and intertexture edges only.

	Node info:
		Visible nodes per node (symmertric).
		Volume lightsources per node.

		Properly nonlinear time invariant scale mouse movements.
		Proper time based exponential decay.

///////////////////////////////////////////////////////////////////////////////
2-1-97: Back to the input and physics code.

+	Replace OneShot with server-side commands.
+	Redesigned server messaging system.

///////////////////////////////////////////////////////////////////////////////
2-2-97: Server messaging and input.

+	Implemented UBitArray, UBitMatrix.
+	Server MsgName I=# S=Str N=?? -> Func(I as Integer, S as String[32], N as Name)

+	Added messages:
+		ACTOR_ServerFire
+		ACTOR_ServerAltFire
+		ACTOR_ServerNextWeapon
+		ACTOR_ServerPrevWeapon
+		ACTOR_ServerWeapon #
+		ACTOR_ServerPause
+		ACTOR_ServerJump

///////////////////////////////////////////////////////////////////////////////
2-3-97

+	All-day UnrealEd bug roast.

///////////////////////////////////////////////////////////////////////////////
2-4-97

+	Rebuild classes.

' Input buttons.
Dim bZoom     as Boolean, bRun     as Boolean
Dim bLook     as Boolean, bDuck    as Boolean
Dim bStrafe   as Boolean, bExtra6  as Boolean
Dim bExtra5   as Boolean, bExtra4  as Boolean
Dim bExtra3   as Boolean, bExtra2  as Boolean
Dim bExtra1   as Boolean, bExtra0  as Boolean

' Input axes.
Dim aForward as Real,     aTurn    as Real
Dim aStrafe  as Real,     aUp      as Real
Dim aLookUp  as Real,     aExtra4  as Real
Dim aExtra3  as Real,     aExtra2  as Real
Dim aExtra1  as Real,     aExtra0  as Real

+	3dfx basic rendering - awesome!

///////////////////////////////////////////////////////////////////////////////
2-5-97

====0.845q
+	3dfx extended support:
+		Basic texture rendering.
+		Added segmentation support to memory cache.
+		Upload actual palette as needed.
+		Upload actual textures.
+		Cache the textures with an FMemoryCache (8-aligned, 2meg segmentation).
+		Proper mip alignment for first 4 mips.
+		Cram all other mips in there.
+		Tick the 3dfx cache.
+		With 3d hardware, sort textures by palette|texture.
+		Support panning.
+		3dfx texture scaling is weird.

///////////////////////////////////////////////////////////////////////////////
2-6-97

+	3dfx lightmap support:
+		3dfx bump palettes.
+		Download lightmaps.
+		Post float -> luminance support.
+		Cache the light maps.
+		Properly render/scale them.
+		Properly pan and clamp them.
+		Eliminate blink.
+		No clear screen.

///////////////////////////////////////////////////////////////////////////////
2-7-97

====0.846a
+	3dfx
+		Handle dynamic and static light maps.
+		Texture palette normalization.
+		Render light maps with normal scaling and offset.
+		Normalize lightmeshes.
+		Rescale lightmeshes.
+		Blowout texture max via precomputed texture scaling factor!

///////////////////////////////////////////////////////////////////////////////
2-8-97

+	Go to DE

///////////////////////////////////////////////////////////////////////////////
2-9-97, 2-10-96, 2-11-97

+	At DE

+	Optimized dynamic lighting by a factor of 2 using the Arjan Brussee supergenius optimization technique* :)
+	Optimized raytracing code by a factor of 2.
+	Optimized collision code by a factor of 2.

///////////////////////////////////////////////////////////////////////////////
2-12-97

+	Unreal files:
+		FNAME_SIZE in UnLinker.h.
+		ULinker needs filename.
+		ULinker needs ULinker dependency array.
+		Absolutely no circular dependencies.

+	Unreal resource directories are:
+		Brushes
+		Cache
+		Classes
+		Maps
+		Models
+		Music
+		Sounds
+		Textures

+	Obsolete:
+		Is PlayerExec called?
+		Do NOT add actor collision refs to inside leaves! Duh!
+		Resource file dependencies and getters.

+	Unrealfiles:
+		Need enough info in resource files that they can be fully operated on my external utils.
+		Resource file -> Unrealfile.

+	Wrote UnrInfo.exe utility for getting info about Unrealfiles.
+	Documented the Unrealfile format, see UnrInfo.h.

	Unrealfile dependencies.

		A dependency string in a source Unrealfile identifies another Unrealfile that
		must be loaded before the source file may be loaded.  Unrealfile dependencies are 
		analogous to DLL dependencies, i.e. WinWord.exe has Kernel32.dll as a dependency.

		A dependency string specifies a pathless filename, such as "Ancient.utx", and
		an optional source site on the net to download it from, such as 
		"unreal://unreal.epicgames.com/", and some other optional parameters.

		When a dependency must be loaded, the following places are searched, in order:

		1. The standard Unreal hard disk directories, i.e. \unreal\textures, \unreal\maps\, etc.
		2. The cache on your hard disk, \unreal\cache.
		3. Downloading from the specified source site on the net, into your \unreal\cache\ 
		   directory, and then using the just-downloaded file in \unreal\cache as the source.
		4. If the dependency can't be loaded, or download is aborted, the entire operation fails,
		   and the user is sent back where he came from.

		A dependency string contains these parts, separated by spaces:

		name=levelname
			Required base name of the dependent Unrealfile (no path).
			When we load an Unrealfile, we first attempt to load all of its dependent files.
		source=[unreal://]unreal.epicgames.com:port/
			Optional UnrealServer [??or any Gatekeeper?] to obtain it from, otherwise assume local.
			Filename on the UnrealServer is exactly the same as 'name'.
			[?? Do we need to support UnrealServer directories?]
		signup=[http://]www.epicgames.com:port/dir/page
			If the user doesn't already have the dependency on his hard disk, lets the user
			navigate to the signup web page for information about the file. This could provide
			a link to a buy-and-download system, for example. The signup line may specify any
			valid URL, which is passed to Netscape or Internet Explorer.
		required=packagename
			Requires that the user have a particular software package installed (i.e. Unreal 
			registered version) in order to use the dependency. There may be multiple
			required= lines in a dependency string, and all requirements must be met.
			If a dependency is not met, the user is given the option to go to the signup
			site for more information about it (and possibly a buy-and-download service).
			Storing requirements in the dependency string enables us to put
			teleporters to the registered version of Unreal, and to upcoming level packs, 
			in the shareware version, as a teaser.
		message="text"
			An optional message to display if not all requirements are met. This could
			be a teaser like "You need to buy the full version of Unreal to enter here".

		To give a more concrete example, consider an Unreal level named "Starship.unr".
		This is a typical level for the registered version of Unreal which is not available
		for downloading.  It might contain the following dependency entries:

		   name=General.utx  signup=www.epicgames.com/unreal/register.htm required=unreal_shareware
		   name=Starship.utx signup=www.epicgames.com/unreal/register.htm required=unreal_registered
		   name=Root.ucx     signup=www.epicgames.com/unreal/register.htm required=unreal_shareware
		   name=RootReg.ucx  signup=www.epicgames.com/unreal/register.htm required=unreal_registered
		   name=Isotoxin.uax signup=www.epicgames.com/unreal/register.htm required=unreal_registered

		Now consider a level available on the net, which is dependent on a texture set available
		on the net, as well as some shareware Unreal stuff:

		   name=General.utx  signup=www.epicgames.com/unreal/register.htm required=unreal_shareware
		   name=Root.ucx     signup=www.epicgames.com/unreal/register.htm required=unreal_shareware
		   name=Mysong.uax   source=un-reality.com
		   name=MyTextures.utx source=un-reality.com
		   name=OtherTextures.utx source=unreal.epicgames.com

		Dependencies need to be handled in three main places in the Unreal 
		[?? and Gatekeeper?] codebase:

		1. First of all, the Unreal resource manager's Unrealfile loading code needs logic
		   to find and load dependent Unrealfiles when loading a source Unrealfile.  This code
		   will *only* handle dependencies which are on the local hard disk, not net-based
		   dependencies.  As a result, trying to load a file with dependencies that aren't
		   available locally will fail (gracefully), with the engine in a clean state upon
		   failure. Todo: Tim.

		2. The Unreal file saving code needs to save dependency information, and this needs
		   to be coupled with an option to view and edit level dependencies explicitly.
		   Todo: Tim.

		3. The networking client code needs a high-level master routine for loading a level,
		   which may be local (via filename) or remote (via URL), which does everything needed
		   to start a session on a remote server, including:

		   A. If remote, contacting the remote server via the net, and getting the level's
			  dependency list.

		   B. Recursing through the level's dependency list, and making sure that all dependencies
			  are available.  This would continually build up a list of active Gatekeeper
			  connections, and handle all special cases, such as:
			  * A dependency isn't immediately available, in which case the user is given the
				option of visiting the signup Web page to get more info.  If the user opts to
				abort, the entire load files. If the user visits the signup site, the Web browser
				is launched and sent to the site, and back in Unreal the user has the option to
				retry the dependency (in case the dependency's accessibility has changed, as would
				be the case in a buy-and-download system), or abort.
			  * The client times out trying to contact the server associated with a dependency, 
				or the dependency is downright unavailable or inaccessible.

		   C. Downloading each of the dependencies which are remote, spooling the info from the
			  server to the \unreal\cache directory.
			  * Files need to be downloaded to a temp file (i.e. Temp1.$$$) and then renamed, so
				that rebooting during download doesn't leave a corrupt file in the cache which
				Unreal will later try to load.
			  * Disconnections have to be handled gracefully.
			  * The user needs the ability to abort a download, canceling everything gracefully.

		   D. Finally, once all downloads are complete, calling the resource manager to load
			  the actual file (at this point, all dependencies are on the hard disk).

		[??Am I overcomplicating this?  This sounds like a mess, but it's the simplest way I can
		think of to do the job.]

		[??Should Unrealfiles contain a dependency string referring to themselves, i.e. to
		describe the package and signup information for itself?]

///////////////////////////////////////////////////////////////////////////////
Where 3d graphics is going in 1997, 1998, and 1999.

* Fill rate will be the limiting factor in rendering 1997, but will lose 
  significance in 1998 as fill rates reach 100 Mpix where visibility
  algorithms and fill rates come into check.  In 1998, per-polygon 
  overhead will be the limitor.  In early 1999, the transition to NURBS
  will make temporary table/texture overhead associated with dynamic
  shadowing and bump mapping the limitor.  In the *very* long term, 2000+,
  after photorealism has been achieved in properly limited scenes and special
  effects are maxed out to visually acceptable levels, artistic and design 
  content will dominate over rendering power as the limiting factor.

* Polygon counts will increase to somewhere in the 15,000 - 30,000 polygon per
  scene range, and max out there due to bandwidth limitations (sending the 
  polygon info over AGP) and CPU limitations (transforming them all). At around
  15,000 polygons per scene, apps will stop dealing with polygon representations
  for non-flat surfaces and switch to NURBS, because:

  - NURBS are a *much* more compact representation for curved surfaces, compared
    to explicitly storing polygon lists.  A NURBS object will be 90% more space
	efficient than an equivalant quality polygon mesh.

  - Hardware will perform NURBS transformation, tesselation to triangles, and
    clipping.

* Software will still perform visible surface determination (via precomputation,
  portalization, and depth cueing).

* Software will still perform high-level lighting and shadowing, though hardware assist
  may come into play for shadow z-buffering or shadow occlusion techniques.

* Texture mapping will move to multipass or multiple simultaneous texture rendering.
  4 simultaneous textures per pass is a good number to aim for, because than enables
  one to combine:
   - A trilinear filtered texture (2 textures).
   - A light map (1 texture).
   - A microtexture, macrotexture, or bump map (1 texture).
  More than 4 will not prove to be generally useful for texture mapping, because there's
  not much to gain by exceeding reality.

* Textures will be stored in a jpeg-style regionalized compressed form or a wavelet
  style generliazed compressed form, and decompressed on the fly, because texture memory 
  will still be a scarce resource.

* Photorealistic indoors environments will be the norm by the end of 199.

* Photorealistic outdoors environments like forests are still very far off.

* Consumer PC 3d performance will kick the 1996 SGI Infinite Reality's ass.

* Art and design will be the largest factor in the success of 3d games rather than
  core technology.  Extraordinary graphics processing power doesn't mean dick when
  combined with ugly environments and boring gameplay.

* Internet based 3d will be sorely bandwidth limited and those who pioneer the
  base global dataset compression schemes will get the most playtime.

* 3d API popularity and 3d hardware market share will be determined by top tier
  game support more than any other factor.

What will not happen:

* Talisman 2d chicanery will not be useful in the most demanding 3d apps
  anymore than using cardboard cutouts has furthered the motion picture industry.

* Hardware will not take over the scene management and high level rendering
  aspects.  These limit versatility, and increase hardware cost, without gaining 
  much real performance.

* VRML will not be the way 3d is done on the Internet in the mainstream. There 
  will be cooler looking 3d stuff which makes more intelligent tradeoffs 
  between generality and graphical detail.

* People won't be buying $2500 PC's that hook up to their television.  If people
  wanted this stuff there would already be demand for it.

///////////////////////////////////////////////////////////////////////////////
D3D

HRESULT EnumDevices(LPD3DENUMDEVICESCALLBACK lpEnumDevicesCallback,
    LPVOID lpUserArg);

lpDirectDraw->QueryInterface(
    IID_IDirect3D,  // IDirect3D interface ID
    lpD3D);         // Address of a Direct3D object

	Direct3D:
		Enum DirectDraw devices and present a menu of them in camera window.
		Allow selecting a DirectDraw device.
		Use Hardware 3D toggle.

// do get d3d interface
lpDirectDraw->QueryInterface(
    IID_IDirect3D,  // IDirect3D interface ID
    lpD3D);         // Address of a Direct3D object

lpDirectDraw->CreateSurface(
    lpDDSurfDesc,   // Address of a DDSURFACEDESC structure
    lpFrontBuffer,  // Address of a DIRECTDRAWSURFACE structure
    pUnkOuter);     // NULL
lpFrontBuffer->GetAttachedSurface(
    &ddscaps,         // Address of a DDSCAPS structure
    &lpBackBuffer);   // Address of a DIRECTDRAWSURFACE structure
lpBackBuffer->QueryInterface(
    GUIDforID3DDevice,   // ID for IDirect3DDevice interface
    lpD3DDevice);        // Address of a DIRECT3DDEVICE object

HRESULT EnumDevices(LPD3DENUMDEVICESCALLBACK lpEnumDevicesCallback,
    LPVOID lpUserArg);

///////////////////////////////////////////////////////////////////////////////
2-13-97

+	Eliminate obsolete stuff:
+		GGfx.GammaCorrectPalette -> UPalette
+		GGfx.SetPalette  -> FCameraManager
+		GGfx.FixPalette  -> UPalette
+		GGfx.RGBtoHSV    -> FVector HSV constructor
+		GGfx.BurnRect    -> UTexture
+		GGfx.Clearscreen -> UTexture

+	D3D prep.

///////////////////////////////////////////////////////////////////////////////
2-14-96

+	Auugh! Opportunities from hell, yet so much work to do...
+	Init3D needs camera, needs success/fail return code.
+	Proper 3d hardware shutdown/startup.

+	D3D:
+		Use Hardware 3D option.
+		Pick list of D3D drivers.
+		Caps.
+			Device.
+			Surface.
+			Texture.
+		Create a viewport.
+		Create a temporary material.

====0.846b
+		BeginScene/EndScene.

Direct3D notes
--------------

* What on earth is D3DDEVCAPS_FLOATTLVERTEX - "Device accepts floating point for post-transform 
  vertex data". What does it mean when this cap bit is clear?

* What's the maximum execute buffer size that's safe on all hardware?  A minimum size 
  NEEDS to be defined. Is it 256 bytes? Is it 64K? Is it 256K?  Developers need to make
  major design decisions based on this kind of info! Without it, writing to Direct3D 
  is a total hack job.

* If I'm rendering straight from TLVERTICES do I need to use D3D matrixes? Do I need a
  material? Do I need a light? Do I need a background material? This stuff needs
  documenting.

* Execute errors are nearly impossible to track down because there's only one error
  return value from Execute.  There need to be error codes for each opcode type 
  and the codes need to be indicative of the problem.

* IDirect3DViewport::Clear does nothing when owner device's DirectDraw surface
  is locked, it should either perform the clear, or fail with an error result.

* The lack of explicit management of texture memory could be a performance bottleneck.
  For example, Unreal has about 20 megs of textures + light maps per level, and at any
  time about 1 meg is visible.  Without an efficient way to manage a texture cache,
  this creates a performance problem.  It's essential for D3D either to expose the
  texture memory layout, or provide a texture cache enabling the user to operate on
  what appear to be read-only system-memory textures, while D3D manages caching for
  the various levels of memory:

    - video memory
	- agp memory
	- system memory

  A caching scheme's priorities need to be weighted on two factors, LRU and the
  texture size (=performance cost of moving the texture around).

  ...If D3D already has a texture caching mechanism in place, that should be
  mentioned in the docs, and its performance characteristics described.

* Most of the D3D sample in-a-window apps in the SDK make the mouse cursor behave 
  erratically.  A demo app should demonstrate good programming practices for 
  an API, so this really needs to be fixed.

* Supporting 3dfx-style w-buffering would be nice. "w" is a 16-bit floating point 
  representation of 1/z. It eliminates the z-aliasing problems associated with 16-bit z buffers 
  and improves the range considerably.  No matter what the z buffer depth is (16/24/32)
  w-buffering is the best general representation, so it would be nice to push
  hardware vendors in this direction.

* For improving DrawPrimitive performance, it would be nice to have something like
  D3DPRIMITIVETYPE_PLANARPOLYGON which works like D3DPRIMITIVETYPE_TRIANGLEFAN, but
  only computes the triangles deltas once, and assumes that the specified triangles
  are planar and their texture deltas and lighting deltas are constant over the
  entire polygon.

* If future 3d hardware starts accelerating lighting calculations (using untransformed,
  unlit vertices), then it's vital to have a vertex' Gouraud color components still work.
  In this case, the vertex colors should be modulated by the hardware-calculated lighting!
  This enables some work, such as shadowing and overall coloring, do be done in software,
  while hardware performs lighting calculations. If the user doesn't want to do any
  software lighting at all, he could just set the vertex RGB components all to 255.

DirectDraw thoughts
-------------------

* It would be nice if the exclusive mode owner could adjust the monitor's
  gamma correction.  Most gfx cards like ATI and 3dfx provide custom control
  panels and proprietary API's for adjusting gamma and it would be helpful to
  standardize this. Realistic 3d games are far more gamma sensitive than
  regular windows UI apps due to scene dynamic ranges and to user expectations
  of what an environment actually looks like.

SUCKS
-----

* Documentation fails to address major design issues like viewport properties, TLVERTEX usage, 
  texture caching, materials, meaning of capability bits, execute buffers. For comparison 3dfx 
  Glide docs describe the API in complete detail.

* D3D error handling is lousy.  I'm spending >95% of my D3D programming time chasing down problems 
  (versus <20% with Glide), and all I see are these 3 cases:

 - DDERR_UNSUPPORTED (this is NOT a useful error message when trying to track 
   down subtle problems in the relationships between D3D objects and execute buffers, on 
   top of the lack of documentation of which objects are valid in which contexts).

 - GPF's which often require a reboot.

 - No error reported, but nothing visible is output.

* DrawPrimitive simply does not work in DX5 build 42.  <--- Maybe there's some other problem
  but all I can see is DDERR_UNSUPPORTED in my code, a GPF in D3DEX1, and random garbage in the 
  new D3DEX3.

* Execute buffers are terribly klunky for low-level polygon rendering.  You end up with tons 
  more convoluted code than Glide or GL because you have to figure out the execute buffer contents 
  twice, and either go through pointer hell or deal with those macros, carefully avoiding hidden 
  problems like the OP_NOP bug.

* Overall the amount of work that must be done, and objects that must be dealt with to just open 
  up a window and render some polygons, is extreme.  My 3dfx Glide library in Unreal is 1500 lines 
  of C++ code, for *full* support of all Unreal's features.  My Direct3D library is approaching 
  1600 lines of C++ code just for flatshading (not counting DirectDraw buffer management code), 
  and I can easily see it growing into 6000+ lines of convoluted mess when it comes time to deal 
  with capability bits, supported texture formats, palettes, etc.

3dfx thoughts
-------------

* DirectDraw driver keeps switching the passthrough on and off when it's queried.
  It should only touch the passthrough when the 3dfx is used for display.

* On install, SST_*GAMMA is being set to 1.7, which is a *terrible* gamma value
  to use. The gamma, if hardcoded, needs to match standard video cards, i.e.
  somewhere in the 1.0 - 1.25 range. When using Direct3D, there is no way to 
  adjust the gamma directly, so D3D stuff tends to look awful, and most people
  aren't hardcore enough to mess with their config.sys to fix this problem.

///////////////////////////////////////////////////////////////////////////////
2-15-97

+	3dfx
+		last palette color bug!

+	D3D continued.
+		Build execute buffer.
+		D3D execute buffer helpers.
+		Direct3D immediate mode SUCKS CRAP!
+		Fill background.
+		I can't believe that Microsoft would create such a shitty library.

///////////////////////////////////////////////////////////////////////////////
2-16-97 - 2-19-97

+	Microsoft, GT meetings.

///////////////////////////////////////////////////////////////////////////////
2-20-97

+	Fonts
+		Fixed f_huge, f_num

+	Implement PHYS_Interpolation in root class? Yes, using Target and Instigator.

+	UnrealEd
+		Blur tex on import ui option.
+		Script Edit/Copy doesn't seem to work but ^C does.

///////////////////////////////////////////////////////////////////////////////
2-21-97

+	UnrealScript issues to (re)ponder:
X		Allow state-local variables? -> DEFINITELY NOT
X			- SetState within a function would be impossible to manage with a simple stack.
X			- Would require a separate function and state stack.
X			- Even separate stacks wouldn't work because a function's stack would just disappear.
+		Global function f() overrides don't take precedence over parent state function f() overrides.

+	UnrealScript: check compile/decompile:
+		Simple State/EndState.
+		All state overrides.
+		Init all types.
+		TestEval all constant types.
+		Parameterless functions.
+		Parametered functions.
+		No variable declarations in states.
+		Functions with default parameters.
+		No var decls after functions.
+		Initialized local variables.
+		Proper state overriding.
+		Proper function overriding.

+		Order enforcement (Class:Vars/Funcs/States, State:Vars/Funcs/Code)
+		Don't allow overriding fast functions.
+		State/Class/Both function override parameter verification.
+		Fix operators.
+		Operator precedence.
+		Fast -> Final.

+	UnrealScript function overrides.
+		Allow function overrides.
+		Allow function overrides.
+		Don't allow function overrides which differ only by return type.
+		Allow mismatch of operator parameters from override.
+		Must work with arrays via FClassProperty::CompareTypes.

///////////////////////////////////////////////////////////////////////////////
UnrealScript test

>>ustest
'ok
final operator.1 add(a as integer, b as integer) as integer
	endoperator
final operator.1 add(a as real, b as real) as real
	endoperator
final operator.1 mul(a as real, b as vector) as vector
	endoperator
final operator.1 mul(a as vector, b as real) as vector
	endoperator

'error: redefinition
final operator.1 add(a as integer, b as integer) as integer
	endoperator

state st
	' ok
	final operator.1 add(a as integer, b as integer) as integer
		endoperator
	final operator.1 add(a as real, b as real) as real
		endoperator

	' error: differs only by return type
	final operator.1 mul(a as vector, b as real) as boolean
		endoperator
endstate

///////////////////////////////////////////////////////////////////////////////
continued

====0.847a
+	UnrealScript class context.
+		GetExpr
+		GetVariable

+	UnrealScript functions.
+		GetExpr include a Class context and be completely separate from compiler internals.
+		GetExpr handle actor variables plus "." as context setter.
+		Handle context expressions with arrays.

+	Optimizations.
+		EX_ByteConst
+		EX_One
+		EX_Zero

+	Added CPF_OutParm for "ByRef" parameters copied out of functions.

+	Let
+		Let variable = typed expr.
+		Let work with arrays.
+		Let work with class contexts.

+	True, False = boolean constants.

+	SC_Return: Function return statement with type checking.
+	SC_Assert.

+	Built-in constants:
+		Pi
+		MAXINT

///////////////////////////////////////////////////////////////////////////////
UnrealScript test

>>ustest
' Test functions.
Function TestEnum(A as EDrawType)
EndFunction

Function TestByte(A as Byte)
EndFunction

Function TestTexture(T as Texture)
EndFunction

Function TestActor(A as Actor)
EndFunction

Function TestPawn(P as Pawn)
EndFunction

' Bug test.
Function f()

	' Create some local variables.
	Dim A as EDrawType
	Dim B as Byte
	Dim T as Texture
	Dim M as Sound
	Dim R as Actor
	Dim P as Pawn
	Dim V1(10) as Vector
	Dim V2(10) as Vector
	Dim V3(20) as Vector
	Dim Boo as Boolean
	Dim Test as EDrawType=DT_Brush
	
	' Ok assignments.
	Let B=A
	Let A=A
	Let T=T
	Let M=M
	Let R=R
	Let P=P
	Let R=P
	Let V1=V1
	Let V1=V2
	Let V1(5)=V3(6)
	Let Boo=True
	'Let B=123
	Let A=DT_None
	Let A=DT_Mesh
	'Eval TestEnum(A)
	'Eval TestByte(A)
	'Eval TestByte(B)
	'Eval TestTexture(T)
	'Eval TestActor(R)
	'Eval TestActor(P)
	'Eval TestPawn(P)

	' Bad assignments.
	Let A=B
	Let T=M
	Let P=R
	Let V2=V3
	Let V1(1)=V2
	Let B=4934
	Let A=0
	'Eval TestEnum(B)
	'Eval TestTexture(M)
	'Eval TestPawn(A)

	' Ok casts.
	'Let A=EDrawType(B)
	'Let P=Pawn(A)

	' Bad casts.
	'Let M=Model(Texture)
EndFunction

///////////////////////////////////////////////////////////////////////////////
2-22-97

====0.847b
+	Allow const local variables.
+	GetExpr extensions:
+		Cleaned up GetExpr calling.

+	Expand type checking:
+		GetVariableExpr
+		GetFunctionExpr
+		GetExpr
+		Added PROPBIN_NonLValue to indicate non-actor properties

+	GetExpr:
+		Get typed enum expressions properly, only searching relevant enum.
+		Get typed resource expressions properly.
+		Get typed actor expressions properly.
+		GetConstExpr.

+	Class A is assignable to B if A is a NULL or A is a child of B.

+	GetConstExpr.
+		NoActor (special nil), Level constant actor type.
+		None (special nil) resource type.

====0.847c
+	Cleanup and rebuild UCX.
+	Cleanup old token code.

====0.847e
+	Constant token mapping.
+		Derive FToken from FClassProeprty and have only one TOKEN_Const.
+		Cleanup token constant mapping.

====0.847f
+	Constant cleanup.
+		EmitConstant always called properly?
+		EmitConstant handles all property types?
+		GetToken automatically handle MaxInt, Pi, True, False, etc.
+		Eliminated GetConstExpr.
+		Handle enums in GetToken.
+		Need CPF_Initialized?
+		Token type setting gates.

	The engine plan.
		For now:
			Tim continues working on UnrealScript.
			Steven continues setting up C++ AI code and soon doing early UnrealScript work.
			Mark continues network play.

		Steven/Tim get together at Epic once UnrealScript is running decently:
			Integrate the new AI code in the engine.
			Set up the major scripts: inventory, damage, physics, etc.

		Mark/Steven/Tim meet and coordinate how the network code, AI, and UnrealScript interface together,
		once the network code is nearing completion.
			Make whatever changes are needed to the engine.
			Make whatever changes are needed to the network code.
			Figure out the plan for future work.

		Mark/Tim fully integrate networking with the newest version of the engine.
			Get everything back up and running smoothly.
			Teleporting from server to server.
			Finalize the plan for the Web style navigational interface.
			Figure out the Gatekeeper plan.

		From then on:
			We all continue with our stuff.
			Set up an Internet-based (NFS) Visual SourceSafe database so that we're all working from
			the same codebase as we move towards finishing and fine tuning the engine.

		(I haven't forgotten about Ammon, but his code pretty separate and easy to merge compared to everyone else's).

====0.847g
+	Clean up FToken getters and accessors.
+		FToken::GetIntegerConst
+		FToken::GetRealConst
+		Check TOKEN_Const references.
+		FClassProperty::InitPropertyData
+		Fix variable initializer parsing problems.

>>ustest
Dim Q as Actor=None
Dim R as Actor=Level
Dim S as Pawn=None
Dim T as Pawn=Level ' error

Dim TT as Texture=None ' incorrect error
Dim QQ as Texture
Dim RR as Sound

Dim EE as EDrawType=DT_Sprite
Dim XX as EDrawType=23 ' error

Function f()
	Let TT=TT
	Let QQ=TT
	Let RR=None
	Let TT=RR ' error
	Let EE=DT_Brush
	Let EE=None ' error
EndFunction

---

>>ustest
Dim Q as Actor=None
Dim R as Actor=Level
Dim S as Pawn=None
Dim T as Pawn

Dim TT as Texture
Dim QQ as Texture
Dim RR as Sound

Dim EE as EDrawType=DT_Sprite
Dim XX as EDrawType

Enum ETim = One,Very,Cool,Dude

Function f()
	Eval Q
	Eval R
	Eval S
	EVal T
	EVal TT
	Eval QQ
	Eval RR
	Eval EE
	EVal XX
EndFunction
#decompile

---

>>ustest
Enum ETim = TIM_Is, TIM_A, TIM_Cool, TIM_Guy
Enum ETest = TEST_1, TEST_2, TEST_3

Dim Z as Integer
Dim A as ETim
Dim B(5) as ETest

Function f()
	Enum ELocalEnum = LE_ABC, LE_DEF
	Dim XX as ELocalEnum = LE_Abc
	Dim YY as ETim

	Let A=TIM_Cool
	Let A=A
	Let B(1)=B(4)
	Let XX=LE_DEF
	Let A=YY

	Let B(1)=A 'err
	Let B=B(4) 'err
EndFunction

Function g()
	Dim Q as ETim
	Dim R as ETest
    Dim S as ELocalEnum ' err
EndFunction

---

>>ustest
Dim a as integer
dim b as byte
dim xx as boolean
dim yy as boolean
dim z as string(20)
dim qq(12) as byte

Enum ETim=TIM_Rulz

Function f()
	eval EnumCount(ETim)
	eval EnumCount(EDrawType)
	eval EnumCount(ELightType)
endfunction
#decompile

====0.847h
+	GetPropertyTypeName -> Use global names instead.
X	FClassProperty::SetType needs EnumDef handler? -> No.
+	Rewrite Enum declaration logic.
+	ExportH and ExportTCX handle EnumDef's.
+	Only recognize Enum types in scope.
+	Full UCX rebuild.
+	Fix enum tags.
+	Clean up PushNest.
+	Built-in SizeOf(var), ArrayCount(var), EnumCount(Tag) which compile to integer constants.
+	Generalized actor class types.
+	Deleted CPF_Initialized.
+	Need CPF_Array? It simplifies the code, so, it's good to have around.
+	Function to find a named variable in scope, use for enums.
+	Run all UnrealScript test suites again.

///////////////////////////////////////////////////////////////////////////////

====0.847i
+	UScript CodeSwaperoo insert function, use for retrys.
+	Swaperoo variable processing.

>>ustest
function f()
	eval Me
	eval Parent
	eval DrawType
'	eval Parent.DrawType
'	eval Zone.Zone
	eval Zone.bWaterZone
	eval Target.Target
'	eval Me.Me.Me
'	eval Me.Parent.Zone.bWaterZone
endfunction
#decompile

+	Variables.
+		Only store variable types in Let.
+		CPF_Const means scripts can't use "Let".
+		CPF_Private means scripts can't access the variable at all.
+		Variable decompiler must reverse-map the variable name.
+		Property reverse-map booleans by bit.

///////////////////////////////////////////////////////////////////////////////
2/23/96

>>ustest

Dim GA as Integer
Dim GB as Actor
Dim GC as Light

Dim a,b,c,d,e,f as Boolean

function f()
	Dim LA as Integer
	Dim LB as Actor
	Dim LC as Light

	Let a=b
	Let c=d
	Let e=f

	Let GA=LA
	Let GB=LB
	Let GB.DrawType=LB.DrawType
	Let GC.GA=LC.GA

	Let LA=GA
	Let LB=GB
	Let LB.DrawType=GB.DrawType
	Let LC.GA=GC.GA

endfunction
#decompile

====0.847j
+	Variables.
+		Eliminated LastProperty, PropertyEndOffset hacks.
+		Must handle local property bin offsets relative to tree's start.
+		Handle decompiling through multiple class's context variables via iTree.

====0.847k
+	Expression typing.
+		CompileExpr must always have an expression type.
+		Handle Let with new typing logic.
+		Handle booleans with new typing logic.

>>ustest

' Testing constant conversions.
Dim a as integer
Dim b as byte
dim c as real

Function f()
	Dim r(5) as integer
	Dim s(5.0) as byte
	dim t(5.5) as byte 'error

	Let a=1
	Let b=2
	Let c=3

	Let a=1.0
	Let b=2.0
	Let c=3.0

	Let b=12345 'error
	Let a=2.4 'error
EndFunction

' Autoconversion arrow.
Function F()
	Dim I as Integer
	Dim B as Boolean
	Dim C as Boolean
	Dim D as Boolean
	Dim T as Texture

	Let I=Integer(B)
	Let I=Integer(C)
	Let I=Integer(D)
	Let B=Boolean(I)
	Let T=Resource(I)'err
	Let B=Boolean(T)'err

	'Let 213=435'err
EndFunction
#decompile

====0.847m
+	Conversions.
+		Automatic const conversions.
+		Test autoconversion arrow.
+		Automatic conversions via insert.
+		Explicit conversions via insert.

>>ustest

function fii_b(a as integer, b as integer) as boolean
	return True
endfunction

function fvv_i(v as vector, w as vector) as integer=123
endfunction

function TestCalls()
	Dim b as boolean
	Dim i as integer
	Dim v as Vector

	Let b=fii_b(123,456)
	let i=fvv_i(v,Vector(1,2,Pi))
endfunction

#decompile

====0.847n
+	No copying of stack nodes when creating a class, to eliminate redundency.
+	Stack nodes need a WORD iFunction which is an idenfifier that is unique (within a class) to 
+		a base function and its overloads. iFunc's are inhereted by child classes, so
+		they are not necessarily unique among functions declared in sibling classes.
	
///////////////////////////////////////////////////////////////////////////////
2-24-97

>>ustest

'ok
operator.1 add(a as integer, b as integer) as integer
	endoperator
operator.1 add(a as real, b as real) as real
	endoperator
operator.1 mul(a as real, b as vector) as vector
	endoperator
operator.1 mul(a as vector, b as real) as vector
	endoperator

'error: redefinition
operator.1 add(a as integer, b as integer) as integer
	endoperator

engine function f()
endfunction

final function g()
endfunction

private function h()
endfunction

function i()
endfunction

state st
	' ok
	private operator.1 add(a as integer, b as integer) as integer
		endoperator
	final operator.1 add(a as real, b as real) as real
		endoperator

	function f() ' error: needs Engine specifier.
	endfunction

	Engine function f()
	endfunction

	function g() ' error: final
	endfunction

	function h() ' error: needs private.
	endfunction

	private function h()
	endfunction

	function i()
	endfunction

	' error: differs only by return type
	operator.1 mul(a as vector, b as real) as boolean
		endoperator
endstate

====0.847p
+	SNODE_FuncOverrideMatch contains flags that must match in an override.
+	Put function affectors like "Final" in front of word "Function", not after.
+	Allow overriding non-Final functions with Final functions.
+	Engine functions are overridable, non-overloadable functions called by the engine.
+		These use SNODE_Engine, and optionally SNODE_Private.
+		Prevent overloading engine functions.
+		This is how built-in messages are type checked. For example:
+			Declare [Private] [Engine] Function FuncName(parms) as Type

///////////////////////////////////////////////////////////////////////////////

>>ustest

declare function f()
declare final function g(a as integer)
'declare intrinsic function eirj(v as vector) as boolean

function hwf(a as integer, b as real) as texture
endfunction

function sqrt(a as integer) as integer: return 123

function wefok()
	return 777
endfunction

====0.847q
+	Function declaration.
+		SNODE_Defined indicates that a function has actually been defined.
+		Allow Basic style ':' for combining lines.
+		Stick SC_Return at end of function codestream, not "End".
+		Allow function forward declaration. 
+		PopNest must balk at declared functions that weren't defined but should have been.
+		Intrinsic functions may only be declared, not defined.
+		Engine functions may either be declared or defined.
+		All other functions must be defined.

+	Function definition.
+		Recognize definition after declaration, and remove prior definitions.

+	Fix iFunctions with definitions.
+	Functions in state blocks must properly override.

>>ustest

Declare Function f(a as integer, b as integer) as boolean
Declare Function g(a as vector, b as vector) as rotation
Declare Final Function h()

'Declare Function g(a as vector, b as vector) as rotation 'err: dupe

Function g(a as vector, b as vector) as rotation
	'return vector(1,2,3)
	return rotation(1,2,3)
EndFunction

Final Function h()
EndFunction

Function f(a as integer, b as integer) as boolean
EndFunction

Function Test()
	'Eval f(1,2)
	'Eval g(vector(1,2,3),Location)
	'Eval h()
EndFunction

State st
	Function g(a as vector, b as vector) as rotation
		'return vector(1,2,3)
		return rotation(1,2,3)
	EndFunction
EndState
#decompileall

///////////////////////////////////////////////////////////////////////////////

====0.847r
+	Generalized function overloading and comparing.
+		Easy overload determination via:
+			int CompareFunctions(FClassProperty *List1,int Num1,FClassProperty *List2,int Num2).
+		Returns:
+			-1 = incompatible functions.
+			 0 = exact match.
+			 1 = promotions + string length conversions.
+			 2 = truncations.

>>ustest

function f(i as integer)
endfunction

function Test
	Dim a as integer
	Dim b as byte
	Dim c as real
	Dim d as vector
	Eval f(a) ' identity
	Eval f(b) ' truncation
	eval f(c) ' promotion
endfunction

>>ustest

function f(b as byte) as integer
endfunction

function g(i as integer) as integer
endfunction

function h(v as vector) as integer
endfunction

function i(r as rotation) as integer
endfunction

function j(r as real) as integer
endfunction

function k(a as pawn) as integer
endfunction

function l(fwef as edrawtype) as integer
endfunction

function m(fwef as texture) as integer
endfunction

function test()
	Dim actor1 as pawn
	Dim actor2 as actor
	Dim actor3 as brute

	Eval f(1)
	Eval g(1)
	Eval j(1.0)
	Eval h(Vector(1,2,3))
	Eval i(Rotation(1,2,3)) ' ???
	Eval m(None)
	Eval k(NoActor)
	Eval k(actor1)
	Eval k(actor3)
	eval l(DT_None)
	Eval m(Texture(Default)) ' error
	eval a(LE_None) ' error
	Eval k(actor2) ' error
	Eval f(Rotatation(1,2,3)) ' ???
	Eval rth(byte(1),vector(1,2,3),0,NoActor)
endfunction

+	Returning arrays isn't allowed.
X		Can't use this mechanism -> Fails when type sensitive expressions are
X		required like enum tags, so reverted to old (slower) parsing all function
X		calls approach.
X			Determining whether new functions are overloads or overrides of existing functions.
X			Finding the best matching function to call.
X			Matching functions with their forward declarations.

///////////////////////////////////////////////////////////////////////////////

>>ustest
function owfek(a as integer)
endfunction

function testout(a as Out real)
endfunction

function testout(a as real) ' bad
endfunction

function testout(a as Out real=123)
endfunction

declare final operator.1 add(a as integer, b as integer) as boolean
declare final operator.1 add(a as real, b as real) as real
declare final operator.1 add(a as integer, b as integer) as vector ' err
' req final

' incorrect err
Dim r as real=123
function testout(a as Out real=123)
endfunction

' private enforcement test.
private function f(a as integer) as real
endfunction

function g(a as integer) as boolean
endfunction

function test()
	eval f(1)
	eval g(2)
endfunction

+	Operator parameters must have no regular flags.
X	Function calling.
X		Balk when calling if multiple functions declarad at the same scope 
X			have the same rank.
+	Added LocalsSize indicating size of per-function local data.
+   No function overloading, just operator overloading. Too many added complexities.
+	Therefore, I don't need iFunction.
+	Kill iFunction, NumUniqueFunctions.
+	Operators must be Final.
+	Make sure CPF_Array, CPF_OutParm are matched for overrides/overloads.
+	No optional out parms.
+	Function calls must properly deduce arrays and strings.
+	Enforce SNODE_Private.
+	Engine functions may not be Final :-P
X	Prevent defined-but-not-declared engine functions from being called -> Must be done at exec calltime.
+	Func return values are nonlvalues.

function a(s as string(32)) as integer
endfunction

function test()
	Dim s as string(32)
	Dim t(3) as string(32)
	Dim u as string(15)

	Let s=t(1) ' no conv
	Let s=u ' conv

	Eval a(s)
	Eval a(t(1))
	Eval a(u) ' ok, requires length conversion
    'Eval a(t) ' error
	'Eval String(123)
endfunction
#decompile

+	Function calling.
X		Only evaluate and emit parms twice, not once per overload tested.
+		Built-in EX_ResizeString conversion function to modify length of nonarray string.
+		Must EX_ResizeString casts to String type to the proper type.
+		Eliminate CPT_Array junk.

///////////////////////////////////////////////////////////////////////////////

>>ustest
Function OurTest(A as Out Integer) as Boolean
EndFunction

Function Tester()
	Dim a as Integer
	Dim b as Real
	Dim c as String(5)
	Dim d as Byte
	Dim e(10) as Integer

	Eval OurTest(a)
	Eval OurTest(b)
	Eval OurTest(c)
	Eval OurTest(d)
	Eval OurTest(e(2))
	Eval OurTest(123) 'bad
	Eval OurTest(234.23) 'bad
	Eval OurTest(e) 'bad
EndFunction

+	Out parms.
+		Force "Out" parameters to be l-values by adding l-value support to CompileExpr.

>>ustest
DIM GA as INTEGER

Function Shistol(a as integer) as boolean
EndFunction

Function Pit(b as real) as real
EndFunction

Function MyTest()
	Eval Shistol(123)
	Eval Pit(5.0)
	Eval Me.DrawType
	Eval Me.Parent.Zone.bWaterZone
	Eval Me.GA
	Eval Parent.GA 'error
	Eval Me.Shistol(123)
	Eval Me.Me.Me.Pit(1233.42)
	Eval Parent.Pit(666) 'error
	Eval Zone.miewciwrf(666) 'error
	Eval Me.ijerg(2342) 'error
EndFunction

Function SomeOtherActorTest()
	Dim E as Light
	Eval E.GA
	Eval E.Shistol(123)
	Eval Me.GA ' err
	Eval Shistol(123) 'err
	Eval Me.Shistol(123) 'err
EndFunction

+	Context function calls.
+		Properly support context function calls, and clean up context logic - CompileExpr?
+		CompileFunctionExpr needs logic to reach into other contexts.
+		Test cross class context function calls.

///////////////////////////////////////////////////////////////////////////////

>>ustest
Dim GA as Integer
Function BindTest()
	Eval GA
	Eval Me.GA
	Eval DrawType
	Eval Parent.Me.Zone.bFogZone
EndFunction
#decompile

>>ustest
Dim SomeGlobal as Integer

Function Test(a as real=1.23,b as vector=vector(1,2,3),r as integer=123) as integer
EndFunction

Function BindTest()
	Dim Tesrg(5) as integer
	Eval 123
	'Eval TestNormal()
	Eval Test(123,,666)
	Eval 456
EndFunction
#decompile

====0.847t
+	Don't add empty expression to end of function calls.
+	Function call decompiling.
+		EX_Function.
+		EX_FinalFunction.
+		Final function parms.
+		Track down the proper normal function call parms.
+		Decompile optional parms.

+	An overridden function to call is chosen by the following criteria, which is
+	guaranteed to produce one single best matching function without redundency.
+	1.	State functions residing in the current state in the current class are chosen before
+	    functions residing in the current state in the parent class.
+	2.	Global functions in the current class are chosen before global functions in the parent
+	    class.

+	Self-calls (calls from an actor to itself) are bound as follows.
+	Context-calls (calls from an actor through an actor variable) are bound identically.
+	*	Final functions are prebound to (ClassWhereFinalFuncIsDefined,iStackNode) in this class.
+	*	All other functions are calltime bound to their (FName) in this class, therefore
+	    operators (which may be overridden) must be Final to be uniquely bound.

///////////////////////////////////////////////////////////////////////////////
2-25-97

>>ustest

function PyrotechnicsTest(PawnA as integer, PawnB as Rotation) as Boolean
EndFunction

function LightTest(LightA as integer, LightB as Real) as Boolean
EndFunction

function Test()
	Dim XLight as Light
	Dim XPyrotechnics as Pyrotechnics

	' context calls.
	Eval XLight.LightTest(123,1.0)
	Eval XPyrotechnics.PyrotechnicsTest(456,rotation(1,2,3))
EndFunction
#decompile

====0.847u
+	Advanced functions.
+		Context function call decompiling.
+			EX_ContextFunction.
X		When declaring any function which uses the same name as a
X			previously-defined state-only function in a class's inheretance tree,
X			make sure the new one matches exactly. Otherwise you can end up with
X			incompatible functions called in derived classes. -> Caveat UnrealScriptor

+	Test three-class context traveral.
+	Verify state / class override order.
+	Verify self Final calls.
+	Verify self latebound calls.
+	Verify context Final calls.
+	Verify context latebound calls.
+	Retry all the test suites.

Declare Function f(a as integer) as integer
Declare Function g(b as boolean) as boolean
Declare Function h(c as real) as real

Function Test()
	Eval f(1)
	Eval g(True)
	Eval h(1.0)
EndFunction

Function f(a as integer) as integer
EndFunction

Function g(b as boolean) as boolean
EndFunction

Function h(c as real) as real
EndFunction

+	Test function declaration

+	Syntax changes.
+		[] denotes array.


///////////////////////////////////////////////////////////////////////////////

+	Operators
+		Operator precedence (highest to lowest) -- all operators are left to right.
10		++ -- (?Support these?)
12		Not BitNot ^
14		+ - (unary)
16		* / Dot Cross
18		Mod
20		+ -
22		<< >>
24		< <= > >= ==
26		<>
28		BitAnd BitXor BitOr
30		And Xor
32		Or
34		*= /= %= += -= (?Support these?)

+	All UnrealScript operator defs.
+	Allow intrinsic functions to be declared anywhere.
+	Fixed major realloc-the-rug-out-from-under-your-feet bug.

+	Intrinsic(internal id) syntax.
+	New, faster calling types.

>>ustest
Function f(a as integer) as boolean
endfunction

state st
	Function f(a as integer) as boolean
	endfunction
endstate

>>ustest

final operator(2) + (a as integer, b as integer) as integer
endoperator

final operator(1) * (a as integer, b as integer) as integer
endoperator

final operator(3) += (a as out integer, b as integer) as integer
endoperator

'final operator(1) +(a as integer, b as integer) as boolean 'error, obvious duplicate.
'endoperator

'final operator(1) +(a as real, b as real) as boolean
'endoperator

function test()
	Dim a as integer
	Dim b as byte
	a = 1+2+3+4
	Eval a += 1+2
	Eval 1 += 1+2 '!!
	'eval a+b
	'eval 1+b
endfunction
#decompile

====0.847v
+	Operators.
X		First parm type of a given operator overload must be unique.
+		Recognize operator calls.
+		Handle binary operators (no precedence).
+		Compile operator calls.
+		Properly manage operator precedence.
+		Write Unreal operator declarations.
+		Support += and the like? Yes, via OutParm's.

+	Need forward function declarations.
X	Need post-compile state and label insertion.

Function f(a as integer) as boolean
endfunction

state st
	Function f(a as integer) as boolean
	endfunction
endstate

+	Cleanup and rearrange script compiler by function.
+	Fix all outdated commands.


>>ustest
final operator(2) + (a as integer, b as integer) as integer
endoperator

final operator(1) * (a as integer, b as integer) as integer
endoperator

final operator(3) += (a as out integer, b as integer) as integer
endoperator

'final operator(1) +(a as integer, b as integer) as boolean 'error, obvious duplicate.
'endoperator

final operator(2) +(a as real, b as real) as boolean
endoperator

function test()
	Eval 1+2
	Eval 1+2.0
	Eval 2.0+1
	Eval 1.0+2.0
	Eval 1+vector(1,2,3)
	Eval vector(1,2,3)+1
	'Dim a as integer
	'Dim b as byte
	'a = 1+2+3+4
	'Eval a += 1+2
	'Eval 1 += 1+2 '!!
	'eval a+b
	'eval 1+b
endfunction
#decompile

>>ustest

final operator(2) + (a as integer, b as byte) as integer
endoperator

final operator(2) + (a as byte, b as integer) as integer
endoperator

final operator(2) += (a as out byte, b as byte) as byte
endoperator

function test()
	Dim a as byte, b as byte
	Eval 1+2
	Eval a+b
	Eval a+=b
	Eval a+=DrawType
	Eval 1 += b
	Eval DrawType+=a'error
endfunction
#decompile

====0.847w
+	ConversionCost (Dest, Source):
+		0 if types are identical.
+		1 if dest is more precise than source
+		2 if converting to float from integral type.
+		3 if dest is less precise than source, or a generalization of source
+		MAXINT if the types are incompatible

+	Operators continued.
+		Properly deduce operator overloads.
+		Verify OutParms, i.e. prevent 1+=2
+		Balk at multiple identical weight conversions.

///////////////////////////////////////////////////////////////////////////////
2-26-97 & 2-27-97

====0.847x
+	PopNest shouldn't emit code end (SC_ReturnFinal, SC_End).
+	No stack nodes for tempoarary stack things like While.
+	Decompiler option to show start addresses of commands.
+	UnrealScript state machines and code generation.
+		If-ElseIf-Else state machine.
+		While/Do-Until/Loop
+			CheckAllow LoopCmd.
+			Loop Break.
+		For-Next.
+		Select/Case state machine.
+	Switch, Let must not allow arrays.

+	Address fixup prep:
+		Fixup typedefs.
+		Proper evaluation of For condition at end of loop.

Function TestIf()
	If True then
		Eval 1
	ElseIf False then
		Eval 2
	ElseIf False then
		Eval 3
	Else
		Eval 4
	EndIf
EndFunction
#decompile

Function TestWhile()
	Do
		Eval 1
	Loop
	While True
		Eval 2
	Loop
	Do	
		Eval 3
	Until False
	While False
		Eval 3
		Break
		Eval 4
		Break
	Until False
EndFunction
#decompile

Function TestFor()
	Dim a as integer, q as integer
	next
	for( a=1; True; 123 )
		Eval 567
		break
		Eval 789
	next
EndFunction
#decompile

Function TestSwitch()
	Dim r as EDrawType
	Switch r
		Case DT_None:
			Eval 123
		Case DT_Brush:
			Eval 456
		Default:
			Eval 789
		'Default:
			'Eval 123
	EndSwitch
EndFunction
#decompile

' Name evaluator test.
Function NameTest()
	Dim MyTest as Name
	Eval Name(LE_None)
	Eval LE_None
	Let MyTest=Name(LE_None)
	Let MyTest=LE_None
EndFunction
#decompile

====0.847y
+	Address fixup:
+		PopNest perform the fixup list and detect inconsistencies.
+		Linked list of fixup offsets and types.
+		For-Next, Break.
+		For needs to support Break.
+		Do/While-Until/Loop, Break.

+	Conditionals fixup.
+		If-ElseIf-Else.
+		Formalize chaining system for if's.
+		Switch-Case-Default.

====0.847z
+	Compiler automatically recognizes name constants in name context.

+	States.
+		No nesting of states.
+		No variable declarations after code or functions.
+		No functions after code.
+		States must begin with a label (any label).
+		Require all state functions before all state code.
+		State code start is messed up by code stored in per-state functions.
+		Proper state inheretance.
+		Handle 'Auto', 'Editable' state keywords.

///////////////////////////////////////////////////////////////////////////////
2-28-97 Fri

+	UnrealScript probe support.
+		Hardcoded actor messages in the range X to X+63 can be tagged as probes.

+	Trip to prospective licensee.

///////////////////////////////////////////////////////////////////////////////
3-1-97

' State example.
Function f()
EndFunction

State st
	Ignores GainedChild, Spawned, Trigger, All

	Function h(a as integer) as Boolean
	EndFunction

	Function f()
	EndFunction

Begin:
	Eval h(777)
	Eval 123

Doophyz:
	Eval 456

Testholio:
	'Goto Begin
	'Goto Doophyz
	'Goto Testholio

EndState
#decompile

+	Probes.
+		FStackNode state probe bits (QWORD mask).
+		Added AActor::WantsProbe function to determine whether a particular probe
+			message is desired.
+		Allow 'Ignores' specifier in class, state to specify ignored probes.
+		Recursively build after compile for *defined* functions only.
+		Optional, hardcoded Sub BeginState/Sub EndState to assure state-change cleanup.
+		Per-actor disable-mask with special 'all' field.
+		Functions starting with "Server" must use special parm format.

>>ustest
' Boolean test
Function f()
	Dim a as integer
	Dim r as real
	Dim s[20] as integer
	dim b as boolean
	dim ba[20] as boolean

	eval a
	eval r
	eval s
	eval s[1]
	eval b
	eval ba[1]
EndFunction

>>ustest
' Function emit test.
Declare Intrinsic(1) Function A()
Declare Intrinsic(2) Final Function B()
Declare Intrinsic(1234) Function C()
Declare Intrinsic(1235) Final Function D()
Function E()
EndFunction
Final Function F()
EndFunction

State St
Begin:
	eval A()
	eval B()
	eval C()
	eval D()
	eval E()
	eval F()
EndState
#decompile

====0.848a
+	Advanced labels.
+		Actor.GotoState State.Label ' execution time bound, callable direct or via context, deferred execution
+			Where the names can be name const's or name variables.
+		Actor.IsEnabledFunction(<engine_function_name>)
+		Actor.IsLabel(<label_name>)
+		Actor.IsState(<label_name>)
+		Allow defining labels with LabelName:

+	Auto-emit EX_EndFunctionParms as last function call parm, so function calls
+		need not traverse the function parms (operators too).
+	Remove DecompileExpr's need to know about type (boolean violation).

+	EX_IntinsicFinal(0x80) for intrinsics 1-127.
+	EX_IntrinsicFinalEx(0x40) for intrinsics 128-16383.

X	Decisions:
X		Use standard expression list syntax so there are only intrinsic functions, not commands,
X			and intrinsic parm parsing is identical to script parm parsing?
X		Commands and functions should be equivalant? -> Instead, I'm keeping the number
X		of commands to a minimum, opting to implement as much as possible as
X		intrinsic functions.

+	Goto & labels.
+		Build and maintain per-state label list (SC_LabelTable), align with SC_NOP.

>>ustest
' Actor cast test.
function f()
	Dim A as Actor
	Dim P as Pawn
	Dim S as Skaarj
	Dim I as Inventory
	Dim W as Weapon

	' Compatible assignments.
	Let A=P
	Let A=S
	Let P=S
	Let A=I
	Let A=W
	Let I=W

	' Ok casts.
	Let P=Pawn(A)
	Let S=Skaarj(P)
	Let S=Skaarj(A)
	Let W=Weapon(I)
	Let W=Weapon(A)
	Let I=Inventory(A)

	' Never useful casts.
	'Let P=Pawn(I)
	'Let P=Pawn(W)
	'Let S=Skaarj(W)
	'Let I=Inventory(P)
	'Let W=Weapon(S)
endfunction
#decompile

====0.848b
+	EX_ActorCast dynamic actor casting function.

====0.848c
+	Decisions:
+		Support final labels and normal (virtual) labels.
+		Final labels are compile-time bound and not overridable.
+		Virtual labels are runtime bound and overridable.

+	'Enable'/'Disable' function to enable/disable probes/all individually per state.

>>ustest
function test()
	Dim v as vector
	Dim r as rotation
	Eval v
	Eval r
	Eval v.x
	Eval v.y
	Eval v.z
	Eval v.d
	Eval r.pitch
	Eval r.yaw
	Eval r.roll
endfunction
#decompile

+	Handle vector and rotation members, decompile them properly.
+	Separate out compiler-only code from UnScrEng.h into UnScrCom.h.

>>ustest

final postoperator ++ (a as out integer) as integer
endoperator

final preoperator ++ (a as out integer) as integer
endoperator

'final operator(10) * (a as integer, b as integer) as integer
'endoperator

function f()
	Dim r as integer
	Dim b as byte

	eval r++
	eval ++r
	eval b++
	eval ++b
endfunction
#decompile

====0.848d
+	Operators continued.
+		Unary postfix operators with "Operator/PreOperator/PostOperator".
+		Require oper parms match with declared type.
+		Defined pre and post ++, --
+		Define +=, -= etc for all types, not just integer.
+		Opers must check for OutParms.
+		Compile unary postfix operators calls.
+		Compile unary prefix operators calls.
+		Torture test unary and binary operators.

>>ustest
Intrinsic(014) Final PreOperator  +     (A as Integer               ) as Integer
Intrinsic(018) Final Operator(20) +     (A as Integer, B as Integer ) as Integer
Intrinsic(040) Final PreOperator  +     (A as Real                  ) as Real
Intrinsic(068) Final Operator(20) +     (A as String[256], B as String[256]    ) as String[256]
Intrinsic(082) Final PreOperator  +     (A as Vector                 ) as Vector
Intrinsic(099) Final Operator(20) +     (A as Rotation, B as Rotation) as Rotation

Intrinsic(007) Final Operator(34) +=    (A as Out Byte, B as Byte ) as Byte
Intrinsic(033) Final Operator(34) +=    (A as Out Integer, B as Integer ) as Integer
Intrinsic(056) Final Operator(34) +=    (A as Out Real, B as Real   ) as Real
Intrinsic(075) Final Operator(34) +=    (A as Out String[256], B as String[256]) as String[256]
Intrinsic(095) Final Operator(34) +=    (A as Out Vector, B as Vector) as Vector

function f()
	Dim a as integer
	Dim b as byte
	Dim c as real

	'eval 1+2*3^4
	'eval a++ + ++a
	'eval a + b
	eval a += b
	'eval b += a
endfunction
#decompile

>>ustest
' Real-number operators.
Intrinsic(040) Final PreOperator  +     (A as Real                  ) as Real
Intrinsic(041) Final PreOperator  -     (A as Real                  ) as Real
Intrinsic(042) Final Operator(12) ^     (A as Real, B as Real       ) as Real
Intrinsic(043) Final Operator(16) *     (A as Real, B as Real       ) as Real
Intrinsic(044) Final Operator(16) /     (A as Real, B as Real       ) as Real
Intrinsic(045) Final Operator(18) Mod   (A as Real, B as Real       ) as Real
Intrinsic(046) Final Operator(20) +     (A as Real, B as Real       ) as Real
Intrinsic(047) Final Operator(20) -     (A as Real, B as Real       ) as Real
Intrinsic(048) Final Operator(24) <     (A as Real, B as Real       ) as Boolean
Intrinsic(049) Final Operator(24) >     (A as Real, B as Real       ) as Boolean
Intrinsic(050) Final Operator(24) <=    (A as Real, B as Real       ) as Boolean
Intrinsic(051) Final Operator(24) >=    (A as Real, B as Real       ) as Boolean
Intrinsic(052) Final Operator(24) =     (A as Real, B as Real       ) as Boolean
Intrinsic(053) Final Operator(26) <>    (A as Real, B as Real       ) as Boolean
Intrinsic(054) Final Operator(34) *=    (A as Out Real, B as Real   ) as Real
Intrinsic(055) Final Operator(34) /=    (A as Out Real, B as Real   ) as Real
Intrinsic(056) Final Operator(34) +=    (A as Out Real, B as Real   ) as Real
Intrinsic(057) Final Operator(34) -=    (A as Out Real, B as Real   ) as Real

' Real-number functions.
Intrinsic(058) Final Function     Abs   (A as Real                  ) as Real
Intrinsic(059) Final Function     Sin   (A as Real                  ) as Real
Intrinsic(060) Final Function     Cos   (A as Real                  ) as Real
Intrinsic(061) Final Function     Tan   (A as Real                  ) as Real
Intrinsic(062) Final Function     Atn   (A as Real                  ) as Real
Intrinsic(063) Final Function     Exp   (A as Real                  ) as Real
Intrinsic(064) Final Function     Log   (A as Real                  ) as Real
Intrinsic(065) Final Function     FRand (                           ) as Real
Intrinsic(066) Final Function     Sqrt  (R as Real                  ) as Real
Intrinsic(067) Final Function     Square(R as Real                  ) as Real

+	Operator torture test
+		Decompile has a context bug with +=.
+		EX_EndFunctionParms problem?

///////////////////////////////////////////////////////////////////////////////

>>ustest
Function f()
	Goto HisLabel
MyLabel:
	eval 123
YourLabel:
	Eval 234
HisLabel:
	Eval 345
	Goto MyLabel
	Goto YourLabel
	'Goto YourMama
EndFunction

>>ustest
State st
Begin:
	eval 123
TestLabel:
	eval 234
Frank:
	eval 345

	' Goto test.
	Goto Begin
	Goto TestLabel
	Goto Frank
EndState
#decompile

State st
TestLabel: ' override
NewLabel:
	Goto Begin     ' inheret
	Goto TestLabel ' override
	Goto NewLabel  ' new
EndState
#decompile
///////////////////////////////////////////////////////////////////////////////
3-3-97

====0.848e
+	Goto & labels.
+		Allow final labels and Goto in functions.
+		SC_GotoNearCode wOffset ' compile time bound.
+		Require states to have a Begin label, GotoState default to it.
+		State goto codec.
+		Virtual labels in states.
+		Note duplicate labels in functions and states.
+		Inheret labels, including Begin.

+	Make sure script stream is easily decompilable.

>>ustest
function f()
endfunction
function g()
endfunction

state st
	function f()
	endfunction
	function h()
	endfunction
begin:
	eval callclass(wefj) f()
	eval callclass(light) f()
	eval callclass(actor) f()
	eval callglobal f()
	eval callglobal g()
	eval callglobal h() 'err
endstate
#decompile

function f()
	Dim a[11] as integer
	Eval a[1]
endfunction

SCRIPT DECOMPILE CLASS=Light

====0.848h
+	Need a way of calling a specific, prebound stack node for a function:
X		Possibility 1:
X			ClassName::FuncName   - function as stored in class.
X			::ClassName::FuncName - function as stored in class but not state.
+		Possibility 2:
+			CallGlobal Func(parms) ' Calls nonstate version of function
+			CallClass(ClassName) Func(parms) ' Calls version in parent class
+			I like this the best because it's readable and easily parseable.
+		These are called as final functions (normal or intrinsic).
+		CallGlobal.
+		CallClass.

====0.848h
+	File code.
+		Stack node serializer.
+		Can reduce code size or stack node size anywhere? Unionize?
+		Script serializer.

+	Serialize rotations as WORD's internally.

+	Properly recognize resource names in their context.

///////////////////////////////////////////////////////////////////////////////
3-4-97

>>ustest
function f()
{
	dim A as real, B as real, C as real, D as real
	eval a + b
	eval a * b
	eval a + b * c
	eval a + b * c ^ d
MyLabel:
	goto MyLabel
}

state st
{
	Function f()
	{
		let LightType=LT_None
	}
Begin:
	eval 123
	eval 1
	eval True
	eval 1.0
	eval Vector(1,2,3)
	eval Rotation(1,2,3)
	eval Texture(Default)
	eval Name(Eigen)
MyLabel:
	goto MyLabel
}
#decompile

>>ustest
class Light expands Actor;

enum ETest
{
	TEST_123,
	TEST_456,
	TEST_567
};

function f()
{
	Dim a as int;
	Dim b as bool;
	Dim c[2] as float;
	Eval a;
	Eval "123/**/";
	Eval "*/";
}

state st
{
begin:
	switch 123
	{
		case 1:
		case 2:
			eval 1;
			break;
		case 2:
			eval 2;
		default:
			eval 3;
	}
	eval 4
}
#decompile

>>ustest
class Light expands Actor;

====0.848i
+	Fix saving and restoring of class upon error.

+	Use Java syntax.
+	Java // comments.
+	Java semicolons.
+	functions require {}
+	Java enum syntax.
+	Java /* */ comments.
+	float, int, bool.
+	State/EndState.

====0.848j
+	Switch/EndSwitch.
+	Switch like C, with Break required otherwise fall through.
+	Case/Default.

====0.848k
+	For/Next.
+	While/Do.
+	Until/Loop.
+	Move all end-thing logic to PopNest.

+	If/ElseIf/Else.

+	Nest // comments in /* */ comments.

class Light expands Actor;
dim editable(yamada) string[20] x[2];
function f()
{
	Dim int a;
	while( True )
	{
		eval 1;
		break;
		eval 2;
	} until( False );
	eval 3;
	for( a=0; True; 123 )
	{
		eval 1;
		break;
		eval 2;
	}
	eval 3;
	if( True )
	{
		Eval 1;
		Eval 1;
	}
	Else If( True )
	{
		Eval 2;
		Eval 2;
	}
	Else If( False )
	{
		Eval 3;
		Eval 3;
	}
	Else
	{
		Eval 4;
		Eval 4;
	}
}
#decompile

>>ustest
class Light expands Actor;

dim int        Tim[2];
dim string[20] Bob;
dim float      MyFloat=3.14;

function vector f( int a, out byte b )
{
	return vector(1,2,3);
}
#decompile

>>ustest
class Light expands Actor;

function f()
{
}

function g()
{
	//Broadcast.f();
	Broadcast(NoName,Light).g();
}

====0.848m
+	SetPropertyFlags
+	SetPropertyType

+	How to broadcast messages.
+		Broadcast(Name=None,Class=Actor).funccall()
+		SC_Broadcast <name_expr> <class_expr> <class func_call_expr - final or virtual>
+		Properly recognize broadcast class's context.
+		Properly decompile broadcast class's context.
+		Properly load/save broadcasts.

X	Merge enum defs with enum variable decls.
+	Decompile string sizes.

+	Update decompiler.
+	Clean all error messages.

+	GetVarType.
+		Replace GetVarDecl with GetVarType, GetVarNameAndDim.

class Light expands Actor;

var Rotation R=Rotation(1,2,3);

function h(string[16] b)
{
}

function Bool f(Vector v, Out Rotation Rot)
{
}

state st
{
Begin:
	eval h("Hello!");
	eval f(vector(1,2,3),R);
}
#decompile

====0.848n
+	Merge enum declaration with variable declaration.
+	Allow declaring multiple variables in one dim.
+	Improved constant initializer handling.

+	Merge function return types with function specifiers.

X	Vars.
X		GetVarType accumulate function overrides, too.
X		Dim: Use GetVarType, error if func overrides.
X		Function: use GetVarType for parameters, error if illegal overrides.
X		Function: use GetVarType for return value, error if illegal overrides.

X	Figure out evaluation scheme.
X		Java variable declaration syntax.
X		Java function declaration syntax.
X		Assign variables straight from code.
X		Call functions straight from code.

X	var_overrides...  var_type  var_overrides...  varname [,varname...];
X	func_overrides... func_type func_overrides... funcname(parms) {}
X	varname = expr;
X	funcname(parms);

X	func overrides:
X		intrinsic(#)
X		final
X		engine
X		private
X		declare
X		operator(#)
X		preoperator
X		postoperator

X	if not a recognized standard cmd:
X		init retry
X		skip overrides until we get type name
X		if got type name
X			get instance name
X			get ( or not.
X				got it -> function def, so retry and parse func.
X				not -> variable def, so retry and parse var.
X		not got type name
X			is it [let] name= -> variable
X			is it [callglobal] [callclass] name( -> func call
X			else unrecognized

+	Statics with new syntax.
X	New operator syntax.
+	Update all classes.
+	Rebuild root.

+	Fixed panning bug - was a base dislocation problem.

//////////////////////////////////////////////////////////////////////////////
3-5-97

====0.848o

	How intrinsic functions are handled in a way that's fully backwards-
	compatible with the old AActor::Process functions:

	Intrinsics are defined like:
	int AActorDerivedClass::FuncName
	(
		ULevel						*Level,
		FName						Message,
		PMessageParmsDerivedClass	*Parms 
	);

	For an intrinsic function, Message is redundent -- it's always set to the
	name of the intrinsic function.  For a ::Process function, Message is the name
	of the message to be processed and you can do a switch() on it.

+	Defined execution runtime classes.
+	Added script exec info to actor class.
+	FExecStackMain PostLoad init vfcache.
+	FExecStackMain InitForExecution.

+	Initial level load:
+		Do InitForExecution for all, then BeginExecution.
+		Later level loads must skip this.

+	AScript::Process.
+		Look up function and succeed or fail.
+		Human PlayerTick test.
+		FStackNode needs ParmsSize.
+		Code executor.

+	Implement commands.
+		Return.
+		Nop.
+		Local goto.

// PlayerTick.
engine function PlayerTick( float DeltaTime )
{
	eval 123;
	eval 12345;
	eval 0;
	eval 1;
	eval vector(1,2,3);
	eval rotation(1,2,3);
	eval 3.14;
	eval name(TimmyTimTim);
	eval texture(Default);
	eval NoActor;
	eval Level;
}

// PlayerTick.
engine function PlayerTick( float DeltaTime )
{
	eval "Test";
	eval vector(string(vect(1.5,2.5,3.5)));
	eval rotation(string(rotation(3,4,5)));
}
#decompile

+	Implement expression evaluation.
+		Integer consts.
+		All remaining consts.
+		String consts.
+		Bool consts.

+	Implement type conversions.
+		Int to other types.
+		Byte to other types.
+		Real to other types.
+		Bool to other types.
+		Actor.
+		Resource.
+		Name.
+		Vector to other types.
+		Rotation to other types.
+		String.
+		Check twowayness of all string conversions: int, byte, bool, vector, rotation.

///////////////////////////////////////////////////////////////////////////////

class TestDescriptor expands ZoneDescriptor;

// PlayerTick.
engine function PlayerTick( float DeltaTime )
{
	eval 123;
	eval LevelDescriptor(Zone); // ok
	eval TestDescriptor(Zone);  // not ok
}
#decompile

====0.848p
+	Variables.
+		Globals.
+		Locals.
+			Set locals bin when recurse / unrecurse into function.
+			Copy initialized locals data.
+		Statics.
+		Arrays with bounds checking.
+		Boolean vars.
+		Context variables (Level).
+	String initializers don't work: var string[64] GS="String";
+	Actor cast.

///////////////////////////////////////////////////////////////////////////////

// PlayerTick.
var out int a;
engine function PlayerTick( float DeltaTime )
{
	eval callparent.sin(1.0);
	eval callglobal.sin(1.0);
	eval callclass(Pawn).sin(1.0);
}
#decompile

====0.848q
+	Basics.
+		CallParent.
+		Decompile dims properly.
+		Translate return value into let + return for generality.

+	Engine to script calls.
+		Simple calls work.
+		Return value use outparm.

///////////////////////////////////////////////////////////////////////////////
3-6-97

function bool q(int a, out int b) {}

// PlayerTick.
engine function float PlayerTick( float DeltaTime )
{
	local int a;
	local byte b;
	local vector v;

	eval 123;
	eval Byte(123);
	eval Int("132");
	eval q(b,b);

	eval v;
	eval v.x;

	for( a=0; True; 123 )
	{
	}

	switch( "123" )
	{
		case "Boo!":
		case "Hello!":
		default:
	}

	let drawtype=dt_none;
	let Zone.Title="MyZone";
	let location=vect(1,2,3);

	return 1.0;
}
#decompile

#decompile
	
====0.848r
+	For.
+	Let.
+	Return type.
+	eval size not type.
+	Eval.
+	Switch size not type.

+	Eval func ret vals.
+	Conversions must set ElementSize.
+	Autoconversions must set ElementSize.
+	Constants must set ElementSize.

function string[40] st(string[10] a, string[20] b)
{
	let a=b;
	let b=a;
	let a="tim";
	let a="this const string is way too long!";
	return a;
}

function f()
{
	local string[20] a;
	local string[30] b;
	
	eval a;
	eval b;
	eval st(a,b);

	switch(a)
	{
		case a:
		case b:
		case st(a,b):
		case "test":
	}
}
#decompile

+	Changed "var editable(cat)" syntax to "var(cat)" for brevity.

+	Pondering:
+		How to handle variable assignments?
+			Use SC_Let, not an assignment operator.
+			Need to prepend length (in bytes) in SC_Let, but not type!
+			Let doesn't need type.
+			Conclusion: Assignment must be primitive, otherwise it's infinitely recursive.
		How to handle OutParms?
			Regular OutParms.
				Copy after call.
			Array OutParms.
				Copy after call.
			String OutParms.
				Copy after call.
			Bool OutParms.
				Copy after call, with masking.
		How to handle return values?
			When called in an assignment situation.
			When called in a useage situation.
			When called without wanting return values.

+	Strings.
+		EX_TruncString only needs dest size.
+		ResizeString -> EX_TruncString only.
+		Must set const string ElementSize so that truncing occurs when needed.
+		Autotrunc const strings.
+		Don't allow string[256];
+		String return values.

// PlayerTick.
engine function float PlayerTick( float DeltaTime )
{
	local bool a=false, b=true, c=true, d=true, e=false;

	let c=false;

	eval "Dump:";
	eval a;
	eval b;
	eval c;
	eval d;
	eval e;
}
#decompile

// PlayerTick.
engine function float PlayerTick( float DeltaTime )
{
	local byte a=1, b=2, c=3, d=4;

	let a=10;
	let b=20;
	let c=30;
	let d=40;

	eval "Dump:";
	eval a;
	eval b;
	eval c;
	eval d;
	eval e;
}
#decompile

====0.848s
+	Integrated Ammon's BMP import code.
+	Eval needs type tagging.
+	Assignments.
+		Assert func parm size != 0.
+		Implement SC_Let.
+		Let class enforce hierarchy.
+		Let string seems not to work.
+		Let arrays should work.
+		EmitLet.
+		Let bool work safely.
+			Let, LetBool.
+		Properly compile bool return.
+		Prohibit bool arrays.
+			Let1, Let4, LetString.

engine function float PlayerTick( float DeltaTime )
{
	local   int a;
	local 	int b=1;
//	local   int r={1};
	local 	int c[3];
//	local   int w[4]=1;
	local 	int e[3]={1};
	local 	int f[3]={1,2,3};
	local 	int g[3]={1,2,3,4};//err

	eval f[0];
	eval f[1];
	eval f[2];
}
#decompile

====0.848t
+	Array initializers (may be partial, but may not overflow).
+		InitPropertyData.
X		Decompile initializers -> don't need it.
X		Decompile semis -> don't care.

///////////////////////////////////////////////////////////////////////////////

final function f( int a=10, int b=20, int c=30 )
{
	eval a;
	eval b;
	eval c;
}

// PlayerTick.
engine function float PlayerTick( float DeltaTime )
{
	eval "begin";
	eval f(1);
	eval "end";
}

+	New OutParms code.
+		Make sure casts and actor casts can't be used as outparms.
+		Make sure OutParms can't violate class hierarchy.

X		Can direct-map return values, rather than double copying?
+		Final functions now use stack node links.

+		Script to script function calling.

///////////////////////////////////////////////////////////////////////////////

+	New ExecuteExpression approach.
+	AddParentProperties should not add per function properties!
+	PerFunction booleans are forced to be unpacked, simplifying function call logic.
+	Eliminated EX_Nothing.
+	Default properties work.
+	No boolean outparms (boolean return values are allowed, though).
+	Variables passed to functions aren't right.
+	Copyback outparms test.

///////////////////////////////////////////////////////////////////////////////

final function vector f( int a=10, int b=20, int c=30 )
{
	return vect(1,2,3);
}

final function float xtest(float a)
{
	return pi;
}

// PlayerTick.
engine function float PlayerTick( float DeltaTime )
{
	eval f(1);
	eval xtest(1.2);
}
#decompile

====0.848u
+	Full copyback outparms.
+	Handle return values.

///////////////////////////////////////////////////////////////////////////////
3-8-97

+	Process functions:
+		GLevel or Actor->Level.
X		No return val; must explicitly default to call parent -> return int.
+		MAX_INTRINSICS
+		REGISTER_INTRINSIC(Num,FuncName);

+	Copyroot.

+	Script to engine calls (intrinsics).
+		Patch stack node with precomputed intrinsic function pointers.

// PlayerTick.
engine function PlayerTick( float DeltaTime )
{
	eval "Test:"
	eval True || False;
	eval True && False;
}
#decompile

====0.848v
+	Prepend sizes to func parms. Solves:
+		Copying back outparms and return values.
+		End tagging (zero).
+		Avoiding property traversal.
+	Retest operators.
+	Fix unary prefix operators.
+	Interscript function calls must not perform property traversal.
+	Handle engine to script return values and outparms.

+	Prepend 255 to outparms.
+	Append return offset!

====0.848w
+	Use CodeLabelOffset for return value offset.
	Intrinsic finals aren't allowed to have default values?
	Stuff parms for intrinsic calls.
	Update OutParms for intrinsic calls.

	Force intrinsic existance on compile.
	!!

+	Basic intrinsic rtl.
+		Boolean operators - && || ^^
+		Bytes ops.
+		Int ops.
+		Float ops.
+		Float funcs.
+		Vector ops.
+		Rotation ops.
+		Need bool compare ops.
+		String ops.
+	Verify intrinsic presence.
+	Rebuild root.

///////////////////////////////////////////////////////////////////////////////

====0.848x
X	ExecuteExpression cleanup.
X		Separate result (dest of copy) and var ptr -> don't always know size for copy.
	
+	Intrinsic finals:
X		Option 1.
X			No default parms.
X			Prepend total parm size = word.
X			Append return ofs = word.
X		Option 2.
X			Can have default parms.
X			Prepend class and stack node.
+		Option 3.
+			No default parms.
+			Store total parm size and return offset in intrinsics table.

+	New intrinsics registry.
+	FStackNode point to GIntrinsic -> no need.
+	New intrinsic calling.

+	Verify boolean equals.
+	Implement assert.

+	Functionality.
+		Jumps.
+		Conditional jumps.

+	Add:
+		Float approximately equal to operator ~=
+		Min(i,f)
+		Max(i,f)
+		Clamp(i,f)
+		Lerp(a,b,alpha)
+		Smerp(a,b,alpha) 
+		vrand() - random vector
+		Dist.

+	Build UnrealScript test suite.
+		Boolean ops.
+		Byte ops.
+		Int ops.
+		For.
+		Break.
+		Do/While - Until.
+		Conversions.
+		Float ops.
+		The newly added functions.
+		Vector ops.
+		Rotation funcs.

///////////////////////////////////////////////////////////////////////////////

====0.848y
+	Jump table based execution.
+	Optimize FExecStack: include actor pointer to reduce parm passing.
+	FExecStack ctor.

====0.848z
+	If a class doesn't process a message, it is now responsible for calling
+		its own parent, therefore all process functions have have no return value.
+	Special reverse-call messages like Spawn must be coded explicitly.
+	new class syntax: class name intrinsic(intrinsicprocess)
+	Intrinsic #0 = AScript::Process!
+	Switch to RegisterIntrinsic system for existing actor ::Process functions.

+	This is a very cool improvement -- it generalizes the relationship between
+	intrinsic and scripted classes, and it simplifies the code quite a lot.

+	If full rebuild, critical error on script throwf errors.
+	New #call directive for execing macros during rebuilds.
+	GEditor->Bootstrapping.
+	Eliminated Models.mac.
+	New #exec directive for executing command lines.

currently unused models:
#call ..\Models\DrkAngel.mac // Mesh "DarkAngel"
#call ..\Models\Sconce.mac   // Mesh "Sconce"
#call ..\Models\Branch.mac   // Mesh "Branch"
#call ..\Models\Firehand.mac // Mesh "Fireball"
#call ..\Models\Shark.mac    // Mesh "Shark"
#call ..\Models\Blob.mac     // Mesh "Blob"
#call ..\Models\Tentspik.mac // Mesh "TentacleSpike"

; Pawn sounds:
Audio Import File="..\Sounds\Pawns\BIGMAN1.ufx"  Name="BIGMAN1"  Family="Pawns"
Audio Import File="..\Sounds\Pawns\BIGMAN2.ufx"  Name="BIGMAN2"  Family="Pawns"
Audio Import File="..\Sounds\Pawns\BIGMAN3.ufx"  Name="BIGMAN3"  Family="Pawns"
Audio Import File="..\Sounds\Pawns\BIGMANH.ufx"  Name="BIGMANH"  Family="Pawns"
Audio Import File="..\Sounds\Pawns\BIGMANH2.ufx" Name="BIGMANH2" Family="Pawns"
Audio Import File="..\Sounds\Pawns\FGRUNT2.ufx"  Name="FGRUNT2"  Family="Pawns"
Audio Import File="..\Sounds\Pawns\FGRUNT3.ufx"  Name="FGRUNT3"  Family="Pawns"
Audio Import File="..\Sounds\Pawns\FSCRM1.ufx"   Name="FSCRM1"   Family="Pawns"
Audio Import File="..\Sounds\Pawns\FYELL1.ufx"   Name="FYELL1"   Family="Pawns"
Audio Import File="..\Sounds\Pawns\GROWL.ufx"    Name="GROWL"    Family="Pawns"
Audio Import File="..\Sounds\Pawns\MANTA2.ufx"   Name="MANTA2"   Family="Pawns"
Audio Import File="..\Sounds\Pawns\WHOOSH.ufx"   Name="WHOOSH"   Family="Pawns"
; Weapon sounds:
Audio Import File="..\Sounds\Weapons\AUTOMAG.ufx" Name="AUTOMAG" Family="Weapons"
Audio Import File="..\Sounds\Weapons\NAILGUN.ufx" Name="NAILGUN" Family="Weapons"
Audio Import File="..\Sounds\Weapons\NEWQUAD.ufx" Name="NEWQUAD" Family="Weapons"
Audio Import File="..\Sounds\Weapons\QUADRLN.ufx" Name="QUADRLN" Family="Weapons"

; Status bar Textures:
Texture Import File="..\Textures\StatBar\shell.pcx"     Name="StatShel" Family="!StatusBar" MIPS=off FLAGS=2
Texture Import File="..\Textures\StatBar\clip.pcx"      Name="StatClip" Family="!StatusBar" MIPS=off FLAGS=2
Texture Import File="..\Textures\StatBar\tarydium.pcx"  Name="StatTary" Family="!StatusBar" MIPS=off FLAGS=2
; Wall hit Textures:
Texture Import File="..\Textures\WallHits\bllt0001.pcx"  Name="bllt0001" Family="!WallHits" MIPS=off FLAGS=2
Texture Import File="..\Textures\WallHits\bllt0002.pcx"  Name="bllt0002" Family="!WallHits" MIPS=off FLAGS=2
Texture Import File="..\Textures\WallHits\bllt0003.pcx"  Name="bllt0003" Family="!WallHits" MIPS=off FLAGS=2
Texture Import File="..\Textures\WallHits\bllt0004.pcx"  Name="bllt0004" Family="!WallHits" MIPS=off FLAGS=2
Texture Import File="..\Textures\WallHits\bllt0005.pcx"  Name="bllt0005" Family="!WallHits" MIPS=off FLAGS=2
Texture Import File="..\Textures\WallHits\bllt0006.pcx"  Name="bllt0006" Family="!WallHits" MIPS=off FLAGS=2
Texture Import File="..\Textures\WallHits\bllt0007.pcx"  Name="bllt0007" Family="!WallHits" MIPS=off FLAGS=2
Texture Import File="..\Textures\WallHits\bllt0008.pcx"  Name="bllt0008" Family="!WallHits" MIPS=off FLAGS=2
; Pawn hit Textures:
Texture Import File="..\Textures\PawnHits\blud0001.pcx"  Name="blud0001" Family="!PawnHits" MIPS=off FLAGS=2
Texture Import File="..\Textures\PawnHits\blud0002.pcx"  Name="blud0002" Family="!PawnHits" MIPS=off FLAGS=2
Texture Import File="..\Textures\PawnHits\blud0003.pcx"  Name="blud0003" Family="!PawnHits" MIPS=off FLAGS=2
Texture Import File="..\Textures\PawnHits\blud0004.pcx"  Name="blud0004" Family="!PawnHits" MIPS=off FLAGS=2
Texture Import File="..\Textures\PawnHits\blud0005.pcx"  Name="blud0005" Family="!PawnHits" MIPS=off FLAGS=2
Texture Import File="..\Textures\PawnHits\blud0006.pcx"  Name="blud0006" Family="!PawnHits" MIPS=off FLAGS=2
Texture Import File="..\Textures\PawnHits\blud0007.pcx"  Name="blud0007" Family="!PawnHits" MIPS=off FLAGS=2
Texture Import File="..\Textures\PawnHits\blud0008.pcx"  Name="blud0008" Family="!PawnHits" MIPS=off FLAGS=2
Texture Import File="..\Textures\PawnHits\blud0009.pcx"  Name="blud0009" Family="!PawnHits" MIPS=off FLAGS=2
; Explosion Textures:
Texture Import File="..\Textures\Explode\ex0.pcx"  Name="ex0" Family="!Explosions" MIPS=off FLAGS=2
Texture Import File="..\Textures\Explode\ex1.pcx"  Name="ex1" Family="!Explosions" MIPS=off FLAGS=2
Texture Import File="..\Textures\Explode\ex2.pcx"  Name="ex2" Family="!Explosions" MIPS=off FLAGS=2
Texture Import File="..\Textures\Explode\ex3.pcx"  Name="ex3" Family="!Explosions" MIPS=off FLAGS=2
Texture Import File="..\Textures\Explode\ex4.pcx"  Name="ex4" Family="!Explosions" MIPS=off FLAGS=2
Texture Import File="..\Textures\Explode\ex5.pcx"  Name="ex5" Family="!Explosions" MIPS=off FLAGS=2
Texture Import File="..\Textures\Explode\ex6.pcx"  Name="ex6" Family="!Explosions" MIPS=off FLAGS=2
Texture Import File="..\Textures\Explode\ex7.pcx"  Name="ex7" Family="!Explosions" MIPS=off FLAGS=2
Texture Import File="..\Textures\Explode\exp1.pcx"  Name="exp1" Family="!Explosions" MIPS=off FLAGS=2
Texture Import File="..\Textures\Explode\exp2.pcx"  Name="exp2" Family="!Explosions" MIPS=off FLAGS=2
Texture Import File="..\Textures\Explode\exp3.pcx"  Name="exp3" Family="!Explosions" MIPS=off FLAGS=2
Texture Import File="..\Textures\Explode\exp4.pcx"  Name="exp4" Family="!Explosions" MIPS=off FLAGS=2
Texture Import File="..\Textures\Explode\exp5.pcx"  Name="exp5" Family="!Explosions" MIPS=off FLAGS=2
Texture Import File="..\Textures\Explode\exp6.pcx"  Name="exp6" Family="!Explosions" MIPS=off FLAGS=2
Texture Import File="..\Textures\Explode\exp7.pcx"  Name="exp7" Family="!Explosions" MIPS=off FLAGS=2
Texture Import File="..\Textures\Explode\exp8.pcx"  Name="exp8" Family="!Explosions" MIPS=off FLAGS=2
Texture Import File="..\Textures\Explode\expl0000.pcx"  Name="expl0000" Family="!Explosions" MIPS=off FLAGS=2
Texture Import File="..\Textures\Explode\expl0001.pcx"  Name="expl0001" Family="!Explosions" MIPS=off FLAGS=2
Texture Import File="..\Textures\Explode\expl0002.pcx"  Name="expl0002" Family="!Explosions" MIPS=off FLAGS=2
Texture Import File="..\Textures\Explode\expl0003.pcx"  Name="expl0003" Family="!Explosions" MIPS=off FLAGS=2
Texture Import File="..\Textures\Explode\expl0004.pcx"  Name="expl0004" Family="!Explosions" MIPS=off FLAGS=2
Texture Import File="..\Textures\Explode\expl0005.pcx"  Name="expl0005" Family="!Explosions" MIPS=off FLAGS=2
Texture Import File="..\Textures\Explode\expl0006.pcx"  Name="expl0006" Family="!Explosions" MIPS=off FLAGS=2
Texture Import File="..\Textures\Explode\expl0007.pcx"  Name="expl0007" Family="!Explosions" MIPS=off FLAGS=2
Texture Import File="..\Textures\Explode\expl0008.pcx"  Name="expl0008" Family="!Explosions" MIPS=off FLAGS=2
Texture Import File="..\Textures\Explode\expl0009.pcx"  Name="expl0009" Family="!Explosions" MIPS=off FLAGS=2
; Miscellaneous Textures:
Texture Import File="..\Textures\Misc\frbl0000.pcx"  Name="frbl0000" Family="!FireBall" MIPS=off FLAGS=2
Texture Import File="..\Textures\Misc\frbl0001.pcx"  Name="frbl0001" Family="!FireBall" MIPS=off FLAGS=2
Texture Import File="..\Textures\Misc\frbl0002.pcx"  Name="frbl0002" Family="!FireBall" MIPS=off FLAGS=2
Texture Import File="..\Textures\Misc\frbl0003.pcx"  Name="frbl0003" Family="!FireBall" MIPS=off FLAGS=2
Texture Import File="..\Textures\Misc\frbl0004.pcx"  Name="frbl0004" Family="!FireBall" MIPS=off FLAGS=2
Texture Import File="..\Textures\Misc\frbl0005.pcx"  Name="frbl0005" Family="!FireBall" MIPS=off FLAGS=2
Texture Import File="..\Textures\Misc\frbl0006.pcx"  Name="frbl0006" Family="!FireBall" MIPS=off FLAGS=2
Texture Import File="..\Textures\Misc\frbl0007.pcx"  Name="frbl0007" Family="!FireBall" MIPS=off FLAGS=2
Texture Import File="..\Textures\Misc\frbl0008.pcx"  Name="frbl0008" Family="!FireBall" MIPS=off FLAGS=2
Texture Import File="..\Textures\Misc\frbl0009.pcx"  Name="frbl0009" Family="!FireBall" MIPS=off FLAGS=2
Texture Import File="..\Textures\Misc\frbl0010.pcx"  Name="frbl0010" Family="!FireBall" MIPS=off FLAGS=2
Texture Import File="..\Textures\Misc\frbl0011.pcx"  Name="frbl0011" Family="!FireBall" MIPS=off FLAGS=2
Texture Import File="..\Textures\Misc\frbl0012.pcx"  Name="frbl0012" Family="!FireBall" MIPS=off FLAGS=2
Texture Import File="..\Textures\Misc\frbl0013.pcx"  Name="frbl0013" Family="!FireBall" MIPS=off FLAGS=2
Texture Import File="..\Textures\Misc\frbl0014.pcx"  Name="frbl0014" Family="!FireBall" MIPS=off FLAGS=2
Texture Import File="..\Textures\Misc\frbl0015.pcx"  Name="frbl0015" Family="!FireBall" MIPS=off FLAGS=2
Texture Import File="..\Textures\Misc\frbl0016.pcx"  Name="frbl0016" Family="!FireBall" MIPS=off FLAGS=2
Texture Import File="..\Textures\Misc\frbl0017.pcx"  Name="frbl0017" Family="!FireBall" MIPS=off FLAGS=2
Texture Import File="..\Textures\Misc\frbl0018.pcx"  Name="frbl0018" Family="!FireBall" MIPS=off FLAGS=2
Texture Import File="..\Textures\Misc\frbl0019.pcx"  Name="frbl0019" Family="!FireBall" MIPS=off FLAGS=2
;
Texture Import File="..\Textures\Misc\flsh0001.pcx"  Name="flsh0001" Family="!MuzzleFlashes" MIPS=off FLAGS=2
Texture Import File="..\Textures\Misc\flsh0002.pcx"  Name="flsh0002" Family="!MuzzleFlashes" MIPS=off FLAGS=2
Texture Import File="..\Textures\Misc\flsh0003.pcx"  Name="flsh0003" Family="!MuzzleFlashes" MIPS=off FLAGS=2
Texture Import File="..\Textures\Misc\flsh0004.pcx"  Name="flsh0004" Family="!MuzzleFlashes" MIPS=off FLAGS=2
Texture Import File="..\Textures\Misc\flsh0005.pcx"  Name="flsh0005" Family="!MuzzleFlashes" MIPS=off FLAGS=2
; Backdrop Texture:
Texture Import File="..\Textures\Backdrop\BlueSky.pcx"  Name="BlueSky" Family="Backdrops"

///////////////////////////////////////////////////////////////////////////////
3-9-97

====0.849a
+	Incode function calls.
+	Include preoperators.
+	Incode variable assignments, ==, ++, and +=
+		Any postoperator or binary operator with first outparm.
+	Clean, quiet validation execing.
+	Good error message when reffing undefed var.
X	Good error message when using assignment in expr.

///////////////////////////////////////////////////////////////////////////////

function f()
{
	me.f();
	parent.f();
	parent.zone.f();
}

+	Retest for assignment expr.
+	Improved compiler context handling.
+	Separate LevelResource and Level.
+	Handle "Level" context, actor cast context, actor returned from function context.
+	RequireSizeOfParm work with context, backout.
+	Check returntypeless context function calls.
+	Check return type checking.
X	Handle trivial constant context, like vect(1,2,3).x? Requires EX_AddOffset + byte?

X	Properly scoped static variables in functions and states?

function int f()
{
	eval level.zone;
	eval level.time;
	eval sizeof(123);
	eval sizeof(level);
	eval sizeof(level.location);
	eval sizeof(f());
	f();
	drawtype=f(); //err
	if( drawtype == f() ) // ok
	 ;
}
#decompile

///////////////////////////////////////////////////////////////////////////////
====0.849b
+	Merge sc's and ex's.
+	Fully decouple ExecuteExpression.
+	Jump table for expression tokens 0-255.
+	Merge code tokens with expression tokens.
+	Make exec code into one big expression evaluator.
+	Eliminate old SC_QuietEval, etc.

+	10M instructions, 5 sec = 2.0 mips = Twice as fast as the Apple ][+. :)
+	Redesigned intrinsic handling system.

+	Script loop optimizations.
+		Use code function pointer table.
+		Use expression function pointer table.
+		Inline the expression execution code.
+		Quiet eval parms needed?
X		Decompile binary dump and analyze it.

+	Give actors a level variable for optimization?

///////////////////////////////////////////////////////////////////////////////

function TestMips()
{
	local int i, j;
	for( i=0; i<3333333; i++ )
		j++;
	eval Level.Seconds;
}

====0.849c
+	GExecuters.
+		Rewrite all existing intrinsics.
+		New intrinsics registry.
+		Get everything working once again.

///////////////////////////////////////////////////////////////////////////////
3-10-97

====0.849d
+	Faster intrinsics.
X		Intrinsic finals: No prepend length.
+		New Executers registry.
+		Globalize intrinsic parm grabbing macros.
+		Register all intrinsics via macro.
+		Example code for registering an intrinsic.
+		Cleanup intrinsics code.
+		Actor - no level.
+		FExecStack - no level.
+		Process - yes level.

====0.849e
+	Graceful peractor overflow checking.
+	String ~= caps insensitive compare.
+	When an intrinsic wants to get a string, have it stack alloc temporary space for it.
+	Left, Right, Mid.
+	Caps
+	LetString perform automatic truncation?

====0.849f
+	Fix decompiler.
+	String concat.

====0.849g
+	Server script exec time GServer.ScriptExecTime.
+	Support resource semantics.
+	Actor, name, and resource operators.
+	Casting actors to integers.

+	Test suites.
+		bool vars
+		actor casts
+		string throughness conversions
+		all conversions
+		resources
+		goto

+	Need rotation ==, rotation !=

====0.849h
+	Better calling.
+		EX_BeginFunction.
+		EX_BeginFunction
+		EX_EndFunctionParms
+		Don't need EX_OutParm, don't need to prepend length.
+		Function calling via encoding parms in the function codestream.
X		Patch outparms in the return statement?
+		Retest the suites.
+		Allow default parms in intrinsics; must insert EX_Nothing there.

+	LevelDescriptor def prop cat.
+	Exec engine function calls.

///////////////////////////////////////////////////////////////////////////////
3-11-97

// Test short circuit logic.
final function bool TestShort( bool a, bool NeverCall )
{
	// If NeverCall, then we shouldn't be called due to short-circuiting.
	if( NeverCall )
		assert False;
	return a;
}

engine function PlayerTick( float DeltaTime )
{
	eval "Ok";

	// Test our function.
	assert TestShort(true,false)==true;
	assert TestShort(false,false)==false;

	// Test logic.
	assert (TestShort(false,false) && TestShort(true, false) ) == false;
	assert (TestShort(true,false)  || TestShort(false,false) ) == true;

	// Test short circuit logic.
	assert (TestShort(false,false) && TestShort(true, true) ) == false;
	assert (TestShort(true,false)  || TestShort(false,true) ) == true;
}
#decompile

====0.849i
+	Improved calling model.
+		Renamed ULevel::SendMessage to ULevel::Send because it conflicted with stupid Windows macro.
+		Inline ULevel::Send.
+		EX_Nothing for optional parms.
+		Cleaned up PTick, PPlayerTick.
+		AActor SlowAction property.
+		SNODE_SlowFunc: must be intrinsic w/ no outparms.
+		CPF_ShortParm allowed in intrinsics only.

+		EX_Skip + word relative offset.
+		P_GET_SKIP_OFFSET
+		&&, ||: Skip parm compiling, decompiling, loading, execing.
+		Functions returning booleans don't clamp to mask -> was locals 4-alignment problem.
+		Test recursion.

+		Mid: optional last parm.
+		Test optional parms in the suites, intrinsic and scripted.
+		Optimize engine calls to script functions.

///////////////////////////////////////////////////////////////////////////////

====0.849j
+	Select-case.
+	Select-case with strings (size=0).

====0.849k
+	Implement variable tick rate: one tick between rendering each camera.
+	Tasks need last absolute time.
+	Task tick routines need time deltas.
+	Base actor timers on seconds not moons or whatever stupid scale they're at now.
+	Level track delta time, clamp to reasonable max of 0.25 sec.
+	Clean up all timing variables.
+	Eliminated all use of Windows timers (except for Galaxy's of course).

//////////////////////////////////////////////////////////////////////////////

====0.849m
+	Execution context handling.
+		EX_Context + word skip_offset + byte bSize + byte initmask.
+		Handle EnumType==EnumTag matching via hint token.
+		Just need relative branch pointer to end of context expression, and a return
+			value snub: result data size, initbyte (0 or 255).
+		Use null context: warning.
+		LOG_ScriptWarn, LOG_ScriptLog
+		Test: Pass enum tags to function.
+		Test: Resource to string, name to string.
X		bStatic assignments & outparms: warning -> adds too much inefficiency.

====0.849n
+	Logging and string messages.
+		Intrinsic Log, Warn, Error, Fatal.
X		CR = const string -> never need to deal with cr's in this environ.
+		Concatenation $ operator, which forces autoconversion to string.
+		Functions support coersion.
+		Operators support coersion.

+	Kill EX_Eval
+	Kill string + operator.
+	Don't allocate locals bin for declared functions.
+	Don't allocate locals for intrinsic functions.
+	Added CPF_UninitParms for nonserializable parms.

///////////////////////////////////////////////////////////////////////////////
3-12-97

====0.849o
+	No "Declare" - recognize from context.

+	Function definitions.
+		All probe function definitions.
+		All engine function definitions.
+		Tick and PlayerTick should be probes? Or eliminate tick paradigm altogether?

+	Cleanup UnMsgPar.h.

+	Function calling.
+		Make sure intrinsics >256 work!
+		Test C++ calling unimplemented engine functions.

====0.849p
+	Engine function calling.
X		Script calling unimplemented engine functions: prepend bSize, bInit?
+		Or, just emit dummy code for engine function (but no probe mask).

+	Unify and cleanup Script/C++ -> Script/C++ calling.
+	Initializers provide type hint to GetToken.

+	intrinsic(256) final slow function Sleep( float Seconds );
+		Enforce calling slow functions only when ALLOW_SlowCmd.

+	SlowAction needs to be an integer intrinsic index.
+	Verify compile-time intrinsic existance.

====0.849q
+	Implement:
+		IsA
+		ClassIsA

///////////////////////////////////////////////////////////////////////////////
3-13-97 c0ded00d

+	Added REND SET MIPMULT=##

====0.849r
+	Probes:
+		IsProbing
+		State Ignores
+		Class Ignores.

+	Implement:
+		Enable
+		Disable

+		IsState with labels.

+	Let override an engine function without specing engine.
+	States: Only require a Begin: label in root states.
+	Clean up error compiling IsState(Name(goodname),badname).

====0.849r
+	States and labels.
+		Separated SC_Stop and SC_EndCode.
+		Make initial goto-state work for editable State name.
+		Implement virtual goto.
+		IsLabel
+		Goto (virtual)
+		GotoState
+		Rebuild classes.

+	Virtual functions.
+		Proper state scoping of functions.
+		Proper state transitions - single state gate.
+		Exec virtual function calls.
+		Exec virtual intrinsic function calls.
+		Test calling undefined engine functions.
+		Merge EX_Nothing and EX_NOP into EX_Nothing.

====0.849s
+	Virtuals.
+		EX_SlowFunctionResult.
+		Proper virtual function cache - with a slow debug mode.
+		Ponder slow function return hooks -- just a slow mode and return value *variable* ptr.
X		Optional, final function BeginState, function EndState per state.
X			This is not generally useful; can custom program state setting gate functions
X			in UnrealScript code and get more versatility.
X		Virtual label cache? -> Not needed.

+	Exec code problems to beware of:
+		PROPBIN_PerFunction management.
+		Handle calling Engine functions that have been declared but not defined.
+		Size of a given actor is constant; locals can be allocated on GMem.
+		Note And/Or operators are *NOT* short circuited.
+		ActorCast.
X	    Handle intrinsics just like Process() calls.
+		How to match up virtual functions really fast at execution call time -> VfCache.
+	    Safe string handling.
+		When setting state, must update probe mask and flush VfCache.
X		Must check for destroyed actor in all recursion entries and exits.
+	    100% safe reentrant FExec'ing among multiple actors.

///////////////////////////////////////////////////////////////////////////////
3-14-97

====0.849t
+	Slow execution.
+	State execution.
+		Special function to perform slow execution on actors, called immediately
+			after Tick/PlayerTick.

+	States Inheret SNODE_AutoState.
+	Startup, if no state name specified, use auto state.
X	Compile slow action calls with return values.
X	Slow action return value hook EX_SlowExecReturnValue for things like
X		switch/let/if based on slow function return value (however, slow functions
X		must not be nested.
X	Slow actions can't return values, unless someone provides a compelling reason
X		why they should be able to. To simulate, use a global variable for the result.

auto state Test
{
Begin:
	log("Timtim 1!");
	sleep(10);
	log("TimTim2!");
	sleep(10);
	log("TimTim3!");
	goto Begin;
}

///////////////////////////////////////////////////////////////////////////////
====0.849u
+	Cleanup classes & engine.
+		Rename Descriptor to Info.
+		New anim properties.
+		Eliminate GServer.Ticks.
+		GServer.TimeSeconds
+		Add UClass::AllPropertyFlags.
		Standardize indenting in the source.

///////////////////////////////////////////////////////////////////////////////

====0.849v
+	UnrealEd
+		Fix mesh viewer.
+		Syntax highlighting.
+		Syn #preprocessor things.
+		Create class below initial text needs fixing.
+		No deceptive file/save.

///////////////////////////////////////////////////////////////////////////////
3-15-97

====0.849w
+	Fixed whopping bug in "Retract" command!

====0.849x
+	UnrealEd
X		Shift uparrow/downarrow scroll in ed.
+		Script find: need goto-line-number button with current line shown.
+		Maximizing script editor window, then resizing the main form, causes error.
X		Ctrl right on text like "|Bool; abc" fix.
X		Results window hotkey.
+		Initial dble click on class name should move focus to the script window.
+		Proper syntax highlight timing.

+	More UnrealEd
+		DisableRedraw to prevent ugly updates.
+		CR carry the indent properly.
+		Bad start RTF
+		Script editor copy/paste is broken.
+		Multiple Undo.
X		Click recognition dies after a while -> can't duplicate.
+		Window placement: Compiler results, rebuilder, actor properties (everything after reload).

+	Changed class types:
+		Intrinsic class: A class which is built into the engine; dependencies exist in the engine code.
+		Standard class: A class which is shipped with an official product; should not be user modified.
+		User class: A class which a user has created and is distributing.
+		Standard(package) semantics: Engine, Unreal.

====0.849y
+	UnrealEd continued
X		Click on actor prop field should highlight its textbox.
+		Actor property rebel slider bug.
+		Rt click on actor popup, if single class, needs 'script' option.
+		Text buffer length inconsistency.
+		Added unguardres macro, info dumping unguard for UResource-derived class.

====0.849z
+	UnrealEd fixes.

///////////////////////////////////////////////////////////////////////////////
3-16-97

====0.850a
+		UnrealEd now is MDI.
+		Fixed user-interface snag.
+		Don't change focus to results window?
+		Fix stupid focus shifting when recompiling.
X		Always scroll bottom line of results window into view.
+		'subclass' popup option.
X		NextError / previousError / compile keys should work the same in result
X			windows as camera windows -> Paradigm is one-error-at-a-time.

+		Un-MDI-ize the script editing options.
+		Play level option.
+		Ctrl-P play.
+		Horizontal sliders are too wide.
X		Color picker for Mark?

var vector Original;

function BeginPlay()
{
	// Remember original location.
	Original = Location;
}

auto state FunkyAnimate
{
Begin:
	Location.x = Original.x + 96.0*sin(3.0*Level.TimeSeconds);	
	Location.y = Original.y + 96.0*cos(3.0*Level.TimeSeconds);
	bLightChanged=true;
	sleep(10);
	goto Begin;
}

+	UnrealEd
+		Level validation phase:
+			Critical: PlayerStart exists and is outside.
+			Critical: BSP is valid.
+			Critical: Scripts are compiled and linked.
X		Validate level before play.
+		Autoindent scans backward too far when 1 char on line.

====0.850b
+	UnrealEd C++ code.
+		Text msgs should disappear after a few seconds in UnrealEd.
+		Resync WateryShimmer timing.
+		UnrealEd dynlight timing bugs.
+		Backdrop.
+		Dithering should be position invariant - seems to have pan effect.
+		Typing 'rend bilinear' in UnrealEd loses focus!
X		Save classes below saves all classes instead.
X		Save "just class X and classes below it" needs a way of not traversing other
X			classes for save-tagging. However, it needs to import all of those classes
X			rather than null them out.
X		Work on this with UnrealFiles.

//////////////////////////////////////////////////////////////////////////////
UnrealEd alpha (version 0.85a) notes.

Major UnrealEd components which aren't finished:
* Online help: will be expanded and rewritten for the beta version.
* Terrain editing: aiming for April/May.
* Only run UnrealEd.exe (the editor). This version of game, Unreal.exe, 
  has unfunctioning player controls.

Minor problems:
* Installation program is temporary and will be cleaned up.
* Dynamic lighting timing is inconsistent with the game.
* Player controls don't work from within the editor; this will be fixed.

//////////////////////////////////////////////////////////////////////////////
3-17-96

====0.850c
+	Compile const at beginning of line problem.
+	UnrealEd delete: no 't' identifier.
+	indent bug??
+	Play needs command line camera-parent-window parm.
+	Rebuild root.
+	Don't allow actor references as per-class variables, to avoid linking problems.
+	Fixed unlink-actor bug which illegally traversed locals.
+	Implement Broadcast.
+	Class context broadcast.

+	UnrealEd needs restore-focus-window.
+	Rebuild classes.

//////////////////////////////////////////////////////////////////////////////
Tim audio merge notes:
+	Major changes to the semantics of resource class definitions, implementations.
+	Note that a "Serialize" function is now used for loading/saving.
+	There is no longer any need to pad the structures, since Serialize lets you load
    and save files with compatibility checking.
+	guard()/unguard changes.
+	Eliminated unnecessary resource functions QueryMinSize, InitData, etc.
+	Filled in the ???'s.
+	Eliminated SpecifySong(int).
	Renamed "family" to "set".

Notes:
+	Renamed SoundEng.lib to UnSound.lib, UfxEdit.lib to UnUfxEd.lib for consistency.
+	Making the sound playing code in UnrealEd a separate .exe was a good idea, since it
+	prevents UnrealEd from hogging the sound card.

Issues:
+	Hmm... Now I get a GPF on exit in the MFC code.

UnrealEd audio:
+	Spiffed up the menus.
+	Double clicking on sound effect plays it.
+	Music dialogs default to music dir.
	Hold sounds in memory as with textures.

Requests for Ammon:

Needed soon
-----------
* Can you make the sound effect "Test" button take effect immediately, so the user doesn't have to press the "Play" button on the dialog?
* How about preventing multiple copies of the test program from running? If a second copy is run, it could set focus to the first, WM_COPYDATA it its command line, and exit.
* I'm hearing a pitch shift that's proportional to my distance from a sound source (even when I'm standing still). Could something be wrong with your doppler code?
* Sound effect volume scaling 1.0 seem to be too quiet. What's the maximum allowable volume (is it 1.0)? It would be nice if the maximum volume were 1.0 and it were a lot louder than it is now.
* When playing sounds from UnrealEd, the ufx's echo and reverb. Can you turn off those effects in the editor? They also need to be disabled when the ReverbDepth(?) property is set to zero.
* As I stand and rotate around in Unreal, the sounds stereo-pan smoothly for a while, then when I reach a certain angle, the sound positioning switches abruptly from all-left to all-right. Stereo panning always needs to be smooth.

Needed later
------------
* Function to jump to a new track in the music, so we can do dynamic music.
* Can we get a new parameter for PlaySfxOrigined, PlaySfxPrimitive, and PlaySfxLocated which takes a frequency multiplier as a paramter, i.e. 1.0=normal speed, 2.0=twice the speed, 0.5=half speed?
* Need a volume parameter in PlaySfxPrimitive.

//////////////////////////////////////////////////////////////////////////////
3-18-97

====0.850d
+	Merged new sound code with engine.
+	Per-level music support.
+	Const ambient sound with AmbientSoundSet.
+	Make log window child of cmdline hwnd=

+	GT alpha ed 3/15.

//////////////////////////////////////////////////////////////////////////////
Unreal technology status

	* Definite, + Very likely, ? Maybe

	Epic teams:
	*	Epic/DE: Unreal
	+	Eclipse: The Circle
	+	Legend: Wheel of Time
	+	Digital Dimensions: Core
	?	Lion Entertainment: No immunity.
	?	?DMA?: Jazz II

	Spectrum/Microprose:
	*	Star Trek: Klingons
	*	Star Trek: Borg
	+	Unknown strategy game

	GTIS:
	*	Cyberlore: Emissary.
	?	Raven:
	?	A??: ??
	?	??: ??
	?	??: ??

	DMA:
	?	??

//////////////////////////////////////////////////////////////////////////////
3-19-97

// Light.
function f( satellite Other )
{
	rSuck();
	me.rSuck();
	other.rsuck();
	Other.Suck();
}
function rSuck()
{
}

// Satellite.
function Suck()
{
}

====0.850e
+	CLASS_Linked
+	UClass::Dependencies
+	Forward declaration of classes.
+		Class is either: Out of date, compiled, or linked.
+		Class dependency list with source code CRC's.
+		Proper f6 handling.
+		Decompile show dependencies.
+		Refuse to decompile *code* if unlinked.
+		Replace ScriptTextCRC, ParentTextCRC with natural dependencies.
+		UnrealEd when hit compile buttons, must save all scripts.
+		Before any compile, hierarchically downgrade all dependency info.
+		Update Make code.

====0.850f
+	Tossed out defined but not declared functions -- no such thing anymore.
+	Don't require forward declarations of functions anymore.
+	Retest the suites.

+	Two-pass compilation.
+		CLASS_Parsed
+		CLASS_Finished
+		Update initial class importer to perform postmake.
+		Compile current class balk if parent is uncompiled.

+	Clean up compiler error messages.

====0.850g
X	Screwed up.

//////////////////////////////////////////////////////////////////////////////
3-20-97

====0.850h
+	Fixed

====0.850i
+	Two-pass compilation setup.

====0.850j
+	Cleaned up compiler.

====0.850k
+	Split up CompileDecl and CompileStatement.
+	Completely skip CompileStatement during first-pass.
+	Make sure generated code size is zero after first-pass.
+	No dependency on parent actor (hardcode this).
+	Prep for second pass selective recompile.

====0.850m
+	Scrutinize and minimize FNestInfo.

====0.850n
+	Store line #, text position per stack node in place of.
+	iCode = line, Extra = char

//////////////////////////////////////////////////////////////////////////////
3-21-97

engine function wiojfwef();

function f()
{
	log("Hi!");
}

function g()
{
	log("Hi!");
}

var int g;
function int fq()
{
	local int a;
	a=DrawType;
	return g;
}

state emptyst
{
Begin:
}

state mystate
{
	function mystate_f()
	{
		log("mystate_f");
	}
	function mystate_g()
	{
		log("mystate_g");
	}
Begin:
	Log("mystate_code");
}

state codelessst
{
	function codelessst_f()
	{
		log ("Tim!");
	}
Begin:
}

state st
{
Begin:
	log("Hello!");
}

====0.850o
+	Second pass iterate through stack nodes.
+	Second pass selective recompile without affecting nesting info.
+	Fix allow flags
+	Handle empty functions.
+	Handle empty states.

====0.850p
+	State scoped funcs.
+	Clean up TWO_PASS defines.
+	IsProbing with declared-but-not-defined engine functions is broken.
+	Retest the suites.
+	No forward declarations.
+	Rebuild root.
+	Fixed Root.h generation problems.

====0.850q
+	Error saving trigger script -> was broadcast compilation problem.
+	Compiled line count is wacked.
+	Added Move, Teleport intrinsics.
+	Actor location is const.
+	Passing variables as name consts doesn't work -- it's intercepted as a name.
+	Message() function.
+	Fully implemented counter.
+	Eliminated UnTrig.cpp.
+	Stick name and event together.
+	Eliminated UnThings.cpp.
+	DistanceTo, CanSee.

+	Variable tick rate.
+		Pass DeltaTime to ACTOR_Tick and ACTOR_PlayerTick.
+		Implement variable tick rate support.
+		Implement timer and ACTOR_Timer.

//////////////////////////////////////////////////////////////////////////////
3-22-97

====0.850r
+	Extended and fixed the dxf importer for inoxx.

+	Rewrite Root in UnrealScript.
+		SetParent/SetTarget.
+		GainedChild, LostChild, GainedTarget, LostTarget.
+		InternetSend
+		InternetReceive
+		vector >> rotation = forward transformation of vector by rotation -> cool!
+		vector << rotation = reverse transformation of vector by rotation.
+		Use PCalcView.
+		Quickie behind-view.

//////////////////////////////////////////////////////////////////////////////
3-23-97

====0.850s
+	UnrealScript intrinsics
+		Spawn compiler hardcoding to return proper class.
+		Trace must ignore this actor and its parents.
+		Trace.
+		Trace behind-view.
+		Trace ignore-actors option.
+		Give actors a GroupName, to handle grouping.
+		Rearranged root.

// Fire button.
engine function ServerFire( int I, name N, string[255] S )
{
	local TentacleProjectile Proj;
	Proj = spawn(class(TentacleProjectile));
	if( Proj != NoActor )
	{
		log("Fire succeeded!");
	}
	else log("Fire failed!");
}

function Spawned( actor Spawner )
{
	Log( Class $ " spawned by " $ Spawner.Class );
	Velocity = vector(Rotation) * 16.0;
	LifeSpan = 20.0;
}

function Tick( float DeltaTime )
{
	Move(Velocity);
	if( (LifeSpan -= DeltaTime) <= 0 )
		Destroy();
}

function f()
{
	log(Location);
	Location = vect(0,0,0);
	Location += vect(0,0,0);
}

====0.850u
+	Test ZoneDescriptor messaging.
+	Compile spawn.
+	Intrinsic Spawn func.
+	Spawn set rotation.
X	Balk at spawning bTemplateClasses -> runtime checked.
+	ULevel::SpawnActor needs rotation property, must be set before Spawned message sent.
+	Spawned message needs Spawner parm.
+	Intrinsic Destroy func.
+	Proper Destroyed messaging.
+	Don't allow passing const variables as outparms.
+	AInventory Use/UseExtra.
+	Ultra cleanup UnMsgPar.h.
+	Eliminate pawn InitInput.
+	Ultra cleanup UnMsgs.h.
+	Rearranged inventory relationships.
+	Fix redefinition-of-function error msg.

//////////////////////////////////////////////////////////////////////////////
3-24-97

====0.850v
+	Use bIsPlayer instead of Player!=NULL for decision making and bBlocksPlayers.
+	Fix actor-actor blocking.

+	Note that CLASS_Parsed and CLASS_Compiled are mutually exclusive, due to shared vars.
+		StackTree=NULL means unparsed, Script=NULL means uncompiled? A cleaner solution.

+	Save parsed but not compiled classes properly.	

//////////////////////////////////////////////////////////////////////////////

====0.851a
+	SP: FarMoveActor - no drop to floor func.
+	UnrealEd import .tcx fix.

function BeginPlay()
{
	CallParent.BeginPlay();
	SetTimer(1.0,true);
}

function Timer( int Count )
{
	Log("Timer: " $ Count);
}

// Fire button.
engine function ServerFire( int I, name N, string[255] S )
{
	local TentacleProjectile Proj;
	Proj = spawn(class(TentacleProjectile),NoName,Location,ViewRotation);
	if( Proj != NoActor )
	{
	}
}

+	Next.
+		Changed "slow" to "latent".
+		Optional variable tick rate (0=always, -1.0=never).
+		Timer.
+		SetTimer, SetTickRate.
+		Bug: Probe UnrealScript functions aren't called from AScript::Process when you're in a state.
+			Track ProbeMask, IgnoreMask.
+			Enable/Disable properly handle IgnoreMask.
X		"Ignores All" specifier.
+		Support bTimerLoop.

+	LatentInt
+	LatentFloat
+	LatentActor
+	LatentBool

====0.851c
+	Retest enum compiling and duplicate detection.
+	Latent "Sleep" command (sleep counter).
+	Fix klunky goto(Name(Begin)) syntax.
+	Anim wraparound boundary conditions.
+	Store frame rate per anim seq outside of sprite code.
+	bAnimFinished.
+	Make Actor class non-intrinsic.
+	bAnimLoop.
+	StopAnim.
+	All animation commands!

====0.851d
+	Broadcast res casting automatically.
+	No crash when try to play empty level.
+	Trigger PlayerProximity, AnyProximity (bIsPlayer).
+	Dispatcher.
+	Const LifeSpan auto update, Expired message

//////////////////////////////////////////////////////////////////////////////

====0.851e
+	Build Bsp node leaf hulls along with bounds, NF_SolidLeaf
+	Collision convolution...nah. Bsp manifold trace instead.

// Fire button.
engine function ServerFire( int I, name N, string[255] S )
{
	local vector HitLocation,HitNormal;
	if( Trace(Target,HitLocation,HitNormal,Location+100*Vector(ViewRotation))==TRACE_Surface )
		spawn(StingerProjectile,NoName,HitLocation,ViewRotation);
}

//////////////////////////////////////////////////////////////////////////////
3-30-97

====0.851f
+	Collision.
+	Pawn move up/down hack.

//////////////////////////////////////////////////////////////////////////////
4-1-97 4-2-97

> Cons are extremely poor frame rate even in 320x200

Fixed! 30 fps at 640x480 on a P-166 with a 3dfx!
Software rendering optimizations in the works.

> Sloppy player controls.

Fixed.

> Poor collision code.

Fixed.

> And the extreme speed-hit on the engine from the lighting effects.

4X faster, can squeeze another 2X with some heavy optimizations!

//////////////////////////////////////////////////////////////////////////////

+	Optimized collision
+	Renamed UnPhys.cpp to UnTrace.cpp.
+	Removed obsolete functions from UnTrace.cpp.
+	Editor player collision.

+	Optimized FMemoryCache::Create by 4X.
+	3dfx only reupload dynamic light meshes once per frame.

+	Optimized shadow filter convolver from 5.0 msec to 0.5 msec.
+	Spatial lighting code, 2.5X faster.
+	Power-of-two copy optmimized from 3.0 msec to 2.4 msec.
+	Merge IlluminationMapGen setup into spatial lighting functions.
+	Lighting code is trucking!

//////////////////////////////////////////////////////////////////////////////
4-3-97

+	3dfx code support.

//////////////////////////////////////////////////////////////////////////////
4-4-97

+	Fixed PF_NotSolid bug.
+	Fixed map rebuild bugs.
+	Improved geometry robustness by rebasing, but the long term strategy is to
+		move to double-precision, shared-vertex brushes for much better robustness.

+	Fixed undo toasting LevelState
+	POSTLOAD_File
+	POSTLOAD_Trans

====0.851h
+	Portal problem is due to coplanar facing flip?
+	Runtime regular/3dfx switch.
+	Optimized colored lighting code 500%.
+	Implemented detail texturing.

//////////////////////////////////////////////////////////////////////////////

+	3dfx gen minimal set of light map, huge speedup, 4X best case.
+	3dfx pulsing lights don't pulse. Scaling factor?
+	3dfx transparency.
+	Proper transparency depth sorting.
+	3dfx creatures.
+	RGB FTransTex.

//////////////////////////////////////////////////////////////////////////////
4-5-96

+	Classes: Dreaded changes.
+		Changed Parent to Owner, to avoid confusion with parent *class*.
+		Changed Me to Self for familiarity (all remnants of Visual Basic are now GONE).

+	Export enums as tags not numbers, import as either.
+	Fixed script decompiler.
+	UnrealScript only allow CallXX in self.

+	Global name improvements.
+		Use global names for resource names, for space/speed improvements.

====0.851h
+		FName(char*,NAME_Add);
+		FName(char*,NAME_Find);
+		No klunky FName.Find, FName.Add.

====0.851i
+		FNameEntry table array of pointers.
+		FNameEntry allocator.

====0.851j
+		Variable-sized FNameEntry.
+		FNameEntry: Variable length, contain hash next pointer?
+		No inline crc/hash.
+		UnrealScript CallXXX refuse with virtual functions.

====0.851k
+		Global name hash.
X		Eliminate global name table altogether? Rely solely on hash? -> Need for mapping indices to names.
X		Save 4 bytes in FName by keeping name-compatible flags in low word.

====0.851m
+		Replace AddHardcoded with real name registry, variable-length malloc'd names, hash.
+		Free individual names in gc, exit

====0.851n
+		Replace REGISTER_MESSAGE with REGISTER_NAME.
+		Eliminate FName::AddHardcoded.
+		All names now begin with NAME_ instead of ACTOR_.

+		InitResource.
+		PrivateLookup
+		InitResource

====0.851o
+	Compiler use hardcoded names instead of tons of stricmp's.
+	Rebuild root.
+	Integrated Erik's aa line code.
+	AA code to vss.
+	unguardexec, unguardexecSlow for displaying exec stack info upon crash.
+	FMemoryCache GetEx allow traversing multiple matches.
+	Retest the suites.

+	Eliminate unaligned reads in script exec.
+	Fix decompiler handling of class vars.

+	Cleaned up loading of unnecessary resources for client and server.

//////////////////////////////////////////////////////////////////////////////

Big plan:
	Animation sequences.
	Player view and collision sizing.
	Actor collision.

	Player controls.

	Inventory.

//////////////////////////////////////////////////////////////////////////////
4-7-97

====0.851p
+	AActorBase: GetHashLink.
X	AActorBase::SetCollideActors (use from UnScript).

+	Properly init and set all actor collision hashes in collisionInit.
+	SpawnActor/DestroyActor must do collision stuff.

//////////////////////////////////////////////////////////////////////////////
4-9-97

X	Properly cleanup hash links in tick.
+	Simply linked hash list with cached ColLocation.
X	UnrealScript BeginMove/EndMove/bBegunMove -> No!
+	DestroyActor perform UnTouch.

+	Recompile loses enums!

+	Fixed shadow map alignment problems - finally!

+	Myscha requests.
+		Set these values for the class Human:
+		CollisionRadius=22.0 -> Set to 18, looks better with new collision code.
+		CollisionHeight=55.0 -> Translates into 32.0 using new system.
+		BaseEyeHeight=17.9   -> Ok.

+	Make collision props constant, add SetCollision which can succeed or fail.

+	Optimizations:
X		Real line trace, not bbox trace.
X		32-aligned FActorLink pools to draw from quickly.
+		FActorLink pool management.
+		Work on global efficiency of actor and world collision.

//////////////////////////////////////////////////////////////////////////////
4-10-97

+	Collision.
+		Cyllinder collision time.
+	Checks is unreasonably high: fixed hashing.
+	Proper collision repulsion.
+	Actor-actor collision cyllinders, time-based.

====0.852a
+	UType.
+		FResourceTypeInfo -> UType ResTypes concurrently.
+		Resolve chicking and egg initialization problem.
+		Eliminate FResourceTypeInfo.
+		Update GetTypeName.
+		Find Type dependencies.

+	UType continued.
+		Mirror resource enums with hardcoded names.
+		FOR_ALL_TYPED_RES cleanup.
+		DECLARE_CLASS and DECLARE_DB_CLASS take type-name parm.

====0.852c
+	UType continued.
+		Cleanup FindResource.

====0.852d
+	Static type registry.
+		UResource::BaseType auto-register UType constructor and static instantiation.
+		UType InitHeader.
+		RF_NoFreeHeader
+		UType proper InitResource, InitHeader, then add in-place.
+		Move InitResource to UResource.
+		Support permanent resources.

====0.852e
+	UType implementation.
+		Update LookupType.
+		GetRESTYPE.
+		GetRES.

====0.852f
+		Update PrivateAlloc for types.
+		Update Find for types.
+		RF_HardcodedRes

====0.852g
+		FClassPropertyType use UType.
+		static GetBaseType, hide BaseType.
+		Renamed .tcx to .u

====0.852h
+	Types.
+		Replace UResource::ResType with UResource::Type.
+		Serialization hack using EResourceType.
X		Eliminate GetTypeName.
+		Eliminate LookupType.
+		Eliminate GetRESTYPE.

====0.852i
+		ResEnum
+		BaseXXX for all hidden/const stuff
+		Eliminate EResourceType
+		UnMsgs.h -> UnNames.h

//////////////////////////////////////////////////////////////////////////////
4-10-97

====0.852j
+	Types.
X		Smart pointers use klunky Microsoft pUResource notation instead of klunky x::Ptr? -> Can't.
X		FGlobalResourceManager::Types as unordered UArray<UType*>.
X		FGlobalResourceManager::ResList as a UEnum (not gc'd).
X		FGlobalResourceManager::Names as a UNameTable (not gc'd).

	AActors as UResources immediate implications:
		Transacton tracking system will need to track added/deleted AActor resources.
		Fast actor list code will need updating.
		All actors will need globally unique names.
		Import code needs to create unique names.
		Spawning an actor will have to create a new globally unique name.
		Net code will have to gracefully handle new names.

	Later implications:
		Can merge UType and UClass.

	Benefits:
		Variable unlimited size AActors.
		Unified actor and resource editing.
		Scriptable and script-accessible resources.
		Less memory usage.
		Simpler faster code since dealing with pointers rather than indices.

	Drawbacks:
		Introduces new resources at runtime.
		Unique name requirements messes up all events, again.
		Requires allocating memory during play.

====0.852k

+	Transition plan:
+		Replace UActors Element with function returning a pointer.

====0.852m
+	Transition.
+		Special logic to archive actor pointers in AActor's.
+		Root.h build logic use actor pointers instead of indices.
+		PActor
+		IsParentOf -> IsOwnerOf
+		UnSprite PreScan/PostScan.
+		PlayerExec

====0.852n
+	Cleanup.
+		AActorBase::SetOwner
+		LostTarget->LosingTarget
+		IsOwnerOf.

//////////////////////////////////////////////////////////////////////////////
4-12-97

+		P_GET_ACTOR now gets an AActor*, not an INDEX.
+		Actor constants in script...
+		Rebuild and retest the suites.
+			Note: Actor comparisons are broken since CPT_Actor's are not yet pointers.
+		FToken iActor?
+		FToken AttemptToConvertConstant.
+		FToken SetConstActor.

====0.852m
+	FToken GetConstActor.
+	Check iSelf==SelfIndex always.

+	How to deal with Level actor in default and static properties?
+		Don't allow level actor in default and static properties.
+		Level actor must be set at spawn time.

//////////////////////////////////////////////////////////////////////////////
4-13-97

====0.852o
+	Actor pointer transition.
+		FToken::InitPropertyData
+		New Root.h.
+		CPT_Actor.
+		UnMover.cpp.
+		UClass::SerializeBin
+		FArchive& operator<<( FArchive &Ar, AActor &Actor ) broken
+		NAME_Self, NAME_SelfIndex?
+		ULevel::UnlinkActor
+		(INDEX*) (INDEX *)
+		Get steady state working again with actor pointers.
+		Check all SelfIndex refs.

====0.852p
+	PActor change.
+	MakeUniqueName generalize.
+	UnrealEd load/reload fix.
+	Load/save.

====0.852q
+	Import map with actor pointers.
+	Over-import map with actor pointers.
+		UActorsX::Import fix remapping
+		ImportActorProperty needs actor list address
+		UActors::Import screwed.
+		ExportU.

====0.852r
+	Reimport classes with actor pointers.

====0.852s
+	Transition.
+		Script bFill is no longer needed?
+		Detect empty actors if Element(i)==NULL, not if Element(i)->Class==NULL.
+		FirstActive
+		Retest the suites.

====0.852t
+	Cleanup.
+		Make NextID,HashID into plain old actor pointers!

====0.853a
+	Cleanup.
+		RelistAll always RemoveFromList.

//////////////////////////////////////////////////////////////////////////////
4-14-97

+	UType, UClass unification.
+		Merge UType, UClass.
+		Renamed ACamera to AView to avoid conflict with UCamera.
+		Dynamically created UType's and loadable/saveable UType's.
+		FClassProperty.
+		UResourceBase.
+		GetType, GetTypeName, BaseType
+		ClassFlags.

====0.853b
+		GetClassFlags()
+		Actually create abstract UTypes: UResource, UDatabase (bTemplateClass style mechanism).
+		All name stuff before all resource stuff.

====0.853c
+		No array of classes.
+		UResource -> UObject.
+		Eliminate NextID/PrevID thing.
+		FGlobalObjectManager
+		NAME_Resource -> NAME_Object.
+		Retest the suites.

====0.853d
+		Update.
+			Resource -> Object
+			GRes -> GObj
+		Whew!
+		Get rid of optimization lists; not needed for cache reasons anymore.

//////////////////////////////////////////////////////////////////////////////
4-15-97

====0.853e
+		Properly set resource class parent classes for everything except UObject, AActor.
+		UClass::IsKindOf work equally with actor classes and resource classes.
+		Properly set AActor base class to UResource.
+			Fix class rebuild.
+			AddParentProperties.
+			Clean up UClass constructors.
+			AllocBins.
+			Need to prevent actor spawn from touching the first sizeof(UResource) bytes.

+		Implicit Self in actors rather than explicitly stored.
+		EX_Self
+		Retest the suites

====0.853f
+	Pre unification.
+		Merge XClass and objClass into Class.
+		Spawn set class.

====0.853g
+	Move actor Private stuff to top of actor.

====0.853h
+	Move FExecStackMain into UObject.
+	Important: Changed structure member alignment to 4 bytes!

//////////////////////////////////////////////////////////////////////////////
4-17-97

====0.853i
+	FExecStackMain generalization to all UObjects.
+		AActorBase::SetBinPointers.
+		AActorBase::PostLoad.
+		Serialize it.

+	Merge AActor name and UResource name, spawn don't guarantee name matching.
+		This screws up all of that Event / Name stuff! Make old Name into Tag.

====0.853j
+	The big plunge.
+		UActors -> derived from UArray.
+		Actor list as sparse, ordered array (actor indices are still valid).
+		Make unique *resource* names for spawned actors.
+		Ditch the funny AxxxBase setup.
+		IsA is now a method of UObject rather than AActor.

//////////////////////////////////////////////////////////////////////////////
4-18-97

====0.853k
+		UFont::Cout fix use palette.
+		PROPBIN_PerActor -> PROPBIN_PerObject
+		UnrealEd DestroyActor crashes because vtable=null.
+		UnrealEd import and rebuild level.

X		InitHeader of an actor should perform copying of defaults.
+		Camera reconciliation.

====0.853m
+		NoteActorMovement bombs.
+		Initial rebuild hoses brush.

//////////////////////////////////////////////////////////////////////////////

====0.853n

+		Creating/loading new actors must must set resource class info (ResHeaderSize) as well.
+		Smart load context flags for resource type names
+		Must handle loading Unrealfiles with ResHeaderSize not known in advance.
+		Resolve chicken and egg ULinkerLoad import problem (type as FName).

+		Unreal play level.
+		Retest the suites.
		
//////////////////////////////////////////////////////////////////////////////

====0.853p
+	Generally replace AActor&'s with AActor*'s.
+	Fix moving brush tracker error on exit.

//////////////////////////////////////////////////////////////////////////////
4-19-97

====0.853q
+	Move generalized AActor functions to UObject.
	
====0.853r
+	FPropertyIterator simple implementation.

====0.853s
+	FClassProperty -> FProperty.
+	Use FPropertyIterator always instead of direct iteration.

//////////////////////////////////////////////////////////////////////////////

	Note:

	You can no longer iterate through class properties directly by doing something like:

	for( int i=0; i<Class->Num; i++ )
		FClassProperty &Prop = Class->Element(i);
		...

	This is no longer supported because child classes now store a list of only the properties
	which they define; child classes don't store properties defined by their parent classes.
	This is done to save memory. Otherwise tons of redundent property definitions must be
	stored.

	Now, to iterate through all properties in a class (including those defined in its parents),
	use a FClassPropertyIterator like:

	for( FPropertyIterator It(Class); It; ++It )
		FClassProperty &Prop = It();
		...

	See the definition of FClassPropertyIterator to see how it does its job. Simply stated,
	its constructor sets up iterator, operator BOOL returns whether the iterator is at the
	end of the list, operator++ increments it, and operator() returns the property the
	iterator points to. This encapsulates iterating through the property definitions
	stored in the current class plus its parents.

//////////////////////////////////////////////////////////////////////////////

+	FindVariable
+	FindParm must return index into proper class
+	iFirstProperty etc must point to right place
+	Scrutinize all GetPropertyPtr's because they might ref the wrong class.
+	FPropertyIterator::GetClass
+	FPropertyIterator::GetIndex
+	void ExportActor
+	void ExportMultipleActors
+	Test rebuild.
+	Retest the suites.

====0.853t
+	Test rebuild with backwards FPropertyIterator.
+	Retest the suites.

====0.853u
+	Cleanup AddParentProperties.
+	Update FPropertyIterator.
+	No CPF_FromParent.
+	Test rebuild.
+	Iterate in forward order.
+	Retest the suites.
+	Retest decompiler.
+	Retest editing.

//////////////////////////////////////////////////////////////////////////////

====0.853v
+	Get rid of FGlobalClasses GClasses.
+	Cleaned up FPropertyIterator.

//////////////////////////////////////////////////////////////////////////////

====0.854a
+	Investigate merging CPT_Actor and CPT_Resource into CPT_Object?
+		To do:
+			Eliminate EX_Level, create EX_NoObject.
+			Expose Level as member variable of all actors.

====0.854b
+			FToken contain actor pointer, not index.
+			Script compiler needs to disallow non-null actor constants.
+				SetConstActor gate.

+			Merge EX_NoActor and EX_NoObject.
+			EX_ResourceConst -> EX_ObjectConst
+			Eliminate CLASS_ScriptReadable; everything is CLASS_ScriptReadable.
+			GC after compile fails due to manually killed resources.
+			Retest the suites.
+			Retest rebuild.

+			FProperty UClass constructor to CPT_Actor, CPT_Resource in script compiler.
+			No redundent FProperty size setting.
+			Retest rebuild.
+			Retest the suites.

====0.854c
+		Cleaned up CPT_Actor and CPT_Resource usage.

====0.854d
+		Merged CPT_Actor and CPT_Resource into CPT_Object.
+		Updated conversion tables.
+		Exporting by index vs. name.
+			This is easy to fix by changing format.
+			ExportActor, ExportMultipleActors.
+		Importing by index vs. name.
+			This is easy to fix, but we need custom old-version support.
+			ImportActorProperties, UActors::Import.
+		Exporting to C++ header.
+			Can easily hardcode this.
+		CPT_Object.
+		Eliminate NAME_NoActor.
+		Update conversion routines.
+			EX_ResourceToBool
+			EX_ResourceToString
+			EX_ActorToInt
+			EX_ActorToBool
+		Updated hardcoded type names.
+		Test "None=123;"
+		Retest rebuild.
+		Retest the suites.
+		Don't duplicate actor comparison operators.
+		Do support casting objects to ints.

+		Had to rename "NoActor" to "None".

//////////////////////////////////////////////////////////////////////////////

	Unreal 2 and beyond:
		Major engine features.
			IK skeletal animation system with physics - much cooler possibilities
				for character interaction, third person views, and ultra-realistic
				animation.
		UnrealEd infrastructure.
			Texture application tools (not mesh painting, just really good aligning).
			Non-animating mesh-based editing tools.
			Maybe Visual SourceSafe integration.
		Engine.
			Open COM object approach to engine.
			Open-ended replaceable rendering engine.
			Open-ended expandable editing engine.
			Maybe an ActiveX document.
		Rendering.
			Subdivision surface support (if not in Unreal 1).
			Maybe NURBS support.
			Volumetric fog and lighting (if not in Unreal 1).
			LOD support in the models.
		Networking.
			Evolution towards a global persistent inventory system.

//////////////////////////////////////////////////////////////////////////////
4-20-97

====0.854e
+	Handle property retraction: CLASS_NoEditParent, and flags mask in iterator.
+	Decrease realloc threshold for better UnrealEd performance (excessive reallocs).

====0.854f
+	Cleanup FindParms usage in script compiler. Needed?
+	Cleanup all ObjectPropertyPtr. Needed?

+	Test resource hierarchy type checking.
+	Test actor/resource dynamic casts.
+	Test bad actor and resource initializers.
+	Test constant and dynamic casts.
+	Test hierarchical resource and actor casting.
X	Test trigger import.

+	Script execution functions take UObject as context.
+	Objects other than actors cannot contain states or perform latent execution.

//////////////////////////////////////////////////////////////////////////////

====0.854f
+	Script execution stack use UObject as base rather than AActor.
+	Cleanup UnScript.cpp

//////////////////////////////////////////////////////////////////////////////

====0.854g
+	Eliminate ProcessMain, move to UnLevTic loop.
+	Eliminate AScript, move all AScript logic to UObject.

====0.854h
+	All includes from Unreal.h, no sub-includes.

+	Rename the Res includes.
+		UnRes.h    -> UnObj.h
+		UnResTyp.h -> UnObjBas.h
+		UnResVer.h -> UnObjVer.h
+		UnClsPrp.h -> UnProp.h

+	Eliminate as many ANSI C includes as possible.

====0.854i
X	Clean up global actor import/export functions. -> Fine as it is for now, and the
X		long term UObject implications aren't clear yet.
+	Process function don't take ULevel; get that from the object/actor itself.

	Note:
	
		UObject::Process is now the one and only gate between C++ and script code.
		This is the only place where C++ code calls into script code and returns.

+	Cleaned up execution stack code.

====0.854j
+	Replace Process function pointers with Vtable pointer and regular method.
+	FindActorFunc, set vtable pointer are identical.
+	Update outdated script exec -> You absolutely can't subclass intrinsic classes.

//////////////////////////////////////////////////////////////////////////////

	Ponder future strategy.
		How to support class evolution - loading of old files into classes when
			implementation has changed compatibly.
			Generate member and function offsets at like time, not compile time.
			This eliminates the "fragile base class" problem.
		Package approach to give access to namespace things like structs and classes
			which don't necessarily belong in the hierarchy?
		Globally distributed objects.
			Serialize across process boundaries.
			This is easy using existing serialization methods.
			The only open questions are:
				Whether to introduce names dynamically, and which names.
				Whether to introduce referenced objects dynamically, and which objects.
					Transient objects would never be distributed.
					Distribution may be specified relative to ownership, i.e. only
						distribute owned objects.
					Distribution may be enabled/disabled on a per-class basis.
					Distribution may be enabled/disabled on a per-object basis.
					These rules need to be made as simple and clear as possible.
				Whether to allow referencing remote objects directly using a lease,
					time, and expire mechanism.
				Whether to allow referencing remote object data or just their functions.
				How to handle such a lease mechanism.
					This is easy, the server just maintains a leased-object list per client
						and prevents them from being GC'd. This would have timers attached
						to each object.
				Stub/skeleton classes.
		Whether to support abstract interfaces and an "implements" keyword.
			Whether these abstract interfaces can be like structs and contain data
				members and non-abstract functions.
		How and whether to support exceptions and exception handling.
			Whether we have to support actual C++ throw/catch, which is going to
				introduce potential problems in that whenever the potential exists to
				call into script code, the state has to be exception-safe.

	Investiage Java "Package" thing.

//////////////////////////////////////////////////////////////////////////////
4-21-97

====0.854k
+	New Root.h generation.
+		New features.
+			Support 0x hex constants.

====0.854m
+	Renamed:
+		UnRoot.h   -> AActor.h
+		UnPawn.h   -> APawn.h
+		UNREAL_API -> UNENGINE_API (So that the API def can be automatically generated in Root.h)

+	Packages:
+		UnEngine - All Unreal engine classes for use by engine licensees.
+		UnGame   - Classes specific to the game.

+		New class specifiers:
+			Package(pkgname), replaces Standard: Eliminate CLASS_Standard; use package to get this info instead.
+				Also specifies DLL root name where intrinsics are implemented.
+			CPlusPlus: specifies that a C++ header should be included.
+			Guid(Hex1,Hex2,Hex3,Hex4): specifies Ole GUID.
+			Transient (CLASS_Transient): Not saveable (inheret from parent).
+			ScriptConst (CLASS_ScriptWritable): Scripts can only contain const references to objects of the class.
+				Is this needed at all?

+		Get new generated Root.h generated perfectly.

====0.854n
+	Get Object class compiled in UnrealScript successfully.

====0.854o
+	RF_HardcodedRes persist via RF_Keep.
+	Move object-general intrinsics from Actor to Object.
+	CLASS_Abstract, abstract keyword, instead of bTemplateClass.
+	Use name table for syn highlighting.
+	Prevent creating CLASS_Abstract objects in general, not just actors.

====0.854p
+	Fix problem serializing UObject locals (weird) - was assuming Actor was top class rather than Object.
+		TOP_CLASS_NAME in UnBuild.h now specifies top level class for Make-All.
+	Object class defined in UnrealScript.
+	Rebuild classes.
+	Retest the suites.

====0.854q
+	Mark all intrinsic classes CLASS_Intrinsic.
+	Eliminate GAME_DLL.
+	Bug, can't assign None to misc classes like Pawn, etc.

+	Allow DECLARE_CLASS with NAME_None, since auxillary DLL's cannot hardcode names.
+	Root generator include:
+		DECLARE_CLASS(AMover,AActor,NAME_None)

====0.854r
+	Update Root.h generator
+		No CPlusPlus directive, only Intrinsic.
+			AMover.h
		Export GUID if nonzero.
+	Proper package definition.
X		All intrinsic classes need enum {BasePackage = NAME_UnEngine} -> Not 
X			useful, since only the engine DLL can define hardcoded names.
X		DECLARE_CLASS, DECLARE_DB_CLASS define package -> Need to be defined in script
X			rather than in C++ code.
X	UClass ctor take BasePackage.
+	IMPLEMENT_CLASS should expose actual class instantiation.

+	Figure out proper actor-object boundaries.

//////////////////////////////////////////////////////////////////////////////

	Summary of what I've been doing:

	I've been evolving Unreal's object architecture in order to expose far more
	of the engine's functionality to scripts written in UnrealScript and
	external game DLL's. This will enable licensees as well as gamers to
	extend the engine and the game in major interesting ways.

	The first step was merging the UResource and AActor class trees into
	one more general class tree rooted by UObject. This does several things.
	First of all, it makes it possible to expose the properties of resources
	to scripts in a very clean, object-oriented fashion. Second, it makes
	resources scriptable. Third, it makes both resources and actors completely
	extendable in an UnrealEd-driver, dynamically bound environment. In other
	words, available extension DLL's, and available extension scripts, can be
	loaded dynamically at any time.

	The resulting extensability and open architecture are far ahead of other
	game technologies including the Quake engine, and it's a major step towards
	redefining what gamers perceive as a game.

	We aren't in Kansas anymore.

//////////////////////////////////////////////////////////////////////////////

====0.854s
+	Use ?autoclassUObject@@3VUClass@@A rather than exposed vtable pointer.

====0.854t
+	Replace Send with Process. This was outdated naturally.
+	Move Send from level to UObject, and override it in AActor.
+	Support class flag inheretance of CLASS_Inheret flags.

+	Rebuild.
+	Retest the suites.
+	Texture.u start.

//////////////////////////////////////////////////////////////////////////////
4-22-97

====0.854u
X	IMPLEMENT_INTRINSIC work in DLL's just like IMPLEMENT_CLASS.
X		Do this at file load time.
X		Bind by index and package.
X		Coerce script to call C++ __stdcall funcs, i.e. COM?
X	Later, maybe.

+	Enforce intrinsicness.
X		Intrinsic classes absolutely must map onto hardcoded classes.
X		Non-intrinsic classes absolutely cannot map onto hardcoded classes.
X		Recompile when get intrinsic specifier, find intrinsic and refuse to modify
X			CLASS_Intrinsic if not found.
X		Recompile when don't get intrinsic specifier...

X	UClass:
X		Expose UClass class flags as bitfields in script.
X		UClass needs DefaultEdCategory (move out of actor props).
X		ClassIsA intrinsic.

//////////////////////////////////////////////////////////////////////////////

X	Reverse the star notation.
+	Retest class creation in UnrealEd.
+	Object class show up in UnrealEd class browser optionally. 
+	Check GetDefaultActor / GetDefaultObject usage.

+	Support:
+		Load/save handle transient properties including transient UObject properties.
+			Transients variables in non-intrinsic classes are zero-filled at load time.

//////////////////////////////////////////////////////////////////////////////

+	New syntax.
+		You can now access the spawn-default properties of an object; they are treated
+			as const so they are read-only:
+		var = [context.]Default.peractorvariable.
+		EX_DefaultVariable
+		Properly works with arrays.

function BeginPlay()
{
	assert( Default.LightBrightness == 64);
	assert( LightBrightness == 64);
	
	LightBrightness = 96;

	assert( Default.LightBrightness == 64);
	assert( LightBrightness == 96);

	log( Class $ "Ok!" );
}

//////////////////////////////////////////////////////////////////////////////

====0.854v
X	Make actor list expandable at spawn time; teensy hardcoded default size.
X		No longer relevant, since pointers take up 4 bytes each.

+	Default Light Properties broken.
+	Fix UnrealEd "Subclass" option and make it undoable.

//////////////////////////////////////////////////////////////////////////////

====0.854w
+	Eliminated SetTarget and made Target non-const. Since an actor is
+	responsible for managing its own target, this was unnecessary. Also
+	eliminated LostTarget and GainedTarget messages; these were unnecessary
+	for the same reason. There is only one case where you would want such a
+	notification and it's now covered by the cooler and more general
+	LostReference notification, which notifies you of any kind of actor
+	reference that was destroyed!

+	Eliminated UnlinkActor. No longer needed.

	So you can do stuff like:

	function LostReference( name VarName, int ArrayIndex )
	{
		if( VarName == Target )
		{
			// Handle losing our target...
		}
		else CallParent.LostReference( VarName, ArrayIndex );
	}

+	GainedChild, LostChild - sent to owner actors when children attach to them.

+	Linked list!
+	Must collision unhash deleted actors.
+	Latent actor destruction in ULevel::Unlock via bDeleteMe.
+	Don't tick deleted actors.

+	UnrealEd new transaction tracking including adding/deleting/readding actors.
+		Mostly works.

+	Fix Inventory script.

+	Torture test actor deletion.

+	Test collision brush collision and raytracing.

+	Cleanup the gfx.

//////////////////////////////////////////////////////////////////////////////
4-23-97

====0.854x
+	Collision
+		Collision exclusion? -> Hand off to Steven.
+		Collision code is now nice and isolated from the rest of the engine. -> Hand to Steven?
+		Proper Bump messaging.

====0.854y
+		inline BOOL IsOverlapping( const AActor *Other ) const;
+		BeginTouch must be reflexive.
+		EndTouch must be reflexive.
+		Proper Touch/UnTouch.

+		Handle Touch/UnTouch under extreme situations like teleporting.

====0.854z
+		Can I get rid of FExecStack::Level?
+		Do GotoState, GotoLabel need a level? -> Eliminated.
+		Does SetOwner need a level? -> Eliminated.

====0.855a
+		Can I get rid of FExecStackMain::Level and move it to Actor? -> Eliminated it.
+		Do InitExecution, BeginExecution need a level? Set at spawn time instead.
+		VERIFY_CLASS_OFFSET macro to track down alignment errors.

====0.855b
+		Scrutinize actor, level, and object headers.
+		ULevel::KillAll?
+		ULevel::PreReconcileActors?
+		RememberedActor!
+		Broadcast and SendEx redundent?
+		Move BeginTouch to Actor.

====0.855c
+		IsBlockedBy must be reflexive.
+		Use IsBlockedBy.
+		Eliminate BlockedClasses, PassedClasses.

+		Standing on top of actor cyllinder isn't working right.

//////////////////////////////////////////////////////////////////////////////

====0.855d
	Inventory code.

//////////////////////////////////////////////////////////////////////////////

====0.855d
+		Fixed UnrealScript null context crash which occurs on Let code like:
+			Pawn(Other).Weapon = Self;
+		I no longer allow UnrealScript locals to be initialized. This saves a lot of space
+			and clears up some hairy linking problems.
+			Actually this is a really good approach, because it opens up the possibility
+				of on-call initialization with non-constants.
+		Eliminated CPF_UninitParm.

//////////////////////////////////////////////////////////////////////////////

	Note: As a result of this change, functions with optional parameters are declared like:

		function f( optional int A )

	Rather than:

		function f( int a=0 )

	Optional parameters are always initialized to zero, null, false, none (zero-filled).

//////////////////////////////////////////////////////////////////////////////

====0.855e
+		Only allow "optional" specifier for func parms.
+		CPF_Optional

+		Compiler fixup after removing locals initialization.
+			Fix decompiling locals.

+		StackNode iFirstProperty, NumProperties: Must be cognizant of class!
+		Fixed UnrealScript IgnoreMask overwriting bug due to LocalsSize write.

====0.860a
+		Calling functions with null context outparms is inherently safe because they are
+		copied back to the same spot where they reside.

+		Fix intrinsic functions with null outparms are dangerous, like operator++.
+		Fixed all cases, at some performance cost (drat!)
+		Fixed major script parm count bug.

+		Wire view of creatures problem.

//////////////////////////////////////////////////////////////////////////////
4-24-97

====0.860b
+	Rendering support:
+		Console is broken.
+		Engine Function InventoryCalcView: First and third person views.
+			InvCalcView1( viewer location, viewer rotation )
+			InvCalcView3( owner location, owner rotation )
+		CollideActorsSet needs collideactors, collideworld, collideplayers parms.
+		intrinsic(262) final function SetCollision( bool NewColActors, bool NewBlockActors, bool NewBlockPlayers );
+		Eliminate IsA, which is redundent.
+		Need rotation operator *, operator /. 285, 286
+		Test the new FRotation operators.
+		bOnlyOwnerSee generalization work.

+		Exec first scripts before render first frame, so killing is done.
+		Pawn bIsPlayer needs to get set in possess.
+		Scripts get initial PossessActor.

====0.860c
+	Actor bugs:
+		Importing Zone= crashes.
+		DestroyActor should destroy and unlink immediately in UnrealEd.
+		EmptyLevel doesn't clear out actor list.
+		Importing level (core after coollt) doesn't clear out actors.

function Phlegm( optional out int a, optional out int b, optional out int c)
{
	Phlegm();
	Phlegm(1);
	Phlegm(1,2);
	Phlegm(1,2,3);
	Phlegm(,2);
	Phlegm(,,3);
	Phlegm(,,,);
}

====0.860d
+	UnrealScript:
+		Allow separating optional parms by commas.
+		Is there any need for EX_Nothing at end of optional parms? -> No.
X		Let outparms be optional, since the bytecode executor now supports that?
X			This would be a bad thing for future optimizations, so I don't allow it.

//////////////////////////////////////////////////////////////////////////////

====0.860e
+	Inventory!

+		Problem with calling virtual functions across contexts?
+		Fixed a major problem in which recursive calls across actor contexts
+		wouldn't always restore the proper stack frames, causing properties to
+		become corrupted. This is probably the cause of the mystery bool problem.

====0.860f
+		InvCalcView1, InvCalcView3 work lame implementation.
+		Implement AutoMag as inventory testbed.
+		Weapon is rendered twice.

====0.860g
+		UnrealScript object constants are now specified like:
+			Sound 'NailGun'
+		Instead of
+			Sound(Nailgun)
+		To avoid confusion with casts.

//////////////////////////////////////////////////////////////////////////////

====0.860h
+		Reimport the textures.
+		Test source release.
+			Galaxy-S.lib
+			DxGuid.lib
+		Test debug build.
+		Test Unreal release on a clean machine.
+		Test UnrealEd release on a clean machine.
+		Submit UnrealEd to GT.
+		Message to Steven and Mark and Ammon.

//////////////////////////////////////////////////////////////////////////////
4-27-97

====0.860i
+	Cleanup and fix.

+		Fix importing triggers and stuff for maps like Hal.
+			Name/Event mapping: Map Name to Tag.
+		Vortex Rikers 3dfx shows light discontinuities across cuts of same polys with strobe fx.

//////////////////////////////////////////////////////////////////////////////
4-28-97

+	Player controls.
+		Pass ServerXXX to all actors owned by player.

+	Eliminated UCamera::GetStoredMove
+	Autosave crashes if no level? Not any more.

====0.860j
+	Support all ServerXX messages.
+		ServerJump, BUT_Jump
+		ServerFire, BUT_Fire
+		Server Weapon N=#
+		Server NextWeapon
+		Server PrevSeapon

+	Handle transient bools?

====0.860k
+	Test "toggle" (CapsLock = bRun): Works fully.
+	Test "Button" (Ctrl = bFire): Works fully.

+	Note to Steven:
+		Moved "CopyInputTo" to APawn::inputCopyTo in UnPawn.cpp. This routine is now yours.

+	Tick nonplayers before players.

	Input system note
	-----------------

	There is no longer a short-circuiting of client rotation. Now all player
	controls are performed in the regular ULevel::Tick loop, with players updated
	last to reduce latency. This reflects the new variable-tick-rate approach where
	there is exactly one tick between rendering each frame. There is no longer any
	advantage to updating players at the last minute, because nothing substantial is
	done between ULevel::Tick and FGlobalUnreal::RenderWorld.

	Right now the loop looks like:
		ULevel::Tick
		FGlobalUnreal::RenderWorld

	When the network code is added in the client loop should look like:
		Assimilate actor updates from the server
		ULevel::Tick (update local players only)
		FGlobalUnreal::RenderWorld

	In other words, ULevel::Tick should occur immediately before rendering, so that
	local player latency is reduced to a minimum.

====0.860m
+	Translate mouse movement into bona fide velocities.
X	Correct mouse dediscretization for frame rate.
X		Scrapped all of the stupid nonlinear adjustment.
X		Controls are easier without it.

====0.860n
+	Implement IST_Hold input state.
+	Implement bRun.
+	ReadInput take an output device as a parm.
+	FGame input postprocessing code.

====0.860o
+	Mouse movement sucks in Win95 in 3dfx on K6 - stupid Win95 QPC limitation. :(
+	Circle strafe key.
+	Need more angles?
+	Mouse needs to be done as velocity, not position.
+	Fix or cut DirectMouse -> Works fine without it for now.

====0.860p
X	Support keyword bindings. -> Don't need em.
X	Some kind of support for delays in the bindings? -> Can script.

+	I've been bitten by this several times.  After I compile, if I get an
+		error in a line number above 1024, if I double click in the results
+		window the editor crashes with the message "overflow error 6"

//////////////////////////////////////////////////////////////////////////////
4-29-97

====0.860q
+	>1.  It seems that now re-defined functions must have exactly the same
+	>set of local variables as the global function they supercede.  Is this
+	>supposed to be this way?
+	Fixed new dynamic cast bug.

+	UnShadow.cpp

====0.860r
+	Install msvcirt.dll
+	AddTask
+	TaskTick
+	Kill Telnet
+	Kill FGlobalTaskManager and FTask stuff.
+	GServer.Tick
+	GCameraManager.Tick

	Note:

	The task manager code in Unreal is gone. Having a task manager in the engine was a dumb
	idea and an unnecessary overkill and complication. Now there is one hardcoded
	function, CUnrealWnApp::MessagePump, which updates all of the main global subsystems (which
	can then update any of their own sub-subsystems). This keeps everything nice and
	predictable.

+	Kill NetTeln.cpp
+	UnTask.cpp -> UnMsgPmp.cpp
+	Kill UnWnTime.cpp

====0.860s
+	Console one-liner text.
+	Software rendering DDraw vortex rikers FMemoryCache assertion.
+	Lethe bizarre lighting errors at start, cache overwrite bug.
+		Major sprite bug.
+	EvrSmk2 lighting flashing - dynamic lighting problems with low shadow detail.
+		This explains the weird light blips. Was a roundoff problem in spatial_None.
X	Add PF_NaturalAlign -> Later.
+	Bizarre dynamic light flashing errors on Nali.unr.

//////////////////////////////////////////////////////////////////////////////

====0.860t
+	BeginExecution in Actor class only.
+	Eliminate InitExecution, do per object.
+	When in unlit mode, do simple depthshade.
+	Eliminate redundent Unrealfile serialization.
+		MainStack.Object.
X		MainStack.Script -> Keeping it is a major convenience.
+	Changed PrivateAlloc to CreateObject.
+	Clean up actor list importing.

====0.860u
+	Optimize handling of local variables. PROPBIN_PerActor.
+	Clean up FExecStackMain, FExecStack, FStackNodeLink constructors.
+	Retest the suites.

====0.860v
+	Eliminate Bin pointers altogether.
+		GetPropertyPtr.
	Script compiler name consts and resource consts in 'quotes' always.

	Note:
	
	The method of specifying name constants and resource constants has changed!
	
	Name constants are now defined like:
		'SomeNameConst' // If name type is implied by context
		SomeNameConst   // If name type is not implied by context
	Instead of
		Name(SomeNameConst)

	Resource constants now must be defined like:
		Texture 'TextureName' // If object type "texture" not implied by context
		TextureName // If not implied by context

//////////////////////////////////////////////////////////////////////////////
4-30-97

====0.860w
+	AActor sound functions.
+	Fix moving brush frame rate variance.

====0.860x
+	Fixed major export bug.
+	UnClsPrp.cpp -> UnProp.cpp
+	UnRes.cpp    -> UnObj.cpp

====0.860y
+	Must distribute Ammon's dll's with the src
+	Cleaned up world collision code.

//////////////////////////////////////////////////////////////////////////////

====0.861a
+	Export tentacle crashes.
+	Cleaned up vector transformation routines.

+	Fixed geometry optimization bug - longest running bug in Unreal history.

//////////////////////////////////////////////////////////////////////////////

====0.861b
+	Encapsulate FBspNode::ROOT_OUTSIDE into FBspNode.
+	Created UnPrim.h

+	UPrimitive interface.
+		BoxLineCheck
+		BoxPointCheck
+		PointCheck
+		LineCheck

+	UPrimitive classes.
+		UModel
+		UTerrain (later)

//////////////////////////////////////////////////////////////////////////////

====0.861c
+	Primitivise.
+		UMesh
+			USkeletonMesh (do later)

+	FCheckResult standardization.
+		LineCheck.

+	Merge Raytrace and LineClass.
+	Update ULevel::Trace.

//////////////////////////////////////////////////////////////////////////////

	Note: What collision is all about
	---------------------------------

	Unreal's new collision detection system is entirely about actors colliding with other 
	actors. A "collision" is an event in which two actors mutually touch each other.
	As in real physics, there is absolutely no distinction between which actor "did the 
	touching" and which actor "was touched". They both collided with each other.

	But what about actor-world collision, you ask? The answer is, "there is no world".
	The "Level" actor contains the world as a UModel primitive, which is known in actor land 
	as the "Level" actor, always actor #0 in the actor list, an actor of class ALevelInfo. 
	So actor-world collision is just like any other ordinary actor-actor collision.

	In other words, the world is just a big moving brush (a UModel) owned by the Level actor
	(an ALevelInfo), which happens not to move, because all actors in the world reside in its
	reference frame.

	In order to clean up and generalize several important areas of the engine, I've set up
	a new base class "UPrimitive", which is the parent class of all abstract objects which 
	are able to be rendered or collided with. An AActor in Unreal can have one (and only one)
	UPrimitive which defines its form, shape, and appearance.
	
	The class hierarchy looks like:

	UObject            - Parent of all classes
		UPrimitive     - Parent of all abstract renderable, collidable objects
			UModel     - An abstract solid model - a level or a moving brush.
				ULevel - A special level model
			UMesh      - An animated creature mesh
		AActor         - Parent of all actor classes

	A UPrimitive is abstract, in that it defines a shape, brush, mesh, or other object
	without regard to its position, rotation, and other transformation properties in an
	environment. A UPrimitive does not represent a physical thing which exists in the
	world. However, a UPrimitive can be owned by an actor. Actors represent physical things
	which exist in the world. The AActor supplies the position, rotation, and other
	information regarding its primitive. When a primitive is rendered, it has access to
	the actor which owns it, so the primitive can use some of that actor's properties.
	For example, USprite primitives use the Texture property of their owning actor.

	You can probably see from the above where this is headed (partly for Unreal, and more so
	for Unreal 2):
	
	* Subdivision-surface based and fractal height maps will become UPrimitive's so that they
	  can be integrated into the engine easily.

	* By adding a few new functions, we'd gain automatic support for exact collision checking
	  with monsters (useful for determining if gunshots *really* hit them).

	* Once UPrimitives are fully encapsulated, new kinds of UPrimitives will be definable
	  via plug-in DLL's. So, for example, it would be a reasonable task to integrate voxel 
	  objects this way.

	* Skeletal models will become UPrimitives, probably a subclass of UMesh. A skeletal model
	  is really just a UModel with some extra info stored: bone-bone connectivity and
	  movement constraints, bone-polygon connectivity, and bone animation frames.

	* With things like moving brushes defined by a UPrimitive and controlled by an AActor,
	  a complex reference frame system is established. The current, oversimplified moving brush
	  Floor "reference frame" hack will be extended to more complex moving frames of reference.

	* Other wild primitive ideas: Level-of-detail objects like rope/chain with detailed
	  physics support, specialized terrain like water and lava with detailed physics,
	  fractally generated objects like trees.

	Note:

	In practice, there are several hacks in the engine which will be cleaned up which are
	violations of the UPrimitive line of thinking. For example, the level object hierarchy is 
	still not quite right, and moving brush are in fact instanced and contain their their 
	location and rotation info.

	Decisions:

	Whether to make UActors a primitive itself, creating a general purpose framework
	in which primitives can aggregate other primitives -> No. Instead, UActors is a 
	special non-primitive object which exposes collision functions that deal with 
	aggregations of primitives. Otherwise collision hashing becomes a huge mess.

//////////////////////////////////////////////////////////////////////////////

	Note: Surfaces with tags like PF_Hurt, which are detected at player
	collision time, are not going to be detected when the player is standing
	on edges or apexes, only on flat or sloped floors!

//////////////////////////////////////////////////////////////////////////////
5-2-97

====0.861d
+	UPrimitive::bCheckCollision.
+	ULevel::Trace use FCheckInfo.
+	UModel::LineCheck perform proper iHit detection..

====0.861e
+	Move actor collision structures to UActors.
+	UnLevCol.cpp -> UnActCol.cpp.

====0.861f
+	Eliminated obsolete SphereLeafFilter.
+	Merge FActorHit and FCheckResult.

+	All collision functions must set all FCheckResult members!
+		UnTrace.cpp
+	BoxLineCheck return int, rather than time.

+	Check bump notification: Need Hit.Actor.
+	Check touch notification.

//////////////////////////////////////////////////////////////////////////////

====0.861g
+	Use CollisionTag to improve actor collision test performance.
+	All primitive collision functions need to take owner actor parm.

====0.861h
+	AActor collision checking functions.
+		PointCheck
+		LineCheck
+		BoxLineCheck
+		BoxPointCheck

+	UnrealEd
+		Import moving brushes perform proper rebuild prep.
+		When add/set moving brush.
+			Build and keep an untransformed, outside-in Bsp for the brush.

+	Bsp build no empty fpolys

//////////////////////////////////////////////////////////////////////////////

Problems with the math routines in general:

*	Coordinate systems (FCoords) don't consistently deal with their origin
	properly, making it difficult to transform points generically.

*	The camera view coordinate system is based on Y-up while the world
	coordinate system is based on Z-up. This is a mess. The standard
	representation is X-left, Y-up, Z-forward.

//////////////////////////////////////////////////////////////////////////////

====0.861i
+	OrthogonalInverse.

	Point -= Origin
	Point (rotate it)

====0.861k
+	Must clean up the vector math.
+		Redefined FCoords funcs as operators.
+		Retest all scaling features.
+		InvertVectors->InvertCoords.

====0.861m
+		Merge new sound code.
X		Sound code is a mess.

====0.861n
+	Try that once more
+		ufxtest.dll ufxtest.lib ufxtest.exp
+		ufxedit.dll ufxedit.lib ufxedit.exp
+		kill utils.mak unsound prj

+	Script editor is word wrapping??
+	UnrealScript support for new sound parms.

//////////////////////////////////////////////////////////////////////////////
5-3-97

+	Support ambient pitch scale byte in actors (64.0=full).
+	Fix validate.

====0.861o
+	Ambient sounds are broken again. #()*$&#*()$&#*()&$#(*&$
+	Update actor ambient sound info.
+	Fixed.

+	Movers not triggered by plyr carrying weapon.

//////////////////////////////////////////////////////////////////////////////

====0.861p
+	Eliminate actor SelfIndex: for simplicity.
+		ULevel::FindActorIndex( AActor* )
+		Pawn FovAngle is now 95 degrees! NOTE: Must update when merging
+			with Steven!
+		GBrushTracker.Update( SelfIndex );
+		Fix possess, no self-index thing.
+		Should be able to possess classes like Skaarj successfully.

====0.861q
+	SelfIndex removal.
+		UnDynBsp: ActorBrushes -> bAssimilated

====0.861r
+		UnLevTic: bTicked pingpong updates.
+		Eliminate CachedBrightness

====0.861t
+		Created new ABrush class: parent of AMover.
+			This class is currently unused, but I wanted to put it in now
+			to ease the transition later. The idea is to eventually replace
+			the level's static brush array with brush actors, in order to gain
+			the better editing user interface and simpler selection/editing
+			capabilities. This will be a pretty straightforward change, though,
+			so I am saving it for later.

+		FBspSurf iActor -> Actor*

===0.861u
+		iZoneActor, bNoDelete... How to handle this kind of cached AActor*
+			problem generally, without serializing? Remove from actor list
+			but don't kill so that GC will hold it. Solved.

		Audio SelfIndex reliance -> use resource index for now.
		Need to address this more efficiently later.

		Note: Moving brushes which span more than one zone assume the properties
		of the zone nearest to the player (which changes as the player
		moves around...) This problem is temporary and will go away when the
		moving brush rendering code is optimized, but it's not worth working
		on till then.

===0.861v
+		DoDynamicLighting
+		Remove audio SelfIndex references.
X		Sound code radius handling is screwed up.

===0.861w
+		FLightMeshIndex update.

===0.861x
+		Import code
+			ImportActorProperties return imported selfindex
+		Export code

+	Specially import me=

===0.861y
+	New import/export code based on names and remapping.
+	ExportActor.
+	Test export then import-add, etc.

//////////////////////////////////////////////////////////////////////////////

	Note:

	Unreal is now compiled with a structure alignment setting of 4 (it was
	previously 8). If anything, like MMX values, need to be 8-aligned, structs
	must be padded manually. This approach saves space.

//////////////////////////////////////////////////////////////////////////////

===0.861z
+	Math cleanup.
+	Eliminated VectFlags code from FPoly::SplitWithPlane.

+	Define FPlane.

+	FPlane things:
+		FBspNode plane.
+		FBoxPointCheckInfo clipto hulls.
+		UCamera ViewPlanes

+	Move out FPlane constructors.

===0.862a
+	FBoundingVolume IsValid flag.
+	Moved PlaneDot to FPlane.
+	Move plane properties out of FVector.
+	FPlane serializer.

+	Rebuild root.
+	Retest the suites.

+	Reimport all textures.
+	Test reimporting maps.

//////////////////////////////////////////////////////////////////////////////

	Searchlight revolution is now controlled by LightPhase and LightPeriod.
	If LightPeriod=0, the searchlight does not automatically rotate, and
	you can manually rotate it by modifying its LightPeriod.

//////////////////////////////////////////////////////////////////////////////

	New animation commands
	----------------------

	The animation commands have been extended to support new features for
	animation interpolation. Interpolation makes the animation far smoother
	and allows animations to be stored in half to a third as much memory, without
	any loss in visual quality. However, interpolation adds a bit of
	complication in handling looping animations.

	PlayAnim:

	Plays from frame 0 to frame n; note that this requires only (n-1) frame
	intervals, because PlayAnim has to skip the final looping interval from 
	frame n-1 to frame 0.

	LoopAnim:
	Plays an animation over and over, looping.
	The AnimEnd message is sent as soon as frame (n-1) is reached, as opposed to
	when the animation sequence has complete one full revolution (i.e. one
	interval before the animation loops back to frame 0).

	StopAnim:
	Stops the current animation sequence immediately. The sequence stops
	animating, but stands still in its current pose.

	FinishAnim:
	This is a latent function, executable in state code only, which returns as
	soon as the current animation has completed, in other words as soon as
	frame (n-1) is reached.

	MorphAnim:
	Asynchronously morphs from the current animation to the starting frame of
	the specified new animation sequence. This is used for tweening smoothly
	between animation sequences that don't naturally line fit together. You can
	test for completion either with the latent FinishAnim() function, or the
	AnimDone notification function.

//////////////////////////////////////////////////////////////////////////////

	Note: component states

	A component state is a special kind of state declaration.
	Like a normal state, a component state can contain state-scoped
	functions. Unlike a normal state, a component state can not
	contain labels and !!

//////////////////////////////////////////////////////////////////////////////
5-5-97

+	Fixed DeclareClass not declaring all required classes.
+	Only display fps stats in 3d nonwire views in editor.
+	Updated Searchlight.
+	Merge.

//////////////////////////////////////////////////////////////////////////////
5-6-97

+	Pop up a dialog box when any resource file loads/saves fail.
+	Fix UnEdSrv.cpp SaveBelow with .unr's.

===0.862c
+	UnrealEd.
+		Script ed windows disappear when minimized.
+		Class browser window sizing.
+		Superclean importing of actors by index or name (backwards compatible).
+		Import-add must support full renaming.
+		Tex import show both .pcx and .bmp

+		Don't autoindent if write-protected.

+		Don't autoindent when prev line is blank.

+		Autoindent sometimes stops working.
+		File / new level crash.
+		Brush import dialog no resize.

+		Autoindent doesn't handle spaces and tabs evenly.
+		Autoindent is s-l-o-w.

+		PolyFlags default to fx.
X		Enter: If there is non-blank text after the cursor, don't autoindent.

+		ExportActor DeltaBins problem.
+		Problem importing map after rebuild.

X		God mode upd script ed windows readonly status.

///////////////////////////////////////////////////////////////////
5-7-97

+	Use animation sequence by name
+		Retest mesh brws
+		Retest ingame anims
+	UMesh::GetFrame
+	Retest 2D and 3D rendering.

===0.862d
+	UnmapViewOfFile
+	Loading/saving is now 5x faster.
+	Test saving and overwriting.

///////////////////////////////////////////////////////////////////
5-8-97

===0.862e
+	FinishAnim Broke

===0.862f
X	Multiple timers.
X	Animation sequence pegged timer.
X	SetTimer.
X	AnimNotify.
X	The better approach is to defined in-animation-sequence events.

///////////////////////////////////////////////////////////////////

+	Animation sequence events: UMeshAnimNotifys, FMeshAnimNotify.
+	MESH NOTIFY MESH=.. SEQ=.. TIME=.. FUNCTION=..

///////////////////////////////////////////////////////////////////

	New metrics
	-----------

	12 Unreal units = 1 foot
	Player is 60 units high.
		* 64 high ceilings are safe.
		* 48 high ceilings are unpassable.
	Player radius is 18 units.
		* 40 wide passages are safe.
		* 32 wide passages are unpassable.
	Player can climb steps 26 units high.
		* 24 high steps are safe.
		* 32 high steps can't be climbed.
	Player can jump about 35 units high (with regular gravity setting).
		* 32 units is jumpable.
		* 48 units is unjumpable.

///////////////////////////////////////////////////////////////////
5-9-97

//=============================================================================
// FakeSkaarj.
//=============================================================================
class FakeSkaarj expands Decoration;

#alwayscall ..\Models\Skaarj.mac

#alwaysexec MESH NOTIFY MESH=Skaarj SEQ=Looking TIME=0.2 FUNCTION=AnimSkaarjJog1
#alwaysexec MESH NOTIFY MESH=Skaarj SEQ=Looking TIME=0.7 FUNCTION=AnimSkaarjJog2

auto state Test
{
function SkaarjJog1()
{
	log( "SkaarjJog1" );
}
function SkaarjJog2()
{
	log( "SkaarjJog2" );
}
Begin:
	log( "Beginning!" );
	Mesh = mesh 'Skaarj';
	LoopAnim( Looking, 0.2 );
}

+	Softwate mesh ordering problem.
+	Setup mesh notify code.

===0.862g
+	Normalize animation frames to 0.0-1.0 range.
+	AnimRate.
+	Implement mesh notifys.
+	bAnimNotify
+	AnimEnd

===0.862h
+	Handle non looping animations at end-1.
+	Handle multiple animation sequences per frame.
+	Handle one-frame animations without choking -> Don't loop them!

===0.862i
+	Do animation tweening.
+		CID_TweenAnim
+		Tween uses AnimTween, AnimRate(1.0/TweenTime), MinAnimRate(Alpha).
+		Show radii now shows actor collision volumes!

///////////////////////////////////////////////////////////////////
5-14-97

+	Lost 2 days' source in crash. Ugh.
+	Upgrade to VC++ 5.0
+	UnAudio.lib
+	Full warnings
+	UnrealEd recompile

///////////////////////////////////////////////////////////////////
5-15-97

+	Unreal.exe
+	New sourcesafe directories.
+	*(UObject**)&obj -> AR_OBJECT(obj)
+	Utils
+	Get on F:

+	Fix new UnrealEd VB 5.0 weirdness
+		Mouse movement
+		Clicking on camera window grid is broken.
+		Bind.mac.
+		Bizarre new texture alignment problem -> VC++ 5.0 code generator bug.

===0.863a
+	Speed up the CString-bound FSimpleArchive code.
+	GateSrc.

+	Kill macro dlgs.
+	Need way of getting list of zone infos for point -> PointZone.

+	Must get read-only multi-use file mappings working, so that
+	multiple unrealeds can be run.

+	When in act prp dialog and press delete, deletes the actor!

+	Backup.

///////////////////////////////////////////////////////////////////
5-16-97

+	GateSrv: Can duplicate login.

+	Installers
+		Source
+			Direct from VSS to WinZip.
+			UfxEdit.dll, UfxTest.dll

+	Verify rebuild from just the sourcesafe files.

===0.863b
+		UnrealEd
+			Setup license
+			Source control the InstallShield files.
+			Shapes
+			Help
+			Textures

===0.863c
+	Merge Steven's new code.

///////////////////////////////////////////////////////////////////

===0.863d
+	Actors.
+		LevelInfo sky needs no-smooth option: bNoSmoothSky
+		AActor Fatness
X		Add SkyShader to LevelInfo sky, use in UnLight.

+	UnrealEd.
+		Import after rebuild crash?
+		Closing the mesh browser still sucks away CPU cycles. Close its window.

===0.863e
+		Make sure all dlgs support long filenames's including multiselect ones.
+		Fixed all common dialogs to support long filenames.
+		Can't load read-only files in load-actor-class (.u).
+		Test all the loaders with read-only files.

+		Retest the suites.

///////////////////////////////////////////////////////////////////

===0.863f
+	UnrealEd script editor.
+		Find must highlight word.
+		Find and replace.
+		Save and restore cursor position between recompiles.
+		^C/^V and edit-copy/edit-paste use different clipboard? Use Clipboard.Clear.

+		Undo/redo cursor and top positioning.
+		Torture test undo/redo.

+		Shift-tab autoindent doesn't indent last line.
+		Autoindent misses last line.

+		Enter mark undo point.

+		Remember script window pos and top.
+		Remember script window pos and top for undos.
+		Tweak undo/redo usability.

+		Save ALL scripts when press F6/F7 or when focus changes.
+		Remove UnrealEd "save class" - now there is only "savebelow".

+		Enter conserve cursor position if before last tab.
X		Autosave no setfocus; kills DirectDraw.

+		Fix message loop time sucker when we don't have focus.

+	Importing more than one map messes up the texture browser window.

///////////////////////////////////////////////////////////////////
5-17-97

===0.863g
+	Generalize mesh rendering code to hardware and software.
+	Mesh phong shading.

===0.863h
+	Clean up FTransform.

===0.863i
+	Made FScreenBounds floating point.
+	Eliminated FTemp.

===0.863j
+	Added Normal to FTransSample.
+	Phong shading.
+	Subdivision with t-junction removal.

===0.863k
+	Fatness.
+	Backfacing.
+	Colors not being clipped?
+	Alpha interpolate in.
X	Teleport-in effect

///////////////////////////////////////////////////////////////////

===0.863m
+	Animation tweening setup.
+		UMesh::GetFrame return a cached set of FVector's; no UCamera parm.

===0.863n
+	Tweening setup.
+		Looped and one-shot animations now both generate AnimEnd messages at frame n-1,
+			even though looped animations loop at frame n.
+		FinishAnim from a loop finishes with frame n-1.
+		ULevel::Tick update.

	Animation system variables.
		AnimSequence  = Animation sequence to play or tween to.
		AnimRate      = Normalized animation rate, or (Tweening Rate / NumFrames).
		AnimFrame     = Current position in animation, 0.0-1.0, negative indicates tweening-to.
		AnimEnd       = Sequence end for PlayAnim.

		bAnimFinished = Indicates animation or tweening has finished.
		bAnimLoop     = Indicates animation should loop.
		bAnimNotify   = Whether the animation sequence has any notifies.

	Tweening caveats:

		To support tweening perfectly would require too much memory and network bandwidth, so I
		use a frame-cache approximation to tweening which works well nearly all of the time.
		The case where it may look strange is when an actor first comes into view when
		it's in the middle of a tween. In this case, the tween source may not be the correct
		frame, so the actor's animation may look strange. This is always safe and won't cause
		any harm, but it may look strange in some infrequent cases.

///////////////////////////////////////////////////////////////////
5-17-97

===0.863o
+		Backup.
+		TweenAnim work.
+			Proper FinishAnim() handling.
+			Proper AnimEnd handling.

===0.863p
+		Frame tweening.
+			Test tweening with random interruptions.
+			Tweening is now continuous.

+		Tweening must be able to lead into a PlayAnim/LoopAnim smoothly.
+		PlayAnim's must morph together.
+		execTweenAnim.
+		UMesh::GetFrame update.
+		Playing single frame animations must work (tween only).

///////////////////////////////////////////////////////////////////

===0.863q
+		SpawnActor needs an owner.
+		Remove ETrace.

+		Fix ULevel::Trace.

===0.863r
+		Updated the scripts.

///////////////////////////////////////////////////////////////////

	Move towards the new "primitive tree" rendering architecture:
	1. Separate UModel and ULevel.
	2. Merge ULevel and UActors.
	3. Eliminate the ALevelInfo actor class (now use ULevel directly).

///////////////////////////////////////////////////////////////////

===0.864a
+	Separate UModel and ULevel.

===0.864b
+	Separate collision hash table into FCollisionHash.

===0.864c
+	Merge ULevel and UActors.
+	Level->Max problem.
+	ULevel::Lock is complicated which is bad for StandardSerializeData.
+	Update import/export code to handle this new approach.
+	Torture test importing/exporting/playing.

///////////////////////////////////////////////////////////////////
5-20-97

	Force feedback: There are three kinds of force feedback support coming
	in Unreal:

	* Ambient forces, which are directly related to ambient sounds
	  (ambient forces share paramters with ambient sounds); these are
	  emitted by one actor at a specific location, and they affect all
	  actors in their ambient radius.

	* Surface forces, which are generated by the texture the player is
	  standing on; one of these surface forces can be set for
	  a player representing the force feedback related to his moving over
	  a blumpy surface, or through water.

	* Impulse forces, instantaneous force feedback responses that are
	  generated by PlayForce script calls, and affect a certain player.

	All actors variables:
		enum AmbientForceType.
			AFT_None
			AFT_Machinery.
			AFT_Rumble.
			AFT_Shake.

	Pawn variables:
		enum SurfaceForceType.
			SFT_None: No surface force feedback.
			SFT_StillWater: Still water.
			SFT_FlowingWater: Flowing water.
			SFT_Rocky: Walking over a rocky surface.
			SFT_Grate: Walking over a grate.
		byte SurfaceForcePeriod: Period of the surface force, negative means scale
			it by the player's velocity.
		byte SurfaceForceMagnitude: Magnitude of the surface force.

	Pawn commands:
		enum EPlayForceType
			PFT_SquareWave: Stay at full impulse for entire time.
			PFT_RampUp:     Ramp up to full impulse then stop.
			PFT_RampDown:   Start at full impulse then ramp down.
			PFT_Smooth:     Smoothly ramp up then back down.
			PFT_Decay:      Start at full force then decay exponentially.
		PlayForce( PlayForceType Type, vector Direction, float Time );

///////////////////////////////////////////////////////////////////
5-22-97

===0.864f
+	Test exporting!
+	Fix the ugly sky.
+	Separate cloudcast texture.

+	intrinsic(295) final function PlayForce( EPlayForceType Type, vector Direction, float Time );
+	intrinsic(296) final operator(16) vector *     ( vector A, vector B );
+	intrinsic(297) final operator(34) vector *=    ( out vector A, vector B );

+	Componentwise vector*vector(296).

===0.864g
+	Cleaned up UnrealFile format.

===0.864h
+	Eliminated object-header-size fragility in UnrealFiles.
+		This solves the "fragile base class" problem for class loading and saving,
+		though is still remains in script variable references.

===0.864i
+	RF_Import.
+	Merge exports and imports, NumImports+NumExports->NumObjects.

===0.864j
+	Clean up imports and exports.
+	Mesh no-curve flag.
+		bMeshCurvy.

===0.864k
+	int FGlobalPlatform::FindFile( const char *InFilename, char *OutFilename );
+	FIND_PATHS
+	Proper map loading from paths, command line operation.

+	Retest game loading/saving.
+		Saving is fine.
+		Fixed load spawning an extra player.
+	Retest the suites.

+	3dfx.
+		Now properly handles fullscreen 3dfx mode (two monitors not required!)
+		New GoHard console command (can place in bind.mac).

===0.864m
+	UnrealEd
+		When add new class below and highlight the new class, need to select it
+			in the edserver.
+		Fixed bug adding actor to the world immediately after adding new class.

+		Merge imports and exports together, imports need RF_Import, so that resources
+			can be exported/imported in proper order.
+		Hardcoding Export.FileLoadHeaderSize exposes the fragile base class problem; this should
+			only represent the properties defined in the particular class, and be relevant to
+			the parent class.
+		Eliminate the remaining class-loading hacks.

///////////////////////////////////////////////////////////////////

==== CONFIDENTIAL ====

New features / changes.
* To bring up the command line, press Tab or '~' (was 'T' in previous versions).
* To fly, type Tab + "Server Fly" + Enter. To walk, use "Server Walk".
* New status bar rendering is not in this version.
* Loading and saving single player games works. The savegame files are huge at the moment, but they will later be reduced from a few megs each to a few hunded K each (storing only the changed objects).
* We now support both 256-color .pcx files and 256-color .bmp files, so you can use whichever format is most convenient.
* Geomtry size is now unlimited; there are no more overflow errors.
* Great actor/world and actor/actor collision.
* Great player controls.
* Invisible collision brushes are now supported (but HighLedgeBlock is no longer supported).

UnrealScript:
* Java/C++ style object oriented scripting language.
* Full range of standard C++/Java datatypes and operators, including advanced types like vector, rotation, object, actor, etc.
* Latent, time-based execution.
* Large documentation file coming soon.
* Four-way calling interface (U->U, U->C, C->U, C->C).
* Support for automatic runtime loading of the appropriate game DLL's.

Rendering features:
* Curved surface rendering for meshes (supports phong shading). bCurvy turns curved surface rendering on/off for particular actors (only affects meshes, not level geometry).
* 3dfx support with colored lighting.

Gotchas:
* Textures with extreme aspect ratios (like 1x8 or 8x1) don't display yet on 3dfx.
* Moving brushes and actors don't collide; actors can walk through moving brushes. This is the next major thing I'm working on but everyone wanted 0.86 now rather than waiting for the brush fix.
* 3dfx gamma correction isn't quite right.
* Dynamic lighting sometimes "sticks" to surfaces.

What I'm working on next:
* Fixing moving brush collision.
* New status bar rendering code.
* UnrealScript docs.
* 3dfx rendering improvements (fixing the sky, speed).

///////////////////////////////////////////////////////////////////

===0.864n
+	Prep for release.
+	Graphics.zip
+	Models.zip

///////////////////////////////////////////////////////////////////

===0.864o
+	3dfx.
+		Fix the status bar!
+		Automatic texture aspect ratio adjustment.
+		Fix the border.
+		Fixed transparency (was broken).
+		Test 3dfx masked textures.
+		rgba masked textures.

===0.864p
+	Merged with Steven.
+	msvcrt.dll.
+	comdlg32.ocx.
+	oleaut32.dll

///////////////////////////////////////////////////////////////////
5-23-97

+	Fix 2d shaper (input but no dlgs).
+	Fix Delete.

+	Brightened actors in 3dfx.
+	Fixed bug causing a crash when selecting a brush vertex.
+	Fixed adding a moving brush is undoable.

+	Actor collision bug in Unreal.unr -> this bug was caused by Steven's workaround
+		to my old actor collision bug.

+	//  It is illegal to call out while inside message filter.
+	#define RPC_E_CANTCALLOUT_INEXTERNALCALL _HRESULT_TYPEDEF_(0x80010005L)
+	Fixed this! It was an RPC limitation: you can't make recursive RPC calls. 
+	Though this can be avoided, it really underscores some of the reasons why
+	OLE is a crappy framework to build applications on.

===0.864q
+	Test release to Inoxx and Jeremy.

///////////////////////////////////////////////////////////////////

Fixed since initial 0.86:

* Fixed problem with some (but not all) 3dfx boards seeing random colored
  incorrect textures all over the place.
* 3dfx now uses the same meaning of hue, saturation, and brightness as 
  software rendering (was inverted).
* The file-load and file-import dialogs were broken on some machines (the
  installer now includes COMDLG32.OCX).
* 3dfx masking and transparency weren't working (fixed).
* Fixed broken 2d editor.
* Fixed amazingly annoying "Runtime : 2147418107 (80010005)" problem.
* Fixed problem: Player got stuck when standing on an actor.
* Note: The texture format hasn't changed since the previous 0.86 so you can
  keep your old textures. However, you will need to reimport your maps from .t3d.

Notes for this version of 0.86:

* AutoUPan, AutoVPan and wavy effects don't work with 3dfx yet.

* When clicking on an actor, don't use the "Subclass and edit script": it's broken.

* If you have any ZoneDescriptors in your level which you want to reimport
  into 0.86 (such as Inoxx), you need to do this: Load your old .t3d file from 0.84
  into Notepad.exe, and do a search-and-replace: replace all occurances of
  the text "ZoneDescriptor" with "ZoneInfo". Then import it into 0.84.

* When using masked textures (where color 0 is transparent), you also
  need to make color 0 black. If color 0 is not black, you will get a
  weird colored transparency effect on 3dfx.

* Spotlights work, but I've extended them and maps imported from previous
  versions might not contain all of the new properties. Make sure the following
  properties are set for spotlight actors:

  LightType = LT_StaticSpot (for static spotlights), or LT_Spotlight (for dynamic spotlights).
      Most spotlights should be static. The only case where you need to make a spotlight
	  dynamic is when you're going to write a script to rotate it.
  bDirectional = True
  LightCone = 128 (or some other value indicating the spotlight cone angle but NOT 0!)

* The shadows on polygons with aspect ratios outside of the range 1:8 to 8:1 will
  render incorrectly on 3dfx (possibly as weird blobby incorrect colored shadows).
  I'll be working on this shortly.

* 3dfx gamma correction is strange. To adjust gamma, type something like the following 
  while in fullscreen 3dfx mode:
  RENDEV SET GAMMA=2.0
  RENDEV SET GAMMA=1.5
  RENDEV SET GAMMA=1.0

* Coplanar sheet brushes (made using the 'build sheet brush' and 'add special'
  dialogs) aren't going to work anymore for decorations placed on walls. That
  technique creates some major inefficiencies with hardware rendering and with
  the new software rendering optimizations I'm planning. The problem is due to two
  polygons overlapping. To get the same visual effect, now you need to add a cube 
  (or some other brush) flush with the wall. This creates more polygons, but there
  is no overlap. Sorry!

Other notes:

	The meaning of Hue (color wheel):
		0     = red
		27    = orange
		39    = yellow
		85    = green
		123   = aqua
		137   = light blue
		170   = deep blue
		194   = purple
		255   = back to red again

///////////////////////////////////////////////////////////////////

ascention texture mapping
-------------------------

;
; Pass 0: Init chunk table.
;
;-Init TexAddr
;-Init FogAddr

;
; Pass 1: Texture and shader address setup. 6 c/p.
;
; eax = Temp address.
; ebx = [g|vl].
; ecx = [texel|loop counter]
; edx = Texture base address.
; esi = [vh|ul|uh].
; edi = Chunk setup table.
; ebp = [dg|dvl].
; esp = [dvh|dvl|duh].
;
; Always works on 4-pixel wide aligned stripes.
;
; Variations:
;   4 trilinears.
;   12 usize.
;
mov eax,[mask]      ; Load texture address mask.
and eax,esi         ; Get masked texture address.
add ebx,ebp         ; Update g,vl.
adc esi,esp         ; Update vh,ul,uh.
add ebx,const       ; Dither const.
adc esi,const       ; Dither const.
mov [edi+5],bh      ; Store shader.
rol eax,const       ; Maneuver address around.
mov cl,[eax+edx]    ; Get texel.
mov [edi+1],cl      ; Store in table.

;
; Pass 2: Fog and mapping = 8 c/p.
;
; eax = Texture address.
; ebx = Fog address.
; ecx = Texel.
; edx = 
; esi = Chunk setup table.
; edi = Screen destination.
; ebp = 
; esp = 
;
; Variations:
;   Pentium and MMX.
;   8, 16, 32-bit color.
;   Masked, transparent, fire.
;   1 & 4 pixel spans.
;
mov eax,[esi]       ; Get address of shader + texel + light.
mov ebx,[esi+4]     ; Get address of fogger.
mov cx, [eax*2]     ; Get 16-bit color texel.
mov dx, [ebx*4]     ; Get fog value.
add cx,dx           ; Merge em.
mov [edi],cx        ; Write to screen.

Pentium:
 256-color palettized texture + single component ramp color + ?fog?

MMX:
 256-color palettized texture + single component ?? color + rgb light + rgb fog.

;
; Lighting bilerp pass = 24c / 8 pixels = 3 c/p.
;
; eax =
; ebx = 
; ecx = 
; edx = 
; esi = 
; edi = 
; esp = 
; ebp = 
;
add al,bl
adc cl,dl
add ah,bh
adc ch,dh
mov [temp+0],cl
mov [temp+1],ch
mov [fdu+0],al
mov [fdv+1],ah

mov eax,[temp]

fld  [eax*4 + 0x001]
fsub [eax*4 + 0x000]
fmul [fdu]
fadd [eax*4 + 0x000]

fld  [eax*4 + 0x101]
fsub [eax*4 + 0x100]
fmul [fdu]
fadd [eax*4 + 0x100]

fsub st(1)
fmul [fdv]
faddp st(1),st

fstp [edi]

Things to keep in mind:
 - Handle both creature polys and world polys.
 - Handle all fx.

///////////////////////////////////////////////////////////////////
5-24-97

===0.864r
+	threed32.ocx, grid32.ocx, msoutl32.ocx require mfc40.dll.
+		Can eliminate 1 meg distribution size later.

===0.864s
+	Cleaned up UnrealEd files.
+	Light Hue for 3DFX is strange , 0 is blue , 170 is red the numbers are different than the ramphue settings.

===0.864t
+	Fixed 3dfx problem on some cards with random textures being drawn.

===0.864u
+	Merged with Steven's code.

===0.864v
+	Merged Robert's code.
+	Posted for testing.

===0.864w
+	Fixed compiler ambiguity James discovered:
+		function f(inventory inv) {ActivateWeapon( weapon(inv) );}

+	StandMover   -> StepOn
+	UnStandMover -> StepOff
+	SteppedOn    -> SteppedOnBy
+	UnSteppedOn  -> SteppedOffBy
+	Added StandingCount: Count of other actors standing on this actor.

///////////////////////////////////////////////////////////////////
5-25-97

===0.864x
+	Added stubs for all new floor related code.
+	physWalking handling of standing on other actors.
+	Jump must clear out Floor.

====0.864y
+	Merged StepOn and StepOff into FloorChange.
+	engine function FloorChange();
+	SetFloor intrinsic with notifications.
+	SetRotation intrinsic.

///////////////////////////////////////////////////////////////////
5-26-97

====0.864z
+	Inoxx bug fix day :)
+	fixed click on the texture to reselect , the properties text has disappeard (Inoxx)
+	Fixed physProjectile bug (Steven)
+	Fixed alt key sucking in camera views in UnrealEd (Inoxx).
+	Fixed bug not being able to type 'z' in script editor! Ack! (Steven)
X	BTW is it possible to prevent the game to autosave when playing with ctrl - P ?
X	And when in DirectDraw. No.
+	'H' toggles hide-actors. BTW a key would be cool to toggle: hide/show actors. (Inoxx)

X	the geometry is screwed, strange , both brushes come from 2D editor
X	no 3ds brushes here Attachment Converted: f:\eudora\attach\BUG3.T3D
X	-> 2d editor sometimes creates bad brushes (don't use them).

+	Open free camera: dynamic light, no brushes, no movers, yes actors. (Inoxx)

///////////////////////////////////////////////////////////////////
5-27-97

====0.865a
X	Using keyboard and mouse at the same time (like walking and moving the
X	heap up ) generate some weird effect , is look not smooth at all moving with 
X	keyboard only is perfectly smooth , moving with mouse only is perfectly smooth 
X	too, but the both at the same time is ugly : Fixed

+	Whenever I type a Z in unrealed, it does an undo (as if it was a ctrl-Z)...

+	The green colors are still here when coming from directdraw mode. (Inoxx)

X	In the Properties dialog box, when you input a string, it parses it out
X	to only the first word unless you specifically put ("") quotes around it
X	when inputting the data. -> No, this was fixed after 0.84.

+	I'm not able to import Extreme. (Inoxx) Works now.

+	Portals not displayed. (Test.unr)

====0.865b
X	Why is the saving so slow? is it a bug or a feature? (Inoxx) -> Feature.

+	Only one sprite chunk is hardware-rendered. On hardware, render source
+	points unclipped. Fixed, but sprites suck. Use meshes wherever possible.

+	Subclass and edit new is broken.

X	Sometimes the textures browser is replaced by a camera view. (Inoxx) Can't duplicate.
+	WM_MOUSEWHEEL -> AXIS_MouseW

+   Pressing mouse right button AND up or down moves the player's head.

====0.865c
+	Made the frigging orthogonal view backdrop white again.
+	Extended MoveActor and TestMoveActor with IgnorePawns boolean.
+	RotateActor.
+	MoveActor handle moving hierarchy.

====0.865d
X	Negative lights, for spawning post-explosions. Bleah! Looks awful.

///////////////////////////////////////////////////////////////////
5-28-97

====0.865e
+	It appears that AnimEnd is never called for animations that only have one
+	frame. Is this true? And is that what you intended? (jschneider) Fixed this bug.

X	3dfx support: I do get weird white triangles and lines flashing on the 
X	screen occasionally, as well as lockups after running around for a 
X	minute or so. (total lock) I don't know what else to tell you about 
X	this one, happens in any map that has decent size and it just freezes 
X	like it is taking a screenshot. (Cliff) Broken hardware!

+	When save 'light', get error untagged name (Jason Emery). Fixed.

///////////////////////////////////////////////////////////////////

====0.865f
+	Moving brush fixes.
+	IsOverlapping.
+	Movers must default to bBlocksActors, bBlocksPlayers!

X	UActors: Derive from Primitive, and perform delegation of collision checks? Hmmm.
+	Actor collision query function - optionally delegate to primitive.

+	AActor::GetCollisionExtent:   support movers properly.
+	Fixed major array-through-context bug (Les Bird).

+	Retest the suites.

+	Replaced PF_IsFront, PF_IsBack with NF_IsFront, NF_IsBack, because there was
+		a potential inversion problem with the BSP where polys are flipped relative
+		to their coplanar node.

====0.865g
+	Handle coordinate system transforms for.
+		UModel::BoxLineCheck

///////////////////////////////////////////////////////////////////
5-29-97

====0.865h
+	FYI: trying to spawn a null ('none') class will result in Unreal crashing.
+	While reasonable, it would be nice if the spawn function just returned a
+	null reference and maybe a warning. -> Fixed

X	>- computer locks up totally (even Pview doesnt get you out of this one) when
X	>  clicking somewhere on the Rebuilder window.
X	>  this happens on all my computers, level loaded doesn't matter (freshly
X	>  installed 86v, loaded Unreal.map trying to click on BSP in the Rebuilder
X	>  window, CRASH) -> This does not sound like 0.864v!

+	Fixed script compiler function-after-label-in-state crash.

+	Export U, import U.
+	Zone PlayerEvent!
+	Clean up UnMath coords functions.

+	Rotation variance of collision volume problem. Must actually transform collision
+		BSP hulls and operate on the transformed versions (simply skipping the bounding 
+		boxes).

+	Handle coordinate system transformation.
+		UModel::PointCheck
+		UModel::LineCheck
+		UModel::BoxPointCheck

+	Retest trace.

====0.865i
+	Fixed major owner bug in MyBoxPointCheck.
+	Separated iBound into iRenderBound and iCollisionBound.

+	Space updates all views instead of ctrl.
+	Fixed SerializeBin code.
	
====0.865j
+	CPF_Intrinsic: Intrinsic actor properties, not touched by script?

====0.865k
+	Eliminated hardcoded rendering dynamics limit.
X	Resize rendering point and vector caches on the fly?

+	Made curved surface technique 2x faster, and much smoother.
+	Fixed UnrealEd not being movable when non-maximized.

+	Environment mapped meshes.
+		Actor bMeshEnviroMap with regular and curvy surfaces.
+		EnvironmentMap texture per zone (get from parent).
+		bZoneEnviro flag to use environment map surface from zone.
+		Separated actor texture into Sprite, Skin.
X		Option for 2-layer enviro mapping on 3d hardware. -> Looks like crap.

====0.865m
+	BeginState/EndState probes.
+	Fixed new trace bug, optimized Trace.

+	3dfx now supports all possible sizes of light meshes.
+	3dfx now supports modulation blended detail texture mapping.

///////////////////////////////////////////////////////////////////
5-30-97

====0.865n
+	Test spawning over 3000 actors.
+	3dfx handle transparency and normalized 5551/565 textures.
+	Must use chroma-keying for masked shadowed textures??

====0.865o
+	Improved 3dfx masked/transparent shadowed textures.
+	Optional glide fog diminishing.

====0.865p
+	Fixed dynamic light sticking problem, 3dfx only.
+	Fixed UnrealScript gotcha: Can't override a function and make it final.
+	Import-and-add now selects all brushes AND all actors.

///////////////////////////////////////////////////////////////////
5-31-97

====0.865q
+	Now BLACK is always treated as the mask color, not color 0. This greatly simplifies
+		the artwork (no dpaint touchups).

+	P & K keys - update all views! (Show icons!)

+	Fix the zone code!
+		Merged zone building code with visibility code.
+		Zone finder must filter through both the front and the back.
+		Portal code is now 100% totally general!
+		Zones/portals can work for water now (but we still need swimming player controls)

====0.865r
+	Clean up zone code.

///////////////////////////////////////////////////////////////////

	3dfx questions
		What's the deal with grDepthMask( DepthBuffering ) not working?
		How to ping-pong the w-buffer?
	3dfx requests for future hardware
		Clamp rgba values to the (0-255) range at render time, so that they
			can safely underflow or overflow within a specified range. Useful for
			overbrightening and interpolating rational linear values (such as alpha
			blended detail textures) where the range isn't bounded to 0-255.		

///////////////////////////////////////////////////////////////////
6-1-97

====0.865s
+	Zone extensions.
+		Only split up polys (and use PF_NoMerge) if nonzero zones differ; right now it does way too much splitting.
+		Opt geom after zone generation rather than before!
+		Handle zones with semisolid invisible brushes cleanly. PF_Invisible now flows!
+		Handle rendering zone portals with an actual texture (i.e. transparent).

+	UnrealEd: Click on compile error on script whose window is not open crashes.
+	UnrealEd water option use water zoning.

====0.865t
+	Fixed rendering bugs with transparent portals.

====0.865u
X	3dfx should support zone ambient lights (affect palettes?) -> Software only!
+	3dfx can see detail texture lines during transition -> Now alpha-fade them in.
+	3dfx fade out transparent textures based on Z.
+	Must make detail alpha persp-linear.

====0.865v
+	Fixed .u loader -> However, the .ucx loader still needs work.
X	Is there a way to do polygon filtering/splitting that's guaranteed to produce consistent results?

+	LE_SpotLight now implements dynamic shadows.
+	DrawScale should affect scaled sprites!

====0.865w
+	Optimizations.

///////////////////////////////////////////////////////////////////
6-2-97

====0.866a
+	Fixed moving brush position bugs.
+	Cleaned up bounding volume code.
+	Cleaned up the math code.
+	virtual FBoundingBox UPrimitive::GetBoundingBox( AActor *Owner )
+		Changed GetUncoords to ToWorld.
+		Changed GetCoords to ToLocal.
+	UMesh::BoundVisible properly handles all rotation.

====0.866b
+	Improved AActor::GetCollisionExtent.
+	Extended UPrimitive.

====0.866c
+	Moved cylinder collision code to UPrimitive.
+	Properly use UPrimitive::GetBoundingBox and eliminate TransformedBound dependence in code.
+		Use for generalized actor bounding boxes.
+	AActor::GetPrimitive.
+	Eliminated bCheckCollision.

====0.866d
+	GetData, Element on a const object imply const data.
+	STEVE: NOTE: SetActorZone now takes a Test parm to indicate whether to send messages.
+	Cleaned up MoveActor, FarMoveActor.

====0.866e
+	Eliminated the "Engine" keyword for functions - it's obsolete.
+	New "intrinsic(0)" declaration and EX_ProcessFunction enable you to call old AActor::Process
+		style functions regardless of whether they reside in C++ or script code.
+	SNODE_EditableState
X	Enable mover ::Process intrinsics to be called from script.
+	Timer() now takes no parameters.
+	Fixed TransformPlaneBy bug!
+	Optimized 3dfx code to reduce palette/texture churning.

///////////////////////////////////////////////////////////////////

	Notes for steven:
		When you need to kill an actor after a certain amount of time, just set the life span
			rather than using a timer and destroying the actor manually.
		Should all actors perhaps default to bEnginePhysics=true?
		Don't use BoxPointCheck yet, it's still broken.
		UnrealEd now includes a pulldown-list for setting an actor's initial state; to make a
			state changeable in UnrealEd, just declare it like this:
				state() MyState {...}
			instead of
				state MyState {}
		Can you merge in my PlayerCalcView code for the behind-the-player view?
		We need to be wary of infinite-recursive problems when we use Move from within
			a Touch/Bump notification. I ran into this problems with the following script,
			and James ran into it with some of his projectile code. Check out the new
			function "singular" specifier - you can use it with notification functions like Bump
			to prevent recursion.

class NewTrigger expands Trigger;
function Bump( actor Other )
{
	// This recurses infinitely when called by Human.
	log( "I was bumped by " $ Other.Class );
	Move( Normal(Other.Location - Location) * 10.0 );
}

Solution:

class NewTrigger expands Trigger;
var int RecursiveCount=0;
function Bump( actor Other )
{
	if( ++RecursiveCount == 1 )
	{
		log( "I was bumped by " $ Other.Class );
		Move( Normal(Location - Other.Location) * 10.0 );
	}
	RecursiveCount--;
}

Bug fix in execLineOfSightTo: *Always* validate parameters passed to C++ code from script code
and handle incorrect parameters gracefully. It should be impossible to crash the engine by 
writing a buggy script, except for the case of infinite recursion. For example, actor pointers 
with NULL before calling functions that expect actor parameters. Applicable functions:

static void execLineOfSightTo( FExecStack &Stack, UObject *Context, BYTE *&Result )
{
	guardSlow(execLineOfSightTo);
	debugState(Context!=NULL);
	debugState(Context->IsA("Pawn"));

	P_GET_ACTOR(Other);
	P_FINISH;

	*(DWORD*)Result = Other ? ((APawn *)Context)->LineOfSightTo(Other) : 0;
	unguardSlow;
}
AUTOREGISTER_INTRINSIC( AI_LineOfSightTo, execLineOfSightTo);

See also:
	execActorReachable
	execFindPathToward
	execMoveToward
	execStrafeFacing
	execTurnToward

====0.866f
+	New UnrealScript "state() StateName" notation makes a state settable within UnrealEd, which
+		enables level editors to override the default state. UnrealEd now includes some interface
+		improvements in the actor property editing code to facilitate this.

+	Added SNODE_IteratorFunc.

+	Moving brushes, use regular physics rotating code.
+	MoveActor move floors.

+	Settable state combo box in UnrealEd.

+	Renamed "Floor" to "Base" for clarity.

///////////////////////////////////////////////////////////////////
6-3-97

====0.866g
+	Rearranged execution stack in anticipation of vf hashing.
+	FStackNodeLink overhaul.

====0.866h
+	Changed FStackNodeLink to FStackNodePtr, now use pointer semantics.

+	You can no longer override a non-final function with a final function. This is an optimization.
+	Fixed decompiler bug with accessing properties through actor casts.
+	Cleaned up FNestInfo.

====0.866i
+	Don't allow calling iterator functions directly.
+	Multiple recompiles & loads chokes the vftable freer?
+	Extended FStackNode to include two parent pointers, ParentItem and ParentNest.
+	Cleaned up the decompiler.

====0.866j
+	Fixed bug in new mover intrinsics which conflicted with Steven's intrinsics.
+	Added in checking for duplicate registered intrinsics.

///////////////////////////////////////////////////////////////////
6-4-97

====0.866k
+	UnrealScript SNODE_SingularFunc to prevent reentrance on a per-actor basis, bSingularFunc.

+	The new UnrealScript "singular" attribute can be applied to functions, to prevent them from
+	being reentered. When a singular function is called in an actor, and another singular function
+	is already being executed recursively in that actor, the later singular function returns
+	immediately without doing anything. This mechanism exists to prevent infinite-recursive
+	situations such as can occur when an actor tries to move in response to a "Bump" notification.

+	Intrinsic vector MirrorVectorByNormal(vect,normal);

+	Added physPathing, physMovingBrush.
+	Removed PHYS_Splining.

// Here is a cool test script.
class Popcorn expands Trigger;

function BeginPlay() {
	CallParent.BeginPlay();
	Physics = PHYS_Projectile;
	bEnginePhysics = true;
	bBounce = true;
	bHidden = false;
}

singular function Bump( actor Other ) {
	Velocity = Normal(Other.Location - Location) * 400.0;
}

singular function HitWall( vector Normal ) {
	Velocity = MirrorVectorByNormal( Velocity, Normal );
}

====0.866m
+	Finished up virtual function hashing. Whew!

====0.866n
+	My physics modes.
+		PhysAlpha, PhysRate -> Root. Negative rate is ok.
+		PHYS_MovingBrush.
+		PHYS_Interpolating.
+		InterpolateEnd notification.
+		latent FinishInterpolation();

///////////////////////////////////////////////////////////////////
6-5-97

====0.866o
+	InterpolateBrushTo();
+	Moved all the brush intrinsics to UnrealScript.

+	Fixed big huge bug in UnrealScript which caused function parameters to be
+	mismatched when bytes are passed as parameters.

====0.866p
+	Fixed triggers!
+	'Begin:' label in states is now optional.
+	Sorry, I eliminated NoName. Use '' instead.
+	Scripted all of the new moving brush modes.
+	New: In ULevel::MoveActor, bump messages are *not* send to an actor's base when the actor
+		bumps it. This prevents a flurry of unnecessary messages.
+	Moving brush sound effects.

+	A state that overrides a state (of the same name) in its parent class inherets all of the
+		functions and labels in that parent state. The syntax is unchanged.
+	New: A base state can now inherent from another state in the same class. The syntax for this is:

state MyBaseState
{
	//...
}

state MyNewState expands MyBaseState
{
	//...
}

+	IsState now returns whether an actor is in the specified state. This may return a different
+	result than (Actor.State==TestState) because an actor may inheret from a parent state with
+	a different name.

+	Note that states can have either no inheretance or single inheretance. There
+	is no way to do handle multiple inheretance (or "interfaces") with states.

+	Pawn.Message command.

///////////////////////////////////////////////////////////////////

====0.866q
+	Fixed UnrealScript problem compiling code like "RotationArray[Index].Pitch".
+	Actor movement code now automatically updates moving brushes.
+	Make sure Touch & Bump messaging is done with movers.

+	New ResetTrigger mechanism for synchronizing mover-trigger-switches and the movers they control.
+	New BumpButton moving brush type! Awesome.

///////////////////////////////////////////////////////////////////
6-6-97

====0.866r
+	Iterators.
+		NAME_ForEach

====0.866s
+	Compiler support for iterators.
+		Latent function calls are not allowed inside iteration loops.
+		Loading/saving scripts with iterator tokens.
+		Iterator decompiler.
+		Can break out of a foreach.
+		Can return from a function in a foreach (EX_IteratorPop first).
+		Cannot goto into or out of a ForEach.
+		Iterator compiling finished.

====0.866t
+	Created all intrinsic stubs.
+	Script compiler automatic typecasting of out object to BaseClass.

+	Fixed zones Merged in extreme.

///////////////////////////////////////////////////////////////////
6-7-97

====0.866u
+	Fixed Trace.

====c
+	Script execution support for iterators.
+		Implement AllActors.
+		At end of iteration, iterator variable should be set to None.

		EX_Iterator + [wOffset End] + Iterator function call
		Start:
			Code...
			EX_IteratorNext
		End:
		EX_IteratorPop

====0.866w
+	Iterators.
+		execAllActors
+		execChildActors
+		execBasedActors
+		execTouchingActors

====0.866x
X	Allow casting strings to names. -> Would violate the UnrealScript sandbox.
+	More iterators.
+		execRadiusActors
+		execZoneActors

///////////////////////////////////////////////////////////////////
6-8-97

====0.866y
+	Merged Steven's code.

====0.867a
+	Test & fix
+		UModel::PointCheck
+		UPrimitive::PointCheck
+		UModel::BoxPointCheck
+		UPrimitive::BoxPointCheck

+	Torture test the actor destroying code.

X	ScriptConst not inhereted?
X	ScriptConst as delete-optimization? -> No can do.
X	Test enforcing ScriptConst.

+	Optimized UnrealScript virtual functions.

+	Teleporter bStatic=false.
+	Trace now takes bNoPawns parm.

+	Require names enclosed in ''.
+	Stubbed in the new mesh collision routines.

====0.867b
+	Trace now takes flags to indicate what to check collision with.

====0.867c
+	Merged Ammon's sound code.
+	execVisibleActors
+	UnrealEd music click on ".." must bring up song.

+	All pawns must default to bCanTeleport=True.
+	Seeing: check bHidden!

+	Brush collision must work with brush prepivot/postpivot.

====0.867d
+	Clean up model PreSubtract, PostAdd.
+	Clean up AActor::ToLocal, AActor::ToWorld.

///////////////////////////////////////////////////////////////////
6-9-97

====0.867e
+	Fix BoxPointCheck out normal. 1 = no hit, 0=hit.
+	BoxPointCheck now fulfills Steve's wildest dreams and fantasies.

====0.867f
+	Update from Steven.
+	FCoords::Inverse() is 16 times faster.
+	FCoords::Inverse now properly inverts the origin.
+	Handle proper sheering of movers.

+	Eliminate bEnginePhysics.
+	FarMoveActor needs to set OldLocation.

====0.867g
+	Objects are getting touch messages with themselves.
+	Weapons curvy?
+	Creature masking.

+	Simplified Trace: FCollisionHash::LineCheck now can optionally handle the level actor.
+	Expanded IsBlockedBy to handle the level actor and bCollideWorld properly.
+	Simplified MoveActor.

+	All of the collision functions now take an FVector Extent (instead of height & radius) for
+		simplicity and generality.

====0.867h
+	Eliminated PointCheck, LineCheck: Now use BoxPointCheck and BoxLineCheck with an extent of
+		FVector(0,0,0) to do this. This keeps the interface cleaner.

+	Implemented foreach TraceActors(), but no zone change notifications yet.
+	This is a really cool function!

====0.867i
+	Somehow merge node flags and trace flags into some kind of "solid volume classification flags"?
+	Fixed walking through actors problems.
+	Fixed walking through level problems.
+	Tightened up LineCheck: Should be rock-solid now!

+	Hash line check take optional "check level" flag.

///////////////////////////////////////////////////////////////////
6-10-97

====0.867j
+	Clean up class intrinsicness and capitalization.
+	Need working playerstarts.
+	Get rid of .mac macros.

+	Start spawned actor names at ClassName1.
X	All drawscales should be 1.0.

====0.867k
+	Implemented AActor::IsBasedOn.
+	Tightened up SpawnActor code for cameras.
+	Cleaned up moving brush code.

///////////////////////////////////////////////////////////////////
6-11-97

====0.867m
+	Get rid of hardcoded \unreal paths in the scripts.
+	Extended PlaceActor to handle actors.
+	Improved math cosine and sine consistency.
+	Merged with James & Steven.
+	Use Skin texture for texture #0 if specified.

====0.867n
+	Fixed the collision hash bug from hell.
+	Property flags like Const now propagate through structure references!
+	This created a collision bug with code like Location.Z += 9;
+	See CPF_PropagateFromStruct.

+	Split UPrimitive::GetBoundingBox into GetRenderBoundingBox, GetCollisionBoundingBox.
+	UnLevAct: Rotate if < 0.5
+	Verify mesh collision sizes.
+	Fix trace flag handling.
X	Trace still needed? Is ForEach with a Break better? -> It's nice for performance.

X	Fix CollisionTrace.
X		execCollisionTrace
X		Test CollisionTrace for the behind-view.
X	Eliminated CollisionTrace.

+	ULevel::SetState: Don't send BeginPlay messages or other stuff if already up for play?
+	Eliminate UnrealScript CollisionTrace intrinsic.

+	Trace: optional vector Extent
+	TraceActors: optional vector Extent

+	Check out steve's t3d: unrdm1.t3d

====0.867o
+	STEVE: I no longer need sizeof(AScriptedPawn)==sizeof(APawn), so feel free to go back to
+		sticking variables in AScriptedPawn.
+	If I were smart I would eliminate remembered-actors reconciliation!
+	UnrealEd Double clicking on state combo doesn't advance.
X	MoveActor take optional rotation for optimization. -> Separating these two things is nicer.
+	Add collision extent to Trace.

+	SpawnActor templates are no longer supported: Too problematic.
+	Audio.
+	Gracefully handle negative DrawScale.
+	FScreenBound
+	FScreenLocation

+	DrawScaledSprite

+	AMover EncroachingOn
+	function bool EncroachingOn( actor Other );
+	function EncroachedBy( actor Other );
+	Fixed BoxCheck owner problem

///////////////////////////////////////////////////////////////////
6-12-97

====0.867p
+	InterpolationPoint.
?	Illegal span range errors.
+	Delete key is back in.
+	Vital for E3.
+		bInterpolating.
+		Rotation or not depeding on physics.
+		bDirectional.
+		Option to do rate by RateModifier.
+		Flyby support.
+	Bogus script warning when GotoState with no state.
+	James logging owner.rotation.pitch / yaw / roll bug. Non-bug.

///////////////////////////////////////////////////////////////////
6-13-97

====0.867q
+	Event lines are back in UnrealEd.
+	Ship1c import bug. Brush is screwed up beyond repair.
+	Movers no longer take the shortest rotation path between their
+		keyframes. They follow the rotation you specified in UnrealEd, including
+		windings.

+	Return values aren't copied out of intrinsics.
+	Calling UnrealScript from C++ doesn't handle return values.
+	Undo textures isn't synched with rebuild.

+	Copy Inv.u InvCalcView1 to InvCalcView1.
+	NOTE TO SELF: Never ever ever store redundent information that must be maintained.

+	SinglePointCheck
+	CheckEncroachment

///////////////////////////////////////////////////////////////////
6-14-97

	Steven: Notable changes...
	* Pawn.u: Trigger and Untrigger now take an Instigator parameter (the compiler catches this).
	* UnLevel.h: MoveActor now takes NewRotation. Use Actor->Rotation for no rotation.

====0.867r
+	Trigger messages need an instigator.
+	Mover EncroachDamage.
+	Fixed that DirectDraw problem!
+	Test all mover reverse cases.
+	Mover encroach damage.
+	Added new NewRotation parameter to MoveActor. Just use Actor->Rotation to not rotate.
+	Eliminated RotateActor.

====0.867s
+	New UnrealEd progress bar & status bar - should be more stable.
+	Changed compile shortcut keys to be in line with VC++/VJ++.

+	BeginSlowTask
+	Fixed up d3d code.
+	Proper spawn tag!

X	Input system keeps keys held on overflow?
X		Test ResetInput. These seem to be weapon bugs.
X	3dfx backfaced masked polys like skaarj dreads are backface rejected. -> Mesh not set up for masking.
X	Way to make a moving brush into a zone?
X	Properly interleave timers with animation and movement?

///////////////////////////////////////////////////////////////////
6-15-97

====0.867t
+	Fixed bug in probes - probe functions aren't reenabled properly when you are in a
+		state but the probe function is global.
+	Added cool new triggerable light class!
+	Actor InterpolateEnd.
+	Should be able to duplicate moving brushes.
+	Slave movers.
X	MouseLook with triggerpaths.
+	NF_TagForEmpty change.
+	Encroaching problems? Test3.
X	Little animation interpolation problems with weapon - James noweeninto?

+	Fix moving brush sounds.
+	UnrealEd scrolls line out of view.

====0.867u
+	Fixed windows asynchronous keyboard input problem! Controls are much better!
+	GetKeyboardState

====0.867v
+	3dfx status bar died.
+	Everyone's maps.

///////////////////////////////////////////////////////////////////
6-16-97

====0.867w
+	Fixed moving brush ambient moving sound not stopping.
+	REND CURVY toggles curved surface rendering.

====0.867x
+	3dfx texture panning.
+	Improved software-rendering mipmap smoothing.
+	Augh.unr - lighting bug with invisible collision brushes.
+	Light <-> Convex volume association via portal clipping.

+	In 3dfx fullscreen when you press the stupid windows key you lose control.
+	Spline pathing.

///////////////////////////////////////////////////////////////////
6-17-97

====0.867y
+	Quick optimizations.
+	FindSpot = slooow!
+	FCollisionHash::PointCheck was ignoring bActors.
+	Hash objs by name & type.
+	Added "SERVER RESTART" command.
+	Bind.mac defaults.
+	Caps lock toggles mouse look.

+	bRestartLevel
+	ObjectHashOf

+	Actor spawning slowness?
+	Fixed MergeNearPoints error.

///////////////////////////////////////////////////////////////////
6-18-97

====0.867z
+	Slap in the hud.

====0.868a
+	Restart-the-level option!
+	UObject::Kill problems on exit.
+	Test restarting.
+	Test load game and save game.

====0.868b
+	Improve object hashing - no need for FObjectHashLink class.
+	InitObject
+	AddObject

+	Running "unreal -hard" now starts up in hardware 3d.
+	Wavy use fake sinus-panning on 3d hardware.
+	Add mesh interpolation toggle. REND SET CURVY=1
+	bFire held when mouse firing?
+	DE: Detail textures.
+	Jitter problem when using both keyboard and mouse.
+	Set up textures so DE can start experimenting with detail textures!
X	Work out all actor naming issues, ability to rename individual actors in UnrealEd.

+	Also, I noticed that the 'autosave' feature pops up when Unrealed is out of
+	focus. Autosave is soo annoying at the moment, that I mostly disable it
+	from the start... 

+	Mesh viewer rotate.

///////////////////////////////////////////////////////////////////

+	E3
+	We kicked ass
+	Our major competition is Quake 2
+	The other 3d first-person games are pretty weak

///////////////////////////////////////////////////////////////////
6-23-97

====0.868c
X	Compiler speed is limited by property and UClass lookups! Duh!
X		Could include 16*2 property hash entries in class for 16x faster prop lookup.
X		Can hash resources by name/type.

+	Scripted texture class: 1 day.
+		Database, texture, Palette scripts.
+		Successful recompilation using UTexture.

====0.868d
+	Texture system extension & dll interface.
+		UnFire.dll.
+		Fixed base bugs in MoveActor - was failing to activate triggers.
+		Cleaned up unnecessary DeclareClass.
+		Update install scripts.

====0.868e
+		Eliminated outdated IMPLEMENTATION_API.
+		Eliminated UNGAME_API.
+		Update install scripts to eliminate UnGame.
+		Set bIsPlayer is set at spawn time when spawning a camera actor.
+		PlayerStarts now properly spawn actors with their rotation.
+		Eliminated UnGame.dll entirely.
+		AActor bEdLocked indicates locking.

	NOTE: Architectural change.

	I have eliminated the game-specific DLL, UnGame.dll, entirely. Its functionality is
	superceded by the Unreal plug-in DLL interface which supports dynamically loading DLL's
	at runtime. This is more general than the old statically-linked UnGame.dll approach.

	FCameraConsole has been replaced with UCameraConsole. If you need to add functionality,
	you should subclass UCameraConsole in a plug-in DLL.

	Don't always redraw status.

====0.868f
+	Dynamic textures + DLL interface.
+		Cleaned up editor clicking interface.
+		Camera now contains MouseX, MouseY (relative to X,Y).

====0.868g
+	Dynamic textures + DLL interface.
+		Virtualize the important texture functions: Lock, Unlock.
+		Properly scaled texture viewer in UnrealEd.
+		Texture browser must show textures in UTexture subclasses.

+		New texture show subclass popup.
+		Prevent unnecessary texture data serialization for fire textures with TF_Parametric.
+		Implement TEXTURE NEW NAME= CLASS= USIZE= VSIZE=
+		Document the texture import options and things in Tex.mac.

====0.868h
+	UnrealScript structs.
+		CPT_StructDef.
+		CPT_Struct.
+		UStruct class.
+		Basic UStruct implementation.
+		Base UClass on UStruct.
+		Test rebuild.
+		Retest the suites.

====0.868i
+	Updated FPropertyIterator.
+	Updated SerializeBin.

///////////////////////////////////////////////////////////////////
6-24-97

====0.868j
+	Structure support: 1 day.
+	UnrealScript structs.
+		Expand UStruct implementation.
+		Test rebuild.

====0.868k
+	Struct compiling.
+		UnrealScript "struct" command.
+		Properly handle CPT_StructDef everywhere.
+		Stub CPT_Struct.

====0.868m
+	Struct compiling.
+		Compile simple struct definitions.
+		Compile struct definitions with inheretance.
+		Test all struct compiler error messages.
+		Test sizeof with structs.
+		Eliminated "sizeof" from UnrealScript: it has no purpose in this kind of language.
+		UStruct needs a defining UBuffer ScriptText solely for doc purposes.
+		When creating a UStruct, set its ScriptText.
+		Test rebuild.

====0.868n
+		Eliminated unused Private keyword.
+		Cleaned up undefined autoconversion problem.
+		Test accessing "unknown member x in struct y".

====0.868o
+		Flipped array access bytecodes.
+			Test decompile array access.
+			Retest the suites.
+		Structs of arrays, arrays of structs.

====0.868p
+	Base struct definitions.
+	Export C++ headers containing structs.
+	Scripted UPrimitive, UModel.

+	Extended engine structs.
+		Plane
+		Color
+		Coords
+		Scale
+		Surface

====0.868q
+	Clean up IsStaticBrush, IsMovingBrush.
+	Test.t3d: Fixed struct serialization bug.
+	Retest movers.

====0.868r
+	New: After loading a map, all the VB windows get hosed.
+	Unmaximizing then maximizing screws up views.

///////////////////////////////////////////////////////////////////
6-25-97

+	Struct decompiling.
+		Struct decompiler handle struct access, even recursive, with arrays.
+		Decompile bitflags in structs.
+		Struct decompiler handle enum definitions.
+		Struct decompiler handle struct definitions with inheretance.

====0.868s
+	Update suites to test structs.
+		Test arrays in structs.
+		Test arrays of structs.
+		Test arrays of structs of arrays of structs from hell.
+		Test bitflags in struct.

+	Fixed ArrayCount: was problem with SkipStatements parsing constants.
+	Allow ==, != on arbitrary structs using memcmp.
+	Proper type checking of structs.

====0.868t
+	UnrealScript database support.
+		Break up FProperty into FPropertyBase and FProperty.
+		Added UnType.h.

====0.868u
+		UDatabase stores a FPropertyBase with it.
+		Retest Matches.

====0.868u
+		Eliminate UWords, replace with UInts. vertlinks
X		Improve database autoregistration by specifying an optional in-FPropertyBase.
+		Fixed bugs in Counter (hadn't been updated!)

====0.868v
+		UnrealScript "Contains" command for specifying database element type.
+		Make sure GetVarType never accepts any parameters that are meaningless in the context.

====0.868w
+	Cleaned up all of the class names and .u filenames.
+	Cleaned up the explosion classes, renamed to Effects.

====0.868x
+	Database intrinsics.
+		Added ReachSpecs class.
+		Database[item] syntax for accessing database items from UnrealScript.
+		UnrealScript make package specifier mandatory.

///////////////////////////////////////////////////////////////////
6-26-97

====0.868y
+	Databases of structs.
+		EX_DatabaseItem + Object expr + Index expr.
+		Compile EX_StructOffset + bOffset + Expr.
+		Execute EX_StructOffset.
+		Decompile EX_StructOffset.
+		Separate checking of def variables and regular variables.
+		Way of making database elements intrinsic (non-saveable) via "contains intrinsic xxx".
+		Way of making database elements const via "contains const xxx".
+	Enable accessing struct members through non-variables (with no offset folding).

====0.868z
+	Make Vector, Rotation into structs.

X	General improvements.
X		FProperty DocOffset for javadoc style stuff.
X		/** Javadoc style comments go here.
X		Show Javadoc style comments in UnrealEd.
X		Maybe later.

X	UnrealEd color picker: rgb, hsv via struct. No. Impacts the existing levels.
X	UnrealEd surface editor via struct. No longer needed.
X	UnrealEd scale editor. Not needed for now.

+	Hardcode the vector and rotation autoconversions.

====0.869a
X	Const structs. -> Nice for Unreal2 with more advanced datatypes - save it for later.
X		EX_StructConst + bSize + data.
X		Generalized constant structs using syntax Vector(0,0,0).
X		Special handling of const and non-struct compositions?
X		Decompile struct consts properly.
X		Support const struct initializers.
X		Eliminate Vect(), Rot() - replace with Vector(), Rotation().
X		Allow initializers in locals, i.e.: local int i=j+2;
X		Allow declaring local variables in code, i.e.:
X			for( local int i=0; i<100; i++ )

///////////////////////////////////////////////////////////////////
6-27-97

====0.869b
+	Properly handle CPT_Struct everywhere.
X		Problems with dangling actor references in structs? -> Don't use actor refs in structs.
+		Fixed .t3d array exporting bug.
+		Export structs in .t3d's.
+		Updated UnrealEd property editing.
+		Minimize special case import/export vectors.
+		ExportActorProperties with structs.
+		ImportActorProperties with structs.
+		Struct property importing.
+		Struct property skipping.

====0.869c
+	Fixed up zone problem importing actors.
+	Cleanup in preparation brush list merge.

====0.869d
+	Fixed script compiler category bug.
+	Added bEditorOnly to AActor.

///////////////////////////////////////////////////////////////////

====0.869e
+	UPlayer           UnPlayer.h  UnPlayer.cpp  A local or remote player.
+		UCamera       UnCamera.h  UnCamera.cpp  A local player.
+		UNetPlayer    UnNetPly.h  UnNetPly.cpp  A net player.

+	FSocket           UnSock.h                  Base class of unreliable communication sockets.
+		FWinSocket    UnWnSock.h UnWnSock.cpp   A Winsock socket.

+	FNetDriverBase    UnNetDrv.h                Network driver base class.
+	   FNetDriverWsck UnWnSock.h UnWnSock.cpp   Winsock network driver. 

+	FChannel          UnChan.h   UnChan.cpp     A generic datachannel residing in a socket.
+	   FTextChannel   UnChan.h   UnChan.cpp     A text datachannel.
+	   FActorChannel  UnChan.h   UnChan.cpp     An actor datachannel.

+	Network R&D.
+		UPlayer base class of UCamera and UNetPlayer.
+		Eliminate UCamera reference in Actor class, replace with UPlayer only.
+		Add UNetPlayer infrastructure.

+	Low-level WinSock support.
+	Sockets.
+	Bunches.
+	Network driver.
+	Simple hooks into ULevel.
+	First seeds of multilevel client and server.
+	Simplistic connection logic.
+	server message s="" command.
+	Bunch archiving.

+	Working but totally hacked netplay. Cool.
///////////////////////////////////////////////////////////////////
7-1-97

+	UnrealScript support for replication defs.
+		Eliminated AllPropertyFlags.
+		NAME_Replication, NAME_Reliable, NAME_Unreliable.
+		CPF_Net, CPF_NetReliable
+		FProperty WORD RepOffset into property's actual class's script.
+		Done!

+	Clean up the new net headers.
+	Intelligent replication handling in net code.
+		Replicate all relevent properties (display).
+			Without expr's.
+			Fast UnrealScript expr evaluator.
+		Replicate only changed, relevent properties.

+	Moved FCameraConsole::PostReadInput to script. (NAME_PlayerInput)
+	Eliminated APawn::inputCopyFrom.
+	Eliminate PPlayerTick.
+	Script compiler "Control" support just like "Server".
+	UPlayer bAdmin.
+	UPlayer script.
+	Make the input booleans into bytes.
+	CPF_Input, NAME_Input.
+	Eliminate EButtons, EAxes.
+	Direct-map the input to actor properties.
+	Update Bind.mac.
+	NAME_Control.
+	Input system "Control" vs. "Server".

///////////////////////////////////////////////////////////////////

====0.869f
+	Merge with Steven and James.
+		Pawn input boolean changes, input functions, etc.
+		Rotation changes.
+		James found bug: When spawn actor, Begin: label wasn't called till next tick.
+		Fixed some tick bugs.
+		Merged.

====0.869g
+	FSocket Poll function.
+	Tick the network driver only when level is locked (UnLevTic).
+	FSocket Poll function perform timeout checking and autodestruction.
+	Test DestroyActor for pawns hooked up to players.
+	FSocket QWORD LastReceiveTime.
+	bInternet.
+	Verify proper UPlayer, UChannel destruction upon socket closing.
X	Getting duplicate anim notifies? -> user error, was accumulating #alwaysexec notifys.
+	Socket timeout handling.

====0.869h
+	Show paths option in UnrealEd. Neato.
+	DestroyActor needs hooks to close the destroyed actors' channel.
+	FChannel sendack.
+	FChannel ack receiving with retirement.
+	Server flush each player socket after each tick, client do same; no hardcoded flush.
+	request resend after timeout waiting for ack.
+	cleaned up acknowledgement code
+	reliable sequencing is enforced
+	intermixed sequenced unreliables with reliables
+	queuing of dependent packets (InRec)
+	If receiver gets out of sequence stuff should send nak

///////////////////////////////////////////////////////////////////
7-4-97

====0.869i
+	Actor and Pawn replication defs.
+	Closing client while connected to server crashes client.
+	Server poll update UCHAN_Closing and destroy when finally closed.
+	Sockets cmd show channel states.
+	Handle acked closes.
+	Always save space so there's room to send a close packet.
+	Handle close-ack lost (timeout).
+	Acked, reliable, queued channel closing via CHTYPE_Close.
+	Properly handle actor channel closes.

====0.869j
+	Actor->GetClass()==TempClass bug.

+	Problem with channels being recycled then data arriving for them from the wrong place.
+	Solution: Don't recycle sequence numbers, and bump them so that they're guaranteed not
+		to coincide.

///////////////////////////////////////////////////////////////////

====0.869k
+	Merged with Steven. #*($&#$
+	-dedicated 
+	When dedicated, update GLevel.
X	When dedicated, immediately turnaround the client data when get a client packet.
X		Tick rate is so fast this isn't really necessary.
+	Level tick time updates wrong.

====0.869m
+	Server recognize that client closing channel 0 means he's leaving.
+	Client exit the game gracefully by closing socket + all channels.
+	Client recognize server closing channel 0 (no 'unexpected close notify').
+	Client recognize server shutting down.

====0.869n
+	Serialize array elements.
+	Closing server while running gives error.
+	Simple serialize all types.

====0.869o
+	Client must know what actor he's controlling (hacked).
+	Client controls - make them work (hacked).
+	Client must kill off all local, nonstatic actors.
+	Bizarre rotation scaling: Rotation vs ViewRotation problem?

///////////////////////////////////////////////////////////////////
7-6-97

====0.869p
+	Unreal packages.
+		Cleanup class definitions.
+		Cleaned UnrealEd references to "package".
+		Don't allocate class resources until packaging is specified.
+		Don't assume class dependencies exist.
+		Packagename should be a property of UObject, not UClass.

====0.869q
+	Package cleanup.
+		TestLev -> MyLevel.
+		Fixed crash on exit bug.
+		Retest rebuild root.
+		Retest import level.

///////////////////////////////////////////////////////////////////
7-7-97

====0.869r
+	Eliminate Unreal.gfx
+		USubsystem
+		GetDefaultObject
+		UEditor become a USubsystem.
+		GEditor init set FScan vftable.
+		Create and destroy UEditor as an object.
+		Creating an object should copy the default bins.
X		Statically link to UnEditor.dll via UnEditor.ucx. -> Then can't bootstrap.
+		Eliminate EditorArray.
+		GTrans -> GEditor.Trans.
+		UEditor auto garbage-collect subobjects. BUGS!
+		Move all editor objects from GGfx to UEditor.
+	Spawn(class var) problem - doesn't recognize that class is aactor.

====0.869s
+	Package cleanup.
+		UnrealEd "Create New Class Below" prompt for package, default to level pkg.
+	Bug returning values in foreach.
+	If/foreach nesting compiler problems.
+	UnrealEd duplicate-actors should spawn even if not fittable.

///////////////////////////////////////////////////////////////////

====0.869t
+	TriggerLights:
+		Add delay-then-turn-on option.
+		Verify that change-time is in seconds.

====0.869u
+	Set up bNetOwner properly.
+	Get multiple players in using bNetOwner hack.
+	Clients don't perceive each other properly because server doesn't use bNetOwner.
X	Get line of sight lined up with bIsPlayer.

====0.869v
+	Eliminated that unused TickRate, TickCounter stuff.
+	Server should not tick clients who have client controls.
+	Server should not do physics on clients who have bClientControl.
+	Get serverside controls working.
+		Client needs to do its own deltatime scaling before sending.
+	bStatic / collision hash problems persist.
+	Server should own and set bClientControl.
+	Actor class needs bNetOwner culling.
+	Need proper ViewRotation coordination.

+	AActor accessors for network responsibility.
+	Cleaned up rendering shade quality.

///////////////////////////////////////////////////////////////////
7-9-97

====0.869w
+	Merge with Steven, including my Pawn changes.
+	Replaced net bools with ENetRole.
+	Get single player working again.

====0.869x
+	C++ calling into script, skip out if not appropriate in the net mode.
+	BecomeClient, BecomeServer, SetState: Role, NetRole.

///////////////////////////////////////////////////////////////////

====0.870a
+	Must downgrade RemoteRole to ROLE_DumbProxy for non-owning remote clients.
+	Client is incorrectly doing physics for other players.
+	Eliminate bEdSnap trick and use Role instead.
+	"BehindView" cheat should be a server command -> others too?

+	Coordinate with Steven.
+		Make Human abstract (that's the problem with mesh sizing).
X		Can pawns purely derive Rotation from ViewRotation for easier net coordination?
X		Packetization problem with using way-overclamped acceleration
X			Maybe script should accumulate unused input portion? Messy.
X			Maybe phrase input as movements not velocities? Then scaling problem falls out.
+	Fix eyeheights.
+	UPlayer bLoggedIn.

+	Handle CPT_ObjectReference with actors.

///////////////////////////////////////////////////////////////////
7-11-97

+	Cleanup channel handling.
+	Move the inventory with the player.
+	Get net weapons rendering.
+	Weapon switching.
+	EyeHeight, BaseEyeHeight replication. Fix net eyeheights.

+	After a while, client->server updates start getting lost. Sequence wraparound.
+	Retest all-reliable.
+	Make sure nak works!
+	Retest lossy all-reliable.

+	Weapon rendering?

====0.870b
+	bBehindView.
+	bOnlyOwnerSee.

+	Movement:
+		Server must do MoveActor on client location/rotation changes.
+		AActor::GetViewRotation.
+		Set the client zone.
+		Do MoveActor with bNoFail.
+		MoveActor needs bNoFail, to only do messaging (including Bump).
		Before firing, weapons must copy the owning pawn's ViewRotation.

+	Before begin compiling a class, remote its replication defs.

+	Don't out-rep properties if Role<ROLE_AutonomousProxy.
+	When receive properties, copy them back to stored-value to prevent feedback.
X	Should be able to auto-update client proxy location/velocity on the server side.

====0.870c
X	Test multiple client UCameras - this should work, right?
X		Map the possessions?

///////////////////////////////////////////////////////////////////
7-12-97

+	URL parsing class.
+	url sample
+		http://tim.team:password@www.epicgames.com:666/mapname!opt1!opt2

+	Eliminate dead weight
+		unkeyval.cpp FKeyValues
+		unparse.cpp FParse
+		UnPrefer.cpp FPreferences
+		unconfig.cpp FKeyValues
+		unwnpref.cpp
+		unwnprop.cpp
+		unwnaudd.cpp

+	Eliminated Unreal.exe, use Unreal.bat instead.
+	Renamed UnServer.exe to Unreal.exe.
+	Killed outdated UnrInfo project.

+	Replaced the tons of checkWhatever and debugWhatever macros with just two,
+	check and debug.

+	Clean up the platform specific code.
+	Rewrote all profile code - much cleaner! Yee-ha!
+	Kill Default.ini

====0.870d
+	Replace QWORD time functions with cleaner DOUBLE time in seconds. No qpc stuff. Fast.
+	New GSeconds().
+	Still need GCycles?

====0.870e
+	Research ATL.
+		Maybe just scrap all the COM crap and use a plain, simple DLL.
+		atl.dll = 18K!
+		Convoluted mess of COM objects.
+	Conclusions:
+		MFC is an terribly bulky overcomplicated mess.
+		ATL is a smaller overcomplicated mess.
+		Downside of using MFC or ATL:
+			Debugging nightmare.
+			Difficulty isolating microsoft bugs.
+			Explosion in distribution size.
+		Benefits:
+			Can't really think of any.
+		Use DLL interface for UnrealEd.
+		Get speed benefit of in-process objects.

///////////////////////////////////////////////////////////////////
7-13-97

	"The advancements in 'Prey' don't just raise the bar for 
	first-person 3D action games, they destroy it," said Richard Burns, executive 
	vice president, Domestic Publishing for GT Interactive. "The paradigm for this 
	game genre will be forever altered as we believe 'Prey' sets a standard that is 
	well beyond what is currently available." 

====0.870f
+	Eliminated GDefaults.
+	Restart-level fixed.
+	Saving & reloading a level loses some zone associations.
+	Eliminate GetDynamic, SetDynamic so that Leaf numbers can be added to the Bsp.
+	Bsp now stores leaf list!
+	Moving brushes now support leaves properly (just like zones).
+	UModel::PotentiallyVisible.
+	Fixed v-light not rendering bug.

+	New Region struct, replaces Zone.
+	Notes for Steven:
+		Your HeadZoneChange and FootZoneChange code had a bug: it called UObject::Process
+		on the ULevel object instead of the APawn object.
+		Can you check out the updated SetActorZone & findWaterLine code to see if I screwed anything up?

///////////////////////////////////////////////////////////////////
7-15-97

====0.870g
X	Trace- missing the bottom half of cyll? Can't duple.
+	Setup Bsp leaf data structures.
+	Build leaf-list.
+	Build permeating light list.
+	Permeating light distance reject.
+	AActor volumetry stamp.

+	InvCalcView: No parms.
+	Fixed weapon disjoint starting frame problem.
+	Are projectiles going through movers? -> No. I use bCollideWorld for moves.
+		I'm pretty sure this is working properly now.
+	Fixed new renderbound problem with movers.
+	Password dialog.

///////////////////////////////////////////////////////////////////
7-16-97

====0.870h
+	Not rendering weapons for autonomous client proxies...
+	Must coordinate the LevelInfo actor properly.
X	Windows recognize standard unreal prefix.
+	Ignore open requests on all channels till channel 0 is open.
+	FNetworkNotify base class.
+		NotifyAcceptingSocket.
+	FActorChannel needs level!

+	URL's need teleporter-dest-name support.
+	Base connect on URL's.
+	Perform async nameserver lookup for pending connect sockets.
+	UnWnSock.cpp: Finalize the code.
+	Don't allow flushing packets while pending with unbound address!
+		Must poll for state changes.
+	FSocket needs a CurrentURL, for both client and server; display it.
+	NotifyAcceptedSocket set the URL.
+	Handle connect-attempt timeout.

+	Handle external URL's like the web in Open.

///////////////////////////////////////////////////////////////////

====0.870i
+	FootZone problems?
+	Eliminate Broadcast.
+	Eliminated Object "message" function, now only in pawn.
+	Changed Message to ClientMessage.
+	Added new RPC-style client functions to Pawn.
+	SNODE_NetFunc
+	SNODE_NetReliableFunc
+	INT RepOffset
+	Init stack node flags when compile.
+	Replicaton defs can also specify UnrealScript functions and their conditions.
+	Only allow specifying replication defs for stack nodes in this class.
+	Client sound hearing via ClientHearSound.
+	ClientMessage for messaging.
+	ROLE_None to indicate no network play.

====0.870j
+	ClientLinkToURL for level jumping.
+		Steve: Note: I modified the Teleporter Touch function, you need to merge it.

///////////////////////////////////////////////////////////////////
7-19-97

+	Added a ton of new trigger modes.

///////////////////////////////////////////////////////////////////
7-20-97

====0.870k
+	File fmt & packages.
+		FindObject.
+		CreateObject.
+		MakeUniqueObjectName.
+		Set class's script text's package.
+		Class importing.
+		Don't allow creating objects with package=NAME_None.
+		Obj List Package=packagename.
+		Rebuild root with proper packaging.
+		Retest creating new classes.
+		Test deleting classes.
+		UTextBuffer::Empty, add trailing zero.
+		TextTopicHandler::Set
+		GetOBJ & friends support packages.
+		Moved Group name to UObject, for convenience.
+		Music & Sound import - need package name (unedmus,unedsnd).

====0.870m
+		UTexture LastTimeSeconds.
+		Created sample plug-in DLL with example of a (lame) parametric texture.

///////////////////////////////////////////////////////////////////
7-21-97

+	AActor::Process generic StackNode RPC hooks.
+	NAME_RPC
+	RPC functions work.
+	class FStackNodePtr FindFunction(FName Name);
+	FStackNode::FunctionIsRemote
+	Super-optimized Process, which wasn't using vf hashing (big speedup for touch, bump, etc).
+	FindFunction( FName Name ) use vfhash.
+	Merge most execVirtualFunction, execFinalFunction logic into CallFunction.
+	CallFunction RPC support.
+	Is there a way to merge Process and CallFunction RPC parsing logic?
+	Make final functions work with RPC.
+	Note that intrinsics can't be replicated to to C++ execution-side parsing logic.
+	NAME_RemoteCall, NAME_RemoteReply
+	Eliminate UNetPlayer::Write.
X	Changing the role should first flush all actor properties? They won't matter.
+	Prototype player death & reincarnating. -> Steve animation bug.

///////////////////////////////////////////////////////////////////
7-22-97

====0.870n
+	FarMoveActor: made SetActorZone calls safe.
+	Replaced PlayerEntered, PlayerLeaving (zone) with ActorEntered, ActorLeaving.
+	SetActorZone problems in netplay.
+	Can't spawn actors during gameplay with bStatic=true or bNoDelete=true!
+	Fixed script compiler losing non-editable property defaults after recompile.
+	Can't kill off hardcoded actors like zoneinfo's and the levelinfo, since they must
+		be coordinated in netplay.

+	Move level tick from CUnrealWnApp::MessagePump to GUnreal.
+	Recompile & retest.

+	Eliminated ULevel::SetState and ELevelState!
+	Now use bBegunPlay to determine whether beginplay messaging has been performed.
+	Kill CUnrealServer; can use command line for Gatekeeper more easily.
+	Rebuild root.
X	GScriptCompiler? CheckScripts?
+	ULevel::Tick, simplify the first parameter (use enum).

+	CPF_Profile variable, for automatic subsystem profiles.

+	Make UGameEngine and UEditorEngine into subclasses of UEngine, and have them set up in 
+	an either-or fashion:

X	Way of creating static, autoregistered objects in the same way that static class
X		objects are created, in order to solve the "bootstrap problem" with UEngine.
X		This will be easy to do if it is needed...

+	Merge UEditorEngine:: Init and LoadClasses.

+	Use GCameraManager to indicate presence of client; GEditor for editor; GEngine for
+	server. Then the UEngine flags are not needed at all.

+	Editor exit must call engine exit.
+	Use ::Draw consistently between game and editor, no edcamDraw.

====0.870o
+	Eliminate GLevel:
+		Add UEngine to root.
+		Fixed FCameraManagerBase::UpdateActorUsers problem with global levels.

///////////////////////////////////////////////////////////////////
7-23-91

+	UnEngine.h / UnEngine.cpp / UEngine       -- The engine base class.
+	UnGame.h   / UnGame.cpp   / UGameEngine   -- The game subclass.
+	UnEditor.h / UnEditor.cpp / UEditorEngine -- The editor subclass.

+	Weird gc problem in EnterWorld if not AddToRoot(Level). -> Because UGameEngine class def isn't loaded.
+	Creating new level messes up the texture browser window.

====0.870p
+	Changed GCameraManager -> GClient.
+	When running as dedicated server, don't create GClient; don't check "DED" elsewhere.

+	Cleanup the high level engine headers & .cpp files.
+	Must instance GBrushTracker per level just like the collision hash.
+		ULevel::PreKill
+		ULevel::Lock
+		BrushTracker

///////////////////////////////////////////////////////////////////

====0.870q
+	Cleaned up actor reconciliation.
+	Cleaned up coordinate system usage for mesh rendering.

====0.870r
+	Show player weapons.
+		Flag is MT_Placeholder.
+		Merged with James.
+		Weapon placement.

+	Dynamic textures.
+		UnrealEd texture properties use actor properties dialog.
+		Make sure undo works with editing texture properties.
+		Allow editing & updating texture properties.
+		"Browse" and "Use current" palette should use texture browser.
+		Made some neato dpaint palettes.
+		"New Texture" user interface -> Query Texture subclasses.
+		Editable texture booleans.

+	Cleaned up UnrealEd input interface.

///////////////////////////////////////////////////////////////////
7-25-97

====0.870s
+	FireEngine support.
+	Deal with Myscha bullshit.
	
///////////////////////////////////////////////////////////////////
7-26-97

====0.870t
+	Make sparks types into an enum (C + script)
+	RenderHeat editable.
+	Mouse cursor & drawing interface.
X	James' AutoPlay.unr map bug with ClientMessage.

+	FireParamStruc   -> UFireTexture
+	WaterParamStruc  -> UWaterTexture
+	Get all fractal texture types simply implemented.
+	Eliminate redundent UFractalTexture variables.
+	Eliminate AnimType.

+	UTexture::Clear
+	Eliminate BitmapAddr
+	Fire texture loading and saving.
+	Eliminate UnfEditParams

+	Water cursor positioning.
+	UTexture ::Process PostEditChange should assure that the palette is valid; work.
+	Renderheat.
+	Eliminate Xmask, Ymask, redundent variables.

///////////////////////////////////////////////////////////////////
7-27-97

====0.870u
+	UnrealEd.
+		NewTexture don't show abstract classes
+		Default to 256x256.
+		UnrealEd after creating a texture, bring up tex ed.
+		Default to name "MyTex".
+		Each time a new texture is created, make a new name.
+		Tex ed needs a "Clear" button that calls init.

+	Initial water shading
+	ParamA, ParamB from defaults.
+	Water and other texture loading and saving.
+		Water wave light setttings.
+		Proper memory management with water.
+	Fixed UClass::export problem with structs.

///////////////////////////////////////////////////////////////////
7-28-97

+	Merge with Steven.
+	Server guy respawning loses control.
+	Client doesn't see behindview mesh when self die.
+	Need to flush an actor's vars before calling rpc? Yes, that syncs everything wonderfully.
+	Client die and respawn doesn't do ClientSetLocation.
+	Client respawn doesn't seem to reset ViewRotation.
+	UnrealEd cameras default to dynamic lighting.

====0.870v
+	GSceneMem.
+	Retest shadowing.
+	Remove dependence on Camera->Level in rendering.
+	New FRender data structures.
+	UCamera NearClip variable (meaningful if W!=0).
+	Test near-clipping.
+	Test WarpZoneInfo recognition.

+	MirrorByVector, MirrorByPlane with FVectors, FPlane.
+	Update UCamera::PrecomputeRenderInfo
+	Proper near-clipping.
+	Mesh mirroring.
+	Don't exclude player from far frames.
+	FSceneFrame::Mirrored.
+	PF_Mirror
+	Proper multiwarpzone rendering.
+	Enforce recursion limit.

+	Texture panning per *zone*.
+	Call WarpZone Generate at render time.
+	Handle backfaced.
+	Mirrors.
+	Handle NCP.
+	DrawLevel
+	DrawWorld.
+	Proper surface-based warpzoneinfo teleporting.

///////////////////////////////////////////////////////////////////
7-29-97

====0.870w
X	Instead of Server/Control/Local commands, use RPC?
+		When create new texture, create a palette if necessary.

+		Palette merging only operate within the same package.
+		Eliminated possession commands for simplicity.

+		SpawnViewActor no-fail.
+		Remove Possess/UnPossess code, implement in SpawnPlayActor.
+		Implement initial possession in UnrealScript.
+		Move all significant SpawnPlayActor code to script.
X		PLogin modifications.
X		PLogin SpawnClass optional.

+		Check all SpawnPlayActor gates.
X		Eliminate NotifyAcceptingSocket, NotifyAcceptedSocket and use NotifyAcceptingChannel hooks instead.
+		Handle case where viewer-player is inside a warp zone.
+		New, enhanced scene-frame management code.

====0.870x
+	Define URender subsystem.
+	Convert all BYTE/WORD/INT color usage to FColor.
+	Zooming in 2X on fractal textures makes them uneditable.
+	UnEngine: Cylinder
+	Move FGlobalGfx colors to URender.
+	Move FGlobalGfx objects to URender.
+	Eliminate hue table.

///////////////////////////////////////////////////////////////////
7-30-97

====0.870y
+	Unrealscript bug accessing Default booleans.
+	Investigate root rebuild warnings
+	UnrealScript Spawn with class gives compile error. -> This is correct, it just assumes the spawned thing is an Actor.
+	Linetrace - move hit location out slightly to fix numerical precision errors
+	Anim loop with 1-frame.

====0.870z
+	Why is audio code blowing up now? WTHK.
+	Class RF_Modified

+	FireEngine on 3dfx.

///////////////////////////////////////////////////////////////////
7-31-97

====0.871a
+	Cleaned up animation finishing.
+	Creature lighting.
+	Specular creature lighting.
+	Pulse lighting.

+	Server not communicating bCollideActors, bCollideWorld? Can walk through dead players. Steve's bug.
+	Client can't see lighting on other actors, just self (no SetActorZone?)
+	FLightManager::SetupForActor bug.
+	UnrealEd cmdline props option.

///////////////////////////////////////////////////////////////////
8-1-97

====0.871b
+	Not seeing other player? STEVE: Player bVisible=false after die and come back.
+	Unreal game=GameInfoClassName.
+	Steve: Server name.
+	Now loads d*.dll instead of Un*.dll when debugging.
+	New multiplayer collision hash issues? Was GC problem with Cylinder.

+	Password problem
+	dynamicsAdd bug.
+	fixed audio import bug
+	crashes 3dfx ::DownloadTexture
+	brighten 3dfx creatures
+	moving brush bugs while rebuilding?
+	Import map then file-new kills

///////////////////////////////////////////////////////////////////
8-2-97

====0.871c
+	Duplicating stuff in map edit mode hangs.
+	3dfx sli 2meg barrier problem.
+	New glide problem with 2.4? Inoxx's machine is crap.
+	UnrealScript "CPF_Instance" support, treats as const. CPF_Profile. RF_Instance. EX_LetObject.
+	Mirror not editable bug.
+	UnrealEd load textures, sound load do slow task.
+	Fixed texture panning.

+	Fire tex in existing map don't show up in tex browser.
+	Fixed small mipmap software rendering crashing bug.
+	Now extend mipmap range down to full 1x1.
+	Cliff's two bug maps.
+	Renderer crashing on certain mipmaps.
X	Ambient sounds aren't importing or associating?
+	Fixed 2d editor resizing.
+	Eliminated LostReference capability (a bit speed optimization!)

+	FPerObjectIterator
+	Optimize CleanupDestroyed calling.
+	Merge with Steve and James.
+	Firetexture mipmapping problems.
+	CleanupDestroyed inside structs.
+	void ULevel::CleanupDestroyed()
+	DDraw hwnd already set problem (Inoxx).
+	Inoxx: Is DDraw problem fixed?
+	Cliff: Is ambient sound import problem fixed?
+	CallRemoteFunction bug.
+	Optimize actor destruction via latent garbage collector.
+	Client replication slowness (was due to bandwidth saturation).
+	Test 6 players fire-locked overnight. SUCCESS!

///////////////////////////////////////////////////////////////////
8-3-97

====0.871d
+	LT_SubtlePulse light type 0-100.
+	Weapons are inside-out in mirrors.
+	Mirrors through zones don't work.
X	Cmbdm1.unr bug: FindFunction. Solved by reimporting textures.
+	CleanupDestroyed bForceParm, use when saving games.
+	Balzar import error.
+	Fixed DirectDraw sound interference problems.

///////////////////////////////////////////////////////////////////

Eric:

Your fractal water and fire effects look amazingly cool in Unreal! This is definitely a great proof-of-concept of
algorithmic texture animation in 3D environments.

The modified FireEngine code now interfaces natively to Unreal, and I took the liberty of rearranging your
structures to fit into Unreal's UTexture class (using objects and classes). Overall, this reduces code complexity
because it avoids the switch() statements on AnimType. This framework is very extensible, and you can freely add
new texture classes using my code as an example of how to interface to Unreal. So if you have a great new idea that
requires different data structures, you can just create a new class derived from UFractalTexture. The more you can
learn about Unreal's object-oriented architecture, the better. Especially if you're going to work on Core, understanding
the UObject-derived classes, as well as UnrealScript, is crucial.

There are now two user-interface functions, MousePosition and Click. I hooked all of the existing texture types
into these, but you might want to do more with the new functionality.

This is obviously more work than you originally planned to do on FireEngine for Unreal, but this is an important project and I hope
you have time to continue adding cool stuff through the duration of the project. I'll gladly pay you for the additional time you spend
working on FireEngine beyond what we initially planned. 

Existing effects
----------------

Lightning:
Can you make the lightning editor work so that the user holds the mouse button down (to define the starting point) then moves
the mouse around with the button held, visually dragging the lighting along?

Water:
Can you make the water code maintain internal water data that's the same size as the texture, rather than twice as small?
Pixel-doubling/blurring was only useful when rendering to a bitmap on screen. With Unreal's texture blurring / filtering code, I'd
rather just have a texture that's half the size (to save memory); the visual results are just as good this way.

Techbump textures:
These are cool effects, but I don't expect to get much mileage out of them in Unreal/UnrealEd. The hand-drawn
display textures that Mike and James drew are non-animating, but are really more useful for display panels than
techbumps (which are a bit too abstract to be recognizable). How would you feel about dropping these? I think there
are other effects you can do which are way more impressive.
Note: I did move the UTechTexture code into Unreal so you can experiment with it (it crashes intermittently tho).

Alien display texture:
This looks great on 2D bitmaps, but looks messy when placed on 3D surfaces. The problem is that line-drawing requires 
pixel-perfection, and fast texture mappers add a huge amount of noise, reducing small image details like lines to garbage. 
Your research time on the alien-display stuff was well-spent, but I think the conclusion of the research is "this isn't worth
pursuing", so I'd like to drop this effect. (UAlienTexture is still in the engine though; you can delete it or turn it into
an entirely new class if you want...)

Crashproofing:
I need you to work with FireEngine and make sure that it absolutely never crashes, regardless of UnrealEd and UnrealScript input.
Textures of size 1x1 up to 256x256 must not crash; all possible values that users can cram into the editable/scriptable
variables must be "safe". Note that you can make a variable inaccessible to UnrealScript by declaring it as "const" in the .u
file; that way you can be assured that users can't access the variables and your validation code doesn't need to strict there.
You definitely don't need to make absurd situations produce meaningful output, like fire textures of size 2X2, just make
sure you don't *crash*. For example, validate all parameters before doing your "dangerous" updates, and just skip the
update if something is invalid.

Requests for straightforward new effects
----------------------------------------

Caustics:
How about a speed option on UCausticTexture so they can be slowed down for relatively "calm" water. It would be nice if the 
slow-speed caustics were continuous. Also, if the caustics are totally time-based and regenerated completely each frame,
you should use the DeltaSeconds variable to decide how much time has passed between updates. That way, the UCausticTexture 
animation speed will be independent of Unreal's frame rate.

Firefly-swarm spark type.
How about a firefly-swarm spark type always stays within a circle (of radius USize/2). That way, we can use it for firefly
actors (which Steve already wrote the AI for!) If they are localized, then the fireflys will never wrap around or tile, so
they will look like they're swarming around the origin.

Other spatially-localized sparks:
Any other radius-based spatially localized effects will be cool for effects like fireballs and ball lightning. For example, how about
a "ring of fire" texture with a bunch of sparks that simply orbit the origin at a fixed distance from the origin (when you add one,
it could stay that distance, and rotate around). Then another variation where the sparks follow a curvy path like 
(sin(2*t),cos(3*t)) instead of (sin(t),cos(t)). How about ball-lightning that consists of a large, closed curve consisting of
lighting line segments (sort of like the cheesy Windows screen saver), that rotates around and moves weirdly.

Ideas to research
-----------------

Murky water:
Do you have any thoughts on a "Murky water" effect? It would be nice to have something that looks like murky water with a layer 
of scum floating on top. Perhaps you could use the existing water code to generate the displacements/waves on the water, with some
postprocessing code to make it look like the texture above it is a layer of scum. For example, you could have a "murk" texture with 16 
colors (i.e. various different brown hues) of approximately the same brightness. You could build a 2D "palette" with 16 murk 
colors * 16 shades of lighting, and use the lighting to show the displacements/waves, while using the "murk" texture to simulate
a non-moving coating of scum on the water. If you set up a general framework like this, I think it could work for a wide array of
fluids with stuff floating on top - pond water, lava (with a crust floating on top), oily scum, etc. Note that one (fairly) easy way
to set this up is to create a new texture class like UMurkyWaterTexture that is derived from UWaterTexture. Then you can use all of the 
UWaterTexture functionality and variables, then add in some new variables.

Bump maps:
If you have any ideas about how Markus Stein's Java bumpmap demo works, that would be worth researching for Unreal. That was 
a very cool effect. I'm guessing they have a 4(shade) * 32(brightness) palette for the image, and they regenerate the brightness
dynamically. It would be great if we could support multiple lightsources with this approach (hey if they can do one lightsource in
realtime in JAVA...) Note that you can import greyscale textures into Unreal as bump maps, and Unreal creates a "normal palette" of up
to 256 unique 2D surface normals (which fit into the FColor union), by quantizing the gradients. When importing a texture, just select
the "Import as bump map" checkbox.

To create a fire texture:
1.	In the browser window (the window on the right side of the screen), go to the
	"Texture" tab to see all of the active textures.
2.  Click on the "New" button on the bottom right of the screen to create a new
    texture.
3.  For the texture class, choose "FireTexture", pick any dimensions, for example 256x256.
4.  The new texture you created will now show up on the right side of the screen. Right-click
    on the texture and choose "Edit <texture name> properties...".
5.  Now two new windows open up: A window showing the newly-created texture, and a window
    for editing its properties numerically.

///////////////////////////////////////////////////////////////////
8-4-97

X	Add coord sys commands to UnrealScript? Or just rotation<->coords fucntions in C++.
+	Only one UCamera in gameplay.

+	Teleporting
+		In-level teleporting, even with autonomous proxies.
+		Cross-level teleporting.
X		Cross-server teleporting. -> Needs file fmt improvements.

X	Cross-channel synch issues, especially with yet-unopened channels (like your
X		weapon playing a sound before it has been initially replicated). Could handle
X		this by storing a list of fixup requests per pending channel.

X	Bit flag indicating cross-channel synchronization?
X		Makes channel synch problems much easier.
X		Makes releasing-problems much harder.
X		UChannel::SynchronizeSendWith(UChannel* Other); ?
X		Could auto-expand ReleventActors as needed.

+		How to handle possession (SERVER PN, SERVER PP). ViewTarget for spectating, that's all. -> No longer support possession.
+		Editor default to dynamic light mode

+		Portals
+		Arbitrary portal rotation.
+		Portal parity: required for generalized portal rendering (a huge simplification and generalization!)
+		Rotation to coordinate system conversions.
+			Roll.
+		Walking through arbitrary portal angles.
+		Actor movement thru portals needs to do coordsys transforms.
X		Intrinsic ComputeWarp function. -> Better Warp, UnWarp approach.
+		Client side weapon rendering
+		James clean up DeleteInventory.
+		Dedicated server handle WM_SCREENSAVER, WM_POWER

+	Fixed HWNDALREADYSET problem:
+		DirectDraw works ok when WinMM sound is used
+		but DirectDraw fails to initialize display modes when DirectSound
+		is used?

+	Certain small textures like the status thing (32x32?) crash when low mips are shown.
+	Handle code 8 player-weapon rendering.
+	Enter no longer builds brushes?
+	DestroyActor optimizations by multigarbage collection with load balacing.
+	All 5 possible mover sounds.
+	Some zoneinfo actors disappear & reappear after rebuild.
+	Light diminishes with distance on non-3dfx - with unlit stuff.

+	I've been noticing fairly often that resizing the UnrealEd window tends
+	to crash it with the error that a 'minimized/maximized form cannot be
+	resized'.  Unsure the details on this, but I can check further if you
+	want.  It's fine until resized.

+	Lack of portal tricks like space-warping and transparent floors.
+	3dfx Light brightness equalization.
+		DirectSound focus bug? Augh!

====0.871e
+	Cleaned up LevelInfo.
+	Created ZoneInfo and LevelInfo replication defs
+	Eliminated UnrealScript "Broadcast" command - outdated by foreach.
+	LevelInfo broadcast fucnction.
+	Implemented ServerPause in UnrealScript.

///////////////////////////////////////////////////////////////////
8-5-97

====0.871f
+	Networking.
+		Always bind text channel to FExec.
+		Warning: Only special exec's may be used for FSockets.
X		Way of granting/receiving rconsole rights? Must do this via SERVER commands.
+		Server refusal of clients.
+		Client say so when closed.

====0.871g
+	Net driver (not level) owns player list.
+	ServerSocket -> FNetDriver.
+	Eliminate BecomeClient, BecomeServer.
+	Eliminate IsServer.
+	Merged network driver creation and initial connect; eliminate Connect.

====0.871h
+	Client side death broke. (Was NetPlayer -> NetConnection)
+	ServerSocket -> ServerConnection.

+	Create UNetConnection at incoming-socket creation time.
+	Always link FSocket to connection.
+	Remove linked list of sockets.

====0.871i
+	Eliminate redundent FSocket variables.
+	Merge FSocket into UConnection.
+	Torure test clients leaving server.
+	Torture test server timing out on clients.
+	Torture test server exiting on clients.
+	Torture test garbage collection.
+	Outline all UConnection creation & deletion scenarios.
+	Cleanup all garbage collection.

+	Eliminate NetPlayer.
+	Cleanup !!
+	Update filenames.
+	Rebuild ucx.

====0.871j
+	Test garbage collection.
+	Cleanup UNetPlayer::Exec.
+	NotifyAcceptedConnection needs safe failure handling mechanism.

///////////////////////////////////////////////////////////////////
8-6-97

====0.871k
+	Queued byte limit filtering.

+	Actor level optimizations.
+		Compress rotations to words.
+		Weapon physics on client side.
+			Stinger projectile = test weapon.

+	Added new "Sim" keyword for clientside simulated functions.
+		PlayerCalcView InvCalcView1 InvCalcView3 Generate
+	LT_SkinPaletteOnce
+	LT_SkinPaletteLoop
+	Trigger lights should be static (bStatic/bNoDelete).
+	Can UObject::Process be cleaned up to avoid hardcoding network relationships?

+	RemoteOwnerRole
+	RemoteSlaveRole

///////////////////////////////////////////////////////////////////
8-7-97

====0.871m
+	Low-res texture option; discard highest res mipmap (store in reverse order).
+	Minimize ints, meshanimnotifys, meshanimseqs, structs, leaves
+	Net multifire.
+	Client->Server updates should remember values to avoid unnecessary uploads.

+	Creature lighting/rendering.
+		Use DiffuseC, SpecularC in creature lighting.
X		Use DiffuseC in world rendering -> Doesn't add any value.
+		Apply zone coloring to creatures.
+		Killing lights in UnrealEd doesn't clean up its stuff; must never use Kill() in UnrealEd (let the GC do its thing).
+		Zone coloring and ambients on 3dfx? World + creatures. Nah.

====0.871n
+		Light data structures use the Light array.
+		Infinitely expandable lights per surface.

///////////////////////////////////////////////////////////////////
8-8-97

+	Blood spurts and bursts are being spawned on the client side (incorrectly).
+	Tracing & creature lighting.
+		Fix trace (visualize using raytracer).
+		FActorLink.
+		Store surface and leaf dynamic light lists in GMem; use in SetupForActor, SetupForSurf.

====0.871o
+	Net play moving brushes...
+		Movers need bNoDelete=True.
+		Client should tell server its base; server uses Attach.
+		Server don't bother with brush tracker (rendering only).

+	TriggerLights can cast shadows and take little extra CPU time.
+	Greatly increased light dithering to compensate for color banding.

+	Note: Vertical retrace typically is in progress 4.5% of the time.
+	With 70 hz refresh rate (14.5 msec), average vertical retrace window is 0.6 msec.
+	Note: Usually have a tripple buffer available, so there's not much benefit to
+	using the vertical retrace time for useful work.

///////////////////////////////////////////////////////////////////

Unreal 1 technology:
Key features.
Everything here is up and running and playable though not fully optimized.

UnrealEd: Build 3D environments, no waiting.

* UnrealEd uses the Unreal rendering engine, so most major geometry and lighting 
  operations are realtime.

* Constructive solid geometry modelling approach and support for large,
  non-convex brushes, is ideal for building quality 3D worlds quickly.

* Built-in UnrealScript development environment with compiler and editor
  with syntax highlighting.

* Easy editing of actor properties (such as adjusting the brightness of lights,
  or the intelligence of monsters).

* No waiting 12 hours while your 16-processor, $250,000 supercomputer
  preprocesses your levels so you can play them. :)

Rendering technology: Fast and scalable.

* Unreal excels at realistic lighting, with support for intermized colored
  shadows, moving and animating lightsources, a wide variety of light shape
  functions (such as sphere, cylinder, cone, and special effects), and a wide
  variety of light modulation effects (like water shimmer, 

* Supports hardware rendering on high-end 3d cards such as 3dfx using multipass
  rendering.

* Software rendering with Pentiums and Pentium-MMX optimizations, including
  a fast software approximation of bilinear texture filtering for up-close
  surfaces; and full dynamic lighting.

* Realtime fractally generated animating textures using an organic
  spark/emitter system which generates realistic models of fire, water,
  and electric arcs (plus unrealisic effects that are just plain cool!)

* Portal rendering, which enables disjoint areas to be linked together in
  a visually seamless way.

* Keyframe-based model animation with interpolation, tweening, and curved
  surface tesselation based on subdivision surfaces.  This approach gets better 
  visual results than hierarchical animation, because it enables you to use 
  awesome animation tools like Alias PowerAnimator and 3D Studio Max + Bones Pro 
  to generate the highest possible quality keyframes. Hierarchical just gets you 
  a bunch of rigidly moving parts.

* Supports 16-bit color rendering (software and hardware); each texture may have its
  own unique 256-color palette; as a result scenes can have a far greater graphical
  richness than in current 3D games on the market.

UnrealScript: A game programmer's secret weapon.

* UnrealScript is an object-oriented language similar to Java which is based
  on 5 years' of experience that culminated in realizing that C and C++ are
  lousy for programming AI and game events because they lack certain features
  that are key to game programming: time, state, and properties.

* All objects in a level which are capable of moving around and interacting
  are called actors. There is a simple, single-inheretance hierarchy of
  classes starting at the Actor class. Subclasses of Actor include monsters,
  triggers, lights, moving brushes, and projectiles). This makes it easy
  to write game code modularly, and reuse existing code without resorting
  to cut-and-paste.

* UnrealScript code is time-based, so you can write code the way you
  conceptualize it temporally (for example, a monster can fire a weapon, wait a
  second, turn towards the player, and go into attack mode). UnrealScript
  commands may take "game time" to execute. To simulate this in C/C++ you would
  have to use a ton of ugly switch statements and keep track of state variables.

* UnrealScript provides "state" scoping (in addition to class scoping), which
  means you can cleanly put all of your "attacking" code in one place, and all
  of your "retreating" and "waiting" code somewhere else.

* UnrealScript supports properties, also known as editable variables. You can 
  define a new property in script code, and then level designers can modify that
  property from UnrealEd, for example picking a choice from a combo-box, typing
  in a number, or clicking on a texture.

* UnrealScript and C/C++ code can easily call each other, so performance-critical
  and low-level code can be written in C/C++ (which is fast and difficult) and 
  high-level game code can be written in UnrealScript (which is simple and
  powerful).

Networking: Optimized for Internet.

* Web-style server based network play that enables players to travel from
  world to world on the Internet.

* Unreal's networking protocol is designed for real users' internet
  connections, which are typically 28.8K modems with 250-or-so msec
  ping times.

* Client-side controls for zero-latency player movement.

* Uses a wide array of optimizations to replicate the game state on the client
  side efficiently under 28.8K modem-to-Internet connections, including delta
  compression, visibility culling, object prioritization, and client-side
  simulation.

* Flexible, extensible network architecture based on UnrealScript. Any variables
  you define in UnrealScript can optionally be replicated in a client/server game.
  So, the network code automatically causes things like the status bar to be
  controlled by the server, but visually updated on the client side.

Audio.

* Supports CD music and digital music with .mod, .s3m, and .it files. The advantage
  of digital music is that it can be downloaded when entering a new server.

* Stereo panned, doppler-shifted, and distance attenuated ambient environment
  sounds and regular sounds.

The downside.

* Though we are approaching feature-completion, Unreal isn't finished yet, and
  the codebase and tools will be undergoing changes until we ship.

* Our goals with Unreal are to create a great high-performance leading edge game, 
  provide an extremely powerful editing tool in UnrealEd, and provide a great game 
  programming environment with UnrealScript. As a result, the behind-the-scenes C++ 
  engine code is large and complex. Though the code was created as modularly as
  possible and is fairly well commented, making extensive changes to the engine
  internals (the rendering engine, the network code, and so on) requires a major
  investment in learning the code.

* The rendering engine is optimized for large, occluded environments where the typical
  scene contains a fairly low number of polygons (100-200 world polygons and 1000-2000
  creature/player polygons). This means that any game built with the Unreal engine
  must be designed with low-polygon environments in mind; though you can build enormously
  complex scenes in UnrealEd, they will be unplayably slow. The trick is to build detail
  into textures and lighting as much as possible, rather than with polygons.

Unreal 2 technology:
Features for Q4-1998 timeframe.

* Volumetric lighting, which realistically models spatial 3d lighting.
  For example, a volumetric lightsource in the middle of a fog bank
  smoothly illuminates a sphere of light around it.

* Visually seamless linking of servers. You will be able to see through
  portals from one server into another, in a technology that's a rough
  3D analogy of HTML frames.

* Lots more.

///////////////////////////////////////////////////////////////////
8-10-97

+	Cleanup dynamicsFilter
+	Cleanup dynamicsPreRender
+	Encapsulate BSP dynamic DY_ things.
+		dynamicsfilter -> func
+		dynamicsAdd -> ctor
+		dynamicsPreRender -> func
+	Encapsulate dynamics functions.

====0.871p
+	Remove unnecessary variables.
+	Eliminate FSprite.
+	Merge DrawActorSprite, DrawActorChunk.
+	Eliminate ADD_FRONT.
+	Better dither table for 24-bit color.

///////////////////////////////////////////////////////////////////
8-11-97

+	FireEngine.
+		FireEngine texture update count limit?
+		Fire texture priming option.
+		Fire texture control from script.
+		FireEngine MaxSpeed,MinSpeed.
+		Extra FE variables for expandability.

X	SpecialEvent bSelfTrigger -> Overcomplicates things.
+	Interpolation bPlayerViewRot

+	Now synch movement with RPC fully.

+	Basic animation support in UTexture.

+	BYTE  PrimeCount, PrimeCurrent;
+	FLOAT MinFrameRate, MaxFrameRate;

+	Version to Mark.
+	Source to Ammon, Steven, Eric, Osman.
+	Researched recursive triangle rendering (dead end, quality too low).

====0.871q
+	Cleanup dynamicsLock, dynamicsUnlock.
+	Cleanup X1, X2, Y1, Y2, ScreenX, ScreenY usage.
X	Simplify DrawScaledSprite.
+	Merge dynamic lighting with dynamics.
+	Merge the v-light accumulation code with dynamics.
+	Integrate dynamics with OccludeBsp and URender.
+	V-light accumulator in fog zones.
+	Cleanup, comment the files.

+	Gave version to James.

====0.871r
+	Volumetrics traced through the BSP.
+	LightingTag.
+	Volumetric accumulator.
+	View frustrum reject everything (lights + dynamics).
+	DrawList volumetric list.
+	Polygon-reject volumetric lights. 33% speedup.
X	Don't let regular dynamics and final dynamics collide (space for 4?)

///////////////////////////////////////////////////////////////////
8-12-97

====0.871s
+	UnrealScript.
+		Make bStatic and State properties of UObject?
X		Must enforce const-ness of bStatic actors? -> Too much runtime overhead.
+		Give UEnum, UStruct a declaring UClass.
+		Only allow enum defs at class/struct scope.
+		Prevent multiple declarations of structs and enums in a package.
+		Apply enum rules to structs.

====0.871t
+		New "uses" for importing classes/structs/enums from other packages.
+		Added "ForwardDeclarer" to UStruct, UEnum.
+		Use UClass::DefaultPropText for rebuilding root.
+		One consistent recompile function everywhere.
+		Eliminate ObjectPropertiesAreValid.
+		Clean up recompile issues.
+			Bulk affected-class property export before rebuild.

+	Filter lights through tree inline in OccludeBsp.
+	If bFogZone:
+		Maintain v-light data structures during front-back rendering.
+		Sphere-polygon reject v-lights.

====0.871u
+		Eliminate WhichBins
+		FPropertyIterator -> FPerObjectIterator
+		ImportObject, ExportObject only accept one bin.

///////////////////////////////////////////////////////////////////
8-13-97

====0.871v
+	Added new status bar info to pawn class.
+	Destroy should kill instance variables.
+	Instance variables may only be per-object.
+	Spawning an actor needs to allocate instance variables.

+	Compiler.
+		uses enum xyz [from packagename];
+		uses struct abc [from packagename];
+		Class query don't show forward-declared-but-not-defined classes!
+		Test safety of forward declarations for structs, enums, and classes.

X	Allow 'uses' inside struct defs?

====0.871w
+	Allocate USoftwareRender as an object.
+	No GRend if dedicated server.
+	Eliminate Graphics.mac.
+	Eliminate Res ArrayAdd

====0.871x
+	When importing textures, can no longer specify a palette.
+	CreateRender: Allocate USoftwareRender after loading the file from disk.
+	Initial properties aren't editable?
X	Mesh lighting is screwing up with clipping on 3dfx.
+	RMode 3 colors are wrong.
+	Overbright brushes in map edit mode.

====0.871y
+	Optimized far mesh rendering by 5X (still C++!)
+	Gouraud shading.
X	Sort tris by texture.

///////////////////////////////////////////////////////////////////
8-14-97

+	Eliminate GetClassBins, GetObjectBins.
+	ImportObjectProperties
+	Test importing & exporting maps.

+	Cleaned up name subsystem for more versatile startup registering of names, needed by plug-in DLL's.

====0.871z
+	Update IMPLEMENT_CLASS etc.
+	Safe IMPLEMENT_CLASS with registry of non-hardcoded class name and package name.
+	Fixed major logistical bug in TagGarbage with hardcoded and locked objects.
+	"UnRender" name is being gc'd
+	Fixed the UnRender startup problems.

====0.872a
+	I now support nontransparent portals.
+	Make sure default-object class is set for class "default properties".
+	Allow autoregistering object classes after startup.

====0.872b
+	Move ImportObject, ExportObject into Object.
+	test saving .u
+	UnActLst.h -> UnActCol.h.
+	test rebuild root
+	.h exporting

///////////////////////////////////////////////////////////////////
8-15-97

====0.872c
X	Brush -> Instance variable.
+	Audo save-family & load-family.
+	Fix UnLinker.h context flags at bootup for now.
+	Cleaned up FGlobalObjectManager in prep for file format improvements.
+	SaveTagged
+	SetTaggedContextFlags
+	Save texture sets

====0.872d
+	Eliminated DeclareClass.
+	TagImports?
+	Network causality syncronization.

====0.872e
+	Eliminate UDatabase and build that functionality into UObject.
+		Need GEngine "Flush" function to flush all known caches.
+		Simplifies class hierarchy.
+		Eliminate Database.u

====0.872f
+	Update FPropertyIterator, FPerObjectPropertyIterator
+	Eliminated FTestMove.

====0.872g
+	Use FStaticBrushIterator in place of BrushArray.
+	IsStaticBrush

///////////////////////////////////////////////////////////////////
8-18-97 (30 hour day wraparound)

====0.872h
+	Select all actors must skip brushes.
+	Delete actors shouldn't delete brushes whe not in map-edit mode.
+	Current-brush actor 1.

+	Eliminate ULevel::ExportActors.
+	If no default bin, use zero-filled bin for diff.
+	Cleanup ExportProperties

+	Brush/actor merging.

+	Reimport bugs.
+		csgPrepMovingBrush
+		csgDuplicateBrush
+		csgAddOperation -> return ABrush.

+	FStaticBrushIterator: return ABrush, not UModel.
+	csgDuplicateBrush -> csgCopyBrush

+	csgPrepMovingBrush
+	EDSCAN_BrushVertex
+	Selecting & deselecting polys?
+	FBspSurf master needs to point back to an actor, not a UModel.

///////////////////////////////////////////////////////////////////
8-20-97

====0.872m
+	Cleanup constraints
+	ABrush::InitConstraints fix.

+	Get brush importing back into ucx rebuild.

+	ABrush::SetPivotPoint.
+	Clicking on brush vertices always work.

====0.872n
X	bEditorOnly
X	ModelFlags.
+	Move UModel properties to ABrush.
+		MF_Selected      -> AActor bSelected / bBrushSelected
+		MF_ShouldSnap    -> AActor bEdSnap
+	Brush.u, Model.u

+	Doc.
+		Update the doc for import, callclass, singular, describe packages, instance variables.

+	Balzar polygon problems?
+	Scaled sprite speed problems in 3d views?

====0.872o
X	MapSelectSeq
X	mapSelectFirst
X	mapSelectLast
+	mapBrushGet
+	mapBrushPut
+	mapDelete
+	mapDuplicate
+	SendTo
+	MapTopicHandler::Get
+	Test duplicating brush in UnrealEd "DuplicateBrush"
+	UpdateBrushPosition.

///////////////////////////////////////////////////////////////////
8-21-97

====0.872p
+	bBrushSelected -> bSelected
+	AActor::MovementLocked: Return whether actor is movable/selectable/highlightable based on map edit etc.

+	Moving brush ui.

+	Where is moving brush "state" property in UnrealEd?
+	No actor icon for moving brushes in 3d views.
+	Check all ModifyHeader/Lock usage.

+	ABrush actors and their objects shouldn't exist in gameplay.

+	Rendering overbright overflow-fix.

====0.872q
+	UnrealEd fixes
+		Brush color
+		Using actor properties sheet for brush properties.
X		bSelected for brushes, use Windows standard selection mechanism -> Later.

+	Default state for movers?
+	Moving brushes import/export.
+	Select all during import-into.

+	Fix unlit color.

+	Don't need DeclareClass at all, because properties will be reimported after make.

====0.872r
+	Ammon's sound code.

====0.872s
+	Actor properties boolean editing problems!
X	CPF_Instance: Prototype must be specified in order for auto-instantiation to occur.
X	Merge CPF_ExportObject and CPF_Instance, support generically. -> Different concepts!

+	Test brush undo/redo on all operations.
+	Compact the actor list after tick.
+	Full undo always everywhere.
X	Can't let moving brushes and static brushes' bStatic be modified at edit time due to brush preparation requirement.

====0.872t
+	FPoly doesn't need group name; brushes need group name (select-all-in-group work).
+	Test actual moving brush move time for two big intersecting brushes.
+		17/35 msec in my huge level
+		ExpandDb
+		Occlude 5.7
+	Arrow rendering.

====0.872u
+	New map doesn't delete all brushes.
+	Optimized rendering of surfs split by portals, like water!

///////////////////////////////////////////////////////////////////

	UnrealScript vs. Java: Major differences.

	Major Java features not supported by UnrealScript:
		Abstract interfaces
		Exception handling
		Private, Protected member access
		Hierarchical packages

	Major UnrealScript features not supported by Java:
		States
		Latent execution
		Structs
		Property replication/RPC
		Property editing

	Java code evolution compatibility.
		Reimplementing existing methods to improve performance.
		Changing methods to return values on inputs for which they previously were undefined.
		Adding new fields or methods to an existing class or interface.
		Deleting private fields, methods, or constructors of a class or interface.
		When an entire package is updated, deleting default (package-only) access fields, methods, or constructors of classes and interfaces in the package.
		Reordering the fields, methods, or constructors in an existing type declaration.
		Moving a method upward in the class hierarchy, provided a forwarding method is left in its place.
		Reordering the list of direct superinterfaces of a class or interface.
		Inserting new class or interface types in the type hierarchy. 

///////////////////////////////////////////////////////////////////
8-22-97

====0.872v
X	Class imports?
X		import class ccc [from packagename]?
X		Only allow refering to objects in packages scoped by the script?
X		FIND_

+	Zones blinking

+	Suddenly, an invisible zone portal had a texture on it. It was a masked
+	texture I had just imported into the editor. To get rid of it, I selected
+	the zone portal and selected a non masked texture. It went away, the portal
+	was invisible again.

+	Transparent + nontransparent copies of textures don't update together on 3dfx.
X	Tweening is IIR filtering instead of linear interpolating.

///////////////////////////////////////////////////////////////////
8-23-97

====0.872w
+	Scale skins to 256x256: texture coordinates are now normalized.
+	Animation now takes AnimRate, TweenTime.
+	Default 1/20th sec tween.
+	Now can have separate animation and tweening rates!

+	intrinsic(316) final operator(20) rotation +  ( rotation A, rotation B );
+	intrinsic(317) final operator(20) rotation -  ( rotation A, rotation B );
+	intrinsic(318) final operator(34) rotation += ( out rotation A, rotation B );
+	intrinsic(319) final operator(34) rotation -= ( out rotation A, rotation B );

+	Mover encroach twirly bug.

====0.872x
+	Update docs on Unreal VM architecture.

+	New rotation operators.
+	Retest the suites.

+	UnrealEd boolean setting bug.

+	First-cut net visibility culling.

====0.872y
+	Tazer effect in software
+	Imported moving brushes?
+	Lose all context flags after load/save pair.
+	Moving brushes not rendering bug.
+	Rebuild-all crash.
+	Weapon respawn effects not being destroyed. Intrinsic calling problems.
+	Moving brushes aren't displaying in netplay.

+	Kill server before any clients join.
+		RF_PreKilled
+	Cleaned up gc.

///////////////////////////////////////////////////////////////////
8-24-97

====0.872z
+	NumSpawned assertion in ded server.
+	Latency, packet loss, bandwidth cap command line parameters
+	Clients are timing out after 30 sec; must send keepalives.
+	Re-exec bind.mac after net connect.
+	Destroy actors that fade out of visibility, otherwise clients see ghosts
X	UnrealEd 256-color problems. -> Require 16-bit.

+	3dfx sli bug 2mb span
+	Stinger proj penetrates moving brushes (fix!) use bcollideworld

+	Base relative location and yaw for movers? -> Unsafe because base is unreliable.

X	Or the ultra low shadow detail. -> Scale up your textures.
+	F11 brightness affect rendev gamma.

====0.873a
+	Is the ambient lighting going to be in with the next code drop for 3dfx?
+		Monsters also.
+	Portals render wrong with player controls off in UnrealEd zone-portal view.
+	Resized fonts to power-of-two sizes.
+	3dfx fonts.

====0.873b
+	MoveActor time

///////////////////////////////////////////////////////////////////
8-25-97

====0.873c
+	Updated Steven's Pawn code.
+	Player dying.
+	Dead view rotation.
+	Eliminated Spawned, LostReference.
+	SNODE_ClientState.

+	Object/actor reorg.
X		Use transaction tracking system for this instead of the push/pop mechanism? -> SavedClass is cleaner.
+		Compartmentalized FSavedObject.
+		Improved actor channel descriptions.
+		Bulk MakeAll error undo.
+		DefaultPropText bug.

///////////////////////////////////////////////////////////////////

Unreal 0.873c: Editor/AI **TEST** version
=========================================

This version is for the level designers to test out. Please *don't*
switch your level-building to this version; wait till the new one.
This version is for testing the AI and giving Steven feedback.

What to test
------------

* The new AI (Give feedback to Steven).
* The new weapons (Give feedback to James).
* The new editor (I need feedback on whether there are any new problems).

Known problems
--------------

Network play is broken in this version. I'm fixing up some things for a
new version Tuesday or Wednesday. Do **NOT** try the network play in
this version, as it is totally fucked up.

Editing notes
-------------

Mirrors: When importing an old map into this version, select all your
polygons, bring up "Surface Properties", and turn "Mirror" off.
Otherwise some surface will randomly have a mirror effect on them.

Zone portals: Portal sheets can now be visible. When you import an old map 
into this version, you'll need to select all your portals and turn on 
the "invisible" option, otherwise your portals will appear as texture mapped sheets.

Warp portals: Now handles warp portals that are facing in different directions.
However, warp portals only work when one portal in a pair is facing inward and
another one is facing outward. If you see a hall-of-mirrors effect, try flipping
one of your portals around in the overhead (XY) view and see if that corrects it.

Text rendering on 3dfx now works.

Moving brushes now appear only as green wireframes (no dragon head shape).

The 16 lights-per-polygon limit is gone; this is now unlimited.

-Tim

///////////////////////////////////////////////////////////////////
8-26-97

====0.873e
+	portals casting shadows
+	Sometimes can't delete brushes in map-edit mode.
+	Undeleted classname when import map
+	Myscha importing bug.

+	Major slowdown looking through portals.

New version
-----------

Copy the files from the \update directory to your \unreal\system.

Fixes & enhancements
--------------------

REND CURVY toggles curved surface rendering.

REND TEXT toggles all text display on/off.

Fixed problem with polygon count skyrocketing when looking throgh portal (War).

Fixed the importer problem that caused Morbius to crash on rebuild, but this map 
needs to be reimported.

Fixed portals casting shadows.

Fix flag changing problem (War).

These are not bugs
------------------

In RMODE 4, poly counts are incorrect (they are the same as node counts). Go into
any other RMODE to see the correct poly counts.

In Unrealed, click the player-controls on to see zone portals and invisible 
brushes hidden as they are in the game.

There is no "Server Restart" command. This will be back when I update the file
format. For now reload the level (use the load-map option).

Yes this is the new sound code.

Fake backdrop doesn't work on 3dfx and it's not going to work on 3dfx in time for ECTS.

I need .unr files demonstrating the following bugs that were reported
---------------------------------------------------------------------

3dfx panning texture problems.
"Actors are unlit sometimes (they don't look like they're in the environment)"
"16 light limit still exists on 3dfx??"
"map edit mode: subtract and zone portal have the  overall lighting levels appear different"
"warp zone is 90 degrees off (extreme.unr)

FYM
---

When reporting a crash, give me the Unreal.log file.
When reporting a problem in a level, give me the .unr file.
Put all of these files in the server's Bugs directory.

Half of the bugs on the list were bugs I either couldn't see (because I don't have
your map) or bugs that I couldn't figure out because the report made no sense.

Write bug reports that make sense; if I can't figure out what the hell you mean I can't fix your problem.
I need to see a bug before I can fix it.

I know many SpecialEvents aren't working.
I know movers are still fucked up.
I know triggers are still fucked up.

///////////////////////////////////////////////////////////////////

Unreal 3d rendering plugin notes
--------------------------------

Unreal uses a plug-in DLL approach to device support, including
3d hardware support.

The reference implementation in UnGlide.cpp supports 3dfx' Glide library.
This code running on a 3dfx Voodoo is the standard to which other
drivers' brightness, smoothing, and gamma settings should be calibrated.

Unreal is written in C++ and all major subsystems are based on abstract
base classes.

The FRenderDevice class abstracts the 3d hardware's capabilities that
Unreal is interested in. It exposes the following functions:

// Init the 3d hardware. Tries to use a resolution of RequestX by RequestY,
// or the nearest matching video mode.
virtual int Init3D( UCamera* Camera, int RequestX, int RequestY)=0;

// Shut down the 3d hardware.
virtual void Exit3D()=0;

// Flush all objects cached on the 3d hardware, such as textures and
// palettes. Called when switching levels/worlds.
virtual void Flush3D()=0;

// Execute a command line command.
virtual int Exec( const char *Cmd, FOutputDevice *Out )=0;

// Begin rendering a frame (like Direct3D BeginScene).
virtual void Lock3D( UCamera *Camera )=0;

// Finish rendering a frame (like EndScene) and flip the page.
virtual void Unlock3D( UCamera *Camera, int Blit )=0;

// Draw a large, light-mapped world surface using texture vectors.
virtual void DrawPolyV( UCamera *Camera,UTexture *Texture,const class FTransform *Pts,int NumPts,
	const FVector &Base, const FVector &Normal, const FVector &U, const FVector &V, FLOAT PanU, FLOAT PanV,
	DWORD PolyFlags )=0;

// Draw a gouraud shaded polygon.
virtual void DrawPolyC( UCamera *Camera, UTexture *Texture, const class FTransTexture *Pts, int NumPts, DWORD PolyFlags )=0;

Unreal exposes the following internal objects to the 3d hardware:

	UCamera: A player's viewport.
	UTexture: An 8-bit palettized texture map, optionally including mipmaps.
	UPalette: A 256-entry RGBA palette.

Unreal also uses the following structs:

	FVector: A floating-point vector (X,Y,Z).
	FTransTex: A transformed vector (X,Y,X) with a pixel-based screen
		projection (ScreenX,ScreenY), a lighting value (RGBA), and
		texture coordinates (U,V).

///////////////////////////////////////////////////////////////////

====0.873f
+	Anim tweening bug.
+	Increase textured brightness.
+	Update colors.
+	Movers and semisolids = same colors.
+	Move colors to UnRender.u
+	Show brush pivot better.
+	Select moving brush pivots.
+	When in snap scale must be able to select bbox corners.
X	Snap scaling in map edit?

+	Net send keepalives because channels are closing after 30 sec

X	NAME_AllInput
+	When call RPC, must pack delta-properties into the same packet, i.e. so location is always associated properly with shooting.
+	Clients should send a packet on the player-actor channel every tick to force
+	Add some new light types that work for explosion envelopes using palettes (oneshot and loop).
X	Can we not use InvCalcView1 during play?
+	Net="ByteLimit=2500 SimPacketLoss=0 SimLatency=0" (both client and server side).
+		FSocket: ByteLimit= SimPacketLoss=, SimLatency=
+		Way of tracking channel last-relevent times.
X		Carefully check RPC functions during spawns.

///////////////////////////////////////////////////////////////////

ZZT free release:

This was my first game.

ZZT was released as shareware in 1991 and it was Epic's debut title.
Though it was quite minor in the grand scheme of things, registrations from 
ZZT paid for the computer, hardware and artwork I used to create my 
second game, Jill of the Jungle.

Jill of the Jungle put Epic MegaGames on the map as a leading shareware
publisher, and helped to attract our founding developers, including
James Schmalz (Solar Winds and Epic Pinball), and Cliff Bleszinski (Jazz
Jackrabbit), who I'm now working with on my third game, Unreal.

ZZT's text-based graphics looked dated even in 1991, so they certainly 
are not leading-edge now in 1997. But, it's still fun to play, and the
level editor built into ZZT has inspired hundreds if not thousands of
user-created levels. Some of these levels can still be found on the
web from sites such as http://www.chocobo.org/~butz/zzt.htm,
http://elmo.byu.edu/zzt/, and http://www.inforamp.net/~biglarr/mzx/links.html.

To the best of my knowledge, ZZT was the first PC game to feature
a built-in level editing tool and scripting language.

Looking back, I'd really like to thank Scott Miller of Apogee for his 
early advice and encouragement with ZZT, Johnny Wilson of Computer 
Gaming World for the first mainstream press that Epic received with ZZT,
and all of the people in the ZZT community who created add-on levels and
utilities for ZZT.

Enjoy!

Tim Sweeney
Epic MegaGames, Inc.

Release notes:

* Sorry, no tech support questions, but it *should* work from DOS, Windows 95, 
and Windows NT 4.0.

* Please don't ask for the source; if I had it, I'd release it,
but I lost it in a crash a long time ago.

* Please don't email me asking about ZZT; I'm focusing on Unreal now and it's
my priority.

///////////////////////////////////////////////////////////////////
8-27-97

Server-side errors seen in network play.

James
-----
ScriptWarn: AutoMag AutoMag1 (Weapon:WeaponSet:02E8) Warning: Accessed None
ScriptWarn: FlakCannon FlakCannon1 (Weapon:WeaponSet:02E8) Warning: Accessed None
ScriptWarn: Rifle Rifle2 (Weapon:WeaponSet:02E8) Warning: Accessed None
ScriptWarn: Health Health2 (Health:Touch:0017) Warning: Accessed None
ScriptWarn: Rifle Rifle1 (Rifle:Tick:0073) Warning: Accessed None
ScriptWarn: BigNapalmGel BigNapalmGel0 (BigNapalmGel:Flying:0121) Warning: Accessed None
ScriptWarn: Eightball Eightball2 (Weapon:WeaponSet:02E8) Warning: Accessed None
ScriptWarn: NapalmGun NapalmGun2 (NapalmGun:Timer:016D) Warning: Accessed None

Tim
---
Info: Received ack on closed channel 3

Steven
------
Info: Noise by ReSpawn with no instigator <-- I see this a LOT
Info: SpawnActor HorseFly failed because FindSpot didn't fit

====0.873g
+	logfile= option
+	Eliminated owner-autodestruction rules.
+	Don't allow client destruction of unowned actors.
+	Server DestroyActor 9 crash.
+	Net clients lock up after a while.
+	Network play testing & fixes.

+	Server crash on exit
+	Cleaned up message pump exiting

====0.873h
+	Merged DrawLevelBrushes.
+	Cleaned up editor rendering functions.
+	virtual BOOL Snap( AActor* Actor );
+	Show moving brush center-pivot when selected.

+	CreateMips parm to actual downsample.
+	Snap movers the moment movement begins for force moving in unison?
+	Fix moving brush dragging.
+	UpdateBrushPosition.
+	ExplodingWall.unr.
+	NAME_PostEditChange

+	Clients locking up with movers (recursive base problem?)

====0.873i
+	Duplicate actors move the duplicated version.
+	Duplicate actors must copy state (object templates).

+	SHOW_ServerStats
+	server showrate: c=#clients, lt=level tick time, rt=replicate-time, pv/c=pvactors/client, p/c=props/client
+	Test tons of traces.
+	SpecialLit work w/ actor lighting.
+	bspValidateBrush = amazingly slow!
+	Client show server pv actors.
+	Server frame rate sucks.

====0.873j
+	Client set static,nodelete role=ROLE_None, remoterole=ROLE_Authority
+	Client-side animations seem not to work properly -> fixed bad replication defs.
+	Set up all proxy types in James' weapons and effects.
X	Shells aren't bouncing (bbounce?)
+	Weapons aren't rotating in netplay (BecomePickup?)
+	Count rpc's in netplay. NumRPC

///////////////////////////////////////////////////////////////////
8-28-97

====0.873k
+	Stingerprojectile explosion
+	Not seeing other player weapons.
+	Name in Bind.mac.
+	Eliminated IsProbing.
+	UnrealScript: Ignores with a non-probe function should generate a dummy function.
+	Docs: Ignores.
+	Replicate role reliably.

+	Add LeafLeaf and LeafZone arrays to UModel.
+	Add light mesh to ABrush class.

====0.873m
+	"Crosshair" turns the crosshair on.
+	Quick fix to input sticking problems.

+	Fire button sticking.

///////////////////////////////////////////////////////////////////
8-29-97

====0.873n
+	All previous "Server" functions must now be declared with the "exec" keyword.
+		Exec functions can only be in the player Pawn, nowhere else.
+		Bind.mac server name is being called before player pawn exists.
+	Exec functions
+	Optional parameters
+	Intrinsic final functions can't be replicatable or execable.
+	Steven: You'll need to merge the new pawn "exec" commands and the
+		new replication definitions into your pawn code. Everything else
+		is unchanged.
+	Don't need UPlayer::Exec
+	No Server/Control mesaging mechanism, just bidirectional rpc?

====0.873o
+	Replaced Die function with KilledBy (necessary because of conflict between
+		Die function and Die sound), added instigator parm.
+	Weird pawn Die/Walk compiler error.
+	Starts out facing the wrong way!
+	Login weirdness.

+	Eliminate NotifyAcceptingChannel BindTo.
+	Eliminate FWinNetDriver::FWinNetDriver BindTo.

+	SNODE_ExecFunc
+	NAME_Exec

+	Use bExtra0 for server stats
+	Client -> Server RPC's

====0.873p
+	Call-less script commands.
+	CHTYPE_Control: Always enforce that channel 0 is NULL or a control channel.

====0.873q
+	After second compile pass completes, propagate CPF_NetFunc.
+	Replication defs can't allow replicating functions first defined in other
+		classes.

+	Can't restart after dying in net game (fire, altfire not getting across).
+		All functions must have a pointer to the least-derived version and use
+		the replication definitions there.

+	FunctionIsRemote -> FStackNodePtr, not FStackNode.
+	Eliminate ParentNest.
X	Test decompiling states.

+	Replace FExecStack "Script" variable with byte pointer.

+	In map edit mode, can't select moving brush pivot.

X	SpawnPlayActor: Let script code decide role.

	Cleaned up all pawn exec commands.
		BehindView 1/0
		ShowPath
		RememberSpot
		Say "text"
		SwitchWeapon 0/1/2/3/4/5/6/7/8/9
		Pause
		PrevItem
		NextItem
		ActivateItem
		Fire
		AltFire
		ShowInventory,
		Jump
		Fly
		Walk
		Ghost
		SetName "name"
		SetTeam "team"
		TempStatus 1/0
		God
		Die
		SnapView 1/0
		DodgeClickTime 0.1

///////////////////////////////////////////////////////////////////
8-30-97

====0.873r
X	Replication condition evaluation gate. -> Only one time-critical place.
+		Replication condition evaluation tag cache to avoid duplicate evaluation.
+		RepTag, OtherTag.
+		CPF_Replicated.

+	Fixed mother of all bugs in FindLabelLink! Augh! Avoid redundent variables.

====0.873s
+	Receiver validate sender RPC's before executing them.
+	Dispatcher array editing bugs in UnrealEd.
+	Implemented ShowTraffic.

	Demo research:
	drain
		Erik: Bump mapped mercury blobs
		Erik: Cool realtime corona
		Erik: Cool realtime fire blobs
		Erik: Cool realtime mercury blobs mixed in with corona (holy shit!!)
		Erik: Cool realtime lens flair with corona
	hias
		Erik: Water skeeters
		Erik: Bump mapping trick
	Blind:
		Erik: Cool realtime corona
	Stroke:
		Tim: Multilightsource bump mapping
	21st:
		Tim: Chromatic light overlays (low res but cool!)
		Tim: Lightning flashes
	ana4:
		Tim: Radial water warp.
		Tim: Curved subsurface extrusion.
	dosshell
		Tim: 3D particle systems including cool advanced shapes
	lepton
		Tim: Cool 3dfx massive sprite overlays
	geno
		Tim: Multilightsource bump mapping.
		Tim: Large level-of-detail outdoor city
		Tim: Underwater radial sheafs of light
		Tim: Huge buildings toppling over
	jizz
		Erik: Coronas.
		Tim: Psychadelic high-polygon objects
		Tim: Realtime metaball objects
	spot:
		Tim: Projective lighting.
		Tim: Convex brush physics
		Tim: Shadow z-buffering
		Tim: Multilightsource shadowing (shadow z-buffers?)
	out:
		Tim: Bones
		Tim: Wavy illuminated polygon pool of water
	drift:
		Erik: Evil/symbolic fire symbols.
		James: Spinning blade mesh.
	dos inside
		Tim: Water-wave displacement mapping.
		Tim: Transparent corona effects.
	dos toast:
		Tim: Lots of polygons
		Tim: Adaptive subdivision raytracing.
	dos face:
		Tim/Erik: Awesome realtime colored bump mapping.
	dos fever:
		Tim: Complex machinery.
	dos bubble:
		Erik: Cool shade bob effects.
	dos astral:
		Tim: Great, smooth 16-bit color lighting and highlighting.
		Tim: Cool organic shapes.
		Tim: Cool smooth organic textures.
	dos cd2:
		Fractionally precise stars.

	dos misg:
	dos outcast:
	dos paper2:
	dos bp:
	dos cyber:
	dos addict:
	dos ma:
	dos shi:
	dos anci:
	dos stasis:
	dos hypnotic:
	dos wish:
	dos dawn:
	dos interior:
	dos claudia:
	dos pasta:
	dos martian:
	dos goose:
	dos implant:
	dos bloom:
	dos monolife:
	dos hol:
	dos untitled:
	dos optimize:
	dos contrast:
	dos latex:
		sux

///////////////////////////////////////////////////////////////////

	Notes for the level desigerns:

	Use StandOpenTimed for lifts, not BumpOpenTimed. BumpOpenTimed is
		meant for doors that you bump into, not platforms you stand on.

///////////////////////////////////////////////////////////////////
8-31-97

====0.873t
+	Test old utx's.
+	It happens when I edit the properties for a mover and a trigger
+		(of both are selected).
+	Editing multiselect arrays should work.
X	Selecting a mover snaps it; only moving it should snap it.

+	Read password from unpass.ini, distribute unreal.ini
+	ShowTraffic - show network property traffic
+	ECTS version.

///////////////////////////////////////////////////////////////////
9-2-97 (wraparound)

====0.873u
+	Weapons blink in and out due to spawning. Should have a timeout value
+		for simulated, dumb, and autonomous proxies. No replicate
+		RemoteRole==ROLE_None actors at all.

+	New RoundRobin trigger.
+	NetPriority

+	Researched scanline filter-tracing:
+		Very clean and simple.
+		Also very slow, because number of scanlines is large and BSP is deep.

///////////////////////////////////////////////////////////////////
8-19-97

====0.872i
+	Actor props is broken again: Needs a no-diff option.
+	Sky is broken.
X	SkyFog is broken -> fix comprehensively later.

====0.872j
+	TransformedBound needed?
+	Brush BuildBound after import/intersect, but nowhere else.

+	FBoundingBox exact computation for snap-scaling.
+	Test snap-scale.
X	FBoundingBox transform-by optimizations.

====0.872k
+	No collision hashing in editor.
+	Eliminate model WLocation, WRotation.
+		csgCopyBrush copy actor rotation and location.
+		Eliminate NoteResHeader usage outside of engine.
+		GetRenderBoundingBox
+		UModel::Init is only relevent if Owner!=NULL, so move to ABrush.
X		UModel::Transform to ABrush?
+		UModel::BuildCoords to ABrush.
+	UnModel.cpp cleanup.

///////////////////////////////////////////////////////////////////
9-4-97 (wraparound)

+	Doubled mover limit.
+	Added UNMIRROR=1 option to MESH IMPORT for Microprose.

+	Weapons move up & down stairs unsmoothly, net play only.
+	Weapon heights are wrong in netplay only.

+	PlayersOnly cheat: Only updates players.

+	Firing after closing net connection crashes.
+	Warpzones not working in netplay.

+	Net priority:
+		Default = 1
+		Pawn = 2
+		Pawn possessed by player = 8
+		Regular projectiles = 4
+		Simulated proxy projectiles = 6
+		Player's weapon = 2
+		Decoration = 0.5
+	Round-robin update actors. Wow! Big improvement!

====0.873v
+	Fire textures shouldn't save data.
+	3dfx panning problem.
X	Why are panning textures all over the place.
+	Player list cmd.

+	Chizra60.t3d import & rebuild error.
+	duality.unr rebuild bug.

+	Movers kill client performance.
+	Sheered brushes are getting reset.
+	SetupForSurf crash after rebuild.

+		When standing on moving brush and it's moving down into a trigger, trigger isn't triggered till player moves.
+		In 3dfx rendering, rmode 1, get tons of "line: bounds" messages.
X		Make Inoxx lens flares work.
+		Wavy/panning textures jitter on 3dfx due to panning integerization?
+		LevelInfo not found problem with import-map-into

+		Water surface "lit" option.
+		If you make water nontransparent then rebuild, makes transparent again.
+		Make sure Begin: code is executed for all spawned actors within a tick!
X		Way of doing PlayAnim and tweening into a running sequence.
+		Still execute bStatic scripts!
+		Moving down into trigger on moving brush
+		Brushes weirdly rotate back to starting position when they encroach.
+		When you have a brush I should use bCollideWorld instead of bCollideActors and
+			use Bump instead of Touch. Test with RazorJack.
+		Pausing.

///////////////////////////////////////////////////////////////////
9-5-97

====0.873w
+	Mover causing textures to pan bug.
+	Fixed gotolabel demoting MainStack link.

+	MakeNoise should not be final (don't want it client side).
+	Time FlakChunks in net play.

+	Player skins: Female,FemaleX2,FemaleX4,FemaleX5,FemaleX6
+	BehindView fix.
+	Multiple skins.
+	Snapping to world vertices only works while btn is held.
+	Stats in editor?

====0.873x
+	Mover IgnoreWhenEncroach still kills?
+	Foundry crash.
+	Brute explosions are persisting?

+	Give movers 6 keyframes.
+	Multikeyframe mover support.

====0.873y
+	Optic engine.
+		DrawScaledSprite take an FVector Color parm.
+		REND FLARES
+		REND FIRE
+	"Unreal.exe -hard" starts out in hardware rendering.

+	Actor bCorona, bLensFlare
+	Light lens flares.
+	Light coronas.
+	Smoothly interpolate lens flare brightnesses.

///////////////////////////////////////////////////////////////////

James & Steven:

In the latest Unreal code, I'm making the transition to the
new file format, which is based on the concept of "packages".
A package is a group of objects which can be loaded and saved
together. A package contains one or more objects, and can be
associated with one C++ DLL.

There are five main packages in Unreal: UnEngine, UnGame, UnFire,
UnRender, and UnEditor. These packages will correspond to files
and DLL's like this:

Package   Data file     DLL file
-------   ---------     --------
UnEngine  UnEngine.ucx  UnEngine.dll
UnGame    UnGame.ucx    UnGame.dll
UnFire    UnFire.ucx    UnFire.dll
UnRender  UnRender.ucx  UnRender.dll
UnEditor  UnEditor.ucx  UnEditor.dll

In addition, packages are used for other things: each texture
set is a package. Each sound set is a package. Each level is
a package.

The new Unrealfile loading and saving code is based on a major
simplification: There is a one-to-one correspondence between
packages and .ucx files.

An Unrealfile contains a bunch of objects, and those objects
might refer to objects in other packages. This is called a
dependency (i.e. the UnGame package is dependent on the UnEngine
package).

This impacts your work because we need to make sure that the UnEngine
package has no dependencies on the other packages (like UnGame). This
is for two reasons: First, separating the general engine classes from
the game specific classes is a good programming practice. Second,
it makes it much easier to update the game code without impacting the
engine.

How we need to transition to the new package system...

Step 1: Make UnEngine independent of UnGame.

All UnEngine scripts must not refer to UnGame
scripts. There are about 30 violations of this rule in the
current code, which I'm fixing right now. However, you'll both
need to keep this new rule in mind when writing scripts, so that
we don't accidentally make UnEngine refer to UnGame.

One example is this: In the Pawn class, there is code to spawn
a Bubble actor, and Bubble is in the UnGame package. I fixed this
by moving Bubble to the UnEngine class.

I added a new console command to display dependencies for a certain
package. It looks like this:

	OBJ DEPENDENCIES PACKAGE=UnEngine

And it produces results which look like this, for the UnEngine class:

Info: Dependencies of UnEngine:
Info:       Class UnEngine.Decoration references:
Info:          Class UnGame.Fragment1 (data)
Info:          Class UnGame.WoodFragments (data)
Info:       Class UnEngine.Carcass references:
Info:          Class UnGame.HorseFlySwarm (data)
Info:       Script UnEngine.Pawn references:
Info:          Class UnGame.GodArmor (data)
Info:          Class UnGame.GodArmor (data)
Info:          Class UnGame.WaterImpact (data)
Info:          Class UnGame.WaterImpact (data)
Info:          Class UnGame.Bubble1 (data)
etc

On tues or wed, we can all go through all of the scripts and
eliminate the dependencies.

Step 2: Rearrange the directories and .u files.

To simplify distribution to licensees, I'm going to break out the
.u files into one .u file per class (instead of the current weird
setup), and move everything into package-specific directories, like
this:

Unreal
	UnEngine
		Models
		Graphics
		Src
		Classes
	UnGame
		Models
		Graphics
		Src
		Classes
	UnRender
		Src
		Classes

Step 3: Finalize the file format.

///////////////////////////////////////////////////////////////////
9-6-97

====0.873z
+	Bumpbuttons don't open if they don't affect anything, i.e. multiple bumpbuttons
+		are linked to a single mover and one is pressed while the mover is already
+		moving.

+	New InitTrigger/ResetTrigger mechanism.

+	Show level dependencies option (Packages, or Packages + Objects) using results window.
+		OBJ DEPENDENCIES PACKAGE=UnEngine
+		OBJ DEPENDENCIES PACKAGE=UnRender Exclude0=UnEngine
+		OBJ DEPENDENCIES PACKAGE=UnFire   Exclude0=UnEngine
+		OBJ DEPENDENCIES PACKAGE=UnSample Exclude0=UnEngine
+		OBJ DEPENDENCIES PACKAGE=UnEditor Exclude0=UnEngine Exclude1=UnRender
+		OBJ DEPENDENCIES PACKAGE=UnGame   Exclude0=UnEngine Exclude1=UnRender Exclude2=UnFire

+	Cleanup dependencies.
+		Fixed script compiler overwriting return value of Spawn.
+		UnEngine.
+			UnGame.Carcass -> UnEngine.Carcass
+			UnGame.Bubble -> UnEngine.Bubble
+		Explain dependencies to Steven & James.
+	Barf if try to save NAME_Transient package.

///////////////////////////////////////////////////////////////////
9-7-97

====0.874a
+	Script compiler: Don't allow referring to classes, objects, or enums
+		in other packages unless that package is explicitly imported.
+		import package 'packagename';

====0.874b
+	Cliff shadow bugs: toxiclite.unr w/ nonsolid brushes.
X	All movers use RotationRate if bFixedRotationDir or bInterpolating. Forget it!
+	Special events
+		Kill player.
+	Node counts skyrocket and can see incorrect actors near water surface (region!=actor.region?)
+	Dig11: iLink problem when rebuilding.

====0.874c
+	Save object properties using tagged object file format.
+		Structs are always saved as fixed-sized and may be binary upgraded
+			by adding values on the end that default to zero.

+	Cleanup property serialization.
+	UStruct::SerializeBin neglects arrays!

///////////////////////////////////////////////////////////////////

Unreal 0.874d is now available on the Epic FTP server.

This is the latest version of Unreal; this version of the code and
tools was used for the version of Unreal we demoed to the public at
ECTS, featuring network play.

--------------
Files you need
--------------

Level designers need:
	Ed0874d.zip: The UnrealEd installer.

Programmers need:
	Src0874d.zip: The source code.
	Graphics0874d.zip: Graphics files, needed for rebuilding Unreal.ucx.
	Models0874d.zip: Models, needed for rebuilding Unreal.ucx.
	Sounds0874d.zip: Sounds, needed for rebuilding Unreal.ucx.

Optional:
	EctsMaps.zip: Four of the maps we're showing at ECTS.

-------------------------------
Fixes & enhancements since 0.86
-------------------------------

* Player movement and physics code supports swimming.
* Complex zone portals, like water surfaces, are now supported.
* Network play now ROCKS!
* Fixed actor-actor and actor-world collision problems.
* Many major AI improvements & additions by Steven Polge.
* UnrealEd "show paths" option for visualizing pathnode placement.
* Moving brushes now support up to 6 keyframes.
* Moving brushes can now be "wound up"; rotating moving brushes
  remember how many times you've wound them.
* 3dfx status bar rendering.
* Actors are now properly illuminated by lightsources that hit them.
* Ambient lights can be used on 3dfx.
* Totally cool awesome amazing fractal fire and water effects by
  Erik de Neve.
* UnrealScript supports structs.
* New triggerable lights.
* Zone portals can now be nontransparent and textured.

------------------------
New command line options
------------------------

From the Unreal command line:

Rend Curvy       toggles curved surface rendering.
Rend Text        toggles all text display on/off.
Open 200.0.1.40  connects to an UnrealServer (use the server's IP address).
Listen           start listening for clients as a non-dedicated server.
BehindView 1/0
ShowPath
RememberSpot
Say "text"
SwitchWeapon 0/1/2/3/4/5/6/7/8/9
Pause
PrevItem
NextItem
ActivateItem
Fire
AltFire
ShowInventory,
Jump
Fly
Walk
Ghost
SetName "name"
SetTeam "team"
TempStatus 1/0
God
Die
SnapView 1/0
DodgeClickTime 0.1

Running "Unreal.exe -hard" starts out in 3dfx mode.
Running "Unreal.exe audio=off" starts without sound.
Running "Unreal.exe -ded" starts a dedicated server.

------------------
Reporting problems
------------------

When reporting a crash, give me the Unreal.log file.
When reporting a problem in a level, give me the .unr file.

Email level editing questions to unedit@epicgames.com.
Email programming questions to unprog@epicgames.com.

--------------
Gameplay notes
--------------

To play a network game, copy the level you want to play over top
of the file Unreal.unr on each machine you want to participate,
then run Unreal.exe on each machine. One machine has to be the server.
To use a dedicated server, run "Unreal.exe -ded". To run a non-dedicated
server (which someone can play on), run Unreal then type "listen" at the
console.

For best network play performance, use a dedicated server.

----------------
Programmer notes
----------------

Unreal requires Visual C++ 5.0 to recompile.

The UnrealEd source requires Visual Basic 5.0 to recompile UnrealEd.exe,
though you most likely won't need to do this.

The rendering visibility and span buffering code has been moved to
a new, more C++ style interface, but the basic concept remains the
same (this will affect the guys using the AnimaTek stuff).

----------------------------
Known problems & limitations
----------------------------

The config menus are out and need to be rewritten. For now, use
"notepad \unreal\system\unreal.ini" to check the config.

Turn autosave off if you experience runtime errors in UnrealEd.

Texture groups aren't supported yet.

In RMODE 4, poly counts are incorrect (they are the same as node counts). Go into
any other RMODE to see the correct poly counts.

In UnrealEd, you must click the player-controls on to see zone portals and invisible 
brushes hidden as they are in the game.

There is no "Server Restart" command. This will be back when I update the file
format. For now reload the level (use the load-map option).

Fake backdrop doesn't work on 3dfx. The sky will be addressed later.

Only TCP/IP networking (LAN/Internet) play is supported, not modem/IPX.

Network play isn't fully bandwidth optimized, so it's not very good on
28.8K connections yet.

Saving and loading .unr files is sssslllloooowwww.

.unr files are still huge because they store all textures, scripts, and
models in them.

Warp zones are still very experimental and they cause non-fatal rendering 
glitches in both software rendering and 3dfx play.

--------------------------
Major features yet to come
--------------------------

* Support for quality 3d hardware other than 3dfx.
* Finalized file format (to drastically reduce .unr size).
* Bandwidth-optimized 28.8K network play.
* Rendering optimizations.
* Level switching and content downloading during network play.

///////////////////////////////////////////////////////////////////
9-8-97

====0.874d
+	Fixed multiselection bugs.
+	SetActorZone now special-cases the LevelInfo actor.
+	Greatly improved palette table memory efficiency in zones.
+	Fixed problems with ambients applying to wrong zones in 3dfx.
+	CHECK_ALL cache debugging.
+	Upgraded CacheID's to quadwords.
+	All level caches use Frame level.
+	32-align the cache.
+	If colored lighting, base & resultant shadow maps must be cached relative to zone info for ambient lighting.

///////////////////////////////////////////////////////////////////
9-9-97

====0.874e
+	Added Tell() to FArchive class.
+	Fixed length saving.
+	Tagged variable-length saving.
+	Tagged loading.
+	Efficient bool serialization.

====0.874f
+	Prototyped ATcpLink.h
+	Merged with Steven

///////////////////////////////////////////////////////////////////
9-10-97

====0.874g
+	Cleaner serializing of structs with variable-length support.
X	Exec "summon" function for spawning actors. -> Steven
+	Fix texture loading/saving
+	Fix ucx rebuilding
+	Serializing default properties must not be fragile.
+	Test rebuild ucx.

///////////////////////////////////////////////////////////////////
9-11-97

+	Mark's wedding.

///////////////////////////////////////////////////////////////////
9-12-97

====0.874h
+	Use FPropertyBase::Matches in file code.
+	FPropertyBase::Matches recurse with structs.
+	Use FPropertyBase::Matches in net code.
+	Reconcile all bStatic/bNoDelete actors as UObjects rather than actors.
+	Cleaned up network bunch serialization.

+	Allowed dependencies:
+		OBJ DEPENDENCIES PACKAGE=UnEngine
+		OBJ DEPENDENCIES PACKAGE=UnRender Exclude0=UnEngine
+		OBJ DEPENDENCIES PACKAGE=UnFire   Exclude0=UnEngine
+		OBJ DEPENDENCIES PACKAGE=UnSample Exclude0=UnEngine
+		OBJ DEPENDENCIES PACKAGE=UnEditor Exclude0=UnEngine Exclude1=UnRender
+		OBJ DEPENDENCIES PACKAGE=UnGame   Exclude0=UnEngine

====0.874i
+	Move default texture from editor to engine!
+	Make PlayerPawn intrinsic, break out APawn into APlayerPawn.
+	Icons blinking in and out!
+	Fix DefaultTexture access.

====0.874j
+	Verify all dependencies.
+	GameInfo -> UnrealGameInfo.
+	Fix Game= parameter. Woohoo!
+	Update UCamera to use APlayerPawn instead of APawn.

///////////////////////////////////////////////////////////////////
9-13-97

====0.874k
+	New texture mapping algorithm.
+	Adaptive X sub based on perspective.
+	Adaptive recursive X sub based on shadow deltas.
X		Extra DWORD data can store subdivision instructions in shadow maps.

+	Reduce data so shading is more efficient.

///////////////////////////////////////////////////////////////////
9-14-97

+	Span buffer flipping, basic implementation.
+	Horizontal-major and vertical-major drawers based on LCZ.

====0.874m
+	Sound merge.
+	Sound unmerge. :-(

///////////////////////////////////////////////////////////////////
9-15-97

====0.874n
+	Use texture coords in ror format.
+	Support all size textures.
+	Proper 3*256 shader-indexed palette.
+	Cached palette.
+	Optimize the adaptive shadow subdivision decision.
+	Use ror coordinates for lightmapping.
+	Light oversampling tables.

+	Support texture panning without affecting light maps.
X	Use fadd-fstp trick instead of ftoi. -> Too much precision loss.
+	Cleanup U, V interpolator setup.
+	Double light range to 128.

///////////////////////////////////////////////////////////////////
9-16-97

+	Light meshes:
+		Perfect left-border:  0.0 = lowest safe value
+		Perfect right-border: 1.0
+		Fix texture panning.
+		Dynamic lighting 0.75 speedup and memory usage improvement.
+		Reduce primary lighting map usage.
+		Reduce static light map memory usage.
+		50%-bias lightmaps on 3dfx.
+		Only upload proper lightmap portions on 3dfx for 1.5x savings.
X		Precomp max brightness?
X		Clamp lighting coordinates in outer loop? Speed speed speed.
+		Reduce game cache size, since palette tables are no longer needed.
+	Support brightness adjustment.

+	Constrain lighting to bounding box; gauge performance gain. -> Light radii
+	are HUGE compared to mean occlusion distance, so this optimization isn't
+	worthwhile in the current iteration of the technology.

+	Vertical rendering is amazingly slow due to cache and PCI effects.

X	Investigate LCZ texture mapping: Need H&M versions?
X	Span buffer flipping, optimized version.

X	Custom light ramp palettes?
X	Light manager use rectangular subregion for updates.
X	Exploit Palette->Num if all tail entries are black and there's a non-black entry somewhere.
X	Force textures to use only up to Palette->Num.
+		Glide converts 2.25X unncessary data from 888 to 555.
+		Optimize texture uploading.

///////////////////////////////////////////////////////////////////
9-17-97

====0.874o
+	Changed all #exec command import FAMILY= to GROUP=
+		Sorry!
+		Do a global search and replace when merging.

+	Eliminate unnecessary "import package" cmds
+	Rebuild.

+	Backup everything.

====0.874p
+	Separate UnEngine.ucx, UnGame.ucx, UnRender.ucx, UnEditor.ucx, UnFire.ucx, UnSample.ucx.
+	Updated package names.
+		UnEngine -> Engine
+		UnEditor -> Editor
+		UnRender -> Render
+		UnFire   -> Fractal
+		UnSample -> Sample
+		UnGame   -> UnrealI

+	UnrealEd: .u -> .us

====0.874q
+	Save all packages as SavePackage .ucx files in their package directories.
X	Must search for Unreal plug-in DLL's in their package specific directories, too.
+	Move all .us files to separate directories.
+	Manually, explicitly import all classes from separate .u files in order.
+	Import in package order.
+	Verify that all scripts were carried forward

====0.874r
+	Move all source to package-specific directories.
+	Inc
+	Tools
+	Doc
+	Windows & Windows\Res
+	Lib
+	Eliminate unnecessary resource.h's
+	Editor don't static-link to Render
+	All packages produce .lib files in their package lib directory.
+	Rebuild.

====0.874s
+	Eliminatted palette.pcx; now uses palette of Default.pcx.
+	Moved Graphics directory to package-based subdirectories.
+	Had to rename texture Default to Base.

+	Bind.mac -> Autoexec.mac
+	// = comments in macros rather than ;

///////////////////////////////////////////////////////////////////
9-18-97

====0.874t
+	Test importing maps
+	Fix mesh viewer

+	Cleanup .u format like this (pre-parse class's name, parent, package.
+	Cleanup .u importing.
+	Import actor properties by incremental mapping, not dumb text search!
+	Optimize .u importing.

///////////////////////////////////////////////////////////////////
9-19-97

====0.874u
+	New Visual C++ project.
+	New package-based C++ headers.

+	Recreate VC++ directories and VC++ project.
+	Stick header files in their defining projects so VC++ class browser works.
+	Everyone use precompiled headers.
+	Clean directory slate.

+	Eliminate GEditor includes in engine; eliminate UnEditor.h.
+	FConstraints as an engine class with FConstraints in the editor package.
+	FScan -> Belong to UCamera; hide GEditor.Scan.
+	Generate package-based actor class headers to the appropriate files:
+		Engine\Inc\EngineClasses.h
+		Engine\Inc\UnrealIClasses.h
+	Eliminate Root.h

///////////////////////////////////////////////////////////////////
9-20-97

+	James got marred!

///////////////////////////////////////////////////////////////////
9-21-97

+	RGB texture mapper.
+		Separate light, texture, and merge operations.
+		Properly scaled texture color lookup table.
+		Unoptimized asm texture.
+		Unoptimized asm merge.
+		Optimized asm merge.

+		Reformat light map data as DOUBLEs.
+		Per-pixel point sampling of light map.
+		Correct, per-pixel light map bilerp.

///////////////////////////////////////////////////////////////////
9-22-97

+	Cleanup outdated hardcoded names.
+	New Core package
+		FName
+		FRainbowPtr
+		Headers: No multiple include protection. You want a compile error when headers are wrong.
+		UInts
+		UObject (UnObj, UnObjBas, UnObjVer)
+		ULinker
+		UnFile functions to platform.
+		UnOutDev.
+		char* UClass::GetNameCPP()
+		UObject::IsPendingKill()
+		UnProp.cpp
+		Object.us, Subsystem.us
+		UStruct
+		UClass
+		FProperty, UnProp.h

+	Get everything recompiled and linked successfully.
+	Make Core work for rebuild.

+	Package public includes should prevent multiple inclusion.
+		Subsystem
X		Application (Engine)
X		Auto-generate CoreClasses.h

+	cleanup unrealscript function calling
X	Base FGlobalObjectManager on an abstract base; make it a UObject?

+	EngineClasses.h
+	global package variable to eliminate need for that package #define.
+	IMPLEMENT_PACKAGE(Core);

+	.us -> .uc

///////////////////////////////////////////////////////////////////
9-23-97

+	Order independent class importing.
+	For-editing packages are specified in Unreal.ini in [EditPackages],
+		rather than being hardcoded.

+	New Unreal -make parameter to remake deleted .u files.
+	Don't auto-make when running UnrealEd.
+	Unhack UnrealEd startup.

+	Move all topic code to the editor (UnTopics.h).

X	Separate networking code into Net package (UnNet.h coverage)?
X		UNetConnection
X		ATcpLink

+	New SourceSafe directories including .lib's and .u's.
X	FOR_ALL_OBJECTS -> FObjectsIterator, FTypedObjectsIterator, FClassObjectsIterator
+	Full sourcesafe-only rebuild.

====1
+	Deproject crashes when adding actors.
+	Draw3DLine always transform.
+	Merge DrawOrthoLine, Draw3DLine.
+	Setup proper coords and uncoords for automatic ortho rendering.
X	Setup clipping viewplanes for ortho cameras, too.
+	Cleanly separated line drawing into Draw2DLine, Draw2DClippedLine, Draw3DLine.
+	Moved editor specific rendering functions to the editor.
+		DrawFPoly
+		DrawBrushPolys
+		DrawLevelBrushes
+		DrawBoundingBox
+		DrawGridSection
+		DrawWireBackground
+	UnEdTran -> Editor.
+	USoftwareRender::DrawMesh render lines directly.
+	Eliminate editor dependencies on render.
X	Move all the C_ colors to the editor, update the classes.
+	Implement a software rendering version of DrawPolyC and use it.
+	Two-pass DrawLevelActors: One in editor, one in game.
+	Backup, cleanup, defrag.
+	oldreal textures

///////////////////////////////////////////////////////////////////
9-24-97

====2
+	Pass LightInfo to all DrawPolyV.
+	Encapsulate light map info into FTextureInfo; hide GLightManager from FRenderDevice.
+	Hide GLightManager.
+	Eliminated RenTab.u
+	Can handle 8-bit color rendering via remaptable.
X	EDrawRaster?

+	New minimum system requirements:
+		Windows 95, 98 or NT4 running in 16-bit or higher color depth.
+		Pentium 166.
+		32 megs ram.
+		200 megs hard disk space.

+	Don't need SoftwareRender script anymore.

	Methods of lighting.
		Ambient.
		Vertex.
			Diffuse.
			Specular subdivided.
		Volumetric compositing.
			Ground fog.
			Volumetric shape functions.
			Polytope-clipped shape functions.
			Volumetric raycasting.
			Multilayered.
		Surface compositing.
			Shadowed, shaped surface lighting.
			Raytracing.
			Specular highlight mapping.
			Projective surface lighting.
		Surface cache.
			Specular bump mapping.
		Optic.
			Coronas.
			Lens flares.
		Radiometric.
			Static and scaled dynamic.
			Hemicube, emitter, and form factor math.
			Color bleeding.
		Dynamic shadowing.
			Shadow z-buffer sampling.
			Shadow volume clipping.
		Psychoptic.

====2
+	Setup effects so dynamic lights can do flares. -> Needs work after scene frame finalization.
+	FVolActorLink
+	Cleanup UnRender.h and separate public / private info.

///////////////////////////////////////////////////////////////////
9-25-97

+	FTextureInfo needs FColor MaxColor.
+	Use FTextureInfo for panning.
+	Consolidate texture coordinate system.

+	Type mismatch in region when loading? CPT_Struct / CPT_Struct why would UnrealScript save defs?
+	Merged with Steven.
+	Test debug rebuild.
+	Test debug run.
+	Zones not being set?

+	FTextureInfo needs PaletteCacheID.
+	CID_RenderTexture
+	CID_RenderPalette
+	CID_RenderLightMap
+	Tick when lock for rendering with camera.

+	TL_Render.
+	Move UPalette::GetColorDepthPalette logic to URender::PostLockTexture.
+	UTexture::Lock no fail.
+	New FSurfaceInfo and FSurfaceFacet definitions.
+	Update UTexture::Lock to generate all FTextureInfo data.
+	DrawPolyV use facets, and finalized parameters.
+	Lock return X, Y dimensions of frame buffer.
+	FSurfaceInfo needs Level.
+	Don't pass camera to RenDev at all!

+	Update DrawPolyV.
+	Update DrawPolyC.
+	DrawPolyV take an FTextureInfo complete with palette, instead of a UTexture.
+	Insulate render device code completely from UObjects.

///////////////////////////////////////////////////////////////////
9-26-97

====3
+	Cleaned up texture and lighting interfaces.
+	Simplify software DrawPolyV by using the passed coordinate system and other info.
+	Light manager setup-for-surface, take advantage of Surface and Facet.
+	Unfix texture coordinates.
+	Cleanup light manager as much as possible.

====4
+	Texture cleanup.
+	Force persp sub to be multiple of 4
+	Heckerize the setup.

///////////////////////////////////////////////////////////////////
9-27-97

+	Separate span setup and span rendering, for MMX-ability and span setup optimizations.
+	Lighting inner loop work off the setup structs.
+	Texture inner loop work off the setup structs.
+	640x480 no actors (82) -> 87 -> 85 -> 86 -> 75
+	Ultra simplify span subdivider in anticipation of assembly language conversion.
+	Blit inner loop work from spans (move out for cache improvements?) - max 64 wide?

+	Support adaptive span subdivision based on perspective.
+		9.5 -> 6.2 -> 6.4 -> 5.7
+	High level optimize Light() in anticipation of asm.
X	Use logarithmic table and fadd/fstp?
+	Pick span subdivision size based on perspective error, not resolution.
+	Pick 4/8 lighting gradiation based on distance, mipmap, etc.
+	Compute proper mipmapping range: MinMip, MaxMip from Distortion factor, MinZ, MaxZ.

///////////////////////////////////////////////////////////////////
9-28-97

----*
+	Base lighting on QWORD's.
+	Finally resolved all light mesh clamping issues!
+	Light meshes are now symmetrically bordered.
+	Cleanup the vars.

///////////////////////////////////////////////////////////////////
9-29-97

----5
X	Implement caching and gmem allocating for light maps, to reduce conversion overhead.
+	Went to 32-bit lighting format with fast 4x oversampling: Speed and cache improvements!
X	SetupForSurf take destination format parameter.
+	Texture loop must actually operate at 7 c/p.
+	Go from 12 byte intermediate table to 8 byte. [RAddr32 / GAddr32 / BAddr32 ] [TexRGBX32 / LightRGBX32]

+	Go from 12 byte light table entries to 4 byte.
+	2X2 dithered blit pass.
+	Merge pass explicitly take advantage of per-two-pixel lighting to avoid redundent loads/stores.
+	Merge the shade tables to use less memory.
X	Skew the shaders to prevent cache bank conflicts.
+	Pre mask the light maps.
+	Keep as much precision as possible during lighting.

X	Gamma correct texture palette entries so there is more precision at the low end. -> Looks way worse!
X	4 normalized versions of all the tables?
+	Slight interval shortening to improve pixel quality.

///////////////////////////////////////////////////////////////////
9-30-97

+	Option to show span subdivision graphically; tune the hell out of it.
X	Can get away with much more subdivision tolerance if I subdivide from furthest
X		to nearest instead of left to right.

X	Separate light and texture setup so that mipmapping doesn't slow down lighting?
X	No need, if mipmapping is done per subspan.
+	Use 24-bit fp precision.

X	Or exploit mipmapping for lighting too?
+	Mipmapping by storing iMip in subdivided spans.
+	Figure out approach to compositing the mipmaps and lighting.
+	Support mipmapping.
+	Fix cache id conflicts.

X	Adaptive light map oversampling based on mipmap? -> Looks crummy.
X	2X / 4X / 8X: Big quality improvement, big time savings.
+	Fix palette trashing conflicts.

X	Formalize the one-lighting-per-two-pixels setup.
X		Optimize LightPass, MergePass accordingly.
X		Complicates the merge code more than it simplifies the light code.
+	Always track proper X start of spans (needed for dither and lighting).
+	Remove color depth sensitive logic from the setup.

+	Fixed texture mipmaps not colors 0-9, 246-255.
+	Fixed trace bug falsely hitting level before actors.

----*
X	Separate texture and lighting setups. -> Faster if both are together.
+	Mipmap via separately preshifted setups, not by inner loop hell.
X	Cache the per surface setup?
+	First texture setup in each span needs pointer to texture function.

///////////////////////////////////////////////////////////////////
10-1-97

+	Fix all lighting at max brightness.
+	File format research.

///////////////////////////////////////////////////////////////////

	Lost a ton of log entries because fucking Microsoft 
	Windows NT 4.0 the supposedly reliable enterprise server operating 
	system crashed yet again and trashed my doc files. Anyway I've been 
	working on the new software rendering code and the file format.

///////////////////////////////////////////////////////////////////
10-4-97

+	All bitmask and union code is now byte order neutral.
+	Move all FOR_ALL_OBJECTS style macros to FObjectsIterator, eliminate object array accessors.

====5
+	File saving.
+		Merge SaveDependent into SavePackage.
+		Eliminate UTextureSet; the RF_Public mechanism takes precedence!
+		Eliminate class linkers; RF_Public takes care of it!
+		Update UnrealEd texture package handling.
+		UnrealEd support texture groups.
+			Importing textures.
+			Creating new textures.
+			Loading and saving packages.
+			Browsing packages.
+			Browsing groups.

+	Clean up file saving.
+	Cleanup the script defined intrinsic classes, like Texture.
+	Update the installer.

///////////////////////////////////////////////////////////////////
10-5-97

====6
+		New FPackageFileSummary.
+		Properly save all names and FNameEntry's in new format with offset/count.
+		ULinker should own summary
+		Properly save FObjectImport's in new format.
+		Properly save FObjectExport's in new format, with temporary package cheat.
+		Cleanup general loading code, use AR_INDEX.
+		ULinker load the import and export tables.
+		AllocTables function.
+		Backup.

====7
+	Load imports direct from FObjectImport's, with no object bases.
+	Don't even bother saving the import bases.

+	Use ExportMap for load-linking.
+	Eliminate ResMap entirely.
+	Kill unlinker.cpp

+	Eliminate serializing object bases.
+	Eliminate file-related info in UObjectBase.
+	Merge UObjectBase into UObject.

+	ULinker shouldn't be omniscient; it should use the normal object creation/deletion functions.
+	Do use LinkerIndex.

+	Saving code just stick temp index into UObject and FName directly, to eliminate n^2 searches.
+	Sort names and objects by usage count to get best compression results.
+	Perform sorting and tagging by actual serialized values.

+	Linker should create/replace objects using the standard object creation functions.
+	Merge InitObjectHeader into InitObjectBase.
+	InitObjectBase only called in one place?

///////////////////////////////////////////////////////////////////
10-6-97

====8
+	Cleaned up load-context-flags handling.
+	Make loading safe regardless of class hierarchy order; eliminate hierarchical sorting.
+	Eliminate RF_UnlinkedHeader.
+	Eliminate PreloadHeader.
+	FinishLoading do all postloads on tagged objects.
+	Privatize internal ULinkerLoad functions.
+	Cleanup loader.
X	Can eliminate Preload entirely by always loading data on-demand? -> Preload is Good.

====9
+	BaseFlags -> StaticFlags
+	GetBaseClass() -> StaticClass
+	TArray -> TList.

====10
+	Eliminate UExports.
+	EliminateUImports.
+	EliminateUGuids.

+	Store "class-class" index as 0.
+	Store export classes as linker indices, not names.

====11
+	FindObject<class>
+	ParseObject<class>
+	ImportObject<class>
+	DuplicateObject<class>
+	No explicit tagging of exports' class names and class packages.

///////////////////////////////////////////////////////////////////
10-7-97

+	ParentClassIndex.
+	Fixed UTextBuffer FOutputDevice call failure (How did this code ever work?)
+	Object finding should take fname as param rather than string.
+	Object creation take FName.

====12
+	Kill operator new's for finding/importing, and use template functions instead,
+		to eliminate need for empty default ctor.
+	IsA<UClass>()
+	Merge header and data loading.
+	Cleanup preloading.
+	No sorting classes to top of export map.

====13
+	Maintain the new FObjectExport properties: ClassPackage, ClassName.

+	TArray shrink function.
+	TArray expand overallocate to prevent allocation CPU hogging.
+	TArray loading and saving should shrink; not save Max.

///////////////////////////////////////////////////////////////////

[Confidential - for Unreal developers and licensees only]

Here is the scoop on 3d hardware support in the Unreal engine.
Everything here applies to the Unreal engine in general, and therefore
also to Epic's Unreal title.

Direct3D
--------

Unreal's Direct3D support will provide lowest-common-denominator
functionality for all 3D cards with a certain minimum set of capabilities
(such as alpha blending, modulation blending, palettized texture
support, and 2 megs of texture memory) and performance (30mpix or better).

Because Direct3D is in an early state of its evolution, there are a
lot of problems when prevent Direct3D from performing efficiently on
current high-end 3d hardware. Without going into much detail, the
major deficiencies are:

* Lack of support for texture caching.
* Poorly defined feature set (caps bits), resulting in a lot of drivers not 
  supporting a lot of features, and a high probability that an app won't 
  work on D3D on one piece of hardware, even though it works fine on others.
* Abstraction of 3d hardware is very indirect and layered.
* Lack of IHV extensibility makes it impossible to support leading-edge 
  features that certain hardware supports.

Overall, Epic is pro-Direct3D and we look forward to seeing it mature and improve.
But, in a market where gamers demand 100% performance, we realize that Direct3D
isn't suitable as Unreal's sole 3d interface.

3dfx Glide
----------

I have defined a standard plug-in driver interface for 3d hardware in Unreal,
and I implemented a 3dfx Glide driver performs very well.

3dfx is Epic's reference platform for Unreal, and we will be 
writing and optimizing our 3dfx Glide driver internally.

I chose 3dfx as the Unreal I reference platform nine months ago because it was
by far the fastest card and easiest API on the consumer market at the time.
This decision doesn't reflect bias towards 3dfx in any way; it is
simply a result of:

* Epic needing one reference platform to do all initial and experimental development on.
* Needing a platform capable of demonstrating the engine's full feature set and speed.
* Epic's limited resources prevent supporting more than one 3d hardware platform internally.

The reference platform will be reevaluated for the Unreal II project,
at which time we will evaluate all available alternatives.

Native support for other 3d hardware
------------------------------------

Beginning with NEC, several IHV's (independent hardware vendors)
have come to us with an interest in developing Unreal drivers 
native to their hardware.

This is an exciting proposition for all parties, because it enables
our engine to support new 3d hardware with its maximum possible
performance and feature set, rather than regressing to the
lowest-common-denominator of Direct3D.

Mark Rein negotiated a deal with NEC to support the PowerVR
architecture natively, and this has turned into a business
model that we are offering equally to other IHV's who are interested.

The deal involves:
1. The IHV obtaining a source code license to the Unreal engine,
   along with full source code.
2. The IHV obtaining tech support from Epic as to how to work with
   the driver code and optimize for the engine.
3. The IHV starting with Epic's Glide driver source code, and
   converting/rewriting it to support the driver's proprietary
   API or hardware directly.
4. A committment for the IHV and Epic to test the driver to
   assure compatibility.
4. Epic agreeing to ship the IHV's driver with Unreal I and to
   make it freely available to all our engine licensees like
   Microprose and GT, who we assume will want to ship it.

The source code license portion of this deal requires that the
IHV pay Epic a reasonable licensing fee.  A license fee is a 
fair requirement because:

* Epic is providing the IHV source code and access to possibly
  the most advanced piece of 3d gaming technology in existence.

* Supporting the IHV's (including answering their questions and 
  testing their drivers) is a significant opportunity cost.

* Requiring payment separates the IHV's who are serious about 3d 
  gaming and are willing to invest in a quality driver
  from the ones who just regard Unreal support as a checkbox item.

* As proprietors of the Unreal technology platform, we need to
  maintain a business model that works, where everyone who reaps the
  reward of our work in the marketplace pays a fair value. This enables
  us to invest further in our technology development.

Mark Rein is now involved in negotiations with three other
top IHV's about similar arrangements. We will announce them once
agreement has been reached.

Not all IHV's are interested in this business model. This is their
choice, of course, and Unreal will support their hardware (assuming
it meets our feature set requirements) through our generic Direct3D
driver. One example is NVIDIA, whose RIVA 128 chipset is designed from the 
ground-up for Direct3D performance, so they should do fine without
a proprietary driver.

///////////////////////////////////////////////////////////////////
10-8-97

====14
+	ULinker needs FName Package (filename->package).
+	FObjectManager maintain ULinkerLoad array always.

+	Improve generality of preloading between ULinker and FArchive.
+	UObject::Preload.
+	ClassGuid -> FGuid.

+	FinishLoading needs to be called again and again till done.
+	Yes! It works!

+	Maintain the new FObjectImport properties: SourceLinker, SourceIndex.
+		Validate that all linking is safe at constructor time.

====15
+	Eliminate old multi-package file save options, variables.
+	Eliminate export package names.
+	Deduce package name from the filename and optional override; don't load package name.

+	Support all Unreal file extensions and directories:
+		\unreal\maps		.unr
+		\unreal\textures	.utx
+		\unreal\system		.u
+		\unreal\sounds		.uax

+	MyLevel naming issues.

====16
+	Use the load context flags PER OBJECT at load time, no recursive test at save time, since
+		saver doesn't know object graph of the loader. Eliminate unnecessary old flags.
+	Imports respect context flags.

///////////////////////////////////////////////////////////////////
10-9-97

====17
+	Make filename accessible for better error-handling.
+	Support loading multiple packages.
+	Don't save CLASS_Transient classes in .u's.
+	Don't allow scripting of CLASS_Transient classes.

+	Single InitObject gate function, takes UClass* DefaultsClass.
+	InitObjectBase ues 
+	Eliminate CLASS_ScriptWritable
+	Eliminate CLASS_PreKill
+	All autoregistered classes are intrinsic; no need to specify explicitly.

====18
+	New RF_Transient.
+	Treat classes as RF_Transient when preregistered, RF_Public when scripted.
X	Class definitions should take optional object flags (i.e. RF_Transient) to prevent saving.
+	Map imports of public transient objects to in-memory objects.

====19
+	Default converter for const char* -> FName
+	Eliminate the redundent UObject functions that take strings instead of FName's.
+	C++ Question: Is operator new called when objects are created on the stack? No.
+	C++ Question: Is operator delete called when objects are created on the stack? No.

+	Replaced UObject::Kill with UObject::operator delete -- now much more C++ style.
+	Change PreKill() to Destroy().
+	InitHeader -> Create
+	PreKill    -> Destroy
+	Eliminate the empty default ctor.

+	No UObject::IsA(FName).
+	Only export intrinsic classes and their enums to C++.
+	Eliminate old header terminology.

====20
X	SerializeData -> SerializeDatabase.
X	UObject::Serialize should call SerializeDat automatically.

-------------------------------
Summary of UObject improvements
-------------------------------

Unreal object creation and destruction now is more standard C++ style.

Objects are now allocated using the UObject constructor rather than the weird
custom operator new syntax, for example:

	Old:	UTextBuffer* T = new("Name",NAME_Transient,CREATE_Replace)UTextBuffer(0);
	New:	UTextBuffer* T = new UTextBuffer(0,"Name",NAME_Transient,CREATE_Replace);

Objects are now destroyed using the standard C++ notation.
	Old:	T->Kill();
	New:	delete T;

InitHeader()      has been changed to Create().
PreKill()         has been changed to Destroy().
SerializeHeader() has been changed to Serialize().

Objects are now zero-filled when created, so there is no need for Create() to initialize
member variables to zero.

The INDEX typedef has been replaced with the more intuitive INT typedef.
Name indices have been widened to 32 bits in order to remove the hardcoded limit of 64K names.

When Unreal automatically generates C++ header files based on scripts, it only
exports intrinsic classes (it used to export all classes).

UClass::IsA now requires a UClass* as a parameter rather than a name.

-Tim

///////////////////////////////////////////////////////////////////
10-10-97

====21
+	Changed INDEX to INT.
+	TArray-ize.
+		UMeshVerts.
+		UMesh: Everything.

	Note to all mesh people
	-----------------------

	"#meshmap new": This command is no longer necessary/supported and should be deleted.
	
	Meshes for which you use "#meshmap new" to create a new, separately textured
		instance, need to use the new "Skin" approach to replace texture 0.

	I added a new option to #mesh import" to force all polygons to use texture #0.
		The syntax is:
			#mesh import MESH=meshname ANIVFILE=fname DATAFILE=fname ZEROTEX=1
		For meshes which only have one skin texture mapped to them, this makes it easy
		to use the new Skin variable without having to manually change all texture
		numbers on all polygons to zero.

	James: Unreal I meshes which must use texture #0 and the Skin variable (rather
		than the old "#meshmap new" approach):

		BabyCow
		Behemoth
		MiniBlob
		GiantGasBag
		GiantManta
		Rock1-3
		SacredCow
		Skaarjb
		SkaarjLord
		StoneTitan

	These changes should be easy to make: Just set the "Skin" variable in the
		.uc files, add the "ZEROTEX=1" option to your "#mesh import command", and
		make sure you're importing texture #0.

====22
+	NAME_INDEX -> INT
+	FName -> 32 bits
+	_WORD

+	New UObject::InitVTable.

+	Cleanup all multiple inheretance vftable issues.
+		FOutputDevice
+		FArchiveFileLoad
+		FArchiveFileSave
+		FArchive
+		FTransactionTracker
+		FNetworkNotify

+	Fixed network play!

///////////////////////////////////////////////////////////////////
10-11-97

====23
+	Class cleanup:
+		UStackTree -> UClass subobject.
+		Merge Destroy & UnloadData.
+		Destroy must postroute.

+		UProperties -> dynarray inside UClass.
+		Class contain dynarray of properties, rather than being a database.

====24
+		Level actor list -> dynamic array.
+		Eliminate AddParentProperties
+		FExecStack contain ScriptClass variable.

====25
+		Script compile write to UScript using custom FArchive object; UScript no inheret from FArchive.
+		CLASS_ScriptCompiled
+		UScript -> UClass dynarray.

====26
+		Cleaned up UObject variables.
+		Now use pointer semantics for converting names to strings.

///////////////////////////////////////////////////////////////////
10-12-97

====27
+	Object improvements.
X		Move Empty and other database functions out of UObject.
+		Eliminate PostLoadItem.
+		Eliminate PostLoadData.
+		Retest textures, fire, etc.

+		GetObjectHash
+		ResArray -> TArray.
+		Global name table -> TArray.
+		TagGarbage cleanup.

====28
+		Importing bugs.
X		Safe creation and management of on-stack objects? NO WAY!

+		CREATE_MakeUnique/IMPORT_MakeUnique: Signify this with NAME_None.

///////////////////////////////////////////////////////////////////
10-13-97

+	An object's name is persistent and does not change over the 
+	persistent lifetime of the object.

+	UEnum   Should be public but not standalone.
+	UStruct Should be public but not standalone.

+	RF_Public     - visible to other packages.
+	RF_Standalone - should be saved in files regardless of whether it's referenced.

X	Store explicit file dependency list in package (Dependencies); map to ULinker's.
X		Not needed - can build on-the-fly for network clients who ask for packages.

+	Name-scoping of objects.
+		Scope objects by "objname.pkgname" rather than "classname.objname.pkgname".
X		Negative name indices for private objects (replaces RF_Public). Messy.
X		Enforce public objects must be named at create/import time.
+		Enforce no-saving if private imports.
+		Enforce no-importing of non-RF_Public objects.

X	Only show RF_Public objects. Nevermind.

====29
+	Eliminate ECreateObject.
+	Eliminate EImportObject.
+	Eliminate EDuplicateObject.
+	Eliminate EFindType: Now have FindObject, FindObjectChecked

+	Proper new-format loading of the level.

///////////////////////////////////////////////////////////////////
10-14-97

====30
+	Fix new problems.
+		Broken collision -> RootHull wasn't being imported. Eliminate RootHull.
+		Font colorization -> Was a sizeof(FName)==2 dependency.
+		Merged RF_Hardcoded and CLASS_Intrinsic into RF_Intrinsic.
+		Water and fire dead -> Was SetClassVTable not getting called.
+		Script compiler lockup in UnrealEd.
+		New mesh bounds problems -> Forgot to serialize LocalBound when removing UPrimitive script.
+		Can't shoot -> Was problem with non-probe names being mapped to probes since probes were sparse!
+		Runaway lockup when die. -> Was the probe problem.
+		Torture test importing.
X		Retest the suites.
+		Test sound effects.
+		PaletteCacheID conflicts in UnrealEd.
X		Let intrinsic classes preregister at load-time for DLL's.
X	Global postload & GC solution for all objects; not just the loaded ones.
+	SetClassVTable cleanup.

///////////////////////////////////////////////////////////////////
10-15-97

====31
+	For performance, keep each linker loaded until its package is explicitly reloaded.
+	Package/filename resolution function.

+	Make sure objects untie themselves from their linker (if any) when destroyed.
+	Make sure linkers untie themsleves from their objects (if any) when destroyed.

====32
+	EndLoad completion must empty all import UObject pointers since they may become invalid.
+		Except for RF_Intrinsic objects.
+	GObj.CreateObject: first parm=class!
+	GObj.FindObject: first parm=class!
+	Proper new-format loading of the Render.u.
+	Can stop statically linking Render dll!

====33
X	Track autoregistrants via TArray -> startup issues.
X	When recursively loading, map LOAD_ReplaceImports->LOAD_ReplaceExports, LOAD_ReplaceExports->0.
+	Loader option to keep existing objects which have linkers rather than replacing them.
+	LOAD_NoFail LOAD_NoWarn LOAD_KeepImports
+		Store flags in ULinkerLoad.
+		Proper Editor.u loading. -> Current approach is ok.
+		Use properly in all load-calls.
+	Error loading lev in unrealed
+	When saving a package, uncache any loaders for it.

====34
+	LoadObject: If name has a dot in it, try to extrapolate a package.
+	Unhardcode UnrealGameInfo.
+	Unhardcode Human/Female class. SpawnPlayActor.

+	New command-line parameters:
+	Unreal.exe GAME=UnrealI.DeathmatchGame
+	Unreal.exe PLAYER=UnrealI.Female
X	Avoid editor recreate-in-place problems? -> This is ok.

====35
+	Steven's aitest level crashing.
+	UObject::StateProcess crashing. Steven.

///////////////////////////////////////////////////////////////////
10-16-97

====36
+	Merged.
+	FindObject accept package.name syntax for name if package is unspecified.
+	Steven moved the models and sounds into their own directories.
+	Now, all #exec importing is relative to the package's base directory.

====37
+	Turning collision hash on and off (Editor & Game!)
+	FLinkerInfo.
+	FLinkerMap.
+	Fixed template RemoveItem bug.
+	Communicate names via linker mapping in network play.
+	Regular expressions are cool: ^#exec[^$]*;
+	Condense indices into a single set, negative numbers indicate hardcoded.
+	UnChan, UnBunch: No AtEnd() b.s.

====38
+	Network play: Send objects as proper linker indices.

///////////////////////////////////////////////////////////////////
10-17-97

====39
+	Network play: Properly support RF_LoadForClient.
+	Only create actor channels if Connection has a level.
+	AView's not for play.
+	Test saving and loading savegames.
+		Problem is with loading a package whose name already exists.
+		Fixed with GObj.ResetLoaders(pkgname).
+	Resolve UnrealScript post-loadgame problems.

====40
+	Do UPlayer's need a ULevel? Just an AActor should be enough.

///////////////////////////////////////////////////////////////////
10-18-97

====41
+	Modularized ULevel::Listen.
+	LeaveWorld: StopNetworking.
+	FGlobalPlatform::LaunchURL: Error return string, or none.

+	Perform connection using GPendingLevel then switch immediately to GLevel.

====42
X	Should I use GPendingLevel for all levels, including local ones?
+	URL code must recognized filenames beginning with drive spec d: and ..

+	Test loading/reloading new game for gameplay.
+		Fixed that mysterious LoadObject<> duplicate loading but not postloading bug!
+	Critical: SerializeNetDriver

+	Separate camera creation from camera-actor spawning.
+	Load new level for gameplay work.
+	Reload level when enter game after pend.
+	When add a moving brush, if you have a Mover subclass selected, it uses that class.

====43
+	Make client UPendingLevel negotiate with server ULevel for entry.
+	Maintain GPendingLevel in background then switch to GLevel when it's ready.

+	Starting UnrealEd causes error.

///////////////////////////////////////////////////////////////////
10-19-97

====44
+	Fixed multiinstant client bugs.
+	Server send level filename to client, client use it.
+	Fixed bug garbage collecting names stored in active loaders.
+	When reload existing level, must release its loader.

+	Break EnterMap into Browse and LoadMap.

+	Server needs to send filename-based linker map to client.
+	Client needs to verify and match all package maps.

+	Server needs to add player spawn and game info packages to linker map.
+	Get each of the three test maps serving properly.

====45
+	FGlobalPlatform::CreateTempFilename(dir,out);
+	FGlobalPlatform::CreateFileMapping return safe error if not enough space or failed.
+	GetLinkerPackage: LOAD_NoLoad flag to only return if exists.

///////////////////////////////////////////////////////////////////
10-20-97

+	FGlobalPlatform::MoveFile.
+	Save file
+		Save using a temp name.
+		Warn rather than crash if not enough free space to save file.
+		Then rename.
+	Test saving and loading game.

====46
+	Ponder high-level networking architecture.
+	Network play: Server send list of packages in order to enumerate linker mappings.
+	Network play: Clean pre-gameplay code where client and server can exchange info.
+	Linker package info needs to be described as package names, not filename strings.
+	NotifyReceivedFile.
+	CHTYPE_File
+	UPendingLevel::Activate.
+	Support unreal://, http://, .unr, .html etc in "Open" command.

====47
+	GET filename.ext
+		USES: Send URL if downloadable. Send GUID. Send SIZE.
+			GetGUID.

+		UPendingLevel::ConditonalActivate.
+		PKG_Need
+		No FileCount.
+		Check that all needed files are downloadable.

+		NotifyReceivedFile: UConnection.
+		NotifySendingFile: Allow client/server to accept or refuse.
+		NotifyReceivedFile: Success flag.
+		Server.unr test config.

+		Handle pending level timeouts.
+		UPendingLevel needs failure indicator (Error256).
+		FGameEngine must cancel failed pendings.
+		Handle failed/refused/timedout file transfers properly.
+		Replace ConditionalActivate with explicit logic in UGameEngine::Tick.
+		UPendingLevel needs a URL variable; connect failure show URL.
X		Propagate ALL driver failure message to UPendingLevel. -> Use generic error message.

====48
+	"Cancel": Cancel pending level.
+	Steve found UnActCol.cpp Dilation bug.
+	LOAD_Verify: Only perform verification that a load is safe.
+	Open <invalidmapname>: Handle failure gracefully (no hard crash!)
+	"Open" command must print error on console.
+	All load functions: Take optional Error256 parameter to capture error info.
+	Gracefully handle trying to go into a map which doesn't have a valid
+		set of Unrealfiles.
+	Gracefully handle going into a server which doesn't let us download stuff.
+	All loaders: LOAD_Throw now propagates exceptions.
X	GetPackageLinker take optional Error256.
+	GetPackageLinker LOAD_NoFail and LOAD_Verify options.
+	All loaders: Common SafeLoadError error-handling gate.
+	When try to load a correct level after failing a load, bombs out.
+		Was caused by throwing exceptions creating unpaired EndLoads (check for this in GObj.Tick).

====49
+	Client-side error: Was JOIN storm overflowing.
+	FTextChannel: Prevent overflows.
+	Expanded reliable buffer to 16 to aid command and dependency sending.

+	Rearrange LoadMap, Browse.
+	LoadMap take package name and filename.
+	BrowseURL.

+	Test new single player and multiplayer entering and switching.
+	LoadMap don't take a package name.
X	LoadMap use FObjectManager::Resolve? No longer needed.
+	Backup.
+	LoadMap only take URL.
+	Changed audio=off to -nosound
+	Changed "ded" to "server".

+	AutoLevel should be AutoURL; should recognize URL.
+	No file= parameter (update UnrealEd).
+	Support unreal:// and internet address URL's at startup.

+	UPendingLevel.URL.Map and UPendingLevel::LevelPackage are redundent; see NotifyReceivedText.

====50
+	Privatize UObject copy constructor to prevent dangerous copying of UObjects.
+	New FString class.
+	FString::Length
+	Hide UObject and UObject-derived assignment operators.
+	URL handling based on FString.
+	GACK! The C++ copy constructor and assignment operator are different things.
+	Fix launching external URL's.

====51
+	UObject::operator== -> =
+	Do TArray assignment operator.
+	Do TArray copy constructor.
+	Test full rebuild.

+	Fully dynarrayize URL's.
+	Redesign FURL using constructors.
+	TArray placement operator new.
+	Test URL parsing and stringizing, including options.
+	Eliminate unnecessary FURL copy constructors and assignment operators.
+	FURL constructors.
+	Cleanup URL code.

+	Unify AutoLevel processing.
+		Handle unrecognized URL's gracefully.
+		Successfully startup and connect to remove level.
+		Support double clicking on .unr files.
+		Support .html links in teleporters.

+	Handle open with bad filename.
+	Handle open remove server failing.
+	Handle cancelling attempt to connect to remote server.
+	Cast<UClass>(uobj*) -> Casts object to new class safely; reduce IsA usage.
+	CastChecked<UClass>(uobj*) -> Casts object to new class safely; reduce IsA, ::StaticClass usage.

+	Move FString to template header.

+	EnterMap:
+		Error return code, or none if no level was opened and no error (i.e. external URL).
+		"Open" work for loading regular levels, not just internet addresses.
+		Open & post-tick teleportation should go through the same gate.

+	Test full rebuild.

///////////////////////////////////////////////////////////////////
10-21-97

+	James: talk to chris clark (needs 999 limit extended to 9999 in a version without the vertex problem).

====52
+	Use automatic default-ctor-function-ptr instead of InitVTable!
+	Eliminate InitVTable.
+	Eliminate StaticObject.
+	Use InitVTable to torture test constructor.

+	Allow pure virtual UObject classes, like UObject, UPrimitive, URender.
+	InitObject -> InitProperties (no ctor call).
+	Cleanup SerializeTaggedBin.

+	Public FObjectManager::ConstructObject.

+	Cleanup UPendingLevel::Create, UNetConnection::Create URL hacks.
+	Eliminate EC_Intrinsic.

+	Cleaned up constructors.

====53
+	No database(num,max) constructors; must add manually. Safer.
+	Move all ::Create functions to constructors.
+	Eliminate Create entirely.
+	Be careful with NO_DEFAULT_CONSTRUCTOR.

====54
+	ConstructObject should do construction; AllocateObject does allocation.
+	UObject constructor and destructor calls are now always paired!

///////////////////////////////////////////////////////////////////
10-22-97

+	Eliminate TList, UArray. ArrayTopicHandler.
+	Eliminated AR_OBJECT.
X	Move CreateObject functionality as possible to UObject ctors.
X		UObject::operator new should really just do placement.
+	Cleanup intrinsic UClass construction.
+	Eliminate CreateObject Template parameter?

+	Exporting xClasses.h: Only emit include if the damn file exists!!
+	Rebuild EngineClasses.h cleanly.

====55
+	Move player-only variables to APlayerPawn.
+	Had to keep the input booleans (like bFire for rapid fire). This is ok.

+	Closely examine UObject ctors and reduce to as few as possible.

X	Eliminate DuplicateObject, UObject::Copy?
+	Cleanup InitProperties, CreateObject, ConstructObject, InternalConstruct.
+	Make sure objects aren't constructed more than once

====56
+	Cleaned up sound registration (had a gc bug).
+	UTextBuffer base on FString.
+	Cleanup ULightMesh.
X	Cleanup UBitArray.
X	Cleanup UBitMatrix.
X	Eliminate UBuffer.
X	FOutputDevice, no binary "Write" function.
X	No editor recreate-in-place: always exit after make.

///////////////////////////////////////////////////////////////////
10-23-97

====57
+	When current level is networking and it gets disconnected, go
+		back to Entry level. Never ever keep a disconnected net level around.
+		UnLevTic.cpp: StopNetworking.

+	File transfer.
+		Implemented Heritage map.
+		Manage download requests and notifications by GUID.
+		Server accept file channels from client.
+		FPackageInfo needs PackageFlags; FileURL -> URL.
+		Game: delete cache\*.tmp at startup.

+		Download to a temp file in a temp dir
+		Then movefile
+		Then success
+		FFileChannel (send-mode, receive-mode).
+		Go into game when download completes.
+		Always have a single heritage Guid entry for caching.

+		Handle disconnect while downloading.
+		Handle timeout while downloading.
+		Make sure partially downloaded files are deleted.
+		Coverage test all file transfer errors.

+	Test under high packet loss conditions.
+	Exploit maximum send bandwidth.

///////////////////////////////////////////////////////////////////

	** NOTE **

	Coverage testing is an awesome way to fix bugs in
	seldom-executed code!

///////////////////////////////////////////////////////////////////
10-24-97

====58
+	IndexToObject:
+		Client should do a LoadObject on objects the server specifies but the
+		client doesn't have.
+	EnterMap must do all network mode handling.
+	Eliminate clientside preplayerspawning.
+	Eliminated SendEx.
+	Handle refusal/connection failure in pending level gracefully.
+	Cleanse warnings.
+	Safely recover after recursive noncritical package-load fails.
+	Cleanup loading messages.

///////////////////////////////////////////////////////////////////
10-25-97

====59
+	Always keep Entry level around.
+	BrowseURL needs relative flag; level switching use it; typing url don't
+	ULevelBase, base class of ULevel and UPendingLevel.
+	Eliminate ULevel::StopNetworking.
+	Make sure ULevel::StopNetworking is completely superceded by garbage collection.
+		Test exit.
+	Server should never create actor channels for actors whose class
+		can't be mapped into the client sandbox.

====60
+	Objectify UNetDriver and cleanup garbage collection.
+	Built teleporter test level set.

====61
+	Fixed input button anomalies.
+	Walk between levels using proper teleporter destinations.
+		Single player.

+	Cleanup player spawn processs.
+		Accept requested teleporter.

///////////////////////////////////////////////////////////////////

================
Notes for Steven
================

My changes
----------

1. I moved all of the player related Pawn variables to PlayerPawn
   and updated the engine accordingly. Note that we need to keep
   the input buttons like bFire in Pawn, because they are used
   by weapons, and bots will need to manipulate them.

2. You can now specify the default player class and gameinfo class
   in the Unreal.ini file.

3. Saving and loading the game works.

4. You can now switch levels during gameplay safely with the "open"
   command which now takes a URL (pointing to a local or remote level)
   as a parameter. There are some other cool things you can now do with
   URL's, like:

   * Specify the player class to use.
   * Specify your player name and team.

5. I cleaned up the Login command to support the new features. Please be 
   careful to merge the changes in.

6. I modified FindPlayerStart to support teleporter destinations in addition
   to PlayerStarts. Now it has to return a NavigationPoint. This way you can
   go into a level specifying the destination, like "open unreal.unr/myentrance".

7. I changed the format of Login to handle a more expandable way of 
   passing parameters like the name, team, and password.

Important things I need from you
---------------------------------

1. We need to get baseline gameplay fully functioning with only the 
   Engine package (not the UnrealI package). This way, licensees can
   easily separate their stuff from ours. Right now there are only two
   things preventing this:

   * We need to get the game working with players belonging to
     the PlayerPawn class (as opposed to Male or Female). Just stick in a dummy
	 sprite (like the joystick) in place of the mesh, and make sure you can enter
	 the game as a PlayerPawn without getting any errors/warnings. You can test 
	 this by using the open command "open unreal.unr?class=playerpawn", as opposed
	 to "open unreal.unr?class=female".

   * Make sure the base GameInfo class works for gameplay.

2. Please test out all of the multiplayer GameInfo classes now that the
   engine supports them properly.

3. Make sure the player field of view angle is 90 degrees for all player classes.

4. Use default physics for projectiles and things wherever possible, to avoid 
   having to initializing physics (which uses network bandwidth).

5. We can now safely restart the level when the player dies in a single-player
   game. The way to do this is call (In UnrealScript):
       ClientLinkToURL( "?restart" );
   You can restart the current level on the command line by typing "open ?restart".

6. Play some network play with monsters and checkout the ScriptWarn: messages in
   the log on the client and server.

7. For network "spectator" handling, can you add a ViewTarget variable to
   the PlayerPawn class which can point to any valid actor? When that is not
   set to None, the PlayerCalcView function should use the ViewTarget's
   location and rotation (or viewrotation if it's a pawn). This way, you can play
   a network game and see the game through another player's eyes! Then, how about
   an exec function "ViewPlayer" so the player can set or reset their ViewTarget to
   another player. Also perhaps a "ViewClass" so the player can increment the view 
   among actors in the level of a certain class (like Skaarj).

8. We no longer need SpawnEveryRequiredClass functions, because I can now dynamically
   load classes like the GameInfo and PlayerPawn subclasses even though they aren't
   referenced by a level.

Less critical things I need from you
------------------------------------

1. Gratuitous effects like flies should all be clientside.

2. Client-side death controls after dying.

3. Can you set up the BlockMonsters and BlockPlayers actors so they don't
   block projectiles?

4. Moving brushes in the BumpButton, BumpOpenTimed, and StandOpenTimed states, 
   and triggers in all states, need flags or variables to indicate who can trigger 
   them (perhaps players only, all pawns, monsters only, a certain class like Nali 
   only). I think you'll need to deal with these issues for bots anyway.

///////////////////////////////////////////////////////////////////

Unreal URL's
============

Unreal URL's use the same syntax as Web and FTP URL's. They can include
the following components:

Component       Description
--------------- -----------
unreal://       Indicates that the URL refers to an Unreal level.
Host address    Internet address (like 200.0.1.40 or unreal.epicgames.com).
Host port       Optional port to use on the host.
Level name      Name of the level to enter in.
Portal name     Optional name of the teleporter to enter through.
Class           PlayerPawn class to use: Either Male or female.
Name			Name you want to use in the level.
Team			Optional team name.
Password        Optional password.

Here are some sample URL's
--------------------------
mylevel.unr
200.0.1.40
unreal://mylevel.unr
unreal://200.0.1.40
unreal://200.0.1.40/levelname/portalname
unreal://unreal.epicgames.com?name=Tim?team=MyTeam?password=MyPassword
unreal://200.0.1.40/levelname/portalname?Class=Male

How to use Unreal URL's
-----------------------

When playing Unreal, you can type "open" followed by an Unreal URL to enter a new
level or server. For example, "open unreal.unr" or "open 200.0.1.40".

In the Windows "Start/Run" menu, you can type an Unreal URL (which must be preceded
by "unreal://") to launch it directly, for example "unreal://unreal.epicgames.com/".

On a Web page, you can place a hyperlink to an Unreal URL just like a link to a 
Web URL. For example:

   <A HREF="http://www.epicgames.com/index>This is a Web link. </a>
   <A HREF="unreal://unreal.epicgames.com/mylevel>This is an Unreal link. </a>

You can restart the current level by opening the "?restart" URL, i.e. by
typing "open ?restart".

///////////////////////////////////////////////////////////////////
10-26-97

====63
+	Network entry.
+		Have client send server his actual URL rather than breaking up into options.
+		FString FURL::ParseOption(str), i.e. for class=male skin=skinname.
+		FURL::HasOption(optionname)
+		Accept requested spawn class only if visible in level sandbox.
+			LoadObject needs an optional FPackageInfo Sandbox.
+		Fully robust SpawnPlayActor.

+		Need three options for creating relative URL's: Absolute, Partial, Relative.
+		When travelling around, carry name, team, ?options. Yay!

+		Support bLonePlayer network downloadable, played-alone levels.
+		Fixed VC++ project dependency order.

X		FURL::ConvertToText: Diff options if Base specified? Need base?

+		Specify name, team, and password with "?" options rather than URL syntax.
+		Update the url doc and notes.

+		Adding options to URL, prevent duplicates.
+		Init initial URL from DefaultPlayer options rather than hardcoding it.
+		Cleanup the .ini.

+		If Server fails "Join", send client "FAILURE" message.

====64
+		BrowseURL->Browse.
+		PLogin needs way of returning error text.
+		UNetConnection needs Logf instead of control channel; no GetControlChannel.

///////////////////////////////////////////////////////////////////

	The new minimum system.
		Pentium-166
		32 megs of RAM (*NOT* 16 megs)
		Windows 95/98/NT4/NT5

///////////////////////////////////////////////////////////////////
10-27-97

+	Design goals.
+		Fun playability @ 250 msec ping, 1800 bytes per second, 15% packet loss.
+		Works not too terribly @ 800 msec ping, 1000 bytes per second, 40% packet loss.
+		Easily backwards compatible with future upgrades.

+	After pending-level issues are resolved.

+	Network play post file-format.
+		Net login and logout as identical as possible in single player and network play.
+		UnrealServer game info specification at startup.
+		Get PlayerStarts properly spawning players.
+		Players enter level in limbo before LOGIN command (no visible player pawn).

+	Network play 4.
+		Test UNetPlayer spawn play actor failing.
+		Handle login failure gracefully.
+		Proper player name and options management.

+			Skin dload? -> No skin transfer for Unreal1. Instead, just allow the player
+				to build a uniform of predefined parts and colors like UO.
X			Packages & Package CRC's. -> GUIDs.
X			Record & play clientside demos. Post release.

+			Serverside allow_download per package

====65
+	Tween-into doesn't do any tweening-into at all (changing value doesn't have effect).

+	Glide.
+		Lightmap overrun bug - undocumented Glide limitation.
+		Mesh rendering garbage bug.

+	Can't access State, Group in UnrealEd.

+	ByteLimit at login-time.
+	Client must handle server shutdown gracefully. -> Fail to entry.
+	Retest savegames.
+	Test rebuild with all checks.
+	Test no ASM build. Check all __asm.

+	Test debug build.
+	Handle error shutdown more gracefully.

+	Steven merged.

====67
+	Download; failed to move package (remote PC): Crash.
+	Win95 map saving filename problems.

///////////////////////////////////////////////////////////////////

---- Update notes

	Update is on the server.
	Maps need to be reimported.
	This version fixes many but not all of the reported bugs, so
		it's still very experimental.
	Steve will be updating the AI (.u files) separately.

---- Tim Part 1

The HUD.
	It's back.
	I'll get Steven to add the armor value.

F12 crashes game.
	Can't duplicate.
	I'll try it with the latest Glide drivers.

Button sticking problems.
	Can't duplicate or see any reason for this.
	Is it with all weapons or certain weapons only?
	How frequent?
	Does it ever happen in single player?

Console hall of mirrors.
	Working on it.

Network ~FActorChannel crash.
	Can't figure this out.
	Added more debugging code so I can narrow the problem down.

Saving problems.
	Fixed.

MaleBot crash (was on Steven's list).
	Fixed. This was my bug.

Actors(0) crash in UnrealEd.
	This is the new problem with undoing adding actors and brushes which
	I haven't worked on yet.

Explosion remaining bug.
	What weapon and firing mode is this?
	Do you always see this happen, or just sometimes?

---- Tim Part 2

Myscha OccludeBSP FMemCache::Create problem.
	I think I fixed this.

Myscha Removed!=0 crash while saving.
	Looking into this.

Texture browser resource drain.
	I think I just fixed this.
	If this crash happens again, please let me know.

Moving around the first person editor rendering view crashes the game with an
ole automation error(still).
	Take a screenshot of this the next time it happens.

Editor zooming in 2d windows.
	Does this happen with brushes that haven't been sheared?
	Can you show me this?

Can't set state of movers, triggers, etc.
	Fixed.

No fake backdrop rendering.
	I eliminated this with the new software rendering code. I don't
	want to spend time rewriting this temporary feature. The upcoming
	SuperCoolAwesome sky will take care of this.

Some movers don't collide.
	Are you sure the mover isn't scaled or sheered?
	Movers can't safely be scaled or sheered.
	If it's not scaled or sheered, please put the map in the Bugs directory.

Selectng a menu option causes the current weapon to fire.
	Looking into this.

Moving brushes not working.
	Fixed.

///////////////////////////////////////////////////////////////////

	Major programming remaining on engine & game.
		Rendering.
			Finalize new 3d hardware interface.
			Optimize Pentium & MMX software world rendering (Tim & Erik).
			Optimize all creature rendering.
			Portal optimizations.
		Networking.
			Bandwidth optimization and tweaking.
			Improve server robustness.
			GameSpy style information querying.
		Engine.
			Cleanup UnrealScript versioning & extensibility issues.
			Modularization issues for licensees.
			Status & HUD support.
			DirectInput joystick support.
		Other.
			Configuration menus.

///////////////////////////////////////////////////////////////////
10-28-97 & 10-29-97 (wraparound)

+	Fixed file saving MoveFile problem (Microsoft MoveFileEx bug).
+	Fixed saving not overwriting problem.
+	Fixed UnrealEd recompile crash.
+	Fixed PlayAnim/LoopAnim TweenTime.
+	Lame HUD is back.
+	HUD armour hack -> Steven.
+	Texture browser memory leak.

+	10AM Meeting
+		Mike Rider       - GT VP Dev
+		Mike Bartholomew - GT CTO
+		Cliff:
+			Show Unreal
+			Show UnrealEd
+		Tim:
+			Show networking
+			Discuss work remaining
+			Discuss GT/Microprose licensing issues & future

+	Torture testing.
+		Default state and groups being lost.
+		Unreal.unr: Brushes disappearing - only after save and reload.
+		Unreal.unr: Going through movers.
+			UModel serialization problem: Not calling UPrimitive::SerializeData.
+		Mover, trigger states.
+		Test movers.
+		Test savegame states.

+		Adding mover loses state.

///////////////////////////////////////////////////////////////////

	Competitors' marketing materials to check out:

	Monolith's DirectEngine: http://www.directengine.com/
	NewFire's Torch: http://www.newfire.com/

///////////////////////////////////////////////////////////////////
10-30-97

====68
+	Use mipmult 0.5
+	New FProperties
+	Fix importing maps with forward actor references.
+	ULevel::CompactActors.
+	Base importing actors on SpawnActor.
+	F7 isn't parsing recompiling the right scripts.

///////////////////////////////////////////////////////////////////
11-5-97

====69
+	FPerObjectIterator

====70
+	Backup.
+	UStruct::ImportBin.
+	Eliminate FPerObjectIterator
+	PlayerCalcView needs to return actor not to draw (self or viewtarget).
+	FArray and FString improvements.
+	TArray dtor-safe.
+	UStruct XProperties[2].
+	Eliminate ObjThisSize.
+	Replace ObjFullSize etc with FProperties::Size.
+	Script compiler use Properties, Locals.
+	Eliminate UnrealScript "contains".
+	Eliminate RF_NoFreeData.
+	Eliminate UClass::AddProperty
+	No default locals
+	FProperties::AddProperty replace UStruct::AddProperty, UClass::AddProperty.

+	Convert to dynamic arrays:
+		UFont
+		UEnum
+		UMusic
+		USound
+		UPalette
+		UTexture
+		Fractal textures
+		ULeaves
+		UReachSpecs

///////////////////////////////////////////////////////////////////
11-6-97 & 11-7-97

====71
+	EmitSimpleVariable take EExprToken
+	EPropertyBin -> Editor only.
+	Eliminate EPropertyBin.
X	UClass "Contents" -> RecordSize.
+	Cleanup UnClass.h
+	Eliminate UBuffer.
+	Dynamic arrays. UBitArray UBitMatrix.

====72
+	Optimized Pentium tmap pas.
+	Unoptimized merge pass now supports 32 bit color.

///////////////////////////////////////////////////////////////////

	New sound subsystem basics.

	Changes
	-------

	The .ufx format is now obsolete.
	Now we just use .wav files for sound.
	You can still import .ufx files, but you lose all information in them
		except for the .wav they were created from.
	For best forward-compatibility, move all sound effects to .wav.

	Objects
	-------

	UAudioSubsystem is the abstract base class of the sound subsystem.

	The actual sound subsystem is implemented in a subclass of
	UAudioSubsystem. The reference implementation is UGalaxyAudioSubsystem,
	which supports the Galaxy music and sound system. However, UAudioSubsystem 
	is general enough that it can be ported to other sound systems fairly
	easily.

	USound contains a sound sample with the following characteristics:
		* .WAV format.
		* 8-bit or 16-bit format.
		* Monaural.
		* Either one-shot or looped.

	UMusic contains a digital music file with the following characteristics:
		* 16 or fewer channels.
		* .MOD, .STM, .S3M, .IT format.

	UnrealScript interface
	----------------------

	PlaySound - plays a simple, non-looping sound effect emmanating
	from the actor.  Use this for all normal game sound effects.

	ClientHearSound - called when a particular PlayerPawn actor hears
	a sound effect. This is how sounds are sent to clients in a
	network game.  You may call this function directly (in a particular
	PlayerPawn) to have only that one player hear a sound.

	3D positioning
	--------------

	A sound is positioned in 3d space, positioned at the Location of the actor
	who played the sound effect or ambient sound.

	As the actor that played the sound moves around, the actor's sound 
	is repositioned. The affects the following properties:

		* Distance attenuation.
		* Doppler shifting.
		* Stereo panning.

	Doppler shifting is based on the emitting actor's Velocity. Note that it
	is possible for actors to move around directly with SetLocation or MoveActor
	without having a valid Velocity, thereby causing no doppler shifting.

	Configuration
	-------------

	Until a nice configuration user interface is in place, you can edit your
	music and sound settings in the file Unreal.ini.

	Sound slots
	-----------

	Each actor in the world can contain up to eight sound slots, so it can
	play up to 8 simultaneous (overlapping) sound effects.

	When an actor plays a sound in a slot where an old sound is already
	playing, the old sound can either be cut off and overridden, or the new
	sound can be ignored (see the bNoOverride parameter in PlaySound).

	Ambient sounds
	--------------

	Each actor in the level can have one ambient sound effect, which is specified
	in its AmbientSound property.  This should refer to a sound effect which loops.
	If a non-looping sound effect is used as an AmbientSound, it will not play
	properly (it will only play once).

	Persistence and correctness
	---------------------------

	Sounds have a radius. They diminish linearly according to distance and 
	are culled when too far away to hear. Culling distance is a linear 
	function of the sound's volume.

	Ambient sounds persist across loads and saves.

	Regular sound effects do not persist across loads and saves.

	A regular sound effect can only be heard by players (local and
	network) who can hear it when it begins playing. For example, if 
	you have a 10-second sound effect and you start playing it in a room, 
	then five seconds later a far-away player teleports into the room 5 
	seconds later, he will not hear the sound at all.

	Looping sound effects
	---------------------

	To create a looping sound effect in a .wav file, you need a sound
	editing program like SoundForge (http://www.sfoundry.com) which supports 
	looping sound effects. In Sound Forge, follow these instructions:

	1. Run SoundForge.
	2. Load your .wav file (either 8-bit or 16-bit).
	3. Bring up the "Special/Edit Sample..." dialog.
	4. Click on the "Sustaining" choice (as opposed to "One shot").
	5. Select "File/Save As...".
	6. Make sure that the "Save Sampler Information in file" option is checked.
	7. Click on the "Save button".

	Limitations
	-----------

	3D sounds are only stereo panned, but not fully spatialized (i.e.
	phase shifted and bandpass filtered based on sound absorption in
	the ear as a function of position).

	The sound system is limited to a maximum of 64 channels of music and
	sound.  By default, 16 sound effects channels are allocated, leaving 48
	for music.  You can change this from the Unreal.ini file.

	Each playing sound effect, ambient sound, and music channel uses CPU time.
	Therefore, we recommend keeping the number of sound effects audible to the
	player fairly low, and keeping music channel usage "lean and mean".

	Dynamic music
	-------------

	Each level has a default song and CD track which is played throughout
	the level.  You can specify the song in UnrealEd in "Options/Level" in
	the "Audio" tab.

	Music can be transitioned dynamically via a SpecialEvent object hooked 
	up to a trigger or any other event source.

	Music is not zone based, because that would become annoying when
	backtracking through maps and in network play.

	Music is tracked per player so it can be used equally well in single
	player and network play.

	Music formats
	-------------

	Unreal supports two major kinds of music:

	1. CD audio.  You can compose your game's sound track, record it
	on CD, and specify in-level music by CD track. Advantages of CD
	audio include highest possible music quality, no CPU overhead, and
	giving composers the freedom to create music however they want. The
	major drawback is that you can't do dynamic music very well since
	switching between CD tracks isn't instantaneous, and you can't distribute
	it via the Internet.

	2. Digitally mixed music (.mod, .s3m, .it, etc). These are special music
	formats which include digitally recorded instruments as well as sequencing
	data.  Advantages: Easy to distribute on the Internet, and more amicable to
	dynamic music. Disadvantages: somewhat CPU intensive to mix (3%-5% of CPU 
	time), lower sound quality than CD.

	We don't support Midi or Mpeg-3 music formats at this time because Midi 
	instruments sound lousy on the majority of users' sound cards, and Mpeg-3
	music is awfully bulky and CPU-intensive to mix.

///////////////////////////////////////////////////////////////////
11-8-97

+	Fixed actor undo.
+	Database Num(), Max().
+	QueryMinSize, QuerySize.
+	Kill SerializeData stuff.

====73
+	UAudioSubsystem GSound
+	New AActor variables.
+	New Galaxy project.
+	LoadClass.
+	FindPackageFile, FindLibraryFile.
+	Supporting loading classes from dll files with no .u's, i.e. for hardware rendering devices.

///////////////////////////////////////////////////////////////////
11-9-97

+	Old ufx header size = 252
+	Test sound & music in editor.
+	UnrealEd music loading, saving, importing, exporting.
+	Import sound/music: Set type. Import from ufx safely.
+	Export sound/music: Use type.

+	Eliminate CLASS SAVEBELOW.
+	Retest full rebuild w/ headers.

+	Changed:
+		CLASS SAVEPACKAGE NAME=pkgname FILE=filename 
+	To:
+		OBJ SAVEPACKAGE PACKAGE=pkgname FILE=filename 

====74
+	Eliminate
+		ufx*.h
+		ufx*.dll
+		ufx*.lib
+		All old audio .cpp and .h files

+	Finish up UnrealEd audio user interface issues.
+		Sort the results.
+		UnrealEd sound play/stop interface
+		UnrealEd sound browsing
+		UnrealEd sound importing, exporting
+		UnrealEd sound loading, saving

====75
+	Handle sound system initialization failure safely (i.e. multiple instances).
+	Eliminate UCamera::UpdateAudio, AActor::PrimitiveSound, AActor::UpdateSound, AmbientSoundSet

///////////////////////////////////////////////////////////////////
11-10-97

====76
+	UGalaxyAudio: Should shut up all actors in the emitters list.
+	Play none sound stop channel.
+	No AmbientSoundSet.

+	Garbage collection zero-size data issues?
+	Register sound/music on demand (by Handle==0).
+	Unregister sound/music explicitly (when Handle!=0).
+	AActor::Destroy.
+	SoundList -> SoundSlots.
+	ULevel::DestroyActor should ConditionalDelete the actor.
+	Steven merged.
+	ClientSetMusic.
+	Fixed UnrealScript error with function calls being confused with casts.

+	Getting booted out of net play into entry level screws up controls.
+	Open ?failed problems.
+	Typing "open" on dedicated server error.
+	Software rendering flash scale and flash fog support.

///////////////////////////////////////////////////////////////////

New test version 76 notes
=========================

Fixed
-----
* All undo bugs should be fixed.
* File saving bugs.

Known problems
--------------
* Sound is completely disabled in this test version.
* Texture & fire format isn't finalized.
* Fire button sticking while using menus.
* Console hall of mirrors on 3dfx.
* Holes should be the same as version X (no better or worse)

///////////////////////////////////////////////////////////////////

Changes & fixes
---------------

*	Fixed fndo bugs.
*	Fixed rebuild bugs (all the ones I could duplicate).
*	Fixed sound "graph is linked to" bug.
*	Eliminated 3dfx in editor (way too buggy, and a lot of work to fix).
*	Moving brush import bugs (I think)

Did not fix
-----------

*	Network play. Don't bother testing this further, it's still broken.
*	Splotches in bright textures in software (fix coming soon).

Requests
--------

*	Can someone

///////////////////////////////////////////////////////////////////
11-11-97 & 11-12-97

====77
+	Try latest Glide.
+	Post fx
+	Map edit mode "select all" shouldn't select default brush.
+	Updated some Windows DLL's.

====78
X	Brightness difference between 16 and 32 bit color? Give to Erik (color tables).
+	Cliff's bug list.
X		Light overbrightening.

+	csgCopyBrush
+	Duplicate object problems, i.e. with movers containing dynarrays.
+		Solve properly with copy-ctor?
+		No duplicating!
+	bspBuildBounds crashing after new map.
+	Eliminated 3dfx in UnrealEd -- was unstable.
+	UCamera, UWindowsCamera.

+	Texture browser memory leak.
+	Cleanup UCamera.

+	UCamera -> UViewport
+	UWindowsCamera -> UWindowsViewport
+	AView -> ACamera

///////////////////////////////////////////////////////////////////

	New actor transparency options
	------------------------------

	Transparency
	AmbientGlow
	LightBrightness
	LightType=LT_SkinPaletteOnce
	bUnlit

///////////////////////////////////////////////////////////////////
11-13-97 & 11-14-97

====79
+	New UnrealScript IsA(name) to avoid keeping unnecessary classes around.
+	Fix script exporting (detect changes).
X	Player dying in network play updates animation frame latently.
X		Stuff initial parameters into spawn message even if bandwidth inefficient.
X		Steve needs to fix this.
+	Test single player and network play without unreali package.

====80
+	DestroyActor crash in net play.
+	Torture test network play.
+	Improve net debug code.
+	Must propagate replication definitions down derived functions.

====81
+	Way to access default variables in a class.
+		X.Default.Y;
+		Default(class 'Class').Y;
+		EX_ClassDefault

+		Serialize to save class before rebuild & restore if error.
+			As-if loading/saving.

+		Kill initializer support
+		Kill InitPropertyData
+		AddProperty no data
+		Test Unreal -make in debugger

///////////////////////////////////////////////////////////////////
11-15-97

====82
+	Compile dynarray overflow error.
+	Improved 3dfx speed by 7 msec via triple buffering.

====83
+	Locals need their own FProperties.
X	Separate locals into Parameters, Return, Variables? -> Only complicates things.
+	Fixed hideous FStackNode::RepOffset bug.
X	FStackNode cleanup and proper ctor.
X	UScriptCompiler::AddProperty cleanup. Ok as is.
X	UStruct & UClass unrelated? Best as-is because of struct compiling.
+	FNestInfo::Node()
+	Merged with Erik

///////////////////////////////////////////////////////////////////
11-16-97

====84
+	Fixed new lockup problems (dispersionpistol).
+	StartSound, StopSound return values.
+	Full non-ambient sound effects implementation.
+		Radius diminishing.
+		Stereo panning.
+		Radius culling.
+		Slot management.

====85
+	Eliminate CC_ColoredLight.
+	Fixed FArray::Remove! Auuuugh! Bug from hell! I should be shot!
+	UGalaxyAudioSubsystem remember the current music, handle music switches.

///////////////////////////////////////////////////////////////////

	Code entropy and how to avoid it.
	Casey Jones vs the steam engine.
	The extraordinary return on investment of gratuitous cool features.
	Critical path effects of large scale development: Unreal vs Windows.
	Exponential extrapolation.
	All competitors are potential partners.

///////////////////////////////////////////////////////////////////
11-17-97

====86
+	Texture mip data in the mips themselves, no global data.
+		Test mipless textures.
+		MAX_MIPS
+		utexture::PostLoad
+		utexture::Serialize
+		3dfx check
+		transient (tf_parametric) tex
+		test firetex load/save

====87
+	Cleaned up FMipmap.
+	Cleanup FTextureInfo.

====88
+	Merged w/ Erik.

///////////////////////////////////////////////////////////////////
11-18-97 to 11-21-97

+	On the road.
+		Confidential meetings.

///////////////////////////////////////////////////////////////////
11-22-97

====89
+	Cleanup tmapper setup code.
+	Light cache must allocate u*(v+1)+1 to allow for overruns.
+	MMX research.

///////////////////////////////////////////////////////////////////
11-23-97

+	Cleaned up LightPass (2 cases, not 4).
+	Optimized CalcMip decision.
+	Now support up to 12 mipmaps.
+	MMX light bilerp.
+	Eliminate underflows.

+	Try new galaxy. Fixed!

====90
+	Mergeless 32-bit color texture mapper using cached MMX palette.
+	Const light inner loop.
+	Interpolated light inner loop.

///////////////////////////////////////////////////////////////////

.uc class
.us struct
.ui interface

///////////////////////////////////////////////////////////////////
11-24-97

====91
+	Eliminated last remnants of lattice lighting.
+	Reimplemented light merge style functions.
+	FExecStack::Step (never execute directly through GIntrinsics).
+	Cleanup intrinsic declarations.
+	Intrinsic calling interface should be class-based.
+	Intrinsics: No Context pointer passing, checking.
+	scriptReadX->FExecStack::ReadX
+	Move proper functions & structs to aactor (vect, rotation, error)
+	Compiler auto-generate intrinsic prototypes.
+		void execXYZ( FExecStack& Stack, BYTE*& Result );
+	Full rebuild & .h

///////////////////////////////////////////////////////////////////
11-25-97

====92
+	Update PlaySound to take Slot parm.
+	GetProcAddress by extern "C" name.
X	Have compiler generate UnrealScript->C++ stub? fexecstack needed?
X		Overly complex.
X	Have compiler generate C++->UnrealScript stub for "events"? (no more Process?)
X	Make intrinsic functions network-callable?
X	Merge IntrinsicXX and ClientXX functions?
+	Unreal basic level music association and playing.
+	Stop music if currently playing and unregistered (GC safety)

+	FStackNode serializer load/compile time bind to Intrinsic.
+	New calling through intrinsic function ptr.
+	Update all intrinsic names.
+	Intrinsics w/o number are now load-time bound.
+	Fire merge.

====93
+	Fixed 1.5 msec slowdown in SpawnActor (stupid array handling).
+	High level optimized name and object creation.

+	Erik.
+		Finalize fire, water, glass.
		Palette merging & finished quantizer.
		Premade example textures.
		Premade example palettes.
			Note: Avoid dpaint 64-shade discretization?

///////////////////////////////////////////////////////////////////
12-1-97

====94
+	Class spew detects property changes.
+	Misc bug fixes & documentation writing.

///////////////////////////////////////////////////////////////////
12-2-97

+	FObjectManager::Exit TArray::Remove
+	New UnrealEd code:
+		Package loading as .u.
+		Package loading as .uc.
+		Package exporting as .uc, including proper directory creation.
+		Steven merged.

====95
+	New full version of code.
+	Package saving as .u.

X	Package browser?
X		Show packages in one list and their dependencies in another list.
X		Show sizes and things.

+	Steven updated.
+	Erik updated.

====96
+	Checked, safe-delete options (tree aware)
+		Texture
+		Sound
+		Class

+	C++ note: Destructor is not called if constructor throws an exception.

+	UPackage
+		Handle startup autoregistration.

====97
+	UObject::GetFullName()

///////////////////////////////////////////////////////////////////
12-3-97

====98
+	Found mysterious James arrowspawner bug.
+	GetMasterPackage prototype.

+	When get compile error, lose default class properties!
+	UnrealEd show class package and names together; new class needs proper UI.

X	UPackage should take on all the functionality of FObjectManager? -> Overly complex.
X	URoot should be derived from UObject,TArray<UPackage> and should be the global package list.
X	Load a package with UPackage ctor -> Complications with existing packages.
X	UPackage take on the functionality of ULinker, ULinkerLoad, ULinkerSave. -> Bad idea.
+	No "Package" statement in class def: can deduce that from directory and object's package.
+	In UnrealEd, show class and package name as in "Engine.Actor", "UnrealI.Skaarj".
+	Cleanup object creation and initialization: No longer need empty default ctor.
X	Temporary, unnamed objects on stack? FindObject only find RF_Public stuff?

+	Move UnNames.h to Core and eliminate ENoName.
+	PROPERTY_ALIGNMENT
+	Cleanup name code based on new assumptions; eliminate unnecessary code.

====99
+	Brush rotation isn't snapping.
+	Default(Class).Var compiler bug.

+	UPackage.
+		MasterPackage
+		TransientPackage
+		UObject::GetPackage()
+		Use UPackage for objects' packages instead of FName.
+		Get the new code working.
+		New fire texture crashes (my bug).
X		Autoregister classes by package FName to prevent duplicates.
X		EndState should take new state name parm?
+		UnrealScript CallGlobal should not compile-time bind.

+		UPackage::Bind.
+		UClass::Bind and intrinsic function associate use UPackage.
+		Fully garbage-collect DLL references.
+		Cleanup ResolvePackage.

+		Improve PreRegister handling.
+		FindPackage.

+	Texture brws scrolling still fucks up, don't realloc frame buffer if no mode change
+	Cleanup linker, loader, and saver based on new assumptions.
+	Update saving: Object manager tags objects, ULinkerSave does all saving?
+	Scrutinize texture, palette, uobject, and ufractaltexture; dynarrayize.

+	Convert UTexture over to arrays.
+	Verify that you can build and play levels without the UnrealI package.

+	Move all models and graphics to package-specific directories.

+	Logging on fails when server starts after client.
+	Aim for preferred packet size + one extra replicant.

+		Save-all-modified-scripts-as-u's option in UnrealEd
+		Save .u files individually into package-specific directories.
+		Save map files relative to their specified dependencies.
X		Add package / remove package option.
+		Delete classes: Make sure there are no references.
+		Delete texture or texture set: Make sure there are no references.
+		Fix "import-dont-merge" option.

///////////////////////////////////////////////////////////////////
12-4-97

====100
+	Optimized FMemCache hashing.
+	UnrealScript uses do-until, not do-while.
+	Platform startup code is now responsible for GIsEditor, GIsClient, GIsServer.
+	Move GClient to UEngine::Client.
+	FClientBase->UClient
+	FWindowsClient->UWindowsClient.
+	GApp -> GSystem

+	New assertion saving maps.
+	Critical Myscha saving bug (.unr)

+	Detect non power of two size textures at import time, no non-power-of-two textures ever.
+	James & Steven merged.

+	Make GClient a serialized UEngine sub-object.

+	UAudioSubsystem - no init/exit. Retest sound.
+	UObject::IsIn
+	UViewport should use its attached Client object, never access GEngine.
+	Update ctors to take UClient parm: UWindowsViewport, UViewport

====101
+	FGlobalPlatform::NewViewport moved to UClient.
+	URender - no init/exit.
+	3dfx -> ddraw crashes ("unhashed item")
+	Move UEngine init/exit to ctor.
+	FRenderDevice -> URenderDevice
+	GlideDrv.dll
+	Glide statically linked.
+	GRend -> UEngine::Render, properly garbage collected.
+	ULevel needs a pointer back to its owning UEngine (create / load).
+	GSound -> Engine::Sound, properly garbage collected.
+	Check AddToRoot/RemoveFromRoot usage.

+	Light brightness now can oversaturate by 2X.
+	Cliff bugs.
+		Added overall level brightness option, which scales all lights.
+		Fixed scrolling in mesh browser memory leak.
+		Brighten Static Spotlight.
+		Map edit mode - to last - renders in wrong order (reverse).
+		F11 crashes in 3dfx.

+	Myscha crashing level bug.

+	Cleanup execution stack initialization at object-creation time.
+	Runaway detection: Must enable DO_SLOW_GUARD to use it.
+	Exiting dedicated server crashes
+	Test net play content downloading.
+	InitializeUnreal cleanup

+	Uncache asm problem.

+	ULinker cleanup.
+		FArchiveFileLoad
+		FArchiveFileSave
X		Separate ULinkerLoad/ULinkerSave, FArchiveFileLoad/FArchiveFileSave. -> Complicates the code.
+		Don't use file mapping for saving files.
X		Is a buffered fread/fwrite more memory-efficient?
X		It appears that memory-mapped files cause too much paging.

///////////////////////////////////////////////////////////////////
12-5-97

====102
+	GetPackageLinker improvements.
X		Test and verify that .dll-only classes can be imported from Unrealfiles.
+		LoadObject: Cleanup .u-less loads like Galaxy (no bogus error messages).

+	3d hardware interface
+		Fully dll-ize.
+		Load-driver option from command line.
+		Eliminate dependence on all global classes (like the light manager).
+		Way of loading plug-in's that are only dll's with no .u!
+		Accessors in UTexture, UPalette.

+	Coronas now work on dynamic actors.
+	Better environment mapping function.
+	Fire textures update on 3dfx
+	Transparent texture oddities

+	3dfx brightness problem
+	Vb: update poly flags, translucent, etc.

+	New rendering types, per-actor or per-triangle.
+		PF_NoSmooth
+		PF_Unlit
+		PF_Curvy
+		PF_Environment
+		PF_NoOcclude no z-buffering on 3dfx.
+		PF_Masked
+		PF_Translucent
+		PF_Modulate

+	Use ERenderStyle for rendering type.
+	Fix lens flares on 3dfx.

+	ULinker serialize UPackage to prevent gc.

///////////////////////////////////////////////////////////////////

New version 102
---------------

Rendering:
- Coronas now work on dynamic and moving lightsources (James, you can use them for weapon effects).
- Fixed problem with dynamic lights not affecting the player's weapon.
- Fixed transparent actors getting clipped by the z-buffer.

James:
- I now support effects applied to individual mesh polygons:
 * NoSmooth
 * Unlit
 * NoCurvy (so we can have things like the Krall rendered with curved surfaces except his staff polygons)
 * Environment mapped
 * Masked
 * Translucent (use unlit + transparent for bright fire effects)
 * Modulated (use unlit + modulated for dark smoke effects)

Level designers:
- The "NoSmooth" effect (in the Surface Properties window) turns off bilinear filtering on 3dfx, so you might want to use it for display panels and things you *want* to look pixely.
- Fixed broken 3dfx brightness.
- All actors now have a "Style" property in their "Display" tab which lets you place transparent or modulated scaled sprites in your levels.
- I think I fixed the "FMemCache" crash that Jeremy (in gameplay) and Cliff (with dig20.t3d) were experiencing.

AI:
- Incorporated all of Steven's bug fixes from last night.

Code:
- Now loads external .dll's like Galaxy without error messages.

///////////////////////////////////////////////////////////////////

New version 103
---------------

Bug fixes:
- Fixed bug (mine) in mesh animation notifys that was screwing up weapons and AI.
- Dynamic lights sticking.
- Garbage mesh skins on 3dfx.

Surface properties:
- Modulated: This is the opposite blending operation as "translucent"; it darkens and colors the stuff behind it.
Use with Unlit for stained glass style effects.
Use it with Unlit and a fire texture with a reverse palette (color 0=full white, color 255=black or single color) for smoke.

- Bright Corners: Prevents the engine from darkening corners between polygons.
Use this on any polygons where you don't want dark corners, for example outdoors.

Misc:
- Added debugging code to track down Inoxx KillGarbage bug.

Detail textures:
- Detail textures are now working again on 3dfx.
- A detail texture is overlaid on top of a regular texture when the player gets real close. They are 1/4th the scale of regular textures (3d hardware only).
- We need the artists to do a bunch of detail textures for each major texture set.
- Detail textures modulate (color and darken) the textures beneath them, so they should be very bright and mostly white.
- In the texture browser, right click on a texture, bring up its properties, and associate a DetailTexture and MacroTexture with it.
- When Jeremy reconverts and reimports all the textures, all textures in the world should have detail textures associated with them, and some should have macrotextures.

Macrotextures:
- Added support for macrotextures on 3dfx.
- A macrotexture is overlaid on top of a regular texture all the time. They are 8 times the scale of regular textures.
- Macrotextures are useful for textures used on large surfaces (such as outdoors areas, sides of buildings),
- Macrotextures modulate (color and darken) the textures beneath them, so they should be bright.

Known problems:
- Sound sucks.
- Ambient sounds have no effect.

///////////////////////////////////////////////////////////////////
12-6-97

====103
+	PF_Modulated
+	Use PF_BrightCorners when you don't want lines.
+	Added more debugging code to track down Inoxx KillGarbage bug.

+	Detail texture support.
+	Macrotexture support.
+	New ETextureFormat.
X	Lens flares not centered.
X	Corona whether-to-scale boolean.

+	3dfx weapon garbage tex (flush fixes) - I think I fixed this.
+	Dynamic light sticks
+	Animation notifys are broken

====104
+	Deathmatch torture testing with the guys.
+	Clean up channel creation.
+	Content downloading should print download status.
+	ExitKillObjects crash on server if a player has come and left.
+	Fixed garbage collection bugs with classes getting deleted before their objects.
+	Exit in 3dfx lockup.
+	Fixed Cliff and Jeremy rendering MinSize crash.
+	Fixed SetCollisionSize network leak!
+		Idea: UnrealScript function set varname / function get varname, to avoid overlooking accessors.
+	CHECK_ALL network play testing.

///////////////////////////////////////////////////////////////////
12-7-97

	Sunday research
		Microsoft's coolbar control
			Awfully complex code for such a simple thing

		Visual basic activex control creation
			Great

		VB tooltips
			Great

		Microsoft FrontPage

			This has a totally cool, amazingly powerful organization model for hyperlink
			graphs and style sheets.  Analogies:
				Folders <-> Packages
				All Files <-> Dependencies of level / project
				Hyperlinks <-> Show links
				Themes <-> Unreal texture/actor/lighting/etc style sheets

			Generalized browser:
				Explorer open-style find-object dialog (hierarchical but simple directory based) with preview pane/button custom for desired class.
				Tree-based browser with preview pane or list (i.e. textures) for desired class.
				Leverage the same code for both.

			 Contemplate leveraging http/ftp for Unreal file transfer, so that level files can be
				on good file servers, and gameplay can occur on good game servers.  Just need a dinky
				fttp/www server pgm built-in for hobbyists?

			 Right-clicking on things brings up "Xyz properties..." popup listing each thing in
				the hierarchy that has properties, i.e. link, list, page, etc. This could apply in
				Unreal for right-clicking: Actor, Group, Level.

		ActiveX

			Major conclusion: ActiveX is well thought-out.  While it was held back by
			lousy development tools and instability in its early days, it has evolved to totally
			live up to the promise of powerful controls and true multilanguage programming.

			The ActiveX event-based programming model is also extremely powerful.  Having multiple
			clients receiving events may be a cool concept to explore in future versions of Unreal.

			As for the weird Com interfaces which ActiveX is built on...there has to be
			a better way.

		MFC 4.2

			Major conclusion: My opinion of MFC has changed.  While I was initially
			shocked at the complexity of MFC and ActiveX, I now realize that the complexity is
			necessary given their versatility and the difficulty of mapping their functionality
			onto Windows.  MFC 4.2 is more powerful than Visual Basic and more complex.
			It appears to be the best current environment for creating full production
			apps.  While VB is simpler and more productive for prototyping, it is very painful to
			deal with the exceptions where one must work directly with the Windows API to take
			advantage of features not supported by Visual Basic.

			Tooltips: Easy using the add-tooltips component.
			Treeview, list view controls supports custom drawing.
			Header control is cool.
			Generated code is still a mess.

		Java

			Java hierarchical packages have no special access relationships.

///////////////////////////////////////////////////////////////////
12-8-97

+	LoadObject, LoadClass: Take friendly name string, and optional UPackage to force into.
+		ResolveName
X		ULevel derive from UPackage to get automatic sandboxing?
+		GetPackageName
X		UClass::PackageImports self-package problem
+		ResetLoaders
+		FindObject
+		Always draw active brush on top.
+		CreatePackage
+		UObject::GetPathName
+		Texture deleting: IsReferenced needs to verify disjointedness and purge
+			any straggler objects.
+		Explicit String->Name ctor.
X		UPackage needs a pointer to its ULinkerLoad.
+		Manage PackageFlags loading and saving.
+		Cleanup GetPackageLinker.
X		Unreal -make support non-edit packages on the command line (i.e. Render)?
X		UnrealEd "show dependencies" in results window.
X		Results window copy and paste.
+		GetPackageLinker: LOAD_AllowPlainDll

+	Texture browser: When textures are scaled down and mips are available, use mips to
+		avoid memory thrashing.

///////////////////////////////////////////////////////////////////

Recommended project layout
==========================

To simplify creating a third-party game with the Unreal engine, I
recommend creating a new Visual C++ .DLL to contain your game-specific
code, along with an Unreal package to contain the scripts and game content.
For example, create a new Klingons.dll and Klingons.u.

Within your DLL, you can create subclasses of the existing engine classes
to implement your game-specific behaviour.  Code authored this way is easier
to maintain across updates to Epic's Unreal code base.

While licensees will still probably find it necessary to modify some of
the source code in the Engine and Windows projects, such modifications should
only be made when you can't achieve your goals through subclassing.

C++ classes licensees may want to subclass
==========================================

UGameEngine:

	The game engine; moderates the high-level game starting, saving,
	loading, and level switching issues.  Subclass this if your game
	requires a different strategy for saving and loading levels, for example.

///////////////////////////////////////////////////////////////////
12-9-97

Priorities:
1. Solid, fast network play.
2. Ambient sounds.
3. Global sound prioritization, new PlaySound.
4. Dynamic music support.
5. James rendering effects.

====105
+	Move savegame/loadgame logic to UGameEngine.
+	New FWarningContext
+	Moved game loading/saving code to UGameEngine.
+	ResolveName handle "ini:Section.Key" syntax, to simplify loading configurable subsystems.
+	Load game engine based on .ini settings (UGameEngine).
+	UGameEngine should perform all level switching, not ULevel.

+	Improved UnrealEd class browser.
+	FArchive::Printf

+	UFactory class for importing objects.
+		UClassFactory: .uc
+		UTextBufferFactory (put in Engine)
+		ULevelFactory (.t3d)
+		UPolys::Import
+		Make "Brush set" and "Brush more" work with UPolys importer.

///////////////////////////////////////////////////////////////////

	Tools that people could create using UFactory and UExporter
	* Map converters: Quake-Unreal, Quake2-Unreal, Doom-Unreal, VRML-Unreal
	* Texture importers: .jpg(24), .tif(24), .bmp(24).
	* Mesh/Model importers w/ more options: .dxf, .obj, .asc.

///////////////////////////////////////////////////////////////////
12-10-97

====106
+	Fixed keyframes 4-7 in UnrealEd.
+	Nonsolids are now greenish, not grey.
+	UnrealEd "New fire texture" doesn't remember proper group.
+	Editing default properties for "Info" class (or any pure hideparent) crashes UnrealEd.
+	Eliminated HideParent.
X	Player lighting query from UnrealScript. Would be too slow to be practical.
+	Fix invisible collision hulls casting shadows.

+	UFactory continued.
+		UPolys importer -> UPolysFactory.
+			UPolysFactory
+		UModel importer -> UModelFactory.
+			UModel::TempOwner
+			Retest importing very old maps
+			Default texture is no longer tied to palette
+			Better default texture
+			bMerge etc options for importing brushes.

+		USoundFactory (obj import)
+		UMusicFactory (obj import)

+		UTextureFactory
+		Eliminate ::Import, UObject::Import, UObject::ImportFromFile, OldImportObject.
+		Update erik's fire code

+	Remove GEditor from Engine.
+		Move UnEditor.h to editor.
+		Always run game without editor dll (dynaload editor dll).

+	Make Engine public headers minimal and distribution-friendly.

+	Compartmentalize all the packages and their includes.
+		UnEditor.h only needed in editor.
+		UnRender.h only needed in render.

X	Compute texture mipmult at import time based on RMS color delta between adjacent pixels?
+	Cleanup UnBuild.h

X	Primitives.
X		ForEach TraceActors should check for zone transitions! Yeah!
X		ULevel::LineCheck needs zone accumulation option.
X		Need UnrealScript PointCheck function to classify point & zone.
X		ULevel::PointCheck needs list option.

+		Generalize colored lighting code to support merge fx.
+		Fix DepthBufferEnable usage (my bug).
+		Properly use a texture's macrotexture, if specified.

///////////////////////////////////////////////////////////////////

	Jeremy: I think I fixed the dxf importer; please retest it (I can't duplicate the crash).

///////////////////////////////////////////////////////////////////
12-11-97

	Missing sounds:
		Barrel explode.
		Dispersion pistol explode
		Player jump
		Player land
	Sucky sounds:

====107
+	Fixes.
+		Fix cloudcast.
+		Changing levelinfo or zone info should flush (in case ambient bright).

+	Sound:
+		PlaySound "no override" parm.
+		Broken dxf importer.
+		Don't need Engine.uc, GameEngine.uc.
+		Always attach UAudioSubsystem to UViewport (not UEngine).
+		Always destroy UAudioSubsystem with viewport, and create with UViewport.
+		PlaySound bNoInterrupt.
+		Sound prioritization.
+		UAudioSubsystem::PlaySound must take an actor parm.
+		Proper channel and distance prioritization

///////////////////////////////////////////////////////////////////
12-12-97

====108
+		Move sound system back to engine (not viewport).
+		Preregister remaining sound effects at UViewport::SetViewport time.
+		Do SetViewport in engine.
+		DestroyActor must tell the sound code.
+		Handle emitter actor moving, if it's available (including reprioritization).
+		Doppler shifting of all sounds. For now, totally exaggerate.

+	Editor audio support.
+		Do SetViewport in editor.
+		Always tie sound system to one editor 3d view camera (UViewport::Destroy cleanup).
+		Editor music starting and stopping (GLevel).
+		Smooth music fades.
+		Editor sound starting and stopping.
+		Need some sound effects with sound forge loop points.
+		How to use looping .wav files.
+		How to jump tracks in the music usefully.

+	Stability.
+		Reload UMusic should stop the music playing.
+		Reload USound should stop the sound playing.
+		Fixed shadow map size growing leak.
+		Eliminated 8-bit sound support entirely.
+		Lower typical sfx volume to prevent clipping
+		Texture viewer not updating.
+		Galaxy invalid actor crash (ctor bug).

///////////////////////////////////////////////////////////////////
12-13-97

====109
+	Ambience.
+		Ambient sound start (prioritized) when get in radius.
+		Ambient sound cutoff when out of radius, or destroy actor.
+		Update ambient values as they change.
+		Normalize sound and music volume to prevent precision loss.
+		Only do ambient sound when viewport is realtime.
+		Editor: Ambient sound turned on when you turn on player controls, then turned off.
+		Change ambient sound on actor in game/editor must update it.
+			Verify that it's playing; if so, update settings.
+		Fixed music crash on exit bug.
X		Move global light effects to engine.
+		glxSetMusicVolume no effect
+	Smooth music pattern jumps? No.
X	Find out from Carlo whether Galaxy instruments are acceptable as samples. -> Not practical.
+	glxSetSamplingrate requires hardcoded number, or is it variable?

+	Galaxy:
+		DirectDraw hooking.
X		Pausing during DirectDraw mode switches? Not needed thus far.
+		DDLOCK_NOSYSLOCK
+		All .ini file parameters.
+		Surround sound panning for ambient sounds!
+		Update features and sound doc.

+	In-game music support:
+		Music transitions (SpecialEvent). Test.
+		New MusicEvent

///////////////////////////////////////////////////////////////////
12-14-97 & 12-15-97 & 12-16-97 (whew)

====110
+	Turned dolby off by default (bass cancels out on subwoofers). Should turn on only if you have a prologic decoder.
+		glxStartCDTrack integration with UnrealScript (test).
+		UseCDMusic
+		UseDigitalMusic
+		No UAudioSubsystem::Pause. Use SetViewport(NULL).
+		Show ambient sound radii in blue in UnrealEd.
+		Test music section jumping (0=ambient (default), 1=action, 2=suspense).
+			inoxx.it: "Dissent" (ambient: 00 action: 01, suspense [underwater]: 02)
+		Music transition bOnceOnly
+		Music transition bSilence
+		Docs: MusicEvent actors.
+		Docs: Level music variables.
+		Docs: Can see ambient sounds in radii view.
+		Docs: Relevent ambient sound properties and their scriptability.
X		Musical theme: Mapping of level/section names to songs or cd tracks.
+		UnrealEd "FIX" commmand widens light radii by a factor of 4.
+		Carlo: Galaxy shutdown always needs to be thread-safe (sometimes crashes on exit).
+		Carlo: Way more volume scales on MMX.

+	New Galaxy with more volume values.
+	Default sound radius now is 1600.

+	Generality.
+		Sound hearing location based on viewtarget.
+		Move sound update code to minimize latency.
+		Cull the ViewTarget, not the view actor.
X	Carlo: Sure glxSetCDVolume works?
X	Carlo: How to make CD music track loop? Can we do this by default?

+	Carlo: More panning values and glxSetMusicVolume/glxSetSoundVolume volumes?
X	Carlo: Way to smoothly fade volume and panning around to avoid clicking due to instant changes?
X		This would add lag to the panning, which is bad.
+	Carlo: glxSetReverb crashes sometimes, use a critical section.

+	Effects.
+		Setup realtime-interaction reverb editor in unrealed for experimenting.
+		Must detect reverb changes per frame.
+		Good set of default reverb values.
+		Torture test glxSetReverb.
+		Light-synched ambient sounds.
+		New URender::GlobalLighting for global lighting effect.
+		All global lighting effects must be frame-consistent.
X		Try a less polarized panning function.

====111
+	Bugs.
+		AActor::BeginTouch
+		FDynamicChunk::Filter
+		Level brush losing name?
+		Critical: APawn::CheckEnemyVisible
+		"fps" in 3dfx:
+		drawlevel crashing when switching hubs on 3dfx only: suspect corona cache
+			retest coronas

+	Do a CHECK_ALL build for final testing.
+		Test hub jumping on the final maps.
+		Torture test gameplay.

+	Show build.
+		Turn off SLOW_GUARD.
X		No recycling actors for now?

+	3dfx.
+		Merge texture and lightmap downloading code.

///////////////////////////////////////////////////////////////////
12-16-97

====112
+	Org and reformat the documents.

+	UnrealScript 'event': generate C++ -> UnrealScript calling stub.
+	Handle copying back Out parms.

+	ProcessEvent
+	ProcessState

+	Eliminate PMessageParms, UnMsgPar.h.
+	Scrutinize all UObject::Process calls and use new 'event' mechanism.

///////////////////////////////////////////////////////////////////
12-17-97

+	UnrealEd tex,pal,etc brws must use pkg.name, i.e. because of palette naming problems
+	Swap red & blue for MMX.
+	PlaySound volume parm ignored?
+	New SLOT_None: Plays the sound without letting anything interrupt it.

====113
+	Better radius/volume-based prioritization.
+	Doc SLOT_None.

X	Carlo: Is there a good way to detect when StopMusic fading is finished?
X	Way to specify fade time? MusicVolume.

+	Open map should reset music.
+	Test transitions from silence to regular music and back.

+	3dfx.
+		3dfx PF_Masked | PF_Transparent = PF_Transparent.
X		3dfx PF_TwoSided doesn't render polys because they need flipping?
+		Test modulated. Cool smoke palettes.
+		Font color table - base cacheid on screen color depth.
+		When outside of map do screen clear along with z-clear!
X		3dfx set-flags need to use masking from texture?
+		3dfx screenflashes - just post-modulate the entire screen. Do with DrawScaledSprite.
+		Revert to just surface flags
X		Corona no-scaling option.
+		ScaleGlow.
+		3dfx test modulated sprites.
+		Use sprite masking from texture, ie for ed.

///////////////////////////////////////////////////////////////////
12-18-97

+		Updated doc on zone sound reverb.
+		3dfx DrawPlanarPolygon... is unsafe.

+		DrawScaledSprite: software/hardware now have identical rounding and clamping.
+		You must use bNoSmooth to prevent bilinear filtering from taking over.

+		Proper frame rate clamping (min, max).
+		Fix animated textures (SampleAnim.utx).

+		If texture name contains _A##, automatically set animation info.
+		Microtextures and macrotextures must use scale relative to parent.
+		Detail texture 2X range.
+		Texture doc.

+		Fix mesh viewer in empty map.
+		Test translucency scripting.
+		Full actor view vs. hide actors doubles light brightness - scary.

///////////////////////////////////////////////////////////////////
12-19-97

====114
+	Bugs.
+		Texture autopanning should be nondiscrete.
+		Panning eventually runs out of precision in software!
+		Coronas flicker slightly.
+		DrawTextureRect bug.

+	Fire textures should have a nonzero default MipZero color when created so fire isn't black in polys mode.
+	Actors should be affected by zone ambients in hardware.
+	Cleanup ZoneLight.
+	Docs: UnrealScript do...until not do...while
+	Docs: Defaults(constclass).property
+	Software should be darker relative to hardware.
+	Carlo: Need glxStartMusic parameter to not dump the mixing buffer.
+	Carlo: Phase offset support for 3d spatializing of sounds (smooth lerp).
+	Carlo: glxLock/glxUnlock for synchronization?

+	In bsp cuts mode in unrealed, icons appear as boxes.
+	Don't scale icons in Actors-as-icons view.
+	Actors-as-icons view in unrealed, force all iconless actors to be rendered with aactor icon.
X	Actor bounding boxes clipping errors in software only?
X	Eliminate ALevelInfo::JumpToLevel
X	Rendering PointCache memory inefficiencies (better to realloc).

+	GetVisibleNodes: Retest raytracing.
+	Eliminate FGlobalMath::Views.

+	FSceneFrame accumulate the surface draw-lists into occluding and nonoccluding bins.
+	Cleanup DrawFlatPoly.
+	New FSphere bounding sphere class.

+	Determine moving brush visibility via proxy.
+		Only do UnDynBsp update when proxy says brush is potentially visible (for testing).

+	V lighting hacked back in.
+	Fast v-light rejection.
+	Handle proper merging on 3d hardware (multiple point sets).
+		Tag no sort by surf since implicit.
+		Simultaneous v and s lighting.
+		Make sure not doing extra v/d lighting where not needed.

///////////////////////////////////////////////////////////////////

New version 114 notes:
This version should be very stable, but please keep the old version around just in case someone discovers any serious problems in this one.

Fixed:
* Texture browser handles textures with same name in different packages.
* Smoother music transitions.
* When outside world, I now clear the screen on 3dfx.
* 3dfx screenflashes.
* Fixed actor polygon clipping weird colorization on 3dfx.
* Improved detail texture support.
* Added volumetric fog: Now set a zone's or level's bFogZone=true, and you can adjust lights' VolumeRadius and VolumeBrightness.  You need to type "REND VOLUMETRIC" on the console to activate volumetric rendering.  This only works on 3dfx now, but will also be supported on MMX soon. This will be an option which users can turn on or off.
* Smoothed texture autopanning (now continuous).
* Fixed Pancho software rendering texture panning weird stretch problem thing.
* Fixed coronas flickering.
* Updated all the docs.
* Fixed UnrealEd polys/bsp cuts mode (actors no longer screwed up).
* Optimized moving brush code.

Top secret:
* Please don't talk about volumetric lighting with anyone outside the team. It's a secret weapon for us.

///////////////////////////////////////////////////////////////////
12-20-97

+	do somethign about v-edge aliasing: subtract constant edge boundary color value?
+	don't add brushes too late
+	no torchwaver style merging of vlights.
+	Show volumetric radii in radii view
+	V-light finishing and light manager cleanup.
+		Cleanup refs to LightMap all over the place!
+		Normalize v-brightnesses.
+		Fixed 3dfx fire not updating.

+		Must reset echo when die in reverb zone.
+		Fully separate FogMap from LightMap.
+		DrawPolyV take poly list.

+	Totally smooth fog transitions.
+	LOCKR_LightDiminish.
+	V-light mutual occlusion.
+	Clamping issues.

====115
+	"OBJ LOAD" should specify load-into package. Eliminate James reliance on Fire*.utx.
+	SetTexture return a scale.
+	SetTexture fold in Info.Scale.
+	3dfx depth bias optimizations for detail textures.

///////////////////////////////////////////////////////////////////
12-21-97

+	Halve 3dfx state changes!
+	Cleanup 3dfx precision modulation.
X	Problem with 2X oversaturating causing precision to oversaturate? -> Not in practice.

+	Fix light map vs. texture map panning values.
+	Test masking with z-buffering with actors and world and detail textures
+	Test >256x256 textures

X	Multicolored light map and V precision masking.
+	Fix dynamic vtrics.
X	Proper z-diminishing according to fog thickness.
X	Try 2X coarser v-mesh.
X	Ambient foglight and groundfog per zone with a depth relative to the ZD.

+	CLEANUP
X	3d hardware, if a texture/lightmap is dynamic, memstack it rather than caching it.
X	why cracks? is clipper not consistent? is glide screwing up vertices?
X		Problem is that Glide masking causes colinears to degenerate into concave polys?
X		Dot product reject v-lights
X		No FRainbowPtr in the lighting code.
X		Lighting: Share common VertexBase, VertexDU, VertexDV setup among all routines.
+		Create a separate v-mesh where appropriate; only return it if there are vlights.
+		ReleaseLightBlock cleanup.
X		Optimize SetupForNothing!
X		Any memory being wasted in the dynamic lighting code?
X		Avoid redundent copying of FTransforms on 3d hardware.
+		DrawPolyV use multiple polys to reduce state changing average 2X!
X		Combine the 3d hardware and software structs to reduce data conversions.

///////////////////////////////////////////////////////////////////
12-22-97 & 12-23-97

+	MeshTime
+		MeshGetFrameTime
+		MeshProcessTime
+		MeshLightSetupTime
+		MeshNormalTime
+		MeshLightTime
+		MeshTmapTime
+		MeshSubTime
+		MeshClipTime
+		MeshCount
+		MeshPolyCount
+		MeshSubCount

+	New stats commands.
+		MeshStats

+	FLightManager::Shade
+		Prevent passing unnecessary parameters.
+		Got 20% performance boost by screwing with VC++ compiler options.
+		Fixed nan problem.
+		If no subdivision, do backface rejection before all ops.

+		Use specified microtexture and macrotexture scaling.
+		3dfx do properly render fog mesh if specified.
+		Time & investigate why 3dfx actor rendering is so slow.
+		PF_NoSmooth apply to texture only, not light maps.

+	Fix FPropertyTag object and name serialization.
X		90% of meshes contain no transparency and are draw-order invariant!
X	PF_DirtyShadows? Would be very nice for adding randomness. Slow enough as it is.
X		No redundent shading on subdivided points?
+	New version is way slower on 3dfx than 98, redundent uploading of firetext and lightmaps?
X	Unnecessary conversion to 16-bit on 3dfx? Need stats.

///////////////////////////////////////////////////////////////////
12-26-97

+	Option to load/save object parameters from an .ini section.
+		ConfigChanged()
+		LoadConfig(section,flags)
+		SaveConfig(section,flags)
+		UGalaxyAudioSubsystem
+		CPF_Config
+		Use for UNetConnection, UNetDriver.
+		UseDirectDraw

+	Make Unreal.ini 100% subsystem-oriented.

X	crash on exit:
X	CacheMemory 00DC0020
X	CID_MemStackChunk
X	0x00dc1acd
X	(some dtor somewhere)

+	crashes on exit when exit in 320x200 and below (not above) all color depths
+	was due to UnsafeSetData
+	fixed editor

///////////////////////////////////////////////////////////////////
12-27-97

+	Cleaned up memory leaks

+	Eliminate ANSI headers.
+		ctype.h
+		stdarg.h
+		stdlib.h

+	Cleanup globals.
+		appCycles
+		appSeconds
+		appFExt
+		appFSize
+		appSort
+		appIsNan
+		appAtoi
+		appAtof
+		appStrnicmp
+		appStrtoi
+		appQSort
+		GetConfig, SetConfig

+	UnVcWin32.h

+	test without asm
+	renamed BOOL to UBOOL to prevent conflicts with Windows BOOL typedef
+	cleanup bool violations (test with byte)
+	test netplay
+	test rebuild
+	backup

====116
X	cpt_bool, BitMask, GBool, EX_LetBool, allow bool arrays, FPropertyTag, P_GET_BOOL, out bools, EX_ all related to bools
X	FProperties::AddProperty EX_BoolVariable
X	:1 NEXT_BITFIELD BitMask
X	use c++ bool

+	GET_VAR_ARGS(msg,fmt)
+	appGetVarArgs

///////////////////////////////////////////////////////////////////
12-28-97

+	Eliminate stdio.h.
+	Added UStruct::Consts.
+	appMemswap
+	Eliminate stdlib.h.
+	Cleanup appStrncpy
+	Cleanup appStrncat
+	Eliminate direct.h, io.h
+	Cleaned up all includes

+	UnrealScript constant support:
+		UStruct::FindConst.
+		Prevent adding variables that conflict with consts.
+		Recognize const syntax and add const.
+		Prevent adding consts that conflict with vars.
+		Maintain Const table.
+		Handle inline consts.
+		Update docs.
+		Use constants for PI, MaxInt.
+		Export constants to C++ like "UCONST_PI".

///////////////////////////////////////////////////////////////////
12-29-97

+	Consistent scoping syntax for constants and defaults:
+		classname.default.varname
+		James content into \unreali\textures
+		Moved \graphics to \textures
+		Verify distributability without James' utx files.
+		At rebuild time, import properties after reparsing all scripts
+		Recognize classname.constname
+		CompileContextExpression handle enums.
+		Recognize enumname.enumconst
+		Recognize classname.enumname.enumconst
X		Recognize sizeof(structname.member)
+		Try funky constructs like classname.structname.constname
X		Recognize pkgname.classname.enumname
X		Recognize pkgname.classname.structname
+		Update docs.

====117
+	Zone speed of sound.
+	VRand
+	Sound radiosity.
+	Raytraced ZoneInfo form factors.
+	Erik de Neve style reverb tap quantizer.

+	Fix mesh browser wireframe in empty map bug.
+	If ambient sound, show sound radii as blue in radii view.

///////////////////////////////////////////////////////////////////
12-30-97

+	portals - why visible now?
+	player skin - screwed.
+	mesh normals inverted.

X	Normalize names in name ctor
X	appIsLeadNameChar
X	appIsNameChar
X	Test trying to use invalid names in UnrealEd
X	Doesn't work because things like operator symbols must be names!

+	sound pitches screwed up
X	missing stereo channel?? -> bad phvkking headphones.

+	Init: Command line: D:\Klingons.098\Maps\Les98.unr
+	Info: Pending connect to '//D:0/Index' failed; Connection failed

+	Can listen then open self! Oops!
+	ISV-Kran sound crash. Carlo reading outside of memory bug.
+	Sound option to turn off reverb.

+	Fixed UnrealEd cameras getting reset during loads.
+	Eliminate unused SpawnActor name parameter.

+	Windows nt glide detach bug?
+	Replaced ELogType enums (LOG_) with FNames, for simplicity and generality.
+	isvkran outside common crash

///////////////////////////////////////////////////////////////////
12-31-97

+	Licensee code version
X	All exporters: UExporter. Cleanup. Replace UObject::ExportToFile.
+	Broken sw mesh sorting.
+	Curvy is backwards.
+	Curvy shading errors with unlit in mesh viewer/

///////////////////////////////////////////////////////////////////
1-1-98

====118
+	Convert lighting to 0-127 range and optimize tables.
+	Figure out max brightness for 3d hardware in loop.
+	Don't cache resultant maps, just memstack them.
+	Do cache static maps in case they're needed.
+	CID_LightPalette
+	Light merging: Cache a 1K "palette" per lightsource = f(hsv)!
+	Improved smoothness of creature lighting.
+	FRenderDevice::GetStats
X	UTexture: Needs ScaleShift.
+	Mesh clip shading bugs are back - normal-related

+	Optimize FLightManager::Merge
+	Die in echo zone keeps echoing!

///////////////////////////////////////////////////////////////////
1-2-98

+	Eliminated StatusInfo.
+	UFont expands UTexture.
+	FONT BUILD -> UFontFactory
+	Cleanup UFont
+	Never use UTexture as output targets! Always use UViewport.
X	UViewport::Clearscreen use via locking
+	Eliminate UViewport::Texture.
+	Support intrinsic functions without id's.

====119
+	In-game user interface.
+		Define UCanvas.
+		UCamera always needs to have-a UCanvas.
+		Move UFont::Printf style routines to UCanvas.

///////////////////////////////////////////////////////////////////
1-3-98

+	Console continued.
+		Build SpaceX, SpaceY into UCanvas.
+		DrawTile.
+		Handle all drawing styles.
+			STY_Transparent
+			STY_Masked
+			STY_Modulated
+			STY_None
+			bNoSmooth
X		Support colored fonts via replacing palettes.

+	Console basics.
X		Base console on UCanvas.
+		Fixed mesh crashing bug.
+		Fixed map edit crash

X	Critical errors.
X		appErrorf and friends SHOULD be global functions
X		GSystem==null or not to indicate whether booted
X		Handle appErrors at global ctor and dtor time

+	The path dependence of optimae

///////////////////////////////////////////////////////////////////
1-4-98

====120
+	SLOW_GUARD build.
+	uvp::lockwindow bug only with clearscreen
+	In the latest version, movers are invisible until they begin to move.
+	Cleanup PrecomputeRenderInfo
+	Location disparity between fonts and scaled sprites in hardware vs. software.

+	Centered text.
+	Wrapped text.
+	Eliminate bWordWrap, always on.

+	fixed raytracer crashing

+	Memory manager.
+		new malloc debugging in core
+		Memory tracker handle operator new.

+		Mesh anim group

+	OBJ LIST serialize and determine data sizes.
+	Don't load script text for gameplay.
+	Fix environment mapping on player.

+	Logging.
+		Make all log functions take a log type.
X		GLog.
X		debugf gated to GSystem only for log display, not for file.
+		Cleanup FOutputDevice: Varargs functions not virtual.
X		Verify logging working at startup
X		Fix shutdown-logging.
+		Good system for enabling/disabling log messages by name.
+		UCanvas::Serialize bug
X	Enable Canvas to perform viewport pruning (not camera?)

///////////////////////////////////////////////////////////////////
1-5-98

X	DrawScene available to UnrealScript?
X	DrawScene appropriate rect z-clear and setting of software/hardware org?
+	Fix console code on 3dfx.

+	Colored lighting mesh code

///////////////////////////////////////////////////////////////////
1-6-98

+	Light is way oversaturated
+	Joystick button is gone!
X	mono light cheat?

>1. Rebuild crash. (had it in Dig, gave you a few logs.)
>2. OCCBSP->WMMOUSEMOVE crash. Happens in both editor and game.
>3. We're getting crashes in 110 when trying to import one map into another.
>This is essential for hub integration.

+	mesh code
+		cache fp palettes
+		handle no-span case using camera span buffer

///////////////////////////////////////////////////////////////////
1-7-98

====121
+	UnrealEd file/new screws def cam views
+	Merging imported maps bug
+	FLightManager::ReleaseLightBlock bug with actors
+	"I had to null-define WOT_API": xxclasses.h should #ifndef it

+	>Within UnrealEd v117, every time I look at Engine and/or Unreal classes,
+	>then "Export" to save changes I've made to WOT classes, the classes that
+	>I've examined are updated. Is there any way you can differentiate

+	When you load a .u file that contains intrinsic classes, the engine looks in the corresponding 
+	.dll for some symbols which IMPLEMENT_CLASS exposes. If those aren't found, you get an 
+	error. I should only give this error in the game (where the error indicates that something 
+	is truly missing) but not in the editor (where the error might just indicate that you 
+	haven't gotten around to implementing the intrinsics yet).

+	UnrealScript: export intrinsic structs.

	Concepts in object oriented programming
		interface
		pattern
		framework
		observer, observable / model-view-controller
		entity
		component
		subsystem
		capability
		fields, methods, and delegates (pseudo-parents); templates, prototypes, and exemplars; becoming
		reflection, introspection, and intercession
		multi-methods and multiple-polymorphism

///////////////////////////////////////////////////////////////////
1-8-98

+	fps crash
+	SnapScale bbox in UnrealEd
+	ULanguageObject (Owner, ForwardDeclarer)
+	loadclass/createobject idiom? No, these are two separate things. Just need ConstructClassObject<>.
+	Dynamically load UConsole from ini.
+	movers only show up after they move
+	sound attenuation is broken
+	cliff lighting bug vrikers. rebuilding fixes it.
+	console from ini
+	ambient sounds cut off and restart
+	ambient sound volumes are screwed

///////////////////////////////////////////////////////////////////
1-9-98

+	creatures aren't showing up in map edit mode (no wires)

+	Cleanup number conversions.
+		appRound: Rounds to nearest integer, int+0.5 -> int+1.0
+		appCeil:  Converts to integer equal to or greater than.
+		appFloor: Converts to integer equal to or less than.

+	eliminate UnTMapC.cpp.
+	eliminate 64k fixing
+	eliminate UnRaster.h, GRaster.
+	raster bound rejection
+	font screwed in software 320x200
+	screenflashes fix

+	upgraded pc

///////////////////////////////////////////////////////////////////
1-10-98

====122
+	Optimize mesh software rendering.
+	Per-poly mesh mipmapping. max du^2+dv^2/ds^2

///////////////////////////////////////////////////////////////////
1-11-98

+	Cleanup.
+		kill GetPaletteLightingTable
+		kill TL_RenderRamp
+		Cleanup TL_RenderPalette
+		Eliminate PostLockTexture/PreUnlockTexture.
+		DrawTiledTextureBlock based on DrawPolyC.
+		DrawTextureRect based on DrawPolyC.
+		Eliminate REN_MeshBrowser.
+		Eliminate TL_RenderPalette.
+		UFont_Cout build its own palette

+	URenderDevice compartmentalization.
+		Viewport->RenDev.
+		URenderDevice should have-a UViewport, set in Init.
+		Eliminate GClient.RenDev.
+		Define USoftwareRenderDevice.
+		Cleanup DLL .lib references.

+		render.uc -> renderbase.uc
+		softwarerender.uc -> render.uc

+	USoftwareRenderDevice.
+		URenderBase/URender
+		Always use Viewport->RenDev for rendering ops.
+			WindowedRenderDevice=Engine.SoftwareRenderDevice.
+		Move DrawPolyC.
+		Kill CC_Hardware3D
+		Move DrawPolyV.
+		Move all software rendering functions to SoftDrv.
+		Move the low-level line drawing routines to URenderDevice.
X		Special-case constant shaded scaled sprite loop in software?
+		Kill uviewport::clearscreen
+		SoftDrv.dll for USoftwareRenderDevice

Major Known Bugs:
* When you run UnrealEd the windows don't update until you first click in them.
* No masked creature polygons in software.
* UnrealEd mesh viewer is broken (displays only blackness).
* Software rendering mesh flaws in 16-bit color, use 32-bit for
  better results (doesn't crash, just looks crappy).

///////////////////////////////////////////////////////////////////

subordinate MTimer
	enhances UObject;

var private float TimerPeriod, TimerCount;
var private bool bOnceOnly;

enhancement Timer();

function SetTimer( float NewPeriod, optional bool bOnce )
{
	TimerPeriod = NewRate;
	bOnceOnly   = bOnce;
}

function Tick( float DeltaSeconds )
{
	float ThisDelta;
	while( TimerPeriod!=0.0 && (TimerCount+DeltaSeconds)>=TimerPeriod )
	{
		ThisDelta     = Min( TimerPeriod, TimerCount + DeltaSeconds );
		TimerCount   -= ThisDelta;
		DeltaSeconds -= ThisDelta;
		if( bOnceOnly )
		{
			TimerCount   = 0;
			DeltaSeconds = 0;
		}
		Timer();
	}
}

///////////////////////////////////////////////////////////////////
1-12-98

====123
+	Mesh viewer fix
+	Renamed Sound dir to Sounds.
+	Stick search paths and exts in Unreal.ini.
X	Inoxx says detail textures not working.
X	Why is drawing the hud ridiculosly slow. -> Logs.
+	LOAD_DisallowFiles
+	AGameInfo::InitGame for difficulty level processing
+	FName::IsValid
+	Retest and fix net play.

+	Fixed UnrealScript bug: FindFunction only finding non-final functions.
+	DevNet: RPC message not found: ServerPlaySound

UViewport:     Represents an operating system window.
URenderDevice: Represents a rendering device responsible for all drawing in a UViewport.
FSceneFrame:   A temporary rendering coordinate system on a Viewport with precomputes and clipping volumes.
UCanvas:       Represents a safe UnrealScript drawing surface.
APlayerPawn:   Represents an actor in a particular game level.

+	Pressing '1' crashes
+	Get hud moved to UnrealI

+	Safe server status bar and inventory
+	OBJ REFS CLASS=Palette Name=UnrealI.Palette0

///////////////////////////////////////////////////////////////////
1-13-98

+	Upgraded memory
+	Fix 16-bit creature rendering
+	Don't allow selecting 8-bit color.

+	Fix flat shaded rendering.
+	Test zone, bsp, surf views.
+	Test highlighting.

+	EndFullscreen problem in criterr.
+	Fix light manager SetupForSurf bug.

====124
+	Top priority things to fix:
+		DrawAdjustment
+		GetAnimGroup
+		Support Steven mesh draw offset and get dead bodies out of the floor.
+		Mesh viewer anim speed.
+		URender::DrawTile.
+		Update UnrealScript DrawTile.
+		URender::DrawBlock.
+		Brightness scaling in mesh code.
X		Software DrawPolyC negative texture coords cause garbage.
+		Fix the texture browser.
+		Hacked masking.
+		Actors are too dark, show selection better.

///////////////////////////////////////////////////////////////////
1-14-98

====125
+		UnrealEd camera windows updating.
+		Time & fix.
+			Sanity check hash efficiency. It's great!
X			appSprintf.
+				ConstructObject.
+				AllocateObject. Redundent memory copies.
+					MakeUniqueObjectName: Can massively optimize.
+					AddObject
+					_amblksiz.
+					FindObject
+						Object hashing efficiency
+					appMalloc
+					InitProperties
+			SpawnActor
+			Loading
+				ValidateImports is fast enough (could be faster with hashing)
+				Cached ANSI file saved, much faster now.
+			Saving Test.unr
+				Vastly improved sorting and serialization performance
+			FArchiveFileLoad eliminate file mapping usage
+				Cached ANSI FArchiveFileLoad
+				Eliminate file mapping functions
+				Efficient stack based readahead cache
X			GSystem->StatusUpdate slowness?
+		2d views are/were amazingly slow in large maps, like morose
+			Ortho bounds rejection code was broken
+		FGlobalPlatform::WriteBinary

+		Running 2 copies of UnrealEd crashing -> Assume OLE/MFC problem

///////////////////////////////////////////////////////////////////
1-15-98

====126
+		rebuild drawpolyc error in 8 bit, test shadow building
+		fix unlit moving brushes!

+	Critical: USoftwareRenderDevice::DrawPolyV
+	computelightvisibility crash
+	Bug from hell appears to be UObject::Destroy.
+	GIsCriticalError

+	New unreal -nommx
+	Erik's MMX rendering code integrated
+		UnrealEd volumetric lighting (rend volumetric)
+		UnrealEd masking
+		UnrealEd transparency

+	"#exec meshmap new" is now obsolete, please delete it.
+	ShutdownAfterError better shut down audio too

+	bubbles generators don't have an icon
+	shadow tracer drawpolyv
+	dark.unr tex masking bug (zone problem) -> building stuff like this screws up zones
+	masking 2sidedness

====127
+	software flares option "FLARES"
+	loading screen

///////////////////////////////////////////////////////////////////
1-16-98

+	That which does not kill me can only make me stronger.

====128
+	Source controlled Palettes.utx.
X	investigate using FBoxPushOut to compensate for vertical slopes
+	UTexture MipMult.
+	Eliminated APlayerPawn ctor (depended on GEngine).
+	Eliminated BuildPaletteRemapIndex
+	Eliminated UClient::SetPalette.
+	Eliminated UnWnCam.cpp palette support.
+	Eliminated last remnants of palettized frame buffer.
+		8-bit color, rest in peace!
+	Eliminated GetRemapTable.
+	Cooler UnrealEd grid descent.

====129
+	Drawline functions take FPlane.
+	ULevelBase needs Engine backpointer.
+	UClient needs Engine backpointer.
+	URender needs Engine backpointer.
+	CUnrealWnApp needs Engine pointer kept valid.
+	Eliminated GEngine

+	Eliminated need for RenderBase.u, Render.u (will be purely DLL after next format break).
+	Eliminate unnecessary URenderBase junk.
+	Move DrawTile style functions to UCanvas.
+	grandoms bug
+	16/32bit color menu opt screwed up in uned

///////////////////////////////////////////////////////////////////
1-17-98

+	Console SXB on 3dfx (console hall of mirrors).
+	can't f12 with con up
+	UViewport::Repaint
+	Merged _Screen, _RealScreen. Now there is no offset chicanery.
+	Cleanup fullscreen transitions
+	Cleanup cursor capture
+	Cleanup DirectDraw entry
+	UEditor::RedrawLevel
+	Upgrade URenderDevice::Lock colors.
+	Eliminate LockWindow.
+	Properly move flash info to usoftwarerender
+	Eliminated unnecessary EEdScan, FScan parms.
+	Cleanup viewport opening process
+	Editor now 2X more responsive to clicks

====130
X	Investigate 3dfx in a window
+	Make FScan stack-based (push/pop).
+	The editor 2D views are 5X slower than before.
X	Same problem with events (some movers are not activated sometimes)
+	Win95 crash from hell bug. Is it fixed?
+	Icon view show inoxx missing actor.
+	Cleanup Windows viewport code.

///////////////////////////////////////////////////////////////////
1-18-98

+	Update editor.u
+	Cleanup URenderDevice initialization.
+	Eliminated UnlockWindow
+	Verify zero hit-stack level after rendering frame.

+	model-view-controller:
+		Model is described by some UObject pointed to by the view (i.e. ACamera pointing to ULevel).
+		View is described by the view (i.e. ACamera).
+		Controller is the UnrealEd editor mode.

+	Implement FScan hit-checking logic in USoftwareRenderDevice.
X	FHit dynamic subclassor. -> Using observer paradigm instead.
+	UnEdClick.cpp

+	Cleanup hit testing driver interface, UViewport.
+	HHitXXXButton

///////////////////////////////////////////////////////////////////
1-19-98 && 1-20-98

+	HHitBackdrop
+	Adding actors in ortho views
+	Adding actors in 3d views

+	Eliminate all old EDSCAN_
+	Map-edit-mode brush selection now Windows standard.
+	Verify all hit modes working now.
+	Merge HBrushSide and HActor?
+	Brighten the tex browser highlight
+	Cleanup UEditorEngine::Click.
+	Cleanup UViewport::Lock
X	DeltaTime problems in gameplay

====131
+	Consistent FSceneFrame ctor.
+	FSceneFrame needs UCamera backpointer.
+	FLightManager base on FSceneFrame
+	URender::DrawMesh
+	URender::SetupDynamics
+	FDynamicSprite::FDynamicSprite
+	FDynamicSprite::Setup

+	URender::DrawActorSprite
+	URender::ClipBspSurf
+	URender::ClipTexPoints
+	URender::LeafVolumetricLighting
+	URender::OccludeBsp
+	Update URender::DrawWorld

+	UMesh::GetFrame
+	ugly con texture
+	loading screen
+	running 2 simult copies crashes in sndblst32.dll -> driver problem

X	All USubsystems need an Init function that returns UBOOL and takes an FWarningContext.
X	Do any/all subsystems need an Exit function?

///////////////////////////////////////////////////////////////////
1-21-98

+	Any mouse clicking at all causes raytracer to crash
+	Fixed shadow alignment
+	ini UseSound option

X	In v117, when you scroll or change the insertion point in script, the
X	class is marked as "changed" and will be exported if you press the
X	"Export" button in UnrealEd -- last I heard from Tim, CRC tracking of
X	the text in each script was still pending. -> Not changing this.
+	fix mirrors w/ meshes in zonetest

+	exit crash is in sndblst32.dll
+	improved Galaxy error shutdown
+	lighting effects not getting destroyed with actors

+	Mousecap problems.

+	sw relative actor sorting is incorrect
+	Move GRender->Brightness to client
+	save brightness in config
+	sound crash on exit problem

+	mesh DrawAdjustment fix

+	Specialize exec commands accessible from UnrealScript #exec:
+		texture import
+		font import
+		mesh import
+		mesh sequence
+		mesh origin
+		mesh notify
+		meshmap scale
+		meshmap settexture
+		obj load
+		audio import

+	brightness broken
X	transparency overflows

+	Fixed savegames with movers.

+	Handle mesh two-sided and mirrors properly.
X	Fade sound and music out while loading?
+	load maps quick fade out and do "loading" screen thing all in script fade music and sound and stuff
X	is pass_back really worth it in large levels?

+	3D hardware interface:
+		Figure out what the hell I'm doing with rendering targets. Related to UCanvas?
X		Standardize on UTexture?
+		Draw2DLine, Draw2DPoint, DrawCharacter (optionally overridable).
+		GetCaps: "DriverName", "DriverVersion", "SpanRenderer", "DetailTexture", "MacroTexture", "FogMap"
+		Identical usage of hardware and software rendering.
+		Eliminate texture coordinate 64K-fixing?

+	Software rendering:
+		Pentium creature poly drawing (16/32 normal, masked, transparent, modulated).
X		MMX creature poly drawing (16/32 normal, masked transparent, modulated). -> Erik
X		Optimize world surface setup code. -> Erik.
X		World surface blending effects (16/32 masked, transparent, modulated). -> Erik

+	Engine:
+		MakeUniqueObjectName - drain on performance in game?

X		Moving brushes use Skin to replace NULL/Default textures.
X		Inoxx portal bugs

+		Hardcoded intrinsic ids.
+		Steven Merged

///////////////////////////////////////////////////////////////////
1-22-98

====132
X	Sky (100% UnrealScript). -> Pancho
X		Variable sky panning speed and direction per time.
X		Orbiting star w/ dynamic light.
X		Occasional shooting star w/ dynamic lighting on sky & fire tex
X		Occasional meteor shower using fire fx.
X		Occasional lightning & thunder w/ dynamic light flash on the sky.
X		Directional field-panned wind.
X		Could handle portals by increasing Z by some fixed increment.

X	bDifficulty0
+	ViewportWndProc called after UnrealEd shutdown
+	Can't edit multiple actors.
+	Getting panning speed from levelinfo, not zoneinfo.
X	Properly coalesce all sky portals. -> Better to separate them in case warp zones have different skies.
+	ZoneInfo should find its sky on startup.
+	Facing.

///////////////////////////////////////////////////////////////////
1-23-98

====133
+	Eliminate JumpToLevel.
+	UViewport::NextURL
+	UViewport::NextItems
X	FPropertyBase::Export diff defaults
+	FStringOut

///////////////////////////////////////////////////////////////////
1-24-98

+	Computer woes
+	New version

///////////////////////////////////////////////////////////////////
1-25-98

Warning: Major VC++ bug to be aware of and work around.
Inline operators like operator() are sometimes evaluated before
their arguments so that, if their arguments have side-effects, the
side-effects will be incorrectly ignored.  This caused a major bug with
dynamic arrays where you do things like Array.Element(Array.Add(1))
returning pointers to an old block of memory that was since reallocated.

====134
+	FString::Appendf
+	Worked around major VC++ compiler bug which was causing dynamic
+		arrays to overflow.
+	appFprintf
+	Cleanup FLightMapIndex
+	TMap
+	Eliminated UObject::PropText
X	Eliminate LOCK_Trans
X	Eliminate LOCK_CanFail

///////////////////////////////////////////////////////////////////
1-26-98

	Find complacency and kill it.

+	UBitmap base class of UTexture
X	UTexture::Export -> UBitmap::Export
+	Eliminate UnsafeSet, UnsafeGet.
+	Cleanup FMipInfo
+	UDatabase
+	Drawpolyv update
+	Allocate ULightMap for light map and fog map.
X	Locking a texture should set its CacheID, as it may be affected by instance ambience
+	URenderDevice always take FTextureInfo, not UTexture.
+	Texture locking just take DOUBLE time instead of viewport.
+	FMipMap support for derivation?
+	Keep FTextureInfo
X	DrawPolyV use MipMult
+	Checkout the collision on rocket can, stinger ammo, etc

+	Light Map bug where everything goes black
+	Lighting Bug where movers are unlit

+	Save game crash with movers when reload

+		Lines, UViewport::Lock use vector color?
+		Combine UViewport::LockWindow, UViewport::Lock
+		Fix ed windows updating
+		Fix rmode 3 4 5 6
X		Kill ECameraCaps
+		Meshes in all colordepths.
+			Eliminate GEngine.
X			Eliminate GEditor.
X		No load software drv at startup if not needed

X	DrawPolyV: per-texture MipMult
+	fhub1 obvious lighting bug
X	url after dig? back to fhub1
+	cliff lightign bugs
X	once in a while an actor is spawned with bStatic=true?
X		brute and merc projectiles only
+	console tex is screwed
+	change ambient sound volume loudness: 255 should be 4x louder
X	my moving brushes are unlit in 125?
X	hacked menu

X		Same problem with the mouse fire button.
X		Sorting problems (transparent sprites are not sorted on top of a opaque water sheet)
X		texture trace: tex, u, v
+		uviewport::screen,realscreen only in softdrv
X	Use TEXF_RGB64 for ultrasm00th MMX lighting and faster mixing/merging?
X	That would look totally amazing!
X	movers unlit??

+	Investigate Myscha hard disk thrashing problems on Win95.
X	3rd person weapon uses player's bmeshcurvy
X	3dfx must clip all polys to warp zone portals.
X	Scene frame must properly handle portal otherside effects (scene frame stack).
X	Z-filling of portals? Can avoid this?
X	Eliminate FTextureInfo.
X	FLightMapIndex needs a TArray<FShadowMask>

+	Updated doc

///////////////////////////////////////////////////////////////////

	Looked at Swing/JFC
		Repaints are amazingly slow even on my dual Pentium II 300
		User responsiveness sucks
		It has obvious major bugs like repainting, highlighting, character spacing
		Interfacing Java and C via JNI sucks because of inability to perform
			simple mappings between C++/Java classes (need klunky runtime
			binding).
		Lousy development tools.
		Great event programming model (inner classes and observer/observable).
		User selectable stylization is cool.
		Table view is unusable slow and buggy for such a critical tool.
		Horrible typography.
		Slow load times.

	Conclusions:
		Slower and less robust than Visual Basic.
		Even buggier and harder to integrate than MFC.
		Swing proponents are smoking crack.
		Can best compete by offering fully integrated solution and
			exploiting integrated features rather than standalone
			tools.

	Notes:
		Bitmapped buttons are cool
		Combo boxes with icons are cool
		Treeviews with icons are cool
		Coolbar menus are cool
		Coolbar feedback-toolbars are cool
		Motif style list box is awesome, consider owner-draw components instead of Windows ones.
		Motif checkboxes are cool.
		Tooltips are cool.
		Color chooser is cool.
		Tool shelves and tabbed dialogs are cool.
		Paste Duplicate/Paste Instance
		Properties editor with single or multiselect, and spreadsheet view for comparing multiple

	Maya:
		Depencency graph "nodes with attributes that are connected".
			Shader nodes (color, etc)
			Translation nodes (x,y,z translation, rotation etc)
		Another name for attribute is channel.
		Nearly all node attributes are animatable by connecting one node's
			output to another node's input.
		The connections between nodes are called dependencies and they define
			they comprise the dependency graph.
		Connections are usually created automatically as the result of user
			interface commands, but they can be modified visually in a
			connection editor, or they can be modified by programming.
		Cool effects nodes.
			trigger
				Reset
			float
				Waves
					Square wave (low, high, phase, freq)
					Sine wave (median, amp, phase, freq)
				Noise
					All kinds of continuous and discontinuous noise options
			data type converters
		Connections were known as construction history in PowerAnimator.
		Similar to visual programming (based on dataflow graphs).
		Engine handles downstream propagation of changes, i.e. animating a
			rope by aniating the underlying curve on which the extrusion is
			based, and having the extrusion-generated polygons update automatically.
		New dialog-based tools can be created based on properties contained
			in objects and their structs; buttons can be mapped to functions;
			things like enums automatically translate to combo boxes.
		Maya -> Unreal terminology.
			Node -> Object.
			Connection -> (not yet defined).
			MEL scripting/command language -> UnrealScript.

///////////////////////////////////////////////////////////////////
1-27-98

+	DT_SpriteAnimOnce
+	FTransSample fog.
+	PF_Memorized indicates DrawPolyC
+	DrawPolyC fog on 3dfx
+	Save out sprite and mesh volumetrics.
+	PF_RenderFog
+	Real actor vtrics.
+	Separate IsSurfaceLight, IsVolumetric.
X	Separate vtric light list.
+	Fog-aware clipping.
+	Proper fog with subsurfaces.
+	Separate Light and Fog, don't go crazy with fog on subsurfaces.
+	PF_RenderFog

///////////////////////////////////////////////////////////////////
1-28-98

+	LE_Satellite experimentation.
+	SetupForSurf take bump map parm.
+	LE_OmniBumpMap.
+	Cache transformed bump map FVector palettes per surface and texture.
+	TF_DynamicPalette indicate no caching of CID_TriPalette.

+	Expose texture UClamp, VClamp in UnrealEd.

void CUnrealWnApp::OnFileLoadGame() 
{
	guard(CUnrealWnApp::OnFileLoadGame);
	UGameEngine* Game = CastChecked<UGameEngine>( Engine );
	SetCurrentDirectory((CString)BaseDir + SAVE_RELATIVE_PATH);
	CFileDialog LoadDialog
	(
		TRUE,
		"." DEFAULT_SAVE_EXTENSION,
		NULL,
		OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_LONGNAMES,
		LOAD_MAP_MASK,
		NULL
	);
	if( LoadDialog.DoModal()==IDOK )
	{
		GTempPlatform.BeginSlowTask( "Loading map", 1, 0 );
		char Error256[256];
		if( !Game->Browse( 0, (const char*)LoadDialog.GetPathName(), Error256 ) )
			GSystem->Warnf( "%s", Error256 );
		GTempPlatform.EndSlowTask();
	}
	SetCurrentDirectory(BaseDir);
	unguard;
}

void CUnrealWnApp::OnFileSaveGame() 
{
	guard(CUnrealWnApp::OnFileSaveGame);
	UGameEngine* Game = CastChecked<UGameEngine>( Engine );
	SetCurrentDirectory((CString)BaseDir + SAVE_RELATIVE_PATH );
	CFileDialog SaveDialog
	(
		FALSE,
		"." DEFAULT_SAVE_EXTENSION,
		NULL,
		OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_LONGNAMES,
		SAVE_MAP_MASK,
		NULL
	);
	if( SaveDialog.DoModal()==IDOK )
		Game->SaveGame( SaveDialog.GetPathName() );
	SetCurrentDirectory(BaseDir);
	unguard;
}

///////////////////////////////////////////////////////////////////
1-29-98

+	Non-shadowed moving brush lighting.
+		Movers need their own TArray<FLightMapIndex> LightMap;
+		No static light on movers, ever.
+		Allocate at raytrace time.
+		Moving brush code manage iLightMap.
+		Light manager use appropriate LightMap.
+		Light manager proper caching.
+		Volumetric mover lights.
+		MusicEvent option to affect all players or just instigator.
+		Common gate for moving brush and actor light acquisition, with raytrace.
X		GRender->LeafLights contains duplicates -> Only because of dynamic bsp nodes.

+	Generalized DrawPolyC fog.
+	Mesh volumetric lighting (Glide).
X	Mesh volumetric lighting (MMX). -> Erik
X	MMX 2X OS (far-antialias, near-filter) AND 24-bit dither.

///////////////////////////////////////////////////////////////////
1-30-98

+		"#exec meshmap new" is now obsolete, please delete it.
+		I moved all the Engine sounds to \Unreal\Engine\Sounds.
+		Mover running up into actor should try to base it and push it (jump when standing on upward-moving mover).

====135
+	Increasing fatness on meshes makes polys adjoining slivers disappear.
X	Crashing on 3dfx with >256x256 textures?
+	Crash when duplicating brushes in map edit mode.
+	Note FLightManager::SetupForSurf rebuild required.
+	Invisible collison hulls are not allowing light to pass through them.
+	Fix PF_BrightCorners
+	Can delete the red brush if it's selected.
+	Have URenderDevice determine whether it supports volumetrics, and turn it off on non MMX.
+	Fixed no actors appearing on difficulty 0 :)
+	New PlayerPawn.CauseEvent command
+	Triggerlights turning off cause shadow map shuffling (bugs of Pancho and Inoxx)
+	Triggerlights sticking (CTest.unr)
+	Triggerlights: No need to mess with light type.

Improvements and bug fixes from 134 to 135:
* Fixed problem with meshes that had a fatness other than 128 being rendered with missing polygons.
* Fixed crash when duplicating brushes in map-edit mode.
* Fixed invisible collision hulls casting shadows.
* Fixed broken "Bright Corners" surface option.
* Fixed crash when trying to delete the active (red) brush in map-edit mode.
* Fixed no actors existing in difficulty 0.
* Fixed triggerlights sticking.
* Fixed triggerlights causing shadow-map shuffling, which was causing weird dark spots in areas with triggerlights.

Additional notes:
* In 135, You can safely load maps from 117-134 into UnrealEd. However, you must rebuild them before playing. Playing old-version maps in 135 will get you a crash "FLightManager::SetupForSurf".

Cool new console commands:
* "Slomo .1": Slow motion factor. 1.0 is normal speed, 0.1 is 1/10th of full speed. Cool for screenshots and testing animations.
* "PlayersOnly": Pause all actors in the game except for players. Cool for screenshots and testing.
* "CauseEvent some_event_tag": Causes the event. Cool for testing tags, events, triggered doors, and so on.

Performance comparison of 134-135 and previous verions:
* Software rendering is overall much faster on MMX machines.
* Software creature rendering is a bit slower due to the addition of full multicolored creature lighting, but it will be faster on old Pentiums after some pending optimizations, and much faster on MMX.

Improvements from 135 to 137:
* Added support for carrying inventory and player stats between levels.

====136
+	Fixed remaining DrawPolyV fudge factor bug!
X	PF_RenderFog set unnecessarily?
X	Mesh bounding sphere diffuse rejection.
+	UMesh::BoundingBoxes, UMesh::BoundingSpheres
X	Movers PRECOMPUTE_FILTER FBox. Avoid by computing bounding sphere once.
+	Meshes need bounding sphere.
+	Raytracer radius reject.
+	UEditorEngine::meshBuildBounds
+	UModel::BuildBound
+	Skip lights with purely black shadow maps: 33% speedup.
+	DT_SpriteAnimOnce bugs.
+	Cleanup BSP raytracer messages.
+	CPF_Travel
+	Travel UnrealScript keyword
+	var(Advanced) bool bTravel; // & appropriate defaults
+	Actor.TravelPreAccept, Actor.TravelPostAccept.

X	Raytracer crashing related to OccludeBsp crashing.
+	ULevel::Trace -> ULevel::MultiLineCheck
+	FCollisionHash::SinglePointCheck -> ULevel::SinglePointCheck
+	ULevel::MultiPointCheck
+	ULevel::MultiLineCheck
+	No FCollisionHash::Initialized (allocate and deallocate to indicate presence).
X	Does collision hash check each brush more than once? Slow!
+	Backup
+	Hide level collision tracker
+	Bright.exe disclaimer & uploads & source control.
+	Privatize ULevel::Hash.

///////////////////////////////////////////////////////////////////
1-31-98

====137
+	Movers vanish after save game.
+	UPrimitive::GetRenderBoundingSphere
+		Set default bTravel for proper actor classes.
+		Fixed actors not being shadowed by world.

+	Implement UGameEngine::SetNext
X	UGameEngine::LoadMap accept NextItems -> Cache in viewport

+	Call TravelPreAccept, TravelPostAccept.
+	Inventory.TravelPostAccept perform BecomeItem. 
X 	What to do with: Owner? Base? Nothing.
+	Do inventory accepting, including tagged actor matchup.
+	Use bTravel

+	Perfect inventory traveling across levels/servers.
X		Network clusters
X		Server should send item-list to client, possible cluster-encrypted.

+	Don't allow deleting camera actors in map edit mode.

X	Docs:
X		Inventory travelling
X		TravelPreAccept, TravelPostAccept
X		"travel" variable override
X		bTravel actor bool

+	Kill all ::Ptr usage. Visual C++ is doing some evil stuff!
+	New James code.

///////////////////////////////////////////////////////////////////
2-1-98

====138
+	Note:
+		Clamp properly clamps NANs.
+		Min and Max don't.
X	Mem stack pushing and popping...slow.

+	Duplicate non-instanced brushes:
+		Vortex2  Brushes=799 Identical=488
+		Chizra   Brushes=2275 Identical=1283
+		Dig      Brushes=2495 Identical=1328

///////////////////////////////////////////////////////////////////
2-2-98

	Run faster!

+	Expose FSceneFrame to engine in UnRender.h, BuildMasterFrame.
+		BuildMasterFrame
+		BuildChildFrame
+		Consistent FSceneFrame creation gate
+		All render functions take scene frames, rather than viewports.
+		PUSH_HIT take FSceneFrame
+		POP_HIT_FORCE

+		Move all viewport rendering precomputes to FSceneFrame
+		void ComputeRenderCoords( FVector& Location, FRotation& Rotation );
+		void ComputeRenderSize();
X		Embed a FSceneFrame in UViewport?
+		Always-constant Viewport->X,Y, no XB, YB
X		Correct for aspect ratio?
+		Scene frame zone hysterisis (CreateMasterFrame)
+		ComputeRenderCoords, etc -> FSceneFrame

+		Eliminate need for level locking (enable script execution anytime after postload)
+		Fix net code ramifications

+		Steven merged

+		memstack alignment?
+		Actor vtrics, with a common gate function
+		Consistent FSceneFrame ctor (BuildSceneFrame).
X		Eliminate LockRender/UnlockRender.
+		FSceneFrame accumulate the final actor draw-lists.
+	FSceneFrame contain camera precomputes instead of UCamera!
+	Amazing idiv slowness.
+	Redundent uploading?

///////////////////////////////////////////////////////////////////
2-3-98

====139
X	When load game, verify sizes of all intrinsic classes matching.

+	Show selected actors better
+	Right clicking on an actor is not deselecting the previous actor anymore.
+	New dynamic hit proxy system.
+	void FEditorHitObserver::Click( const FHitCause& Cause, const struct HBspSurf& Hit )
+	New HCoords.
+	Good functions for 2D and 3D hit vector determination.
+	AActor bMovable

+	Net on entry, verify the GUID's.
+	Augh, can't select stuff on gridlines in 2d views!

///////////////////////////////////////////////////////////////////
2-4-98

====140
+	UpdateMusic crash switching levels? Stuck in more debug code.
+	SetupRaster crash. More debugging code.
+	Eliminate old models
+	Source control all models and sounds
+	MeshV needs clicking before updates
+	Triggerlight cache flushing
+	ULevel::Tick optimization
X	Net code iFirstDynamicActor optimization
+	Sort static actors to bottom of list at start of gameplay!

====141
+	Reincarnation is screwed, doesn't teleport player.
+	Lousy performance with many players. Was UDP saturation with headersize at high framerates.
+	editor dies
+	Fixed Steve bug in FarMoveActor (Actors(i)==NULL).
+	PV/C is higher than reasonable? Could be doubling owned actors?
+	Eliminate SoftDrv render dependence

///////////////////////////////////////////////////////////////////
2-5-98

====142
X	FBox::TransformBy is slow
X	Net performance hit is huge amount of client-side spawning due to repeated hitwalls?
+	Cache stats: total items, cache tick time.
+	DUMPCACHE command.
+	Figure out what's using up all the cache memory. -> Memstacks.
+	Flickering lights not flickering - myscha.
X	Need a timedemo benchmark thing. Later with James' showoff level.
+	Check caching performance.
+	James, need to see weapons on male player mesh!
+	Make ScaleGlow work with Unlit.
+	MonsterPath
+		MonsterPath

+	Movers not rendering in editor?

====143
+	Player weapon no curvy.
+	LE_Amorphous: Non incidence light
+	LE_Shell: Neato.
+	Translucent stuff shouldn't be z buffered

///////////////////////////////////////////////////////////////////
2-6-98

====144
+	Replicate MoveTarget
X	bHidden changes doesn't flush?
+	When I select several light and change their properties, the editor is updating only the lights I have on the screen . If I rebuild the lighting everything is fine.

+	Identify all top-level time that is missing from the stats.
+		Frame, Engine, Game, Client, Blit

+	Lighting optimization:
+		8.9 msec -> 8.7 -> 8.9 (better quality)
+		Eliminated need for 0.5 panning fudge factor.
+		Erik: Don't need 0.2/1.2 cheat factors.

+	Mesh code now knows about normal planes and alpha
X	FTransSample ScreenX,ScreenY,RZ -> Screen.

+	Perfect portals and sky in software.
+	Perfect sky in hardware.

+	Fixed 3dfx screen shooter gamma.

+	Render scene frames recursively as a tree.
+	Separate draw list for z-repaintoids, only z-clear if >= 1.
+	Only need to z-flood once per source frame, not per destination.

///////////////////////////////////////////////////////////////////
2-7-98

X	Shadow generation code: Don't accept backlighting on one-sided surfaces.

+	Perfect portals in hardware and software.
+		Plane merging for translucent surfaces (parent-plane not parent-isurf).
+		Make sky and mirrors work together.
+		Make portals and mirrors work together.
+		Fix sky translucency not working when mirrored.
+		Use PF_Occlude properly!
+		3D hardware PF_Invisible: Only performs Z-fill, no rendering.
+		Perfect warp portals in hardware and software.
+		Perfect 3dfx and software warp portal rendering.
+		Option to disable mirrors, via flag mask
+		FSceneNode.
+		Dynamic scene graph technology
X		Singlepass: Reverse order of light maps and textures for better translucency?
X		Do coronas in all scene frames as a separate pass.
+		Portal-actor handling.

+		DSG with dynamic lighting: Save the surface light list.
+		Eliminate LockRender/UnlockRender.
X		Translucent stuff shouldn't have volumetric lighting added
X		DSG-vtric handling, including sky with infinite-distance logic: will be supercool.
X		Can use NearClipZ to perform proper volumetric lighting through portals.

+	bspRepartition
+	Optimize BSP rebuild: first phase post CSG.
+	Eliminate InvalidBsp.
X	Allow selecting and moving cameras, just not deleting them.
+	Eliminate map-edit mode.
+	Eliminate outdated editor functions.
+	CalcFreeMoveRot
+	Merge brush and actor moving.
+	Always show the red brush.

+	marble floors.

///////////////////////////////////////////////////////////////////
2-8-98

====145
+	Right click on 3d backdrop not recognized.
+	Right click menu additions:
+		All: Reset -> Move to origin
+		All: Reset -> Reset rotation
+		All: Reset -> Reset all positioning
+		Brushes: Reset -> Reset scaling
+		Brushes: Mirror
+		Brushes: Copy to brush
+		Brushes: Copy from brush
+		Brushes: To first
+		Brushes: To last
+		Brushes: Select -> Adds, Subtracts, Semisolids, Non-Solids
+		Eliminate unused "place on floor" etc actor options.
+		Eliminate "Resize/Move brush" dialog.
+		Brushes: Apply transformation permanently (not just red brush)
X		Brushes: Sheer axis
+		Fix mover keyframes.

+		HBspSurf, HBackdrop: "Add <class> here, Add Light here"
+		Eliminate CurrentClass.
+		Eliminate add-actor, add-light modes.
+		Eliminate move-actors mode.
+		Fix clicking on brush builder icons.
+		Shift-A select all actors.
+		Shist-S select all surfaces.
+		Retest all shortcut keys.
+		Only one "select none" function.
+		There should always be only one selection set.
+		Left-click on backdrop should select none.
+		Universal "select none"
+		Cleanup UEditorEngine::Key.
+		Eliminate the EMC_ enums.

+		Right-click on all views: Show "grid" options.
+		UnrealEd toolbar is useless, kill it.

X		Double-click detection?
X			Right-click on actor bring up properties?
X			Double-click on brush toggle mode:

+	Eliminate "reset texture" and "reset brush" tools; they add nothing new.
+	Eliminate "move actors" tool; it adds nothing new.
+	Eliminate "add actor" button.
+	Eliminate unused height-map tool

X	Modeless surface/actor editing. Only one selection set.

X	Make solid/semisolid/nonsolid changeable from "Actor properties".
+	Eliminate map-edit-mode toolbar

///////////////////////////////////////////////////////////////////
2-10-98

+		Console load/save option.
+			LoadGame #, SaveGame #.
+		GSystem::ClipboardCopy( const char* Text );
+		Report command that shows engine version, map version, file date/time, map location, difficulty level.
+		JumpTo command to move the viewport location in UnrealEd.

+		Fix progress bar
+		"Edit script" move down
+		Rt-click surfaces needs fast "select all surfaces" option.
+		Rt-click actors needs fast "select all actors" option.

+		Select-all-actors button
+		Select-all-surfaces button
+		Surf props dialog should show count selected.

///////////////////////////////////////////////////////////////////
2-11-98

+		Email deluge
+		Wrote zone doc

+		Reset all should reset prepivot and postpivot.
+		Can't turn grid off!
+		Snapping active brush to grid and pivot is broken.
+		Subtracting a brush without releasing the ctrl key stops grid snapping
+			click flags aren't synched.
+		Why is mouse movement now unsmooth? -> Tradeoff vs. click responsiveness.

+		Adding an actor should select that one actor.

+		LoadConfig in UnrealScript
+		Hierarchical LoadConfig

X	TActorIterator<cls>(ULevel); -> VC++ makes this way slow.
X	Clean up all iteration through the actor list!
X	Are mouse movements becoming unsmoothed/rounded to integers?

///////////////////////////////////////////////////////////////////
2-12-98

+	Wasted 4 hours on email debates

+	Selecting additional brushes/actors must choose common pivot.
+		Need a good way to handle common pivot points with brushes and actors.
+		Editor "proxy position" and rotation for pivot, with no render-time grid snapping?
+		Select first brush or no brushes: Pick new proxy position and rotation as proxy position.

+		Movement and rotation: Relative to proxy.
+		Actor pivoting and autosnapping.
+		Brush pivoting and autosnapping.
X		Do brushes really need both prepivot and postpivot? Can use just pivot?
+		Move click flags to UEditorEngine, and make nearly all editing non-viewport based.
+		Snap pivot to grid should move selected actors.
+		SetPivotPoint: If applying to single brush, update the brush's local pivot.
+		Eliminate AActor::SetPivotPoint
+		Right-click on pivot act like other brush vertices. HGlobalPivot.
+		Right-click snap pivot to grid works weirdly.
X		NoteSelectionChange SnapSelection
+		PostPivot file-load upgrade code.
+		Eliminate AActor::PostPivot.
+		Editor PostPivot should be phrased more as a grid origin.
+		Don't allow duplicating the template brush.
+		Don't show pivot point when nothing selected.
+		When selection changes, only modify current pivot if there wasn't already one shown.
+		Replace DrawOffset with standardized PrePivot.

///////////////////////////////////////////////////////////////////
2-13-98

+		Hide constraints from the rest of the engine (editor only).
+		Cleanup all pivot code and constraints code.
X		Pivot location and other info should survive undo/redo.
+		Test full undo and redo with pivots and selection.
+		"Reset all" should reset global pivot position.
+		Right click on backdrop: Pivot->Place here unsnapped, Pivot->Place here snapped

+		Thoroughly test movers with new pivot code.
+		Make the pivots feel right and intuitive.
+		Deal with modes like EM_BrushRotate, gate through MoveActors?

+		ClipboardPasteString
+		Better viewport actor and brush following.
+		RF_NoTrans for viewports; allow selecting and moving viewports around.
+		edactDeleteSelected: Ignore RF_NoTrans.
+		Shift + actor movement should act as if viewport is selected, for movement and rotation.
X		Right-click in 2d view: Option to stick 3D viewport there?
+		Cut, copy, paste shortcuts; "EDIT CUT/COPY/PASTE"
+		Assign function keys to actor properties, surface properties, level properties, rebuilder.
+		Cut, copy, and paste actors and their brushes, including between maps.
+		Verify cut, copy, paste undo and redo.

+	Milestone: Today id Software released the first screenshots (test model renderings) 
+	representative of their upcoming Trinity engine.

///////////////////////////////////////////////////////////////////
2-14-98

+	Improved mouse handling.
+		UViewport::SetDrag manage FirstHit, LastRelease.
+		Eliminate SHOW_NoCapture.
+		Engine manages mouse capture.
+		No special case clicking, dragging EM_TexView; use HHitTextureView.
+		Note: could use MousePosition messages for feedback generation.
+		Engine manages mouse clipping region separately from capture, i.e. for texture viewer.
X		CaptureMouse option; esc or alt-tab release.

====146
+	Lower baseline memory usage for the code!
+		Move TCP/IP support to IpDrv.dll and don't link to WinSock DLL's otherwise.
+			Verify not loaded in single player game.
+			Test network play.
+		Base the new dlls
+		Move Windows viewport and platform support to WinDrv.dll.
+			Viewport support.
+			Verify not loaded in dedicated server.

///////////////////////////////////////////////////////////////////
2-15-98

+		ParseParam
+		Eliminate Platform MFC dependencies.
+		Move Platform.cpp to Core temporarily.
+		Non-MFC Unreal.exe.
+			Startup code.
+			Message pump.
+			Viewport window menu.
+			Log window prototype.

+		Window class fundamentals.
+			Window subclassing support.
+			Edit control.
+			GLogHook.
+			WTerminal.
+			DestroyWindow issues.
+			Log code crashing with big BRUSH SET's.
+			Fully functioning log.
+				Typing commands and retyping.
+					chars, bkspc, enter, esc.
+					Bind WTerminal to UEngine exec.
+					paste cmds.
+				Overflow cutoff.
+				"Launch without log".

///////////////////////////////////////////////////////////////////
2-16-98

Init: Detected: Coprocessor, Projective Near 53-bit

====147
+	Logging.
+		Window icons.
+		Close log only close app if dedicated server.
+		Exit after -make.
+		OnDestroy.
+		unreal -make: no client
+		GIsRunning
+		GIsSlowTask
+		GSecondsPerCycle
+		GIsMMX, GIsPentiumPro, etc.
+		GIsMMX, GIsPentiumPro
+		appCmdLine, work pre-startup.
+		FFeedbackContext
+		appRequestExit
+		appOpenLog, appCloseLog.
+		Move inherently global GSystem functions to global scope.

X		Auto opening of the log file based on command line, for early logging.
X		Handle debugf before startup.
X		Eliminate GSystem.

+		GErrorHist
+		UObject::ShutdownAfterError
+		Fix crash handling (GIsGuarded)
+		Global crash recovery strategy for audio and DirectDraw (general object service).
+		Early crash handling, even pre-startup.
+		Critical error messagedeath similar to solve problem with UObject destruction
+		GPageSize, GProcessorCount, GPhysicalMemory
+		Fix filetype registry.

///////////////////////////////////////////////////////////////////
2-17-98


+	Non-MFC editor.
+		Ed.Server.X -> Ed.X
+		Translation layer.
+		Init and exit.
+		Exec.
+		GetProp.
+		SetProp.
+		Fix string handling in SetProp.
+		Startup: Print base directory.
+		Duplexed threading model for better VB interoperation.
+		Broken realtime icon?
+		Why not loading unreali.u?
+		Editor realtime views in lieu of message pump.
+		"ENABLE" / "DISABLE" (needed, since child windows?)
+		Fixed autosave, woohoo!

+		SetProp.
+		EdCallbacks & hWndMain.
+		Get basic functionality working.
+		Reliable common dialogs.

///////////////////////////////////////////////////////////////////
2-18-98

	if( GCrosshair && !GLoading )
	{
		const char* Crosshair="+";
		INT XL, YL;
		Viewport->Canvas->StrLen( Viewport->Canvas->MedFont, XL, YL, Crosshair );
		if( XL<Frame->X && YL<Frame->Y )
			Viewport->Canvas->Printf( Viewport->Canvas->MedFont, Frame->X/2-XL/2, Frame->Y/2-YL/2, "%s", Crosshair );
	}

+		WDialog support.
+			WLabel
+			Password modal dialog complete.
+		Eliminated GameEngine.uc; no longer needs to be synched up between C++ and UnrealScript.

+		Can now debug UnrealEd.exe!

+		warnf
+		GExecHook
+			GenPass
X			ShowLog

+		Handle errors in editor better (appError hook from thread function).
+		SetModeCursor
X		Smoother movement in windows?
+		Make editor crashes easier to track down - guarantee valid log generation.
+		Eliminate "Windows" project altogether.
+		Eliminate MFC42 inst2allables; add new DLL's.

+		Command line map not recognized!

+		WListBox
+		WProperties base
+		OnSetFocus, OnKillFocus, OnSize
+		Steve merged
+		Verify debug version working well (hey can now use with UnrealEd.exe).
+		Reduce working set.
+		fix all editor cwd issues (rebuild gives autoexec.mac error)

///////////////////////////////////////////////////////////////////
2-19-98

====148
X		Now you can't paste into primitive builders...
X		Ack! glxStartOutput crashing on winmm with multiple copies running.
X		Often can't undo moving actor that is already selected
X		UnrealEd vb crash propagating to C++

X	System .dll with no dependencies. -> Tied in to core via FName, TArray, others.
+		UnFile.cpp functions.

+		Window .dll with GUI related classes.
+			Cleanup Launch.
+	Render as replaceable .ini subsystem.

+	3d hardware ifc:
+		fast sprite drawing 2*(SX,SY,Z,U,V,R,G,B,FR,FG,FB,PolyFlags)
+		PF_RenderHint
+		Optimized UGlideRenderDevice::DrawTile
+		frame buffer reading for standardized screenshot code
+		"SHOT" now works in software and hardware

///////////////////////////////////////////////////////////////////
2-20-98

====149
+	Cache .ini settings.
+	Fixed "SHOT".
+	Fix "show log" in game.
+	Movers support SpecialLit.
X	No OnXX() notifications, just use a simple message loop.
+	Use WWindow as basis for UViewport.
+	extern hInstance in all dlls
+	platform tag-on to IMPLEMENT_PACKAGE?

+	Merge editor and Launch code where appropriate.
+		Startup/shutdown.
+		Password checking.
+	"show log" in editor.

+	WProperties.
+		Proper background clearing.

+		Proper cursor-following.
+		Actual item array.
+			Allocate and free items.
+			Category item drawing.
+			Property item drawing.

///////////////////////////////////////////////////////////////////
2-21-98

{LPVOID lpMsgBuf;
FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpMsgBuf, 0, NULL );
MessageBox( NULL, (const char*)lpMsgBuf, "GetLastError", MB_OK|MB_ICONINFORMATION );
LocalFree( lpMsgBuf );}

====150
+	Category display.
+	Property name display.
+	Property value display.
+	Sort categories.
+	List item messages:
+		OnSetFocus, OnKillFocus, OnClick, OnDoubleClick, OnHelp messages.
+	Proper category expansion and contraction.
+		Grow list window.
+		Proper repaint after state changes.
+		Object property assimilation.
+		Sort properties in category.

+	Proper struct expansion with offsets.
+	Proper array expansion with offsets; don't show value.

+	Draw cool treelines.
+	Fixed editor bug in FProperty::Export.

+	Simple value editing.
+		Floats.
+			Select stuff in box when set focus.
+			End edit when form loses focus.
+			Resizing should end edit.
X			Proper window size validation based on column widths.
X			Single-click on category should expand it.
+			SetFocusItem gate.
+			Abstract Expand/Contract functions.
+			Cleanup the FListItem abstractions and hierarchy.
+			Watertight begin/end edit handling with focus control.
+			WItemBox.
+			Click on expandable item should expand/contract the tab.
+			Proper string quotes and special character control.
X			BeginEdit, EndEdit abstraction? Or subclass FPropertyListItem? Just OnItemSetFocus.
X			Show edit box in proper color.
X			Better following of selection as you scroll around.
+			Floats, Ints, Names, Strings via edit box.
X			Tooltips: Categories - "Double-click to expand"?
+		Properly end editing and import property via callback if changed.
+			FControlSnoop.
+			Intercept "enter" to send property and rehighlight it.
+			Intercept "enter" to abort are reload property.
+		InitCommonControls. 
+		Bytes via sliders.
+			WTrackBar
+				Trackbar sending.
+				Trackbar updating.
+		Combo boxes.
+			WComboBox.
+			Enter on category should toggle expansion.
+			Always intercept up, down keys and cause them to move through items.
X			Show colored expandable treelines based on indent level.

///////////////////////////////////////////////////////////////////
2-22-98

+	Funky color for categories!
+	Tab, shift-tab scroll through items.
+	Always proper differentiation between bytes and enums.
+	Finish combo boxes.
+		Enums via combo-box.
+		Booleans via combo-box.
+		Advance.
+		Double-click, enter cycle through items.
+		Edit box: only send if change.
+		Combo box: only send if change.
+		Don't intercept home/end.
+		"EDITACTOR CLASS=classname" cheat for game! Edits nearest actor of class. Cool.
+		Special-case "state" editing via combo box.
+		Support CPF_EdConst; use for Name (expose).
+		"SHOWALL" cheat in game (sorry, irreversible).
+		EDITACTOR pick closest guy
+		Slider doesn't stick.
+		Support flag mask, i.e. CPF_Edit, CPF_Config, or 0.
+		Test with bizarre Windows destop settings and colors.
+		Perfect look and feel.

+	Editing.
+		WButton.
+		AddButton.
+		Button message routing.
+		Objects:
+		Show color if struct Color.
+		Editing child node must propagate display up to parents.
+			Fix color slider redraw.
+			Merge FTreeListItem and FListItem into FTreeItem.
+			Eliminate GetStringValue.
X			Draw Rect contents around buttons.
+		Class, texture, mesh, palette, sound, music: [..] [clear] [use].
+		Color struct: special-case color dlg and button.
+		Unreal -make crash on exit.

///////////////////////////////////////////////////////////////////
2-23-98

+	Better encapsulate reading and writing for multiselect.
+		Gate all writes through Property.Import.
+		Handle multiselection with full aborts and culling.
+		Safely handle NULL BaseClass.
+		Move up/dn doesn't redraw parents
+		Clip interior of rect around buttons.

X		FProperty::ExportText
X		CORE_API ExportProperties
X		EDITOR_API ImportProperties

+	Hook new properties dialog into UnrealEd.
+		Open with proper parent window (log also); keep title updated.
+		Internal update upon selection change.
+		Internal "actor properties".
+		Internal "level properties".
+		Internal "class default properties".
+		Internal "texture properties".
+		Safely handle actor deletion and map reloading.
+		No DefaultEdCategory.
+		Always bring proper window to the top.
+		Actor resetting
+		Eliminate "ACTOR" "PROPERTIES" "PROPCATS"
+		Test importing/exporting maps.

///////////////////////////////////////////////////////////////////
2-24-98

+	Proper refresh remember expansion state.
+		When select none, remember old expansion state.
+		Current item.
+		Top of page item.
+		Proper window titles.
+		Support multiple properties windows open, but only one multiselect-actors window.

+		Double-click on actor or brush should bring up its property sheet.
+		Changing any object properties must refresh view.
+		Edit LevelInfo/ZoneInfo properties must flush
+		Right-click on pivot forward to actor. -> Don't show pivot if one actor.
+		Handle mover keyframes.
X		Notify pre and post change gate?
+		After move mover, fix pivot.
+		Undo handling (transact on do, repaint on undo).
+		Undo/Redo should update all properties windows.

+		Editor post-compile: Update all object properties dialogs.
+		Eliminate old C++ and VB code.
+		Editor post-map load: Update all object properties dialogs.

+		ATcpLink prototype.
+		Is AUTOREGISTER_INTRINSIC needed? -> Yes, but only because of fvector trick.
+		Get Nick working on ATcpLink and full master server integration.

+		Client exiting net game crashes client.
+		Closing ded server log doesn't close server.
+		Trying to run 2 servers on same port crashes.

///////////////////////////////////////////////////////////////////
2-25-98

+	WConfigProperties.
+		Hierarchical menu definition: config tabs and subsystem tabs.
+		No Indent.
+		Parse Menu.txt.

+		Working base menu hierarchy.
+		Trees need JustInTime option.
+		Merge FConfigItem, FConfigItem.
+		Cleanup tree rooting (Root pointer, and hidden root items?)

+	Better tree rooting (for true hierarchical embedding):
+		WProperties: Root.
+		Invisible root FObjectItem handle WObjectProperties work.
+		Eliminate Empty, AddRootItems.
+		Cleanup adding items to tree.
+		Eliminate JustInTime.
X		No OwnerProperties?
X		Merge WProperties and WPropertiesBase?
+		Cleanup object access propagators.
+		Cleanup AcceptFlags usage.
+		Root item GetCaption<->WProperties caption.
X		Merge WProperties, WObjectProperties, WConfigProperties.
X		Need OwnerProperties?

+	Generated intrinsics cause major slowdown due to on the fly name hashing.
+	Names as global variables bound at startup time.
X	Allow global preregistering of names using intrinsic constructor.
+	Defaults vs. Properties.GetSize()

+	Working subsystem properties editor.

///////////////////////////////////////////////////////////////////
2-26-98

+	Real configuration.
+		FConfigObjectItem (no categories, lazy load of class defaults).
+		Handle failed class loads cleanly.
+		Show class default objects.
+		All classes need big enough default objects!
+		Need way of initing pure C++ classes like UAudioSubsystem.
+			Static ClassInitializer.
+			Upgrade all AddProperty's.
+			Note: This is a partial solution to the metaclass problem.

+		Load the class defaults dynamically with new LoadConfig.
+			Proper hierarchical LoadConfig.

+	Config should set owner to opening camera window.

+	Subsystems.
+		Can't expand subsystem structs for some reason.
+		Actor properties broken.
+		Optional config category filters.
+		LoadConfig/GetConfigString only handles first word of string.
+		All FTreeItems need a GetCaption() function.
+			Auto sort the config tabs by their GetCaption().

+		Editor
+			Grid (proper defaults).
+			Rot grid (proper defaults).
+			Command line (proper defaults).
+			God mode.
+			Fov.
+			AutoSave time.
+			Colors.
+	No "Color" expander, just gets in the way.
+	Eliminate UnrealEd "preferences", "grid", "rotgrid" interfaces.
+		Selecting actors don't mess with config, level properties, tex props.
+		Bool Immediate; PreEditChange, PostEditChange.
+		test grid update
+		test rotgrid update
+		test godmode
+		test fov update (redraw)
+		Run map use command line parameters "RUNMAP"
+		Test autosave time, mode.
+		Eliminate Grid, RotGrid windows.

+	Editor.
+		Proper SaveConfig using hierarchy
+		Test fully saving the preferences to the .ini file in the proper base class range

///////////////////////////////////////////////////////////////////

	Construction history thoughts.
		Basic brush: Brush
		Basic outline: Brush
		Circle builder: Outline
		Arch builder: Outline
		Cube brush builder: Brush
		Sphere brush builder: Brush
		Affine transformation: Brush
		Simple revolution: Brush
			Outline
			Subdivision per 360 degrees
			Subdivision count
		Simple extrusion: Brush
			Outline
			Length
		Beveling: Brush
			Outline
			Various parms
		Clipping: Brush
			Brush
			Clipping plane
		Union: Brush
			Brush 1
			Brush 2
		Difference: Brush
			Brush 1
			Brush 2
		Intersection: Brush
			Brush 1
			Brush 2
		Convolution: Brush
			Brush 1
			Brush 2
		Deconvolution: Brush
			Brush 1
			Brush 2

///////////////////////////////////////////////////////////////////
2-27-98

====151
+	bSort; don't sort array indices.
+	Load arrays from registry.

+	Interface.
+		Cleanup BaseDir.
+		Remember WWindow positions and sizes if WWindow PersistentName!=NAME_None.
+			Only restore size if sizable.
+			Handle multiple windows with same persistent name.
+		Fix enter not unexpanding tabs.
X		Child properties should use hierarchical left-colors from their parent tabs!

+	Exposure.
+		Editor.
+			Edit packages.
+		Engine.
X			Paths.
X			Exts.
X			Log supression.
+		Client.
+			Standard.
+				Screen res.
+				Brightness.
+				Mip factor.
+			Windows.
+				UseDirectDraw.
+				CaptureMouse.

+	Audio.
X		Break generic properties (volume, etc) into UAudioSubsystem?
+		Output rate -> enum
+		Sound vol, music vol, ambient factor -> byte sliders.
+		Verify realtime settability and clean resetting.

+	Editor object interface.
+		EDC_Browse, "OBJ" "BROWSECLASS", UseDest
+		EDC_UseCurrent, "OBJ" "NOTECURRENT", UseDest
+		EdCallback( EDC_, 0 );
+		EdCallback SendMessage option.

+	Right-click actor menu:
+		If brush: Brush -> Copy to active brush, Copy from active brush
+		Order: To first, to last
+		Eliminate map-edit dialog
+		Eliminate map-edit mode entirely
+	Actor selection: Should work on brushes if map-edit mode.
X	LevelInfo.DefaultGameType.

X	Treat ZoneInfo ambient sounds differently.
X	Update audio doc.

+		Surf props = only shows 1st digit of # selected.
X		Surface properties: Expose Extra1, Extra2, etc.
+		Use Danc's cool icons.
X		Clicking on Brush and then the Reset menu item will reset a brush
X			scale/size/position even if you don't click on anything at all - just
X			moving to the menu item resets everything.
+		Pressing Del on a character (just remove a number or so) gives a warning message, instead of just removing the character.
+		Invalid row value when scrolling.
+		Ole auto error still happens in VB with autosave. Nice and isolated now, though!
+			Have UnrealEd to tell C++ to autosave when convenient (hack but functional).
X		24-bit color crashes (still?)
+		When you edit something, after editing you cannot just click the window away, but first gotta go to another entry (line) before the entry you edited is recorded. This is very uneasy and un-intuitive.

X	bSimpleLit just one light calc per mesh
X	Want to be able to select brushes in texture views; select surfaces in actor view?
+	Replace with UEditorEngine settings:
+		Options/Preferences
+		Grid settings
+		Rotation grid settings
+		Window/Log in game and editor must work.
+	saveconfig should save base class parms in child class section, not base class!
+	unrealed is turning dxf quads into triangles??? no
X	can't un fullscreen in unrealed
X	abortable progress bar? keypress (esc) only? should be easy.

+	Console savegame and loadgame.

X	Eliminate possibility for viewport lock to fail.
X	Eliminate read and write locking entirely.

+	UnrealScript intrinsic-calling name binding slowness
+	Triggerlights sticking.
+	Software render cleanup.
+		Software rendev stats.
X		No softdrv dependence on render lib
+		Cleanly handle mode transitions without mouse anomalies.
+	Carrying inventory among levels.

X		Dynamic buffering.
X			If any outgoing reliable buffer overflows configurable limit, totally kill that connection.
X			Don't overuse reliable RPC calls.
X			Make network bunch array into dynarray?
X			Dynarrays should not realloc if decreasing size, and size<2*inc, even if size goes to zero.
X			Use dynarray for incoming and outgoing bunches.
X			New PlayerTimeout message after 10 sec.
X			Contemplating using same tagged property code for net play and file format.
X			Autonomous proxies should be able to call only simulated functions!
X			Make non-network-callable intrinsics non-final.
X			Pushing buttons (movers) sucks, maybe client should notify server?

X		Use ATcpLink for -> Handed all of this to Nick.
X			Connection to master server. AMasterUplink.
X			QSpy info port.              AQueryLink.
X			IRC chat gateway.            AIrcLink.
X			Event gateway.               AEventLink.

X		Show-detail-brushes toggles.
X		Add & subtract - detail/structural toggle.
+		Separate structural and detail bsp processes.

+		Config UI.
+		Audio options

+	Color picker.

///////////////////////////////////////////////////////////////////
2-28-98

+	Erik merge
+	Eliminate Render.uc (now render.utx), RenderBase.uc
+	Overall rendering options.
+		Curved surfaces.
+	Rendering options to expose in config.
+		All URenderDevice configuration settings.
+			VolumetricLighting
+			Coronas
+			ShinySurfaces
+			Translucency
+			HighDetailActors / bHighDetail
+		Verify cool GlideRenderDevice settings.
+			RefreshRate
+			Wait-for-retrace option
+			DetailTextureMapping
+			Smoothing.
+	Steve:
+		I changed bGlowing/bLightDir to AmbientGlow==255.
+		This is now handled in the rendering code.
+		You can eliminate ClientGlow, ClientNoGlow just by replicating AmbientGlow.
+		Verify cool SoftwareRenderDevice settings.
+			HighResTextureSmooth
+			LowResTextureSmooth
+	Improved weapon mesh sorting heuristic.
+	HighDetailActors / bHighDetail
X	Dynamic lighting on/off option?
X	Disable all audio (save memory) -> Sucky game experience.
X	Light map detail chop option?

+	Optimize lighting code!
+		Setup.

+	Fixed geometry rebuild coplanarity handling.

///////////////////////////////////////////////////////////////////
3-1-98

+	iPermeating list contains duplicate lights!
+	No duplicate light leaf handling with semisolids.

+	Actor light cache.
+	Actor light prioritization
+		Smooth shadow transitions.
+		Integrate cache code.
+		Eliminate framerate variance. -> No, framerate variance is great for trace amortization.
+		Trace amortization.
+		savegame 2 - 38.5 msec mesh lighting -> 4.1.
+		Actor polys getting corrupted on 3dfx? Was light palettes with zero colors.
X		Roll ambients into shading so overall brightness is right.
X	Don't do redundent lightmap uploading just because of scene frames.

+	Fixed ddraw odd modes.

///////////////////////////////////////////////////////////////////
3-2-98

+	Input system config.
+		UInputBase, UInput.
+			Dynamically load input subsystem.
+			Action mappings in the .ini	file.
+			Bind F1-F12 for expandability.
+		Aliases.
+			Load alises with input subsystem.
+			Expose command aliases.
+			Rephrase Autoexec.mac in terms of action mappings.
+			Make alias key/button mappings work (no recursion).
+			Get everything working again.

+		Export DynamicStrings.
+		Import DynamicStrings.
+		DynamicStrings shouldn't show up as expandable.
+		DynamicStrings editable like regular strings.
+		Expose and allow editing raw input mappings.
+		Eliminated Autoexec.mac.
+		Cleanup input subsystem.
X		rt. click 2d/3d views "paste here" if actors

///////////////////////////////////////////////////////////////////
3-3-98

+	add-actor/light shortcut key (A/L + click).
+	terraniux brushes moved by a few units? terrafix.unr
+	don't fade in vtric lights on actors, duh!
+	don't require ctrl right click to edit multiselect actors and surfs.
+	CPF_EditConst: Read-only in editor.
+	Right click on surfaces and actors requires ctrl for multiselect, shouldn't.
+	Click on map file in Windows gives autoexec.mac error.
+	screwed water portal sorting
+	mesh viewer
+	progress bar

====152
+	config menus crash when launch .unr file instead of .exe
X	louder!
+	fplane oper== confusing the reflection portal merging code?
+	fix mesh coords hosed on 3dfx
+	need ipdrv.dll
+	fix binding esc
+	use esc for menu, not f1
+	fixed adding actors
+	fixed editor thinking subtracts were semisolid

///////////////////////////////////////////////////////////////////
3-4-98

+	bad shadowmap alignment on 3dfx, need to bias
+	right click on slider edge doesn't update value
+	accept gameinfo on the command line for ded servers.
+		If you specify mapname?game=gameinfoclassname in the
+			server's starting URL, that game class will be used.
+		Otherwise, the level's DefaultGameInfo will be used if not None.
+		Otherwise, the Subsystems.Game class in the .ini file is used.
+	accept server port number in the server's starting url. or port=.
+	client must accept ports.

+	pause msg stay up till unpaused, in big letters
+	clear input when paused
+	go into menus, camera window lose focus pause game (optional?)
+	steve: player can shoot when the game is paused?
+	pause game when main window loses focus
+	show log set focus
X	don't fire on menu clicking and initial window clicking
+	steve & james merged
+	erik merge
+	generally fixed deleting actor after paths define crashing savegames.

====153
+	Refixed rebroken saving.
+	UnrealEd reclicking on actor/surf should unselect it
+	actor lighting hysteresis
+	Cleanup "ResolveName" error messages.
+	replicate arrays for steve
+		FBunch::SendProperty
+	Steve fixed the menus.
+	Steve: Fix pausing with menus and firing.
+	Default.ini
+	shane csg order problem
+	myscha 4 voodoo2 bug (glide bug? ask jack!)
+	Add skill level and game type to report (date of .unr file, no)
+	myscha brush ordering problem?
+	myscha glide broken

///////////////////////////////////////////////////////////////////
3-5-98

wargate.s3m -- "halls of eternia" amazing!

X	dynamic light stats (break out)
+	Not clipping to mirror regions?
+	Editor undo crash?
+	New Galaxy: Still fucked over.
+	F1 "ActivateHint"
+	F2 "ActivateTranslator"
+ 	Implement CaptureMouse so playing in a window doesn't suck!
+		Release mouse when lose focus.
+	Increased sky z-buffer scaling.
+	Hud & menus no screenflashes (Canvas Z).
+	radius view - only show sel actors
+	Console command list
+	Scaled z-planar alignment, scaled natural alignment.
+	Changing class defaults needs to note changes.
+	Give steve new list of object conflicts.
+	Need "reallly low shadow detail".
+	ScreenFlash -> Plane.
+	Glide: Build 128*128*2*3 scaler table. 12.4 -> 11.5 msec -> 5.3
+	Pyramid compress the precision table.
+	redudent lmap uploads on transparent polygons! 12 -> 1.5
+		TF_RealtimeChanged
+		if >1 surf visible, uploads exactly twice!
+		maxcolor issues?
+		verify dynamic lights not sticking
+	kill pf_dynamiclight
X	rebuild: bitch if filename and classname are mismatched

====154
+	ambtest what the hell is wrong here
+	maxbrightness issues

+	Creatures: Lock all textures in advance.
+	init mesh texture array to 0 elements, and add textures on demand.
+	Avoid redundent coordinate copying in setup.
+	Optimize clipper.
+	Avoid redundent backfacing.
+	Time not sorting (1 msec plus), skip in hardware.
+	Combine normal computation and backfacing math.
+	Presort by texture index at import time.
+		25.1 sw -> 23.1 -> 22.8 -> 22.3 -> 20.1 -> 19.9 -> 19.6 -> 18.9
+		20.2 hw -> 18.8 -> 18.6

///////////////////////////////////////////////////////////////////
3-6-98

+	Actor properties.
+		Better categories.
+		Tag/event together

+	Bugs.
+		Mover keyframes messed up?
+		Shane tag problems.
X		Mover pivot point problems in non keyframe 0.
X	ridiculous volumetric times in newly rebuilt maps in game only?
+	Software and hardware fog parity.

X	Investigate lighting memory vs. speed tradeoffs.
X		3.0 lights per surface avg  5.0 weighted.
X		No superfast realtime compression scene is worthwhile.

///////////////////////////////////////////////////////////////////
3-7-98

+	Save window rect for 3d hardware.
+		Only do ComputeFromActor for lights being computed.
+		Light map rect clipping!
+		Optimize rect clipping.
+		Regular lighting routine.
+	Test 0: 30.9 -> 23.9 -> 9.3 -> 8.9

X	Creature outcode clipper opt 5: 13.3
+	Occlusion.
+		Optimize node pipe. 9.1 -> 8.1 -> 7.8 -> 
+		Creature lighting redundent projection?
+		No redundent point saving / copying on 3dfx. 25.2 -> 23.2
+		Occlude stats:

///////////////////////////////////////////////////////////////////
3-8-98

+	Do superfast bounding box and/or sphere reject.
+		Nodes (speed up outdoor areas a huge amount).
+		Per-node frame coherence amortized visibility test.
+		12.9 msec checktime -> 11.0 -> 10.5 -> 1.5!
X		Optimize box test.
X		Get rid of "active zone mask" concept? Just simple list of bytes?
+		Fixed the last numerical imprecision crashing.
X		Save memory on the raw illum maps?
+		Support regional polygon clipping.
+		James merge.

====155
+	Reoptimize outcoding.
+	SceneFrame needs ScreenBounds parm.
+	Eliminate LastStartY, LastEndY.
+	Test speed w/o merging.
+	bound light calculations by dirty rectangle for lighting, merging, etc.

X	Corona flash fog and flash dot options?
+		Mouse speed

+	when move brush in map edit in unrealed, say so in 3d view and show those brushes as wires?
+	show SELECTED actor collision sizes in 3d view
+	change password
+	deselecting movers causing them to disappear

+	Assign leaves, zones, and portal visiblility based purely on structurals.
+	Improve CSG rebuild with structural brushes and detail brushes.
X	Levels need an overall ambient sound scaling value because level designers are inconsistent. :(
+	When you pause the game, it still accepts the fire command so when you unpause the game will shoot.

+	URL game info class.
X	actor sorting wrt movers is incorrect

+	exec tim: 27.0 -> 24.8 -> 16.1 -> 15.5 -> 14.7 -> 13.9

X			Get a feeling for how many node planes are redundent, whether
X				it's worth stamp-caching their plane dots with respect to
X				an arbitrary point - big speedup for stuff like traces.
X				Dot, Flags (PL_Front, PL_Back, PL_Behind).

///////////////////////////////////////////////////////////////////
3-9-98

+	Rendering optimizations.
+		9: Shows mesh poking through floor.
+		Fixed both cases of meshes poking through walls and ceilings.
+		Occlusion.

+		Flushing forces relight of totally visible actors.
+		Doing redundent light list per brush? -> Yes, but only worth optimizing if trace.
+		Movers skip backfaced poly lights. -> Still looks bad.
+		Cache mover static lighting when not moved/rotated.
+		ISV Kran crash

+		Fix mover dynamic lighting.
+		Save light list and vtric list when encounter a mover surf.
+		Time span box visible. -> Not significant.
+		ComputeFromActor self check for redundency and temp tables.
X		Cache the light setup per surface?
+		Movers aren't getting dynamic lights.
+		Fix initial fadein of visible actors.

X		mit/vactor.unr: Mesh vtrics are filter order dependent?
+		No mesh vtric fading, apply them all.
+		See if light palette building time is significant. -> No

+			Cleanup and optimize the lighting functions.
X			Save shadowmap compression region?
+			software actor vis wacked - show span for debugging?
X			Optimize light setup; can cache stuff?
+			doing extra actor lighting because of vtric overlap test?
+			Only light movers from behind with incidence lights.
+				Cache mover static lighting if mover doesn't move.
X		Lighting.
X				Cache triggerlight lighting if it doesn't change.
+		Account for other 50% of occlusion time.
