Mondedr

Aug 30, 2016, 12:24 pm
#1
Joined: Apr 2, 2014
Occupation: Navastating
Location: Aslona
Posts: 764
I'm going to put here some ideas I had for Mondedr, should it be added as a new town in IVAN.

It could have two floors:
* above ground town with some people and shops,
* underground Thieves' Guild.

Above ground
It's an outlaw town, full both of criminals and of people persecuted in Attnam. Tthe above ground town aprt should have peaceful goblins, kobolds and orcs in addition to the normal farmers and wives, making it a kind of refugee camp for all races.

For shops, I think we need something slightly diferent from Attnam. From CLIVAN, we could have Gob the Goblin's shop, but maybe give it a different building with several rooms:

##############
#g    g#g   g#
#weapon#books#
#  +   +scrol#
# armor#g   g#
#g    g#######
###+####     #
#g    g#  @  #
# all  # ----#
#types +     #
#g    g# g g #
##########+###

# wall
+ door
- table/counter
@ Gob
g shop guard

It's still a single shop with one shopkeeper, but each type of merchandize has its own section. It's also bigger than Attnam shop, but could have higher prices. Plus there are quite a few guards, as this is an outlaw town.

Then, we could have Kroo the Kobold Keysmith. He would wander randomly without a shop, but chatting with him would prompt to buy a random key. One by one, he would sell the player all key types in the game (each type only once per playthrough), with the price increasing for each subsequent key. The octagonal key would always be sold as the last one (for a hefty sum of money).

I also like the bare-hands doctor from CLIVAN and would like to have his shop in Mondedr. For those who didn't play it, he can remove any limb you pay for (even your head - don't do it), plus he can heal as any priest. He already says he made the attnamese eunuch and seeing as Petrus lacks one of his nuts, we can easily guess why did the bare-hands doctor end up in Mondedr. Maybe he could also sew back any lost limbs and attach any found nuts for extra manliness.

Finally, there would be a small building above ground, leading to the underground Thieves' Guild. However, there could be a guild guard standing on the stairs and the player would need to complete a quest to make the guard step away from the stairs and let the player enter.

Underground
The Thieves' Guild. I imagine a guild hall, several rooms for the thieves and assassins, several shops, a temple to Cleptia and a small prison section. Some quests could be tied to the Guild one day in the future.

As for the shops, they could only be accessed after completing an entry quest for the Thieves' Guild, so they should have some good stuff to sell. A small book/scroll shop and a jeweler would be nice to have. Especially the jeweler, as there is no such shop as of now.
Aug 30, 2016, 3:49 pm
#2
Joined: Sep 8, 2010
Occupation: Petty Functionary
Location: Drinking pea soup in the world map
Interests: Mangoes
Posts: 1,216
I love all these ideas!

red_kangaroo wrote
Especially the jeweler, as there is no such shop as of now.

A second-hand jeweler of course
Batman? wrote
its been so long since i had gotten that far i didnt think it through. arrrr!!!!!!
Sep 1, 2016, 11:06 am
#3
Joined: Aug 15, 2016
Location: Wales
Posts: 12
Visiting Mondedr, I always go for the shop and the Priest. I feel there needs to be either more shops or many themed shops pertaining to Exiled or Rogue Actors.. A Dwarfen shopkeeper who deals primarily with Gold/Mithril, A Vampire who specialises in blood, an Elf who deals with Enchantments and a Dark Rogue Wizard who has treasures from the arcane(I'm looking at you 'Blood Scroll of Vampirism')
Sep 2, 2016, 1:07 am
#4
Joined: Apr 2, 2014
Occupation: Navastating
Location: Aslona
Posts: 764
daneel wrote
'Blood Scroll of Vampirism'

Blood Scroll of Vampirism?
Sep 2, 2016, 3:17 pm
#5
Joined: Aug 15, 2016
Location: Wales
Posts: 12
Situtation, you've been bitten by a vampire. You visited every priest to try and cure you(he muttered something about evil!). You've eaten 3 Grey Unicorns and you still can't remove the curse of having to feeding off living people.

Upon finding this refuge of the outcasts of each society living here you happen upon an Apothecary owned by an Old Vampire Named Senex. Talking to him while near starved, he mentions a special item he has been holding onto for a many years. He shows you a Scroll which behaves like paper but is made of something dark red, with Gold-glowing inscriptions.

He explains that this scroll once eaten can sate the thirst of a Vampire for 1001 nights, Conversely if read it cause all entities around the reader to gain a thirst for flesh for 666 days.

(if you have a Wand of Cloning, he'll offer to give you a clone of his scroll in exchange for the Wand, [A use for them 1 Charge wands!]
Sep 25, 2016, 1:01 pm
#6
Joined: Apr 2, 2014
Occupation: Navastating
Location: Aslona
Posts: 764
I was thinking about two more NPCs:

An old drunk who you could give potions of vodka to. He would have an extensive list for chatting, various cryptic rumors about game mechanics and secret stuff. This way, even non-spoiled player without the wiki would have a way of learning about some of the more obscure stuff. For example, he could say:

Once I ate a resurrected banana and gosh, was it tasty!
I met an angel once. He fixed my arm.
Don't eat too much, my mama told me, or you'll grow fat and clumsy.
I heard that unicorns taste weird. Not that I would know first-hand.
Tweraif? Yeah, I heard about it from a guy... What was his name again? Oily Orpiv, I think.
I once saw an apprentice dark mage polymorph his small chest and spill all his stuff. I would have laughed, but I didn't wanna be turned into a dark frog.
I heard you can fetch a nice iron arm from the dwarves of Kharaz-Arad.

The second one could be an arena master. Similarly to the sumo arena, there would be an arena in Mondedr. you could chat with the arena master to be sent there and a monster would be generated for you to fight. This fight, however, would be to death and the monster generated would be based on your danger level (of whatever is it called), so that it is always challenging for you. If you win, you get some money for the show. This way, you could get a steady income, but not without risk - maybe raise the comparative difficulty of the monsters generated as you win more fights, so after enough fights, the monster generated would be stronger rather than equal to you.
Sep 25, 2016, 7:14 pm
#7
Joined: Dec 11, 2008
Posts: 1,770
red_kangaroo wrote
I was thinking about two more NPCs:

An old drunk who you could give potions of vodka to. He would have an extensive list for chatting, various cryptic rumors about game mechanics and secret stuff. This way, even non-spoiled player without the wiki would have a way of learning about some of the more obscure stuff. For example, he could say:

I like this idea a lot actually.
We already have some NPCs that give veiled hints on how certain things work, but having a dedicated NPC dropping initially stupid or humorous lines that are actually really helpful once you make sense of them seems like a neat idea to me.

red_kangaroo wrote
The second one could be an arena master. Similarly to the sumo arena, there would be an arena in Mondedr. you could chat with the arena master to be sent there and a monster would be generated for you to fight. This fight, however, would be to death and the monster generated would be based on your danger level (of whatever is it called), so that it is always challenging for you. If you win, you get some money for the show. This way, you could get a steady income, but not without risk - maybe raise the comparative difficulty of the monsters generated as you win more fights, so after enough fights, the monster generated would be stronger rather than equal to you.

Usual arena progression would dictate that you'd start off again below-rank enemies and the scaling ramps up dramatically from there.
I think having the first couple of fights be pre-defined might be a good idea to discourage maximizing gold early on by keeping your danger level low. For example, the first fights might be against a pack of large rats, then a lion, and then a cave bear. A low-danger-level PC could probably deal with the rats no problem, struggle with the lion and probably get mauled by the bear.

This way you provide a little gold for players who arrive early and who are smart or determined enough to beat the rats and lion, while still restricting access to the dynamic fights (and potentially infinite money) with the Cave Bear who will probably tear them a new asshole.
Once you get past the "beef gates" then you'd have free access to the dynamically generated fights that gradually ramp up based on danger level.
System would indicate in graphic if person is mounted on horse or not.
Same system also show if person mounted on boar, elephant, polar bear etc.
Or if person mounted on ass.
Ivan find mounting on ass funny.
Sep 25, 2016, 8:56 pm
#8
Ex-Tyrant of the IVANers


Joined: Dec 8, 2007
Occupation: Junior Scientist
Location: Not California
Interests: Physics and Astronomy, Exoplanets, Singing praise to Valpurus while smashing skulls with a bloody warhammer, Jogging
Posts: 2,920
4zb4 wrote
gradually ramp up based on danger level.

And the number of fights, I assume?
"Put more stuff in the... thing where... more stuff goes in."
Sep 25, 2016, 11:17 pm
#9
Joined: Sep 4, 2016
Occupation: School
Location: Australia
Interests: Existing
Posts: 2
For the upper level a lucky dip of sorts could be interesting, for an increasing sum of gold you could get something good or get ripped off.
Sep 25, 2016, 11:45 pm
#10
Joined: Sep 8, 2010
Occupation: Petty Functionary
Location: Drinking pea soup in the world map
Interests: Mangoes
Posts: 1,216
I feel like the traders in Mondedr might try to sell you mirrored items.
Batman? wrote
its been so long since i had gotten that far i didnt think it through. arrrr!!!!!!
Sep 26, 2016, 6:10 am
#11
Joined: Apr 9, 2016
Occupation: Priestx of Sophos
Location: Standing on a big mine in GC1
Interests: the relation of queer crystal hyperfeminism and amphibious neutronium cybersocialist art
Posts: 258
Wouldn't they thank you for clearing mirrorrd junk out of their shop?
Sep 26, 2016, 2:35 pm
#12
Joined: Dec 11, 2008
Posts: 1,770
(The idea is that they are specifically ripping you off by selling mirrored items that vanish later on.)

In practice though, yes because of how the code works.
You could probably work around this by adding a huge flat markup to items on the Mondedr shop floor, which has a double effect.

One, mirrored items would now have a cost (assuming we find a way to work around items with zero value)
Two, ACTUAL items in the shop are now exorbitantly priced, which is also in keeping with them trying to rip you off. ("Hands off beggar! That iron dagger is worth 520 gold!")
System would indicate in graphic if person is mounted on horse or not.
Same system also show if person mounted on boar, elephant, polar bear etc.
Or if person mounted on ass.
Ivan find mounting on ass funny.
Sep 26, 2016, 6:56 pm
#13
Joined: Apr 9, 2016
Occupation: Priestx of Sophos
Location: Standing on a big mine in GC1
Interests: the relation of queer crystal hyperfeminism and amphibious neutronium cybersocialist art
Posts: 258
4zb4 wrote
(The idea is that they are specifically ripping you off by selling mirrored items that vanish later on.)

In practice though, yes because of how the code works.
You could probably work around this by adding a huge flat markup to items on the Mondedr shop floor, which has a double effect.

One, mirrored items would now have a cost (assuming we find a way to work around items with zero value)
Two, ACTUAL items in the shop are now exorbitantly priced, which is also in keeping with them trying to rip you off. ("Hands off beggar! That iron dagger is worth 520 gold!")
With just a flat markup it would be pretty easy to distinguish the mirrored items from genuine ones - more than one item would have the lowest price in the shop (and items of different value selling for the same minimum price would be highly suspicious).
Another way might be to change the pricing behaviour of mirrored items, so that their price is evaluated differently when being bought from a shop (or that shop). Then the mirror item could be 50% or 90% off (but marked up 300% because Mondedr).
Sep 27, 2016, 12:20 am
#14
Ex-Tyrant of the IVANers


Joined: Dec 8, 2007
Occupation: Junior Scientist
Location: Not California
Interests: Physics and Astronomy, Exoplanets, Singing praise to Valpurus while smashing skulls with a bloody warhammer, Jogging
Posts: 2,920
Is there any way to set it up so that the mirrored items and the real items have the same price (in Mondedr)?
"Put more stuff in the... thing where... more stuff goes in."
Sep 27, 2016, 1:24 am
#15
Joined: Apr 9, 2016
Occupation: Priestx of Sophos
Location: Standing on a big mine in GC1
Interests: the relation of queer crystal hyperfeminism and amphibious neutronium cybersocialist art
Posts: 258
Ischaldirh wrote
Is there any way to set it up so that the mirrored items and the real items have the same price (in Mondedr)?

Like a 0% discount? It would take more or less the same code changes as applying a percentage discount to mirrored items. item::GetTruePrice() would have to either take an optional parameter or be split into two functions so that mirrored item prices can be calculated differently when buying them from the Mondedr shop compared to other situations.
Sep 27, 2016, 2:45 am
#16
Joined: Dec 11, 2008
Posts: 1,770
I've had a look into how we could pull this off.
As mentioned, the game uses item::GetTruePrice() to determine the value of any given item.

The part of GetTruePrice() that determined a mirrored item is worth $0 is as follows:

long item::GetTruePrice() const
{
  if(LifeExpectancy)
    return 0;

Basically it checks whether the item has a LifeExpectancy value, which is the time left before a mirrored item vanishes from existence.
Keep that in mind.

Next we have a look at the shop buying code, which is shop::PickupItem(...)
One of the first things that happens in this section of the code is:

long Price = ForSale->GetTruePrice();

Which would immediately flag the mirrored item as worthless (Price = 0) which would mean that attempting to pick it up would result in the "junk" message:
if(!Price)
    {
      ADD_MESSAGE("\"Thank you for cleaning that junk out of my floor.\"");
      return true;
    }

Now what we COULD do to make it so that the Mondedr shop sells you mirrored items for full price is include a check before "GetTruePrice()" is called to check whether the location is Mondedr, by appropriating some code from the New Attnam shop that refuses to buy items from you:

if(GetMaster()->GetConfig() == NEW_ATTNAM)
  {
    ADD_MESSAGE("\"Sorry, I'm only allowed to buy from "
                "Decos Bananas Co. if I wish to stay here.\"");
    return false;
  }

So we could take that, put it in shop::PickupItem() and change it to check for Mondedr as follows:

truth shop::PickupItem(character* Customer, item* ForSale, int Amount)
{

//other code happens here

if(GetMaster()->GetConfig() == MONDEDR)
  {
    //this is the same as the GetTruePrice code but without the check for LifeExpectancy (or spoilage)
    long Price = Max(ForSale->GetPrice(), ForSale->GetMaterialPrice());
  }
else
 {
   //the shop is not in Mondedr, so it treats mirrored items as junk
   long Price = ForSale->GetTruePrice();
 }

 //rest of code here
}

If we keep that inside shop::PickupItem() only, then you'd only be able to buy mirrored items at full price - attempting to sell them back would just produce the "I wouldn't take that even if you paid me!" message!
System would indicate in graphic if person is mounted on horse or not.
Same system also show if person mounted on boar, elephant, polar bear etc.
Or if person mounted on ass.
Ivan find mounting on ass funny.
Sep 27, 2016, 4:19 am
#17
Joined: Sep 8, 2010
Occupation: Petty Functionary
Location: Drinking pea soup in the world map
Interests: Mangoes
Posts: 1,216
Hehehe Azba, first steps toward modding the game...
Batman? wrote
its been so long since i had gotten that far i didnt think it through. arrrr!!!!!!
Sep 27, 2016, 4:47 am
#18
Joined: Dec 11, 2008
Posts: 1,770
Actually believe it or not one of my first posts on this forum was a mod that introduced a nuclear landmine to the game.
Don't go find it though because I am extremely embarrassed about past-me.
System would indicate in graphic if person is mounted on horse or not.
Same system also show if person mounted on boar, elephant, polar bear etc.
Or if person mounted on ass.
Ivan find mounting on ass funny.
Sep 27, 2016, 9:55 am
#19
Joined: Apr 9, 2016
Occupation: Priestx of Sophos
Location: Standing on a big mine in GC1
Interests: the relation of queer crystal hyperfeminism and amphibious neutronium cybersocialist art
Posts: 258
Personally I'd avoid duplicating the price formula in the room code, just in case it ever changes in the future. That way whoever changes it wouldn't get a nasty surprise when they find Mondedr is still using the old price formula.

Speaking of duplicated code that didn't get updated, we currently have this block to let the player take back quest items that somehow ended up on a shop floor:
  if(Customer->CanBeSeenBy(GetMaster()))
  {
    if(ForSale->IsHeadOfElpuri() || ForSale->IsGoldenEagleShirt()
       || ForSale->IsPetrussNut() || ForSale->IsTheAvatar()
       || ForSale->IsEncryptedScroll())
    {
      ADD_MESSAGE("\"I think it is yours. Take it.\"");
      return true;
    }
For some reason it checks against a list of items rather than ForSale->IsQuestItem(), which means that the Xinroch quest items can't be reclaimed at no cost. The code for selling items makes the same check.
Ivan's gas mask is for some reason a quest item, so if the shop code was changed to use ForSale->IsQuestItem(), the gas mask would become exempt from shop trading.
Sep 27, 2016, 4:19 pm
#20
Joined: Dec 11, 2008
Posts: 1,770
Serin-Delaunay wrote
Personally I'd avoid duplicating the price formula in the room code, just in case it ever changes in the future. That way whoever changes it wouldn't get a nasty surprise when they find Mondedr is still using the old price formula.

That is a point.
Well, you could just add a GetMondedrPrice() function in item.cpp but then it'd be subject to the same problem if someone overlooks it.

truth shop::PickupItem(character* Customer, item* ForSale, int Amount)
{

//other code happens here

if(GetMaster()->GetConfig() == MONDEDR)
  {
    //calls GetMondedrPrice which is the same as GetTruePrice but ignores LifeExpectancy
    long Price = ForSale->GetMondedrPrice;
  }
else
 {
   //the shop is not in Mondedr, so it treats mirrored items as junk
   long Price = ForSale->GetTruePrice();
 }

Another option would be to add a "isMondedrItem" boolean to the item code and then just have GetTruePrice() ignore the LifeExpectancy if that boolean is true and the level is MONDEDR.
But then you'd need to set isMondedrItem for all generated shop items (mirrored or not) in Mondedr, which I feel is a little bit roundabout when you could cut out the middleman and just change the shop code.

EDIT: I had a better idea while I was in the shower (best place for thinking about programming IMO)

Change GetTruePrice() to take a single parameter, boolean AcceptMirrored:

long item::GetTruePrice(boolean AcceptMirrored) const
{
  if(LifeExpectancy && !AcceptMirrored)
    return 0;

Then in the shop code we have the check for Mondedr as before, but now it calls GetTruePrice(true):

truth shop::PickupItem(character* Customer, item* ForSale, int Amount)
{

//other code happens here

if(GetMaster()->GetConfig() == MONDEDR)
  {
    //this is the same as the GetTruePrice code but without the check for LifeExpectancy (or spoilage)
    long Price = ForSale->GetTruePrice(true);
  }
else
 {
   //the shop is not in Mondedr, so it treats mirrored items as junk
   long Price = ForSale->GetTruePrice(false);
 }

 //rest of code here
}
System would indicate in graphic if person is mounted on horse or not.
Same system also show if person mounted on boar, elephant, polar bear etc.
Or if person mounted on ass.
Ivan find mounting on ass funny.
Sep 27, 2016, 5:24 pm
#21
Joined: Apr 9, 2016
Occupation: Priestx of Sophos
Location: Standing on a big mine in GC1
Interests: the relation of queer crystal hyperfeminism and amphibious neutronium cybersocialist art
Posts: 258
My approach would be similar, something like this:

long item::GetTruePrice(truth IgnoreMirror=false) const
{
  if(LifeExpectancy && !IgnoreMirror)
    return 0;

  long Price = Max(GetPrice(), GetMaterialPrice());

  if(Spoils()) // or if(Spoils() && !IgnoreMirror)
    Price = Price * (100 - GetMaxSpoilPercentage()) / 500;

  return Price;
}

truth shop::PickupItem(character* Customer, item* ForSale, int Amount)
{
  //other code happens here

  // Mondedr shop charges full price for mirrored items
  long Price = ForSale->GetTruePrice(GetMaster()->GetConfig() == MONDEDR);
}
Sep 27, 2016, 6:38 pm
#22
Joined: Sep 8, 2010
Occupation: Petty Functionary
Location: Drinking pea soup in the world map
Interests: Mangoes
Posts: 1,216
Serin-Delaunay wrote
For some reason it checks against a list of items rather than ForSale->IsQuestItem(), which means that the Xinroch quest items can't be reclaimed at no cost. The code for selling items makes the same check.

You're right, this is another bug. I'll implement the IsQuestItem() method by the next release. For now, players will just have to watch out.

Any ideas about how you will prevent mirrored items from disappearing prematurely in the shop? Zolku stops his bananas spoiling somehow...
Batman? wrote
its been so long since i had gotten that far i didnt think it through. arrrr!!!!!!
Sep 27, 2016, 7:19 pm
#23
Joined: Dec 11, 2008
Posts: 1,770

I like how this is getting more and more refined into less lines.
  long Price = ForSale->GetTruePrice(GetMaster()->GetConfig() == MONDEDR);
Good stuff.

Serin-Delaunay wrote
long item::GetTruePrice(truth IgnoreMirror=false) const
{
  if(LifeExpectancy || IgnoreMirror)
    return 0;

In the case of mirrored items, isn't this going to always return a price of $0 regardless of whether IgnoreMirror is true?
System would indicate in graphic if person is mounted on horse or not.
Same system also show if person mounted on boar, elephant, polar bear etc.
Or if person mounted on ass.
Ivan find mounting on ass funny.
Sep 27, 2016, 7:23 pm
#24
Joined: Apr 9, 2016
Occupation: Priestx of Sophos
Location: Standing on a big mine in GC1
Interests: the relation of queer crystal hyperfeminism and amphibious neutronium cybersocialist art
Posts: 258
Typo? What typo?
Sep 27, 2016, 7:25 pm
#25
Joined: Dec 11, 2008
Posts: 1,770
System would indicate in graphic if person is mounted on horse or not.
Same system also show if person mounted on boar, elephant, polar bear etc.
Or if person mounted on ass.
Ivan find mounting on ass funny.
Jump to