Posts: 507
Threads: 36
Joined: Oct 2009
Reputation:
4
RE: Complete list of game items
Can anyone point me in the direction of a tutorial for writing such a script?
I actually had trouble viewing that file because it is so large. I also have no idea what all those values are for all those items. It makes me figure that reverse engineering this game is a major job. Another /tiphat.
To make sense of the goprops.txt file, you have to write tons of filters, mostly to try to group objects together, then find all common properties, remove some properties that have no useful information etc.
Here are some of things that I have done:
1. Don't use fullgoprops.txt - it is missing a lot of properties, use the other file goprops.txt, it has all properties.
2. Best language to use for extrating and manipulating data from files is perl. You don't need to write a lot of code to read/write files and its regular expression make it easy to grab data, manipulate it and process it. Perfect for quick and dirty extraction jobs.
I have attached a sample parser I wrote that will read goprop.txt and write out a tab delimited file.
Easy route:
The easiest way would be just to modify the perl script and put specific condition as to which objects and properties to write to a file. Then you could create a ".csv" file and load it into excel.
Hard route:
3. My approach for grouping everything was to create a database, with tables that had following schema:
Code:
(
ID NUMERIC,
PROP CHAR(60),
VAL CHAR(60))
)
ID would be your object number,
PROP would be the property name
VAL value of that property.
Then you could write a query like
SELECT VAL from ALL_TABLE where ID = 12 and PROP = 'objName' which would return you the name of the object
or
SELECT ID from ALL_TABLE where PROP = 'RSIArticleId' which would return you a list of IDs that have property RSIArticleId
Initially I had one table, where I put all the objects. Then I tried to separate objects into groups. For this you would need to write a filter in your script/code to insert the objects into different tables based on your filtering criteria. Clothes for example all have the following property : RSIArticleID. so right away, when you see that property on an object, you know you are working with a clothing object.
I then created similar tables for CODES, ABILITIES, CLOTHING etc and imported only the objects that belong there.
Note : Abilities can be easily detected by the object name, if it ends with Ability, it is an ability.
I think it would be very helpful as well, once you group similar objects together to look at GoCategoryId, as most of the interesting objects are already grouped by the GoCategoryId, there is already a topic in Development section about what each gocategoryId means.
In the end the process is pretty boring and time consuming. Your goal is to keep separating objects, looking for similar properties and try to figure out which ones are useful and which ones are not. You may sometimes have properties that have zeroes for all objects (no variance) which makes them kind of useless to look at.
If you want, I have a hypersql database with all the objects loaded, string table and go categories, so all you need to do is quick setup and then the rest is writing tedious queries and filters.
PS: Also use Notepad++ or Textpad for viewing large files.
Here is a query that I wrote to try to group interesting abilities together:
Code:
select * from (
select
ID,
TRIM((select val from ABILITIES where PROP = 'AbilityID' and ID = ab.id)) AS AbilityID,
TRIM((select val from ABILITIES where PROP = 'objName' and ID = ab.id)) AS NAME,
TRIM((select val from ABILITIES where PROP = 'GOCategoryID' and ID = ab.id)) AS GO_Category,
TRIM((select val from ABILITIES where PROP = 'MemCost' and ID = ab.id)) AS MEM,
TRIM((select val from ABILITIES where PROP = 'InventoryMemCost' and ID = ab.id)) AS INVENTORY_MEM,
TRIM((select val from ABILITIES where PROP = 'BufferSize' and ID = ab.id)) AS BUFFER,
CONVERT(TRIM((select val from ABILITIES where PROP = 'VendorPrice' and ID = ab.id)), INT) AS COST,
TRIM((select val from ABILITIES where PROP = 'ReqCharLevel' and ID = ab.id)) AS LEV,
TRIM((select val from ABILITIES where PROP = 'ReqAbilityID' and ID = ab.id)) AS R1,
TRIM((select val from ABILITIES where PROP = 'objName' and ID =
(select val from ABILITIES where prop = 'ReqAbilityID' and ID = ab.id))) AS R1_NAME,
(select CONVERT(val, INT) from ABILITIES where PROP = 'ReqAbilityLevel' and ID = ab.id) AS RL1,
TRIM((select val from ABILITIES where PROP = 'ReqAbilityID 2' and ID = ab.id)) AS R2,
TRIM((select val from ABILITIES where PROP = 'objName' and ID =
(select val from ABILITIES where prop = 'ReqAbilityID 2' and ID = ab.id))) AS R2_NAME,
(select CONVERT(val, INT) from ABILITIES where PROP = 'ReqAbilityLevel 2' and ID = ab.id) AS RL2,
TRIM((select val from ABILITIES where PROP = 'ReqAbilityID 3' and ID = ab.id)) AS R3,
TRIM((select val from ABILITIES where PROP = 'objName' and ID =
(select val from ABILITIES where prop = 'ReqAbilityID 3' and ID = ab.id))) AS R3_NAME,
(select CONVERT(val, INT) from ABILITIES where PROP = 'ReqAbilityLevel 3' and ID = ab.id) AS RL3,
TRIM((select val from ABILITIES where PROP = 'ReqAbilityID 4' and ID = ab.id)) AS R4,
--TRIM((select str from STRING_TABLE ss where uint32 = (select val from ABILITIES where ID = ab.id and PROP = 'IconID'))) AS IconID,
TRIM((select str from STRING_TABLE ss where uint32 = (select val from ABILITIES where ID = ab.id and PROP = 'InfoID'))) AS InfoID,
TRIM((select str from STRING_TABLE ss where uint32 = (select val from ABILITIES where ID = ab.id and PROP = 'AbilityID'))) AS AbilityID,
TRIM((select str from STRING_TABLE ss where uint32 = (select val from ABILITIES where ID = ab.id and PROP = 'MoreInfoID'))) AS MoreInfoID,
1 AS END
from
ABILITIES ab
where prop = 'objName'
/*
and ID not in (2148521984)
and ID not in (select id from ABILITIES where PROP = 'objName' and VAL like 'NPC%')
and ID not in (select id from ABILITIES where PROP = 'OrganizationID')*/
)
order by COST ASC
Do not try and play The Matrix Online as you used to. That's impossible. Instead... only try to realize the truth. There is no Matrix Online. Then you'll see, that it is not the The Matrix Online that is getting played, it is only yourself.