Necromanteion [0.7.1]

Discussion of all aspects of multiplayer development: unit balancing, map development, server development, and so forth.

Moderator: Forum Moderators

User avatar
Thanatos
Posts: 408
Joined: January 17th, 2006, 9:00 pm
Location: The End.
Contact:

Re: Necromanteion

Post by Thanatos »

I figured both. :)

So I took a look at TSG, scenario 6b:

Code: Select all

             [store_locations] # as found in TSG, 06b - The Long March for determining ambush positions

                x=15-25
                y=9-19
                terrain=Gg,Ggf

                [not]
                   [filter]
                   [/filter]
                [/not]

                variable=spawnhex

             [/store_locations]
This should do for the storing. Much easier and clear. And even includes a check for occupation (if this is done by the empty [not][filter] tags, couldn't figure out, what else they would be good for.)

I will test this now.

Yay! THIS ROCKING WORKS! I did it! Muahaha.
Well, it was interesting to see that the three spwaned units appeared to shape a perfect triangle around the center of the area around the temple. Curious...
ThanatoNoth | Necromanteion | Undead Rights Protection Society
"The gods can demand nothing of me. Even gods answer to me, eventually. [...] I cannot be bidden, I cannot be forced. I will do only that which I know to be right." (Death in Pratchett's "Mort")
User avatar
Thanatos
Posts: 408
Joined: January 17th, 2006, 9:00 pm
Location: The End.
Contact:

Re: Necromanteion

Post by Thanatos »

Well, I am trying to polish the gameplay a bit by adding some more messages. I thought after the rest this would be quiet easy, well... :roll:

My goal was to create a message at start of the game (the turn 1 trigger isn't allowed), which is visible ONLY to the specific side. I did:

Code: Select all

   # START #1: Explaining the scenario.

   #define MESSAGE_START START_SIDE START_X START_Y
      [message]
         x,y={START_X},{START_Y}
         side_for={START_SIDE}
         duration=30
         message= _ "Finally... We've reached the Haunted Valley! Legend says it's the home of the dead. Well, if this is true, we might use them for our purposes. The temple has to be somewhere in the center, I guess. Let's move, we have to hurry, our enemies will be here soon!" 
      [/message]
   #enddef

   [event]
      name=start

      {MESSAGE_START 1 1 14}
      {MESSAGE_START 2 39 14}

   [/event]
Which works fine... but... all players still all see the messages. (Which is quiet uncomfy, due to the fact, that one can see which faction is played by the opponent).

I don't know whats wrong with the code. I think the "start" trigger could use a bit more of an explanation in the wiki, maybe?

/edit: Changed the code slightly: trigger only ONE start event and have both Messages in this very event. Still, both players can see each others messages. Hmm...
ThanatoNoth | Necromanteion | Undead Rights Protection Society
"The gods can demand nothing of me. Even gods answer to me, eventually. [...] I cannot be bidden, I cannot be forced. I will do only that which I know to be right." (Death in Pratchett's "Mort")
User avatar
Gambit
Loose Screw
Posts: 3266
Joined: August 13th, 2008, 3:00 pm
Location: Dynamica
Contact:

Re: Necromanteion [competetive 2P MP scenario, in development]

Post by Gambit »

Thanatos wrote: However, occuping the temple hex has his bad sides too: For every round, the leader will hold the temple, he will suffer a loss of 10 HP (this number is debateable), allowing the leader to die there, if he will not move away in time.
Reminicent of fist of guthix, and an amazing idea. But I HIGHLY recomend a random number between 0 and 10

a. to keep things more interesting
b. to add some randomness
c. to force players to draft more flexible strategies, eliminate one size fits every game
d. the odds of having a 0 sort of appeals to players greed and psychologically trick them into staying too long :twisted:
e. by having randomness theres luck involved like "OH MAN YOU ARE SO LUCKY THAT DIDNT KILL YOU"
User avatar
Thanatos
Posts: 408
Joined: January 17th, 2006, 9:00 pm
Location: The End.
Contact:

Re: Necromanteion [competetive 2P MP scenario, in development]

Post by Thanatos »

I might consider that. Especially your argument "d" is quiet appealing. :twisted:

I still have to alter the temple drain WML so that the unit will actually die on 0 HP or less. Atm it doesn't, it just lives on with negative HP.

Never heard of "Fist of Guthix". Was/is that a Wesnoth scenario?

---

I think I will upload the complete WML file so far in the next days to make the discussion of points still to do more transparent.
After that I will go and concentrate on the map.
Then balancing.
ThanatoNoth | Necromanteion | Undead Rights Protection Society
"The gods can demand nothing of me. Even gods answer to me, eventually. [...] I cannot be bidden, I cannot be forced. I will do only that which I know to be right." (Death in Pratchett's "Mort")
User avatar
Turuk
Sithslayer
Posts: 5283
Joined: February 28th, 2007, 8:58 pm
Contact:

Re: Necromanteion [competetive 2P MP scenario, in development]

Post by Turuk »

*Sneaks in*


Fist of Guthix is a Runescape reference. See the following link for more details if curious.

Fist of Guthix


*Sneaks back out*
Mainline Maintainer: AOI, DM, NR, TB and THoT.
UMC Maintainer: Forward They Cried, A Few Logs, A Few More Logs, Start of the War, and Battle Against Time
User avatar
Thanatos
Posts: 408
Joined: January 17th, 2006, 9:00 pm
Location: The End.
Contact:

Re: Necromanteion [competetive 2P MP scenario, in development]

Post by Thanatos »

Thanks, Turuk.

Well I have worked a bit more on the code.

Recent changes:
- Random temple drain (ranged from 1 to 10 hp).
- Now a unit can die of the temple drain.
- The temple also got labeled - for user convienience.
- Added a message that will be show when "die" is triggered.
- All dialogs polished.

So, the very one bug/problem that still bothers me is the not-working-as-it-should starting message (see second post of this page). If that could be fixed somehow I could move on to map making and then to balance.

:D
ThanatoNoth | Necromanteion | Undead Rights Protection Society
"The gods can demand nothing of me. Even gods answer to me, eventually. [...] I cannot be bidden, I cannot be forced. I will do only that which I know to be right." (Death in Pratchett's "Mort")
User avatar
Gambit
Loose Screw
Posts: 3266
Joined: August 13th, 2008, 3:00 pm
Location: Dynamica
Contact:

Re: Necromanteion [competetive 2P MP scenario, in development]

Post by Gambit »

Basically in fist of guthix the prey must charge this magic... ball... thing by standing near this magical man hole cover (XD). The closer they are to the middle, the faster it charges. However they take damage while charging the ball, which is also multiplied as they get closer.


if its 0 dont unstore them :eng:

also if you go with random amount you want some cool floaty red text above thier heads that tells exactly how much.

i think its something like this

[unstore_unit]
variable=leadervariable (variable in which the leader is stored)
text=$damage (whatever random variable you have set to store the damage)
red,green,blue=255,0,0 (full red, empty blue and green)
[/unstore_unit]

then you run into issues with killed leaders though... you could have it unstore them (with the damage shown), and then imediatly store and clear all units with less_then_equal_to 0 hitpoints
User avatar
Thanatos
Posts: 408
Joined: January 17th, 2006, 9:00 pm
Location: The End.
Contact:

Re: Necromanteion [competetive 2P MP scenario, in development]

Post by Thanatos »

Gambit wrote: if its 0 dont unstore them :eng:
Hmm, interesting.
I somehow think the [kill] tag allows some more effects than just not unstoring the unit.
Just not unstoring the unit for example wouldn't show death animation and so on...

As you can see on page two, zookeeper added the floating damage message to the code already. I edited this so it will show the random number.

Just using [kill] and then [endlevel] works absolutely fine so far.

/addendum: Created a .pbl file. Upload to server comes closer.
ThanatoNoth | Necromanteion | Undead Rights Protection Society
"The gods can demand nothing of me. Even gods answer to me, eventually. [...] I cannot be bidden, I cannot be forced. I will do only that which I know to be right." (Death in Pratchett's "Mort")
User avatar
Gambit
Loose Screw
Posts: 3266
Joined: August 13th, 2008, 3:00 pm
Location: Dynamica
Contact:

Re: Necromanteion [competetive 2P MP scenario, in development]

Post by Gambit »

Okay on units to be killed: while stored and dishing out damage, assign them a role "TBK". Then unstore and display the damage amount, then use [kill] to kill units with the role TBK. (with animations and what not)
User avatar
Thanatos
Posts: 408
Joined: January 17th, 2006, 9:00 pm
Location: The End.
Contact:

Re: Necromanteion [competetive 2P MP scenario, in development]

Post by Thanatos »

This is not needed and much too complicated.
The filter is easily using the coordinates of the temple.
Easy rule= If you occupy the temple hex too long, you will die there.

I actually don't get the need of your recommendations (because the problem was solved 5 posts ago). Of course I will listen if there is a way to really improve the code, but for now I think it's quiet neat.

See the code:

Code: Select all

   [event]
      name=new turn
      first_time_only=no
   
      [if]
         [have_unit]
            x,y=20,14
            [not]
                race=undead
            [/not]
         [/have_unit]
       
         [then]
            [store_unit]
               [filter]
                  x,y=20,14
                  [not]
                     race=undead
                  [/not]
               [/filter]
               variable=temple_dweller
            [/store_unit]

            [set_variable]
                name=rand_drain
                rand=1..10
            [/set_variable]
           
            [set_variable]
                name=temple_dweller.hitpoints
                add=-$rand_drain
            [/set_variable]
           
            [unstore_unit]
                variable=temple_dweller
                find_vacant=no
                text= _ "$rand_drain"
                {COLOR_HARM}
            [/unstore_unit]

            [if]
                [variable]
                   name=temple_dweller.hitpoints
                   less_than_equal_to=0
                [/variable]

                [then]
                   [kill]
                      x,y=20,14
                      animate=yes
                      fire_event=yes
                   [/kill]

                   [endlevel]
                   [/endlevel]
                [/then]

                [else]
                [/else]
            [/if]

            {CLEAR_VARIABLE temple_dweller}
            {CLEAR_VARIABLE rand_drain}    

         [/then]
      [/if]
   [/event]
ThanatoNoth | Necromanteion | Undead Rights Protection Society
"The gods can demand nothing of me. Even gods answer to me, eventually. [...] I cannot be bidden, I cannot be forced. I will do only that which I know to be right." (Death in Pratchett's "Mort")
User avatar
Gambit
Loose Screw
Posts: 3266
Joined: August 13th, 2008, 3:00 pm
Location: Dynamica
Contact:

Re: Necromanteion [competetive 2P MP scenario, in development]

Post by Gambit »

AH! cool. you store them, damage them, unstore (without clearing) and then even though they're unstored you quickly check the hitpoints to see if they need killed or not. lol i was way oercomplicating that :oops: i think i was thinking broad range, multiple units and different possible places (forgetting that the only place this event is even possible is with a leader at the temple...)

okay ill shutup.... or at least think about what you actually need first... :lol2:

i cannot wait to play this.... :D
User avatar
Thanatos
Posts: 408
Joined: January 17th, 2006, 9:00 pm
Location: The End.
Contact:

Re: Necromanteion [competetive 2P MP scenario, in development]

Post by Thanatos »

Gambit wrote:AH! cool. you store them, damage them, unstore (without clearing) and then even though they're unstored you quickly check the hitpoints to see if they need killed or not. lol i was way oercomplicating that :oops: i think i was thinking broad range, multiple units and different possible places (forgetting that the only place this event is even possible is with a leader at the temple...)

okay ill shutup.... or at least think about what you actually need first... :lol2:

i cannot wait to play this.... :D
Actually the drain will affect all non-undead units occupying the temple at start of turn. Of course it's most likely, there will be a leader on this hex, but in combination with the drain the leader will also have to leave that hex again for a while to recover. In this situation, to avoid just blocking the hex with a non-leader unit, the drain is effective to all non-undead units.

But no matter which unit will be drained or even killed by the drain, the unit will always be standing on the hex, which is actually causing the drain, and this place is fixed. Even with having more "temple" hexes the principle would stay the same: If you know, which hex has the ability to drain, you also now, where the units are that are subject to this drain or kill. ;)

Actually you will be able to play this soon. :D
I think about uploading version 0.3 of the code to the add-on server sometime tomorrow.
The map is still unfinished, but you could test the code on this rough sketch and maybe edit the map as you want it to look like, at least for now. I will certainly do a map myself, but this may take time.

I tend to make two more releases before 1.0, that is some 0.7 release after creating the map and then some 0.9 release for balancing purposes only. When they will come, I don't know, it's just a rough sketch for me, to keep on track. All plans are subject to change, if needed. (In fact, I am not even sure about feature freeze yet. I had an idea of making the scenario more balancable by the players themselves, including some kind of difficulty options to alter some variables of the game [span of drain, number of undead spawns, turn from which the spawns begin]. There's a good reference on how doing this in the SX macros.)
ThanatoNoth | Necromanteion | Undead Rights Protection Society
"The gods can demand nothing of me. Even gods answer to me, eventually. [...] I cannot be bidden, I cannot be forced. I will do only that which I know to be right." (Death in Pratchett's "Mort")
User avatar
Gambit
Loose Screw
Posts: 3266
Joined: August 13th, 2008, 3:00 pm
Location: Dynamica
Contact:

Re: Necromanteion [competetive 2P MP scenario, in development]

Post by Gambit »

so if it can happen to any non-undead unit, what happens when say... a spearman is drained to death? the level still ends? :s
User avatar
Thanatos
Posts: 408
Joined: January 17th, 2006, 9:00 pm
Location: The End.
Contact:

Re: Necromanteion [competetive 2P MP scenario, in development]

Post by Thanatos »

Yeah, you got me.
Well, but just removing the [endlevel] tags solves the problem.
If the leader dies, the level ends automatically, even without these tags.*)
Problem solved. Thanks pointing this out. :D


*) edit: No, it doesn't. However, applying the [endlevel] tag to the "die"-event fixes the issue. Tested and done.
Last edited by Thanatos on January 9th, 2009, 12:48 am, edited 1 time in total.
ThanatoNoth | Necromanteion | Undead Rights Protection Society
"The gods can demand nothing of me. Even gods answer to me, eventually. [...] I cannot be bidden, I cannot be forced. I will do only that which I know to be right." (Death in Pratchett's "Mort")
User avatar
Thanatos
Posts: 408
Joined: January 17th, 2006, 9:00 pm
Location: The End.
Contact:

Re: Necromanteion [competetive 2P MP scenario, in development]

Post by Thanatos »

I have changed the store_locations filter only slighty. Due to the wiki, the notation should be right. However, now the spawns don't appear anymore.

Or is it because there are no variables allowed in turn names?
/edit: No that isn't it. It's the [store_locations] filter. But I copied it right from the wiki.
Will search forums for more info.

Code: Select all


      {VARIABLE global_spawn_startturn 5}
      {VARIABLE global_spawn_number 3}
      {VARIABLE global_spawn_radius 5}

   # NEW TURN:
   #          - Spawn undead, if no leader occupies the temple hex.
   #

   #define SELECT_RANDOM_UNDEAD 
      [set_variable]
         name=rand_ud
         rand="Ghost","Ghoul","Skeleton","Skeleton Archer","Walking Corpse"
      [/set_variable]
   #enddef

   #define SPAWN_RANDOM_UNDEAD TIMES

       [set_variable]
          name=loops
          value=0
       [/set_variable]

       [while]
          [variable]
             name=loops
             less_than={TIMES}
          [/variable]

          [do]
             {SELECT_RANDOM_UNDEAD}
             
             [store_locations]
                terrain=Aa^Vea,Aa^Vha,Ch,Chr,Cud,Gg,Ggf # snipp...
                [and]
                   x,y=20,14
                   radius=$global_spawn_radius
                [/and]
                [not]
                   [filter]
                   [/filter]
                [/not]
                variable=spawnhex
             [/store_locations]

             [set_variable]
                name=maxlength
                format=$spawnhex.length
             [/set_variable]
             [set_variable]
                name=maxlength
                add=-1
             [/set_variable]
             [set_variable]
                name=rand_container
                rand=1..$maxlength
             [/set_variable]

             [set_variable]
                name=rand_posx
                to_variable=spawnhex[$rand_container].x
             [/set_variable]
             [set_variable]
                name=rand_posy
                to_variable=spawnhex[$rand_container].y
             [/set_variable]
             
             {GENERIC_UNIT 3 $rand_ud $rand_posx $rand_posy}

             [set_variable]
                name=loops
                add=1
             [/set_variable]

          [/do]

       [/while]

       {CLEAR_VARIABLE loops}
       {CLEAR_VARIABLE rand_container}
       {CLEAR_VARIABLE spawnhex}
       {CLEAR_VARIABLE maxlength}
       
   #enddef

   [event]
      name=turn $global_spawn_startturn

      [event]
         name=new turn
         first_time_only=no
   
        [if]
            [not]
              [have_unit]
                  x,y=20,14
                  [and]
                     canrecruit=yes
                  [/and]
              [/have_unit]
            [/not]
         
         [then]

            {SPAWN_RANDOM_UNDEAD $global_spawn_number}

            {CLEAR_VARIABLE rand_ud}
            {CLEAR_VARIABLE rand_posx}
            {CLEAR_VARIABLE rand_posy}

         [/then]

         [/if]

      [/event]
   [/event]


ThanatoNoth | Necromanteion | Undead Rights Protection Society
"The gods can demand nothing of me. Even gods answer to me, eventually. [...] I cannot be bidden, I cannot be forced. I will do only that which I know to be right." (Death in Pratchett's "Mort")
Post Reply