
-----------------------------------
Raknarg
Thu Nov 24, 2011 5:03 pm

Finding a specific spot in a text file
-----------------------------------
Hey guys. I know this is in the turing walkthrough, but I didn't quite understand it, so I'm hoping someone could clarify this for me...

Basically I'm starting and RPG (just to see if I can do it, and for fun :P), and one of my problems is that I'm using a text file for the map, but I want to be able to change the states of a certain place on the map (for instance you would use the code chst+ for a chest that's closed and chst- for a chest that's opened). However, I'm not quite sure how to find a specific spot and then go about changing it.

-----------------------------------
ProgrammingFun
Thu Nov 24, 2011 5:14 pm

RE:Finding a specific spot in a text file
-----------------------------------
Possibly grid the map and assign each chest coordinates on that grid? That's what I did for a game I previously programmed last year.

-----------------------------------
Raknarg
Thu Nov 24, 2011 5:19 pm

RE:Finding a specific spot in a text file
-----------------------------------
Yeah thats what I'm doing, but I mean for the text file itself, because I need to make a way for the computer to remember if the chest was opened.

-----------------------------------
Tony
Thu Nov 24, 2011 5:54 pm

RE:Finding a specific spot in a text file
-----------------------------------
Just overwrite the entire file. Presumably save doesn't happen often.

Alternatively you could use binary mode. I'm not sure if that will introduce complications when you start mixing it with text-mode creation/edits of the files.

-----------------------------------
Aange10
Thu Nov 24, 2011 6:49 pm

RE:Finding a specific spot in a text file
-----------------------------------
I could be totally wrong, but I've seen configure files that would have something looking like


-FireSpread = 15
-SpawnPoint = 100, 100, 100
-Speed = 300
-fly = true
-chest = closed


if it is optional for you to do something like that, you could simply 'load' each line and then go through where you store it and have the computer look past the = sign, to get the information it needs.

If that is an applicable way for you to do this.

-----------------------------------
Raknarg
Fri Nov 25, 2011 6:39 pm

RE:Finding a specific spot in a text file
-----------------------------------
Yeah, I think im giving up on putting the chest in the text, I'll probably just use a number array to keep track instead... thanks for the suggestions guys

-----------------------------------
Aange10
Fri Nov 25, 2011 7:08 pm

RE:Finding a specific spot in a text file
-----------------------------------
^-^ Yup, no problem.

I'm so unsure of myself because I'm not really quite sure what you are doing in the text file.

Anyways, the way I said is simple string manipulation/sorting.


Edit:

But to answer your thread question:

I don't know how to find a specific spot in a text file, but there are ways to organize your data and store it in the text file. The only way I know, however, of finding something specifically in a text file is storing the text file as an array, and then sorting through the array.

-----------------------------------
Raknarg
Fri Nov 25, 2011 7:16 pm

RE:Finding a specific spot in a text file
-----------------------------------
To answer your first question, Imagine a file like this:

grss grss
grss grss

In my program, that would just be read as four grass tiles and it would draw them to the screen. Now what if I have this:

grss chst+
grss grss

chst+ Could be considered as a closed chest. Now lets saw your character is on the top right, and activates the chest. An event occurs, and after that, the chest is forever open. However, I need to find a way to change that old text to this:

grss chst- 
grss grss

Noe that would be easy for four tiles. What if I have a hundred tiles or more? I need to make an algorithm to find the spot the chest was in in the text file and then change the data.

And yes, I can sort through the array, but I need the information to be saved, and I dont want to have to rewrite an entire map every time if I dont hafve to.

-----------------------------------
Tony
Fri Nov 25, 2011 7:55 pm

Re: RE:Finding a specific spot in a text file
-----------------------------------
I dont want to have to rewrite an entire map every time if I dont hafve to.
as was asked above, why not?

Ideally, yes -- that feels like work... suboptimal... wrong. But from a Software Engineering stand point -- how much of a performance hit is that?

-----------------------------------
Aange10
Fri Nov 25, 2011 8:27 pm

RE:Finding a specific spot in a text file
-----------------------------------
OT:
This reminds me a of Minecraft.

On Topic:

http://www.minecraftwiki.net/wiki/Alpha_Level_Format

might help.

Wait, my off topic was on topic.. hmmm :)

-----------------------------------
Aange10
Fri Nov 25, 2011 9:11 pm

RE:Finding a specific spot in a text file
-----------------------------------
Also, could you not assign numbers to each chest? So I wouldnt be changing chst+ I'd be changing chst+1234 to chst-1234

-----------------------------------
Raknarg
Fri Nov 25, 2011 9:31 pm

RE:Finding a specific spot in a text file
-----------------------------------
Theres no need for numbers. The chest is already placed at a certain spot, so it doesnt matter whether or not it's assigned a number. Thats the point of giving each spot its own code; I can pull apart the string and use the information to interact with the game

-----------------------------------
Aange10
Fri Nov 25, 2011 9:37 pm

RE:Finding a specific spot in a text file
-----------------------------------

The chest is already placed at a certain spot



I'm not quite sure how to find a specific spot 



And your point is?



it doesnt matter whether or not it's assigned a number


wheres the problem?

-----------------------------------
ProgrammingFun
Fri Nov 25, 2011 9:56 pm

Re: RE:Finding a specific spot in a text file
-----------------------------------
wheres the problem?
http://s3.amazonaws.com/kym-assets/photos/images/original/000/096/044/trollface.jpg

-----------------------------------
Raknarg
Fri Nov 25, 2011 10:10 pm

RE:Finding a specific spot in a text file
-----------------------------------
BECAUSE I need to be able to read one specific string. It doesnt matter what I put on that string, If I cant find any one particular spot and change it, then it's pointless. I'd just have to use a separate text file or something specifically for the chest.

-----------------------------------
Raknarg
Fri Nov 25, 2011 10:11 pm

RE:Finding a specific spot in a text file
-----------------------------------
Like I could just rewrite the file every time it changes, but that doesnt seem like the best option.

-----------------------------------
Aange10
Fri Nov 25, 2011 11:18 pm

RE:Finding a specific spot in a text file
-----------------------------------
Okay, but your able to keep track of where grass blocks are, so keep track of where chest blocks are too. Just instead of chst, define it by its number. That away you can assign each chest a specific  state.

Instead of saying "Theres an 8 by 8 block of grass at 300, 300, 300 with an open chest"

you can say "There's an 8 by 8 block of grass, at 300, 300, 300 with chest 13486"


say your player goes within 20 blocks of a chest, you can tell the computer "If the player is within 20 blocks of a chest, then take the chest's name, and find its state."


You could write the state of any given chest in another txt file, or you could keep an array with the chests state.

** Also in case you're thinking the array would get too big, I have two points.

1) I don't know anybody who would have 10,000 chests. or 100,000 or 1,000,000 chests. If it took a second to get a chest, it would take 11 and a half days straight to get 1,000,000 chests.

2) During loading, you could have it filter through the chests and check to see if they exist. (You could have 4 flags. Open/Close/Locked/Destroyed [or use whatever flag you currently use]) And if they don't exist anymore, free the spot in the array. I'm sure your map file would have already replace the "chest" with "air" or whatever it is that was put there.

-----------------------------------
Raknarg
Sat Nov 26, 2011 10:31 am

RE:Finding a specific spot in a text file
-----------------------------------
Of course I can keep track of them, that is not the problem. The problem is rewriting a text file with the desired data in only one spot without rewriting the entire file, if possible. 

It's not teh array thats the problem here.

-----------------------------------
ProgrammingFun
Sat Nov 26, 2011 11:04 am

Re: RE:Finding a specific spot in a text file
-----------------------------------
as was asked above, why not?

Ideally, yes -- that feels like work... suboptimal... wrong. But from a Software Engineering stand point -- how much of a performance hit is that?

-----------------------------------
DemonWasp
Sat Nov 26, 2011 1:22 pm

RE:Finding a specific spot in a text file
-----------------------------------
The best way to do this kind of thing involves having the file format itself tell you (or imply) where the record you want to change is found. In all examples, I will assume that your file is binary, but this is also technically possible with a text (ASCII) file. Typically, there are a few solutions:

Solution A:
This solution is relatively easy to visualize and quick to program. It has some inflexibility and limitations, but you can work around those relatively easily.
1. Separate your files into sections. Each section holds exactly one type of data (doors, or chests, but never "doors and chests"; have separate sections for each).
2. Make it so that each record always consumes the exact same number of bytes. For example, a "chest" record takes up 10 bytes -- 4 are "CHST", 2 are X-coord, 2 are Y-coord, 2 are flags (open, destroyed, key, etc).
3. The "header" of your file -- the first bit you read -- is a constant length. It describes the initial location of each section and the number of elements in that section.
4. Now, to change chest 423, you just need to edit starting at (start of chests section) + 423 * (size of a chest record), and you need to write exactly (size of a chest record) bytes.

Solution B:
This kind of thing is more useful when your objects are logically grouped, but contain varying amounts of information -- for example, items include swords and rings and potions, but each stores a different amount of information and is therefore a different length. However, it is considerably more complicated.
1. The header of your file stores the number of items and the offset to an "index table".
2. The "index table" is just a bunch of offsets into the file, describing the start of each item. So the first 4 bytes of the index table describe the offset of the first item.
3. When you go to the offset described in the table, you read a "record header" that tells you the type of the record and how long it is. This gives you enough information to figure out how much to read or write.
4. Now, to change chest (record number 423, chest number 1), you would go to the offset table at index 423 and read 4 bytes of offset. Then, at that offset, you would read "CHST" as the type and 6 as the length. Now you know you can write 6 bytes (X coord, Y coord, flags).

If you absolutely must pursue this, I recommend you start with solution A. However, I recommend that you consider just rewriting the file every time you save -- this is how professionally-developed games do it, and for good reason: small random writes to files are disproportionately expensive compared to large, consecutive writes. Another good reason is that doing it this way is considerably harder than just rewriting the entire file -- and therefore, more prone to bugs that damage saved games so they can't be loaded again.

-----------------------------------
Raknarg
Sat Nov 26, 2011 2:17 pm

RE:Finding a specific spot in a text file
-----------------------------------
Thanks, I'll look into that.

-----------------------------------
smool
Tue Dec 06, 2011 8:50 pm

RE:Finding a specific spot in a text file
-----------------------------------
alright, its like what Tony said earlier i think, just overwrite everything.
Load the file at the start of the session, save all the data to variables instead of the txt file being the data, and then rewrite the text file when the user hits save?
