[crossfire] Circular lighting & negetive glow_radiuses
Mark Wedel
mwedel at sonic.net
Wed Mar 30 01:43:50 CST 2005
Alex Schultz wrote:
>>
>>
common/living.c: Making the glow radius additive is probably a bad
>>
thing. A player shouldn't be able to light a few torches and get an
>>
effect to see everything about them (plus in real life, given the
>>
(pi)r³ of real lighting, doesn't much up very well.). Same note
>>
applies for map.c and server/spell_attack.c
>
>
>
As I understand the additive lighting does accurately act like in real
>
life due to to the formulas I used in los.c which is essentially a
>
condensation of the pythagorean theorem and the inverse square law
>
(except with different constants to make up for the different units).
>
Like the old comment said, 2 lights doesn't go twice as far as one, but
>
the new formulas in los.c do actually account for that and each
>
successive light is less and less important to the range. However, due
>
to gameplay balance issues, it may be best to take additive lighting
>
out. Perhaps additive lighting should happen everywhere except in the
>
player's inventory, that way the player couldn't just get a ton of
>
lanterns and use them all at once for such. Also spell effects with
>
negative glow_radiuses that could be made in the future would work much
>
better with additive lighting on the ground anyways.
Well, that fixes the lantern problem. But I also wonder how it will work with
spell effects, like say a firebolt or some others. While this is one logical
spell effect, oftentimes, the way merging code and whatever happens, there may
be in fact be many spell effects objects on the same space (certainly true with
cone and ball type spells). This change could make those spells very very bright.
Also, I'm not 100% convinced of your changes. The various code sets the total
light level for a space, and the LOS code then figures out effective lighting on
each space. The LOS code doesn't know about stacked light effects.
So this seems to me that if there are 2 brightness 2 objects on the space, for
all purposes, that is indistinguishable from a 1 brightness 4 object.
So it seems that either the code would be additive, or objects are effectively
dimmer than they were before because a more realistic distance calcuation is
used. To me, that could create its own problems (I'm thinking that some maps
were designed with light sources placed at various distances to illuminate the
right things). My initial thought when the circular lighting code was put in
was that it would handle the corners more properly, not necessarily make things
dimmer. Although breaking the maps probably isn't that much an issue (biggest
issue in all this is the rounding errors that are happening)
>
>>
common/object.c: op->glow_radius !=0 would be clearer checks that >0
>>
and <0
>
>
>
I would have done that in many places, except the old check in many
>
places was just "if (op->glow_radius)" which would return false upon
>
glow_radius being null, which as I understand glow_radius != 0 would
>
return true upon null, which wouldn't be good.
if (op->glow_radius) is a zero/nonzero check. IF glow_radius is non zero, it
will progress through the code in the if block. When using pointers, it does
the check against null and not against 0 (although, on probably most every
system out there, null is 0).
So that said, the updated check in common/object.c is still not right -
checking for non zero against an integer field is not proper code. The line
should really just be:
if(QUERY_FLAG(op,FLAG_BLOCKSVIEW)|| (op->glow_radius!=0))
...
so all places where you are comparing glow_radius against NULL are incorrect
(it is effectively the same as comparing against 0, which you are already
doing). However, most compilers will warn against such a structure, because
NULL is usually defined as (void*)0, so you are comparing an integer against a
pointer which most compilers don't like.
More information about the crossfire
mailing list