#uwadv@irc.freenode.net logs for 27 Nov 2002 (GMT)

Archive Today Yesterday Tomorrow
Underworld Adventures homepage


[00:15:47] <-- yot has left IRC ()
[00:57:59] <-- Dark-Star has left #uwadv ()
[03:26:20] --> Pelops has joined #uwadv
[04:36:18] <-- Pelops has left IRC ()
[07:56:04] --> Eldron has joined #uwadv
[14:29:32] --> yot has joined #uwadv
[18:36:30] --> wjp has joined #uwadv
[18:36:30] --- ChanServ gives channel operator status to wjp
[19:16:26] --> Coren_ has joined #uwadv
[19:16:32] * Coren_ wavies.
[19:16:52] <wjp> hi
[19:17:05] <Coren_> Hey WIllem!
[19:25:39] * Coren_ is struggling over his choice of courses for the next term
[20:15:08] --> vividos has joined #uwadv
[20:15:08] --- ChanServ gives channel operator status to vividos
[20:29:48] <vividos> hi
[20:30:02] <vividos> conversations are working, mostly
[20:30:24] <Coren_> Hey, goodie!
[20:30:41] <wjp> hi vividos
[20:30:44] * Coren_ chuckles.
[20:30:55] <vividos> :)
[20:31:14] <Coren_> We seem to be in some kind of race to one-up each other. I have this feeling both projects will develop like mad for a while. :)
[20:31:14] <wjp> Coren_: choice of courses? hm, that's always hard :-)
[20:31:45] <Coren_> Dis is good. Dis is very good. :)
[20:32:05] <vividos> Coren: we'll see :) I just implemented the conversation screen to look if it is that easy :)
[20:32:24] <Coren_> Heh. Easy my butt. :-) We're just both very good.
[20:33:12] * Coren_ grumbles. Okay, okay, I know. I'll implement monster AI and be done next week. :)
[20:34:44] <vividos> well, AI and combat will be the hardest part, I guess
[20:34:49] <Coren_> Actually, I need to begin character creation and such.
[20:35:19] <vividos> btw, I wanted to ask you how you handle traps; I mean how do you recognize the player triggered one?
[20:36:18] <Coren_> Depends on which. a_enter and a_leave triggers are trivial; a_move traps I just have a Physics::Ballistic object that checks collision. I'm not sure that's how /they/ did it, but it seems to work.
[20:37:28] <Coren_> Though that ends up in triggers being fired somewhat too easily in some spaces. I expect the 'size' of the trigger is variable but I haven't found how.
[20:38:24] <vividos> hmm, I guess I just check if the distance to a trap is lower than a value and set the trap to "already triggered" while the player is in range
[20:38:51] <Coren_> Yeah; that's a hack I've done myself-- but it sucks for certain cases.
[20:39:19] <vividos> for what objects?
[20:40:06] <Coren_> Well; the best case in point are a_move triggers that triggers a_teleport traps; there are cases where the destination of the teleport is right smack in the middle of the a_move trap for the reverse trip.
[20:40:40] <wjp> ugh, those things are really annoying
[20:41:01] <Coren_> Yes. So I've changed a_move traps to only trigger when you are in fact moving /towards/ the trap.
[20:41:02] <wjp> we've had no end of trouble with those kinds of situations in Exult
[20:41:36] <Coren_> wjp: Oh, you are part of the exult team? You get four cool points for 1.0. :-)
[20:41:46] <wjp> heh :-)
[20:42:04] <wjp> thanks, I think :-)
[20:42:33] <Coren_> But even with the only-move-towards hack; often when moving normally you still have velocity / still press the movement key and trigger the return trip immediately.
[20:42:41] <vividos> btw, what does a "a_move trap"?
[20:43:19] <Coren_> It triggers when the player object moves "close enough", where "close enough" is unknown/variable in some way.
[20:43:31] <Coren_> a_enter and a_leave are just tile based.
[20:43:58] <Coren_> Oh, wait. a_move TRAP?
[20:44:12] <Coren_> No such beast in UW2.
[20:44:13] <vividos> sorry, trigger :)
[20:44:28] <Coren_> Ah, okay. Then my previous explanation holds. :)
[20:44:47] <vividos> I guess the trigger just sets off other things?
[20:44:51] * Coren_ nods.
[20:45:07] <Coren_> Normally, a_move almost always points to a_teleport trap or somesuch.
[20:45:36] <vividos> what's the net effect for such a combination?
[20:45:59] <vividos> I thought when I run into a teleport trap, I automatically get teleported
[20:46:19] <vividos> wjp: did you already read my mail on the list?
[20:46:31] <wjp> already replied, too
[20:46:36] <Coren_> Oh, no... traps can ONLY be started by a trigger!
[20:46:41] <wjp> unless you sent another one the last 30 minutes?
[20:46:51] <Coren_> Traps, in fact, don't 'really' exist on the map at all.
[20:46:55] <vividos> Coren: ah ok, that makes sense
[20:47:12] <Coren_> It's always, trigger->trap->trap->possibly more triggers->trap, etc.
[20:47:17] * vividos really should check mails more often :)
[20:47:36] <vividos> a trap can trigger other traps, too?
[20:47:43] <Coren_> At least in UW2; all a_teleport traps are in fact tied to at least one trigger.
[20:48:04] <Coren_> No, not trigger them per say... but a single trigger can fire a whole chain of traps.
[20:48:15] <Coren_> Example:
[20:48:29] <Coren_> trigger A->trap B->trap C->trigger D->trap E
[20:48:36] <Coren_> If you activate A
[20:48:45] <Coren_> Then B and C are fired, and D is checked.
[20:48:53] <Coren_> if D is activated too, then E is also fired.
[20:48:59] <vividos> I guess the "special" field of the trigger links to a chain of traps
[20:49:46] <Coren_> Yes, unless it's a a_create object or a_skup in which case it points to the object or monster to create.
[20:50:24] <Coren_> I've figured out all the triggers, but there are still traps I don't understand 'right'.
[20:50:39] <vividos> I only meant the "special" field of the trigger, the trap can of course "special" link somewhere else
[20:50:55] <Coren_> Ah, yes, the special of triggers always points to traps.
[20:51:29] <Coren_> What I do in LoW, is check the triggers and if it gets activated I queue the traps for firing on the next heartbeat.
[20:51:53] <Coren_> Some triggers are checked on player movement, some on object manipulation and some on level load.
[20:52:50] <Coren_> You can actually see this in LoW: move around a map and you will see console message on traps that get fired.
[20:53:17] <Coren_> Especially the 0x183 traps which are activated in many, many places.
[20:54:19] <vividos> a_do trap :)
[20:54:48] <Coren_> In UW2 they are named 'a_hack' traps.
[20:55:31] <Coren_> It seemed for a while that they fired conversation code; but that's only some of the time after all.
[20:55:47] * yot moves around the map
[20:55:47] <Coren_> I.e.: some a_hack will start conversations, some do other unknown things.
[20:55:51] <yot> *trap*
[20:55:51] <vividos> hmm, should write my debugger first before doing more with triggers
[20:55:53] <yot> :P
[20:57:10] <Coren_> That console of mine gave me no end help to date already.
[20:57:58] <Coren_> I wish I wish I wish I could get 30 minutes of Q&A with the original designers. :)
[20:58:16] <vividos> that would be really helpful
[20:58:17] * Coren_ glares at x_clock()
[20:59:10] <Coren_> There are, surprisingly, not that many questions I need answered, but a few of them are REALLY hard to guess at.
[20:59:36] <yot> why guess? :]
[20:59:37] <Coren_> x_clock(), babl_hack() and a_hack traps are the worst offenders.
[20:59:46] <yot> you all know the solution :)
[20:59:50] <Coren_> I don't have reasonably good RE tools for WinDos.
[20:59:57] <yot> IDA
[21:00:10] <wjp> disassembling takes away all the fun
[21:00:17] <vividos> right wjp :)
[21:00:22] <yot> no it just creates the fun
[21:00:29] <wjp> you just feel like you're copying something
[21:00:33] <wjp> instead of creating it
[21:00:35] <Coren_> Besides, there is a legal gray area that this would make me step into.
[21:00:56] <Coren_> Right now, I am PROTECTED by Canadian (c) law.
[21:00:56] <yot> rewrite is also a copy
[21:00:59] <yot> AND
[21:01:02] <wjp> it'll never recreate the charm of staring at hexdumps of data files just to see a pattern
[21:01:07] <yot> who say you have to copy the source code?
[21:01:15] <yot> you can use it to understand what it does
[21:01:23] <yot> the same as you do
[21:01:25] <yot> except
[21:01:30] <yot> you can look if it's right
[21:01:36] <Coren_> yot: Recreating without reverse engineering the program here is not copying legally. :)
[21:02:00] <Coren_> I.e.: EA could bring their biggest cannons to bear against me and I can shrug it off. :)
[21:02:34] <yot> <Coren_> yot: Recreating without reverse engineering the program here is not copying legally. :) <- ?
[21:02:49] <yot> didn't get your point
[21:03:11] <Coren_> Since EA is unpredictable and arguably simply insane, I prefer my security. Besides, as Willem said, there is something exhilirating to suddenly see a patern in what appeared to be a file full of white noise. :)
[21:03:48] <yot> hehe
[21:03:52] <yot> do whatever you want
[21:03:54] <yot> I just say
[21:04:01] <yot> we also tried this with scummvm in the beginning
[21:04:15] <yot> we started to guess everything
[21:04:21] <yot> it did not make any sense
[21:04:28] <yot> cause in every program there are things
[21:04:29] <Coren_> yot: In Canadian law; if you make a program that does the same thing another does, but never used any information coming from RE the original, you have made an independent work. Unless you attempt to pass off the result as the original, you commit no infraction.
[21:04:34] <yot> which are impossible to guess
[21:05:00] <wjp> I doubt that
[21:05:08] <yot> what?
[21:05:08] <wjp> ok, maybe some minor things
[21:05:17] <yot> no wjp
[21:05:20] <yot> image
[21:05:23] <yot> imagine
[21:05:30] <yot> you would have a file
[21:05:33] <yot> called
[21:05:34] <Coren_> yot: I don't beleive that. No programmer acts without reason; there is a logic behind every bit, however twisted, and all it takes is manage to think if only for a second like the original writer.
[21:05:39] <yot> 000.dat
[21:05:47] <yot> with binary stuff in there
[21:06:00] <yot> which is packed data
[21:06:12] <Coren_> Then my first step would be to replace it with all zeros and see what breaks. :)
[21:06:13] <yot> no zip but an own compression by the game
[21:06:32] <Coren_> yot: So? We figured out the compression schemes used by UW and UW2. :)
[21:06:32] <yot> nobody would ever guess what it is even if he has 1.000 years
[21:06:44] <yot> you didn't
[21:06:45] <yot> perhaps
[21:06:57] <yot> you knew what's in the files
[21:07:01] <yot> so
[21:07:04] <yot> you had the source
[21:07:06] <yot> and the result
[21:07:12] <yot> that is possible
[21:07:31] <Coren_> Not for all of them. We had a good idea of some of the cleartext; and we knew what we were aiming for. But that's ALWAYS the case.
[21:07:46] <Coren_> Finding out what some random file is used for is trivial.
[21:08:00] <yot> well that may be true
[21:08:08] <yot> finding the algo is the result is plain text
[21:08:09] <yot> ok
[21:08:14] <yot> that's possible
[21:08:27] <yot> but what if it's an object strukture you don't know
[21:08:27] <wjp> plain text != cleartext
[21:08:28] <Coren_> And programmers rarely reinvent the wheel. There are known 'right ways' of doing things and those (or a simple variation) are almost unfailingly used.
[21:08:45] <Coren_> cleartext != plain text
[21:08:57] * Coren_ LOL
[21:08:58] <Coren_> GMTA
[21:09:33] <wjp> gmta?
[21:10:22] <Coren_> For instance, strings.pak had all the obvious outwards signs of being huffman encoded. Finding out where the dictionnary was and how the bitstream was organized took just hard work.
[21:10:30] <Coren_> GMTA = Great Minds Think Alike.
[21:10:37] <wjp> :-)
[21:11:08] <wjp> most custom compression schemes are just variations on very well-known ones
[21:11:40] <yot> wjp: but how do you know you got the right if you don't know the structure of the result?
[21:11:41] <Coren_> yot: And even when they are not, if you have more than one version of the same program you can apply simplistic differential cryptanalisis.
[21:12:10] <wjp> a) because if you have the wrong algorithm things usually won't even decode, b) because the result has to be structured in some way, usually
[21:12:19] <Coren_> yot: Simply because it will look 'right' immediately. You will see patterns, frequencies, or sometimes (if you're lucky) recognizable information.
[21:12:33] <wjp> text strings are usually nice :-)
[21:12:47] <wjp> offset tables are a good hint too
[21:12:51] <yot> Coren_: so you can recognize if a sound file was decompressed right?
[21:13:00] <yot> just from the hex values?
[21:13:02] <yot> come on
[21:13:04] <Coren_> yot: Yes. Those are simple to recognized.
[21:13:06] <yot> be serious
[21:13:07] <wjp> a sound file? ugh
[21:13:18] <yot> ok coren
[21:13:23] <wjp> sound isn't my area :-)
[21:13:26] <yot> we'll do it that way
[21:13:28] <Coren_> yot: Sound has very simple mathematical properties.
[21:13:37] <yot> I write a program that compresses a .wav file
[21:13:42] <yot> I even tell you it's wave
[21:13:52] <yot> and you tell me the algo just from the compressed file ok?
[21:14:08] <yot> I want to see that cause I just don't believe
[21:14:16] <Coren_> yot: Understanding a file format is just a VERY simplistic case of cryptanalysis with poor key properties. :)
[21:14:35] * wjp nods
[21:14:59] <wjp> good example of that: the way the quotes file is encrypted in U8 :-)
[21:15:16] <Coren_> yot: That would be a biased test. If you were writing a game you would *not* simply try to invent a new compression scheme; you would not have the knowledge to make anything better than what already exists.
[21:15:16] <yot> Coren_: you don't get my point
[21:15:55] <yot> if you talk of cryptanalysis
[21:16:01] <yot> enigma for example
[21:16:13] <Coren_> yot: I get your point, you're missing mine. Game programmers have no time to loose trying to reinvent the wheel. They use what already works, and adapt it to their needs.
[21:16:18] <wjp> it's not worth the money, time or effort to do compression research for packing game data files, basically
[21:16:21] * Coren_ LOL
[21:16:26] <wjp> ... :-)
[21:17:01] <yot> Coren_: if you think like this
[21:17:09] <yot> Coren_: maybe true
[21:17:15] <yot> Coren_: maybe everything is guessable
[21:17:20] <yot> Coren_: but
[21:17:28] <yot> Coren_: to get the whole thing working
[21:17:31] <Coren_> enigma can hardly be called crypto by today's standard. I could break a five wheel enigma machine in all of 10 machine seconds; even without known cleartext. :)
[21:17:56] <wjp> Coren_: you wouldn't happen to be a math student, would you?
[21:18:01] <yot> no
[21:18:02] <yot> :>
[21:18:06] <yot> he isn't afaik
[21:18:07] <yot> hehe
[21:18:10] <Coren_> wjp: CS; but I'm a cryptogeek. :)
[21:18:17] <wjp> :-)
[21:18:25] <yot> Coren_: when I talked about enigma I wanted to say
[21:18:45] <yot> Coren_: if they didn't get an enigma machine
[21:18:52] <yot> they would have never break it
[21:18:56] <yot> broken it
[21:19:03] <yot> never
[21:19:12] <yot> even if there was 100 Corens
[21:19:23] <yot> today you know how enigma works
[21:19:27] <yot> of course you can do it
[21:19:28] <Coren_> yot: Yes. You could use elliptic curve crypto to encode your game data files; and then I would need to RE the code to get at it. But games don't do that.
[21:19:47] <yot> Coren_: the enigma example was this
[21:19:51] <Coren_> yot: No, you are wrong. The cypher of enigma breaks *trivially* to differential cryptanalisis.
[21:20:16] <yot> Coren_: do you know the film enigma?
[21:20:22] <yot> Coren_: they said
[21:20:25] <yot> they broke the codes
[21:20:29] <yot> cause they had a key
[21:20:47] <yot> they took the message which contained weather information
[21:20:58] <Coren_> Yes. You, however, seem to not understand that cryptanalysis progresses like any other science, and that computing power can solve a LOT of problems which would have been tought to be NP-hard.
[21:20:59] <yot> and they knowed what's in there
[21:21:01] <yot> so they broke
[21:21:14] <yot> but what I triing to say all the time
[21:21:21] <yot> what if there isn't any key you have?
[21:21:39] <Coren_> Sure; they used a known plaintext attack because they didn't know of any better way back then.
[21:22:13] <wjp> cryptanalysis progressed a lot since then
[21:22:29] <wjp> there are all kinds of patterns in things encoded by enigma, I would guess
[21:22:39] <Coren_> yot: You should really read up a bit on crypto. Something not written by hollywood, and not written more than 40 years ago. Check for recent works of Blum or Shamir; that will give you a good start. :)
[21:22:52] <yot> Coren_: argh!!!!
[21:22:57] <yot> you still do not get the point
[21:23:01] <yot> I'll give an example
[21:23:05] <yot> okay
[21:23:17] <yot> I compress or crypt the word 'Coren'
[21:23:28] <yot> and the result is 'kgs24' for example
[21:23:29] <wjp> too little structure in that
[21:23:33] <yot> a simply algo
[21:23:37] <yot> now
[21:23:38] <wjp> you can decode that to _anything_
[21:23:43] <yot> !!!!
[21:23:45] <yot> that's the point
[21:23:47] <yot> my god
[21:23:50] <wjp> no, it isn't
[21:23:56] <Coren_> Of course. The fewer data you get the harder cryptanalisis becomes.
[21:24:09] <yot> you can decode your binary files to everything too
[21:24:14] <wjp> you have structured data, and kilobytes or megabytes of it
[21:24:21] <Coren_> But that's like saying you can't fly because it's impossible to make a brick remain airborne.
[21:24:36] <yot> :)
[21:24:37] <wjp> plus the goal of the game programmers wasn't to keep us from seeing it
[21:24:51] <Coren_> wjp: Usually. :) You're forgetting savefiles. :)
[21:25:03] <wjp> Coren_: uh, gigabytes? :-)
[21:25:05] <yot> but their goal was to optimize is
[21:25:18] <Coren_> yot: Yes. Which makes OUR job all the more easier.
[21:25:30] <wjp> Coren_: um, oh, you meant wrt to the second comment :-)
[21:25:52] <Coren_> yot: If they wanted (or could) optimize it, it means there were REPEATING PATTERNS, and REDUNDANT STRUCTURE. Finding THAT back is our primary queue.
[21:26:38] <yot> Coren_: let's stop being at the odds
[21:26:53] <yot> future will tell
[21:27:04] <Coren_> I'm not. I'm having an intelligent discussion. Are you taking any of this personally?
[21:27:15] <yot> no
[21:27:17] <yot> why shall I?
[21:27:29] <Coren_> yot: The past already told. I now understand the structure of 100% of UW2's data files.
[21:27:41] <yot> 100%
[21:27:51] <yot> not even a single bit is unknown?
[21:28:32] <Coren_> I may not know the _purpose_ of each, or even if they have one. But that's immaterial.
[21:29:06] <yot> ok coren
[21:29:06] <Coren_> Every bit of information I need to recreate the function yields their secret sooner or later.
[21:29:19] <yot> but I still got you with RE
[21:29:27] <yot> can you imagine why?
[21:29:27] <yot> :>
[21:29:29] <Coren_> yot: How?
[21:29:44] <yot> what is absolutely 100% impossible to guess
[21:29:57] <yot> are things that are located in the .exe
[21:30:20] <yot> for example everything that has to do with coincidence
[21:30:25] <Coren_> Nope. It's easy to guess at them, and with a bit of work it is even possible to be reasonably right even bug-for-bug.
[21:30:40] <Coren_> 'concidence'?
[21:30:40] <yot> nope
[21:30:56] <yot> coincidence
[21:30:57] <yot> yes
[21:31:17] <yot> for example in uw
[21:31:19] <yot> UW
[21:31:25] <yot> the physics system
[21:31:34] <yot> impossible to get a copy of it with guessing
[21:32:06] <yot> get my point?
[21:34:07] <yot> I murdered him :(
[21:34:38] <Coren_> No. If the effects are the same between system X and system Y from observable properties, and X and Y are identical. The fact that they may operate differently is immaterial.
[21:34:53] <Coren_> s/, and X/s/, then X/
[21:35:22] <yot> but referring to the physics
[21:35:29] <yot> you can't get 100%
[21:35:44] <yot> there are many ways to get from A to
[21:35:45] <yot> there are many ways to get from A to B
[21:37:15] <yot> Coren_: what do you think of this:
[21:37:32] <yot> Coren_: I'm used to play the ego shooter "QuakeWorld"
[21:37:33] <Coren_> yot: Yes. But that has no meaning. If f1(S) == f2(S) for specified epsilon, then f1 and f2 are identical within epsilon.
[21:37:55] <yot> do you think it's possible to rewrite a QuakeWorld server
[21:38:08] <yot> on which I don't notice a difference
[21:38:12] <Coren_> Yes.
[21:38:24] <vividos> you guys write too much for me to read :)
[21:38:31] <Coren_> But that fits in the category 'much more trouble than it's worth'
[21:38:48] <vividos> Coren: when you know 100% of the files, what does xfer.dat do? :)
[21:38:53] <yot> Coren_: I want to say if f1(0)==f2(0) && f1(1) == f2(2) you cannot say f1(0.5) == f2(0.5)
[21:39:07] <yot> Coren_: I want to say if f1(0)==f2(0) && f1(1) == f2(1) you cannot say f1(0.5) == f2(0.5)
[21:40:08] <yot> Coren_: if you find someone who can do this (rewrite a server)
[21:40:12] <Coren_> yot: You are perfectly correct. But if, by context, the parameters are constrained to { 0, 1 } then f1 eq f2. A game has a very, very limited set of input, low entropy, and in almost all cases equivalent states.
[21:41:04] <yot> I will fulfill every single desire you have :>
[21:41:55] <Coren_> yot: I could do it. My desire is that you will pay be $100K/year of effort spend wasting my time for the ~3 or 4 years it will take. Payment in advance only.
[21:42:11] <yot> and if you don't get it?
[21:42:25] <yot> you'll pay back the money?
[21:42:43] <Coren_> yot: That's not even a possibility. You seem to forget that computers are deterministic. :)
[21:43:15] <yot> even if I had the money
[21:43:19] <yot> the prob is
[21:43:26] <yot> you cannot proof you didn't use RE
[21:43:40] <yot> atleast the RE of someone else
[21:45:33] <yot> Coren_: if I think about all your words
[21:45:34] <Coren_> yot: You're completely missing the point. Given any system S and a set of possible input I, you can make a system S' that will behave identically given the same set of inputs with no information on how system S behaves. The complexity of the original system and the variability of the input set correlate only to quantity of work, not difficulty.
[21:46:14] <yot> Coren_: I understand your point but the problem with the physics system for example is that the input is done by the user
[21:46:35] <yot> it's impossible to do the same move again
[21:46:46] <Coren_> So? It remains deterministic. It is quantifiable, measurable and discrete.
[21:46:58] <yot> well
[21:47:04] <Coren_> Yes it is. Record the original input and play it to boredom. :)
[21:47:38] <yot> haha lol :)
[21:47:43] <yot> that's cheating :}
[21:48:08] <Coren_> The amount of pressure and torque you apply to the input device are not; neither are factors like your health, skin texture, etc. But those are all irrelevant; only the quantized input to the program is.
[21:48:35] <Coren_> No it's not cheating. It is, by definition, exactly what reproducing a system IS.
[21:49:02] <yot> well
[21:49:05] <Coren_> I.e.:
[21:49:10] <yot> if we look back to quakeworld
[21:49:18] <yot> if you play the game
[21:49:22] <yot> you'll see
[21:49:39] <yot> that you speed is accel. when you turn and strafe at the same time
[21:49:49] <yot> the accel. depends on how fast you do that
[21:50:00] <yot> how do you want to 'see' how this works?
[21:50:01] <Coren_> I could not make a program that you could play twice with the same result because YOU are the variable. I can, however, make a program that given the same inputs behave the same way. Indeed, a simpler case is make a program you could not possibly distinguish from the original.
[21:50:43] <yot> if you write a program that turns exactly the same speed all the time
[21:50:56] <yot> that destroys the 'puzzle' in the same way as RE do
[21:51:03] <Coren_> I.e.: given n play sessions and n guesses as to the identity of the program, you will guess correctly with exactly .5 probability as n approaches infinity.
[21:51:26] <yot> well Coren_
[21:51:33] <yot> when I think about it
[21:51:44] <yot> you're right
[21:51:55] <yot> in (almost :p) every point
[21:52:04] <yot> but to quote my maths teacher
[21:52:52] <yot> you can shoot your knee from your backside
[21:53:08] <yot> I hope I translated it the right way hehe
[21:53:31] <Coren_> I have NO idea what this means. So I expect something got lost in the translation. :)
[21:53:38] <yot> :>
[21:53:42] <yot> he said
[21:53:46] <wjp> could you say it in german?
[21:53:56] <yot> man kann sich auch durch den rücken ins knie schiessen
[21:54:42] <Coren_> My grasp of german is insufficient to parse that and hold meaning. My translation ends up about like yours. :)
[21:55:03] <Coren_> Just tell me what the /meant/. :)
[21:55:31] <yot> well
[21:55:36] <yot> if you take a gun
[21:55:58] <yot> and you try to shoot a bullet in your knee
[21:56:21] <yot> you can do it
[21:56:31] <yot> by shooting through(?) your backside
[21:56:46] <wjp> small difference: that isn't fun. decoding data files is :-)
[21:56:58] <yot> :)
[21:57:20] <yot> I think the problem here is the different goal
[21:57:50] <yot> as I understood Coren_ right his aim is to make a similar programm to the original one
[21:58:01] <yot> he just wants to proof you can get an equal one
[21:58:12] <Coren_> Yes. But you miss my point entirely anyways: What I want to do. I want to write a game that plays enough like UW2 that it is possible to enjoy it like the original. Retreiving the storyline and map layout from the original datafiles is good. Emulating the exact physics of the original is only useful insofar as it is "close enough" that the game plays the same.
[21:58:18] <yot> but he admits it would take too long
[21:58:56] <yot> ???
[21:59:03] <yot> that's exactly what I said
[21:59:09] <Coren_> I *could* emulate the physics exactly, or the graphics to the pixel, etc. But there is no need for that because the parts of the game that convey information (are useful) do not lay there.
[21:59:11] <yot> I was talking about your aim
[21:59:48] <yot> well
[21:59:54] <Coren_> No, you were talking about whether I *could* make an exact replica without RE. I say I can; but I neither want nor need to.
[22:00:18] <Coren_> It would be, literally, wasted effort.
[22:00:21] <yot> if I centralize all that stuff here
[22:01:14] <Coren_> Extracting *DATA* from the executable is not reverse engineering the program. It's just acknowledging the fact that at some point the programmer was to lazy to have a separate file for some of the data. :)
[22:01:14] <yot> you convinced me of your way to guess things
[22:01:37] <Coren_> There is nothing 'magical' about the file that has the extension .exe except that it contains part of the program.
[22:01:47] <Coren_> (And not even necessarly all of it)
[22:01:52] <yot> that it *would* be possible to create an 1:1 copy
[22:02:00] <yot> but
[22:02:03] <yot> it is not attractive
[22:02:08] <yot> well
[22:02:16] <yot> I can understand that point
[22:02:25] <yot> but I don't like it anyway
[22:02:29] <yot> cause
[22:02:45] <yot> if I play the game I concentrate on other things than you for example
[22:03:02] <yot> so I cannot know which have to be 'the same' and which can be just similar
[22:03:21] <yot> therefor I prefer creating a 1:1 copy or let's say about 95% equality
[22:03:24] <Coren_> You're telling me that when you played UU2, you spent your attention on how many pixels the screen has moved when you hit the 'forward' key for .7 seconds?
[22:03:41] <Eldron> O_o
[22:03:50] <yot> and that is only accomplishable with RE
[22:04:22] <yot> Coren_: for UU2? no, for QuakeWorld? Of course!
[22:05:01] <Coren_> yot: Yes, but you seem to miss my point. If I were to rewrite QW, my efforts would be centered on the things which are significant to THAT game.
[22:05:37] <yot> and there I see the problem
[22:05:49] <Coren_> yot: And, again, no RE would be needed; observation would however be centered more on the mechanics of movement than on the storyline and such. :)
[22:05:51] <yot> to you other things are significant than for me
[22:06:06] <yot> and to avoid trouble with this
[22:06:14] <yot> the easiest way is just to create a copy
[22:06:29] <yot> then nobody can deplore
[22:06:31] <Coren_> There is then no point in making the copy in the first place!
[22:06:56] <yot> ?
[22:07:09] <yot> you mean there is nood to create a copy?
[22:07:14] <yot> nood = no need
[22:08:11] <Coren_> Yes; either you will suceed in which case you have something that is exactly like the original and thus perfectly redundant, or it will have *some* difference which will make you, by your definition, fail.
[22:08:59] <yot> Coren_: I don't speak of 100% but of something like 95%
[22:09:11] <Coren_> I.e.: LoW exists because today's hardware allows a nicer graphical interface, and because the interfaces for first person games is now idiomatic and UW2's now seem idiosyncratic by comparison.
[22:09:17] <yot> and with guessing it's very hard to get above 80%
[22:09:33] <yot> Coren_: that's why I love the project
[22:09:41] <yot> but all I want to say is
[22:09:58] <yot> I want to give users the option to play the game like the original
[22:10:00] <yot> you're right
[22:10:05] <yot> 100% impossible
[22:10:09] <yot> 99,9% possible
[22:10:24] <Coren_> But why bother at all? Why then not just play the original itself?
[22:10:44] <yot> cause it does not work because it's a dos game? :>
[22:10:48] <Coren_> After all, nothing can be 'like the original' more than the original!
[22:11:07] <yot> Coren_: that's why I would never rewrite Quakeworld
[22:11:08] <Coren_> yot: Come, now. *I* can run all Ultimas and I don't even have a single dos or windows computer!
[22:11:12] <yot> Coren_: it works
[22:11:20] <yot> Coren_: Linux can
[22:11:24] <yot> Coren_: WindowsXP can't
[22:11:42] <Coren_> Then, obviously, WindowsXP has a bug that needs fixed, not the game. :)
[22:12:00] <yot> Coren_: Most dos games produce some trouble with the emulators
[22:12:25] <Coren_> Emulators shmemulators. Use a full blown VM if you have trouble with emulation.
[22:12:39] <yot> Coren_: most users you windows and that's why there are such programs
[22:12:49] <yot> Coren_: why do you think there are projects like scummvm?
[22:13:04] <yot> just for compabitility reasons
[22:13:06] <yot> that's all
[22:13:21] * Coren_ shrugs.
[22:13:35] <yot> what do you think they are for?
[22:13:38] <yot> :)
[22:13:45] <Coren_> Personally, I think that spending any effort to work around bugs in Windows is a big wastage of good brainpower.
[22:14:15] <yot> well
[22:14:19] <yot> I also do not understand
[22:14:21] <yot> if you say
[22:14:34] <yot> nothing is more original than the original
[22:14:40] <Coren_> I don't know. Exult isn't just about compatibility; U7 can be run on basically any computer without it. But it offers a number of amusing improvements that make playing the game with it a 'better' experience by today's standards.
[22:14:42] <yot> what it LoW and uwadv for?
[22:14:57] <yot> Coren_: true
[22:15:01] <yot> Coren_: but
[22:15:15] <yot> Coren_: you have to be attentive
[22:15:22] <Coren_> LoW is all about nicer graphics, nice music, a new interface.
[22:15:40] <yot> Coren_: that you do not change the gameplay with your 'improvements'
[22:16:20] <Coren_> yot: Yes, balancing artistic liscence and gameplay is something non-trivial. But I'm very good at such things. :)
[22:16:30] <yot> :P
[22:16:50] <yot> hehe
[22:17:00] <yot> perhaps I'm thinking a bit too complicated
[22:17:11] <yot> but I always think of something like
[22:17:26] <yot> how do you guess how exactly the AI of the monsters work?
[22:17:39] <yot> of course you can use todays standards
[22:17:44] <Coren_> Well, you *can* do with with very careful observation.
[22:17:46] <yot> and make the monsters more 'intelligent'
[22:17:53] <Coren_> But what would be the point?
[22:17:54] <yot> but doesn't this change the balance?
[22:18:28] <Coren_> It might; monster stats might need to be tweaked a bit to account for it so that the overall challenge remains the same.
[22:18:46] <Coren_> But, when you look at the game overall (which is the important part)...
[22:18:57] <yot> and there I see the trouble for !!! -> ME <- !!!
[22:19:17] <yot> tweak it that it's 'okay'
[22:19:21] <yot> if you can do it
[22:19:23] <yot> great
[22:19:31] <yot> but I'm not sure I could
[22:19:42] <yot> and therefor I 'steal' the code from the original
[22:19:48] <yot> that's why I prefer RE
[22:20:02] <Coren_> Well, for one, the fact that I have actual experience as a game designer does help. :)
[22:20:25] <Coren_> But the easiest way to 'tweak' everything is in fact very simple:
[22:20:38] <yot> ask the world
[22:20:39] <yot> haha
[22:20:40] <yot> :>
[22:20:41] <Coren_> Have people who played to original play the new version and compare notes. :)
[22:20:51] <yot> yeah
[22:20:53] <yot> but what
[22:20:59] <yot> if A says this is shit
[22:21:03] <yot> and B it's great
[22:21:14] <yot> and C I don't mind
[22:21:16] <yot> :)
[22:21:21] <wjp> then you add a config option :-)
[22:21:33] <Coren_> Indeed, I will have more 'difficulty' settings than the original, and a choice on wether to remove what little linearity there is.
[22:21:36] <wjp> but you can't make everybody happy anyway
[22:22:01] <yot> but with RE I can make the ones happy who are used to the original :>
[22:22:10] <yot> well you can do it as well
[22:22:16] <yot> but you'll have more trouble
[22:22:17] <yot> =)
[22:23:06] <Coren_> For instance, I *know* that the gem of Worlds does not have all facets enabled simply because original playtesters who prefer their hands held through the storyline got confused.
[22:23:34] <Coren_> There is *no* storyline dependencies on the order in which the worlds are visited (though you may die if you are too bold, or have to backtrack)
[22:25:03] <yot> my god what the hell did I do in my leisure time when there wasn't a computer ://
[22:25:09] <Coren_> Personally, having all facets avaliable from the start would have /increased/ my enjoyment of the game, at the cost of possibly finding myself wondering "what next, then?"
[22:26:18] <Coren_> I know that some players HATE having too much freedom. So, my game will have a switch when starting a new game between 'linear' and 'not-linear'. Though I've yet to think of a PC way of saying this. :)
[22:27:01] <-- wjp has left IRC (saberhagen.freenode.net irc.freenode.net)
[22:27:01] <-- Eldron has left IRC (saberhagen.freenode.net irc.freenode.net)
[22:27:18] --> wjp has joined #uwadv
[22:27:18] --> Eldron has joined #uwadv
[22:27:37] <yot> Coren_: giving options is great
[22:27:47] <yot> Coren_: that's what I plan for my Krondor project
[22:27:56] <yot> let the user decide
[22:28:04] <yot> (Software or OpenGL)
[22:28:10] <yot> (with or without the stack bug) etc
[22:29:08] <yot> (with or without broken crossbow bug)
[22:29:09] <yot> :>
[22:29:28] <yot> I also thought about skill levels
[22:29:37] <yot> for example
[22:29:50] <yot> you can't see anymore how much damage you gave
[22:29:58] <yot> or took
[22:32:13] <vividos> Coren: do you know how portraits are matched to the conversation used?
[22:34:02] <Coren_> Yes; it's one of the bytes in the 'extra' data for mobiles in the level object list. I'll look it up.
[22:34:48] <Coren_> yot: You are planning to allow BUGS by design?
[22:36:47] <Coren_> vividos: For UW2 anyways; there is also the switch_pic() global that can affect this.
[22:38:11] <vividos> I know
[22:38:21] <vividos> do you have all extra bytes documented?
[22:38:41] <Coren_> No; I have understood only 6-7 of them or so.
[22:38:55] <vividos> ok
[22:39:02] <Coren_> Lemme see what I have right now
[22:39:05] <vividos> it would be good to share knowledge here :)
[22:39:44] <Coren_> Yes.
[22:40:04] <vividos> bytes 000e and 000f are npc_?home coordinates, I guessed
[22:40:05] <Coren_> I never wrote any of this down yet, knowledge is spread accross levdump and munge.
[22:40:19] <vividos> 0012 is npc_whoami
[22:40:24] <vividos> that's all I have
[22:40:37] <Coren_> Ok, lemme pull up the right files
[22:42:05] <Coren_> Yes; e and f are home, 12 is the the identity/conversation - 0x3f
[22:42:37] <Coren_> Ah, found the right bit of code.
[22:43:21] <vividos> good :)
[22:44:46] <Coren_> Erg. I haven't messed with this code in a bit. :-)
[22:45:24] <Coren_> Ah; the 'mood' is the upper two bits of byte 06
[22:45:42] <Coren_> I.e.: friendly .. peaceful .. upset .. hostile
[22:45:57] <vividos> ok
[22:46:30] <Coren_> Which makes me guess that the other six bits are also flags of somesort.
[22:47:30] <vividos> why is field 0012 subtracted by 0x3f? the value in it exactly matches the conversation to use, at least in uw1
[22:48:12] <Coren_> Ah; not in UW2-- there is an offset
[22:48:24] <vividos> ok
[22:48:50] <Coren_> Maybe because of my a_hack traps which use a different offset.
[22:48:57] * Coren_ makes a note to look into that.
[22:50:20] <Coren_> Ah, yes, 0x11 I am not sure of the significance but is always non-zero ONLY for the first monster on every level.
[22:51:17] <Coren_> Grrr. I had found 'current hp' but since I haven't *used* that yet I forgot where it was!
[22:52:09] <vividos> hmm, could only be the 0000 byte
[22:52:38] * Coren_ checks Jerry the Rat
[22:52:40] <vividos> bragit has 2b here, tyball 78, and a ghoul 3c
[22:52:44] <Coren_> Yep. 0;
[22:52:51] <Coren_> Jerry has FF
[22:53:01] <Coren_> 0 = current hp then
[22:53:19] <Coren_> Is Jerry in UW1?
[22:53:35] <vividos> I guess ff means unlimited hp
[22:53:40] <vividos> jerry the mouse? no
[22:53:50] <Coren_> Jerry the Rat. Not Sherry the mouse. :)
[22:54:08] <Coren_> Jerry is the cheat NPC that will max out stats when talked to. :)
[22:54:17] <Coren_> Rude fellow though. :)
[22:54:35] <wjp> cheat npc?
[22:54:39] <vividos> no, isn't in uw1
[22:54:43] * yot slaps Coren_ around a bit with a large trout
[22:54:53] <yot> [23:34:32] <Coren_> yot: You are planning to allow BUGS by design? <- :P
[22:55:20] <yot> I was talking about bugs which are in the original game =)
[22:55:26] <vividos> slasher of veils has hp = a4 :)
[22:55:57] <vividos> only on the ethereal plane. in level 8 he has hp = fa
[22:57:25] <Coren_> I'm Jerry the Rat. What the fuck do you want?
[22:57:25] <vividos> any more flags/bytes in the mobiles data?
[22:57:25] <Coren_> 1 - Uh, never mind.
[22:57:25] <Coren_> 2 - Please Spew Wildly.
[22:57:26] <Coren_> 3 - Charming feller, aren't ye?
[22:57:31] <vividos> 3
[22:57:47] <Coren_> Wanna go up some levels?
[22:57:47] <Coren_> 1 - Sure.
[22:57:48] <Coren_> 2 - I say thee nay.
[22:57:51] <vividos> 1
[22:58:02] <Coren_> Presto.
[22:58:05] <Coren_> Oh, yeah, take this spooge oil. You'll need it.
[22:58:11] <Coren_> (end of conversation)
[22:58:14] <vividos> :)
[22:58:20] <vividos> nice fellow :)
[22:58:30] <vividos> found out the npc_talkedto flag?
[22:58:44] <Coren_> There is such a flag?
[22:58:56] <vividos> at least in the conversations
[22:59:11] <Coren_> In UW2 the conversation per-charater global area holds this
[22:59:36] <vividos> some conv's store it there, too
[23:02:04] <Coren_> Well, I haven't *noticed* a conversation not storing that in the global area; doesn't mean there isn't.
[23:02:39] <Coren_> One thing I need to do is save a game with NPCs having moved; having been talked to; etc and study the saved level data.
[23:04:51] <vividos> I'm trying around, too
[23:05:03] <Coren_> yot: I know for a fact that the well-known bugs of UW2 will be squished with prejudice in LoW. :-) No using broken potions for LoW. :)
[23:05:47] <yot> hehe
[23:06:19] <Coren_> A broken potion of healing just *spolis* the whole game. :)
[23:07:00] <Coren_> Hmmm.
[23:09:49] <Coren_> 03 seems to be 'level'
[23:10:05] <Coren_> No
[23:10:47] <Coren_> Ah, no 03 are flags. 10=uses magic 08=can fight physically?
[23:11:18] <vividos> hmm, don't think bragit "uses magic" :)
[23:11:35] * Coren_ nods. I found flaws here to.
[23:11:56] <Coren_> But I have almost only sets of 10, 08 and 04 in that byte. Definitely marked as 'flags'
[23:14:31] --> QQtis has joined #uwadv
[23:14:31] --- ChanServ gives channel operator status to QQtis
[23:16:41] <vividos> hi QQtis!
[23:17:55] <vividos> hmm, after talking to an npc, 0006 changed from 80 to f0
[23:18:13] <vividos> 000c changes from 86 to 84, too
[23:18:56] <Coren_> vividos: That would mean the NPC changed from 'peacful' to 'friendly'
[23:19:05] <Coren_> Did this indeed occur?
[23:20:08] <Coren_> 06 might be some continuum of 'annoyance' from maximally friendly (FF) to most hostile (00); the two most significant bits agree with that.
[23:20:34] <vividos> well, the script could set some flags
[23:21:24] <Coren_> Yes; but from what I see set_attitude() takes a numerical value; that might be it right there
[23:22:14] <Coren_> Did the NPC you talked to go from peaceful to friendly after talking?
[23:22:21] <vividos> yes
[23:22:39] <vividos> I'll check what functions are called and what npc_ globals are set
[23:22:42] <Coren_> Ok, so either the two MSB of byte 06 are the attitude, or the whole byte is.
[23:23:20] <vividos> ah, storing npc_attitude = 3
[23:23:58] <Coren_> That'd mean C0, not F0.
[23:24:30] <vividos> maybe the MSB means something other
[23:24:46] <wjp> time for me to go
[23:24:49] <wjp> g'night
[23:24:51] <vividos> bye wjp
[23:24:55] <Coren_> No, the bits 6 and 7 are /definitely/ hostile .. friendly
[23:25:04] <-- wjp has left IRC ("Zzzz...")
[23:25:14] <Coren_> You went from (10) peacful to (11) friendly, that works.
[23:25:40] <Coren_> And, unsurprisingly, (11) = 3
[23:26:05] <vividos> then bit 5 could be npc_talkedto
[23:26:15] <Coren_> Or bit 4
[23:26:28] <Coren_> Both 5 and 4 got set by the conversation it seems.
[23:26:42] <vividos> I just post the data bytes from 4 saves, 2 before and 2 after talking
[23:27:41] <vividos> before1 - 2b 3a 02 18 00 c0 80 d1 01 00 00 00 86 60 50 54 00 00 43
[23:27:41] <vividos> before2 - 2b 3a 0e 18 10 c0 80 d1 01 00 00 00 86 60 50 54 00 00 43
[23:27:41] <vividos> after1 - 2b fa 06 18 00 c0 f0 d1 01 00 00 00 84 2c 50 54 1a 00 43
[23:27:41] <vividos> after2 - 2b 20 0e 18 10 c0 f0 d1 01 00 00 04 84 2c 50 54 00 00 43
[23:28:03] <Coren_> I don't get it-- There should be a 'current' mana byte; but I see nothing that matches. Unless some non-spellcasters also have mana.
[23:28:17] <-- QQtis has left IRC (K-lined)
[23:28:38] <vividos> they probably have; even the "things" on the ethereal plane have hit points
[23:29:19] <Coren_> Erp. Gotta go for a bit. Feel free to keep talking, I'll catch up when I return
[23:30:19] <vividos> ok, 'till then
[23:31:21] <vividos> hmm, here's after not talking, but attacking:
[23:31:37] <vividos> attack1 - 2b 8f 0e 18 30 c0 f0 d1 01 00 01 00 86 60 50 54 00 00 43
[23:32:17] <vividos> "before1/2" was mellow, "after1/2" was friendly
[23:36:39] <vividos> ok, another one, this time bragit isn't friendly after talking:
[23:37:03] <vividos> upset1 - 2b 3e 06 18 00 c0 b0 d1 01 00 00 04 84 2c 50 54 00 00 43
[23:37:56] <vividos> npc_attitude is set to 2 this time
[23:44:07] <vividos> and another one:
[23:44:12] <vividos> upset2 - 2b 00 0c 18 10 c0 70 d1 01 00 00 00 84 2c 50 54 00 00 43
[23:44:20] <vividos> this time his mood is "upset"
[23:45:20] <vividos> I think the guess is right that bits 6-7 are the "mood" bits and either bit 4 or 5 are some npc_talkedto bits
[23:45:42] <Eldron> sometimes things are beyond what I understand... O_o
[23:48:04] <vividos> hell, bragit's mood changes with every line I say ...
[23:48:27] <vividos> Eldron: never mind, it's all about the inner workings of ultima underworld 1 :)
[23:48:49] <Eldron> that I kinda figured out..
[23:49:09] <Eldron> and that its about conversations.. but all those numbers confuse me..
[23:49:29] <Eldron> But, i should not look at them.. :)
[23:49:32] <vividos> these are the bytes the NPC's have as their extra infos
[23:50:27] <Eldron> anyway, time to sleep now..
[23:50:31] <Eldron> goodnight
[23:50:37] --- Eldron is now known as Eldron_zz
[23:50:45] <Eldron_zz> examweek.. gah..
[23:50:54] <vividos> 'night Eldron! good luck!
[23:53:12] <vividos> should go, too. 'night!
[23:53:14] <-- vividos has left IRC ("Leaving")