1998 - 2014 Synthetic Reality Co.
You have found the Well of Souls demo page. Well of Souls is a
script-driven, multi-player Role Playing Game (RPG). The idea is
to make the design open enough that you can generate your own
worlds and quests, share them with friends, etc.
This is a work in progress, but
I am into long test periods, so it is now in "Open
NEW: Call For Content! Check out the Art Submission page!
None of the actual screen layout
or artwork is final. It's just an example of the sort of thing
you can do in this program. Most big art is JPEG and can look as
pretty as you can draw it.
Most of the maps and scene
backgrounds are JPEG files drawn using Bryce 2, which I love.
Duncan2 (Stephan Schonberg) provided many terrific art
enhancements, and Josh Worts
has contributed almost all the monsters and hero skins which I
ship with the game.
I have given up on using JPEGs
exclusively however. I am now using RLE bitmaps (coerced to the
souls.pal palette file) for most 'transparent' art. The 'jaggies'
introduced by JPEG compression losses just got to be too
irritating. So, character and monster 'skins', items, equipment,
etc are RLE bmp files (and be sure to use the palette in
"souls.pal" or it will look VERY odd indeed)
Good luck figuring out the level
editor (hint: it only appears in SOLO mode: "Create your own
6/8/2008 A96 includes:
- * NEW MINI-GAME: WoS
This is a multiplayer mini-game where each player
commands an army of up to nine 'pieces' on a tile-based
map. Full details at
- * Quest Script can now
World developers begged for this, now let's see if it is
a big mistake :-)
The magic letter is 'P'
Gives 100 P. Ditto for TAKE, HOST_GIVE, PARTY_TAKE etc.
- * RIGHT-CLICK ELEMENT/HAND
So, when you 'sell' your training back for PP, you can no
longer sell yourself below your 'starting_xxx_pp' (as set
in the levels.txt table for your character class).
- * ROOM FOR MORE MISSIONS
I think there was an inadvertent size limit on the number
of missions you could have, which I have hopefully
removed. There is aprobably still a practical maximum of
number of missions, but it should be much more than 20
- * NO LONGER ENDS UP WITH NO
SKIN when world developers define default skins which
people don't have.
- * NEW QUEST COMMAND: STRLWR
This lowercases a string (which should be unnecessary
since the string comparison operators are not cases
STRLWR cookieName input
So the first argument is just a cookiename where the
output will be stored. The second argument could be any
normal thing. If you really wanted to lowercase the
content of a cookie (and overwrite the same cooke), you
would do this:
STRLWR cookieName, #<cookieName>
- * NEW QUEST COMMAND:
This allows you to 'parse' a string which contains some
number of tokens separated by some delimiter, say a
NTH_TOKEN cookieName, 3,
would result in "three" being put into
cookieName. (the first token in the string is 0). Of
course your actual string you are looing at will probably
be a cookie itself, so a more realistic example is
NTH_TOKEN cookieName, 5, #<input>,
And just to confuse the example, I included the optional
final argument which defines the actual delimiter
character to be used. (which defaults to comma, but in
this example I overrode it to a colon).
Yet another optional argument (after the delimiter) is
whether you want to clip leading spaces from the tokens
NTH_TOKEN cookie, 2. "zero, one, two, three",
will set the cookie to "two" instead of "
- * TROPHY COUNTS
You can now specify that a spell or item requires N of a
particular trophy to be used (4 bullets, 3 gold bars,
You can also specify that a spell which creates a trophy
can create N of them (if you lack bag space, no promises
are made for delivery)
So, you can now have a spell which burns 4 gold bars, to
make 2 platinum bars. Anything more complicated than that
(like 2 wings of the wyvern AND 23 snail eyes) is up to
yourmad scripting skillz.
This is accomplished by adding a couple mode dotted
arguments (see appropriate items.txt and spells.txt for
details) something like this:
So it is back compatible with existing worlds, and the
counts are assumed '1' if not provided.
* MORE TROPHY COOKIES
Generally, I resist this sort of cookie since it feels
like the world developer is the one that specified this
info in the first place, so they should just magically
already know the answers, but to the degree they help,
here they are
this one is the only read/write one and lets you control
which trophy is being considered by the rest of these
cookies. If you don't set this first, you will get
Once you set the trophyId, you can read the following:
- * New HOTKEY button bar
In addition to the popup hotkey dialog (which I always
hated), I have added a more classic button bar (OPTIONAL
and requires WoS width 1024 or more)
Anyway, it works just like the hotkey popup window. press
Fnn or clicn the button. Hold control to bind the current
spell/item to the key of your choice.
For items, the button has a picture of the item, and for
spells it has the 'element image' (new) of the spell.
Someday I could support per-spell images.
But you really only hsve 8 bindable keys (f5-f12) (did I
mention I fixed F10) ?
5/5/2008 A95 includes:
- * New Cookies
num.sceneMapFlags -- current Scene override
- * New Mission Token
In general, in the mission description and the messages
generated at accept/abandon/reward time, there will no
longer be any mention of tokens. This is because token
text, if present, is really not written in a form which
scans well as a mission statement. You are better off
using the mission text to summarize what you mean and let
the tokens be a 'secret'
But a secret hack will show the token name/description if
you use a lowercase 't' instead of an uppercase 't' in
the rewardGive/Take object strings.
- * Fixed Mission Bug
It turns out if your mission used the RewardToken
feature, it was actually applying the token change as
soon as the mission was READ (i.e. before you completed
it, and even if you never accepted it).
RewardGive/Take did not have this problem, just
- * QUEST DIARY EXPANDS
COOKIES (IN TOKENS)
The quest diary is filled with the text decriptions of
tokens your character posseses (and which are actually
defined in the TOKENs table). The token text is now
processed in this way before being plugged into the diary
* cookies are expanded
* %'s are expanded
So you could define a token's name to be:
You, %0, have been granted #<cookie>
Remember that the cookie and % is re-evaluated every time
you open the Quest diary, so if you subsequently change
the cookie value, the contents of the book will change as
- * QUEST DIARY SUPPORTS
First off, if you do nothing, your Quest Diary will look
the same as always (from the Books menu, the thing that
lists all the named tokens you have acquired).
But if you enable chapters, then your Quest Diary will
have a title page with just the chapter names, which will
then hyperlink to individual pages which list the
acquired named tokens that belong to that chapter.
You're still pretty much stuck with my simplistic HTML
formatting of the lists.
To enable the feature, you add additional lines to your
TOKENS table (please note, you can still spread the TOKEN
definitions themselves all over the place, as before, but
these chapter definitions must be inside the +TOKENS
AN illustrative Example might be:
chapter, 0, 0, 0, "Main Title", "Main
intro about all this", "Main footer to speak
chapter, 1, 0, 9, "Preamble", "General
things I have done not in any particular quest",
1,"You, %2, have agreed to obey the golden rule.
2,"Lurch The Hand has lectured you in the art of
; Quest 1, The Fire Boots
chapter, 2, 10, 19, "Feet of Fire", "There
are rumours", "the story continues..."
10,"Felafel begged you to rid his kingdom of the
11,"You conquered the cavern dragon and took a scale
from his hide."
; Quest 2, The Lost Gem
chapter,3, 20, 29, "The Lost Gem", "There
are rumours", "the story continues..."
20,"Jett told you of her grandmother's enchanted
21,"You confronted the witch Miranda, who told you
the true story of the pearl."
each line that
starts with 'chapter' is a chapter definition. Chapters
will appear in the Quest Diary in the order they are
listed in the +TOKENS table (which does NOT have to match
the order of the tokens themselves)
However, a chapter contains "a contiguous range of
token ID numbers which have not already been reported by
a previous chapter" as opposed to "a list of
arbitrary token IDs in any order you like" So, if
you have not been carefully numbering your tokens in the
past, you're a little screwed shoe-boxing this in without
renumbering tokens (a pain). Then again, your Quest Diary
must be ugly anyway if you haven't been being careful, so
So, for each chapter, you provide these fields:
chapter, id#, firstToken, lastToken, Title, Intro, Footer
Then a typical chapter page looks like this:
Chapter intro text which can ramble on for a bit and
which will line wrap as needed.
* first entry in list
* last entry in listChapter
footer text, if present.
That same basic format is also used by the Table of
Contents page, which gets its title/intro/footer from
chapter id 0 (which should have a token range of 0-0)
And the ToC only shows chapters for which you have
accumulated at least one named token. So your chapter
names are 'secret' until they trip over a token. Which is
maybe a good reason to not number your chapter titles
- UNZIPPER HANDLES READ-ONLY
The second download of a published world which included
read-only files would fail because the unzipper would
refuse to overwrite them. It would also give a bad error
message about it. Now it works, though really you
shouldn't probably include read-only files in your world.
- IMPORTANT FLAMELORD FIX
The download progress meter now more accurately expresses
your download speed in bits per second (as opposed to
- VISTA SUPPORT
I believe I have worked through the remaining Vista
issues, so it is possible now to play the game, host a
server, behind a firewall/router etc., though you may
still have to run as admin on occasion.
- MANY MIX/NETWORKING CHANGES
In the course of debugging how Vista had modified the
network layer (it changed some APIs!!!!) I found a
handful of other things to improve, so even without vista
you might find your experience better when, for example,
hosting a MIX server behind a NAT.
3/7/2007 A94 includes:
- Quicky fix for a pet bug in
3/4/2007 A93 Includes:
- * COMPATIBILITY: Excellent!
- * Max PP Change in
Evergreen, and training changes for all worlds
1.) I increased the evergreen max PP from 40K to 100K
2.) I made the PP per training click variable, so it
costs 50PP a click at the lowest level and 2000PP a click
at the highest
3.) this results in it taking only 105 clicks, instead of
225 clicks to go from nothing to level 9.0 and that costs
about 65K, leaving about 35K in your pocket if you were
at 100K when you started
4.) applying the full 100K to a single training slot gets
you to level 9.406 in about 125 clicks.
5.) there is no enforced wait time per click (not even I
am that hardcore, apparently. Same sound effect as
before, which I like and sounds ok when clicked rapidly)
6.) Getting to 9.990 still requires an insane amount of
PP, but you now invest 2000 at a time at that level,
instead of 200, so it should take 10x fewer clicks. It
takes multiple pocket fulls of PP though, and I like it
that way as I want 9.990 to mean you are truly hardcore.
Now, to answer the question "how much better is
9.990 than 9.406" well that's easy, the effect is
linear, so it is:
(9.990 / 9.406) = 1.06
so it is 6% better, but it is vastly more expensive and
represents a vastly huger effort to get that extra 6
* fixed the crazy Bring Back the Dawn Mission
- * new GIVE command to give
Remember, in Quest they are 'jobs' so you GIVE J23 to
give mission 23 to the user (pretty much means force them
to take it, so you should be sure it is appropriate. It's
- * new IF conditional to
test mission (job) status
IF Jnn @theyHaveFinishedMissionNn
IF JQnn @theyQualifyToStartMissionNn
IF JAnn @theyHaveAcceptedButNotFinishedMissionNn
- * New World config.ini
option.. read config.ini for details
- * new quest command:
SHUFFLE cookieName, numCards
which creates the following cookies
cookieName<numCards - 1>
numCards must be between 1 and 100 (100 is ok, but that
is the heighest value) and you have to be the scene host
and incarnated for it to work.
After calling SHUFFLE, you can look at
#<cookieNameCount> to remember how many
cards are in your shuffled deck. It will be 0 if there
was some problem (like you asked for more than 100)..
ok.. ok.. I will make it 256 max.
Remember, this just creates a bunch of cookies. It is up
to you to keep track of which have been 'dealt'
each cookie just holds a number between ZERO and Max-1
A better Example
; Shuffle a normal 52 card deck
SHUFFLE cards, 52
COMPARE #<cardsCount>, 0
IF= @something went wrong, should have been 52
1: The index of the first card is #<cards0>
1: The index of the last card is #<cards51>
Of course, it doesn't have to be cards
SHUFFLE monsterIds, 10
SHUFFLE prizes, 15
The shuffle command cares not how you use the cookie.
- * REWORKED WELL INTERFACE
When you return to the Well of Souls, I now default to
the RESTORE panel instead of the MAP panel (showing a
list of your characters instead of a list of who is
playing). Also, I duplicated the NEW and INCARNATE
buttons in a way which makes them more obvious to a
newbie player. PlayTesting with a certain un-named newbie
implied this would clear up an early sticking point for
the new user.
- * MINOR SCENE CHANGES
Small things like the Soul Brother no longer shoves your
Trophy Bag in your face every time you visit him.
- * HOTKEYS now default to
New players will no longer see the inexplicable hotkeys
window on their first visit to the game, but will have to
turn it on via the Book of Options. Old players will be
in the same state they were.
- * MENU COMMAND SUPPORTS
a normal menu entry looks like
"menuText=@label" but if menuText starts with a
forward slash "/menuText" then I will add a
checkMark (and not include the / in the text I show).
Hopefully no one was using /s already in their menu
- * ACTORS CAN NOW BE LAYERED
The script ACTOR command's first argument (the actor id
number) is now a dotted arg. The first value is the
actorId which has not changed. The second value
(optional, and assumed to be 0) is the display 'layer' of
the actor. If it is -1 then it is 'behind' all actors on
layer 0. If it is +1 (aka '1') then it is 'in front of'
all actors on layer 0. Within a layer, actors are sorted
by their 'y' value on screen (lower on screen means more
in front). If you need more layers, you should be able to
use... about... oh.. 2000 I think, which should be
enough. -1000 to +1000, I mean. More positive is more in
front, more negative is more in back. I only tested -1,
0, and 1 though.
This is backwards compatible (or at least it should be),
so you don't have to add .0 to all your existing actors.
This is so a 'scene actor' (say, the cave entrance) can
be permanently behind all the players.. or a 'foreground
object' like a tree can be in front (and you could hide
Though you can't REALLY hide as the nametag and chat
bubbles will probably give you away.
- * TROPHY AMMUNITION
The Items window, the Spells window, the Current Equip
window, and the SHOP dialog now all indicate if an item
or spell consumes a trophy when used. The 'learn spell'
dialog does not.
- * FIGHT COMMAND MAY NOW
INCLUDE STARING 'FACE' DIRECTION OF MONSTERS
So, another dotted argument:
monster id 23, starting at x=50, y=75, and initially
'facing left' (0 is the default 'facing right'). This
sets the initial facing direction, which will then change
as the monster moves.
- * FIGHT 0 REMOVES MONSTERS
So, you just did a FIGHT scene, it ended, and now you
want to remove any remaining monsters from the scene
(enemy or friendly, but not pets). Use "FIGHT
Note that if you had a friendly in the scene and the
fight ended, and you use the FIGHT command to add more
monsters (second wave), your pal gets to stay.
- * NEW HOST COOKIES
num.hostAttack -- aggregate attack points of host
num.hostDefense -- aggregate defense points of host
- * TITLE BAR CHANGES
I did this mostly for my own purposes, so when people
sent in screen shots I would not have to always ask them
what their serNum was, but it might be useful to you as
well, who knows? :-)
Basically I added your character name, your sernum, and
how long you have been playing the game in that session
(so as to track bugs that only happen after playing for a
few hours, for example, but you can pretend it is so you
can realize you have been playing too long and should go
for a walk or something). This information updates when
you enter/exit a scene.
10/23/2006 A92 includes:
- * MIX v1.21
This version tries to auto-detect if you have
firewall/router/port forwarding issues and puts up some
helpful little message with info which might (or might
not) help you resolve the problem.
- * PK Changes
Haven't done this yet, but plan to do some fairly radical
changes to make it possible for world developers and
server admins to pretty brutally limit (or unlimit) PK
- * New World Config.ini:
This has to be set to 1 (the default) or pets cannot bite
people in your world. Ever. Evergreen sets this to zero.
No more pets biting people. at all. on any map.
- * New World
This defines how much PP a character can have 'in their
pocket' Any PP earned in excess of that is lost.
Evergreen defaults to 40K PP max. If you do NOT set this,
it defaults to 1 million. If your world needs more (say
you have a quest that requires accumulating ten million
PP), you will need to add this variable to your
config.ini, or your quest will be broken until you do.
- * New world config:
This defaults to 80 in old worlds, and is set to 10 in
Evergreen. It prevents you from INITIATING a PK attack on
another player more than this many levels below you. If
you set it negative, then you could only INITIATE attacks
on people that many levels ABOVE you. Weird, but maybe
someone will like that.
- * New World Config:
Set this to a url which describes your world, and then a
button will appear "world home" on the
servername area of the main splitter bar. The idea is to
advertise your world, ladders, contests, whatever.
- * New server rule
as in: maxAFK=10, url=http://mypage.com
When present, this adds a "server home" button
to the main splitter bar. The idea here is to have a home
page for your MIX server, where you can talk about what
your philosophy of servitude might be.
- * More anti-hacking
measures, as usual. In general, the punishment for
getting caught hacking is increased. Sorry for any false
- * Improved image
quality for jpeg maps and scenes (especially if the
source images are very small, as they are in Evergreen)
- * More Stuff..
UNfortunately I didn't document a lot of my puttering
over the last few months, so some changes might come as a
surprise to both of us :)
2/19/2006 ALPHA 91 INCLUDES:
- SPELL ANIMATION CHANGES
- 'Dome' options should no longer be inverted
- tweaked some of the A90 ones I added, like Halo
Some new stuff in this table:
[CODE] C Accumulation of magic around caster, before it
'launches', and when it hits
0 - accumulate over caster, land in body of target
1 - accumulate within caster, land in body of target
2 - accumulate under caster, land in body of target
3 - in the body of the caster, but 128pixels away from
4 - in the body of the caster, but 128pixels towards
5 - in the body of the caster, but halfway between caster
6 - Over the head of both caster and receiver
7 - at the feet of both caster and receiver[/CODE]Some
new stuff in this table
[CODE]DD 'cloud' shape of magic accumulation
00 - tight random cloud
01 - looser random cloud
02 - loose random cloud
03 - single circle
04 - two circles
05 - single circle - vertical
06 - two circles - vertical
07 - Big round circle
08 - Halo
09 - Vertical Halo
10 - Horizontal Line
11 - Vertical Line
12 - Slow Large Dome
13 - Fast LArge Dome
14 - Slow Small Dome
15 - Fast Small Dome
16 - increasing to large radius
17 - increasing to medium radius
18 - decreasing from large radius
19 - decreasing from meidum radius
20 - Spiraling Outward Circle
21 - Spiraling inward Circle[/CODE]* NEW IF CONDITIONAL
IF<> or IF!= will go to the label if the
previous COMPARE operation yieled 'not equal'
- ASK OPCODE CAN BE
SECRET TO ALL
If you add an optional '1' like this
ASK 600 1
Then it will NOT send what you (the host) typed to the
other players in the scene.
You will still see it yourself, however. This is one of
those bits of code which I am too lazy to actually test
- BUGFIX - More support
for 64 actors
The ACTOR and MOVE commands were only giving access to
the first 32 (of 64 max actors).
- MOVE command can now
move scene host
This is non-binding since it doesn't stop the host from
moving elsewhere, but now you can move the host around
MOVE H, x, y
Could be fun. "Hero, approach the king!"
- COOKIE SUPPORT ADDED TO
I did this sort of randomly, and it's possible I might
have broken something, and missed other things. But
you used to be able to. For example the ACTOR and POSE
commands let you get all the numeric values out of
cookies, if you like.
I only upgraded numeric values, since that felt like I
would be less likely to prematurely evaluate a cookie.
Hopefully you won't even notice I did this.. knock on
- TIMER EVENTS!!
At long last, you can use timers to restart a script
after it has ENDed. You have 10 timers (numbered 0 - 9).
When a scene first starts, all the timers are turned off.
You turn on a timer like this:
TIMER 4, 7.8
This means that timer 4 will fire in 7.8 seconds from
RIGHT NOW (time starts from the moment you execute the
TIMER command, NOT from a subsequent END command.)
When the timer fires, it looks for a label like:
(where 4 is the timer ID from this example, but could be
0 through 9)
Like other events, timer events can only trigger while
the scene is ENDed (and they wake the scene back up.)
So, what are timers good for?
Well, you could maybe end a fight, change the weather,
play a sound effect, change the background, evaluate how
long it took someone to do something, etc.
If you wanted a periodic timer, you might try something
1: I will change the weather every second
TIMER 1, 1.0
TIMER 1, 1.0
So, when the timer triggers, I change the weather to a
random value 0-9 and then restart the timer for another
second (and then END again, of course!)
- SPECIAL TIMER TRICKS
cookie: 'num.timerLengthN' returns length of timer N in
cookie: 'num.timerLeftN' returns number of msec left in
timer N (before it will trigger.. assuming you END again
TIMER N, 0 -- kills timer N
TIMER -1 -- kills ALL timers
Please don't be confused by my lazy implementation. I let
you set the timer by SECONDS (like the WAIT command), but
the cookie reads time left as MILLISECONDS... I only
added the cookies so you could do things like praise the
player if they finished some action with lots of time
- BUGFIX - NO MORE CAMP
Sorry. And thanks to Pippin (and others) for clearly
documenting the procedure.
- GENDER-SPECIFIC PAIN
I think this is probably a slippery slope here, since
ultimately people should be able to specify their own
favorite sounds.. but for NOW, the enhancement is that
the gender.ini file can optionally override the pain
sound used for players when they get hurt.
Add a line like:
which will make it play pain10.wav when a player of that
gender is hurt. I know it's weird to have
"pain1.wav" on the left instead of just
"pain" or "painSfx" but that's life.
Gender.ini is all about 'translation'
- COMMAS IN MONSTER NAMES
AND SKIN NAMES ARE REMOVED
Turns out that a comma in a name would lead to corrupted
packet handling. I'm afraid commas are not legal in these
fields, and hence "Konan, The Destroyer" will
now appear as "Konan The Destroyer"
- CURSED TROPHIES
If you set the 'gold per stack' value to a negative
number, then the holder of a trophy cannot 'sell' the
trophy, but instead has to 'pay' the shopkeeper to be rid
of it. Neither can the trophy be discarded or given away.
Something like a 'healing fairy heart' from something you
killed that shouldn't ought to have killed, and now must
carry your shame with you. (and yes, Cowardly PK Kill
Hearts are my intended ultimate target for this :) )
Note that if the price is over 1 million (and the stack
size is 1), they can't get rid of it. Which is probably
pretty nasty since it consumes a trophy bag slot. An NPC
could remove it, of course.
- AMMUNITION TROPHIES
This is a very simple implementation. Basically in the
ITEM and SPELL tables is a new field
If you set this to a non-zero value, then the player
cannot use that (right-hand) weapon, or cast that spell,
unless they have at least one of the specified trophy
(and a trophy is then removed from their bag). This does
NOT affect 'use item on yourself' just right-hands and
spells. (in the case of a wand, where the right-hand does
a spell, it uses the ITEM trophy and not the SPELL
trophy.. I think).
For example, see the Evergreen 'Rubber Balls' DART (now
consumes a green jelly pigment) and the spell GEL (which
also consumes a green jelly pigment)
- RESIDUE TROPHIES
Also in the ITEM and SPELL tables are new arguments for
'trophyMade' When you use a right-hand weapon, or spell,
with one of these, then that trophy is added to your bag.
These could be good things (the 'mining' spell resulting
in 'gold nuggets' appearing) or bad things (using
'armageddon' giving you a 'cursed spark' trophy)
For example, see the Evergreen GEL command which consumes
a Green Jelly Pigment trophy, but creates a Slobber
And sorry, only one ammunition per thingy, so you can't
use this to trivially do things like "this spell
consumes 4 jellies, 5 earwigs, and 14 gondolas to create
one hand of flax" You have to do that sort of thing
with a script. Though with the miracle of subroutines,
you should be able to make that data-driven within your
And I extended the property editor to support these.
- NEW SLASH COMMAND:
Opens the trophy bag.. if you have one..
- NEW TROPHY TABLE
Arg 9 of the trophy table is now a 'flags' field which
1 - no sell
2 - no give
4 - no discard
This limits right-click menu functionality on the trophy
bag. Scripted NPCs can disobey these settings.
- NEW ACTOR ARGUMENT:
The script command to add an ACTOR to the scene now lets
you specify its 'pain' sound effect as well.
The full list is now:
ACTOR <id>, <nam>,
And without this, they should be silent. (so all old
worlds will suddenly have silent-when-hit actors.
Blame... um... Crusard!
- NEW QUEST BOOLEAN
Not sure if anyone would ever really NEED these, but they
let you do 'bit-wise' boolean math. They work just like
the ADD instruction in that they start with a cookie,
then modify it per the instruction. NOT is a bit odd
since it requires no second argument.
AND cookieName, 1 (contents of cookie 'ANDed' with 1)
OR cookieName, 12 (contents ORed with 12)
XOR cookieName, 8 (contents XORed with 8)
NOT cookieName (contents ones-complemented)
- NEW IF CONDITIONS: EVEN
I can't believe I added this. How lazy can a world
developer be, hmm? But here you go:
And there is no such thing as 'neither odd nor even' in
- ACTOR CLICK EVENT
INCLUDES TRANSPARENCY CHECK
When you get an onEventActorClick event, you can look at
and if it is not zero, it means they clicked on a VISIBLE
(not transparent) part of the actor skin. If you don't
check this, then it just means they clicked somewhere
inside the actors skin rectangle.
OK OK, this doesn't work. Sorry. It will only work if you
actor uses pose 0 of its image strip, and that image
looks the same when 'flipped' Sorry.
To make up for that false alarm, I give you two more:
These are set to the offset inside the actor rectangle
where you clicked, in 'pixels' (not in screen
percentags). (0,0) is the top left of the rectangle.
- NEW CONDITIONAL TEST: J
Yeah yeah, I ran out of letters. Must mean the game is
just about complete :)
This allows you to test if the host has completed a
mission (see below).
IF J23, @hasDoneMission 23
This is actually a pretty big deal and I hope I left it
general purpose enough to be used for lots of stuff.
Basically, with trophies we got the ability to make
simple 'collection' quests (hereafter called 'missions')
where your hero needs to go achieve N things and in
return gets some reward. Without necessarily requiring a
lot of scripting or scene work. Though, as you will see,
Missions are handed out by NPCs in scenes via the new
Please read the Evergreen 'missions.ini' file for
details, but the flow is something like this:
1.) You define your missions in worldFolder/missions.ini
2.) Each mission has a name, description, some message
text, a requirements list, a needs list, and a set of
3.) You issue missions via the new MISSIONS script
command, which generally acts a lot like the OFFER
command, adding a MISSION button in the scene.
4.) Pressing the MISSIONs button opens the 'Available
Missions' dialog which shows a list of all the missions
offered in that scene, for which you meet the starting
5.) You can ACCEPT a mission, at which time it becomes
OPEN/IN PROGRESS. At any time, you can ABANDON a mission
to get it off of your open missions list.
6.) You can review your OPEN MISSIONs list at any time by
using the Book menu "Book of Missions" and see
the progress you have made towards completing each
7.) When you have met the mission requirements, a
'collect reward' button will appear. Press that and you
will collect a reward. (and the mission will be marked
'DONE' and thereafter only appear on the 'review past
8.) Each mission specifies a "Qualifies" string
which is a conditional just like that used in the quest
IF command. So you could say:
Meaning to qualify you must be Level 3 or above, have
token 4, but NOT token 7, and you must have completed
mission 23 (yeah yeah, 'J' Ok, call it a JOB and then it
sounds like I planned it)
9.) Each mission specifies a "Trophies" string
which is a list of all the trophies you need to acquire
before the mission is complete. For example:
Meaning you need five trophy 1s, 10 trophy 23s, and 100
trophy 16s to complete the quest. When you collect your
reward, these trophies will be removed from your trophy
10.) each mission provides one or more of the following
- abstract item
By Abstract Item I mean:
which could be S15 (spell 15), etc. The same syntax as
used by the GIVE command. Which can also give Gold and
Tokens, so it's a little redundant and I leave it to you
to best decide how you want to use it.
11.) In the trophies table is a new field 'flags' and one
of those flags is 'mission only' which means a monster
will only drop it if it knows it is needed by one of your
12.) Mission Sound Effects (which you should be able to
override by world or theme, as well as any other sound)
missionTrophy.wav -- each time you get a mission trophy
- HOLIDAY COOKIES
This is a little silly, and you can test the date
yourself, but there is some small advantage to this since
I do things like "3rd monday in may" and
"easter" calculations for you which are
slightly non-trivial. You probably won't find your
favorite holiday here, but hey, that just means you are
some godless commie and not a member of the one true
greatest country on earth! Denmark!
[CODE]Holiday ID numbers:
#define HOLIDAY_NONE 0
#define HOLIDAY_BIRTHDAY 1
#define HOLIDAY_EASTER 2
#define HOLIDAY_THANKSGIV 3
#define HOLIDAY_XMASEVE 4
#define HOLIDAY_XMAS 5
#define HOLIDAY_BOXING 6
#define HOLIDAY_NYEVE 7
#define HOLIDAY_NYEAR 8
#define HOLIDAY_GNDHOG 9
#define HOLIDAY_VALENTINE 10
#define HOLIDAY_STPAT 11
#define HOLIDAY_APRILFOOL 12
#define HOLIDAY_EARTHDAY 13
#define HOLIDAY_CINCOMAYO 14
#define HOLIDAY_MOTHERS 15
#define HOLIDAY_MEMORIAL 16
#define HOLIDAY_FATHERS 17
#define HOLIDAY_CANADA 18
#define HOLIDAY_JULY4 19
#define HOLIDAY_LABOR 20
#define HOLIDAY_COLUMBUS 21
#define HOLIDAY_HALLOWEEN 22
#define HOLIDAY_VET 23[/CODE]And the cookies are:
num.holidayID (if this is 0, its not a holiday)
str.holidayName (e.g. "Christmas")
str.holidayGreeting (e.g. "Merry Christmas")
My goal was to make it easier to have easter eggs in
scenes, which only triggered on special days.
The BIRTHDAY holiday is the annual birth day of the WoS
character you are using. (It remembers the day of the
year you made the character)
All holidays last for 24 hours from local midnight.
- GENERIC WORLD TABLES
So, say your world has need for a lot of tabular data..
stuff that the WoS engine doesn't need to know about
directly, but that you use in your scripts a lot. Say you
have your own skill system, or potion making formulas or
anything else which can be defined by rows of columns of
data in a table.
First the limitations. No more than 100 tables (stored in
your world folder in files called
"DevTableNN.txt" where NN is 00-99)
No real limit on the number of rows in a table (one line
of text in your file is a row), but smaller is faster.
each row is a bunch of comma-separated values (just like
a QUEST file, only YOU decide what the columns mean.) You
are limited to 30 columns and each row of text must be
less that 4000 characters wide.
You can pepper your table with comments, where anthing on
the line after a 'semicolon' is ignored.
Each column can have an arbitrary string (max length of
100 characters per string, I think.. well, same as for
QUEST whatever that is MAX_PATH in computer terms.. minus
a couple). It can be a number or text, but you should put
text inside double-quotes.
You can NOT use #include in a DevTable.
You do NOT put QUEST commands in a DevTable.
The first argument on each line is its "RowId"
and should be unique. It can be a number (like I do with
spells and such) or some text if you like. But each row
needs a unique id (unique within that one table file).
When you ask me to look for a row by its id, I am going
to start with the first line of the file and keep looking
until I find it or the end of the file.
Remember, WoS will do nothing with your devTables other
than fetch values from them (via cookies). And these are
read-only, like the quest files. (Developer can edit
them, just like quest files, but for the end player they
do not change.)
They are included in the world version, so tampering will
result in a 'modified world'
Example Table: DevTable32.txt in your world folder
[CODE]; This is my table of skins used in my mini-game
; ROWID, COL1=Actor#, COL2=SkinName
Butter, 1, "Jumping Butter Can"
Cheese, 2, "BlueCheese"
; Note, dan doesn't read these comments
; so that stuff I said about COL1 is just for
me[/CODE]Then, to read the table in my SCENE script, I
need to do three things:
1.) select the current DevTable
SET num.DevTableId, 32
2.) select the current ROW of the table
SET str.DevTableRowId, "Butter"
3.) fetch one of the COLUMNS of information
1: the skin name is #<str.DevTableCOL2>
- EVEN MORE COOKIES
str.worldName - name of current world being played (may
not be capitalized in any particular way)
item.desc - long desctiption of item
item.ap - ability points provided by item
item.fp - find probability of item
event.missionId - id associated with @eventMission event
str.actorNameNN - name of actor NN in this scene, if any.
- MISSION EVENTS
OK, these only work, like all 'events' if you are in a
scene, are the host of the scene, and the scene is
currently ENDed. They bring the scene back to life at the
@label matching the event description.
You can then ask for cookie "event.missionId"
to find out which mission is being talked about.
@eventMissionAccepted - they pushed the accept button
@eventMissionAbandoned - they pushed the abandon button
@eventMissionRewarded - they collected their mission
Remember, they can do the Abandon or Reward anywhere they
like, so don't depend on seeing these events inside of
any particular scene (or even at all, since they can do
these actions outside of scenes). These events are just
for happy friendly NPC acknowledgements, and maybe some
'extra value' for those players who DO go all the way
back to the scene which offered the mission in the first
- NEW MAP FLAG - NO_ITEM
MAP_FLAG_NO_ITEM 0x00100000 1048576
// No using of items in the scene
10/15/2005 ALPHA 90
- * COMPATIBILITY:
- * BUGFIX - Bug in CALL
- * BUGFIX - Crash when
- * NEW FLOATING POINT
These work just like their integer counterparts, but do
not truncate the result to an integer
(and also do not limit you to a max value of 2 billion.
HOwever, you should understand the trade-off between
precision and accuracy. Just because you can now claim to
have a trillion gold pieces, you could not add or
subtract a single gold piece to that value. Internally I
am using 'doubles' but there might be some digit
truncation when saving to cookies. I think I can
guarantee you at least ten significant digits.)
- * NEW RULE COOKIES
You can now see what the current server's rules are set
Note these are all read-only (like most stock cookies).
and minVersion uses that same decimal version number as
num.wosVersion (described below)
- * PARTY LEADER CAN
MANUALLY BOOT MEMBERS
I feel a little bad about this one, since I originally
omitted it intentionally, wanting the game to encourage
partying and avoid being exclusive.
But people DO grief you by joining your party without
permission, go afk, etc. So every other game has a BOOT
command, so now WoS does too.
- * EVEN MORE TROPHY
Each trophy can be assigned to up to 10 RANGES of monster
IDs. For example, an argument like this:
means the trophy can be dropped by:
Monsters 3 through 6
PLEASE tell me that is ENOUGH already! :)
- * WORLDS CAN PROVIDE
THEIR OWN FONTS
I didn't really TEST this, so who knows if it actually
works or not. But it didn't break evergreen, so I am
Basically, if you add a .ttf (TrueType Font) file to your
World's root folder (the same folder that has quest.txt
in it), then I will try to tell windows that it exists,
at least for the duration of time that WoS is running.
This SHOULD make it available to your Scrolling World
Story and/or html pages. Maybe. Good luck!
- * TERRAIN CAN BE
CROSSED BY TOKEN, AS WELL AS BOOT
The TERRAINS table now has an *optional* arg3 which lets
you specify a tokenID which allows crossing that terrain
(without requiring boots). This was a great suggestion,
Hesacon. (learn to 'swim,' get token, be able to cross
- * WORLD DOWNLOAD LIST
CAN NOW BE SORTED
By clicking on a column header. This one's for you,
- * NEW COOKIE -- Gives
You will probably need to experiment a little to
understand the value. When you see 'A90' it is actually a
hexadecimal number. This cookie will give you the decimal
version of that number.
A90 = 2704, for example. (But A89 is *NOT* 2703)
- * MONSTER LEAVE SCENE
AFTER KILLING YOU
As opposed to just standing out of view, ready to attack
you again as soon as you reincarnate.
There is a chance some worlds depended on the old
behaviour (but I only ever heard complaints about the
behaviour, so I hope it was OK to fix it.)
- * DE-LEVELLING FROM 100
to 99 NO LONGER CRASHES
I didn't actually TEST this, of course, but in theory if
you are wearing level 100 equipment you you de-level to
99, you will just end up with that equipment removed.
- * NEW SPELL PATHS
[CODE];DD 'cloud' shape of magic accumulation
;00 - tight random cloud
;01 - looser random cloud
;02 - loose random cloud
;03 - single circle
;04 - two circles
;05 - single circle - vertical
;06 - two circles - vertical
;07 - Big round circle
;08 - Halo
;09 - Vertical Halo
;10 - Horizontal Line
;11 - Vertical Line
;12 - Slow Large Dome
;13 - Fast LArge Dome
;14 - Slow Small Dome
;15 - Fast Small Dome[/CODE]And those same options should
work for the 'attack' cloud shape (cloud over target)
- * COOKIE PROTECTION
Please do not believe that cookies are 100% secure now.
And if a cookie is violated (in the opinion of the code,
which could easily be wrong) the only punishment is that
I count how many times it happens, and let the world dev
read that count with a new cookie:
Take that with a grain of salt. Cookie protection
defaults to being turned OFF, but world developers can
enable via their config.ini file with this setting:
cookieProtection = 1
There are three possible values:
0 - no protection at all (the default)
1 - only cookies whose name starts with 'secure' are
2 - all developer-created cookies are secure.
It should be reasonably safe to turn cookie protection
ON, but once on, you should (your world should) never
turn it off (or reduce its level). To do so will probably
end up getting all existing characters 'marked')
Anyway, this is, I hope, a gentle introduction to cookie
security which, while probably not being very secure,
should not actually screw anybody up.
- * MONSTER FIRST HIT NOT
It is a little known fact that monsters in a scene 'rest'
when they are not hitting you, and the more rested they
are, the harder they hit you (all else being equal). As
of A90 they no longer appear in scene fully rested. They
start with a random restedness. This means the first hit
by each monster in the scene will no longer always be
their max hit.
10/08/2005 ALPHA 89
- * COMPATIBILITY:
Excellent! - But you will only be able to play with other
- * TROPHIES CAN BE GIVEN
It works a bit like giving gold. First you open your
trophy bag and right-click on a slot containing something
you would like to give away.
The popup menu now includes a GIVE option.
After selecting that, the cursor will change to the new
'trophy' cursor and you can left click on someone in the
scene to give them ONE of the selected trophy.
Sorry, I lack the ability to give them the entire stack
at once, isn't that stupid?
But to make it slightly easier, I leave the cursor active
so you can give one after another.
To clear the cursor, you can: close the trophy bag,
select some other cursor, or empty out the slot in
The item given event will have an itemId of -1, and a new
cookie 'trophyGiven' with the trophy id.
- * NEW TROPHY BAG
If you hold the SHIFT key down while dragging trophies
from one slot to another, it will move only ONE, and not
the full stack. You can only use this to drag to an empty
slot, or a slot which already contains the same sort of
thing. Amongst other things, this is how you pull a few
off the stack to sell less than the full amount.
- * NEW MIX RECENT
The dialog with the list of MIX servers on it, now has a
little activity meter that lights up when you select a
server (before you connect to it). This shows you how
many people are on the server NOW (redundant), how many
have visited in the last 20 minutes, the last hour, and
the last day.
The idea here is to let you see that even though a server
may be empty RIGHT THIS SECOND, that it is actually a
pretty active place and maybe it would be worth your time
chilling in it for a minute, rather than just jumping to
the server with too many people in it :)
Honestly, I put this in more for Arcadia (which shares
the same code), but I think it has some usefulness in WoS
- * New TNL METER.
I added a little horizontal meter just under the chat
splitter bar. (It shows only if you have the splitter
pulled up enough to show the server name bar, which I
notice a lot of peopler don't seem to do. In fact, screen
shots NEVER seem to include the server name, which
troubles me for some reason. Do people even know about
the splitter? Do people ever resize the window?)
ANYWAY, it's a meter showing how far along you are in the
XP to your next level. And, just to be COOL, I made the
newly-earned XP glow for a second or two.
- * INTEGRATED UNZIPPER
I merged the Arcadia unzipper into WoS, so that most
players no longer will need to install WinZip to download
and install new worlds.
World Developers will STILL need to install winZIP to use
the /publish command which I HIGHLY RECOMMEND USING. Plus
the world patching is easiest with winzip as well, IMHO.
Anyway, I tried all the existing worlds and didn't find
any problems, so hopefully my unzipper doesn't have any
serious flaws in it.
- * SPECIAL SURPRISE FOR
PREVIOUSLY BANNED PLAYERS
I won't ruin the surprise. But it will be an unpleasant
one, I am pleased to announce. It's not too late to get
your act together when playing online.
- * NEW CONFIG.INI ENTRY
World Dev's can optionally make GP ungivable in their
world (I mean player to player GP giving), see evergreen
config.ini for details
- * NEW COOKIE -
This shows the total PP earned by the scene host for the
life of that character. Hopefully this will be used for
complimenting hard-working players and not some sort of
"I caught you auto-clicking your way to PP"
- * CAN NO LONGER CHARM
I have mixed feelings about this, since the concept of
trying to charm an opponent's pet away from them, has a
certain.. charm. But it didn't work really anyway and it
led to oddness like charming your own pet in battle.
To be clear, you can still (occasionally) charm
MONSTERS... just not monsters who have already been tamed
into being someone's PET.
- * MULTIPLE MONSTERS CAN
DROP THE SAME TROPHY
A89 allows you to have up to 10 monsters drop the same
trophy (but all with the same probability).
So in the column where you used to put the single monster
ID, you can now use the dotted arguments, as in:
Meaning this trophy can be dropped by monsters 12, 76,
23, or 199
- * NEW PATH
POSSIBILITIES FOR SPELL CASTING
; C Accumulation of magic around caster, before it
; 0 - accumulate over caster
; 1 - accumulate within caster
; 2 - accumulate under caster
; 3 - at level of caster, but 128pixels towards target
; 4 - at level of caster, but 128pixels away from target
; 5 - at level of caster, but halfway between caster and
- * TROPHY 'SELL' MENU
NOW USES LOCAL WORD FOR 'GP'
Sorry I missed that before. It will not say what you have
in your config.ini file
- * LEVEL UP MESSAGES
INCLUDE NOTE OF HP/MP GAINS
*** Hesacon is now a level 100 Pundit ***
Your HP rose by 29 points.
Your MP rose by 20 points.
- * SERVER VARIABLES (at
Note that I am not calling these server cookies any more.
I appreciate how everyone thinks this is simple stuff,
but it's not :) However, I think I give you a PRETTY good
illusion of simplicity.
Here is how it works from the point of view of a world
1.) New Quest Command: SET_SERVER_VAR used like this:
SET_SERVER_VAR categoryName, variableName, value
This then stores the value, on the current MIX server, in
a file just for the current world, in a section of that
categoryName, with a variable Name as shown.
If you were to look on the MIX server itself, you would
see a file added like this:
And inside that file you would see:
2.) New Quest Command: GET_SERVER_VAR
You use this one like this:
GET_SERVER_VAR cookieName, categoryName, variableName
(note: this is like the SET command where the cookie name
is NOT wrapped in #<> unless you are using
some form of cookie indirection.
You need the cookie to 'hold' the value once it is
fetched from the server. After it is fetched, you use the
cookie itself as normal. But the cookie is NOT the server
variable, it is just the last fetched copy of the server
variable. You need to use the GET_SERVER_VAR command
again if you want to see what the current variable value
Now, the MIX server is probably running on a distant PC,
so the GET_SERVER_VAR command is not instantaneous. It is
a bit like the WAIT command in that the script will jam
up at that point, waiting for the value to be fetched. In
fact, it will time out after a few seconds and just
return a value of "" so that the script is not
3.) Changes are published to all players on the server.
What this means is that if I do a SET_SERVER_VAR on my PC
(that is to say, I host a scene who does that as part of
its script), not only does it set the variable on the
server itself, but it informs all other players on that
server that the value in question has changed.
This allows them to keep their own local copy of the
variable up to date, since:
4.) Variables are cached on each client.
What this means is that after you do a GET_SERVER_VAR to
pick up a variable, its value is cached locally. If you
then ask again, it doesn't really ask the server, it just
gives you your locally cached copy of the value.
This would normally suck, except the miracle of step 3 is
that your cache is updated if someone else (or even
yourself, of course) modifies that particular variable.
Barring disaster, I think this keeps everyone roughly
synced up with as little packet traffic as possible. Of
course, stupid World Developers who call SET_SERVER_VAR
constantly will result in laggy crappy gameplay. Then
again, stupid developers can already do that. Don't be
stupid. Think about it: "This command will result in
remote users seeing something change, therefore it sends
a packet, therefore I should do it as little as
5.) As cool as this is, it's still no guarantee
For example, if two players simultaneously execute
SET_SERVER_VAR, there is no guarantee which one will win
the race. And if you are trying to, say, increment a
variable, it may not increment the amount you expected.
6.) The Mix Admin can 'opt out'
While the server variables are probably not going to eat
up much disk space, and there should not be any security
issues (they are limited to the 'sandbox' of the
mixVariableCache folder), you may not trust me, and/or
you just may not want your server acting as a public disk
space (btw, we're talking short text 'values' here, not
If not, there is a new checkbox on MIX called "Allow
Server Variables." Just uncheck that and any players
on your server will be unable to set variables, and if
they ask for a variable's value, they will be told it is
7.) The MIX Admin can set variables which can only be
READ (not written) by the players. To do this you will
have to manually open mixVariableCache/worldName.ini and
edit the file with a text editor.
You can add new sections and variables as you like. Any
section whose name starts with "admin" can not
be overwritten by players
um, 'section' and 'category' are the same thing, sorry I
switched terms in the middle.
Because of the way windows works, you have to restart
your MIX server after manually editing an .ini file
before it will take effect.
8.) EVENTUALLY, I will probably add an event like:
and that should enable some fairly ambitious multiplayer
gamelets. I don't want to do that yet since there are
enough other unknowns to be worked out first. You should
still be able to do some multiplayer stuff with the
above. One thing to think about though is that while
server variables can be limited to worlds and sections,
they cannot be expressly limited by 'room' or 'scene'
(and if you wrote a poker game, you would PROBABLY want
to have multiple tables on the server... but maybe not.)
You could simulate this by using the host sernum as the
(or part of the) section name. BUt then you will
accumulate never-deleting cruft in the cache.
9.) What will hackers do?
I guess I won't help out by suggesting snerty things you
could do. At the end of the day, the scripting language
already allows them to snert a bit, and this doesn't add
TOO much variety to that. The MIX log will show who did
what, so manual action can be taken.
10.) THings to be done someday
That event notification to wake your script back up when
in incoming variable change is seen.
Something to discourage nuisance scripts, if needed.
Someway to let you modify admin sections if you are on
the right sernum, from the right IP, or something.
variable names, category names, and (to some degree)
values must NOT use any weird characters. Try to keep
things alphanumeric. The following characters will
probably screw you up: [ ] = ,
It's really the variable and category names which mainly
have to be limited. values can probably get away with
including some odder characters.
I will endeavor to not crash if you disobey this, but I
will not guarantee your world will work.
- * NEW COMPARISON
IF<= @label[/CODE]Silly me to not have those from day
- * NEW EVENT ARGUMENT
the eventActorClick event now sets two new cookies
which, I hope, are the deltax,y values from the mouse to
the actor's origin point. Expressed, I hope, in screen
coords (100 = full width). Possibly of use in detecting
accurace of center click, but probably requires all sorts
of adjustments since the actor origin probably is not
where you expect it to be.
- * QUEST LANGUAGE
Now this was a long time coming. Basically a FUNCTION in
this context is a @label you can GOTO, but that can then
RETURN back to line after you CALLed it. With arguments
passed both at the CALL and at the RETURN.
Note that RETURN only works with CALL, and any CALL
should be to a label which always (eventually) executes a
The CALL command looks a lot like GOTO at first glance.
Except that you can include a scene number before the @.
[CODE] SCENE 100
; This scene CALLs the function foo
N: This is the first thing you see typed
N: This is the THIRD thing you see typed
; This scene contains the function "foo"
N: This is the SECOND thing you see typed
N: You never see THIS get typed
END[/CODE]You can pass arguments (up to 10) as part of
the CALL command. Inside the function you can access them
as cookies "arg0" - "arg9"
[CODE] SCENE 100
CALL 200@foo Hello, There
N: OK, I say: #<arg0>, #<arg1>
N: You should have just seen me say "Hello,
END[/CODE]And you can return results to the caller the
same way (note that the argN cookies are basically
overwritten every time you use them, so don't put
anything too valuable in them.
[CODE] SCENE 100
N: I believe its name is #<arg0>
END[/CODE]As with CALL, you can return up to 10 args,
RETURN Name, #<host.age>, something, 23,
And upon return those values will be in cookies arg0,
arg1, arg3, ...
You can put functions inside any scene you like (of
course if you actually execute the scene itself someday
you might accidently run them without meaning to.)
You will have slightly better performance if you put your
functions inside a low-numbered scene. Actually that is a
lie, you get the performance by putting them in a scene
near the front of your quest file.
You might want to put them in a file by themselves and
#include that file as the very first part of your quest
file, even before all the tables.
- * NEW LABEL FORMAT:
Most, if not all, commands which use labels should be
able to take advantage of the new format. This allows you
to jump into the middle of some other scene, but you are
not going to automatically inherit the scenes background
etc. You will just be executing code in the scene
starting at the label you GOTO.
And there will be no possibility of RETURN.
If you really wanted to switch scenes, you probably want
GOTO SCENE n, but you might occasionally find a good use
for this. As a programming practice, I thing it would be
considered very poor form to ever do this.
So I don't want to be encouraging bad habits in you
budding programmer types. This is just a side effect of
adding the CALL command and it seemed more interesting to
include it than to prevent it. Of course, thinking like
that gave us perl!
- * NEW COOKIE 'STACK'
If you are unfamiliar with the term 'stack' in the
computer sense, the usual visual metaphor is a stack of
As you add (push) plates to the pile the newest one is
always on top. Then when you pick them up one by one
(pop) they come back out in the opposite order to how
they were put in. This is also referred to as FILO (First
In Last Out).
Now that we have functions, we have the ability for a
function you CALL to blow away a cookie that you really
wanted to keep. The data stack is a mechanism to help you
protect yourself from that, by pushing cookies to the
stack, calling the function, and then popping them back
Two handle this, we get two new commands:
Note that you can only push and pop cookies, not
PUSH temp (pushes the contents of the cookie 'temp')
PUSH #<temp> (uses the contents of temp as
the name of the actual cookie to be pushed)
Only the cookies VALUE is pushed. Later when you pop it
off the stack, you could actually pop it into a different
cookie than where it lived originally.
Say you had three cookies: a, b, and c.
You could simply preserve them, like this
[CODE]; Save a copy of the cookies on the stack
; do something that damages them
SET a "Badness!"
SET b "evil!"
SET c "clueless!"
; restore their original values
POP a[/CODE]Note that we have to pop in the opposite
order in which we pushed, if we want to get them back in
But you can do stupid stack tricks like this:
[CODE]; swap the contents of cookies a and b
POP a <-- puts into a what was in b
POP b <-- puts into b what was in a[/CODE]The Quest
Cookie Data Stack is SEPARATE FROM the Quest CALL return
stack. So you don't have to worry about the stacks
interfering with each other.
Both stacks, however, are cleared when your SCENE 'ends'
or starts. So you can't PUSH a value in one scene and
then hope to POP it off in a new scene. If you wanted to
do that you would just save the value.. in a cookie!
People will have a natural inclination to push values,
PUSH "Bill is a silly head!"
But that won't work. It will look for a cookie whose name
is "Bill is a silly head" (which won't exist)
and then will push its value (which will be "")
The other thing about the cookie data stack is that it
can't hold super long cookies (well, depending on your
definition of super long. I have a max of about 200
characters per cookie pushed on the stack. If you cookie
starts out longer than that, it will get truncated.
This is really intended for use inside functions, so that
you can protect scratchpad values
SET temp, #<arg0>
ADD temp, 3
DIV temp, #<arg1>
MUL temp, #<arg2>
SUB temp, #<arg0>
SET arg0, #<temp>
POP temp ; restore original value of temp
RETURN #<arg0>[/CODE]And we don't care about
blowing away 'argN' since they get re-used on every
function call/return anyway (well, potentially. In fact
they only get blown away when you include arguments with
the CALL or RETURN commands.)
ANYWAY, you may never need the data stack. And you can
easily shoot yourself in the foot.
* it's temporary (cookies are non-volatile, but the stack
* it is cleared when scenes start/end
* your cookie might be too long to fit
* if you call PUSH, you better call POP the same number
of times, or your stack will over or underflow.
9/10/2005 ALPHA 88 INCLUDES:
- Fix for A87 world
versioning bug (ergo the release)
- Paralysis now wears off
- new Monster FLag
"Will not flee" for super brave monsters
- Trophies can now have
"tokenNeeded" entries (so you only find them
while quest is in progress)
9/4/2005 ALPHA 87 INCLUDES:
- SOUL DIARY CHANGES
I added the buddy hat to the diary page (no, you can't
sort by them). Also I added a 'last encountered' field
which tracks the last time you met up with that
character. Eventually I will use that field to
prune/auto-prune using some rule like "keep the 4000
most important entries" where 'important' is
something like "recently encountered, or has a buddy
hat, or you have written personal notes about.."
- NEW DIARY COMMAND:
PRUNE OLDEST PAGES
1.) nothing happens automatically (other than the
hard-wired maximum of 8000 entries)
2.) a new menu option exists:
"Delete all but newest pages..."
3.) It gives you PLENTY of warning
4.) And then prunes you down to no more than 4,000
entries. Throwing away entries which:
* have no buddy hat
* have no written notes (your personal notes)
* you haven't seen in world for a long time
where long time means "only the 4000 most
NOW, I only added the 'last seen' info in A84 or so, so
most of your old entries don't have that. They are then
all treated as equally old, so it is up to the filesystem
to control what order they are preserved in (and no, the
file system does NOT pump them out in strictly
chronological format, so it's a crap shoot)
SO, be sure to 'buddy' people whose pages are important
And, bear in mind, that unlike Arcadia (where you
automatically get a page for everyone you meet), WoS
still only makes a page when you show curiousity about
And I fixed the individual delete button as well.
By the way, I thought it would be cooler to show you each
entry as I delete it. It makes the whole thing take a bit
longer, but it's more interesting than looking at a white
It's a little terrifying (I just pruned 2500 of my own
pages), but it seems to work as designed.
Now, that bit about "if you have written a personal
comment about them" probably deserves some
explanation... Way Back When (The diary is what, ten
years old?) I stored those notes differently. If you,
like me, have some notes stored in that old format, then
those pages will not be automatically protected.
If you are at all concerned, making any trivial change to
the notes will get them recorded in the new format.
NOTE: You might want to make a backup copy of your
original wos/bio folder before running this command. I
mean, it's new code. Could be broken..
- BIG NEW FEATURE:
TROPHIES and the TROPHY BAG
; TROPHIES are carried in the Trophy Bag
; They are basically only used for quests. You can, for
example, define specific trophies
; to be dropped by individual monsters. "Wolf
Ear" "Bear Fang" etc. and then use
; cookies to check if the user has collected what you
; At any given time, the player has exactly one trophy
bag, and it has a width and a height (measured in
; Players start out with no bag at all, and you must
script a scene to give them a bag when you feel they
; one (probably an NPC bag-maker will give or sell them a
bag, and possibly upgrade it over time.
; Bags look like this, for example: (width=4, height=3,
12 slots total)
; | | | | |
; | | | | |
; | | | | |
; Each slot can hold only one sort of trophy at a time,
for example a fang in one slot, and a claw
; in another.
; But most trophies (per following table) 'stack' in the
sense that you can hold up to.. say.. 10 fangs
; in the same slot, and only when you get your 11th fang
do you need another slot.
; The user can drag the contents of slots around, or
right-click on them to sell or discard a slot's
; contents. They can only sell when in a shop scene. The
game will automatically pick the 'best slot'
; to use when a new trophy is given to the player (unless
you use a slot-specific cookie commands).
; But, should the player end up with two slots holding
less than a full stack of the same trophy, they
; can 'drag one into the other' to merge them.
; If you want to completely remove the bag from the
player, set both its width and height to 0. Note
; that if you make the total number of slots smaller than
it was, items will be lost if they cannot all
; fit in the remaining number of slots. You might want to
think about which dimension you want to
; change first, if that will make a difference.
; It is the user's responsibility to keep some empty
slots available, or they might not be able
; to get an important trophy. The world developer can
measure how much room is in the bag and
; warn the player if they have not got room for a
; Trophies can NOT be shared between players. Trophies
are not ITEMs and fulfill no purpose
; other than as named-quest maguffins.
; The world developer has the following commands and
cookie controls over the player's Trophy Bag
;// COMMANDS (running out of letters, so 'Z' means trophy
only because.. um.. I have no idea :-)
;// %Znn - name of trophy nn (e.g. "Hello, %1,
that's a nice %Z23 you have there!")
;// GIVE Znn.cc - give cc of trophy nn (e.g. HOST_GIVE
;// TAKE Znn.cc - take cc of trophy nn
;// Conditional Znn.cc - go to label if host has cc or
more of trophy NN (e.g. IF Z23.10 @hasTenOrMore)
;// num.TrophyBagOpen - (r/w) 0 if bag closed, 1 if open
(cannot open 0 - slot bag)
;// num.TrophyBagWidth - (r/w) width of bag
;// num.TrophyBagHeight - (r/w) height of bag
;// num.TrophyBagSlots - (r) total slots in bag
;// num.TrophyBagSlotsInUse - (r/w) non-empty slots in
bag (WRITING any value, empties bag completely)
;// num.TrophyBagEmptySlots - (r) empty slots in bag
;// num.TrophyNNN - (r) how many trophyId=NNN hero has,
in total, in bag
;// num.TrophyBagRoomNNN - (r) how many MORE trophyId=NNN
hero could take (filling all stacks and slots)
;// num.TrophyIdInSlotNNN - (r/w) id (or 0) of trophy in
slot NNN. (write REPLACEs slot with a SINGLE trophy)
;// num.TrophyCountInSlotNNN - (r/w) qty (or 0) of trophy
in slot NNN. (write REPLACEs count, without changing id)
;// (cannot set count if id=0, cannot set count above
'stackHeight' for id)
; TABLE ARGUMENTS:
; Each Possible Trophy is defined by one line in this
table, with the following 8 arguments per trophy. Note
; Trophy images are 32x32 'icons' stored in
"filmstrip" files in the ART folder of your
world. These must be
; prepared like any other WoS BMP file, and use the
official WoS 256 color palette. There are assumed to be
; guidelines in the file, so only 31x31 pixels are
available for art. The upper left pixel of the file
; the 'transparent' color for the icon.
; // arg 0 ID# (1-4095)
; // arg 1 trophy name (31 char max)
; // arg 2 ImageFileName, (in ART folder, assumed to have
; // arg 3 ImageIndex, (0 for first frame of 'filmstrip'
; // arg 4 stack size (how many of these fit in a single
Trophy Bag Slot) (0-99)
; // arg 5 gpForStack (How much a shop will pay for a
FULL STACK of these)
; // arg 6 demonId (Which monster 'drops' these when
killed) (use 0 if not to be found on monsters)
; // arg 7 probability, (percentage chance 0-100 you will
get one for killing that monster)
; Arg0 Arg1 Arg2 Arg3 Arg4 Arg5 Arg6 Arg7
; ID Name ImageFileName ImgIndx StackSz StackGP DemonID
; 1234 1234567890123456789012345678901 123456789012345
1, "Green Jelly Pigment", "trophy",
0, 20, 5, 1, 80[/CODE]
- FIGHT/FIGHT2 opcode
allows you to specify starting monster location.
I think this is like the oldest un-fulfilled request.
[CODE] FIGHT 1.50.50
makes monster id 1 appear at location (50,50)
(where screen coords are 0-100). You cannot
use (0,0).[/CODE]* Can no longer flee scene while
paralysed (if disease has a 'cannot move' effect, that
also prevents fleeing.
- MONSTER MAY NOW FLEE
If a monster sees a human player in the scene who is 20
levels or more above it, it will grow fearful and may
flee the scene in mid-battle.
The degree of fear increases with the level difference.
Monsters with wisdom > 100 will also consider
their own remaining hit points and grow even MORE fearful
as they get closer to death.
Now, this COULD be a big change... especially for people
who depend on being able to wack green jellies all night
with an auto-clicker to get PP. Hopefully this won't
destroy the game.
- NEW CONFIG.INI values
[CODE]; these affect PK damage in your world. Basically
the same computation is made when a player
; attacks another player, but at the last moment it is
multiplied by these percentages,
; hence you can make PK battles last longer or shorter
times in your world.
; Does NOT affect healing.
;pkHandPercent = 100
;pkMagicPercent = 100
; this is used to increase (>100) or decrease
(<100) the percentage of successful spell casts
spellSuccessPercent = 100[/CODE]
- SUMMONED MONSTERS FIGHT
FOR SIDE THAT SUMMONED THEM
More or less. They aren't smart enough in a PK battle to
fight some humans but not others. They either consider
ALL humans to be allies, or ALL humans to be enemies.
What's new is they no longer always think humans are
enemies. If the monster who summoned them is a pet, or
was summoned by a human, then they will think ALL humans
are their pals.
* LEVELS.TXT CAN SPECIFY DEFAULT SKINS PER CLASS/PER
the "DEFAULT_SKIN" command lets you specify the
skin to be seen by players who do not have the REAL skin
selected by a player. If you do not use this feature, the
default will come from the genders.ini file (as before).
Evergreen has been updated to use an assortment of Josh
Skins for this purpose.
- NEW FIGHT THINGY
You know how if you say:
It brings in a monster 34 who then fights FOR the humans.
You can now also say:
This brings in a monster who still hates humans, but is
unable to actually attack them. Instead it will attack
human-friendly monsters (like that -34)
So this allows a scene to have a 'monster on monster'
battle while the humans watch in safety (or call out pets
This does NOT affect whether humans can pound the
monsters (and thus influence the fight).. would need some
sort of scene directive if you wanted to prevent that.
Also, the FIGHT won't END until all the '+' monsters are
dead... since the living humans in the scene can be
thought of a extra '-' monsters.
I think I will need some sort of MFIGHT command which
factors humans out of the equation.
- RIGHT-CLICK on ELEMENT
TRAINING REDUCES TRAINING
That is to say, you can now dump some training and get
some PP back. You get back only half what you put in
(this isn't a FREE redistribution system!). It's probably
mainly of use only to people like me who like to make
interesting shapes on the element training diagram. But
hey, it might help out in an emergency where you have to
sacrifice three levels of fire to get one level of water
that you need RIGHT NOW.
- INCLUDES NEW
But only if you do it MY WAY (heh heh). I will have to
document this more clearly but. Wholly under control of
the publisher, with no daily involvement from me, a
publisher can add 'patch' information to their world's
INFO file. Then when a player clicks on the world in
'check on line for new worlds' Not only do I tell them
what I used to tell them (new world available, you should
get it), I also give them a button to install Just The
Patch which you feel a person still running their version
From the player's perspective, the patch is then
automatic and easy, with no ZIP skillz required. It's
just like the download button, but faster.
Of course, if they are several versions behind, and you
didn't provide a patch to take them directly to the
latest version.. well, then they have to push the patch
button again... and again..
But what is a patch file, you ask? It's NOT a 'real'
patch file with compressed diffs. That would be 'too
dangerous' (Uncle WoS won't run an EXE file!)
It's just another .ZIP file, just like your world's .ZIP
file, but from which you have removed all the files which
didn't change between those versions.
I have a test world up "PatchWorld" (won't work
for you until you have A87) which gives version 1.1 as
the DOWNLOAD and offers 1.1-->1.2 as the PATCH
(and possibly more flavors by the time you try it).
I made one of these just by using /version + PUBLISH to
make version 1.2, then opening the ZIP file itself, and
deleting all files older than the date I made 1.1
It was actually kinda easy, since WinZip will sort by
Then I renamed it: PatchWorld@p1_1_to_1_2.zip and put on
my site, along with an extra line in the INFO file
claiming that users with version 1.1 should run this
Anyway, it's easier than it sounds... for everybody.
- ACTOR POSES NO LONGER
LIMITED TO 60ish
Thanks to Flamelord for insisting (and being correct)
that I had crammed in an arbitrary limit for the number
of usable poses in an actor filmstrip.
The new arbitrary number is 255 (which is less arbitrary
since the packets in question impose this limit)
But I remain on record as thinking it's a bad idea to
have hugely-wide image files. Still, this should be YOUR
choice, not mine :)
* 'CHOOSE YOUR WORLD' LIST FASTER
If, like me, you have 50 or so installed worlds, you
probably find it tedious to step through my 'cool'
I have changed it to show (and step) five worlds at a
time, and to do so with an animation speed 2 or 3 times
faster as before.
I also reduced the amount of "wobble" in the
selected menu item.
- CHECK ON LINE WORLDS
LIST HAS NEW FIELD: STATUS
World Developers may now (blame f'nok!) include a
'status' field in their INFO file. Which will then be
displayed in the new "Status" column on the
CheckOnline dialog. If you do not provide a status, your
status is "Old"
F'nok suggests you use status with worlds like
"Demo", "Beta", and
"Released" etc. But in fact you can put any
(short) string you like. Yes, I will ban publishers who
put profanity in their status line.
I plead that you do NOT use this line for ADVERTISING.
Note that to see this line, a user must click on your
world name, and when they do that, your world's HOME PAGE
displays. Do your ADVERTISING on your world's HOME PAGE,
please! And by advertising, I mean advertising for your
world. I trust all world developers to do their best to
minimize popups on their world's home page.
- CHECK ON LINE LIST
CACHES VERSION AND STATUS
So, since I don't actually KNOW the status and version
info for the world until after you click on it, I now
cache the 'last known values' for those fields. In your
new "c|wos\save\worldCache.ini" file where
maybe someday I will let you record your own personal
little factoids about each world... like how much time
YOU have spent playing it, etc. Private info, not public.
Maybe. Anyway, an interesting place for me to stick
stuff, even about worlds you have never played, but are
somehow aware of.
- CHECK ONLINE WORLD
STATUSES: Broken and Old
I will automatically dub your world 'Broken' if it does
not have a functional INFO file. It's important that you
host an up to date INFO file for your world, so if you
see yourself as 'broken' (Like Aerianell is), then feel
free to fix your INFO file and let me know if it has a
I will automatically dub your world 'Old' if it is
otherwise functional, but lacks the new 'status' field in
its INI file. I am not completely happy with 'Old' and am
open to a better word. I sort of like "Legacy"
but maybe that sounds TOO cool, and people will
intentionally set their status to that just to be cool. I
need a word which is both not insulting to the world AND
yet something a world developer would just as soon update
to something nicer.
- /VERSION PUBLISH DIALOG
NOW HAS INTEGRATED SUPPORT FOR STATUS AND PATCHES
Since otherwise, it was going to overwrite whatever you
had manually added to your world.ini file, I went ahead
and made it so you can manage these fields directly in
the dialog itself.
I want no excuses for people NOT using the /version and
PUBLISH features of WoS :)
- IMPROVED PROGRESS METER
FOR DOWNLOAD WORLD
Turns out it would go blank if your world was over 20
megs or so (making it slightly less than useless). I also
added bandwidth tracking and give an estimate of how long
until download completes.
I also detect 'bad downloads' and cache the result of
your last download attempt "Failed DL"
Publishers should consider moving to a different host if
players regularly complain about 'failed download.'
I think the only player-unfriendly thing left is worlds
which advertise they are version 1.5, but actually
deliver version 1.0 That's pretty evil (KOC), since it
encourages the user to download the old version over and
Oh, and I wish I had a popup detctor. Some worlds (I'm
lookin' at YOU WoSInstantMessenger) really have an
unacceptable number of popup windows. I might have to
just manually un-publish worlds when I see that. I mean,
4 copies of the *same* ad popped up in 1 second? Whose
purpose does THAT serve?
- EVEN MORE CONFIG.INI
These are for controlling what generates War Points...
hopefully there are more coming, but it's a start.
[CODE]; set this to a positive value to enable the
posting of normal PK 'karma points' as 'war points' to
the War Ladder
; otherwise, comment it out, or set it to 0. The value
'scales' the points (bigger value, fewer points)
; These war points are applied only to the specific
war(s) between you and the guy you killed.
; set this to non-zero to enable "XP Earned from
Monster Kills" to drive 'war points' on the war
; If you set this to 1000, for example, you will earn one
war point per 1000 monster XP points
; These points are awarded to your guild for ALL its open
wars at once.
monsterXPAreAlsoWarPoints=1000[/CODE]* WAR GUILDS AND WAR
I can't believe this is the first I mentioned this in
this topic. I talked about it plenty elsewhere.
With A87 pre-release, we get the first cut of this
feature. It's all new code and does not prevent you from
doing what you did before. It's new.
You access the feature through the new GUILD WARS menu in
the game's GUILD menu.
You have to be incarnated and wearing the uniform of a
WAR GUILD to take part. If you are the guildmeister, you
just set the 'is war guild' checkbox on the guild's web
You might want to be in the habit of selecting
GUILDS/GUILD WARS/DECLARE WAR after incarnating to make
sure you are all hooked up.
That panel is where you can declar war, but mainly it
just shows you the people immediately above you on the
ladder, and the status of any wars you have going with
For the full ladder, and your full list of wars, there
are other menu options.
World developers control what earns war points in the
war. For evergreemn (in pre-release A87 at least), you
earn two ways: 1.) the XP you earn from killing monsters
(divided by a 1000) generates WP for ALL the wars you are
in (that your current uniform is in, I should say). 1.)
normal PK activities. And I mean totally normal PK
activities. I have not yet done the promised 'fair fight'
Anyway, I hope it will make sense. The ladder will
probably get cleared frequently.
- NEW SLASH COMMAND /ART
This is like /villagers (and uses the exact same code),
only it lets you browse 'filmstrip' files in the ART
folder. Not everything in that folder is a filmstrip, but
this is useful for browsing things like your 'trophy'
image files. I include 4 such files with WoS now,
containing various torn off bits and pieces of Josh's
monsters. It's invaluable when you need to know the frame
number in a 'square frame' film strip.
It's presumably all wrong in a non-square frame film
strip, so I guess I should point that out (like, for
example, shields.bmp and swords.bmp and armor.bmp)
- ADDED TROPHIES TO THE
This was more work than it sounds, but it is hard to type
about it in a way which takes up very many words.
- ADDED PROPS BUTTON TO
WORLD EDIT DIALOG
How were people supposed to know about the /props editor
again? The Property Editor is your pal. As is /tile and a
5/14/2005 ALPHA 86 INCLUDES:
- Fix for a nasty bug
which prevented you from saving your character
4/16/2005 ALPHA 85 INCLUDES:
- * COMPATIBILITY:
Excellent! Well, except: you can only play with other
A85ers, and you will no longer be able to use some pets.
Specifically, if you caught some pet in an earlier
release when it was legal to do so, but now it isn't...
well, you can't use that pet anymore. I'm sorry.
Also, you are advised to destroy all hacked characters
(delete them directly from the SavedHeroes folder, if you
try to delete them from inside the game you will probably
trigger something you don't want to have triggered). This
includes characters that: 'a friend made for me, I didn't
hack, I don't know how to hack!'
Pretend it is the airport, and your character is a piece
of luggage. If you didn't pack it yourself, back away
from it slowly...
And do this BEFORE you upgrade to A85. If you didn't read
this warning in time... well... why did you have a hacked
character in the first place?
- * MORE ANTI-TRAINER
Yeah, sucks to be me. As you know, use of trainers is not
allowed/encouraged/tolerated (balance that against my
fundamental inability to catch you at it, or do anything
But be warned that I will *try* to do something about it,
so you might actually end up being one of the poor
schmoes who can't play any more. And for the junior
lawyers in the audience, the word 'trainer' encompasses
all forms of illicit game activity, whether it was called
a trainer, a memory editor, a hack, etc.
If the game doesn't give you a button to do something, it
probably doesn't want you doing that thing.
Just ask yourself: would YOU want to play against someone
with a OneHitKill button? Of course not, and I know your
answer to calm whatever conscience you have left is
"I don't care," but if you really don't care,
well, move along please!
Anyway, I know a lot of trainer users have been losing
game privileges lately, and I have received some lovely
apology emails, but you see it's too late once you reach
- * NEW FEATURE: BOOK OF
I think it's been a long time since I added an actual new
feature! And this one is only very peripherally
associated with hacking.
In the BOOKS menu is a new option which opens a text
window that logs all your battles (in this session). It
just records everything that happens "X enters, Y
hits Z, Z loses N hit points, Z is dead" etc.
Yes yes, the reason I added it initially was to give
people something to argue about "Hey, you hit me 3
times in a row" or "hey, it says it was only a
3 hp damage, but it killed me!" etc.
But it's actually fun in its own right, and something I
can spiffy up over the next few releases. And if I am
industrious (not), I will add an option to log them to
disk as well.
Something like this:
Tue Mar 22 01:40:16 2005
Server: Uncle Dan's WoS Server
A battle begins, hosted by Samsyn
* Samsyn (SOUL 1) is here. (Level: 83, A:390, D:785, HP:
* Green Jelly threatens you. (Level: 1)
Green Jelly attacks Samsyn
Samsyn loses 1 hit points
Green Jelly attacks Samsyn
The attack misses Samsyn
Samsyn attacks Green Jelly
Green Jelly loses 1021 hit points
*** Green Jelly has been killed.
You earn 3 GP and 4 exp. points.
The battle is over[/CODE]
- * 'OR' operator added
The single vertical pipe character '|' is now supported
in Quest script conditional testing. Remember you still
cannot use parentheses to make anything truly
complicated, but now you can say:
IF T23+T44|T67-T87|T15, @label
which will go to @label if the user:
1.) has Tokens 23 AND 44
2.) has token 67 but NOT 87
3.) has token 15
Evaluation is done left to right and stops at the first
This one's for you, Silver. :)
2/1/2005 ALPHA 84 INCLUDES:
- token-locked items
- ever more hack
1/22/2005 ALPHA 83 INCLUDES:
(Excellent, but you can only play with other A83 players)
- Two New MONSTER FLAGS
(see monsters.txt in evergreen folder)
- Minor Hacker-Related
12/22/2004 ALPHA 82
Excellent! (but you can only play with other A82 players)
- NEW COMMANDS:
Give/Take items only with players in same party as host.
- NEW COOKIE:
Name of current server, if any.
- NEW COOKIE:
nn specifies a class of equipment. returns the ID of what
is equipped on the host in that equipment slot. Value of
0 means nothing is equipped for that slot.
Legal Values for nn are:
HAND 99 (i.e. num.hostEquipId99)
So if I am not WEARING a helmet, 'num.hostEquipId00' will
have a value of 0. But if I AM wearing a helmet, the
value will be the item id# of the particular helmet I am
Yes, sort of seems a pretty small update, considering how
long it has been. There might have been other changes as
well.. At the very least, most of the trainers should be
broken for awhile. let me repeat my plea: there is no
need to make trainers for WoS... you're not doing me any
favors to make them.. Just in case that wasn't clear. :-)
7/1/2004 ALPHA 81 INCLUDES:
- * COMPATIBILITY:
- * Yet Another
Anti-Hacker thingy which I think should effectively shut
down one of the remaining exploit opportunities. I will
just keep to myself the one I mean.
BTW, any reformed sinners who want to email me explicit
instructions on anything they can do with the latest
versions, should always feel free to do so. I probably
won't actually reply, but I love hearing detailed
instructions. I'm always interested in trying to
frustrate people's one-hit kill scenarios, so if you
share with me how YOU do it (in A80), then I am just that
much more aware.
- * Re-Did the Slot
Thanks for Makarei for the inspiration. I made a text
file (slots.ini) that you can use to customize the
payouts for your world's slot machine. Also, instead of 8
symbols on each wheel, and the same order of symbols on
each wheel, there are now 100 slots on each wheel and the
order of symbols is different per wheel.
There are still only 8 unique symbols, but you get to say
how many of each symbol are on each wheel.
Full details in the evergreen slots.ini file, but
basically for each of the 8 symbols (drawn in the
art/slots.bmp file), you specify:
percent (basically how many times the symbol appears on
triple (how much GP you win if you get three of that
double (how much GP you win if the first symbol matches
the 2nd or 3rd on the line.)
- * NEW EVENT
This detects when the host gives themself an item (for
example, uses a potion on themselves). Sorry I can't give
you 'when anyone gives anyone'
- * NEW COOKIES:
Character Birth Date for Host:
Number of people in scene who are in the scene host's
party (are following the scene host) Note there could be
other parties in the scene...:
- * MACGUYVER ROOM LOCK
I didn't do this to stop 'the PP trick' per se, but
excessive clicking on the lock button also results in lag
packets, so I reduced the rate at which they can be sent.
This also interferes with 'the PP trick' but I imagine a
new PP trick can be found to replace the old one.
- * ADDED FILTER TO BOOK
You can now type in something like "fr*" in a
new filter window on the book of skins, then hit 'enter'
to reload the skin list for skins only in the selected
category AND which start with the letters 'fr'
It uses the file system filter, so whatever is generally
legal there should be legal here.
2/11/2004 ALPHA 80 INCLUDES:
- Almost nothing. A new
low. A release just to address recent hacker tools. A
waste of everyone's time and energy.
1/11/2004 ALPHA 79 INCLUDES:
Excellent! Except you will only be able to play with
other A79ers. Other versions will be 'invisible' to you.
- BUGFIX: Fixed stupid
bug which showed the wrong soul ID on the right-click MIX
- BUGFIX: Fixed a couple
issues with the THEME command
- BUGFIX: Fixed a couple
issues with the new Pet Commands
- ROUTER SUPPORT
If you check out the new-to-A78 PROXY SETTINGS dialog,
you will see another checkbox. You can probably just
leave this checked (the default). It might just make it
so you can fetch skins, even though you are behind a
router. (You might still have to manually set up port
forwarding yourself, but this might take care of the
problem where your PC was reporting a local IP address
instead of the router's address.)
It shouldn't HURT, in any case, and it might just be the
coolest thing ever.
No other really huge bugs have been reported, so I think
I will push this later tonight.
- PET COMMANDS SUPPORT
"ME" and "YOURSELF" WITHOUT TICK MARK
So, you can say:
blinky, bite me
blinky, bite 'me
The other options still require the tick ('weakest,
'strongest, I mean)
1/8/2004 ALPHA 78 INCLUDES:
Excellent! But there is some chance you might have to
re-enter your Golden Soul activation code. So I hope you
haven't mis-placed it! Knock on wood you won't have to.
This might be a good time to repeat the admonition about
intentionally using older versions of the game. Not a
- PROXY SUPPORT -- MAYBE
Now, I don't HAVE a proxy server, so I am including 100%
untested code. The good news is that if you don't turn it
on, it won't make any difference. But if you have a web
caching proxy server you might have one less stumbling
block between you and WoS. (this is only for http
fetches, so if you have a firewall, you still have to
open the ports for that)
On the Network Options dialog is a new button "Proxy
Settings." Press it to open a dialog with a checkbox
(leave it unchecked to NOT use a proxy) and 2 edit boxes.
You have to enter the ip address (188.8.131.52) and port
number of your proxy server. It's YOUR proxy server (I
don't HAVE one), so good luck!
You will have had to enter the same thing into your copy
of IE, so look for it there.
- MORE CONTROL OVER
MONSTERS AND PETS
I was home sick today, so it was the perfect time to
tackle this project which has been sorely needed for some
time now. I'm not completely done yet but it's looking
pretty promising (and simple!)
On the one hand, this is an extension of a Golden Soul
feature -- talking to your pet. You can now give your pet
a command (an 'ai command') like:
binky, use small rocks on samsyn
Which commands binky to cast the spell 'small rocks' on
the player named 'samsyn'
The same ai command can also be used as the new 'argument
20' in the MONSTERS table. So that monster #34, the
"boogiepoo" might have a command:
"small rocks on 'weakest"
which means it will attack the weakest remaining player
with small rocks (and do nothing but that, until it can
no longer do that).
That would be pretty boring, probably (though it is
marginally cool to watch it attack the weakest player
until dead, then pick on the next weakest, etc.
I'm going to give you the full list of commands in a
minute.. sort of.. it's rather chaotic, but I just want
you to reflect for a moment on:
* <petName>, <ai Command>
* monster argument 20 = <ai command>
It's all optional. It's just for fun. But there is some
danger that I will have added a bug which lets you harass
other players more effectively with your pets. My goal is
not to let pets do more than they could before (not much,
at least), just give you a way to direct their action. If
you command them to do something which they cannot do
(only LIFE element pets can heal you, for example), they
will either do nothing, or their regular ai.
Another side effect of this work is that pet names should
now show up in the scene. As in "Samsyn's grubber
In fact, I have also added an index number (you can turn
it off in the book of options) next to each name in the
scene, so you can say:
binky, bite #4
and mean that monster #4 in the scene is the target of
binky's attack. I did not mean this to allow you to tell
binky to attack a friend. Rules of engagement should be
unchanged. Knock on wood
I also support partial name recognition, as in:
binky, heel to sam
Will make binky walk to the side of the first player
whose name starts with 'sam' (i.e. 'samsyn')
most arguments are optional, and just allow finer
precision. For example:
this tells Binky to stop fighting and just stand near its
master. (the "to <name>" bit is optional,
and lets you make binky stand next to someone else...
even an enemy I think. Which is cute.)
So, here are the basic commands. Remember you have to
name your pet, and have a GS, in order to call a pet into
the scene and command it entirely from the keyboard. You
can also make keyboard macros to automate your favorite
attacks, but I digress:
binky, bite <target>
binky, attack <target>
binky, hit <target>
binky, use <spell> on <target>
binky, heel <to target>
binky, heal <target>
bite, hit and attack are really all the same, I just
thought a little variety might be nice.
No, world developers cannot override the command words.
Yes, 'heel' and 'heal' are intended as a spelling test!
Yes, you could set your afk message to something like:
/afk=binky, bite %5
Where I am at a loss to remember if %5 is the name of the
person who typed your name. These commands only work in
scenes, after the script has stopped, and binky can only
bite people he is normally allowed to bite. And he would
probably already be biting them, given the chance, so
this example is probably silly. But exciting!
Anyplace you saw me say <target>, you can:
* leave it blank (binky will pick his own)
* use a player name (or portion thereof)
* use an index number (binky, bite #3)
* use one of these special tick codes:
binky, bite 'weakest
binky, bite 'strongest
binky, bite 'yourself
binky, bite 'me
binky, bite 'random
(and only the first character after the tick is looked
at, so 'random and 'roof are the same thing)
Again, binky won't bite himself... though I think I might
let him bite his owner whenever asked. but some binky's
could cast heal on themselves when asked.
And where you saw <spell> above, you can type
* nothing. In which case binky will be confused
* a spell name "binky, use small rocks"
* a spell id number "binky, use #202"
* a list of spell id numbers: "binky, use
It's the list of spell id numbers (binky will pick one at
random) which is the interesting bit. This is what makes
ai commands in the MONSTER TABLE argument 20 interesting.
arg20 = "use #45,76,12,78,0"
means the monster will preferentially use that list of
spells. Can you say "pokemon"? A vlaue of 0
means "oh, use your old rules and pick the spell of
But now you can finally make a monster which prefers to
debuff over casting nova.
Anyway, it's surprisingly fun to command your pets in
this way. I still have some kinks to work out, but it's
- UP TO 32 ACTORS in a
scene. (only 0-9 can 'talk', but 10-31 can act as
- WORLD DEVELOPERS CAN
RENAME "GP" using the new
"config.ini" file. (see
worlds\evergreen\config.ini for details). I delayed doing
this because I didn't want to track down the 40 thousand
places I had 'GP' "Gold" "GOld Coins"
and "Gold Pieces" hard-wired. I doubt I caught
them all. It's still your job to have a name which works
for both singular and plural and is not so long as to get
clipped (or cause other data to get clipped in tight
- CHAOS ELEMENTS MAY BE
In the [elements] table, just use the id 8-255 of the
chaos element you want to get a name. You only have to
call out the ones that you want to give unique names.
Note this does not mean that you will get an element
selector, so you still won't be able to sort the spell
window by these. In fact I am not sure where these names
will show up. But mine is not to reason why.
- THEME -1 for silence
Sorry for the snafu. THEME 0 in a scene file means 'use
theme from closest link, if any' which means you really
had no way of turning sound themes off. Now, any illegal
hard theme value (heck, just use -1) should make for
silence in all cases. Well, silence in the sense of no
- SERVER TIME REALLY WAS
And I didn't believe you. Shame on me. I am not 100% sure
it is fixed now, since it requires deploying new servers
as well as new clients. Until then what you get is not
the delta for timezone, just the delta for how far off
their clock is.
- NEW COOKIES
num.hostHandRatio and num.hostMagicRatio
- CANNOT JOIN PARTY if
potential leader is inside a locked scene (that you are
not also inside of.)
9/1/2003 ALPHA 77 INCLUDES:
- * COMPATIBILITY:
Excellent! (But you will be unable to play with others
until they also upgrade to A76)
- * Use of /bkgnd command
is now a 'cheat'
- * First Use of cheat on
a new character must occur in solo mode. (so to make a
cheat character, you need to be in solo mode, enable
cheating in the book of options, then issue the cheat
command. Should be very difficult to do this 'by
accident'). Once your character is sporting its cheat
count, it can cheat again in multiplayer mode as often as
- * World Designers may
now have as many as 1000 maps in their world (well, you
may run out of other resources first, but WoS will no
longer restrict you to 256 maps).
- * World Designers may
now use as many as nine 'extension' bitmaps per object
class. So, if you need more filmstrip images for your
Very Many Shields (tm), you can have a shield.bmp,
shield_1.bmp, shield_2.bmp, ... shield_9.bmp Each
filmstrip, of course, holds many images.
- * NEW COOKIES
this one tells you how many monsters took part in the
last fight (it is cleared to 0 at the start of a scene,
and counts the number of hostile monsters added if it is
a fight scene (from map or FIGHT command). Friendly
monsters are not counted. Pets are not counted.)
This one lets you get the monster id of one of the
monsters in the last fight. For example, if
monster.lastFightCount returns '7' it means seven
monsters were in the fight. You can then ask for
monster.lastFightId1 through monster.lastFightId7 to get
the id of the individual monsters. Then use
SET monster.id, monster.lastFight4
(for example) to set the monster selector to the 4th
monster of the last fight. Then use the normal monster
cookies to get whatever information you need about that
Note that monster.alignment is a string you can use for
anything you like. for example, you might use it to
specify how many goo-goo points you get for killing the
monster. You might cram several pieces of information
into it. That's up to you. I just point it out here for
no particular reason.
- * MENU command can have
up to 30 options. But you are still limited by the length
of a single line of text in the quest file (1000
characters?) so you may get fewer than that if your
names/labels are long.
- * New MAP FLAG 524288
MAP_FLAG_NO_WAYPOINTS disable automatic waypoint
calculations (good for mazes)
Note that you may also now use hexadecimal values when
defining your map flags. If you don't know what that
means, then keep using the decimal values.
- * TAKEing equipped
items should no longer freeze the game.
- * NEW ITEM FIELD
(hidden in column 5, after the EquipToken) "Item
First flag is #1 -- cannot be given. Makes an item like a
seed in that it cannot be given to another player. (seeds
remain hard-wired to not being given)
- * NEW ITEM FIELD (also
hidden in column 5): "Max Count"
This lets you specify that a player can have no more than
N of this item at any given time. Note than N must be
less than the current wallet limit (you cannot use this
feature to increase wallet size, I mean).
- * NEW COMMAND: EJECT
This is identical to the PARTY command, only it also
boots the people from the scene in addition to removing
them from the party. Remember the conditional specifies
who gets to STAY, not who gets ejected. I imagine this
will be horribly confusing, but that's life!
6/1/2003 ALPHA 76 INCLUDES:
- * COMPATIBILITY:
Excellent! -- but you will only be aware of the existence
of other A76ers on the server.
- * [bugfix] fixes text
edit window in lower half of /props screen.
- * [bugfix] fixes lag
issue associated with skin xfers (but skins will move
more slowly as a result)
- * [bugfix] fixes
mis-reporting of character class in STATs screen.
- * New MIDI Support
I moved all the MIDI stuff to a separate thread, so that
when your (and my) sucky midi driver decides to take 5
seconds building an instrument list before playing the
song, it doesn't freeze the game in the process. The
music is still delayed for those N seconds, but at least
you can still walk around. I hope sucky midi drivers go
away soon. Or at least that mine does.
- * MAP SOUND THEMES
You can now add a sound theme to be heard while players
are walking the map. See quest.txt MAPs section for
details, but basically it's just a new column in the
table. Older worlds without the column will default to
theme 0 (none) as before.
See THEMES table in quest.txt for info on creating your
own sound themes.
- * NEW HOST COOKIES
#<num.hostXP> host's current XP count (approx)
#<num.hostMaxXP> host's highest XP ever (approx)
#<num.hostTotalXP> total XP ever earned (approx)
#<num.hostHandPPn> PP spent on training hand n
#<num.hostElementPPn> PP spent on training element
These two are the same as the existing cookies but
instead of returning 9, would return 9000. Hence someone
with training 9.123 would return 9123. I'm sure this is
confusing, but probably more useful than the raw PP
versions since Quest Lingo doesn't give you the ability
to compute logarithms
These are approximate just because, sadly, they would
otherwise be abused by mem hackers. MaxXP exists to keep
track of the highest they got to before, say, getting
killed at level 100 (which makes you lose all your excess
XP) so this is a measure of 'as high above 100 as they
have ever made it). totalXP is just every point they ever
earned. These numbers, of course, get very large and vary
in meaning from world to world. maxXP is the number which
will make level 100 players cautious about getting
killed. (and angry at those who kill them). More problems
and anger for the future, so use these values
responsibly. Evergreen does not use them.
- * TAKE/HOST_TAKE
If you have only one 'el diablo' and you have it equipped
and the scene script TAKEs it from you, then it should
now be unequiped automatically.
- * CHARACTER CLASS
can now start inside a scene. There is a dropIn argument
now... set it to 1 and the first incarnation should end
up INSIDE the specified link.
START_LOCATION map#, link#, dropIn(0 or 1)
In Evergreen, piano-class users now incarnate (the first
time) into the Piano Room in Macguyver castle.
- * SHARED SCENE SUPPORT
You will see a new option on the LINK EDITOR for
specifying what a link does. In addition to taking you to
a SCENE, the option now exists to take you to a SHARED
This means that if someone else has already started a
scene from a link, you can drop into their version of
that scene rather than your own private copy. In
evergreen only two scenes have this property at present,
both in macguyver castle (the Guild Hall, and the Piano
Someone walking up to such a link will get the shared or
private version of the scene based on whether they click
in the rectangle occupied by the previous occupant...
i.e. a situation similar to a bug we used to have where
enough people using a link could prevent you from
accessing your own copy. So, if you really WANT to be in
the shared copy, be sure to click on a person who is in
there. You are not guaranteed to be able to get a private
copy if enough people are already on the link.
Note that shared scenes cannot have actors and scripted
elements and expect them to really work right for
latecomers. Feel free to experiment.
The Guild Hall and Piano room are also WIDE scenes (the
only in Evergreen). If you can't see yourself, try typing
some chat, or walking around.
- * WIDE SCENES
Oh, I never wrote this up here. Here is the description
from the other post.... but the short hand is: this is
OPTIONAL and is turned on by changing the background name
from "cave" to "cave.width.horizon"
where width and horizon are in % of normal. Hence:
"cave.200.25" would mean "use the
background file cave.jpg which is assumed to be 200% (2x)
the width of a normal scene (meaning people are not all
seen at the same time and you have to walk around to see
everything). The horizon is set 25% from the top, so
people can only walk on the lower 75% of the screen --
actors can still be placed anywhere... and an actor
position of 0-100 percent spans the full width of the
screen. Don't set the actor to 180 to get them on the far
right of the scene. 100 is always the far right.
Heck, I guess that's enough explanation for now. The
camera work is automatic and complicated. Varying for
fight scenes and scripted actions.
4/14/2003 ALPHA 75 INCLUDES:
- * COMPATIBILITY:
Excellent! But you can only play with other people with
same version of game.
- * [bugfix] fixes
- * [bugfix] fixes
hand/element training in use
- * [bugfix] fixes HP
- * [bugfix] fixes
miscellaneous lag tricks
- * [bugfix] racers.txt
file can use monsters from your world
- * MORE CONTROL OVER UDP
If the program needs to open more than one UDP port, it
will start with the value you give on the Network Options
screen, and then start adding one. So if you set Network
options to 8000, then the first port it opens will be
8000, the second 8001, etc. The game probably won't open
more than a couple of these ever, but hey, now you have
some control over it. This might help people get skins
xferred through firewalls by opening a small range of
- * TIMING CHANGE
Whenever I change this stuff, I risk making a bunch of
versions of windows incompatible or something. So, pay
attention to whether or not you see the game 'freeze'
(stop displaying properly)... I *think* this should be
better. In particular, less lag when entering a scene
with your party members.... maybe.
- * You may now have over
FIVE THOUSAND ITEMS defined in your world. (woo hoo!)
But with wacky limits...
-- character may have 0-100 of each of these (depending
on their current wallet size)
-- character may have 0 or 1 of each of these. If you try
to give them more, it will just ignore your attempt and
leave their count at ONE.
Anyway, save the lower 1024 for things like potions that
the user needs more than one of at a time, and use the
top 4096 for stuff which makes sense to only have one
- * LEVELS.TXT SUPPORTS
GENDER-SPECIFIC LEVEL NAMES
How does it work, you ask? Well, let me tell you! First
off, it is 100% forward compatible with existing worlds,
so if you don't want to genderize your level names, you
can ignore this feature.
In the table where right now you have an entry like:
You can, instead have:
Those who have read the evergreen gender.ini file will
recall there are 4 genders, and they can be defined by
the world. In evergreen, 0 is undeclared, 1 is male, and
2 is female. So I don't need a gender 3. Plus, since any
missing entry will get the value for Gender0, I really
only need Gender0 for all the names which apply equally
to male and female and I only have to do something
special for the ones which need a special female version.
Note that gender1 (male) is empty, so it will inherit
gender0 -- WHICH IS MANDATORY. I mean, you HAVE to have a
gender0 entry. So I let mine do double duty and play the
role of gender1 (male) as well.
So, if all that is too confusing for you, and you're just
going to copy and paste from evergreen anyway, then just
think of it this way. If you only need one name, then
just do this:
But for those entries where you NEED a female equivalent,
Those are two 'pipe' characters by the way. That's on the
SHIFT - \ key on american keyboards. If you don't have
one on your godless pig-dog foreign keyboard, you can
copy and paste from the example in the levels.txt file.
And after all that, Evergreen only has about 4
gender-specific levels. (Emperess, Sorceress, and
Priestess come to mind).
- * NEW LEVELS.TXT
This lets you specify an initial value for each of the
five abilities (wisdom, strength, etc.) to be given to a
new character of that class.
See levels.txt for details.
3/16/2003 ALPHA 74 INCLUDES:
- * COMPATIBILITY:
Excellent! Actually, due to some more terrific secutiry
features, you won't be able to play against earlier
releases. But your characters will be fine. (I mean you
will only be able to play with other A74 players)
- * BugFix: DEATH BLOW
(last smash from the grave)
- * NEW OPCODE: SET_LEN
This lets you measure the length of a cookie string. So
if cookie "A" were "hello" then:
SET_LEN len, #<A>
would leave "5" in cookie 'len'
- * NEW OPCODE:
This lets you extract individual characters from a cookie
(and stick them in a different cookie) A say cookie A had
"brightline" in it, then
SET_SUBSTR B, 0, 5, #<A>
would leave cookie B with "bright" in it. So
the order of arguments are:
SET_SUBSTR <result cookie>, <start offset>,
<numcharacters>, <source cookie>
start offset starts with ZERO for the first character in
the cookie, not ONE.
- * NEW PET COOKIES
returns total number of pets owned by host
returns level of highest level pet owned by host
returns monster ID of the host's "current pet"
or 0 if the host has no pet in the scene at the time the
script asks. Note: this is NOT what Fred asked for. Also
it is of specialized use since you can't actually bring a
pet into the scene WHILE the script is running. So this
is mainly for checking at the end of a FIGHT or after
some event has restarted the scene.
Where NNN is a monster ID.
These returns how many pets of that monster ID are
currently in the possession of the host (whether or not
they are in the scene).
so #<num.hostHasPet47> tells how many "monster
47s" are owned by the host. Note again that these
are MONSTER ids, which are different from the ITEM id
which may have been used to purchase a pet.
I believe this is what Fred wanted
- * ACTOR WALKING SPEEDS
The MOVE command now supports additional modes as the
0 - normal speed
1 - instant jump
2 - 2x normal speedf
3 - 3x normal
4 - 4x normal
5 - 5x normal
- * MAP OBJECTS limit up
from 256 to 1024. This is the number of defined 'objects'
NOT the number of links per map, which is still 255.
- * NEW LINK PROPERTY AND
COOKIE 'link style'
This is called 'style' and is crammed into the link
editor. It is a number between 0 and, say, 1 million). It
is not used directly by the game engine at all, but is
available to your script via a new cookie:
So when you are inside a scene, this cookie will give you
the style number for the closest link (which likely is
the link which started the scene). You can then use this
to categorize your links, rather than setting all the
individual properties (like fx, weather, etc) you might
have a style number which means 'caves' or 'on moon' or
something else which tells you all sorts of things you
want to do in your scene.
I haven't really tested this very much, just to warn
1/18/2003 ALPHA 73 INCLUDES:
- * COMPATIBILITY:
- * [bugfix] Fixes game
freeze when a level 100 character dies.
- * SERVER TIME COOKIES
This requires the use of the new MIX which ships with
this version (1.15 or later), but allows the scene
developer to access time from the server's perspective
(depends on the time settings of the PC running the
server). The cookies are the same as the regular time
cookies, but you add the word 'server' like this:
there are six total.
Plus 2 new ones
For c programmers, these return the time_t value you get
from the time() function. Its an absolute number of
seconds since midnight, January 1, 1970
It's not too useful in the absolute, but you can use it
to measure how many seconds have elapsed between two
points in time...
SET start #<num.timeNow>
.. sometime later...
SET now #<num.timeNow>
SUB now, #<start>
COMPARE now, 120
This one's for you, Volte6. Please note that you can't
use the time cookies to just print out a pretty time like
1: time is #<num.timeHour>:#<num.timeMinute>
because you really want the minute to have a leading 0
when it is less than 10, and Quest is too dumb to do that
I just noticed that myself.
- * GIVE/TAKE NOW ALLOW N
ITEMS AT ONCE
I have relented. My attempts to suppress this have only
led to wacky scripts which waste bandwidth.
GIVE I3 gives one of item 3
GIVE I3.4 gives four of item 3
Ditto for TAKE, HOST_GIVE, and HOST_TAKE
I still think giving large numbers of items is silly and
the mark of a bad world. bad bad bad. But if you must do
it, let's try to make it economical of bandwidth.
Note that this still does not allow you to TAKE ALL. (all
items in inventory)
And this only works for items, not spells, etc.
(equipment pieces are also items, so it works for
* CLASS MORPHING CAN PRESERVE ELEMENT/HAND TRAINING
I hope this doesn't turn out to be a.) a big mistake, or
b.) break a bunch of worlds... but now when your
character morphs to a new class, it gets to keep its old
hand and element training (unless the class is set to a
higher starting training level. it gets the higher of the
- * NEW HOST COOKIES
This one's for Fred:
Use COMPARE with the value of your choice and IF> etc
to jump to proper label.
1/12/2003 ALPHA 72 INCLUDES:
- * COMPATIBILITY:
- * Dead people can give
certain items. Gold to anyone (so you can purchase
resurrection from a team mate or NPC) and items which do
not themselves have an HP or MP modification bound to
- * Animal Kingdom has a
way to get resurrrected... at a price.
- * Goblin Rock has a way
to get resurrected... if you have the patience.
- * Misc Bug Fixes
- * Skin files now get
their "last modified date" update each time you
encounter someone wearing it. This means you can sort the
SKINs folder by date and skins you haven't seen anyone
use for a long time will be at the bottom. It's a bit of
a violation of coding standard to update the modified
date instead of the access date, but Windows doesn't let
you easily sort by access date, so there you go! Life
- * I had some ideas for
some new spell effects, perhaps you will see some new
- * More hacker detection
crap. Oh how I love to add hacker detection crap Thank
you, mister hacker, for making my life complete. More
automatic punishment/banishment for use of certain hacks.
A nice form letter to send to people who write me to ask
why the program no longer works. (now *that* I really DID
enjoy writing )
- * New copy of MIX
server with support for remote admins (see the file
c:\wos\mix\admins.dat for details). It's optional, and
defaults to OFF. Even though the file extension is .dat,
you can edit it with NotePad or WordPad
- * New MIX Server
Command "arenaPK" which is the same as
"noPK" except that it allows PK characters to
connect (but PKing is restricted to 'dangerous' maps,
like the Evergreen Arena)
10/27/2002 ALPHA 71
- COOKIE POINTERS: The
de-referencing character was changed from @ to * so as to
not conflict with label names.
10/6/2002 ALPHA 70 INCLUDES:
- * COMPATIBILITY:
- * WORLD SOUND THEMES
You asked for it, and thanks to the inspiration of
Makarei sending me a pile of great ambient noises, I have
added the ability to define your own sound themes (note:
these are the background ambient noises, not the visual
appearance of interface themes)
Full details in the quest.txt file, but basically there
is a new table +THEMES which defines them, and then you
use THEME n within your script to play them. At present
they do NOT show up in the link editor as options to be
bound to 'nearby places' (so use the stock scene script
and test as necessary for that)
syntax of a table entry looks like this:
id, name, loop, sec1=sound1, sec2=sound2, ...
You can have at most one loop sound (played over and over
continuously) and up to 10 or 20 one-shot sounds which
are played at random intervals. For example
"10=drip" means "play sound effect
drip.wav, at random intervals that average out to about
- * MIDI PLAY LIST
More or long the lines already documented in the
music.ini file. Note that if any of your MIDI files have
a built-in "loop" setting, they will jam the
- * NEW QUEST OPCODE:
Yep, just like give, but only the host gets it
- * NEW QUEST OPCODE:
Yep, just like take, but only the host gets took. And
please do NOT expect every other quest command to get
this special treatment. Also, I was too lazy to test
this, so there!
- * COOKIE DE_REFERENCING
Just add an at-sign (@) in front of the cookie wrapper
#<cookieName> is contents of cookie called
@#<cookieName> is contents of cookie whose name is
in cookie called cookieName.
SET greenPrize, "a pickle"SET redPrize, "a
tomato"1: pick a prize by typing 'red' or 'green'ASK
30SET prizeKey #<lastAsk>Prize1: you said
'#<lastAsk>'1: prizeKey is #<prizeKey>1:
prize is @#<prizeKey>
Pick a prize by typing 'red' or 'green'
[user input] green
You said 'green'
prizeKey is greenPrize
prize is a pickle
If this makes no sense to you, you didn't need cookie
de-referencing... Note a 'bad pointer' will just result
in an empty string.
You could also do arrays this way, as in:
; say cookie 'index' is used for array index
SET arrayKey, MYARRAY#<index>
SET value, @#<arrayKey>
value now contains whatever was in MYARRAY[index]
Let's see now, writing to the array element is NOT a
dereference, I hope this is clear:
; let's pretend we are interested in ARRAY
SET index, 47
; make a key value 'ARRAY47' (which is just a cookie
SET arrayKey, ARRAY#<index>
; now 'read' the current value of ARRAY47
; for this we need the @ indirection operator
; since we want the CONTENTS of ARRAY47 and not
; just the cookieName "ARRAY47"
SET oldValue, @#<arrayKey>
; now 'write' a new value into ARRAY47 and here
; we do NOT need the @ indirection operator.
; If we did, we would not be writing into
; cookie 'Array47' we would be writing into
; a cookie whose name was inside 'Array47'
SET #<arrayKey>, newValue
NOW are we confused?
- * NEW ACTOR EVENTS
Two new actor events for you to play with
"@eventActorSpellN." These work like the other
events, but trigger when you use a physical attack or a
spell on an actor in a scene. (as always, scene must
already have ENDed for any events to be seen). Cookie
item.id is set to the id of the right-hand attack weapon
(for Attack) and cookie spell.id is set to the id of the
spell used. NOTE: spells with the 'all' attribute cannot
- * NEW COOKIES: Spell
Wouldn't do you much good to set spell.id if you couldn't
get some info about the spell just cast on the actor.
spell.id read or write. the rest are read-only. This
tells which spell is 'currently selected' and the other
spell cookies always give information about the current
spell.pp cost to buy spell, in pp
spell.price cost to cast spell, in mp
spell.damage pain inflicted (see note)
spell.element spell element (number)
spell.level element level of spell
Note: the damage field tells you what sort of spell it
is. It is the value in the spells.txt table for that
element, so I refer you to that. But negative numbers
generally mean pain, positive numbers generally mean
heal, and 'special values' mean they cause or cure
various diseases. Use the spells.txt documentation for
- * NEW SPELL FLAG: Use
on Self Only = 4
Another per-spell flag. If set, then the spell can only
be cast upon the caster. (other limitations continue to
apply, this is just one more).
For somewhat older release
notes, click here
For even OLDER RELEASE NOTES, click here.
Anyway, none of this is binding.
Please don't develop anything too elaborate with these tools as
all is liable to change and then you will be mad at me.
Well of Souls (the RPG) is the
copyrighted property of Dan Samuel of Synthetic Reality Co. All rights reserved. Eventually this
might be a shareware program which will require a registration fee to be
played longer than a certain evaluation period.
People contributing Worlds will
probably not see any return on their investment short of their
credits (and my gratitude). My intention is for the game to make
it easy to share worlds with friends. To the degree this web site
can be used to facilitate that, I will make my own best effort. I
will try not to exercise any censorship, but I might have to
provide some sort of rating system for worlds deemed to contain
Let me know what you like, what
you hate, what you'd like to see, and any other feedback you
might have. I'm not in any rush to finish this. It will be done
when it is done, and hopefully the development copies will become
more enjoyable throughout the process.