Need help with ordinals.

Talk about creating Grimrock 1 levels and mods here. Warning: forum contains spoilers!
Post Reply
Ryeath_Greystalk
Posts: 366
Joined: Tue Jan 15, 2013 3:26 am
Location: Oregon

Need help with ordinals.

Post by Ryeath_Greystalk »

I may be in deep trouble here.

I'm ready to test my mod up to, but not including the boss fight, and I just now discovered that if I move my characters around then then the incorrect characters will speak.
I thought that once a character was assigned a number it never changes. From the modding page

Champion:getOrdinal()
Returns champion’s ordinal index between 1 and 4. The ordinal index is an unique identifier for the champion. It is guaranteed that the ordinal index never changes after character creation.

Apparently that is not the same as

party:getChampion(x):getName()

How do I make it so when the characters are moved around they keep the same number?

Thanks.
User avatar
JohnWordsworth
Posts: 1397
Joined: Fri Sep 14, 2012 4:19 pm
Location: Devon, United Kingdom
Contact:

Re: Need help with ordinals.

Post by JohnWordsworth »

So, the ordinal is kind of like an ID I guess, which you have to get by querying a champion in a 'party slot'. If I were you, I would probably do the following;

1. Define a function 'someScript.getChampionWithOrdinal()', off the top of my head, it would look something like this...

Code: Select all

function getChampionWithOrdinal(ordinal)
  for i=1,4 do
    if ( party:getChampion(i):getOrdinal() == ordinal ) 
      return party:getChampion(i);
    end
  end

  return nil;
end
2. Then update your code anywhere you are doing speech from party:getChampion(x):getName() to someScript.getChampionWithOrdinal(x):getName(). You might just be able to do a find/replace across your code with the new method, but backup everything before hand!
My Grimrock Projects Page with links to the Grimrock Model Toolkit, GrimFBX, Atlas Toolkit, QuickBar, NoteBook and the Oriental Weapons Pack.
Ryeath_Greystalk
Posts: 366
Joined: Tue Jan 15, 2013 3:26 am
Location: Oregon

Re: Need help with ordinals.

Post by Ryeath_Greystalk »

Thanks JohnWordsworth.

I thought the variable refered to the ordinal, but as you point out it's the party slot.

At least that gives me something to work with.
Ryeath_Greystalk
Posts: 366
Joined: Tue Jan 15, 2013 3:26 am
Location: Oregon

Re: Need help with ordinals.

Post by Ryeath_Greystalk »

Was not to difficult so far,

Code: Select all

-- Ordinal Test Champion 1

function championOneName()

	local name1
	
	for x = 1,4 do
		if party:getChampion(x):getOrdinal() == 1 then
			name1 = party:getChampion(x):getName()
			break
		end
	end
	
	return name1
		
end

-- Ordinal Test Champion 2

function championTwoName()

	local name2
	
	for x = 1,4 do
		if party:getChampion(x):getOrdinal() == 2 then
			name2 = party:getChampion(x):getName()
			break
		end
	end
	
	return name2
		
end

-- Ordinal Test Champion 3

function championThreeName()

	local name3
	
	for x = 1,4 do
		if party:getChampion(x):getOrdinal() == 3 then
			name3 = party:getChampion(x):getName()
			break
		end
	end
	
	return name3
		
end

-- Ordinal Test Champion 4

function championFourName()

	local name4
	
	for x = 1,4 do
		if party:getChampion(x):getOrdinal() == 4 then
			name4 = party:getChampion(x):getName()
			break
		end
	end
	
	return name4
		
end
Then I just replace :party:getChampion():etName()nwith

local name1 = name_check.championOneName(name1) etc. etc.

Also have to do a little bit more because of my system of rendering the player unconcious instead of dying and reviving them if they have to speak.

Code: Select all

for y = 1,4 do
			if party:getChampion(y):getOrdinal() == 1 then
				if party:getChampion(y):getEnabled() == false then
					party:getChampion(y):setStat("health",5)
					--revive1_1:deactivate()
					party:getChampion(y):setEnabled(true)
				end
				break
			end
		end
I already have the set enabled code, just have to nest it nside the ordinal check iterator.

Thanks for the advice Mr Wordsworth.
Post Reply