• Welcome to Final Fantasy Hacktics. Please login or sign up.
 

Is anyone interested in hardcoded functions in battle.bin?

Started by cciadr, July 24, 2008, 03:02:34 pm

methanol

September 18, 2008, 11:31:45 am #60 Last Edit: December 31, 1969, 07:00:00 pm by methanol
Okay, I'm really not sure where to start, but for shits and giggles here's a translation of the file called イベント改造メモ.txt from the file up0079.zip on that site.

Notes on the translation of these notes will be in curly brackets.

Part 1
They're extraordinarily hard to read but here are notes on remaking events

-------------------------------------------------------------------------------------

1.ATTACK.OUT

0x00010F0A~
What number message (event) to use, what map to use, {literally "message"}
what parties to use, music etc.


The below is in partitions of 24 bytes

message     map   music1music2character                  Chara(ZS)  next  80end81next82choose {'music' may mean 'sound' here}

*1    *2    *3 *4    *5 *6 -*7-                    -*8-     *9    *10    

00 00 01 00 3E 00 00 33 34 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00

00 00 02 00 3E 00 00 33 34 00 01 00 00 00 00 00 00 00 01 00 03 00 81 00



00 00 03 00 38 02 00 34 0C 83 01 00 00 00 00 00 00 00 00 00 00 00 00 00

01 00 04 00 38 02 00 34 0C 83 01 00 00 00 00 00 00 00 00 00 00 00 00 00

00 00 05 00 38 02 00 34 0C 83 01 00 00 00 00 00 00 00 00 00 00 00 00 00

00 00 06 00 38 02 00 34 0C 83 01 00 00 00 00 00 00 00 00 00 07 00 81 00



00 00 07 00 18 00 00 35 00 88 01 00 00 00 00 00 00 02 01 00 00 00 00 00

02 00 08 00 18 00 00 35 00 88 01 00 00 00 00 00 00 02 01 00 09 00 81 00



00 00 09 00 16 00 00 03 00 84 01 00 01 00 00 5B 80 00 00 01 00 00 00 00

03 00 0A 00 16 00 00 03 00 84 01 00 01 00 00 5B 80 00 00 01 00 00 00 00

00 00 0B 00 16 00 00 03 00 84 01 00 01 00 00 5B 80 00 00 01 00 00 00 00

00 00 0C 00 16 00 00 03 00 84 01 00 01 00 00 5B 80 00 00 01 00 00 80 00



Along these lines, one event is displayed by a few clusters of 24 bytes.
We don't really know why you need 2? at the lowest.

Further, the information about whether an event battle will begin is not here.  (unclear)



*1 Event number 00:Ovelia's prayer  01:The first battle etc.

*2 Related to the event 'serial number' (*9)

  Also, I'll write about this later, but the events are in TEST.EVT.

  There seems to be an event corresponding to the number in *2 ×(0x1800)

  Wherever *1 is 00(except the very beginning)it looks like all the data is the same

*3 Map number

*4 Weather?

*5,*6 Music1,2

*7 Participating Characters

  0x0000~0x007F ENTD1.ENT

  0x0080~0x00FF ENTD2.ENT

  0x0100~0x007F ENTD3.ENT

  0x0180~0x01FF ENTD4.ENT

*8  Participating Characters: Replaying events from the brave story menu usese these?

*9 'Serial number' of the next event

*10 80:End on this event 81:proceed to the event indicated in *9 82:return to Title(ED)


Part 2 coming soon.

LastingDawn

September 18, 2008, 11:40:48 am #61 Last Edit: December 31, 1969, 07:00:00 pm by LastingDawn
Hmm... this looks eerily similar to this...

QuoteWritten by Gomtuu

First line:
0x10938: 0100 3E00 0033 3400 0100 0000 0000 0000 0100 0000 0000 0000
         AAAA BBCC DDEE FFGG GGHH HHII II          ZZ xxxx xxxx JJJJ

Last line:
0x10950: 0200 3E00 0033 3400 0100 0000 0000 0000 0100 0300 8100 0000
              xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx KKKK LL   xxxx


x = duplicate, ignored data
A = Scenario number: 1
    (Just an index for this list, apparently.
    Also, whichever event is numbered "1" always plays first.)
B = Map number: 0x3e
    (MAP/MAP062.GNS)
C = Weather: 0
    (Doesn't influence whether the rain animations are used)
D = Day/Night: 0
    0 = Day
    1 = Night
E = First Music file: 0x33
    (SOUND/MUSIC_51.SMD)
F = Second Music file: 0x34
    (SOUND/MUSIC_52.SMD)
G = ENTD entry: 0x0100
    (Looks like this matches the "Game Events" list.)
H = Character placement grid, 1st Squad
    (Placement grids are found in ATTACK.OUT at 0xbbd4)
    (For first scenario, using this makes the placement screen garbled.)
I = Character placement grid, 2nd Squad
J = Event script: 0
    (Scenario 1 seems to be a special case because Event Script 0
    plays just fine. Using Event Script 0 on scenario 3 causes wrong
    text to display.)
    (Also seems to control which scenario block the "next scenario"
    byte is read from)
K = Next scenario: 3
    (As indexed by A)
L = 0x80 = World map follows this scenario
    0x81 = Another event follows this scenario (K)
    0x82 = Game reset follows this scenario (side effect, or intneded?)
Z = Not sure yet, but setting it to 1 makes Ramza mandatory on
    character placement screen

While that is now quite basic information  I wonder if the second part will have anything of more interest...? Though it's interesting that the Japanese Attack.out is slightly different from ours... hmm...

Well in any case good work so far! It's good to see these notes translated.
"Moment's anger can revert to joy,
sadness can be turned to delight.
A nation destroyed cannot be restored,
the dead brought back to life."

Art of War

Beta & Gretchen Forever!!!!

methanol

September 18, 2008, 01:08:52 pm #62 Last Edit: December 31, 1969, 07:00:00 pm by methanol
If there's any other documents I should prioritize on, please let me know.  This is my limit for the night, I think =)  Unless it's something very simple.

Sorry for the messy translation.  It's 2 AM and I think everything should be more or less clear now, but if you want anything clarified please ask.

2.TEST.EVT
Events are stored every {interval of?} 0x1800.
It looks like it was made by copy/pasting the previous event; at the end of each block
there's even a message the same as the last one sitting around as junk (laugh)

It's made into an Event section and a Message section,
and the first 2 bytes give the length of the Event section.
I'll write a few instructions used in the Event section
They indicate characters that move and talk in the events, but
these are defined in the ENTD file(s)
The following comprises the data for one character.
0C 40 0C FE 05 0B FE FE 00 01 0C 00 FE 01 FE 01 FE 01 FE FE
FF FE FE 00 80 08 04 03 FE FF 00 00 0C 00 00 00 00 00 00 00
        x y facing       ↑
                The value of this 0x20th byte is that character's number within the event.
                 (in this case 0C)
                It seems it doesn't necessarily have to match their job.
                
Below is part of the instructions.
F1 XX XX :Wait instruction. Waits {pauses?} according to XXXX

E5 XX XX :?? Often used as E5 01 00
      It looks like a type of wait, but used at the end of message displays, etc.
      Without it, it won't wait for input at the end of message displays.
      
10 10 instruction:message display (15 bytes)
      例:10 10 92 01 00 11 00 00 10 00 00 00 F8 FF 10
           *1 *2    *3 ------------*4------------
             *1: window type
             *2: message number delineated by FE in the Message section
             *3: Speaker, In-event Character number as written above
       *4: Fine positioning adjustment of outbursts

51 Instruction:Message window cleanup(6 bytes)
 example  1 51 02 03 00 00 00
          *1 *2
       *1:Which window? 01:The window displayed above 02:below 03:center
       *2:Message number
       Displayes *2 in the window indicated in *1
 example 2 51 01 FF FF 00 00
            *1
       *1: 01:The window displayed above 02:below 03:center
       Closes a window.

19 Instruction:Camera control (17bytes)
   ex:    19 68 02 53 00 F8 01 2E 01 00 12 00 00 00 10 80 00
        -------coordinates、direction、speed--------------details as yet unexperimented
 
11 Instruction:Character Action / Change Graphics(6 bytes)
ex 11 23 00 02 00 00  Makes Character 23 do action # 0x0002
11 23 00 58 02 00  Makes Character 23 do action # 0x0258
       0x0200?~are actions with event-use graphics EVTCHR.BIN
       If after attack motions etc. you don't set them to other rest motions the events can desynch

2D Instruction:Change facing direction(7 bytes)
ex  2D 11 00 0C 00 01 00  Character 11 rotates to direction 0C at speed 01(?)

5F Instruction:Change Character's Initial Position (7 bytes)
     ex 5F 18 00 03 05 00 02  Changes Character 18's initial position to 03,05.  Dunno about the 02 on the end
      Text windows are displayed on the basis of these initial positions.  The default positions are in ENTD

3B Instruction:Character dot* move {in units} (13 bytes) {literally ドット 'dotto'.}
     ex 3B 11 00 38 00 00 00 00 00 00 01 38 00  Moves Character 11。The movement dot is based on the initial position.
          ------move dot-----------speed--   If the movement dot is all 0 move to initial position
      Even though I say 'move' it moves without changing the graphic and ignoring terrain.
      It's also necessary to set a walking action
  Before and after movement there are often 64 and 6F instructions but it's unknown if they are necessary.
      If it doesn't go well then please consider the following event example.

28 Instruction:Character move(9 bytes)
     ex 28 18 00 03 06 00 00 06 01 Move Character 18 to coords 03-06,
                     After the move, facing is 00、speed 0106
Moves appropriately for the map, and also does a proper walking motion.

79 Instruction: Action after a move(5 bytes)
     ex 79 18 00 02 00  after moving with instruction 28, Character 18 does action 02

44&46
46 11 00   Remove Character 11
44 11 00   Show Character 11

21 Instruction: SFX
     ex 21 4C 00   Play effect sound 4C

18 Instruction:Effect
     ex 18 1C 02 16 Effect 0x021C on Character 16.

2A,2B Parallel execution
    Do what's below 2A and 2B in parallel

78 27 5A  -->  display victory condition 27
7f XX 00 YY yy  palette?
98 85 00 Warp Motion
22 01 60 00 Change music

Below, I give the disassembled data of "Wrath of the Cardinal", on which the remake is based.
We don't really understand the end so it's left as is.
We remade from around the middle part.
There are many many parts not yet understood.

11:Gafgarion  23:ルード  18:ドラ

F1 04 Size of Event Section
00 00 11 00 00 02 00 00
58 01 2D 00 #Set Event-use graphics to 0x2D in EVTCHR?
E5 34 00  
59 01
11 18 00 66 02 00 #Draclau:Graphic change
3B 18 00 0B 00 FC FF 00 00 00 01 20 00 #Draclau:Move
6F 18 00
19 68 02 93 F9 F8 01 5E 02 00 12 00 00 00 10 01 00 #Camera Move
E5 04 00
63 E9
4D 06
19 68 02 53 00 F8 01 2E 01 00 12 00 00 00 10 80 00 #Camera Move
E5 04 00
E5 04 00
F1 3C 00
10 10 92 01 00 11 00 00 10 00 00 00 F8 FF 10 #Swordsman Gafgarion "text..."
E5 01 00 #Wait for input after text bubble
11 23 00 58 02 00 #Rudvich:Graphic change
F1 06 00 #WAIT
11 23 00 59 02 00 #Rudvich:Graphic change
F1 06 00 #WAIT
10 10 91 02 00 23 00 00 00 00 00 00 00 00 11 #Rudvich "text..." 
E5 01 00 #Wait for input after text bubble
11 11 00 5F 02 00 #Gafgarion:Graphic change
F1 06 00 #WAIT
11 11 00 60 02 00 #Gafgarion:Graphic change
F1 06 00 #WAIT
51 02 03 00 00 00 #Swordsman Gafgarion "text..."
E5 01 00 #Wait for input after text bubble
51 01 FF FF 00 00 #Close Window 1
F1 08 00 #WAIT
51 02 FF FF 00 00 #Close Window 2
E5 01 00 ??
F1 1E 00 #WAIT
2A #Parallel execute 1
F1 1E 00 #WAIT
11 11 00 5F 02 00 #Gafgarion:Graphic change
F1 08 00 #WAIT
11 23 00 58 02 00 #Rudvich:Graphic change
F1 06 00 #WAIT
11 23 00 02 00 00 #Rudvich:Graphic change
F1 04 00 #WAIT
11 23 00 5A 02 00 #Rudvich:Graphic change
F1 04 00 #WAIT
11 11 00 02 00 00 #Gafgarion:Graphic change
2B #Parallel execute 2
10 10 91 04 00 18 00 00 00 00 00 00 FC FF 12 #Cardinal Draclau "text..."
E5 01 00 #Wait for input after text bubble
10 10 92 05 00 11 00 00 00 00 00 00 08 00 10 #Swordsman Gafgarion "text..."
E5 01 00 #Wait for input after text bubble
51 01 06 00 00 00 #Cardinal Draclau "text..."
E5 01 00 #Wait for input after text bubble
11 11 00 61 02 00 #Gafgarion:Graphic change
F1 08 00 #WAIT
11 11 00 62 02 00 #Gafgarion:Graphic change
F1 0A 00 #WAIT
11 11 00 63 02 00 #Gafgarion:Graphic change
F1 04 00 #WAIT
51 02 07 00 00 00 #Swordsman Gafgarion「"用心深い"
E5 01 00 #Wait for input after text bubble
11 11 00 61 02 00 #Gafgarion:Graphic change
F1 08 00 #WAIT
11 11 00 02 00 00 #Gafgarion:Graphic change
51 01 08 00 00 00 #Draclau枢機卿「わかりました
E5 01 00 #Wait for input after text bubble
11 11 00 64 02 00 #Gafgarion:Graphic change
F1 08 00 #WAIT
11 11 00 65 02 00 #Gafgarion:Graphic change
F1 04 00 #WAIT
51 02 09 00 00 00 #Swordsman Gafgarion「いいだろう。
E5 01 00 #Wait for input after text bubble
11 11 00 64 02 00 #Gafgarion:Graphic change
F1 08 00 #WAIT
11 11 00 02 00 00 #Gafgarion:Graphic change
51 01 FF FF 00 00 #Close Window 1
11 23 00 02 00 00   #Rudvich:Graphic change
F1 04 00 #WAIT
11 23 00 58 02 00   #Rudvich:Graphic change
F1 06 00 #WAIT
11 23 00 59 02 00   #Rudvich:Graphic change
F1 06 00 #WAIT
10 10 91 0A 00 23 00 00 00 00 00 00 00 00 01 #Rudvich「なんだとッ!
E5 01 00 #Wait for input after text bubble
51 01 FF FF 00 00   #Close Window 1
F1 08 00 #WAIT
51 02 FF FF 00 00   #Close Window 2
E5 01 00
F1 32 00 #WAIT
10 10 91 0B 00 18 00 00 00 00 00 00 F8 FF 12 #Draclau枢機卿「よいでしょう
E5 01 00 #Wait for input after text bubble
51 01 FF FF 00 00   #Close Window 1
11 23 00 58 02 00   #Rudvich:Graphic change
F1 06 00 #WAIT
11 23 00 02 00 00   #Rudvich:Graphic change
F1 08 00 #WAIT
2A #Parallel execute 1
11 23 00 5A 02 00   #Rudvich:Graphic change
F1 06 00 #WAIT
11 23 00 5B 02 00   #Rudvich:Graphic change
F1 0A 00 #WAIT
11 23 00 5C 02 00   #Rudvich:Graphic change
F1 06 00 #WAIT
2B #Parallel execute 2
10 10 91 0C 00 23 00 00 00 00 00 00 00 00 01 #Rudvich「猊下、本気
E5 01 00 #Wait for input after text bubble
E5 08 00
51 01 FF FF 00 00   #Close Window 1
11 23 00 5B 02 00   #Rudvich:Graphic change
F1 08 00 #WAIT
11 23 00 5A 02 00   #Rudvich:Graphic change
F1 0A 00 #WAIT
F1 0A 00 #WAIT
10 10 91 0D 00 18 00 00 00 00 00 00 F8 FF 12 #Draclau枢機卿「では、頼み
E5 01 00 #Wait for input after text bubble
2A #Parallel execute 1
F1 0A 00 #WAIT
11 23 00 02 00 00   #Rudvich:Graphic change
F1 08 00 #WAIT
11 23 00 58 02 00   #Rudvich:Graphic change
F1 08 00 #WAIT
11 23 00 59 02 00   #Rudvich:Graphic change
F1 0A 00 #WAIT
2B #Parallel execute 2
10 10 92 0E 00 11 00 00 00 00 0A 00 08 00 10 #Swordsman Gafgarion「任せておけ
E5 01 00 #Wait for input after text bubble
51 01 FF FF 00 00   #Close Window 1
F1 08 00 #WAIT
51 02 FF FF 00 00   #Close Window 2
E5 01 00
F1 08 00 #WAIT
2D 11 00 0C 00 01 00 #GafgarionのFacing Direction Change
64 11 00
11 11 00 03 00 00 #Gafgarion:Graphic change
3B 11 00 38 00 00 00 00 00 00 01 38 00 #GafgarionMove
6F 11 00
21 4C 00 #SFX
3B 11 00 54 00 00 00 00 00 00 01 1C 00 #GafgarionMove
32 11 00 01 FA FC FE 02 #Gafgarion becomes black
F1 11 00 #WAIT
46 11 00 #Remove Gafgarion
E5 08 00
F1 1E 00 #WAIT
21 4C 00 #SFX
F1 3C 00 #WAIT
11 23 00 58 02 00   #Rudvich:Graphic change
F1 08 00 #WAIT
11 23 00 02 00 00   #Rudvich:Graphic change
F1 08 00 #WAIT
11 23 00 5A 02 00   #Rudvich:Graphic change
F1 08 00 #WAIT
11 23 00 5B 02 00   #Rudvich:Graphic change
F1 08 00 #WAIT
11 23 00 5C 02 00   #Rudvich:Graphic change
F1 08 00 #WAIT
11 23 00 5D 02 00   #Rudvich:Graphic change
F1 0A 00 #WAIT
11 23 00 5E 02 00   #Rudvich:Graphic change
F1 0A 00 #WAIT
10 10 92 0F 00 23 00 00 00 00 0A 00 14 00 13 #Rudvich「猊下、
E5 01 00 #Wait for input after text bubble
51 02 FF FF 00 00   #Close Window 2
11 23 00 5E 02 00   #Rudvich:Graphic change
F1 0A 00 #WAIT
11 23 00 5D 02 00   #Rudvich:Graphic change
F1 0A 00 #WAIT
11 23 00 5C 02 00   #Rudvich:Graphic change
F1 0A 00 #WAIT
11 23 00 5B 02 00   #Rudvich:Graphic change
F1 08 00 #WAIT
11 23 00 5A 02 00   #Rudvich:Graphic change
F1 08 00 #WAIT
F1 1E 00 #WAIT
21 53 00 #SFX
11 18 00 67 02 00 #Draclau:Graphic change
F1 08 00 #WAIT
11 18 00 68 02 00 #Draclau:Graphic change
F1 18 00 #WAIT
3B 18 00 00 00 00 00 1C 00 00 01 38 00 #Draclau:Move
F1 0A 00 #WAIT
8C 18 00 0A 02 00 00 #Draclau:Temporary Graphic change?
F1 08 00 #WAIT
8C 18 00 08 02 00 00 #Draclau:Temporary Graphic change?
F1 08 00 #WAIT
6F 18 00
F1 08 00 #WAIT
3B 18 00 00 00 00 00 00 00 00 01 01 00 #Draclau:Move(初期位置:すぐ次の5F命令で設定されたとこにいきます)
5F 18 00 03 05 00 02 #Draclau:Change character's original position
F1 1E 00 #WAIT
63 CA
2A #Parallel execute 1
28 18 00 03 06 00 00 06 01 #Draclau:Move(0306へ)
79 18 00 02 00 #Draclau:Graphic change
F1 10 00 #WAIT
8C 23 00 02 02 00 00   #Rudvich:Temporary Graphic change?
F1 08 00 #WAIT
8C 23 00 04 02 00 00   #Rudvich:Temporary Graphic change?
29 18 00
2D 18 00 0C 00 00 00 #Draclau:Facing Direction Change
64 18 00
2B   #Parallel execute 2
F1 10 00 #WAIT
19 F8 01 73 00 48 03 2E 01 FC 11 FF FF 00 10 50 00 #Camera Move
E5 04 00
10 10 91 10 00 18 00 00 00 00 00 00 F8 FF 12 #Draclau枢機卿「おまえは
E5 01 00 #Wait for input after text bubble
2D 23 00 04 00 02 00   #Draclau:Facing Direction Change
10 10 92 11 00 23 00 00 2C 00 00 00 E6 FF 12 #Rudvich「げ、猊下
E5 01 00 #Wait for input after text bubble
51 01 FF FF 00 00     #Close Window 1
F1 0A 00   #WAIT
51 02 FF FF 00 00     #Close Window 2
E5 01 00    
11 18 00 03 00 00 #Draclau:Graphic change
3B 18 00 0E 00 00 00 00 00 03 0A 28 00 #Draclau:Move
F1 0A 00 #WAIT
11 23 00 03 00 00 #Rudvich:Graphic change
3B 23 00 0A 00 00 00 00 00 00 01 0F 00 #Rudvich:Move
6F 18 00
11 18 00 02 00 00 #Draclau:Graphic change
6F 23 00
11 23 00 02 00 00 #Draclau:Graphic change
19 F8 01 C3 FD 48 03 2E 01 FC 11 FF FF 00 10 60 00   #Camera Move
60 00 3C
F1 1E 00 #WAIT
11 18 00 03 00 00 #Draclau:Graphic change
3B 18 00 38 00 00 00 00 00 00 01 2A 00   #Draclau:Move
F1 04 00 #WAIT
F1 3C 00 #WAIT
21 92 00 #SFX
F1 1E 00 #WAIT
21 44 00 #SFX
33 04 00 E1 E1 01 #Screen becomes red
F1 09 00 #WAIT
F1 3C 00 #WAIT
3E 02 00 Below Unknown.
00 00 FF FF FF 32 00 E5 0C 00 BE 6E 00 B0 6E 00 1B 00 BE D4 01 B0 D4 01 01 00 BE E4 03 B0 E4 03 03 00 63 A8



SentinalBlade

September 18, 2008, 02:58:32 pm #63 Last Edit: December 31, 1969, 07:00:00 pm by SentinalBlade
@Black: Me and vanya have been working on formula editing for a small time, and ive made "some" headway...i understand all the functions, its just a little confusing trying to get a formula to run

Vanya

September 18, 2008, 03:33:24 pm #64 Last Edit: December 31, 1969, 07:00:00 pm by Vanya
Indeed. It's confusing the hell outta me right now.

*goes to study more ASM*

Nope, still confused. =(

But seriously, it's just a matter of time and patience to figure it out. Once it's figured out we'll be able to do some really cool stuff. Cciadr already managed to add weapon damage to Meliadoul's attacks. So it's doable, it's just not easy.
  • Modding version: Other/Unknown
¯\(°_0)/¯

Cheetah

September 18, 2008, 07:31:22 pm #65 Last Edit: December 31, 1969, 07:00:00 pm by Cheetah
Methanol: Freaking awesome work man, this must have taken forever to translate. Seems like there should definitely be some enlightening information in here. I would recommend starting your own topic and just spouting off what you are finding on these sites and providing some links. Once we know what we could potentially be looking at people might have more advice on what you should tackle next. We desperately need to understand what our Japanese counter parts are up to.
Current Projects:

Xifanie

September 18, 2008, 09:39:39 pm #66 Last Edit: December 31, 1969, 07:00:00 pm by Xifanie
Sorry Methanol, we already have far more documentation concerning TEST.EVT.

Well at least I learned about the parralel execution, instructions 2A and 2B bugged me for a while.
I don't know maybe you could list  us the documents to be possibly translated? We could see what would have priority.
  • Modding version: PSX
Love what you're seeing? https://supportus.ffhacktics.com/ 💜 it's really appreciated

Anything is possible as long as it is within the hardware's limits. (ie. disc space, RAM, Video RAM, processor, etc.)
<R999> My target market is not FFT mod players
<Raijinili> remember that? it was awful

gomtuu

September 18, 2008, 10:18:38 pm #67 Last Edit: December 31, 1969, 07:00:00 pm by gomtuu
Quote from: "LastingDawn"Hmm... this looks eerily similar to this...
Hmm... Nice to have independent verification, though. :)

BeoulveBlack

September 19, 2008, 08:57:31 pm #68 Last Edit: December 31, 1969, 07:00:00 pm by BeoulveBlack
this is what i meant; although it seems redundant, there may be things we looked over or are not able to understand yet that this japanese guy does. it will be helpful if this stuff gets all translated just in case...