
---- 0.55a --------------------------------------------------------------------
---- * date unknown

new crypt for clients up to 2.0.7
2.0.7 client has strange problem with text containing - or _ in UNICODE speech modes (this can crash the client in some cases)
	UNICODESpeech=off will fix for english.
3d beta client support.
new key ACCOUNT.CHARS
new key ACCOUNT.CHAR.x.NAME
use verb serv.server.0.name
bandages only for gm's
Steal Looting corpses
line numbers for errors where not accurate - ftell() is not accurate in text mode !!! does not work with fseek to get you back to the same place !!!
CHECK cant feed pets ? not GM's
Ghosts can't equip scriptable timers ? timers don't expire.
block type [REGION] changed to [REGIONTRIG]
added key RESOURCES= to [AREA]
added new block type [REGIONRESOURCES] in sphereregion.scp
changed [MAPRESDEF] to [REGIONRESOURCE]
ANIM with backwards and TimeDelay = invis in all other clients (client bug really)
x You put the logss in your pack
x. Also you can smelt Chaos and Order shields to get gold and blackrock ingots in mass amounts with no or little work.
x. Also with the guild stones, you can recruit the guildmaster making him a candidate and 
	take over the guild stone and kick everyone out. Warring guilds tend to make mules and do this sort of thing.
18. Many guild bugs. Players can be "half-way" in a guild now. 
	The result is other waring guilds are now orange to you and 
	you are blue to them. They can be half way in the guild two 
	ways. 
	18.1. Have the guildmaster never accept you fully in. 
	18.2. after the guildmaster accepts you in, don't click the stone. You can actually end up half way in a guild with your guild tag on. 
19. Another guild bug is people will make a charater with 10 str 
	and then join it to a guild thats either Chaos or Order. 
	Then go attack greens, the player will auto attack back and 
	easily kill the player with 10 str. Thusly giving them a kill
	they get guard killed and a near by guildmate loots the corpse of the person that got attacked by the guy with 10 str. No criminal tags are incured on either the looter or the attacker due to the fact that the target was green.

---- 0.55b --------------------------------------------------------------------
---- * date unknown

XBank and XCOLOR problems.
test inscription 
DUPE limited to MaxItemComplexity
X (seems ok, script issue ?) word Bank dont work
immunity to ones own spells.
X (seems ok to me) defname of types don't work
x no loss of ar-value on unequipping armor or another item, but unequipping works correct with xedit 
X (seems ok, script issue ?) scribing scrolls no longer check to see if magery is high enough to scribe a scroll
x The same with weapons like bow, you can shoot with the unequipt bow after unequip...
X ( seems ok) .shutdown 1 says it will, but never shutsdown :)
X returnvalue for functions . see i_test_rand_ret
slight damage to mining tools as used.
@SkillTry to @SkillStart

---- 0.55c --------------------------------------------------------------------
---- 15/03/2001

sphere list sorting. non letters and repeating letters
SPEECHCOLOR for NPC's
X Equip / unequip items that mod skills.
X (Seem ok ) overly heavy iron ingots ?
X Check - listening equipped items.
prevent NUKE command target in pack.
x test poisoned horse dies while ridden.
x change mapresources causes critical error on resync
i_runebook
CanSee and CanSeeLOS triggers for items
change unreasonable timer max length to 90 days. was 2 hours !
ADD items directly into pack by targetting other item in pack.

---- 0.55d --------------------------------------------------------------------
---- * date unknown

X  tag.morep_1=<morep> works
X Check i_rune_book
remove MENU_ADMIN, replace with gump and FUNCTION
test output for scripts and logs should use the \r\n text mode. NotePad will work again.
SKILLDEF effects
	"DELAY_HI",
	"DELAY_LO",
	"EFFECT_HI",
	"EFFECT_LO",
missing SKILLMAKE=BLACKSMTIHING x.x for item 01b73 (i_shield_buckler) in sphereitemb5.scp
SPELL_Reactive_Armor = effect_Lo and Effect_Hi = random max percent reflected damage.
Crypt for 3.0.0

---- 0.55e --------------------------------------------------------------------
---- 21/03/2001

X Taste Id doesnt work at all it doesnt give a message period.	
burn vs. smelt. flame effect ?
X -npc speech color not working properly 
SEEMS OK = no kindling from trees -dagger on tree doesn't yield kindling "this is not a tree"   
SEEMS OK = Problem with resources on Multiple planes, not getting any? Problem in map file maybe?
X Polymorph not working  
SEEMS OK TO ME - When creating a t_script item, buying off a vendor, not to have the t_script attributes, 
	the TAGS do not appear to working through the ON=@CREATE .
X Need the @LOGIN @LOGOUT trigger
x Backgammon board has chess pieces  
X All drinkable potions create a gold coin in pack instead of empty bottle (probably script TDATA value).  
? CLIENT UPDATE BUG? - when u set an amount as a gm it doesnt set the whole stack-it leaves the original 1 and then gives u the diff in a different pile	
-NEED to do UPDATE now - couldnt .set flags statf_nightsight 
	-Setting colors of cchar objects is very strange, I would color my zorn, but no refeash commands would show me the color, when I mounted it, it turned the right color.	
- CANT CURSE self - curse, weaken, clumsy, feeblemind all consume regs but have no spell effect (no reduction of stats)  
new command SAYUA Color, Mode, Font, Lang, Text
- dices can roll a "0,0", "0,x", "x,0"
SKILLBEST or SKILLBEST.1 to get the best ranked skills
X unicode speech must add lost of "......" , or it will not be displayed.  "......." amount = unicode words amount - 2  
TEXT problem with new client versions 2.0.7 ?
Yawn anim ?
Fix items that should decay but lose timers.
Eval Int message
TRUE - Drink one potion, then drink a different one - second one drank overwrites the first potion's effect. (IE, poison yourself, drink agility - now agile, but no longer poisoned at all)(all potions, same thing)  
TRUE - Var.x=rand(nnn) doesn't save output of Random function (so a number since 0 to nnn-1) but it save the function.
	Should use Var.x = <eval rand(nnn)>  rand() only works bare if it's an 'if' or other known math function.
i_shield_wood shield made of only wood.

---- 0.55f --------------------------------------------------------------------
---- * date unknown

ARCHERYMINDIST=2
Repairs now require some of the components of the item.
Double fame when order pet to attack.
GM equipping item to NPC.
Stealing can fail
Stealing can get you caught.
-archer npcs AI three steps to fire 
X Shovel is destroyed really fast if you mine 

---- 0.55g --------------------------------------------------------------------
---- 29/03/2001

BUG - missing reags = success. ? 
LASTUSED for player chars. seconds
CHECK -Seems ok = released animals still follow their owner
CHECK -Seems OK- Spawns seems to be hovering around their spawn point and not moving
Meditation:  
[SKILL] all 0 to 100 percent.
DELAY=2.0,3.0 // per stroke.
EFFECT=0.0,100.0
ADV_RATE=10.0,200.0,800.0 = reveresd from old.
VALUES=
Bandage washing not working (it seems so anyway might have to wash them somewhere else)
NPC re-lighting torches a million times ?
Ingot smelting yield for one ore is 1.
x) If in war mode, summon a animal, you end up fighting yourself
Healing - you get two messages about applying bandages when you heal yourself/anyonelse  unequip on heal  healrates totally screwed up 100 heal 100 anat = crazy healing	
SECTOR.RAIN SECTOR.DRY weather transition problem.
MORE1l, MORE1h, MORE2l, MORE2h
remove "Rune to:" header
CAN'T FIND THIS- they don't count fists or daggers as a criminal offence, 
	thus getting the npc's to attack them and making the npc grey and free to kill.
CALL FOR GUARDS WORKS FOR ME - Just hit the blue npc or player one time in war mode. The aggressor WILL NOT
 be flagged criminal until the victim die. Or the aggressor can go in peace
 mode and let the blue attack. The blue will become grey to him and finally
 the aggressor will kill the blue and loot him without any problems. I tested
 it, it works. Some players seem to use this for kill any blues in town.
NOT ON SELF = curse, weaken, clumsy, feeblemind all consume regs but have no spell effect (no reduction of stats)

---- 0.55h --------------------------------------------------------------------
---- 04/04/2001

CHECK - OK - refresh potion
keys to houses going blank
3) Hatches on boats wont open?
4) No Keys for tents boxes (Fixed this problem by adding a sign to the multi)
TAGLIST for multi, script, account, cchar
x loot while hidden
player use bandages on self,-> get 2 messages
Stealing off corspses still works, should never be able to steal off a corpse
murderer and criminal titles capitalized.
the bug appears if the archery butte is linked to an item. if the item it is linked to is dclicked, the archery butte reacts as if itself had been dclicked.  (Same with pickpocket dips and training dummies and alot of other things).
With GM or PC, if you try to fill a keg with potion you get the you cannot use this yet message. I have a mortar and pestle. Tested at GM alchemy skill for both GM and PC.
In UO3D, if you log into an account that has no characters, you get a message
	that says "You already have 5 characters".  -- Fixed AD 3/31/2001.
Increased maximum item name length to 256.
The teleports in the map script, like entering dungeons should not allow NPC's to travel through them unless they are pets. This will keep monsters from harder levels roaming to easier levels.
CHECK - .sayua x,x,x,x,test -- Works, but was returning false, so it would say "Not a valid command or format"
It seem the off duty vendor brain act though it's just a vendor that has ran out of goods..
Party System reveals your account name (not password) to any person you ask to join.
CHECK - OK - 55g deletes all shrinked npcs on startup?
CHECK - OK - kills down by 1 each login ?
Can't attack things u can't see.
fix silly torch dupe AGAIN !

---- 0.55i --------------------------------------------------------------------
---- * date unknown

.ACCOUNT name ADD password changed to .ACCOUNT ADD name password
working tool tips
x A way to check if skill requirments when casting like IF (<SRC.CANMAKE>==i_arrow) something like that
x Poison needs to release a paralyzed person
x Item i_fire is being picked up by players when being created suring smelting
set color will not update imediately
5) Resources in Other Mapplanes like (1) and so on (MAP.SCP Attached)
6) Undefined Symbol error on region tags in housing.... Look at lines 4270 & 4263 in sphereitem_housing.scp

---- 0.55j --------------------------------------------------------------------
---- * date unknown

.55j
uid.x.name is broken
i_multi_house_wheat_cottage
UNICODE to UTF8 convert for LINUX
syntax error with "	if ((<morey><0) || (<morey>>1000))"
port +1000 for the accounts ?

REGIONRESOURCE replace AMOUNT_LO,AMOUNt_HI with AMOUNT=lo,hi
REGIONRESOURCE replace SKILL_LO,SKILL_HI with SKILL=lo,hi
REGIONRESOURCE add REAPAMOUNT = range of amount to find in 1 try.

---- 0.55 R1 ------------------------------------------------------------------
---- 14/11/2003

11-11-2003, Zorm
Fixed dye anything, now has to be a dye tub
Added checking to strings to prevent exploits
Candle dupe has been fixed
Layer_horse can no longer be picked up by players
Messages in message boards can no longer be picked up by players
Stats max on create character raised from 66 to 80, allows new prof.txt
Now checking colors for pants and shirt when creating a character
Added more checking to a players name when creating characters
Teleport effects should no longer harm players
Pets now clear all old owners when getting a new one
Fixed showing of hp to other players
Administrator account is no longer auto admin
If you attempt a command and can't use it it comes out as normal speech
death menu option is no longer sent
guild mates no longer give you a kill count/karma/fame when you kill them
speech support improved. If you send unicode text it is handled throughout as unicode
non unicode text is sent back out as unicode text

12-11-2003, Kell
- Added @CallGuards as a propper trigger, "return 1" cancels guards being called
- Changed @Logout so that "return 1" disallows instalogout.
- Added support for the following TAGs on characters:
  TAG.NAME.ALT (alternate name, good for incognito effects)
  TAG.NAME.PREFIX (alternate prefix, if not set, defaults to Notoriety prefix - lady/lord)
  TAG.NAME.SUFFIX (suffix for the name)
  Note that a space isn't added for prefix or suffix on purpose, to allow text to be
  glued to the name. You can add a space by using quotes, as in: TAG.NAME.SUFFIX="text "
- Using open door macro now triggers double click event.
- @DClick is now triggered on NPCs BEFORE attempting to mount, paperdoll or open
backpack ("return 1" cancels)
- If REAPAMOUNT isn't present, AMOUNT/3 will be used (it won't just default to 1).

13-11-2003, Kell
- Player characters with conjured flag get unmounted and the flag removed on death. Useful
to leave no corpse behind ( under ON=@Death : flags = <flags> | statf_conjured ). This would
be better as a server setting.
- Fixed spider webs remaining for days, and spider silk too (increased item count too much)

14-11-2003, Zorm
- Fixed client 1.26.x, it may now log on a 55i server
- Updated addbark, addbarkunicode, addbarkspeechtable to follow OSI better

---- 0.55 R2 ------------------------------------------------------------------
---- 27/11/2003

14-11-2003, Kell
- Fixed parsing of <<args>> or any other nested <var> btw. Also fixed parsing of numerical commands
  (skills) so that <7> actually works for accessing skill #7 (this didn't make it to .55R1).
- Fixed dumb log file being created out of place. Will still happen when Sphere is run as
  an NT service though.

15-11-2003, Zorm
- Added LOS check for taming
- Changed m_defense from BYTE to WORD, thus fixing the bug with AR > 255
- CanSeeLOS fixed, now checks if target object z is greater then myz + 14 if so blocks
- Kill count decay should be fixed
- Can no longer steal from trade windows or game boards
- ATTR_OWNED items may no longer be magic locked
- Added @DeathCorpse, argn1 = corpse?
- Trade window items are now dumped to back before corpse is made
- Now checks accounts when first sent
- Added @start in skilldefs
- Provoking players disabled

16-11-2003, Kell
- Identified problem regarding vanishing horses. Apparently, they stop acting as ridden, so instead
  of deleting them I will just try and restart their behaviour again. If this fails, they still
  shouldn't be deleted, and a new message should be printed out. To test, try creating a horse, mount
  and then worldsave.
- Made sure that ABORTED skills don't hand out experience for failure. Only those that actually fail do.
  ( this fixes lumberjacking / mining exploits ).
- Added support for TAG.NAME.HUE (name colour)
- Added @SkillSelect to character events, and @Select  to SKILLDEFs ("return 1" aborts).
- Added support for FORCHARS/FORITEMS/FOROBJS the correct way: SRC is retained and the default object
  within the FOR block is the object being looped through.
- Added @SkillSuccess to character events, and @Success to SKILLDEFs ("return 1" aborts).
- Changed @SkillStart so that "return 1" actually aborts the skill (same for @Start in SKILLDEFs).
- Changed @Login so that "return 1" disallows logging in.
- Added @UserSkills ("return 1" cancels the skill window being displayed).
- Added @UserStats  ( user requested stats update, return value is ignored )
- DBG: Added @SkillMakeItem to character events, triggered after the item has been created:
  "return 1" deletes the item
  "return 0" bounces the item as usual, but with no extra messages (potion, quality message)
  "return"   bounces the item as usual.

17-11-2003, Kell
- Hopefully fixed the bug with resyncing SPELL sections.
- Added triggers to SPELL sections, so you can now independently code spells:
  @Select ( "return 1" cancels, "return 0" skip checks, "return" default behaviour)
  @Start  ( "return 1" cancels )
  @Fail   ( "return 1" cancels the fizzle effect).
  @Success
- Changed SERV.LOG to allow writing of messages to the log. New syntax is:
  serv.log @enable   -- enables logging
  serv.log @disable  -- disable logging
  serv.log @toggle   -- toggles logging
  serv.log text      -- log text to console and file

18-11-2003, Zorm
- Fixed commands going to npcs, as well as more problems with unicode speech
  support - BROKEN
- CGTypedArray, SetCount, DestroyElements, crashes on shutdown. Needs more
  work to fix
- Fame gain fixed

18-11-2003, Kell
- Moved tags to CObjBase so all types of objects can have tags. Removed special
  handling of TAGs from characters, script items and multi items.
- Fixed problem when resycing SKILL sections (spheretables.scp) would mess up
  Skill_ defnames ( and the ACTION field on characters ). One no longer needs
  to use workarounds like my FIXACTION function. Memory corruption problems
  when resyncing SPELL tables should also be fixed.

18-11-2003, DarkStorm
- Started fixing some issues preventing sphere to compile on linux (CSocket.h)
- Managed to make it compile on Linux, comitted all the changes neccesary and
  made sure it still compiles on windows.
- Implemented some code changes to remove the ncurses dependency on linux and
  activated the console again. 
- Implemented Colors on the Linux Console

19-11-2003, DarkStorm
- Added MD5 Password support via MD5PASSWORDS=1 in sphere.ini. If you activate
  this, accounts will be saved with the password encoded (existing non-encoded
  password will be converted). WARNING: disabling it afterwards won't restore
  the passwords to plain text, and thus you won't be able to login with those
  accounts. Once enabled, and the accounts file saved this setting should not be
  changed (unless you set the passwords by hand).
- Removed the ScriptEngine Folder from the VC++6 project and wrapped an #if
  defined() around the three functions that used it. It seems unused in the
  productive gameserver, so i think we can remove the additional 400kb of
  possibly error prone code.
- Removed the ScriptEngine Folder from the VC++ 7 project too
- Changed the VC++ 6 projects to use the shared CRT. (It's shipped with windows
  since 95)
- Rewrote the new[], new, delete and delete[] operators and removed the memory
  footprinting. 
- Tuned the optimizations for VS.NET 2003 Release mode a bit.
- Removed the StatusReports from ntservice.cpp before it loads the ini for now
  Reporting as a service if you aren't a service isn't supposed to be happening,
  there needs to be a better fix than mine (maybe a -service argument?)
- added a check to CAccount to filter out accounts named "eof"
- fixed the help provided by .serv.accounts

19-11-2003, Kell
- Added a .DBG command, to put test code in. At the moment it'll be used to try
  and crash the server in various ways, to see how it behaves on Linux.

20-11-2003, Kell
- Added INTERRUPT=X,Y to SPELL sections in spheretable_x.scp. This controls
  the chance to fizzle a spell when hit in combat, at different Magery levels.
  Default is 100.0, 100.0 (always fizzle). With a setting of "100.0 50.0" a GM
  mage would only fizzle half the times.
- NPCs equipping stuff that is too heavy for them on @NPCRestock won't
  spit hundreds of errors to the console.
- Added LOSTNPCTELEPORT=X to sphere.ini. If X is greater than 0, NPCs that have
  a HOME point set will now teleport home if the distance to their HOME is above
  X. This fixes it when they go through portals, then get lost in the map.
- Fixed problem with mounted NPCs dying and leaving a lingering object which
  could leak later.
- FINALLY made it crash resistant under Linux - it is now trapping most
  signals AND launching exceptions correcly. Tested with a single thread
  (FREEZERESTARTTIME=0 in sphere.ini) and no background saving. More tests
  to come.
- Changed the loading procedure so sphere.ini is loaded prior to any message
  being printed to the log file. This allows the LOG= line to be parsed and
  log files to be created in the appropriate folder, so to make sure, LOG=
  line should be among the first in sphere.ini
- Changed the Linux makefile to include the necessary exception flags.
- "return 1" from a skill's @Start or @Success trigger doesn't trigger @Fail. If you
  do want @Fail triggered, set ACTION=-1. This is compatible with .55i scripts, because
  seeing as "return 1" didn't work there, scripts which did mean for @Fail to be triggered
  should already be using ACTION=-1

21-11-2003, Kell
- Linux version now works with secondary threads (FREEZERESTARTTIME not 0),
  and is able to restart the main loop if it freezes.
- Added a toggle to sphere.ini, "EXPERIMENTAL", to allow setting flags
  which enable several experimental features. You will see these referenced
  in the changelog as EF 0x????.
- EF 0x0001 enables a packet fix for Linux servers, for XCMD_Spy. Enable this
  if your clients get a login error.
- EF 0x0002 enables new UNICODE fixes.
- EF 0x0004 enables zorm CanSeeLOS fix. This is required, seeing as that fix
  won't allow you to cast uphill - a minor problem, but worth having a flag to
  toggle that behaviour.
- EF 0x0008 disables interruption of fight skills if the ACT changes. This
  fixes scripts that re-implement combat, and cases where combat with multiple
  enemies would break swings.
- EF 0x0010 enables the INTERRUPT field in SPELL sections. INTERRUPT=100.0 100.0
  SHOULD yield the standard always fail behaviour, as should not having an 
  INTERRUPT line at all. But seeing as this wasn't fully tested, you MUST enable
  this flag to make any use of the interrupt values.
- Suggested value for EXPERIMENTAL field in sphere.ini is:
  EXPERIMENTAL=013

22-11-2003, Kell
- LOSTNPCTELEPORT now checks for homedist, and won't teleport if the NPCs are still
  within home-distance. This allows you to have low values.
- Further stability fixes for Linux version, it should now work fine with background
  world saves.

22-11-2003, Zorm
- Added login crypt keys for clients up to 3.0.3, must add support for packets up to
  0xCC or atleast lengths.
- I think I fixed unicode speech now

22-11-2003, Kell
- Attempted to fix the bug where setting ACT in a @Hit trigger stops
  the swing, by restoring it after the trigger.
- Added SKIPDIFFICULTY (0 by default, or 1) to SKILL sections. Setting it to 1
  skips the hardcoded difficulty check and allows one to do their own skill difficulty
  checks in @Success, and "return 1" in there for a failure.
- Fixed @Select triggers which return 1 leaving the character waiting for an action.

23-11-2003, Zorm
- Experimental Precasting support, enable with experimental flag EF_Precast (flag 020),
  this is not well tested - it's a work in progress. Included here just for the sake of
  getting feedback.

24-11-2003, Kell
- SERV.SPELL(x).yyy, where x is the number of the spell and yyy is a key from the
  SPELLs section, such as MANAUSE or RESOURCES. You can also use RESCAST for a
  descriptive name of resources (much like RESMAKE works for items).
- SERV.SKILL(x).yyy, where x is the skill number and yyy is a key from the SKILLs
  section, such as KEY or TITLE.
- Experimented with breaking SKILL and SPELL sections to seperate files, loading them
  off-order and reloading, no problems found. Notice however that files containing
  SPELL sections must load after the base items (like spheretable_x does).

25-11-2003, Kell
- Changed it so NPCs with SPIRITSPEAK equal or above 100.0 are able to see dead players,
  like healers can. That allows one to use ON = @NPCSeeNewPlayer and an human brain to
  implement NPCs that interact with the dead, without having to put up with healer's
  default behaviour.
- Added flag NORESROBE to sphere.ini. If set to 1, players will not be given a robe
  when resurrected.

26-11-2003, Kell
- Changed SERV.SPELL and SERV.SKILL so that they accept either number or defname
  (SKILL also accepts plain names, like <SERV.SKILL(Magery).TITLE>)
- SERV.ITEMDEF(x).yyy to access data from ITEMDEF sections (similar to the above)
- SERV.CHARDEF(x).yyy to access data from CHARDEF sections (similar to the above)

27-11-2003, Kell
- On the brink of release, fixed a serious problem inherited from .55j where unknown
  keywords being evaluated would *silently* come out untouched. As an example,
  '<SERV.NONEXISTANT>' would silently come out as '<SERV.NONEXISTANT>' instead of ''
  as in .55i. If used with tags, it could end up getting weird values and make it hard
  to catch the error, as no error was being shown. It now returns '' for stuff it can't
  evaluate, BUT also prints an error in the console. I believe this is the best possible
  behaviour.
- Linux version is now declared stable. A minor problem still exists, in that pressing
  CTRL-C in the console is not a good way to terminate the server, and will very likely
  get it into a loop. This is a minor problem though, still trying to solve it. Test
  servers report uptimes of 2-3 days with 10-20 players online (that's all the testing
  I could do).
- Added CANMAKESKILL to test ONLY for the ability to make an item skillwise (it ONLY
  tests the SKILLMAKE line), not resources.
- Added "fval", which works exactly like "eval", but formats the output in x.x format.
- There seems to be an issue with skills that use @Success to cancel a skill, in that
  sometimes the skill won't be registered as finished, and using the skill again will
  show the "you must wait" message. Players can just double-tap TAB to overcome this,
  or you can use ACTION=-1 to force skill termination. Need some feedback on this, as
  this behaviour might actually be due to bad scripts, so feel free to post comments.
- Many issues with the default 

---- 0.55 R2a -----------------------------------------------------------------
---- 02/12/2003

30-11-2003, Zorm
- Fixed text going all uppercase sometimes and gm body commands.

01-12-2003, Kell
- Added @EquipTest and @ItemEquipTest (return 1 cancels equiping).
- Changed @SkillItemMake so that "return 1" only deletes the item if it's container hasn't
  been set.
- Fixed bug with skills apparently not finishing (also fixes cartography).
- Fixed summoning bug (Linux only). This has to do with doing propper memory initialization
  prior to using points.
- Removed all specific handling for SERV.xxx(y).zzz and made it generic. You can now use
  either syntax: SERV.xxx(y).zzz or SERV.xxx.y.zzz.
- Changed default release options for speed optimization.

02-12-2003, Kell
- Fixed REAPAMOUNT / AMOUNT. It can now take multi-point values in a format similar to
  ADVANCE for skills.
- Added SPEECHSELF= to sphere.ini, to allow setting the name of the speech trigger that
  should be called to intercept player speech. Suggested: SPEECHSELF=spk_player
  "return 1" in said trigger stops the player from actually talking.
- Removed hard coded "home home home" - one can just use the default spk_player speech if
  that feature is desired (but mostly it's not)
- Added SPEECHPET= to sphere.ini, to allow setting the name of the speech trigger that
  is called when a pet listens to its master. "return 1" in said trigger stops the pet
  from listenning.

---- 0.55 R3 rc1 --------------------------------------------------------------
---- 08/01/2004

09-12-2003
- Added TAGs to CHARDEF/ITEMDEF sections. If a TAG does exists at an instance it overrides
  the def value.

10-12-2003, Kell
- Added OptionFlags to sphere.ini, to set multiple options. These will be named OF_
- Added OF_Magic_IgnoreAR = 0001, so that AR doesn't count to stop damage spells.
- Added ACTDIFF to characters to obtain the current action difficulty.
  Suggestion: One can use ACTDIFF to modify difficulty within skill Start triggers.
- Added a 6th parameter to the EFFECT command, the hue for the effect.
- Added @Effect trigger to spells, triggered after @SpellEffect
- <TAG0.xxx> can now be used to assume "0" as the default value for a tag.
- TAG0.xxx = yyy can now be used, if yyy is 0, then no tag will be recorded (same as setting
  to a zero length string)
  Using TAG0, you can thus have tags that are only recorded if they are not 0. This is great
  for tags that are usually 0 and are often used (e.g. tags that must exist on all characters).
- Added VAR0 (same functionality as TAG0, but for VAR).

11-12-2003, Kell
- Added OF_Magic_CanHarmSelf = 0002, so that spells with SPELLFLAG_HARM will still affect the
  caster (useful for SPELLEFFECT in scripts)
- Changed rand(x) to allow a 2nd parameter rand(x,y) and return a random number between x and y,
  if y is present.

12-12-2003, Kell
- You can now use @color,font in SYSMESSAGE and MESSAGE. font ranges from 0 to 9, and I quote:
      FONT_BOLD,	// 0 - Bold Text = Large plain filled block letters.
      FONT_SHAD,	// 1 - Text with shadow = small gray
      FONT_BOLD_SHAD,	// 2 - Bold+Shadow = Large Gray block letters.
      FONT_NORMAL,	// 3 - Normal (default) = Filled block letters.
      FONT_GOTH,	// 4 - Gothic = Very large blue letters.
      FONT_ITAL,	// 5 - Italic Script
      FONT_SM_DARK,	// 6 - Small Dark Letters = small Blue
      FONT_COLOR,	// 7 - Colorful Font (Buggy?) = small Gray (hazy)
      FONT_RUNE,	// 8 - Rune font (Only use capital letters with this!)
      FONT_SM_LITE,	// 9 - Small Light Letters = small roman gray font.
- Changed SKILLMAKE to allow getting an individual resource in the list. SKILLMAKE.1 gets the first,
  SKILLMAKE.1.VAL gets the value and SKILLMAKE.1.KEY gets the associated resource key.

13-12-2003, Kell
- Added "RELEASE" to character verbs, does the same as "release" when spoke to a pet.
- Added @NPCFollow trigger, called when an NPC is following someone.

14-12-2003, Kell
- Changed ATTACK to accept as parameter the UID of the character to attack.
- Changed TRY to make no plevel or touch/distance checks. Use TRYP if you want those checks
  (TRYP 0 only checks for touch/distance, not plevel).
- Added an useful keyword to scripts, that allows one to use "OBJ" as pointer to an item. It's
  similar to ACT but it can be used anywhere. 
  Example:
     OBJ	= <UID>
     SAY You are <OBJ.NAME>, with uid <OBJ.UID>.
- Changed MEMORY to allow an UID as parameter, so you can now find the memory related to a specific
  UID. If no argument is used, it uses SRC's UID as usual. Also changed it to be read/write.
  Example:
     MEMORY <SRC.UID> 0200	// set memory 
     SAY Memory flag regarding <UID> is <MEMORY.<SRC.UID>>.

15-12-2003, Kell
- Changed @UserSkills so that <argn1> is the number of the skill being updated, or -1 for the skill
  list. This allows one to stop sending of skill updates to the client.
- NPCs will not say "Yes Master" if SPEECHPET is set in sphere.ini (you can script it in the speech
  triggers if you want them to). If SPEECHPET isn't set, they still won't say anything unless they
  can see their master (which is great for GMs). Players will no longer respond "Sorry".
- Resource gathering was changed so that the SKILLMAKE of the resource item is checked. Resources
  which fail the canmake check are ignored and aren't part of the randomization process. If for some
  reason one wants to go back to the old style, just comment SKILLMAKE on the ore itemdefs.
- Added OF_Skill_DiffFirst = 0008. With this flag turned on, difficulty for a skill is calculated BEFORE
  calling @Start/@SkillStart. This has the advantage of allowing the difficulty for a skill to be changed
  via ACTDIFF within that trigger. Notice that for a skill to fail, ACTDIFF must be set above the current
  (modified) skill. Setting ACTDIFF to a negative value means that the skill will abort, that is, @Fail
  will not be called and no skill gain will be attempted. To always fail set ACTDIFF to a value above the
  possible skill (say, 1001).
  This has the sideffect of calling @SpellCast before @Start/@SkillStart. On the other hand, it is the
  ultimate tool for implementing your own skill difficulties.
  Here's an example of making the difficulty for arms lore AT LEAST the same value as for making the item
  (using the primary skill). Characters with skill above ACTDIFF will always succeed.
  ON = @Start
   if ( <SRC.ACTDIFF> < <SRC.ACT.SKILLMAKE.1.VAL> )
      SRC.ACTDIFF	= <SRC.ACT.SKILLMAKE.1.VAL>
   endif

16-12-2003, Kell
- You can now use NEWITEM, NEWNPC and NEWDUPE in item scripts, the items will be created into "NEW". Using
  these commands on a character will create the items in both NEW and ACT. If you want to use these
  on a character without changing ACT, use SERV.NEWITEM, etc.
  Example:
    NEWITEM i_gold
    NEW.AMOUNT 100
    NEW.P	= <TOPOBJ.P>
  You can also use NEW as a temporary handler, much like you can use OBJ (and to an extenct, ACT).

17-12-2003, Kell
- Functions can now receive "args" when being evaluated, as in <SRC.myfunction Say hello>
- Added RANGE=min,max or RANGE=max (min defaults to 0) for ITEMDEF and CHARDEF. Default weapon range
  is 1. Default character range is 1. Range is calculated as (character + weapon -1). 
  Example: Assuming all characters are RANGE=1 (which they are), putting RANGE=2 in an halberd
  means characters equipping it can hit 1 square further.

18-12-2003, Kell
- The main section for DIALOGs is now fully interpreted like other scripts, allowing you to add logic
  to your dialog, use IFs, etc. The only limitation at the moment is that gump commands are only 
  allowed right in the DIALOG section, and not within FUNCTIONs, but hei... it's better. :)
- Dialogs will no longer conflict with each other, this allows for permanent on-screen dialogs. INPDLG
  works too, seeing as there can be only one INPDLG window onscreen at all times.
- Added RESOURCES.n, RESOURCES.n.KEY and RESOURCES.n.VAL to items/characters.

19-12-2003, Kell
- To make writing dialogs easier, added a cursor and relative coordinates:
     dorigin 50 50	// sets the origin to x=50, y=50
  Using "*" near a coordinate makes it relative to the origin, and displaces the origin by some amount:
     dtext     *0    *10    0    the origin is now x=50 y=60, so is the last location
  Using "+" near a coordinate makes it relative to the last location w/o changing the origin.
     dtext     +10     -    0    adds 10 to X (y=150, o.y=100)
  As an example, imagine writing a list of text with 3 columns, each seperated via 200 x and 20 space
  between each row:
  dorigin 10 10
  // first row
  dtext     *0   -    5   1:
    dtext  +10   -    0   the text for row1, col1
  dtext   *200   -    5   2:		// x orig = 200
    dtext  +10   -    0   the text for row1, col2
  dtext   *200   -    5   3:		// x orig = 400
    dtext  +10   -    0   the text for row1, col2

  And now one only has to go down one row. and the text is quite similar. This isn't too easy to explain, it's
  there for whomever might find it useful. If you can't think of a use for it, just ignore it. ;)
- Fixed the bug with FORCHARS/ITEMS/OBJS and keywords starting with "FOR" (like FORensics).
- Changed textadd and gumptext to collapse equal strings of text to the same index. So if you use
    gumptext 10 20  This is an example.
    gumptext 10 40  This is an example.
    gumptext 10 60  This is an example.
  It will only generate ONE text id. This does away with the need to have a seperate TEXT section. Granted,
  such a section is still useful for keeping strings all in one place (in this case it'd be useful), but it
  is no longer mandatory, it becomes simply a matter of style/choice.

20-12-2003, Kell
- Equal PLEVEL should be able to see each other, so they are now.
- You can now open a dialog in a specific page, with DIALOG  d_dialog_name  pagenumber. This isn't actually
  possible with the UO client - what it does is recalculate the dialog page/button numbers so that the selected
  page is first. It's completly invisible though, and works perfectly.
- Added a new command - DTEXT - to gumps, which does the handling of text ids for you (d stands for dynamic):
     dtext x y color  Actual text comes here.
  Text added with gumptext is actually added to the [DIALOG ... TEXT] section. If you're only using a given
  text string once, then it's actually faster using this than using "text" and adding it to the TEXT section
  of the dialog. Simmilar commands, DCROPPEDTEXT and DTEXTENTRY are also in, also taking text instead of an
  index. DHTMLGUMP is also in, but notice that the syntax is like HTMLGUMP, except that you ommit the ID and add
  the text in the end.
  With these changes, you can completly ommit the [DIALOG ... TEXT] section of dialogs. Only those strings
  that are commonly used throughout the dialog should you put in the [DIALOG ... TEXT] section.
  Internally, both gumptext and textadd simply add stuff to the dialog as needed, and send normal "text"
  commands to the client, so they're safe to use. But they free you from having to keep track of a LONG
  list of numbers, and allow you to shape and modify your dialog w/o bothering with text ids.
- You can now use FUNCTIONs that issue gump commands. So you actually make your own gump commands!!! Death to
  copy & paste dialogs!

21-12-2003, Kell
- Fixed a bug in that setting stats & skills via scripts wouldn't correctly parse things. For instance, numerical
  expressions.
- Started work on MANUAL.TXT, to detail the current state of things like triggers and their arguments, seeing as
  reading this changelog is probably a difficult task for a lot of people.
- Changed args in functions to be writeable. This is useful in scripts, but for triggers, the server will read
  back the values and use the new ones wherever it makes sense. For the time being, these triggers were
  changed:
     @GetHit, ARGN1 is the damage being apllied, ARGN2 the damage type (as usual, but now writeable). 
     @Hit, ARGN1 is now the raw damage being applied, prior to armour (writeable). ARGO is the weapon (if any).
     @PersonalSpace, ARGN1 is the stamina required to move (writeable). "return 1" stops the movement, "return 0"
     allows the movement but shows none of the hard-coded messages. Plain "return" or no return, works as standard.
  @Hit, @HitTry and @HitMiss were also changed so that ARGO is the weapon being used (handy so you don't have to
  be looking at layers n stuff).
  I should add that ACTDIFF is also available, and it can be used to change the difficulty of a skill, even make
  a skill succedd that would otherwise fail (by setting it to 0). It can also be used in @HitTry now, and if
  set to any non-negative value, a missing hit will instead succeed.
- Added StrEat function, which removes a word up to the space, from a string (<streat("hello there friend")>
  or <streat hello there friend> return "there friend")
- Added <SERV.LOOKUPSKILL skill name> which returns the skill number for some text or -1 if not found.
- After some beta-testing, a few fixes to dialogs.
- LOCAL.xxx within functions for LOCAL . They're a bit more efficient on servers with lots of global
  vars due to faster lookups ). LOCAL variables always come up initially as "0".
- ARGN1, ARGN2 and ARGN3 are set for functions with numeric arguments. So whenever possible, use these instead
  of argv. Example: "myfunction  123 50 89" - these 3 values will be parsed into argn1, argn2 and argn3

22-12-2003, Kell
- Functions can now return strings using "return". Notice that this behaves like TAGs, in that if you do
     return 2+2
  then "2+2" is returned, and not "4". You'll have to explicitly call "eval" on what you want
  to return:
     return <eval (2+2)>
  Returning strings causes no extra lag, seeing as the old method of returning a value relied on the same
  string which is returned (EVALed). So it is actually faster (although hardly noticeable).
  This might pose a problem problem if you have "return rand" or similar, instead of "return <eval rand..."
  seeing as multiple uses of the return value re-evaluate it, generating a new random number - again,
  similar to TAGs.
  MAKE SURE YOU HAVE "EVAL" on your "return" lines, wherever you want the result of a calculation to be
  returned. The next version will probably not have an EF_ReturnString flag.

- Modified the profiling function to keep track of average consumption over time. The average time is
  calculated each second as 90% of the previous average time plus 10% the current time. This poses some
  resistence to spikes. 
- Added a new keyword to @Create / @NPCRestock and template scripts: FULLINTERP. Set FULLINTERP=1 to allow the
  use of functions, ifs, etc. Example:
  ON = @NPCRestock
     ITEM=i_cape
     FULLINTERP
        ITEM=i_robe
        MY_FUNCTION_CALL
  You can use FULLINTERP 0 to disable the feature, after you've enabled it, but it's usually pointless, seeing as
  this FULLINTERP affects only the remainder of the current script. Bear in mind that the usual restrictions apply,
  seeing as the created NPC is not ingame yet.

23-12-2003, Kell
- Added access to TERRAIN and STATICS either via P.key, MOREP.key or SERV.MAP(x,y).key, with key being one of:
    TERRAIN	The terrain ID
    ISDIRT	Checks the terrain ID to see if it's dirt.
    ISGRASS	guess
    ISROCK	dunno
    ISWATER	guess again
    STATICS	Number of statics in the position
    STATICS(n)	ID of static Nth static ( eg: <SERV.MAP(200,300).STATICS(0)>. Shows no error in the console
		if static isn't present, returning 0 - useful to test for a static w/o counting or looping.
    STATICS.n	  same
    STATICS(n).key	Get a key from the appropriate ITEMDEF. eg: <SERV.MAP(200,300).STATICS(0).NAME>

- Added basic iterator construct, WHILE, with the following syntax:
     WHILE ( condition )
	// do stuff, current iteration number in <LOCAL._WHILE>
     END // or ENDWHILE

  also added FOR, terminated with either END or ENDFOR, with the following syntax:

     FOR 5	// loops from 0 to 5, current iteration number in LOCAL._FOR
  or FOR 3 5	// loops from 3 to 5, current iteration number in LOCAL._FOR
  or FOR K 5	// loops from 0 to 5, current iteration number in LOCAL.K
  or FOR K 3 5	// loops from 3 to 5, current iteration number in LOCAL.K
	// do stuff
     END  // or ENDFOR

  Changing these LOCAL variables has no effect on the loop.
- Wrote a small assembly function to access the high resolution timer. Works for both windows and Linux,
  now being used in profiling. Profiling works on Linux now. It also looks a lot better in the console
  thanks to the monospaced font.
- Changed the console font under Windows to Courier, which is monospaced, so things come out aligned in
  the console. Under Linux, the console is naturally monospaced.
- You can now add new SKILL sections, up to 70. SERV.MAXSKILL tells you how many skills are loaded. Notice
  that they won't be sent to the client though, the client doesn't support them (hint: @UserSkills). There
  is also a FLAGS key for SKILL section, with the following values:
     [DEFNAME skill_defs]
     SKF_SCRIPTED	01	// no hardcoded behaviour, only triggers are called.
     // feel free to add new tags you find useful, but only above 01000 please, to make room for future
     expansion
  This is heavily experimental, mess with it at your own risk.
- SKILLSELECT skill - force a button select event on the skill list

24-12-2003, Kell
- Fixed TYPEDEFS section in spherefs.scp loosing values when resynced.
- Added <CANMOVE dir>, takes a direction as argument (like WALK), returns the area ID we're moving to,
  or 0 if no move is possible.
- Added <MOVE dir>, takes a direction as argument (like WALK), returns the TILE flags for that position.
  Notice that flag 04 is walkable. Here's a list of flags, you can copy&paste it into spheredefs.scp. This
  keyword might change in the future.


[DEFNAME tile_flags]			// by Shadowlord
tilef_background	01		// No idea. None whatsoever. Maybe it's the blackness.
tilef_weapon		02		// I smack thee with this here ... club?
tilef_transparent	04		// Yeah. So we can see through it?
tilef_translucent	08		// Okay...
tilef_wall		010		// Hey look, we can't walk through it!
tilef_damaging		020		// Lava, perhaps? Fires, hmm!
tilef_impassable	040		// Mountains and stuff, I'll wager.
tilef_wet		080		// Water? Or mud? Or a slick road in a rainstorm? Probably the first.
tilef_unknown		0100		// Uh...
tilef_surface		0200		// Tables or something?
tilef_bridge		0400		// I wonder why they'd have a flag for that.
tilef_stackable		0800	
tilef_window		01000		// So we can see/shoot out?
tilef_noshoot		02000		// ? We can't shoot out or something? So, like a glass window maybe?
tilef_prefixA		04000		// A card
tilef_prefixAn		08000		// An apple
tilef_internal		010000		// hair, beards, etc
tilef_foliage		020000		// Probably bushes and tree leaves and stuff.
tilef_partialHue	040000		// semi-glowy?
tilef_unknown_1		080000		// Well, gee. I should see if it's used on anything...
tilef_map		0100000		// Sounds good to me.
tilef_container		0200000		// They flag these!?
tilef_wearable		0400000		// Omigod!
tilef_lightSource	0800000		// I'm getting tired of typing repetitive shiznit now.
tilef_animated		01000000	// Like fire again. And stuff. Those spinny propeller thingies!
tilef_noDiagonal	02000000	// !?!???!!?
tilef_unknown_2		04000000	// I really hope some of these unknowns are n/w/s/e facing flags.
tilef_armor		08000000	// Armor, okay, so does that count shields? Hmmm?
tilef_roof		010000000	// "Don't fall through me!" Or why isn't it just flagged surface or something?
tilef_door		020000000	// Okay...
tilef_stairBack		040000000	// Don't we have stairs that go forward or left too? This could cover both...
tilef_stairRight	080000000	// Well, whatever, you can climb them, so, hey... Good use for a 

NOTE :	EF flags change from version to version, so make SURE you're using only the EF
	flags you want, if any.

SUMMARY of flags for Sphere.ini:
OptionFlags=	// Flags for options that affect server behaviour but not compatibility
	0001		// OF_Magic_IgnoreAR
	0002		// OF_Magic_CanHarmSelf
	0004		// OF_Magic_StackStats			(Do NOT set this yet)
	0008		// OF_Skill_DiffFirst
	0010		// OF_Archery_CanMove
	0020		// OF_Magic_PreCast

Experimental=	// Flags for options that affect server behaviour and which might affect compatibility
	0001		// EF_XCMD_Spy
	0002		// EF_UNICODE
	0004		// EF_CanSeeLOS
	0008		// EF_ReturnString
	Suggested value: EXPERIMENTAL=01

01-12-2003, Kell
- Added @EquipTest and @ItemEquipTest (return 1 cancels equiping).
- Changed @SkillItemMake so that "return 1" only deletes the item if it's container hasn't
  been set.
- Fixed bug with skills apparently not finishing (also fixes cartography).
- Fixed summoning bug (Linux only). This has to do with doing propper memory initialization
  prior to using points.
- Removed all specific handling for SERV.xxx(y).zzz and made it generic. You can now use
  either syntax: SERV.xxx(y).zzz or SERV.xxx.y.zzz.
- Changed default release options for speed optimization.

02-12-2003, Kell
- Fixed REAPAMOUNT / AMOUNT. It can now take multi-point values in a format similar to
  ADVANCE for skills.
- Added SPEECHSELF= to sphere.ini, to allow setting the name of the speech trigger that
  should be called to intercept player speech. Suggested: SPEECHSELF=spk_player
  "return 1" in said trigger stops the player from actually talking.
- Removed hard coded "home home home" - one can just use the default spk_player speech if
  that feature is desired (but mostly it's not)
- Added SPEECHPET= to sphere.ini, to allow setting the name of the speech trigger that
  is called when a pet listens to its master. "return 1" in said trigger stops the pet
  from listenning.

09-12-2003
- Added TAGs to CHARDEF/ITEMDEF sections. If a TAG does exists at an instance it overrides
  the def value.

10-12-2003, Kell
- Added OptionFlags to sphere.ini, to set multiple options. These will be named OF_
- Added OF_Magic_IgnoreAR = 0001, so that AR doesn't count to stop damage spells.
- Added ACTDIFF to characters to obtain the current action difficulty.
  Suggestion: One can use ACTDIFF to modify difficulty within skill Start triggers.
- Added @Effect trigger to spells, triggered after @SpellEffect
- <TAG0.xxx> can now be used to assume "0" as the default value for a tag.
- TAG0.xxx = yyy can now be used, if yyy is 0, then no tag will be recorded (same as setting
  to a zero length string)
  Using TAG0, you can thus have tags that are only recorded if they are not 0. This is great
  for tags that are usually 0 and are often used (e.g. tags that must exist on all characters).
- Added VAR0 (same functionality as TAG0, but for VAR).

11-12-2003, Kell
- Added OF_Magic_CanHarmSelf = 0002, so that spells with SPELLFLAG_HARM will still affect the
  caster (useful for SPELLEFFECT in scripts)
- Changed rand(x) to allow a 2nd parameter rand(x,y) and return a random number between x and y,
  if y is present.

12-12-2003, Kell
- You can now use @color,font in SYSMESSAGE and MESSAGE. font ranges from 0 to 9, and I quote:
      FONT_BOLD,	// 0 - Bold Text = Large plain filled block letters.
      FONT_SHAD,	// 1 - Text with shadow = small gray
      FONT_BOLD_SHAD,	// 2 - Bold+Shadow = Large Gray block letters.
      FONT_NORMAL,	// 3 - Normal (default) = Filled block letters.
      FONT_GOTH,	// 4 - Gothic = Very large blue letters.
      FONT_ITAL,	// 5 - Italic Script
      FONT_SM_DARK,	// 6 - Small Dark Letters = small Blue
      FONT_COLOR,	// 7 - Colorful Font (Buggy?) = small Gray (hazy)
      FONT_RUNE,	// 8 - Rune font (Only use capital letters with this!)
      FONT_SM_LITE,	// 9 - Small Light Letters = small roman gray font.
- Changed SKILLMAKE to allow getting an individual resource in the list. SKILLMAKE.1 gets the first,
  SKILLMAKE.1.VAL gets the value and SKILLMAKE.1.KEY gets the associated resource key.

13-12-2003, Kell
- Added "RELEASE" to character verbs, does the same as "release" when spoke to a pet.
- Added @NPCFollow trigger, called when an NPC is following someone.

14-12-2003, Kell
- Changed ATTACK to accept as parameter the UID of the character to attack.
- Changed TRY to make no plevel or touch/distance checks. Use TRYP if you want those checks
  (TRYP 0 only checks for touch/distance, not plevel).
- Added an useful keyword to scripts, that allows one to use "OBJ" as pointer to an item. It's
  similar to ACT but it can be used anywhere. 
  Example:
     OBJ	= <UID>
     SAY You are <OBJ.NAME>, with uid <OBJ.UID>.
- Changed MEMORY to allow an UID as parameter, so you can now find the memory related to a specific
  UID. If no argument is used, it uses SRC's UID as usual. Also changed it to be read/write.
  Example:
     MEMORY <SRC.UID> 0200	// set memory 
     SAY Memory flag regarding <UID> is <MEMORY.<SRC.UID>>.

15-12-2003, Kell
- Changed @UserSkills so that <argn1> is the number of the skill being updated, or -1 for the skill
  list. This allows one to stop sending of skill updates to the client.
- NPCs will not say "Yes Master" if SPEECHPET is set in sphere.ini (you can script it in the speech
  triggers if you want them to). If SPEECHPET isn't set, they still won't say anything unless they
  can see their master (which is great for GMs). Players will no longer respond "Sorry".
- Resource gathering was changed so that the SKILLMAKE of the resource item is checked. Resources
  which fail the canmake check are ignored and aren't part of the randomization process. If for some
  reason one wants to go back to the old style, just comment SKILLMAKE on the ore itemdefs.
- Added OF_Skill_DiffFirst = 0008. With this flag turned on, difficulty for a skill is calculated BEFORE
  calling @Start/@SkillStart. This has the advantage of allowing the difficulty for a skill to be changed
  via ACTDIFF within that trigger. Notice that for a skill to fail, ACTDIFF must be set above the current
  (modified) skill. Setting ACTDIFF to a negative value means that the skill will abort, that is, @Fail
  will not be called and no skill gain will be attempted. To always fail set ACTDIFF to a value above the
  possible skill (say, 1001).
  This has the sideffect of calling @SpellCast before @Start/@SkillStart. On the other hand, it is the
  ultimate tool for implementing your own skill difficulties.
  Here's an example of making the difficulty for arms lore AT LEAST the same value as for making the item
  (using the primary skill). Characters with skill above ACTDIFF will always succeed.
  ON = @Start
   if ( <SRC.ACTDIFF> < <SRC.ACT.SKILLMAKE.1.VAL> )
      SRC.ACTDIFF	= <SRC.ACT.SKILLMAKE.1.VAL>
   endif

16-12-2003, Kell
- You can now use NEWITEM, NEWNPC and NEWDUPE in item scripts, the items will be created into "NEW". Using
  these commands on a character will create the items in both NEW and ACT. If you want to use these
  on a character without changing ACT, use SERV.NEWITEM, etc.
  Example:
    NEWITEM i_gold
    NEW.AMOUNT 100
    NEW.P	= <TOPOBJ.P>
  You can also use NEW as a temporary handler, much like you can use OBJ (and to an extenct, ACT).

17-12-2003, Kell
- Functions can now receive "args" when being evaluated, as in <SRC.myfunction Say hello>
- Added RANGE=min,max or RANGE=max (min defaults to 0) for ITEMDEF and CHARDEF. Default weapon range
  is 1. Default character range is 1. Range is calculated as (character + weapon -1). 
  Example: Assuming all characters are RANGE=1 (which they are), putting RANGE=2 in an halberd
  means characters equipping it can hit 1 square further.

18-12-2003, Kell
- The main section for DIALOGs is now fully interpreted like other scripts, allowing you to add logic
  to your dialog, use IFs, etc. The only limitation at the moment is that gump commands are only 
  allowed right in the DIALOG section, and not within FUNCTIONs, but hei... it's better. :)
- Dialogs will no longer conflict with each other, this allows for permanent on-screen dialogs. INPDLG
  works too, seeing as there can be only one INPDLG window onscreen at all times.
- Added RESOURCES.n, RESOURCES.n.KEY and RESOURCES.n.VAL to items/characters.

19-12-2003, Kell
- To make writing dialogs easier, added a cursor and relative coordinates:
     dorigin 50 50	// sets the origin to x=50, y=50
  Using "*" near a coordinate makes it relative to the origin, and displaces the origin by some amount:
     dtext     *0    *10    0    the origin is now x=50 y=60, so is the last location
  Using "+" near a coordinate makes it relative to the last location w/o changing the origin.
     dtext     +10     -    0    adds 10 to X (y=150, o.y=100)
  As an example, imagine writing a list of text with 3 columns, each seperated via 200 x and 20 space
  between each row:
  dorigin 10 10
  // first row
  dtext     *0   -    5   1:
    dtext  +10   -    0   the text for row1, col1
  dtext   *200   -    5   2:		// x orig = 200
    dtext  +10   -    0   the text for row1, col2
  dtext   *200   -    5   3:		// x orig = 400
    dtext  +10   -    0   the text for row1, col2

  And now one only has to go down one row. and the text is quite similar. This isn't too easy to explain, it's
  there for whomever might find it useful. If you can't think of a use for it, just ignore it. ;)
- Fixed the bug with FORCHARS/ITEMS/OBJS and keywords starting with "FOR" (like FORensics).
- Changed textadd and gumptext to collapse equal strings of text to the same index. So if you use
    gumptext 10 20  This is an example.
    gumptext 10 40  This is an example.
    gumptext 10 60  This is an example.
  It will only generate ONE text id. This does away with the need to have a seperate TEXT section. Granted,
  such a section is still useful for keeping strings all in one place (in this case it'd be useful), but it
  is no longer mandatory, it becomes simply a matter of style/choice.

20-12-2003, Kell
- Equal PLEVEL should be able to see each other, so they are now.
- You can now open a dialog in a specific page, with DIALOG  d_dialog_name  pagenumber. This isn't actually
  possible with the UO client - what it does is recalculate the dialog page/button numbers so that the selected
  page is first. It's completly invisible though, and works perfectly.
- Added a new command - DTEXT - to gumps, which does the handling of text ids for you (d stands for dynamic):
     dtext x y color  Actual text comes here.
  Text added with gumptext is actually added to the [DIALOG ... TEXT] section. If you're only using a given
  text string once, then it's actually faster using this than using "text" and adding it to the TEXT section
  of the dialog. Simmilar commands, DCROPPEDTEXT and DTEXTENTRY are also in, also taking text instead of an
  index. DHTMLGUMP is also in, but notice that the syntax is like HTMLGUMP, except that you ommit the ID and add
  the text in the end.
  With these changes, you can completly ommit the [DIALOG ... TEXT] section of dialogs. Only those strings
  that are commonly used throughout the dialog should you put in the [DIALOG ... TEXT] section.
  Internally, both gumptext and textadd simply add stuff to the dialog as needed, and send normal "text"
  commands to the client, so they're safe to use. But they free you from having to keep track of a LONG
  list of numbers, and allow you to shape and modify your dialog w/o bothering with text ids.
- You can now use FUNCTIONs that issue gump commands. So you actually make your own gump commands!!! Death to
  copy & paste dialogs!

21-12-2003, Kell
- Fixed a bug in that setting stats & skills via scripts wouldn't correctly parse things. For instance, numerical
  expressions.
- Started work on MANUAL.TXT, to detail the current state of things like triggers and their arguments, seeing as
  reading this changelog is probably a difficult task for a lot of people.
- Changed args in functions to be writeable. This is useful in scripts, but for triggers, the server will read
  back the values and use the new ones wherever it makes sense. For the time being, these triggers were
  changed:
     @GetHit, ARGN1 is the damage being apllied, ARGN2 the damage type (as usual, but now writeable). 
     @Hit, ARGN1 is now the raw damage being applied, prior to armour (writeable). ARGO is the weapon (if any).
     @PersonalSpace, ARGN1 is the stamina required to move (writeable). "return 1" stops the movement, "return 0"
     allows the movement but shows none of the hard-coded messages. Plain "return" or no return, works as standard.
  @Hit, @HitTry and @HitMiss were also changed so that ARGO is the weapon being used (handy so you don't have to
  be looking at layers n stuff).
  I should add that ACTDIFF is also available, and it can be used to change the difficulty of a skill, even make
  a skill succedd that would otherwise fail (by setting it to 0). It can also be used in @HitTry now, and if
  set to any non-negative value, a missing hit will instead succeed.
- Added StrEat function, which removes a word up to the space, from a string (<streat("hello there friend")>
  or <streat hello there friend> return "there friend")
- Added <SERV.LOOKUPSKILL skill name> which returns the skill number for some text or -1 if not found.
- After some beta-testing, a few fixes to dialogs.
- LOCAL.xxx within functions for LOCAL . They're a bit more efficient on servers with lots of global
  vars due to faster lookups ). LOCAL variables always come up initially as "0".
- ARGN1, ARGN2 and ARGN3 are set for functions with numeric arguments. So whenever possible, use these instead
  of argv. Example: "myfunction  123 50 89" - these 3 values will be parsed into argn1, argn2 and argn3

22-12-2003, Kell
- Functions can now return strings using "return". Notice that this behaves like TAGs, in that if you do
     return 2+2
  then "2+2" is returned, and not "4". You'll have to explicitly call "eval" on what you want
  to return:
     return <eval (2+2)>
  Returning strings causes no extra lag, seeing as the old method of returning a value relied on the same
  string which is returned (EVALed). So it is actually faster (although hardly noticeable).
  This might pose a problem problem if you have "return rand" or similar, instead of "return <eval rand..."
  seeing as multiple uses of the return value re-evaluate it, generating a new random number - again,
  similar to TAGs.
  MAKE SURE YOU HAVE "EVAL" on your "return" lines, wherever you want the result of a calculation to be
  returned. The next version will probably not have an EF_ReturnString flag.

- Modified the profiling function to keep track of average consumption over time. The average time is
  calculated each second as 90% of the previous average time plus 10% the current time. This poses some
  resistence to spikes. 
- Added a new keyword to @Create / @NPCRestock and template scripts: FULLINTERP. Set FULLINTERP=1 to allow the
  use of functions, ifs, etc. Example:
  ON = @NPCRestock
     ITEM=i_cape
     FULLINTERP
        ITEM=i_robe
        MY_FUNCTION_CALL
  You can use FULLINTERP 0 to disable the feature, after you've enabled it, but it's usually pointless, seeing as
  this FULLINTERP affects only the remainder of the current script. Bear in mind that the usual restrictions apply,
  seeing as the created NPC is not ingame yet.

23-12-2003, Kell
- Added access to TERRAIN and STATICS either via P.key, MOREP.key or SERV.MAP(x,y).key, with key being one of:
    TERRAIN	The terrain ID
    ISDIRT	Checks the terrain ID to see if it's dirt.
    ISGRASS	guess
    ISROCK	dunno
    ISWATER	guess again
    STATICS	Number of statics in the position
    STATICS(n)	ID of static Nth static ( eg: <SERV.MAP(200,300).STATICS(0)>. Shows no error in the console
		if static isn't present, returning 0 - useful to test for a static w/o counting or looping.
    STATICS.n	  same
    STATICS(n).key	Get a key from the appropriate ITEMDEF. eg: <SERV.MAP(200,300).STATICS(0).NAME>

- Added basic iterator construct, WHILE, with the following syntax:
     WHILE ( condition )
	// do stuff, current iteration number in <LOCAL._WHILE>
     END // or ENDWHILE

  also added FOR, terminated with either END or ENDFOR, with the following syntax:

     FOR 5	// loops from 0 to 5, current iteration number in LOCAL._FOR
  or FOR 3 5	// loops from 3 to 5, current iteration number in LOCAL._FOR
  or FOR K 5	// loops from 0 to 5, current iteration number in LOCAL.K
  or FOR K 3 5	// loops from 3 to 5, current iteration number in LOCAL.K
	// do stuff
     END  // or ENDFOR

  Changing these LOCAL variables has no effect on the loop.
- Wrote a small assembly function to access the high resolution timer. Works for both windows and Linux,
  now being used in profiling. Profiling works on Linux now. It also looks a lot better in the console
  thanks to the monospaced font.
- Changed the console font under Windows to Courier, which is monospaced, so things come out aligned in
  the console. Under Linux, the console is naturally monospaced.
- You can now add new SKILL sections, up to 70. SERV.MAXSKILL tells you how many skills are loaded. Notice
  that they won't be sent to the client though, the client doesn't support them (hint: @UserSkills). There
  is also a FLAGS key for SKILL section, with the following values:
     [DEFNAME skill_defs]
     SKF_SCRIPTED	01	// no hardcoded behaviour, only triggers are called.
     // feel free to add new tags you find useful, but only above 01000 please, to make room for future
     expansion
  This is heavily experimental, mess with it at your own risk.
- SKILLSELECT skill - force a button select event on the skill list

24-12-2003, Kell
- Fixed TYPEDEFS section in spherefs.scp loosing values when resynced.
- Added <CANMOVE dir>, takes a direction as argument (like WALK), returns the area ID we're moving to,
  or 0 if no move is possible.
- Added <MOVE dir>, takes a direction as argument (like WALK), returns the TILE flags for that position.
  Notice that flag 04 is walkable. Here's a list of flags, you can copy&paste it into spheredefs.scp. This
  keyword might change in the future.
- It's Xmas! So I'm off to eat some turkey for the next 48 hours. :) Does this count as an entry in the
  changelog?

27-12-2003, Kell
- Added support for color & render mode in EFFECT. If no color or render effect are specified, old
  effect packet is still sent (which spares 8 bytes). Otherwise the new packet type is sent. Tested
  and works with clients from 2.0.3 (should work on all 2.0.* series).
- Consolidated support for 3.0.* clients, they should work fine, up to LBR (they already worked, just
  spitted some error messages).
- Added modulus (%) operator in numerical expressions (eg: 12 % 3 == 0).
- Added SENDPACKET command for clients. To make it easier to send WORD(2 bytes) and DWORD(4 bytes) values, 
  allowed for 'W' and 'D' prefix to values ('B' is also supported for byte but it's redundant). Here's an
  example, of setting light level:
     SRC.SENDPACKET   04e  D<SRC.UID>  20
  Both 04e and 20 could use the prefix B, but notice how <SRC.UID> uses the prefix D to specify it takes
  the space of a DWORD (4 bytes). So much for complex scripts to break multi-byte stuff in bytes :p
  Notice also that each of the parameters is evaluated and truncated, and only then used. For instance,
  if you put 0fffffffe (which obviously isn't a byte) in place of a BYTE, what you'll get is effectively
  0fe. If you put (2+2) it'll be evaluated to "4" before being used.

28-12-2003, Kell
- Added OSTR, ODEX, OINT.
- Added MODSTR, MODDEX, MODINT - spells affect these.
- STR, DEX and INT are always equal to O + MOD (for the relevant stat). If you have OSTR=50, MODSTR=0 and
  then do STR=60, you will get MODSTR=10 (and OSTR unchanged). 
  *** CHANGED *** read the entry for 19-01-2004
- Added MAXHITS/MAXMANA/MAXSTAM. If set to 0, it defaults to the base max stat (eg, MAXSTR defaults to STR).
  MAX always contains MOD for the appropriate stat. That is to say that if you have MAXHITS=100 and MODSTR=10
  then internally it'll be recorded as MAXHITS being 90, and if MODSTR changes, so does MAXHITS. This makes
  it coherent for stat spells, seeing as they not only change your stats but also max hits/stam/mana.
  To make hits depend on STR again, use
     MAXHITS =	// don't use a value
- You can now write TAGs on accounts. Both TAG and TAG0 are available.
- LOCAL._WHILE fixed, within WHILE loops.
- Changed dialog BUTTON sections to allow 
     ON = min max
  to grab any button with buttonID between min and max (including). Also, argn1 is the buttonID that
  actually got selected (even when specify just a buttonID and not a range, as usual). With the buttonID
  in argn1 you can write more generic functions with little fuss.

29-12-2003, Kell
- Fixed some skills not getting currectly terminated when another skill was used before they finished. An
  example of this is Spells not fizzling when a skill was used before spell ended.
- For skills, @Fail is now only triggered when failure occured due to normal circumstances (eg, failed
  difficulty). @Abort is called when failure occurs due to a situation that aborts the skill, such as
  using a new skill before finishing the previous one or an invalid circumstance.
  If @Fail is triggered, it means that the character will still get a skillcheck for failure (skill raise
  through failure), but if you do a "return 1" in there, it won't (check MANUAL.TXT).
- Started implementing propper behaviour for EF_CanSeeLOS. At the moment, it'll check the height of static
  items in the path to the target.
- The use of "SECTOR" to access keywords related to sector is now mandatory. So, to access "light" or
  "rainchance", SRC.RAINCHANCE used to work, you must do SRC.SECTOR.RAINCHANCE. This has several
  advantages - people usually already use SECTOR anyway, so this makes for faster faster execution of
  commands on characters, seeing as it has less things to try. It is also more coherent.

30-12-2003, Kell
- Fixed a small problem with KARMA/FAME that had the huge effect of blocking the client once it got different
  than 0.
- Added FEATURES= to sphere.ini, to define the features the server will enable on the clients upon connection:
   0001 - (T2A) enables chatbutton
   0002 - (LBR) enables LBR sound (plays MP3s instead of MIDI)
   0004 - (T2A) enables T2A update
   0008 - (LBR) enables LBR update (shows monsters)
  Standard .55i automatically enabled 0001 - but you could disable it.
- DIALOGCLOSE command. First argument is the dialog name, second argument is the button that should be
  triggered on the dialog - 0 if not specified. (eg: DIALOGCLOSE d_my_dialog).
  You can put this as one of the first commands in a DIALOG section, to ensure there is only one dialog of
  that type on the client.

02-01-2004, Kell
- Added connection control keywords to sphere.ini - a value of 0 disables
  any of these settings. These settings are not dumb proof. Make sure you
  know what you're doing if you set these:
  * ConnectingMax=x, where x is the maximum number of clients that can coexist
      in non-game state (http, login, etc). Older clients that are not ingame
      get disconnected when new ones come in. Default: 24
  * ConnectingMaxIP=x, as above, but per IP. Only a maximum of x simultaneous
      "not in game" connections will be allowed per IP. Notice that HTTP
      requests for instance, count as "not in game". Default: 8
  * ClientMaxIP=x, maximum number of connections per IP. This is intended to
      stop flooders, DO NOT SET THIS TOO LOW, or you risk looking stupid. There
      are MANY situations where connections can appear as comming from the same
      IP - a common one is people connecting from cybercaffes. Default: 0
- Fixed a serious bug where login errors (Bad Login) could leave a lingering
  socket. This happened because sockets were made invalid so that they'd get
  closed on the next read cycle, therefore losing all information about the
  socket. Clients are now flagged for disconnection, and socket handling is
  done when clients are freed.
  This means that there should always be a "disconnected" message to pair
  with a "connected" message.
- You will see two numbers after the IP in connected/disconnected messages.
  The first is the number of connections from that IP which are not in-game,
  whereas the second is the total number of connections from that IP.
- In savefiles, OSTR and MODSTR are now saved instead of STR. If "STR" is found,
  it'll be interpreted as OSTR. This works fine to convert old worldfiles, even
 if you have spells, because once they wear off they'll simply make your MODSTR
  negative. This works for all stats obviously (simply using STR as an example).
- Changed it so that the first time you set a stat on an NPC, if the Ostat is 0,
  it'll update Ostat not MODstat. In other words, and as an example, if you do
  STR=20 in @Create, you'll end up with OSTR=20 and MODSTR=0. If you then do
  STR=30 on the same NPC, you'll end up with OSTR=20 and MODSTR=10. 
  **** changed **** see the entry for 19-01-2003
- Fixed a small problem from R3.13 with stat affecting spells not setting MODstat
  correctly.

03-01-2004, Kell
- Added unary operators "*=", "+=", "-=", "/=", "%=", "|=", "&=" and "!=". Internally,
  what these actually do is change a line in the format:
    XXX += YYY
  to
    XXX = <eval (<XXX> + (YYY))>
  So you can do stuff like
    MANA	+= 10/2			// same as MANA = <eval (<MANA> + (10/2))>
    ATTR	&= ~attr_magic		// same as ATTR = <eval (<ATTR> & (~attr_magic))>
- Added ".=" operator, to do string concatenation. Internally what it does is change a line
  in the format
    XXX .= YYY
  to
    XXX = <XXX>YYY
  This is intended to be used with things that can support strings (NAME, TITLE, VAR, LOCAL, etc)
- First attempt to implement propper LOS check counting with z. To have LOS, you must be
  able to walk in a straight line to the target (no news here) AND finish at a reasonable
  height, climbing your way to it. So, if you're on a slope you might have LOS, but if
  you're standing one floor below you won't. These extra texts have no measurable impact on
  performance Enable this behaviour with EF_CanSeeLos (04).
- Diagonal walking (eg, NW) is allowed only if the character can move ortogonally in both
  directions (NW -> N and W). This takes care of a few clientside exploits, as well as NPCs
  walking through corners. Enable this behaviour with EF_DiagonalWalkCheck (010)
- For the effect of stepping on them, all items were considered to have a height of 3. If you
  are standing higher than 3 above an item, you wouldn't trigger a step on it. Changed it so that
  if the item's height is above 3, that value is used, and not the hardcoded "3". This allows
  one to get @Step events on stuff like tables.
- If no SRC is defined at the time of a @SpellEffect trigger, then the character subject to the
  spell will be considered the SRC. This fixes SPELLEFFECT under @Timer triggers.
- Added @NPCLookAtChar and @NPCLookAtItem triggers (check the manual). Do not abuse of these
  triggers, as they will affect the CPU usage.

04-01-2004, Kell
- Added ISNEARTYPE, first argument is type, 2nd argument is max distance to search ( if not
  specified, 4 is the default ). Also added ISNEARTYPE.P, which returns "0" if false or the
  point coordinates if true.
- Changed DISTANCE to accept the UID of an object (item/char) to compare the distance, or a
  point. One can now write things like
     <DISTANCE <MOREP>>  <DISTANCE trinsic>  <DISTANCE <SRC.ACT.UID>>
  If no argument is supplied, then SRC.UID is used (as default). If the point/UID is invalid
  an error is printed to the console.
- Made TIMERD readable (its precision is 10x that of TIMER, same scale of SERV.TIME).
- Made USEITEM not check for visibility. The whole purpose of this keyword is to allow
  activating an item via scripts w/o testing for touch, so it doesn't make sense to test
  if the item can be seen. DCLICK performs the usual tests though. The "USE" keyword already
  allowed one to do "USE 0" not to test for touch, but it also tested for visibility, and it
  won't anymore if used like "USE 0".
- Spawns gems now instantly update the display as soon as you set MORE1.
- Double clicking an already negated (more2=0) character spawn sets its timer to 1 so it
  respawns next turn.
- Added MOVENEAR keyword for objects(items/chars). 1st argument is the UID of item to move
  near to, 2nd argument is the distance to the item. If 3rd argument is present and "0",
  then the item will not send an Update. Example:
     ON = @DClick
        MOVENEAR <SRC.UID> 5	// move to 5 steps away from SRC
  Notice that this movement respects walls & such (which is why it is useful).
- Set ARGN1=1 in @Login not to show MOTD scroll.

05-01-2004, Kell
- Fixed possible exploit with \n and textentry and inpdlg.
- AREA and ROOM sections in the following format
     [AREA name here]
  Should now be written as
     [AREADEF a_some_def]	// ROOMDEF for rooms
     NAME=name here
  The advantage of this format is that you can resync it w/o having conflicting regions.
  Suggestions:	Keep your areas in different formats in seperate files. Either find a script
		to convert your old format to the new one or slowly convert by hand.
		Move [Teleporters] and [Moongates] to their own files (these can't be resynced).
  Note:		You do NOT have to use the new format. It is, however, strongly suggested, as
		it allows you to change an area without rebooting.
		Any future ability to save things on regions will only be available for regions
		in the new format (or regions that have a DEFNAME).
- Added CALL instruction to invoke a function, but sharing the LOCAL variables with the called
  function. Quite useful when you want to break a function in small pieces that are logically
  yet not functionally seperate. In other words, if you invoke a function with CALL, all your
  LOCAL will be available to the underlying function. Example
    [FUNCTION myfunction1]
       LOCAL.VAL1	= 12
       CALL myfunction2 1, 2		// LOCAL.VAL1 will be available to myfunction2
       // if myfunction2 changes LOCAL.VAL1 it will change here aswell.
  If you do not pass arguments to the called function, then args/argn/argv are also shared,
  and the process is faster than invoking the function w/o CALL. If you pass arguments to the
  function, then only LOCAL is shared, and the process is an infinitesimal amount slower. Not
  noticeable, no real impact, but conceptually slower. 
  This can also be used as <CALL Function ...>, faster without arguments, slower with.
- Recently realized that ALL DEFNAMEs are put into VAR. That means that all itemdefs, chardefs,
  etc have an entry in VAR (try <VAR.i_dagger> ). Now, this is potentially confusing and source
  for many problems:
     1) Whenever you're trying to access a VAR, you go through ALL the existing defnames.
     2) You can accidentally create a var that is also a defname... and oooooops!
  So to cope with this, changed it so that VAR/VAR0 only contains global variables that can be
  modified, whereas DEF/DEF0 contains item defnames and can only be read. The difference in speed
  is visible! EVERY time you were accessing a VAR you'd be searching through an array with a few
  thousand elements. Now each lookup searches only through the variables your scritps have created
  (which even on an extremely scripted shard shouldn't reach a hundred).
  This also makes it possible to identify WHICH variables are supposed to be saved.
  Although this is a huge change internally, it won't affect scripts except in the following
  situation:
     1) You defined a DEFNAME flag in scripts that you then changed during execution. This is
        highly uncommon, but if you decide you need this sort of behaviour just create the create
        the VAR once via scripts, it will be saved to spherevars.scp.
     2) You were accessing DEFNAMEs via VAR. No real reason to do it, seeing as DEFs / VARs can
        be accessed w/o the VAR. prefix.
  If not using DEF or VAR to access a variable, you'll get first the VAR if exists, and then the
  DEF. That means that old behaviour is kept.
- VARs are now saved to spheredata.scp. If that file isn't present at boottime the shard will print
  a warning, but it will continue, and it'll be created on the next save.
- GMPages will now be saved to spheredata.scp. Too many people are interested in parsing these to
  make special stuff (eg webpage interfaces or mirc scripts), so now they won't have to parse the
  whole world to read in this stuff.

06-01-2004, Kell
- Added "S" flag to SENDPACKET, allows one to send strings of characters directly. String is not
  within quotes it stops at the first space. Example
     SENDPACKET 00 S"This is the string to send" 0
     SENDPACKET 00 SUpToTheSpace 0
  If the string must be null terminated, simply put a 0 in there, as above. Otherwise, you'll probably
  need to specify length (strlen function) - depends on packet
- Added new walk limiting code, wildly based on the bit-bucket algorithm used in IP QoS DiffServ
  routers: there is a maximum speed at which you can walk (it's fixed, different walking or foot). If
  you walk faster than that speed, every tenth of second you walk faster than expected is a point you
  loose. Every 10th of second you take above the time expected is a point you win. The number of points
  you start with and the maximum is WALKBUFFER in sphere.ini, and I've tested it with values
  around 40 for good connections and 70 for laggy connections.
  If a player speedwalks, he'll soon drop below 0, and stop moving, then have to compensate with equally
  slow walking periods, like it happens when there's a burst of lag.
  WALKREGEN is the speed at which you regen walk points, in percentage.
  Default values: WALKBUFFER=50   WALKREGEN=25
  Hints:
	WALKBUFFER	lower for more strict control. However, setting it lower also increases the
  			chance of limiting someone which is just experiencing lag. Raise this value
			if you lower WALKREGEN.
	WALKREGEN	set lower for longer-lasting punishments. It makes sense to lower this value
			if you raise WALKBUFFER.
- Removed some EF_ flags that are no longer necessary seeing as they proved to be harmless. Make sure
  you consult MANUAL.TXT.
- Changed trigger @DropOn_Item and @ItemDropOn_Item to be activated for container items too.
  Activated when item with the trigger is dropped on another item (dropped on something else).
- Added @DropOn_Self and @ItemDropOn_Self, activated when an item is dropped on the item with the
  trigger (something was dropped on self).
- Implemented trigger @DropOn_Char and @ItemDropOn_Char.
- If these triggers fail, will only bounce the item if it's still being dragged. That allows the
  scripts in the triggers to define a new place for item.
- Made sure clients can only drop stuff into the bankbox if they are standing in the place where it
  was opened. This could now be checked within scripts aswell.
- Fixed an Injection exploit regarding accessing the bank away from the place it was opened in.
- Added @SkillGain and @Gain triggers. Check MANUAL.TXT for more info.

07-01-2004, Kell
- Automatically assign a DEFNAME to areas and rooms defined in the old format (AREA / ROOM). This
  defname is built upon the NAME, and is made unique by adding a number to it.
- In the console, you can type "d a" to output all the areas and rooms to a file "map_all.scp". I
  strongly suggest you replace your map with this file, as it'll allow you to finally get rid of the
  old format.
  NOTE: Teleporters and Moongates aren't saved in this file, so you should split those to a different
  file, to allow areas to be resynced.
- It is strongly suggested that you do the above, and get rid of the old format areas/rooms. Doing it
  has the following advantages:
  * Loading will be faster, because the server won't have to try and find a good defname for areas.
  * You can edit areas, and resync (even change their name) with no conflicts.
  * TAGs on areas are only saved for areas that have a valid DEFNAME, so if you do this, TAGs will be
    saved on all your areas.
- Added @Targon_Cancel for items.

---- 0.55 R3 rc2 --------------------------------------------------------------
---- 25/01/2004

08-01-2004, Kell
- Fixed VERBOSE=1 causing a catrazillion errors at boot.
- .CAST and .TELE won't show "bad command" sysmessage when they fail.
- If TRY/TRPY are called with an invalid command, they will send the error to the console and not to
  the player. This is coherent with how scripts should behave.
- Fixed NPCs not starting with max stats when MAXxxx is used.
- Fixed .admin showing only your own IP.

09-01-2004, Kell
- .serv.account unused xxx  delete
- .serv.account add test // missing password will no longer crash
- killing characters with positive karma (actually, it's about commiting a crime, not karma)
- .info not returning to dialog after changing a value (actually, INPDLG wasn't returning to dialog)
- flags on UIDs preserved (040000000 for items, 0d2000000 for skills, etc). GLOBALS renamed to WORLDVARS
  due to this (won't go into details here).
- SERV.LOG fixed.
- Fixed plevel 1 players seeing other plevel 1 hidden players
- Added USEHTTP=0/1 in sphere.ini, to disable/enable the built-in HTTP server.
- Added USEGODPORT=0/1 in sphere.ini, to disable the port opened at +1000. As far as I can tell, there is
  really no purpose for that port except taking in connections, much like the standard port you set. So it
  ships disabled by default.

10-01-2004, Kell
- Fixed a bug where redefining a base type (one in the TYPEDEFS list in spheretables.scp) could lead
  to a crash.
- Added a way to assign a TYPEDEF to a terrain type. This means you can define what terrain types are
  water, for instance. Example:
    [TYPEDEF t_water]
    TERRAIN	= 00a8	00ab
    TERRAIN	= 0136	0137
  This information is then used by ISNEARTYPE (and it has effect on all the hardcoded behaviour)
  when trying to assert if there's t_water around.
  Notice that ISWATER checks wether a terrain type is t_water, whereas <ISNEARTYPE t_water> would check
  for terrain, statics and dynamic items.
- Changed TYPE when called on an SERV.ITEMDEF.xxx.TYPE to return the typename, and not just a value. So
  when called on an water item it should return t_water, and not "30". This also has affect when using
  STATICS.x.TYPE.
- Fixed not being able to access properties of TARGP, as in <SRC.TARGP.X> or <SRC.TARGP.TERRAIN>.
- Added "TYPE" to the keywords available on a point. It uses the information above to return what item
  type is the terrain at that point. So you can do TARGP.TERRAIN.

11-01-2004, Kell
- Changed .info command to show the type associated with the terrain (t_normal if none).
- Wrote sphere_types.scp - it is a REQUIRED script, as it associates terrain IDs to item types. This
  replaces the old hard-coded behaviour (which by the way, was slower). By replacing it, I see no
  need to keep the old code, seeing as all you need is to have this script, which will be distributed
  from now on.
  Add sphere_types.scp in spheretables.scp right after sphere_defs.scp.
- Removed ISWATER, ISGRASS, ISROCK and ISDIRT commands from points (they were introduced in R3). Please
  use TYPE instead. For instance, use (<P.TYPE> == t_water) wherever you'd use <P.ISWATER>. Some might
  have grown attached to these commands, but unified and coherent scripts are certainly better than
  different methods for doing the same. Besides, this offers a lot more control (e.g.: <P.TYPE> == t_lava)
- Added ISNEARTYPE to the keywords accepted by points. So you can do <SRC.TARGP.ISNEARTYPE t_water> and
  that will effectively test terrain type, statics, and dynamic items. This is probably what most people
  will want to use, seeing as P.TYPE only test for terrain (and not statics or dynamic items).
- Added EF_New_Triggers (010). If set, allows the use of @NPCActFight, @NPCActFollow, @NPCLookAtChar
  and @NPCLookAtItem. This flag was added because even having these triggers *might* have some impact
  upon performance in very busy shards. 
- Removed a "Weird layer" message from whenever you equipped an item to layer_hidden. This is quite an
  useful layer for people wanting to expand their shards, so there's really no reason for this error.

12-01-2004, Kell
- Fixed "b" in console not working.
- Added DISTANCEYELL, DISTANCETALK, DISTANCEWHISPER to sphere.ini - a value of -1 turns it into a
  broadcast.

13-01-2004, Kell
- The @Create trigger for items works as any other item trigger - it can be fully scripted.
  After a LOT of work, you can now also check for SRC under item's @Create. There are situations where
  an item can be created without an SRC, but in most cases, there will be one. Eg:
  ON = @Create
     if ( <SRC.UID> )
        SRC.SYSMESSAGE You have created an item!
     endif
  Bear in mind that @Create is created before the item by the server, so it can still suffer transformations
  after it's been created. Particulary, you won't be able to REMOVE an item under a @Create trigger - it
  will have no effect.
- Added ISEMPTY and ISNUM. Eg: <ISEMPTY <VAR.TMP>> or <ISNUM <VAR.TMP>>. 
- Added STATICS.FINDID.xxx - it will take you to the ITEMDEF of the static item with the supplied ID
- Added @ResourceTest to REGIONRESOURCE sections, called once for each resource in the region that the
  character is able to find.
- Added @ResourceFound, triggered after a resource has been selected (@ResourceTest has been called for
  all resources available). ARGO is the resource bit to be placed at the location. "return 1" keeps the
  resource bit, but sets it to be empty.
- Added DEFMESSAGE section for scripts, allows setting of strings to be used by the server. More will be
  added - work in progress. You now REQUIRE a script with these strings.
- Fixed RESOURCES.xxx.val and .key.

19-01-2004, Kell
- Fixed a bug with getting stuck on stuff.
- STR, DEX and INT are always equal to O + MOD (for the relevant stat). If you have OSTR=50, MODSTR=10 and
  then do STR=70, you will get OSTR=60 and MODSTR unchanged.

21-01-2004, Kell
- Changed max height difference on CanSeeLOS from PLAYER_HEIGHT/2 to PLAYER_HEIGHT, so that you can access
  chests on top of a table.
- Removed the password being shown on console when a password error occurs.
- Made .x* and .set* commands respect PLEVEL. You also need plevel to use the "SET" command to use .x and .set
  commands.
- Slightly smarter NPCs against field spells - they will avoid them more often depending on INT.
- Fixed another spot where SRC was undefined in @Create (there might still be more of these).

23-01-2004, Kell
- Fixed buying multiple pets from animal trainers.
- Fixed a bug in FOR where counting down wouldn't work (eg: FOR 10 1 works now)

24-01-2004, Kell
- Fixed bug with NPCs going stale (their timer going -1) - particulary pets.
- Fixed @Effect in SPELL sections to work and have same arguments as @SpellEffect.
- Added SPELLFLAG_SCRIPTED (010000) so that one can more easily override the default behaviour of
  spells.

25-01-2004, Kell
- Fixed yet another exploit, with sending a hacked Author in books (tks Balkon)
- Added PROMPT_MSG to SPELL sections and disabled the hard-coded messages. You'll have to fill in the
  prompt messages for the spells.

---- 0.55 R3 rc3 --------------------------------------------------------------
---- 06/02/2004

25-01-2004, Kell
- Fixed a bug with @Gain trigger, that regardless of it even existing would reset the skill to the skill
  being tested. This turned out in Parrying skill interrupting combat, and other buggy skill behaviour.
- Added EF_Scripts_Parse_Verbs (040). If enabled, verbs (the 1st command in a script line) are parsed
  before execution, thus making "TRY" obsolete for that purpose. Example:
     LOCAL.MYSTAT	= MODSTR
     // the following line is parsed to become: str = <<local.mystat>> + 5
     <LOCAL.MYSTAT>	= <<LOCAL.MYSTAT>> + 5
     SYSMESSAGE Stat '<LOCAL.MYSTAT>' increased to <<LOCAL.MYSTAT>>.

26-01-2004, Kell
- Renamed SPELLFLAG_TARG_OBJ to SPELLFLAG_TARG_ITEM. This is really an internal change, but you should
  change spheredefs.scp to be:
  SPELLFLAG_TARG_ITEM	000002
  SPELLFLAG_TARG_CHAR	000004
  SPELLFLAG_TARG_OBJ	SPELLFLAG_TARG_CHAR | SPELLFLAG_TARG_ITEM
- Made sure a character can only be targeted by a spell with SPELLFLAG_TARG_CHAR, and that an item
  can only be targetted by a spell with SPELLFLAG_TARG_ITEM.
- Modified TARGET command to allow 3 possible suffixes (in this order): F, G and W. So you can do
  TARGETGW, TARGETFW, etc. 
  F - Call a function after target ( eg: TARGETF f_rename )
  W - Warn against criminal action
  G - Target ground
- Made sure flags in the CAN= field for ITEMDEFs work correctly. A few items are missing these flags,
  such as i_wall_stone_7 missing CAN_I_BLOCK (so NPCs walk through them).
- Added MULTICREATE command, so you can place multi items via scripts: first set their position then
  call MULTICREATE to build them permanently.

27-01-2004, Kell
- Added EF_New_Maps (020), which enables the mapchange packet (0bf, subcmd 08). If enabled, moving to
  mapplane 1 or 2 will send a packet for the client to see the appropriate map, and moving to other
  mapplanes will send the packet changing back to basic map. This allows one to see the new maps.
  However, there is NO support on the server for new maps. That means that you're walking on the new
  map only on the clientside, while on the server you're walking on the standard map.
- Server now recognizes bogus extended message 15 - won't send error message to client.
- Added recognition for clients up to 4.0.0c - will not endure AOS features though. Useful for people
  with plain AOS installation that wish to play on the server.
- Mind you that this isn't AOS support, it's merely supporting the client.

28-01-2004, Kell
- Fixed TARGP not being set when using a spell.
- Added SPELLFLAG_TARG_NOSELF (0800), which stops spells from being cast on the player itself.
- Fixed accessing LOCAL variables straight within DIALOG sections (also fixes FOR loops).
- "return 1" within a DIALOG section stops the dialog from actually being sent.

30-01-2004, Kell
- Changed SPELLEFFECT to take UID of SRC as 3rd argument, and UID of source item as 4th argument
  (optional). To maintain compatibility, a 3rd argument of '1' refers to the current SRC.
  Example: CONT.SPELLEFFECT s_fireball 1000 <CONT.UID>
  In this example, <cont.uid> will be the SRC of @Effect and @SpellEffect triggers. Say no to
  equip fudging :p
- Fixed KARMA going to odd ranges.
- Added EF_Intrinsic_Locals (080), so that after you do LOCAL.X = something, you can access it
  via just <X>. Be careful though, not to name local variables after some known keyword, or your
  results might how you want them. 
  Example:
      LOCAL.X = 10
      SYSMESSAGE X is <X>.

02-02-2004, Kell
- Fixed an exploit that would allow insta-resurrection anywhere (death menu packet).
- Fixed one last \n\r packet exploits.
- Made sure \n or \r are never saved to the world file, so even if some packet exploit got overlooked,
  it'll end up causing no harm and issue a warning in the console.. This is likely to be the end of
  99% of shard hacking.

03-02-2004, Kell
- Fixed FOR x being 0 based - FOR 5 will now loop from 1 to 5 and not from 0 to 5.
- Fixed "/" character in parsing of simple formulas (so you don't need to use eval when
  assigning formulas to TAGs/VARs or in RETURN).
- Fixed @Targon_ground in GM mode with weapons throwing critical exception (it was attempting
  to damage a static item, which obviously is not an item at all).
- Targon_ triggers now have argn1 as the id of the static item (if a static was targeted),
  and ARGO being the targeted item (reduntant yes, but coherent).
- (intermediary test release here to get some feedback)
- Polymorph spell fixed.

04-02-2004, Kell
- When loading a world with VERSION below "0.55 R3", convert spells that affect stats, by
  removing its effect from base stats (old method) then putting the effect into modstats
  (new method). This ensures compatibility with spells and cursed items.
  Notice that this only works for worlds saved on versions earlier than R3, seeing as worlds
  saved on the test versions of R3 made no conversion and thus had items with both formats
  which cannot be distinguished.
  If for some reason you want to bypass this conversion on an old world, change the version
  of the save files to "0.55 R3". If you want to force this conversion on a world saved with
  R3 test versions, change its version to "0.55".
- Fixed melee weapons with large RANGE hitting through walls.
- Added ARCHERYMAXDIST to sphere.ini (defaults to 12).
- RANGE works for ranged weapons (bows) too. If no minimum range is set, then ARCHERYMINDIST
  is used. If no maximum range is set, then ARCHERYMAXDIST is used.
  Notice that on ITEMDEFs, syntax for range is either RANGE=min,max or RANGE=max (assumes 0
  as min for melee weapons, or archerymindist for ranged weapons).
- Account delete should be working fine now.
- IPs now accept 255 as a wildcard. So if you add an ip under BLOCKIPs with:
  1.2.255.255 you will actually be blocking everyone IP under 1.2
- EOF Account really fixed now (thanks everyone who pointed all the flaws out).
  note for programmers: never ignore the return error value of a function :p
- Added <StrPos iPos, ch, string>, where iPos is the position to start at and ch can be
  either a single character, or the ascii code for a character.
  Example:	<strpos 0 32 Where is the first space> --> will return 5.
  		<strpos 3 e  Where is the first 'e'> --> will return 4.
- Added <StrSub iPos, iCount, string>. Returns "iCount" numbers string, starting at iPos.
  Example:	<strsub 3 4 Oh look at this> --> will return "look".
- Both StrSub and StrPos can take a negative value as iPos. In such a case, the position 
  is counted from the end of the string. So if you do:
  StrSub -5 2 <abcdefg> --> returns "cd".
- Changed StrArg / StrEat to stop at either a space or a comma. These are quick functions
  when you just want to take one argument from a string, or just want the string after one
  argument. Imagine you have a function that takes 1 number and a string. Instead of using
  argv[], you could use strarg to get the number and streat to get the string.

05-02-2004, Kell
- Spells with SPELLFLAG_SCRIPTED can "return 0" in @Effect/@SpellEffect to bypass any
  hardcoded effect, w/o cancelling the spell.
- Duration for summon spells now takes in consideration the DURATION field in the SPELL section and
  the caster level (yeah, it didn't).
- @SpellEffect/@Effect is triggered on the NPC when it is first summoned (it's always considered to
  be the s_summon_creature spell, regardless of spell initially used to summon the NPC).

06-02-2004, Kell
- Spells with both SPELLFLAG_TARG_XYZ and SPELLFLAG_TARG_CHAR/ITEM can be used either on the ground
  or on a character / item.

---- 0.55 R3 final ------------------------------------------------------------
---- 31/05/2004
---- * unofficial release [unallowed]

07-02-2004, Kell
- Added FeaturesLogin= to sphere.ini, allows setting of the flags sent in the 0xA9 packet, on login.

08-02-2004, Kell
- Added EVENTS/TEVENTS to items. Order of triggering is as follows:
   1) If it's a character activating the trigger, check for triggers sensitive to items (@ItemDClick, etc).
   2) triggers in EVENTS on the item
   3) triggers in TEVENTS on the item
   4) triggers in TYPEDEF section for the corresponding TYPE of the item
   5) triggers in ITEMDEF section of the item
   6) default hardcoded behaviour (if any).
  a "return 1" in any case, stops further processing of triggers.

21-02-2004, Kell
- There is a feature/bug when checking to see wether a player has some specific items, any item of a similar
  type will do. It affects these items:
     0175d (cloth), 01067 (leather), 01078 (hides), 01bdd (log), 01bd7 (boards), 00f3f (arrow), 01bfb (bolt).
  e.g., when the server tries to find an arrow, any t_weapon_arrow will do, and so on.
  Added flag EF_Item_Strict_Comparison (0200) to disable this behaviour.
  
25-03-2004, Radiant
- Added some combat, server and command messages to sphere_msgs.scp.
- Added two file handleing commands:
   SERV.WRITEFILE <filename> <text>
   SERV.DELETEFILE <filename>
  Because these commands can be quite destructive, option flag OF_FileCommands (080) must be enabled 
  for these commands to work. Be careful, because any GM with access to SERV.* commands could use this!
  More will follow soon.
- Added @UserChatButton trigger (return 1 disables default (chat window) behaviour)
- Added @UserMailBag trigger (return 1 disables default (message) behaviour)
  NOTE: It seems this is also triggered on login, try using something like
    if (<uid> == <src.uid>)
      return 1
    endif
  to prevent this.

26-03-2004, Radiant
- Added <READFILE filename line> statement
  If line == 0 this will return the last line of the file, if line == -1 this will return the first line of
  the file. This needs OF_FileCommands (080) to be enabled because of obvious security reasons.
  This will return "" (nothing) on failure.
- Added <FILELINES filename> statement, returns the amount of lines in a file.
  If this is 0 it means the file doesnt exist or cannot be read. This too needs OF_FileCommands (080).
- Added some error and misc. messages to sphere_msgs.scp.
- Added SYSMESSAGEUA (syntax equal to SAYUA).
  *** NOTE *** People using Taran's colored sysmessage script will experience problems! Remove Taran's script
  and change your scripts to use the hardcoded function instead (which is much faster and efficient anyway).
- Fixed missing return char in TRY console errors and added the UID of the object causing the error.
- Added @Attack trigger (after someone doubleclicked a character to attack).
  SRC is the target. "return 1" will cancel the attack.
- Added @UserWarmode trigger, fired when a user hits the warmode button before sphere changes the warmode flag.
  ARGN is the current warmode state (1 = in warmode, 0 = peace). "return 1" cancels the warmode change.

27-03-2004, Radiant
- Got sphere to compile on FreeBSD, it's not very stable yet, working on that (problem with signal handlers).
- Added TRYSRC <uid> <verb>, executes <verb> with <uid> as the SRC. Death to equip fudging!
  Note that the default object is the object this is called on, so link.trysrc <cont.uid> will make <link> the
  default object and <cont> the <src>. Very useful in timers!

28-03-2004, Radiant
- Disabled SENDPACKET S"" and put in a little notice that you should use <ASC> instead.
- Casting recall/gate travel on an item now fires @SpellEffect on that item.

31-03-2004, Radiant
- Added OF_NoItemNaming (0100), prevents sphere from naming items "sword crafted by Player"
- Added EF_No_Pause_Packet (0400), this prevents sphere from sending a Disable Redraw (or pause) packet everytime
  a new item/character is sent to the client. This is a bandwidth saver and lag preventer.
  This saves about 45 bytes for each action, this doesn't seem much but you can notice the difference.

02-04-2004, Radiant
- Changed skillsum to DWORD, which fixes the problem with high skillsums not working.

04-04-2004, Radiant
- Gate travel spell now LINKs the gate to the person that opened it.

06-04-2004, Radiant
- Healing is now interrupted properly when hit, fixes exception problem.

08-04-2004, Radiant
- Fixed signal locking problem on Linux/FreeBSD, running sphere in multi-threading mode still has problems, I'll look
  at that tomorrow. Sphere now survives pretty much every error on Linux/FreeBSD (only tested on FreeBSD), as long as
  it's running in single thread mode.

09-04-2004, Radiant
- Threading problem seems to be a little more complicated, but at least sphere runs very stable for me without threading
  on FreeBSD. I've tried it on Slackware, which still had alot of problems. I'll leave that for Kell ;)

11-04-2004, Balkon
- Fixed bug when pick up few items from a pile on the ground it's timers become -1
- Added @Pickup_Self - fired on container when item picked up from it, ARGO points to item we picking up
  @ItemPickup_Self for chars, ACT - container , ARGO - item we picking up
  Removed Reveal() from corpse looting - one can do it using @Pickup_Self if needed
- @Dropon_Char, @ItemDropon_Char now called when drop an item directly on charater either (before secure trade window 
  shown and @NPCAccept/Refuseitem triggers), ARGO points to character we drop the item on, or character's backpack

11-04-2004, Balkon
- Can't provoce char against an item
- Return 1 in @Login fixed (character will not stay in the world, no "client version check" loop)
- Fixed CONT and TOPOBJ in @EquipTest, item not moved if can't be equipped when doubleclick on it

12-04-2004, Radiant
- Added LOCALLIGHT property on characters, if this is 0 the normal lightlevel (sector) will be used, if this is higher the
  LOCALLIGHT value will be sent as lightlevel instead. You will need to use UPDATE after you have changed this, because the
  light level is not automatically updated. This overrides nightsight.
  (note: if you want to give a character a LOCALLIGHT level of 0, just set the nightsight flag)

13-04-2004, Balkon
- OF_NoHouseMuteSpeech (0200) - if enabled players are able to hear each other inside and outside the house
- Started remaking a CanSeeLos and CanWalk, temporary added EF_CanSeeLos_New (0800) to enable both changes
  as for now it fixes shoot through walls an fall through the floor in house regions interception area bugs, 
  more changes here later...

14-04-2004, Radiant
- @DClick is now triggered before the item is attempted to be equipped

15-04-2004, Balkon
- EF_WalkCheck (01000) - new walk check code, should fix lot of house looting bugs (patched verdata, walk under stairs etc.)
  NOTE: in default script pack some stairs are in DUPELIST of items, which are not really a stairs, so they have
  wrong CAN flags (CAN_I_CLIMB is not set). Make sure you've fixed your scripts before enabling this EF or you'll 
  not be able to walk on some of dynamic stairs

16-04-2004, Balkon
- some optimization to EF_WalkCheck, fixing climb height after teleporting and Z changing
- fixed bug when summoned NPC's have loot
- fixed RESOURCES.1 returned string in RESMAKE format
- fixed shafts etc. dupe bug

17-04-2004, Radiant
- Started working on some basic AOS functionality, EF_AgeOfShadows (02000) will enable this.
  Currently only enables tooltips (which aren't even working for now). Don't forget to enable flag 020 in FeaturesLogin!
- Fixed a nasty exploit that would allow anyone to crash sphere and/or execute code on your machine without even logging in
  (thanks Furio for reporting this)
- Fixed AOS Tooltips, now only shows the name for items and characters. I'll add other things later.
- Added AOS/LBR fading damage counter thing (requires EF_AgeOfShadows). This only shows for you and the person that hit you,
  I believe thats how it works on OSI (or doesn't it?). Showing it for everyone would make it laggy in my opinion.

17-04-2004, Balkon
- torch/candle dupe bug seems to be fixed at last :)

18-04-2004, Balkon
- fixed ACCOUNT properties was not accessable for logged out chars
- added ISPLAYER function - just a little feature :)
- added ISONLINE function - for players returns 1 if client is online (connected) and 0 overwise, for NPCs returns 1 when 
  NPC is in the world or 0 if it is offline (shrinked, mounted pets)
- added NOTOGETFLAG function, returns notoriety flags for specified char, syntax: NOTOGETFLAG Viewer_Serial,Allow_Incognito
  returned values:
	NOTO_GOOD		1 // good(blue)
	NOTO_GUILD_SAME   2 // same guild
	NOTO_NEUTRAL	3 // Neutral
	NOTO_CRIMINAL	4 // criminal
	NOTO_GUILD_WAR	5 // Waring guilds
	NOTO_EVIL		6 // evil(red)
  if no args specified returns flags for SRC as a viewer, NOTOGETFLAG 0,1 will return flags for SRC as a viewer with 
  Allow_Incognito = true
  NOTE: for red guildmates it will return NOTO_EVIL, not NOTO_GUILD_SAME

18-04-2004, Radiant
- Some additions to AOS tooltips

19-04-2004, Kell
- A few changes to AOS tooltips for cross-platform compatibility (itoa).

19-04-2004, Radiant
- Fixed status updates not sending with EF_No_Pause_Packet flag set
- Made @userStats fire on every status update that is being sent, if ARGN3 == 1 then the user has just opened the status window
- More tooltips stuff, type specific
- Added AOS/LBR Popup Menu's, these can be activated by setting flag 08 in FeaturesLogin (currently only for characters).

19-04-2004, Balkon
- RANGE bug fixed
- updating last regen time for dead chars so that they will not get ticks every tenth of second any more

20-04-2004, Balkon
- some traffic optimization:
  short stats change packets now used instead of full status packet when changing only hits/mana/stamina or it's max. values
  HITSUPDATERATE in sphere.ini controls how often (in seconds) my changed hits will be sent to others who can see me,
  default value is 1, incraise to reduce the traffic usage, 0 value disables sending such updates (like it was on 55i)
- MAXHITS etc. fixed. .MAXHITS 100 will now set MAXHITS to 100, this will include MODSTR so that if you had MODSTR 10 before 
  setting MAXHITS than when you change MODSTR back to 0 MAXHITS will be 90.
- maxhits displayed for others changed from 25 to 50 for smoother hits line changing on the statusbar

21-04-2004, Radiant
- Added MESSAGEUA, syntax equal to SAYUA and SYSMESSAGEUA
- Fixed lack of argument checking in SAYUA that sometimes causes an exception
- Added support for the "Virtue button" (at the top of the paperdoll on newer clients), fires the @UserVirtue trigger.
- Added support for the new spellbook packets (old ones don't work with AOS), if EF_AgeOfShadows is not set the old packets will
  be used (this is for Magery, there is no Necromancy or Paladin stuff (yet)).

22-04-2004, Radiant
- Re-added the "The spell fizzles" message on spell failure

22-04-2004, Balkon
- setting values in quotas for TAGs, VARs and LOCALs now will create text tags, i.e. 
  TAG.TEST_1 2+2
  will create numrecal tag TEST_1 with value 04, but
  TAG.TEST_2 "2+2"
  will create text tag with text '2+2'.
  Text tags and vars are saved quoted also.
- fixed REGION.TAG0.SOMETHING caused 'Undefined symbol "" error' when tag SOMETHING is not set

23-04-2004, Radiant
- Found out that new spellbook packets are broken, still not fixed
- Added support for necro book spells, now reads the spelldefs for these (101 - 116), will add hardcoded behaviour later
- Added @UserExWalkLimit trigger, fired if a user exceeds the Walk limit (is either lagging alot or speedhacking)
  RETURN 1 allows the user to walk, no action or RETURN 0 disallows the user to walk
  (note: this is pretty expensive because it's fired each time a step is taken while the user's walkbuffer is at 0, so be careful)

24-04-2004, Radiant
- Removed message from WEBLINK command
- Fixed .admin showing japanese text/crashing client with long character names (names are truncated to 30 chars)
- SERV.NEWDUPE and DUPE now sets NEW (and ACT? coded but not tested) for items only, duping chars doesn't work like it should yet
- DCLICK/USE on characters now takes an argument (uid), makes the character DCLICK a certain item/char
- CALL function is no longer case-sensitive
- Added arguments to dialogs, in this form: "DIALOG d_dlg 0 blabla", both <args> and <argv[x]> can be used. <argn> is the page number
  (second argument)

25-04-2004, Radiant
- Added COMMANDLOG option in sphere.ini, only logs commands issued by this plevel and higher. (default = 0, log all)

29-04-2004, Balkon
- after some beta testing few fixes in equip and EF_WalkCheck
- added EVENTSPET to sphere.ini - events far all NPCs
- added EF_DiagonalLOSCheck (04000) - to see the object in diagonal direction we must be able to see the point at least 
  in one of ortogonal directions, this mean you can't see objects only through the "corner", this fixes teleport through
  fence NW corner and some other bugs but still allows, for example, closing doors which are in diagonal direction 
  to you when opened :) Setting this flag may incraise CPU usage.
- alternative name in TAG.NAME.ALT is now used everywhere if tag is set - in character status, corpse names, linked 
  memories etc. It overrides incognito name also. The real name is only accessable via NAME property.
  TAG.NAME.PREFIX now overrides fame prefixes (shown on click). TAG.NAME.PREFIX and TAG.NAME.SUFFIX are now can be combined
  with TAG.NAME.ALT

01-05-2004, Balkon
- fixed bug when closing dialog with targeting cursor up canceled targeting
- removed \r check from character profile packet - this allows to have a multiline profile and fixing wrong "Cheater" warnings
- fixed bug when players was able to buy any items from vendor even outside the stock (equipped on him. in his backpack etc.)
- vendor now will simply transfer items to character's backpack if they are stored in his "extras" box or if he is a player's 
  vendor (they was duped, you bought the copy and the old one deleted before). Shrinked pets will not be unshrinked when sold
  from player's vendor (or from extras box).

02-05-2004, Balkon
- EF_CanSeeLos_New is not longer used, all fixes affected by this EF are now included to the code by default.

03-05-2004, Socket (UNSP team)
- Started work on fullfeatured guild/town system. Added MEMBER property to guildstones. You shall use it this way:
  <guildstone>.member.X.<property> These properties are available for read/write: ACCOUNTGOLD, LOYALTO, PRIV,
  SHOWABBREV, GUILDTITLE. Functions available: IsCandidate (returns 1 if member is a recruit), IsMember (1 if member),
  IsMaster (returns 1 if guildmaster). Also, MEMBER.X. construction points directly to character, so you
  could use something like MEMBER.X.NAME in your scripts. MEMBER.COUNT returns total number of guildmembers.
- ACCOUNTGOLD guild member's property is now saving to worldsave too.
- Added new GOLDRESERVE property to guildstone.
- Added new <CONT>.COUNT function which returns a total amount of items in the container.
- Added new SERV.CLIENT.x reference. SERV.CLIENT.0. is a newest client and so on, for example <serv.client.0.name>
  will return the name of last logged in client. Reference is READ-ONLY for safety. In this case you could save
  client uid somewhere and work with his using UID.<uid>. reference.

07-05-2004, Socket
- <CONT>.COUNT now returns an amount of items only in selected container, without counting items in containers inside it.
- Added <CONT>.FCOUNT function, which returns a TOTAL amount of items inside container.

11-05-2004, Balkon
- some fixes, @EquipTest now fired before all internal checks, before item unstacked from the pile, before item in same layer
  unequipped (this mean if you have return 1 there char will not unequip previews item)

16-05-2004, Balkon
- fixed @Dropon_char called when dropping item to any container on the char. Now it called only when you really drop the item
  on the character - directly on his head or on his backpack if you don't own him. ARGO now always points to character.

19-05-2004, Balkon
- fixed @color,font in MESSAGE and SYSMESSAGE, now it accept hexadecimal values, added 3-rd argument there - unicode flag, 
  new format is SYSMESSAGE @color,font,unicode text, added @color,font,unicode to SAY and broadcast either. Of course SAYUA,
  MESSAGEUA and SYSMESSAGEUA still can be used for this, but @color,font,unicode is accepted in default messages definition
  (sphere_msgs.scp), so now we can have default messages in unicode :)
- added OF_SkipUndefMsgs (0400) - if flag is set sphere don't send error strings for undefined default messages, 
  dont print errors on resync - just ignores it, so now we can disable some default messages if needed.
- SPEED wepaons property now used in fight delay calcilation if set (and not 0), the formula is 
  DELAY = 15000 / ( ( DEX +100 ) * SPEED )

20-05-2004, Balkon
- some optimization in hit messages (get only messages which really will be sent to client)
- added SPEEDSCALEFACTOR to INI (defaul value is 15000), used in weapon delay calcultions, now formula looks like
  DELAY = SPEEDSCALEFACTOR / ( ( DEX + 100 ) * SPEED )
- ARGN1 in @HitTry now is the delay (in tenths of second) left before the hit, can be changed

21-05-2004. Balkon
- added FORCLIENTS and FORPLAYERS loops, difference is that FORPLAYERS will loop through disconnected players which are 
  still stay in the world (client linger) either.
- if no args specifiead for FORITEMS, FORCHARS, FOROBJS, FORCLIENTS, and FORPLAYERS loops value 18 is used by default 
  (maximum view distance)
- added FORCONTID and FORCONTTYPE loops, format is FORCONTID i_dagger max_sub_containers. If max_sub_containers is not 
  present it will search in all subcontainers. If max_sub_containers = 0 - it will search only in this container.
- added FORCHARLAYER layer - loop through all objects in specified layer
- added FORCHARMEMORYTYPE flags - loop through all memory objects with this flags

25-05-2004. Balkon
- fixed bug when after parsing quoted lines when setting VARs, TAGs and LOCALs didn't create text variables

27-05-2004, Socket
- Fixed guild MEMBER.X.KEY for read/write. Now it should be working well. Will return error if you try
  to access non-existant member (so it should be better to use MEMBER.COUNT to check bounds).

---- 0.55 R4.0.1 --------------------------------------------------------------
---- 07/06/2004
---- * unofficial release [unallowed]

30-05-2004, Kell
- Little fixes to allow compile under Linux (use strcmpi() for caseless string
  comparison, and add casts to (LPCTSTR) on CGStrings).
- Changed version number. I suggest using R4.x.y where xx is increased when
  something major is done and yy is for little changes. Set to R4.0.1.
  (ps: some people never quite understood what RC* means. After the 20th it
   stops being a release candidate, it's more like a candidate to a release
   candidate. So after the "powers that be" have adopted and turned that
   numbering scheme into a mockery, I suggest we change to something less
   confusing.

31-05-2004, Furio
- Added FORCONT loop, format is FORCONT uid_of_container max_sub_containers. It
  will loop on every item present in the container. If max_sub_containers is not
  present it will search in all subcontainers. If max_sub_containers = 0 - it
  will search only in this container. (Thx to Balkon for the base code for
  container loops)

07-06-2004, Furio
- Made a blank REVISIONS.TXT because it was getting pretty big.
- Added XOR (^) operator to expressions.

---- 0.55 R4.0.2 --------------------------------------------------------------
---- 22/07/2004
---- * unofficial release [unallowed]

12-06-2004, Furio
- Added two new INI value USECRYPT and USENOCRYPT. The first if 0 don't allow at
  encrypted client to login otherwise allow them to log (default is 1). The
  second if 0 don't allow at unencrypted client to login otherwise
  if 1 -> allow and suppose that the clientversion is >= 2.0.0
  if 2 -> n/a
  if 3 -> allow and suppose that the clientversion is >= 3.0.0
- Added the most requested security-by-obscurity feature DISGUISEVERSION in
  sphere.ini. If set change the version outputted to clients, ircserver,
  webserver, listserver, telnetserver to its value otherwise the default build 
  value is used. (Mind that the version in savefile and in console startup is 
  the default build version)
- Fixed (i hope) bug with Mozilla/Firefox browser with the status page
- Fixed a buffer overrun bug that could be exploited to crash or run arbitrary
  code, in the log system.

20-06-2004, kuch
- Added ClearTags function (removes all the tags from the char/item/account);
  Revital did most of the work, but I get the credit.

28-06-2004, Furio
- Fixed multiple gump exploits. In order to do this now memory 08000 is used as
  internal memory (is called MEMORY_GUMPRECORD).
- Fixed and refined things for disguise version feature.

02-07-04, kuch
- Added MODMAXWEIGHT: allows you to increase/decrease max carrying capacity of a
  char.
- Added MODAR: allows you to increase/decrease the overall AR of a char
  NOTE: there are no oStat equivalents (ie oModAr or oModMaxWeight) for the
  above.
- Also added the following to avoid possible confusion:
  * MAXWEIGHT - same as WEIGHTMAX
  * AR - same as AC
  * MODAC - same as MODAR
  * MODWEIGHTMAX - same as MODMAXWEIGHT
  
03-07-04, kuch
- Added 135 more strings (mostly from skills) to sphere_msg.scp
- Added new .ini option: WOOLGROWTHTIME: how long in minutes it takes for wool
  on sheared sheep to regrow.
- Added new .ini option: SKILLPRACTICEMAX: how high can you train a skill on
  dummy/archery_target.

04-07-04, kuch
- Added 93 more strings: NPC speech and skill msgs; there are now 329 string 
  messages in sphere_msgs.scp.
- Added TAGCOUNT function (works on regions/items/chars/accounts) - returns the
  number of tags on that obj
- Fixed CLEARTAGS (now also works on regions)

06-07-04, kuch
- Fixed some weird bug in jobmage.scp and jobnoble.scp 
- Added a lot more strings to sphere_msgs.scp; If you find any bugs with them,
  kuchervano@hotmail.com me immediately!

07-07-04, Furio
- Fixed DISTANCEWHISPER not working correctly.

07-07-04, kuch
- Added DEFFOOD value to sphere_defs.scp - this is a template of items you want
  to get by casting the create food spell; Yes it does not give you a great deal
  of control over what you get (ie skillbased for example), but its better than
  nothing
  
09-07-04, Furio
- Fixed bug with ^ operator.

16-07-04, Vjaka
- Fixed bug with armor/weapon when hits were above to hitsmax.
- Cosmetic fix to report Client out overflow error line once per dialog instead
  of tons of them.
- Added trigger function f_onchar_delete triggered before client is going to
  delete a character. SRC is char, return 1 denyes deletion.
- Added trigger function f_onaccount_login triggered after client entered the
  password, ARGS is account name, return 1 disconnects.
- Added spell flag SPELLFLAG_PLAYERONLY 020000 which denies spell being cast by
  npc ai (no more npcs casting shrink if not wished to).

17-07-04, Vjaka
- Added @NPCLostTeleport to trigger before NPC is going to be teleported back to
  its spawn (by LostNPCTeleport sphere.ini setting), ARGN1 is the distance from
  the spawn.
- Added INI switch PAYFROMPACKONLY (default: 0). If set to 1, then buying stuff
  from vendors will search pack only for the gold.
- Added @Hunger to trigger before char is going to loss a food level. ARGN1 is
  the food level that will be set, return 1 cancels.

19-07-04, Vjaka
- Removed IRC server from default build settings. It is buggy, has holes inside 
  and probably should not used by anyone.
- Reverted memory information profiling in Win32 version (stability testings).
- Fixed NoMessages and Quick login mode (ARNG1/2 in @Login) now skips sphere
  version information and Welcome back.. prompt.
- Fixed some exceptions for ticking events. Some division by zero removed, and
  the exceptions are made less critical (actualy the way they should be - quite
  local). It means that the server should be more stable now. Also they gives
  usualy more information on when the error occured.
- Added @StepStealth triggering on each step made by person in stealth. ARGN1
  (in and out) - whatever to reveal him or not.
- Added isnumber(something) - returns 1 if it is a number (only number of radix
  10 suits). Useful in argtxt validation.

19-07-04, Furio
- Fixed compatibility issues with Linux for isnumber(something).
- Added TAG.DIALOG_NAME to MEMORY_GUMPRECORD. The tag contains the name of the 
  dialog opened. Special case are the .admin gump (clientlist), the hair dye
  gump (hairdye), a guild hardcoded gump (guild) and if no name is found
  (undef). Hope that this will help in checking what gumps are opened on client
  screen.
- Added SDIALOG command. It works like DIALOG with the difference that it'll
  open a dialog only if it's not present on the client screen.
- Fixed a thing in DISGUISEVERSION. Now .[x]show version shows the disguised
  version.

20-07-04, Vjaka
- Fixed compatibility issues with Unix for exceptions
- Added MODAR (MODAC) working on items as well. Now it is for both items and
  chars.
- Fixed startup sequence - now tryes to bind a socket before loading the world
  saving time on running multiply instances.
- Fixed Windows version buffered output flushing. Also removed log file
  buffering.

21-07-04, Kell
- Fixed some compilation issues under Linux (just missing some (DWORD) casts).

22-07-04, Furio
- If PAYFROMPACKONLY (default: 0). is enabled, in the char status only gold from
  pack is displayed.
- Fixed minor things on default messages.

22-07-04, Vjaka
- Added server state functions f_onserver_save, f_onserver_save_ok and
  f_onserver_save_fail. Arguments are ARGN1 - force save? and ARGN2 - save stage
  (for background saves). For f_onserver_save the ARGN1 is writeable and return
  1 cancels the save.
  Please note, that if background saves are enabled, these functions will be run
  tons of times during the worldsave process (at least 6144 [sectors amount]
  times).
- Added f_onserver_start function triggered server start.
- Created knownbugs.txt file to be distributed with sphere revisions.

---- 0.55 R4.0.3 --------------------------------------------------------------
---- * not released
---- * unofficial release [unallowed]

23-07-04, Vjaka
- Added some more exceptions debugging. It is going deeper and deeper to engine.
- Added MAXITEMCOMPLEXITY (default: 25) - the amount of items in one tile so
  start showing "too many items here".
- Added MAXSECTORCOMPLEXITY (default: 1024) - the amount of items in one sector
  to start showing "x items too complex".

24-07-04, Vjaka
- Removed instant logout in guarded areas. use REGION_FLAG_INSTA_LOGOUT instead 
  if you wish instant logout.
- Added console commands history of 5 latest commands in Windows version. You 
  can scroll them using UP key.
- Added one minute delay after take of an item from trade window before 
  accepting the deal.

25-07-04, Vjaka
- Added smsg/smsgu shortcuts for sysmessage/sysmessageua (note, that msg already
  existed as a shortcut to message)
- Added SKILLCLASS properties - if written like SRC.SKILLCLASS.NAME, returns 
  <SERV.SKILLCLASS.<SRC.SKILLCLASS>.NAME>
- Started doing ARGVCOUNT and realised that <ARGV> is the amount of ARGV[x] 
  variables. Noting that as not found in revisions.
- If player speech longer 5 chars and has 75% capital letters inside, it will 
  come out in lower case. Works for english chars only. And as for unicode - if
  EF_UNICODE is set.
- Added GUILD properties: <SRC.GUILD> returns 0 or guildstone UID,
  <SRC.GUILD.NAME> returns guild name
- Removed all old PLOT bit stuff. Use EVENTS instead
- Changed CLEARTAGS - it takes optional argument, clearing tags only if matching
  the string (does not support wildcards)
- Added HITS and MAXHITS to items (same as MORE1L and MORE1H). Note: this is
  valid for armor and weapon object.
- Telnet has a username. So, Administrator or RemoteAdmin login left for local 
  logins (127.0.0.1) if LOCALIPADMIN enabled

25-07-04, Furio
- Hopefully tracked down and fixed the arrow bug, and similar problem derived 
  from NEW (big thx to Handred that finded the point where start looking at for
  the fix).

26-07-04, Vjaka
- Fixed broken TEVENTS read method on chars.
- Added QVAL(test1,test2,res1,res2,res3) in addition to current <QVAL?:>
  variant. It is useful if dealing with numbers without many IF-s. Sample 
  <eval qval(<VAR.X>,<VAR.Y>,<VAR.ONE>,<VAR.TWO>,<VAR.THREE>)> will return
  <VAR.ONE> if <VAR.X> < <VAR.Y>, <VAR.TWO> if they are equal, and <VAR.THREE>
  if the it is greater. If some of the arguments are omited like qval(1,2,,3) it
  will default to zero.
- Changed REGISTERSERVER to default an empty string. If you wish to register to
  list.sphereserver.net, specify REGISTERSERVER=1 or it's host.
- Added TELEPORTEFFECTSTAFF, TELEPORTEFFECTPLAYERS, the teleport effect for
  staff (use hex id of object or 0 here) (default: 03709 for staff, 0372a for
  players).

27-07-04, Furio
- Fixed an issue with MOVE/XMOVE command.

27-07-04, Vjaka
- Added command line switch -Gpath/to/saves/ to defrag sphere server UIDs. It
  is done because sphere UID management routines has flows which makes not to
  reuse empty uids, but generate new, higher. Howewer, space for lower unused
  objects is still reserved. It saved 400Mb me (from 600Mb on start to 180Mb)
  working for 2.5 hours, but caused all mounts to disappear, maybe some more
  flaws. So, use on your own risk. In future versions for 4.0.x Furio is going
  to improve the uid subsystem and this will not be needed anymore.

28-07-04, Vjaka
- Changed FILELINES to close the file and READFILE if line number is too big.
- Added DISMOUNT verb on char to dismount him, MOUNT to get UID of ridden one.
- Fixed an issue with SERV.CLIENT.x. causing exceptions.
- Removed 0.55R from version. It is a complicated notation. It's 4.0.x now.
- Fixed MODAR not updating armor class if changed on char or equipped item.

29-07-04, Vjaka
- Limited allshow to MAXCHARCOMPLEXITY*4.
- Fixed issue when telnet connection could not do resync load after pausing.
- Account now has TAG.LastLogged with his previous login date. It is shown upon
  login if quick/no-messages login not selected (by @Login trigger).
- Fixed msg_criminal to be shown only if person is not a criminal yet (lags).
- Added read-only COMP reference for multis. Returns amount of components when
  called with no params, and has attributes: ID,D,DX,DY,DZ (D mean delta).
- NPC wishes gold and vendable items (not limited to desires listing).
- Added ARGN2 to @NPCLookAtItem (writeable) - the percent level the the NPC
  wish this item. If set high, he can loot the item.
- Added GMPAGES and GMPAGE.* verb to access gm pages from scripts. You can
  give arguments like you do to .page command, and use 2 specials - DELETE to
  delete even not-taken one, and HANDLE [uid] to mark gmpage for character.
  Also GMPAGE.x.HANDLED field returns UID of person taken the gmpage.

30-07-2004, Kell
- Added ACCOUNT.NAME

30-07-04, Vjaka
- Speed optimisation working with strings & possible some stack overflow out.

31-07-04, Vjaka
- Fixed several spells (like mark) casting in not allowed region when running.
- Fixed KILLS removal using multi-uo client.
- Changed @Logoff to take 2 writeable arguments: ARGN1 - linger time and ARGN2
  instant logoff flag. Return 1 in logoff is now obsolete.

01-08-04, Vjaka
- Added triggers @MurderDecay (ARGN1 - murder count that will be set, ARGN2 -
  decay time to set for the next kill) and @MurderMark (ARGN1 - murder count
  that will be set, ARGN2 - set criminal flag?). The names are descriptive.
- NPC is now trying to move objects blocking his walkpath. He also investigate
  the possibility to loot this item in several cases. Triggers look@item not
  called since if there are tons of items in the spot, it will be very laggy.
- Added @Rename trigger (ARGS - new name, ARGO - target char) when renaming a
  pet. Return 1 cancels. Also triggered when creating character.
- Items with ATTR_STATIC are now saved to spherestatics.scp and NOT SAVED by
  standart world save. So, you need to call .serv.savestatics to save them.
- NPC is now trying to cast good spells as on self and his combat friends also.

02-08-04, Vjaka
- Calling guards are now more speed optimised.
- Defrag mode now supports spherestatics.scp and is much faster.
- Changed FACE and SALUTE to take an optional argument - target object.
- Characters on the way do not disallow GM to place a house anymore.
- Items gets stacked one on the other witheen some height if possible.

03-08-04, Vjaka
- Exceptions catching fixed, some stack information added.
- Added CLEARVARS being same as CLEARTAGS.
- Fixed CLEARTAGS to work normal without arguments.
- Now VENDORMARKUP is taken from region tags if not found on a vendor.

04-08-04, Vjaka
- Default messages working optimised for speed. Removed OF_SkipUndefMsgs.
- Removed OF_Skill_DiffFirst since the actdiff is calculated in any case.
- Started implementing EF_Pathfinding.

05-08-04, Vjaka
- Fixed SERV.ITEMDEF reference to object not being currently in the world.

06-08-04, Vjaka
- Added SERV.resync to resync scripts without the resync delay.
- Now adding a new account automaticaly fills (FIRST/LAST)CONNECTDATE.
- Added @SkillMenu to trigger BEFORE calling any hardcoded skillmenu. So, you
  can return 1 to cancel the action. ARGS - the name of the menu, is one of:
  sm_polymorph, sm_carpentry, sm_bowcraft, sm_tailor_leather, sm_tailor_cloth,
  sm_bolts, sm_carpentry, sm_cartography, sm_tinker, sm_summon, sm_blacksmith,
  sm_alchemy, sm_cartography, sm_inscription.

07-08-04, kuch
- Finished the conversions of default messages into the new format: this should
  greately improve the execution speed.  Also updated sphere_msg.scp to fit new
  format.  Read the comments inside the file to get more more infomation.

09-08-04, Vjaka
- Added DISGUISENAME to alter the name of the server.
- Added REPLYPEERCONNECTS (default 1) to allow masterserver and peer connects.
- Fixed duplicating hungry messages search.

10-08-04, Vjaka
- Fixed NPC moving some items not actualy blocking their way.

11-08-04, Vjaka
- Added console commands auto-completion on using TAB key. File sphere.dic is
  read for the list of definitions. Note: this file SHOULD BE sorted (at least
  witheen each separate first letter) to multi-matches to work correctly.

12-08-04, Vjaka
- Added @ItemCreate triggered when an item (ARGO) is created by a client.
- Added auto-completion to telnet connection. The difference from winconsole is
  that it fills the word up to end ONLY if there is exact 1 variant, or if
  other variants contains this one in self.

13-08-04, Vjaka
- Optimised sysmessages - now nothing is sent to client if the message is empty.
  This is useful to clear default messages. If wish to scroll line, use space.
- Fixed exploit to crash clients by renaming pet with some special color. Thanks
  TheLegbra reporting that.

15-08-04, Vjaka
- Added EF_Script_Profiler (08000) to add information on functions usage for
  weak places (functions or triggers) to be optimised.
- Added EF_Size_Optimise (010000) to save WORLDITEM/CHAR/SCRIPT as W*. This is
  not much for now, saving 7+ bytes per object. Loading supports any method.

03-09-04, Vjaka
- Added OverSkillMultiply (default 2). When player skills/stats goes this times
  more than skillclass allowed, drop them to skillclass level. Setting this to
  0 disables the action.
- Added ACCOUNTS BLOCKED/JAILED arguments. Works exactly like UNUSED, but just
  applyes to the blocked/jailed accounts only.
- Only chars in mapplane where the player is are ticked now (lag reduction).

04-09-04, Vjaka
- Added ## command to console to save both world and statics.
- Added X# command to instant shutdown the server with world/statics save.
- Changed "commands uid=... (name) to ''" to show amount if above of 1.
- Server startup crash fixed

08-09-04, Furio
- Fixed issues for the Linux build.
- Disabled information abou "Key" on OnTriggerRun exception for compatibility 
  problem on the *Nix build. (temporary solution)
- Added .pid file (sphere.pid) on *Nix build, for those who want to write bash
  script for checking sphere process easily.

08-09-04, Vjaka
- EF_Pathinding is working perfectly making NPC to select a best path. Howewer,
  for maximal speed it is yet checking only static objects blocking his path.
  More testings on the speed needed before making it to include dynamics checks.
- Fixed Counselors losing their invis status after worldsave.

10-09-04, Vjaka
- Memory information is now got from system routines instead of internal one. It
  will cause this info to appear in UNIX builds, howewer, it will be not be in
  WINDOWS systems where PSAPI.DLL is not available (fe: Windows 95/98/NT4.0).
  Also this makes ALLOCS useless, since there is no way to get it.
- Added CLIENTS property for sectors and regions to get active clients count.

11-09-04, Vjaka
- Added EF_Clients_Thread (020000) to split clients handling to to other thread.
  This will work only in windows build and is not recommendable to change on fly.
  This is VERY experimental yet, since sphere is very singlethreaded by design.

13-09-04, Furio
- Fixed memory information on Unix. Now it uses two different methods to get
  memory information depending on *Nix system where sphere is running.

13-09-04, Vjaka
- Fixed functions profiler to strip off arguments of a function.
- Fixed console commands like ##, x# showing unknown keyword error in console.
- Fixed murder count set always to 1 by @MurderMark.

14-09-04, Vjaka
- Fixed LOCALs in f_onserver_start/f_onchar_delete.

18-09-04, Vjaka
- Code cleanups, removed some useless (not enabled keywords), same keywords grouped
  to one variant for usage for faster work lookups:
  1. *WEIGHT[MAX]->*[MAX]WEIGHT, BRAIN->NPC, KNOWLEDGE->SPEECH, COMMENT->TAG.COMMENT
  CLI*VER*->CLIENTVERSION, DEF->ARMOR, LISTEN->HEARALL, *PRICE->PRICE, VER->VERSION
  WEBPAGEDST->WEPAGEFILE (LoadKeys)
  2. CLIENTS->ALLCLIENTS, PARDON->FORGIVE, INVISIBLE->INVIS, INVULNERABLE->INVUL,
  R->RUN, W->WALK, CLIENTS->ADMIN, MIDI/MUSIC->MIDILIST, [RE]SYNC->RESEND, ADDITEM->ADD
  FOLLOWED->FOLLOW, M->MOVE, PROPS/TWEAK->INFO, SPEAK[U[A]]->SAY[U[A]], SFX->SOUND
  SAFE->SECURE (VerbKeys)

20-09-04, Vjaka
- Fixed errors on load if setting VERSION for saves to start from litera.
- Fixed paths in resource testing commands.
- Added EF_Minimize_Triggers (040000) to call as little triggers as needed by a minimum.
- Removed some declared but unused triggers.

23-09-04, Vjaka
- Removed unused EF_Allow_Override (it was not working anyway).
- Added OF_Advanced_AI (including moving objects in the path, helping friends by magic,
  pathfinding)
- Renamed EF_Client_Thread to OF_Multithreaded (0400)
- sphere.pid file is now created in Windows builds as well.

25-09-04, Vjaka	
- Removed ADDNPC since it is already integrated with ADD command for both items and npc.
- Removed some more duplicates (some really strange) to speed up lookups.
- Added showing of option flags on start.

26-09-04, Vjaka
- Removed different mail operations not working and other code cleanups.
- Bugfix: Disabled moving gold coins to vendor stock (items shifting).
- Bugfix: Disabled moving static/immovable items from ground, spell effect.
- Bugfix: Disabled gaining spell effect by ghost other than ressurection.
- Bugfix: Mounted creature will leave no corpse on death if died while mounted.
- Bugfix: @DeathCorpse is called only if corpse is really created.

27-09-04, Vjaka
- Added ISSTUCK keyword to check if npc can move to N/W/E/S dirs.

29-09-04, Vjaka
- Optimized OF_Advanced_AI, makes NPC to remember the path, recalculating it
  not so often (depending on INT).

30-09-04, Furio
- Added OF_Advanced_LOS (0800) this disable EF_CanSeeLOS and EF_DiagonalLOSCheck
  and enable a new method to check the LOS (still testing and optimizing).
- Fixed some compatibility problems with Linux build.
- Now Linux build is compiled statically, so no more tons of version linked to
  different shared library for each distro.

30-09-04, Vjaka
- Fixed Windows build issue.
- Removed EF_CanSeeLOS, EF_DiagonalLOSCheck, moved that to default LOS checks.
- Bugfix: unable to resurrect on too low strength. Now gets 1 HP at least.
- Average profile information is now saved to worldsaves and loaded.
- Option and Experimental flags are now shown in text on .show command.

03-10-04, Furio
- Optimized some parts in OF_Advanced_LOS.
- Fixed Linux build issue.
- Added ISTEVENT for chars (npc/players) working like ISEVENT 

04-10-04, Vjaka
- Regions now does not conflict if are in different mapplanes (useful for new
  maps support). You can also specify RECT=left,top,right,bottom,map in the
  rect record, specifyed the exact map for this rect to work.
- Started redoing the code to support multiple maps. This will invalidate old
  mapplane feature which was 0..255. This is affected mainly by teleports and
  moongates since many of default ones had 255 mapplain specifyed. You should
  change it to 0, since this is only for map0.
- Added MAP property same as MAPPLANE (in future MAPPLANE will be removed)
