Server Help

Trash Talk - Asm

Cyan~Fire - Tue Mar 22, 2005 5:03 pm
Post subject: Asm
Trying to read the ASM Ekted posted here. And I'll have a few questions which I'll post them here.

First: I see xor with the same register as both operands a lot. My best guess is that this is some more efficient way of doing mov eax,0. Am I right?
Bak - Tue Mar 22, 2005 5:09 pm
Post subject:
It's not faster, just a different way of doing it.
Cyan~Fire - Tue Mar 22, 2005 5:32 pm
Post subject:
Then why do it? It's a little easier to read the other way...
Dr Brain - Tue Mar 22, 2005 5:35 pm
Post subject:
Job security icon_smile.gif
Mr Ekted - Tue Mar 22, 2005 5:55 pm
Post subject:
On the Pentium, MOV EAX, 0 and XOR EAX,EAX are 0.5 clocks latency and 0.5 clocks throughput. However, the former is 6 bytes long, and the latter is 2. Job security.
Cyan~Fire - Tue Mar 22, 2005 6:58 pm
Post subject:
Ok, thanks. icon_smile.gif

Second:
Code: Show/Hide
:0041BEF9 8D0480            lea eax, dword[eax+4*eax]
:0041BEFC 8D0480            lea eax, dword[eax+4*eax]

WTF? I realize this is probably some ASM newbie "Hah! He doesn't recognize that!" thing... but WTF?
Bak - Tue Mar 22, 2005 7:06 pm
Post subject:
lea = load effective address

put an address somewhere... not the memory itself... you can do math using leal, as it is doing in this case

Quote:
lea eax, dword[eax+4*eax]


this look like it does the equivalent of:

eax = eax + 4 * eax

or eax = eax * 5


the reason they do 4 instead of just 5... or imul is that leal can only work with 1, 2, 4, or 8... lea is faster than imul

looks like the end result of

Code: Show/Hide
lea eax, dword[eax+4*eax]
lea eax, dword[eax+4*eax]


is

eax = 25 * eax

----------

Ekted, what do you use to generate assembly?
Cyan~Fire - Tue Mar 22, 2005 7:18 pm
Post subject:
So you're saying it's basically just the equivalent of imul 25?
Mr Ekted - Tue Mar 22, 2005 7:23 pm
Post subject:
Ya you can do all sorts of multiplies using chains of LEA ops. The throughput of MUL is 5 cycles since it must function on arbitrary data. The throughput of LEA is 0.5 cycles since it works in very constrained ways.
CypherJF - Tue Mar 22, 2005 8:00 pm
Post subject:
ya okay i feel dumb biggrin.gif lol... i haven't learned ASM :/
Cyan~Fire - Tue Mar 22, 2005 8:37 pm
Post subject:
OK, thanks again to both of you.

Third: Now I have a questions about random numbers in SS. I remember reading somewhere that the key for the keystream is always negative. Now looking at catid's SS_HEAVY_PRNG (which, he says, is used to generate the keystream), the seed is stored unsigned. How does this work?

Fourth:
Code: Show/Hide
:0041BEEF 99                cdq   
:0041BEF0 F7F9              idiv ecx     ; }
:0041BEF2 8BC2              mov eax, edx ; } modulus

What is that cdq doing there? I read that cdq will extend the sign bit of eax through edx but edx is clobbered by the idiv right after, so nothing is really done....... right?

Oh, and cyph, why you really should feel dumb is because you tried to derail my precious!
Mr Ekted - Tue Mar 22, 2005 10:05 pm
Post subject:
IDIV uses the 2 registers EDX:EAX as the source.
Cyan~Fire - Tue Mar 22, 2005 10:19 pm
Post subject:
Oh, haha, didn't see that in the docs. Maybe it would help if I had 32-bit docs instead of 16-bit ones. Does anybody have a good opcode list for 32-bit ASM?
Mr Ekted - Tue Mar 22, 2005 10:21 pm
Post subject:
http://developer.intel.com/design/Pentium4/documentation.htm

Search for "Manuals".
Cyan~Fire - Wed Mar 23, 2005 2:11 pm
Post subject:
Jeez, P4 has way too many opcodes. icon_eek.gif But, uhhh, thanks.

OK, fifth, about the prng:
Code: Show/Hide
:0041BF34 3BCD              cmp ecx, ebp
:0041BF36 8BF1              mov esi, ecx
:0041BF38 7F06              jg 0041BF40
:0041BF3A 8DB1FFFFFF7F      lea esi, dword[ecx+7FFFFFFF]

The transformation of the seed occurs in ecx before it's finally stored in esi.
Here's catid's code:
Code: Show/Hide
if (s > 0x7fffffff) s += 0x7fffffff;

How does that ASM translate to that C?
Bak - Wed Mar 23, 2005 2:40 pm
Post subject:
Code: Show/Hide
:0041BF34 3BCD              cmp ecx, ebp
:0041BF36 8BF1              mov esi, ecx
:0041BF38 7F06              jg 0041BF40
:0041BF3A 8DB1FFFFFF7F      lea esi, dword[ecx+7FFFFFFF]



if (ebp > ecx)
{
esi = ecx
goto 0041BF40
}
else
{
ecx = esi
esi = ecx + 0x7FFFFFFF
}


my order might be wrong cause I know gdb's assembly order is different from microsoft's.

ekted, what program do you use to produce assembly
Cyan~Fire - Wed Mar 23, 2005 3:02 pm
Post subject:
Looking further up in the code, it seems ebp is set to zero. So, I've basically figured this out:
Code: Show/Hide
   /*
   cmp ecx, ebp
   mov esi, ecx
   jg 0041BF40
   lea esi, dword[ecx+7FFFFFFF]
   */
   seed = nseed;
   if (nseed <= 0)
      seed += 0x7FFFFFFF;


But one small question remains. 0x7FFFFFFF is the highest possible positive dword, so catid's code adds that number to the seed if it's less than 0 but it seems it's really if the seed's less than or equal to 0. Anybody see where I'm going wrong? icon_razz.gif
Mr Ekted - Wed Mar 23, 2005 3:41 pm
Post subject:
Powerbot's implementation uses <= 0.
Cyan~Fire - Wed Mar 23, 2005 4:42 pm
Post subject:
Oh, alright, cool. I'll talk to Catid about that sometime.

Sixth:
Code: Show/Hide
//   :0041BF40
   a = seed;
   /*
   cdq
   xor eax, edx
   sub eax, edx
   and eax, 00000003
   xor eax, edx
   */
   d = (a < 0) ? 0xFFFFFFFF : 0;   //cdq
   a ^= d;
   a -= d;
   a &= 1;
   a ^= d;
   /*
   mov ebx,eax
   ...
   sub ebx,edx
   neg ebx
   ...
   sbb ebx,ebx
   */
   b = (a - d == 0) ? -1 : 0;
   b &= 17;   //get 000X000X

Now edx is either -1 or 0, depending on whether eax is negative. But now in the above PRNG code, the seed was always return positive. Am I missing something? Is most of the above code actually useless?
Mr Ekted - Wed Mar 23, 2005 8:09 pm
Post subject:
The C code is trying to mimic what the ASM is doing line-for-line. I believe this RNG (from VIE) is only good for 31 bits, so the output is modified so the upper bit is always 0. This is a translation I made of it, but do not use:

Code: Show/Hide
DWORD ssRNG (DWORD seed)
{
DWORD s;

s = (DWORD)(((__int64)seed * 0x834E0B5F) >> 48);
s += s >> 31;
s = ((seed % 0x1F31D) * 16807) - (s * 2836) + 123;

if (!s || s > 0x7fffffff)  // (LONG)s <= 0
   s += 0x7fffffff;

return (s);
}

Cyan~Fire - Wed Mar 23, 2005 8:48 pm
Post subject:
Well this is what I had (and still have):
Code: Show/Hide
inline int SS_prng(int seed)
{
   int nseed, temp;

   /*
   mov eax, esi   ; esi = seed
   mov ecx, 0001F31D
   cdq
   idiv ecx      ; }
   mov eax, edx   ; } modulus
   shl eax, 03
   sub eax, edx
   lea eax, dword[eax+4*eax]
   lea eax, dword[eax+4*eax]
   shl eax, 04
   add eax, edx
   lea eax, dword[eax+2*eax]
   lea ecx, dword[edx+2*eax]
   */
   nseed = (seed % DIV_C) * 16807;

   /*
   mov eax, 834E0B5F
   imul esi
   add edx, esi
   sar edx, 10
   mov eax, edx
   shr eax, 1F
   add edx, eax
   lea eax, dword[edx+8*edx]
   shl eax, 03
   sub eax, edx
   lea eax, dword[eax+4*eax]
   shl eax, 1
   sub eax, edx
   shl eax, 02
   sub ecx, eax
   */
   temp = IMULHIDWORD(MULT_C, seed) + seed;
   temp = (temp >> 16) + (temp >> 31);   //aka the sign bit

   nseed -= (temp * 2836);

   nseed += 123;

   /*
   cmp ecx, ebp   ;above, ebp = 0
   mov esi, ecx
   jg 0041BF40
   lea esi, dword[ecx+7FFFFFFF]
   */
   seed = nseed;
   if (nseed <= 0)
      seed += 0x7FFFFFFF;

   return seed;
}


Looks basically the same, except uses asm's imul instead of __int64. But that's actually kinda irrelevant.

What I was trying to ask is that if the left-most bit is always 0, then the return is always positive, right? Thus, cdq'ing the seed and then xor'ing it by edx is never going to modify it. edx will always be 0. Am I right? I'm trying to make something to test it right now...
Cyan~Fire - Wed Mar 23, 2005 8:58 pm
Post subject:
Here's my test prog, using the same SS_prng func I pasted earlier. Only output was "Done.".
Mr Ekted - Wed Mar 23, 2005 9:26 pm
Post subject:
Using signed type for seed instead of unsigned can affect the results of operations. Are you sure it matches the output of the origional ASM for a large number of different seeds??
Cyan~Fire - Wed Mar 23, 2005 9:49 pm
Post subject:
This didn't show anything wrong. I couldn't use the original ASM because MSVC++ didn't like it.
Cyan~Fire - Thu Mar 24, 2005 2:39 pm
Post subject:
Code: Show/Hide
:0041C2AF 64890D00000000    mov dword fs:[00000000], ecx

OK, can anybody explain what that means?
Mr Ekted - Thu Mar 24, 2005 3:12 pm
Post subject:
Windows uses the FS segment register for exception handling. When most excpetions occur, it triggers a special set of events and lands in the kernel. Windows then will invoke the application's exception handler stored at FS:[0]. The above instruction is commonly created when using the C++ keyword "try".

http://www.jorgon.freeserve.co.uk/ExceptFrame.htm
Smong - Thu Mar 24, 2005 7:14 pm
Post subject:
Code: Show/Hide
   /* 0041C256 to 0041C25A */
   if (newseed <= 0)
       newseed = newseed + 0x7fffffff;
So the range is 0xffffffff to 0x7fffffff?

Suppose newseed = 0x8000,0000, then it will change to 0xffff,ffff which is -1, still negative, correct?
Bak - Thu Mar 24, 2005 7:49 pm
Post subject:
Quote:
0xffffffff to 0x7fffffff


that looks like -1 to the highest integer possible... so -1 or higher
Cyan~Fire - Fri Mar 25, 2005 7:38 pm
Post subject:
Eighth:
Code: Show/Hide
   mov         edi,[000467E20]
   mov         eax,[edi][00004]
   mov         edx,[edi][0000C]
   mov         ecx,[eax][00018]


Smong got this ASM with a different disassembler, it's at the very beginning of the func. (Ekted, you only gave us the strictly doors bit, I think?) The 00004 and whatever is addition, but Smong and I can't figure out whether it's offsetting a pointer or just doing math. The value of 0x00467E20 *cough cough* just might be *cough cough* 50 2D CC 00 at, ummm, some point when connected to some zone. Now that doesn't look like a pointer to me, so I think it's math, but Smong and I weren't so sure you could do math like that.

Also, is edi a 16-bit register? I wouldn't think so, but if it is math, 0x2D50 is a much prettier number than 0x00CC2D50.
Mr Ekted - Fri Mar 25, 2005 8:00 pm
Post subject:
MOV EAX, [EDI+4]

is like doing this in C:

int *edi;
int eax;

eax = edi[1];

All "E" registers are 32-bit.
Cyan~Fire - Fri Mar 25, 2005 8:52 pm
Post subject:
OK, I thought all e registers were 32-bit, thanks.

But this still doesn't make much sense. 1 more line of code:
Code: Show/Hide
   mov         edi,[000467E20]
   mov         eax,[edi][00004]
   mov         edx,[edi][0000C]
   mov         ecx,[eax][00018]
   xor         ecx,edx

edi is an array of some sort, we know that. But now is it a ptr array or an integer array? eax is set to edi[1], and then indexed again? But then edx (edi[3]) is used as the source of xor? I'm quite confused.

Also, most of the pointers are 0x0046XXXX, but this one is 0x00CCXXXX. Is there something special here which I don't know?
Mr Ekted - Fri Mar 25, 2005 11:39 pm
Post subject:
My post was just an example. EDI could point to a structure.
Cyan~Fire - Sat Mar 26, 2005 12:48 am
Post subject:
OK, I was kinda thinking that myself.

However, is there some kind of limit to the size of a structure before it starts referencing members directly instead of through the first-member pointer? I ask this because all the arena settings have been referenced directly so far.

Unless VIE didn't put the settings in a structure. icon_confused.gif
Cyan~Fire - Mon Mar 28, 2005 9:16 pm
Post subject:
No reply? icon_cry.gif

Code: Show/Hide
   /*
   mov         eax,[edi][00004]
   mov         edx,[edi][0000C]
   mov         ecx,[eax][00018]
   mov         eax,010624DD3
   xor         ecx,edx
   movsx       edx,w,[00047DD34]
   imul        ecx,edx
   imul        ecx
   sar         edx,006
   mov         eax,edx
   shr         eax,01F
   add         edx,eax
   */
   ecx = global5.offset1[6] ^ global5.offset3;   //num players?!
   edx = settings.PrizeFactor / 1000 * ecx;
   edx += (edx >> 31);

It would seem like global5.offset1[6] ^ global5.offset3 is the number of players, since it's used as a multiplier for PrizeFactor. But WTF? Is there something I'm missing here?? Of course, the offset1[6] could be another struct, but the xor is still rather odd. And anybody have a clue why it's adding one if it's negative? I don't see how it even could be negative.

Code: Show/Hide
   /*
   mov         eax,000000400
   sub         eax,ecx
   cdq
   sub         eax,edx
   */
   eax = 1024 - ecx;
   eax -= (eax < 0) ? -1 : 0;

That also seems kinda weird. Is that some familiar operation in C++ which I'm not translating properly?
Mr Ekted - Mon Mar 28, 2005 9:38 pm
Post subject:
Anything in the data space (public/static data) is at a fixed location and will be referenced by fixed address, even elements of structures, unless it is passed around by address. Anything on the stack (local data) or the heap (allocated data) will be reference by pointer, since it's addres is unknown at compile- and/or load-time.
Cyan~Fire - Tue Aug 09, 2005 8:43 pm
Post subject:
Heh. You know, I never saw that reply, Ekted. Thanks anyway. icon_razz.gif

Anyway, I have a question from MERV. Does anyone see a difference between this
Code: Show/Hide
   // calculate timestamp (straight from subspace)
   Uint32 loword = getShort(msg, 2);
   Uint32 timestamp = h->getHostTime() & 0x7FFFFFFF;

   if ((timestamp & 0x0000FFFF) >= loword)
   {
      timestamp &= 0xFFFF0000;
   }
   else
   {
      timestamp &= 0xFFFF0000;
      timestamp -= 0x00010000;
   }

   timestamp |= loword;   // fill in the low word

and this
Code: Show/Hide
   Uint32 timestamp = (Uint32)h->getHostTime();

   if (LOWORD(timestamp) < pkt->timestamp)
      timestamp -= 0x00010000;

   timestamp = HIWORD(timestamp) | (Uint32)pkt->timestamp;

other than the obvious getShort() vs. pkt->?

(I like the message, MGB.)
Mr Ekted - Tue Aug 09, 2005 11:36 pm
Post subject:
Oh oh. This is an old can of worms.
1stStrike - Tue Aug 09, 2005 11:39 pm
Post subject:
Oh god, make it stop. Programming is the devil.
Agurus - Wed Aug 10, 2005 9:29 am
Post subject:
lol
xor eax - Wed Aug 10, 2005 9:57 am
Post subject:
Hey 1stStrike! Nice to see you ;)

I want to clarify some things.

First of all, Cyan, the asm code you’re talking about it’s not Catid’s code. It is the code I gave to him after extracting it from subspace v1.34, subgame and subbill.

Catid wanted to write bots (he was 15 years old) but he knew little programming. He was learning VB while trying to figure out how to get SS critical routines such as encryption. I did put all the critical code in a dll for him. It took me 2 months of very intensive working. While I was hacking subspace he was working on SS protocol.
My dll was working with VB strings, it dissapointed him when he wanted to translate the whole project to C. I told him I could have write a C version of the dll but he decided to translate the asm code to C. He was learning C very fast and a few time after that he ditched me. He wanted it to be HIS code so he had to translate it to some other lang. I would have embbed asm into C but oh well… that’s another story. I have read in Merv’s page that Cyan fixed a tiny encryption problem. I think it couldn’t have happened using the original asm code that I supplied.

My alias wasn’t xor eax, I used to be Coconut emulator at that time.

As for the “mov eax,0” versus “xor eax, eax” I have to say that both operations takes same time on pentium but they didn’t on lower x86 machines, that’s why old school programmers will always use xor.

Most of the rest of the things that you mention would have never been an issue embbebeding “my” original asm into C.
Gravitron - Wed Aug 10, 2005 10:02 am
Post subject:
Catid gone weird.
He started hanging with two nutjobs, it changed him.
Or maybe he was changed when he met them.

Eitherway, he's not the same catid I remembered and he's hanging in "bad" company.
Smong - Wed Aug 10, 2005 1:16 pm
Post subject:
There is a long thread and even a document by catid on the position packet timestamp at SFN. Which bits of it are you unsure of?
http://www.ssforum.net/c/index.php?showtopic=2848&hl=
Gravitron - Wed Aug 10, 2005 2:34 pm
Post subject:
Quite the interesting reading.

Notice catid's use of smilies in the beginning of some of his posts and Ekted's trashtalk stab with the chewbaka defence, he's obviously been worn out and fortified in his position and not willing to defend/explain it any further.

Now there comes Excel with what seems to be the hammer drop down...*resumes reading*
Well, was a good laugh, but if this guy works for Microsoft as his title represents, it is no wonder why windows code fails so miserably.
Dear Excel, next time, please post something useful such as a professional coder's POV on the issue (yes, I know Excel doesn't read this and this whole thread is a year old, but I can't help being a sinical sarcastic SOB).

Well, Ekted said one thing which I agree is right, coding style isn't worth arguing over (unless it's a specific style which hampers efficiency/eating resources unncessarily).

Note to self : learn assembly already.
Seriously, even Juan knows x86 assembly, and he's a god damned fucking awesome artist!

Juan Skills wrote:

Basic, C/C++, Java, JavaScript, Maxscript, Perl, PHP, SQL, 6502 8086 8088, DOS, UNIX.

The fucking kind of an artist is this guy? Picaso Gates?

also wrote:
Adobe After Effects, Adobe Photoshop, Autdodesk Animator Pro, Autodesk Animator Studio, Autodesk 3D Studio, Autodesk 3D Studio Max, Alias Power Animator, Alias|Wavefront Maya, Debabilizer Pro, Deluxe Paint, Deluxe Animate


I <3 Juan cuz he's Rad n owns j00
Mr Ekted - Wed Aug 10, 2005 3:48 pm
Post subject:
xor eax wrote:
As for the “mov eax,0” versus “xor eax, eax” I have to say that both operations takes same time on pentium but they didn’t on lower x86 machines, that’s why old school programmers will always use xor.


Also: "mov eax,0" takes something like 6 bytes to encode, whereas "xor eax,eax" takes 2.
xor eax - Wed Aug 10, 2005 4:16 pm
Post subject:
Mr Ekted wrote:
[..]
Also: "mov eax,0" takes something like 6 bytes to encode, whereas "xor eax,eax" takes 2.


True
Cyan~Fire - Wed Aug 10, 2005 10:49 pm
Post subject:
xor eax wrote:
My alias wasn’t xor eax, I used to be Coconut emulator at that time.

Ahhh, sweet. I knew it was Coconut Emulator's code, but now I know it's yours. I never said it was catid's anyway, only that it was from MERV. icon_biggrin.gif I'm amazed that you're still around... I thought you had disappeared into the SS Hall of Fame never to return.

xor eax wrote:
I have read in Merv’s page that Cyan fixed a tiny encryption problem. I think it couldn’t have happened using the original asm code that I supplied.

I think you're right, but hey, give catid a break, transferring that code to C is hard. icon_sad.gif

Ekted wrote:
Oh oh. This is an old can of worms.

Heh, maybe it is, but all I'm trying to do is make this some real C and not C that was obviously ASM at some point. So do you see any functionality difference between the original and my version?

I read the first few posts in that SSF topic, and I assume that you, Ekted, meant that the 2nd case isn't handled. I realize it still isn't, but when would that actually happen? Some timer sync problem? And, if I was to correct it, I'd have to implement some kind of tolerance (since a simple less than comparison would be stupid). What would you suggest?
Mr Ekted - Wed Aug 10, 2005 11:12 pm
Post subject:
Don't try to make the code have a normal and a special case. Assume any sync delta is valid, and compute the result. Then you can decide what to DO with that result after. Also, don't just let the extreme cases fall through the cracks "cuz they don't matter".
Cyan~Fire - Thu Aug 11, 2005 3:57 pm
Post subject:
Heh. I guess I was opening up a can of worms here, a simple question has evolved into huge amounts of writing.

I don't really care about the cases right now, all I'm trying to do is modify the mervbot code to use this isntead of its rather stupid current getShort() get Long() getCrap() functions. Maybe I'll worry about fixing possible bugs later.

Anyway, I'm just going to assume that that code will work alright, I guess any error will show up soon enough when I test this.

Edit: Ahhhhh, overpunctuation!
Mr Ekted - Thu Aug 11, 2005 4:20 pm
Post subject:
I'm pretty sure all the getShort() get Long() getCrap() stuff was just a carry-over from the original VB code. That's definitely not the way to do it in C.
Cyan~Fire - Thu Aug 11, 2005 9:02 pm
Post subject:
Indeed, but catid's too lazy (aka busy) to fix it these days. I'm also going to try to split off part of class Host (for anyone who knows anything about MERV) into a somewhat self-contained SS protocol wrapper thing that'll theoretically black-box the core protocol.

And yes, I just did use the evil word "wrapper".

And after that, receives go in a separate thread. And maybe a bit of a plugin system modification, but I don't want to touch that backwards-compatability mess just yet.

And why I am doing this? Who knows.
Mr Ekted - Thu Aug 11, 2005 9:51 pm
Post subject:
Wrappers are fine. In fact, that's one of the only things I really like about C++: you can excapsulate functionality. This forces you to make interfaces between functionally different sections of your app (ie objects). And by doing so, your objects become more re-usable, although I have never re-used an object ever.
Bak - Thu Aug 11, 2005 11:05 pm
Post subject:
container classes are fun and reusable. In C you just reuse the same structs, seems a bit silly.
xor eax - Fri Aug 12, 2005 12:14 am
Post subject:
Cyan~Fire wrote:
I thought you had disappeared into the SS Hall of Fame never to return.
LOL I think that Hall of Fame is for Priit, Ekted, MGB, Catid, etc.
The only thing I've done in SS is helping Catid with his biller and bots, and a stupid VB editor for settings that I've made recently.


Mr Ekted wrote:
I'm pretty sure all the getShort() get Long() getCrap() stuff was just a carry-over from the original VB code.
Yes, be sure all the GetCrap() comes from VB.
Mr Ekted - Fri Aug 12, 2005 12:38 am
Post subject:
xor eax wrote:
Yes, be sure all the GetCrap() comes from VB.


Haha! icon_lol.gif
Cyan~Fire - Fri Aug 12, 2005 3:39 pm
Post subject:
Coconut, when I was going through the SS ASM with Smong, I was thinking about what you did all along. You're famous. icon_wink.gif
Mr Ekted - Fri Aug 12, 2005 4:53 pm
Post subject:
It's a pain in the ass, but fun and challenging at the same time. I still remember the weekend I spent cracking the mysteries of the SS encryption and security packet and response, and the thrill of the first successful bot login.
Gravitron - Fri Aug 12, 2005 7:01 pm
Post subject:
Work for me Ekted, join the dark side.


...You know you want to.
xor eax - Fri Aug 12, 2005 8:00 pm
Post subject:
I agree with Ekted, except that it took me more than a weekend. It is exicting when you finally crack the dammned thing, you feel as in the top of the Everest. You only see “shr”, “pop” and other funny words but oh well :p After some time of relax in a mental hospital you’re ready to crack again :p

LOL Grav, I see some things never change in SS...
D1st0rt - Sat Aug 13, 2005 5:53 pm
Post subject:
MERVBot46a.rar (not listed) apparently has support for mixed-mode (.NET) plugins
1stStrike - Sat Aug 13, 2005 6:18 pm
Post subject:
battle field 2 is running the .net version of merv.
CypherJF - Sat Aug 13, 2005 8:04 pm
Post subject:
Ew .NET
CypherJF - Sun Aug 14, 2005 4:47 pm
Post subject:
This topic has gone way off course.
Mine GO BOOM - Sun Aug 14, 2005 4:49 pm
Post subject:
CypherJF wrote:
This topic has gone way off course.

Split topic of xor eax's new bot core to a new thread: OCX bot core
xor eax - Mon Aug 15, 2005 1:27 pm
Post subject:
Opss... sorry. When I heard Cyan talking about "black box the core protocol" I just started talking about my own stuff
Cyan~Fire - Mon Aug 15, 2005 4:16 pm
Post subject:
Hehe, but remember my "black box" is open source. icon_razz.gif
All times are -5 GMT
View topic
Powered by phpBB 2.0 .0.11 © 2001 phpBB Group