Making the game harder, take two

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • Nick
    Vanilla maintainer
    • Apr 2007
    • 9647

    Originally posted by Timo Pietilä
    I'm hoping that current vanilla code gets to some stable state where editing things get easy, so that I can make that variant myself. Call it ancient angband or AAngband.
    This sort of thing is PRECISELY the intent of AngbandBase.
    One for the Dark Lord on his dark throne
    In the Land of Mordor where the Shadows lie.

    Comment

    • Atarlost
      Swordsman
      • Apr 2007
      • 441

      Originally posted by Timo Pietilä
      Maybe we should then change that perception.
      You can't change that perception. Dead characters have no real cost to them. The only way you could make wins/game more important than wins/time is to charge actual real money for each new character. You can't unlearn what has been learned, you can only hope to make it obsolete knowledge.
      One Ring to rule them all. One Ring to bind them.
      One Ring to bring them all and in the darkness interrupt the movie.

      Comment

      • Nick
        Vanilla maintainer
        • Apr 2007
        • 9647

        General Comment

        Remember the "Is Angband dying" threads from a few years back?

        Don't see those any more.

        Also, a quote from a variant maintainer about their variant:

        It is an attempt to answer the hypothetical question: What would Angband look like if it was more aggressive about taking more ideas from the variants?
        Seems like that question is no longer hypothetical; or maybe the pet peeves are different now.

        Feel free to quote me selectively and out of context - turnabout is fair play
        One for the Dark Lord on his dark throne
        In the Land of Mordor where the Shadows lie.

        Comment

        • nppangband
          NPPAngband Maintainer
          • Dec 2008
          • 926

          Originally posted by Magnate
          Well, that's not my recollection, but we are talking about twenty years ago.
          I was thinking about the original RAK Moria...25 years ago. Home computers were a little bit more of a novelty back then. You had your commodore 64, but home computing was kind of a novelty back then. Things had progressed a long way by 1990.

          Originally posted by Magnate

          1. You work on a version with extremely limited circulation (i.e. yourself and one or two trusted testers), iterating for ages to rebalance so that nothing is too far out of whack when you release.

          2. You work on a version with public nightly builds, getting yourself a potentially infinite tester base, but every single change gets picked apart and overanalysed instead of being treated the way it ought to be: as a single step in a long evolutionary process between releases.

          If I can respectfully suggest a third option, it is that at some point the Angband dev team agree to all stop making changes and creating new ideas, and for 1-2 months to work on nothing but the "boring stuff", such as: refining game balance, de-bugging, and handling administrative details like help files. That's kind of how Diego and I work in NPP. As much as I hate stopping the creative progress, I found it very necessary.
          NPPAngband current home page: http://nppangband.bitshepherd.net/
          Source code repository:
          https://github.com/nppangband/NPPAngband_QT
          Downloads:
          https://app.box.com/s/1x7k65ghsmc31usmj329pb8415n1ux57

          Comment

          • nppangband
            NPPAngband Maintainer
            • Dec 2008
            • 926

            Originally posted by Nick
            Remember the "Is Angband dying" threads from a few years back?

            Don't see those any more.

            Also, a quote from a variant maintainer about their variant: "It is an attempt to answer the hypothetical question: What would Angband look like if it was more aggressive about taking more ideas from the variants? "

            Seems like that question is no longer hypothetical; or maybe the pet peeves are different now.

            Feel free to quote me selectively and out of context - turnabout is fair play
            I started NPP in a very different time. Vanilla had barely changed in 10 years, and there were many thriving variants. I just wanted to show that ideas from variants like EYAngband, Oangband, (quests, 4gai, rod/wand stacking) and some of the popular patches could work in Vanilla Angband without destroying game balance. So if course I support vanilla development. I was the one who had the audacity to make an "alternate vanilla" because I was tired of waiting for the real one to adopt any changes.

            And it did work. NPP was quite popular at its peak. Unfortunately, full-fledged Vanilla development kind of undercuts my mission statement. Also, just as Vanilla development was picking up, I took a 3 year sabattical. So even though NPP development and the NPP forums remained active, it kind of fell off the map here at .oook.

            But I think NPP still has it's place, even if it will probably never again be as widely played as it once was. It still has features like quests and the full fledged 4gai that will probably never make it into Vanilla, and I intend on retaining the "old-school" difficulty mentality. Many players still want a vanilla-like game with those options.
            NPPAngband current home page: http://nppangband.bitshepherd.net/
            Source code repository:
            https://github.com/nppangband/NPPAngband_QT
            Downloads:
            https://app.box.com/s/1x7k65ghsmc31usmj329pb8415n1ux57

            Comment

            • Dean Anderson
              Adept
              • Nov 2009
              • 193

              Originally posted by Magnate
              Right, and there are two ways to deal with this:

              1. You work on a version with extremely limited circulation (i.e. yourself and one or two trusted testers), iterating for ages to rebalance so that nothing is too far out of whack when you release.

              2. You work on a version with public nightly builds, getting yourself a potentially infinite tester base, but every single change gets picked apart and overanalysed instead of being treated the way it ought to be: as a single step in a long evolutionary process between releases.
              There is a big excluded middle there. In both the variants I've made, the process has been:

              3. You talk on the forum about what you're intending to do, and get feedback and overanalysis. Taking that on board, you work on a version by yourself, with much iteration to make sure nothing is too far out of whack, then you release it and get more feedback and overanalysis of what you just did. You use that to make further tweaks and adjustments in the next version.

              P.S. The comment about being tempted to add achievements was a joke. Never mind.
              Actually, I could see achievments (assuming they were just stored locally, not connected to online points in some kind of XBox-live like way) could be fun. After all, the various Ironman options are effectively achievments anyway...

              Comment

              • ewert
                Knight
                • Jul 2009
                • 707

                Originally posted by nppangband
                and for 1-2 months to work on nothing but the "boring stuff", such as: refining game balance
                Omg game balance is boring?! Nobody told me ... I love tinkering with balance. =)

                Comment

                • Dean Anderson
                  Adept
                  • Nov 2009
                  • 193

                  Originally posted by d_m
                  Another way to do this would be to tie restocks to experience gained, not turns. That way, when you come up after a session in the dungeon, the XP delta determines the likelihood that items have turned over and/or new ones have arrived.
                  I've been trying this out today, and I have to say that I really like it.

                  I set it to refresh the shops each time you go up a level (well, almost - there was the question of what to do if you get level drained - so I actually set it to refresh each time your max_exp crosses the level threshold rather than when you actually go up a level, but most of the time this will happen at the same time).

                  The thing that surprised me was how the predictability of it changed things. When you go up a level, you then have the urge to go back to town and see if the shops have anything new. And similarly, if you've already gone up one level since entering the dungeon and you're approaching a second level increase during the same dive, you start getting twitchy about going back to town before you hit that second level increase so that you don't miss out on any useful goodies that might have been added to the shop in your absence and you might lose if you let it refresh a second time without surfacing...

                  It's amazing how such a small thing can have such a large overall effect on your enjoyment level!

                  Comment

                  • ewert
                    Knight
                    • Jul 2009
                    • 707

                    Originally posted by Dean Anderson
                    3. You talk on the forum about what you're intending to do, and get feedback and overanalysis. Taking that on board, you work on a version by yourself, with much iteration to make sure nothing is too far out of whack, then you release it and get more feedback and overanalysis of what you just did. You use that to make further tweaks and adjustments in the next version.
                    Tbh, isn't that just #2 but fleshed out with nice words ...

                    But anyways, that's happening right now, as far as I can see. Shoot the breeze, get feedback, code something, test, give to others to test and pick apart, etc. Without the superlatives though I guess.

                    Comment

                    • d_m
                      Angband Devteam member
                      • Aug 2008
                      • 1517

                      Originally posted by Dean Anderson
                      I've been trying this out today, and I have to say that I really like it.
                      Awesome! Can you send me the patch (@plastic-idolatry.com) or post a link or something? I'd really like to try it out.

                      I do think it accomplishes many of the other goals without destroying shops/shopping.
                      linux->xterm->screen->pmacs

                      Comment

                      • Nick
                        Vanilla maintainer
                        • Apr 2007
                        • 9647

                        Originally posted by nppangband
                        But I think NPP still has it's place, even if it will probably never again be as widely played as it once was. It still has features like quests and the full fledged 4gai that will probably never make it into Vanilla, and I intend on retaining the "old-school" difficulty mentality. Many players still want a vanilla-like game with those options.
                        I couldn't agree more - the latest NPP is excellent.
                        One for the Dark Lord on his dark throne
                        In the Land of Mordor where the Shadows lie.

                        Comment

                        • Dean Anderson
                          Adept
                          • Nov 2009
                          • 193

                          Originally posted by d_m
                          Awesome! Can you send me the patch (@plastic-idolatry.com) or post a link or something? I'd really like to try it out.

                          I do think it accomplishes many of the other goals without destroying shops/shopping.
                          I can't post a direct diff, because I've made other changes to the files too. However, it's a simple change to make.

                          Assuming things haven't changed too drastically since 3.1.2v23 (which is the version I modified), all you need to do is:

                          1) Find the process_world function in dungeon.c.

                          2) Comment out or delete the red lines shown below from the function (the function is quite long so I haven't shown the whole thing):

                          Code:
                          	/*** Handle the "town" (stores and sunshine) ***/
                          
                          	/* While in town */
                          	if (!p_ptr->depth)
                          	{
                          		/* Hack -- Daybreak/Nighfall in town */
                          		if (!(turn % ((10L * TOWN_DAWN) / 2)))
                          		{
                          			bool dawn;
                          
                          			/* Check for dawn */
                          			dawn = (!(turn % (10L * TOWN_DAWN)));
                          
                          			/* Day breaks */
                          			if (dawn)
                          				msg_print("The sun has risen.");
                          
                          			/* Night falls */
                          			else
                          				msg_print("The sun has fallen.");
                          
                          			/* Illuminate */
                          			town_illuminate(dawn);
                          		}
                          	}
                          
                          
                          	[color=red]/* While in the dungeon */
                          	else
                          	{
                          
                          		/*** Update the Stores ***/
                          
                          		/* Update the stores once a day (while in dungeon) */
                          		if (!(turn % (10L * STORE_TURNS)))
                          		{
                          			int n;
                          
                          			/* Message */
                          			if (OPT(cheat_xtra)) msg_print("Updating Shops...");
                          
                          			/* Maintain each shop (except home) */
                          			for (n = 0; n < MAX_STORES; n++)
                          			{
                          				/* Skip the home */
                          				if (n == STORE_HOME) continue;
                          
                          				/* Maintain */
                          				store_maint(n);
                          			}
                          
                          			/* Sometimes, shuffle the shop-keepers */
                          			if (one_in_(STORE_SHUFFLE))
                          			{
                          				/* Message */
                          				if (OPT(cheat_xtra)) msg_print("Shuffling a Shopkeeper...");
                          
                          				/* Pick a random shop (except home) */
                          				while (1)
                          				{
                          					n = randint0(MAX_STORES);
                          					if (n != STORE_HOME) break;
                          				}
                          
                          				/* Shuffle it */
                          				store_shuffle(n);
                          			}
                          
                          			/* Message */
                          			if (OPT(cheat_xtra)) msg_print("Done.");
                          		}
                          	}[/color]
                          
                          
                          	/*** Process the monsters ***/

                          3) Find the check_experience function in xtra2.c (it's the first function in the file).

                          4) Add the following function just before it:

                          Code:
                          [color=yellow]/*
                           * Restock all shops
                           */
                          void restock_shops(void)
                          {
                          	int n;
                          
                          	/* Message */
                          	if (OPT(cheat_xtra)) msg_print("Updating Shops...");
                          
                          	/* Maintain each shop (except home) */
                          	for (n = 0; n < MAX_STORES; n++)
                          	{
                          		/* Skip the home */
                          		if (n == STORE_HOME) continue;
                          
                          		/* Maintain */
                          		store_maint(n);
                          	}
                          
                          	/* Sometimes, shuffle the shop-keepers */
                          	if (one_in_(STORE_SHUFFLE))
                          	{
                          		/* Message */
                          		if (OPT(cheat_xtra)) msg_print("Shuffling a Shopkeeper...");
                          
                          		/* Pick a random shop (except home) */
                          		while (1)
                          		{
                          			n = randint0(MAX_STORES);
                          			if (n != STORE_HOME) break;
                          		}
                          
                          		/* Shuffle it */
                          		store_shuffle(n);
                          	}
                          
                          	/* Message */
                          	if (OPT(cheat_xtra)) msg_print("Done.");
                          }[/color]
                          5) Add the yellow lines shown below to the check_experience function:

                          Code:
                          /*
                           * Advance experience levels and print experience
                           */
                          void check_experience(void)
                          {
                          	[color=yellow]s16b old_max_lev;[/color]
                          
                          	/* Hack -- lower limit */
                          	if (p_ptr->exp < 0) p_ptr->exp = 0;
                          
                          	/* Hack -- lower limit */
                          	if (p_ptr->max_exp < 0) p_ptr->max_exp = 0;
                          
                          	/* Hack -- upper limit */
                          	if (p_ptr->exp > PY_MAX_EXP) p_ptr->exp = PY_MAX_EXP;
                          
                          	/* Hack -- upper limit */
                          	if (p_ptr->max_exp > PY_MAX_EXP) p_ptr->max_exp = PY_MAX_EXP;
                          
                          
                          	/* Hack -- maintain "max" experience */
                          	if (p_ptr->exp > p_ptr->max_exp) p_ptr->max_exp = p_ptr->exp;
                          
                          	[color=yellow]/* Store max_lev for later */
                          	old_max_lev = p_ptr->max_lev;[/color]
                          
                          	/* Redraw experience */
                          	p_ptr->redraw |= (PR_EXP);
                          
                          	/* Handle stuff */
                          	handle_stuff();
                          
                          
                          	/* Lose levels while possible */
                          	while ((p_ptr->lev > 1) &&
                          	       (p_ptr->exp < (player_exp[p_ptr->lev-2] *
                          	                      p_ptr->expfact / 100L)))
                          	{
                          		/* Lose a level */
                          		p_ptr->lev--;
                          
                          		/* Update some stuff */
                          		p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
                          
                          		/* Redraw some stuff */
                          		p_ptr->redraw |= (PR_LEV | PR_TITLE | PR_EXP);
                          
                          		/* Handle stuff */
                          		handle_stuff();
                          	}
                          
                          
                          	/* Gain levels while possible */
                          	while ((p_ptr->lev < PY_MAX_LEVEL) &&
                          	       (p_ptr->exp >= (player_exp[p_ptr->lev-1] *
                          	                       p_ptr->expfact / 100L)))
                          	{
                          		char buf[80];
                          
                          		/* Gain a level */
                          		p_ptr->lev++;
                          
                          		/* Save the highest level */
                          		if (p_ptr->lev > p_ptr->max_lev)
                          		{
                          			p_ptr->max_lev = p_ptr->lev;
                          
                          			/* Log level updates (TODO: perhaps only every other level or every 5) */
                          			strnfmt(buf, sizeof(buf), "Reached level %d", p_ptr->lev);
                          			history_add(buf, HISTORY_GAIN_LEVEL, 0);
                          		}
                          
                          		/* Message */
                          		message_format(MSG_LEVEL, p_ptr->lev, "Welcome to level %d.", p_ptr->lev);
                          
                          		/* Add to social class */
                          		p_ptr->sc += randint1(2);
                          		if (p_ptr->sc > 150) p_ptr->sc = 150;
                          
                          		/* Update some stuff */
                          		p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
                          
                          		/* Redraw some stuff */
                          		p_ptr->redraw |= (PR_LEV | PR_TITLE | PR_EXP);
                          
                          		/* Handle stuff */
                          		handle_stuff();
                          	}
                          
                          	/* Gain max levels while possible */
                          	while ((p_ptr->max_lev < PY_MAX_LEVEL) &&
                          	       (p_ptr->max_exp >= (player_exp[p_ptr->max_lev-1] *
                          	                           p_ptr->expfact / 100L)))
                          	{
                          		/* Gain max level */
                          		p_ptr->max_lev++;
                          
                          		/* Update some stuff */
                          		p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
                          
                          		/* Redraw some stuff */
                          		p_ptr->redraw |= (PR_LEV | PR_TITLE | PR_EXP);
                          
                          		/* Handle stuff */
                          		handle_stuff();
                          	}
                          
                          	[color=yellow]/* Check for shop restocks at level change */
                          	if(p_ptr->max_lev > old_max_lev)
                          	{
                          		/* Restock twice to give them a good shuffle */
                          		restock_shops();
                          		restock_shops();
                          	}[/color]
                          }

                          Comment

                          • Derakon
                            Prophet
                            • Dec 2009
                            • 9022

                            What about buying out the store? The changes you posted don't seem to address that. Though it shouldn't be hard to just let the store sit there empty.

                            Comment

                            • Dean Anderson
                              Adept
                              • Nov 2009
                              • 193

                              Originally posted by Derakon
                              What about buying out the store? The changes you posted don't seem to address that. Though it shouldn't be hard to just let the store sit there empty.
                              Since I made the changes for my own testing purposes, I didn't bother disabling the buying out of stores because it was easier to simply not do it while testing. Disabling that would just involve commenting out or deleting the relevant code in the buying routine in store.c, anyway.

                              Comment

                              • fizzix
                                Prophet
                                • Aug 2009
                                • 3025

                                One thing that's been bugging me a lot with the focus on stores is that when I started playing Angband I tried both Angband and Nethack. Eventually I chose Angband mainly because the presence of the town made the early game a lot more beginner friendly.

                                I'd be very leery about any changes that made the town less accessible in the early game. I'm not calling out any specific proposals, just something to keep in mind.

                                Comment

                                Working...
                                😀
                                😂
                                🥰
                                😘
                                🤢
                                😎
                                😞
                                😡
                                👍
                                👎