SI: exp gain?

NOTICE: This forum is archived as read only.
Please use the Github Discussions at https://github.com/exult/exult/discussions
Forum rules
NOTICE: This forum is archived as read only.
Please use the Github Discussions at https://github.com/exult/exult/discussions
Locked
Rabenrecht

SI: exp gain?

Post by Rabenrecht »

I've just started playing U7 II. So far it's great, but there is something I wonder about:

Since the beginning I don't have gotten almost any exp.
The Avatar has gained 108 exp, the companions none.
I think the Avatar may have gained those by killing the first enemies before entering Monitor. But since then I have not seen a single point of exp.
I have gained Knighthood in Monitor, confronted the tatoo lady, returned the ring to this girl in Fawn... but no exp. Killing creatures likewise does not give any exp.

Is this intended? It surely worked different in U7.
I feel like I stumbled upon a nasty bug here.
monotremata
Posts: 246
Joined: Thu May 14, 2020 1:34 pm

Re: SI: exp gain?

Post by monotremata »

This is probably the only thing Ive ever disliked about the Ultima series.
The only person that gets XP is the person that actually does the kill shot on the enemy. If you sat there whittling away a dragon's 100+ hp by yourself, and Iolo finally manages to make an arrow contact (and not hit one of your party) and takes that last hp from that dragon, you're out of luck and Iolo just got all that xp for it.

I know in IV/V/VI/etc., the Avatar is the only one that ever really 'needed' to get to level 8 but come on.
Share that XP like they do in D&D rules so I don't have to spend an extra month grinding with just each individual companion fighting so he can catch up!!

And lets not forget Ultima 3 where it was important the whole party actually level up..
Morbius Dragon
-==(UDIC)==-
Since 1992!
Rabenrecht

Re: SI: exp gain?

Post by Rabenrecht »

Yeah, but my problem here is that NOBODY gets any exp. Not for killing, not for quests.
monotremata
Posts: 246
Joined: Thu May 14, 2020 1:34 pm

Re: SI: exp gain?

Post by monotremata »

Oh dur I missed that whole part about you not getting anymore after Trinsic haha (don't read the forums when drunk!).

Yeah thats definitely not right! :D
Morbius Dragon
-==(UDIC)==-
Since 1992!
Korneluk

Re: SI: exp gain?

Post by Korneluk »

sounds like a bug...
not much help I know...I almost found I gained experience more quickly than I would have liked, although I think I was getting the intended progression.
Rabenrecht

Re: SI: exp gain?

Post by Rabenrecht »

Ok, I started a new game now carefully watching exp gains.
After two tests it appears the Avatar gains exp through killing up until the last part of the Knights Test. That means I dont gain exp for killing the "invisible" soldier, the totem animal or Shmed.

Since this is repeatable this seem like SERIOUS bug (and really demotivates me from playing).

I'm using the 1.49 version, the latest no-snapshot.

Any help?
Malignant Manor
Site Admin
Posts: 985
Joined: Thu May 14, 2020 1:34 pm

Re: SI: exp gain?

Post by Malignant Manor »

The invisible man. Shmed, and totem animal don't give experience in the original dos engine.

Edit. Sorry I edited out some info but not before someone posted
Rabenrecht

Re: SI: exp gain?

Post by Rabenrecht »

Hm, do the Goblins at Fawn Tower count as NPC as well?
That would explain why I got no exp for them.

Ah well, good to know that it works "like intended" albeit a bit unexpected.
Malignant Manor
Site Admin
Posts: 985
Joined: Thu May 14, 2020 1:34 pm

Re: SI: exp gain?

Post by Malignant Manor »

Actually the xp listing in Exult Studio doesn't seem right or isn't listed properly. Tattoo lady gives 20. I'm not sure what the xp formula is offhand and what the exceptions are. It seems stupid that killing innocents and your companions give xp but not these enemies.

Edit: I had momentary stupidity. XP listing for npcs is for how much they have which is relevant if they can join your party.
Wizardry Dragon
Posts: 1241
Joined: Thu May 14, 2020 1:34 pm

Re: SI: exp gain?

Post by Wizardry Dragon »

SI's experience curve in general is very convoluted. It's not very intuitive and a lot of things you would expect to give good XP dont, and a good few things you think wouldn't, do. It was one of the problems I had with the mechanics of SI (the other being trying to place things very specifically on slots or pedestals, which we had to do a suspicious amount of...)

Cheers,
Peter M Dodge,
aka Wizardry Dragon
www.thefeudallands.ca
Cheers, Wizardry Dragon
Lead Designer, Ultima VII: The Feudal Lands
www.thefeudallands.ca
Malignant Manor
Site Admin
Posts: 985
Joined: Thu May 14, 2020 1:34 pm

Re: SI: exp gain?

Post by Malignant Manor »

It's because of the tournament flag. The code for the npc or shape kills it and says not to award xp. It can be changed with usecode. Maybe Marzo can add this to SI Fixes. This probably happens with more npcs. The code below is untested.

Code: Select all

// Wolf totem allows xp on death patch
void Wolf shape#(0x219) ()
{
	if (event == DEATH) {
		UI_clear_item_flag(item, SI_TOURNAMENT);
		UI_reduce_health(item, 55, 1);
	}
	else
		return;
}

// Shmed allows xp on death patch
extern void delayedBark 0x97F (var npc, var bark, var delay);

void Shmed object#(0x44B)()
{
	if (event == DEATH && UI_get_item_flag(SCHMED, SI_TOURNAMENT) {
		UI_clear_item_say(SCHMED);
		if (!gflags[0xC5]) {
			SCHMED.say("\"But I don't understand. How didst thou survive the Knight's Test? We fixed the place with traps to be absolutely fatal!\"");
			SCHMED.say("\"I did not want to do it. She seduced me into trying to kill thee! Yet even now, I cannot betray her...\"");
		}
			UI_clear_item_flag(SCHMED, SI_TOURNAMENT);
			delayedBark(SCHMED, "@My love!@", 1);
			delayedBark(AVATAR, "@Die with dishonor!@", 5);
			UI_reduce_health(SCHMED, 55, 1);
			abort; // unneeded?
	}
	else
		Shmed.original();
}


// Exult xp calculations

	if (defeated && exp)
		{
			// Verified: No experience for killing sleeping people.
		if (!get_flag(Obj_flags::asleep))
			{
			int expval = 0;
				// Except for 2 details mentioned below, this formula
				// is an exact match to what the originals give.
				// We also have to do this *here*, before we kill the
				// NPC, because the equipment is deleted (spells) or
				// transferred to the dead body it leaves.
			int combval = properties[static_cast(combat)];
			expval = properties[static_cast(strength)] + combval + 
					(properties[static_cast(dexterity)]+1)/3 + 
					properties[static_cast(intelligence)]/5;
			Monster_info *minf = get_info().get_monster_info();
			int immune = minf ? minf->get_immune() : 0;
			int vuln = minf ? minf->get_vulnerable() : 0;
			if (minf)
				expval += minf->get_base_xp_value();

			if (!objects.is_empty())
				{
				Game_object_vector vec;		// Get list of all possessions.
				vec.reserve(50);
				get_objects(vec, c_any_shapenum, c_any_qual, c_any_framenum);
				for (Game_object_vector::const_iterator it = vec.begin(); 
							it != vec.end(); ++it)
					{
					Game_object *obj = *it;
						// This matches the original, but maybe
						// we should iterate through all items.
						// After all, a death bolt in the backpack
						// can still be dangerous...
					if (obj->get_owner() != this)
						continue;
					Shape_info& inf = obj->get_info();
					expval += inf.get_armor();
						// Strictly speaking, the original does not give
						// XP for armor immunities; but I guess this is
						// mostly because very few armors give immunities
						// (ethereal ring, cadellite helm) and no monsters
						// use them anyway.
						// I decided to have them give a (non-cumulative)
						// increase in experience.
					immune |= inf.get_armor_immunity();
					Weapon_info *winf = inf.get_weapon_info();
					if (!winf)
						continue;
					expval += winf->get_base_xp_value();
						// This was tough to figure out, but figured out it was;
						// it is a perfect match to what the original does.
					switch (winf->get_uses())
						{
						case Weapon_info::melee:
							{
							int range = winf->get_range();
							expval += range > 5 ? 2 : (range > 3 ? 1 : 0);
							break;
							}
						case Weapon_info::poor_thrown:
							expval += combval/5; break;
						case Weapon_info::good_thrown:
							expval += combval/3; break;
						case Weapon_info::ranged:
							expval += winf->get_range()/2; break;
						}
					}
				}
				// Originals don't do this, but hey... they *should*.
				// Also, being vulnerable to something you are immune
				// should not matter because immunities are checked first;
				// the originals don't do this check, but neither do they
				// have a monster vulnerable and immune to the same thing.
			vuln &= ~immune;
			expval += bitcount(immune);
			expval -= bitcount(vuln);
				// And the final touch (verified).
			expval /= 2;
			*exp = expval;
			}
EDIT: Schmed code should be fixed now.
marzo
Site Admin
Posts: 1925
Joined: Thu May 14, 2020 1:34 pm

Re: SI: exp gain?

Post by marzo »

FYI, I stand by the exp calculations; I did a painstaking job of reverse engineering them; in SI, those NPCs with the tournament flag set only give XP in the originals if their death usecode explicitly gives it.

Adding these to SI fixes certainly match the vision I have of it; when my new computer is full configured, I will include those fixes in it. Moreover, if there are any other NPCs that also fail to give XP for this reason, I would appreciate knowing so they can be fixed too.
------
Marzo Sette Torres Junior
aka Geometrodynamic Dragon
[url=http://www.catb.org/~esr/faqs/smart-questions.html]How To Ask Questions The Smart Way[/url]
Malignant Manor
Site Admin
Posts: 985
Joined: Thu May 14, 2020 1:34 pm

Re: SI: exp gain?

Post by Malignant Manor »

I just included the formula to demonstrate the reason and for xp calculation to be more easily available.
Locked