Super Turbo HUD

2456

Comments

  • PaskyPasky Ninja with pistol! Joined: Posts: 1,863
    I think there's kind of a point where damage is damage and you can just eyeball it and intuitively base your gameplan from there. You don't need to know the absolute exact damage range of your attacks. You can catalogue it if you want but it isn't going to help anyone. Finding the highest damage combos (in a game like ST) can generally be figured out without having to be so spergy.

    I find it fun to pick a game apart...*shrug* But yes, agreed for the most part, but you never know, there may be some weird and quirky mechanic such as damage more damage occuring when the timer has a '9' in it or something stupid, or something such as one char does more damage when he is on a specific stage as weird as something like that is, it could prove useful.
    <Pasky> so you can go extra fast by just holding it?
    <bookah> turbo handjob
    <baklakiller> sure if had a penis
    <baklakiller> im a beginner gief
  • papasipapasi N Ken is the truth Joined: Posts: 1,568
    I find it fun to pick a game apart...

    Agreed. Looking at the yoga book hyper, you'd figure that ryu j.rh, cr. mp xx tatsu deal more damage than j.rh, st fierce xx fb, but it's not...

    even j.rh, cr. fierce xx tatsu (works on big characters) only deal similar damage to j.rh, st fierce xx fb.

    eye balling is not very precise in some cases.
    eltrouble "I doubt that ST will be on the main stream ever again."
    OhNuki: Real men play ST!!
    James Chen: there is something special about playing ST on a cab. It just feels so goooooood.
    Super Turbo Hitbox & safe jump guide http://www.strevival.com/hitbox/
  • Big OBig O Joined: Posts: 366
    J. hk -> st. hp xx flashkick does work on blanka....I just did it without tool assistance and if you wanna get on supercade I'll show you there :p. Use LK flashkick. Just did it in HDR too with HDR and classic guile.

    GET BETTER! =P

    Yeah you are right. I guess I wasn't close enough or something because the Flashkick would whiff on Guile, Blanka, and Shotos sometimes. Lol the first time I tried it today on Blanka it worked...
    1st Value:
    (copy datatype 'word' from register D4 to register D6)

    D6=E1A7FFCE 0BF63C: move.w D4, D6

    After this calculation D6 = E1A7001C (28 Decimal, unsure what this number is)

    The next calculation performed to D6 is:
    (Copy datatype byte of register A1 (e.g. xxxxxx00) + D0.w (e.g. D0's xxxx0000) to register D6)

    D6=E1A7001C 0BEDA4: move.b (A1,D0.w), D6

    After this calculation D6 = E1A70018 (24 decimal, possibly the base damage, although I could never achieve 24 dmg using guile's close st. hp, the most I could get is 22, which never occured in any calculations at this point)

    The next calculation performed to D6:

    (Add datatype 'word' from register D0 (xxxx0000) to register d6)

    D6=E1A70018 0BEE6A: add.w D0, D6

    After the calculation D6=E1A70019 (25 decimal)

    Then a final calculation is performed:

    (Subtract datatype 'word' value in register D5 from register D6)

    D6=E1A70019 0BEE78: sub.w D5, D6

    After the calculation D6=E1A70015 (21 Decimal, Final damage)

    This is then subtracted from player 2's life at:

    (Subtract datatype word value in register D6 (0015) from the address located at 2A + register A2

    D6=E1A70015 0BE646: sub.w D6, ($2a,A2)

    In here, http://shoryuken.com/f223/things-you-just-dont-understand-about-st-259433/index4.html Cauldrath mentions the character specific damage scaling is about 82% for most characters and 63% for Zangief. Maybe one of these steps is related to the character specific/low health scaling done. The number in the second step seems close enough to be 82% of the number in the first step assuming it rounds up or something.
  • TNBTNB Bye. Joined: Posts: 1,180
    O____O. An ST stun meter and super gauge point counter. this will provide exact values. wow.
    Skills and attitude prove worth as a player, not the internet.
  • mrdhalsimmrdhalsim Joined: Posts: 378
    This looks really cool Pasky, certainly worthy of being called amazing!

    I have something new in the works myself but got a call from the white house a few days ago asking me to hold off for a bit so society will hear the big news item this week first. I was like, the people have been waiting too long, but they said please XSPR don't do it just yet, so I was like ok fine.
  • DNGR S PAPERCUTDNGR S PAPERCUT Joined: Posts: 1,608
    pasky, I used to think you were an idiot. now I know that I was only half right, turns out your also a savant, idiot savant.
    ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ஜ۩۞۩ஜ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
    Ah shit..    
    ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ஜ۩۞۩ஜ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
  • PaskyPasky Ninja with pistol! Joined: Posts: 1,863
    <3 u too.
    <Pasky> so you can go extra fast by just holding it?
    <bookah> turbo handjob
    <baklakiller> sure if had a penis
    <baklakiller> im a beginner gief
  • PaskyPasky Ninja with pistol! Joined: Posts: 1,863
    • Added Dammit, MZ, and Felineki's Hitbox displaying script.
    • You can now toggle the hitboxes, and the HUD display.
    • HUD no longer displays outside of a match
    • Got rid of moving the character left by 1 hotkey, you should only need one direction to determine max range for throws and whatever else for testing, move the dummies manually then pinpoint by moving P1 left to right in increments of '1' using the script.
    • Cleaned up the source code as well.
    <Pasky> so you can go extra fast by just holding it?
    <bookah> turbo handjob
    <baklakiller> sure if had a penis
    <baklakiller> im a beginner gief
  • Born2SPDBorn2SPD SPD Fanatic Joined: Posts: 276
    First of all, nice work on that script, pasky. I'll post some stuff that may help you (or may not). I don't know if this would be the best place to post it or if I should create a new topic, I hope I'm not derailing this one.

    I believe I discovered how exactly the throw ranges work in this game. When I first read the throw ranges in the papasi's site, I didn't understood why Zangief's normal throws had more range (98 pixels) than Honda's (93 pixels), because in that match-up its a fact that Honda's normal throws have a lot more range than Gief's normal throws. So after a bit of time analysing T.Akiba's throw range diagrams, I came with a possible answer...

    The throw ranges are calculated from one character's center pivot to the other character's pivot. Honda can throw (with normal throw) ryu from a max distance of 93 pixels; Gief can throw (with normal throw) Ryu from a max distance of 98 pixels.
    Assuming that you can clearly affirm that Zangief has 5 pixels better range than Honda, why in the Gief x Honda matchup that doesn't happen? That's the main point.

    Well, I failed to make it clear to oldschoolBR in our native language, and my English is not that good, but I hope you guys can understand, haha.
    Each character has an additional "factor" in the math of throw ranges. The math is:

    If "your throw range" + "characters being throw factor" is equal or bigger than the "distance between centers" then the throw happens (obviously only if he is in a throwable state).

    Zangief's factor is 16 (assuming that ryu's factor is 0, notice in that diagram from T Akiba's site that everyone has 16 pixels better range when throwing Gief, in comparison to throwing Ryu), which is really bad. By the same logic, Honda's "factor" is -1, which is a good thing.

    So, in the math of normal throw ranges, the results are:

    For Gief throw Honda with a normal throw:

    98 (Zangief's throw range) - 1 (Honda's "factor") = 97 pixel range, the same from T.Akiba's diagram.
    For Honda throw Gief with a normal throw:

    93 (Honda's throw range) + 16 (Zangief's "factor") = 109 pixel range, again matches the T.Akiba diagram.

    Another example:
    Both Gief's RH Suplex and T.Hawks Typhoon have 112 pixels to throw Ryu, but when they face each other, Hawks Typhoon will have 10 pixels better range. This happens because Hawks factor is 6 while Gief's 16.

    Obviously, all that stuff will only make sense if the diagram from t.akiba is right (http://nki.combovideos.com/data.html#distance), that is, I did not test those values. If they're right, then I firmly believe that's how the throw ranges work. So, assuming these values are actually right, it is possible to create 2 tables with enough information so as to reckon which throw beats others for all match-ups.
    Factors:
    2aiiush.png
    Throw Ranges:
    2mwayao.png
    I keep reading stuff about ST revival, about bringing this game back to life...
    Its nice to see big tourneys happening and old top players giving this game a chance again...
    But what we really need is new players... And having a strong scene obviously helps...
    But in my opinion what will really bring new players to our community is good tutorials/character guides so they can learn easily and have something to start... So, actually good players, stop being selfish and write stuff about the chars you know! The wiki is lacking so much basic content... Stop being lazy and do something about it.
  • papasipapasi N Ken is the truth Joined: Posts: 1,568
    fcs-pasky, don't know if this is too complicated for you =]

    but would it be possible to add a input display in the hud like this?

    screenshotjl.th.jpg



    also, would you be able to do some more reverse engineering?

    I was wondering if we can write values to memory address or registers to trigger the 2p to do a special move?

    Since you have a "Flash Kick: [not] ready" check, if we can program the 2p to do a Flash Kick as soon as it's ready, we can create a training mode to practice safe jump a reversal, etc.

    thumbsupy.gif
    eltrouble "I doubt that ST will be on the main stream ever again."
    OhNuki: Real men play ST!!
    James Chen: there is something special about playing ST on a cab. It just feels so goooooood.
    Super Turbo Hitbox & safe jump guide http://www.strevival.com/hitbox/
  • oldschool_BRoldschool_BR Projectile spammer Joined: Posts: 2,442
    snip
    LOL. Alright, I finally got how it works.
    Zangief's factor is 16 (assuming that ryu's factor is 0, notice in that diagram from T Akiba's site that everyone has 16 pixels better range when throwing Gief, in comparison to throwing Ryu), which is really bad.
    That's just what we need: Gief players whining about their throw ranges! :rofl:
    but would it be possible to add a input display in the hud like this?

    screenshotjl.th.jpg
    MAME HK2v9 has a similar thing (video ). Now I got no idea where the code for that thing is.
  • RufusRufus An unexpected database error has occurred. Joined: Posts: 1,966
    ...
    Well, I failed to make it clear to oldschoolBR in our native language, and my English is not that good, but I hope you guys can understand, haha.
    Each character has an additional "factor" in the math of throw ranges. The math is:

    If "your throw range" + "characters being throw factor" is equal or bigger than the "distance between centers" then the throw happens (obviously only if he is in a throwable state).
    ...
    For throw v throw you could just make it a net throw range
    077 Ryu
    077 Ken
    094 Honda Normals
    099 Honda Oichio
    091 Chun Li
    092 Blanka
    082 Zangief Normal
    082 Zangief Suplex Short/Forward
    096 Zangief Suplex Roundhouse
    086 Zangief Run Grab Short/Forward
    087 Zangief Run Grab Roundhouse
    124 Zangief SPD
    077 Zangief FAB
    076 Guile
    087 Dhalsim
    071 T. Hawk Normal
    106 T. Hawk 360/720
    075 Cammy
    069 Fei Long
    076 Dee Jay
    082 Boxer Strong
    072 Boxer Fierce
    078 Claw
    074 Sagat
    082 Dictator
    077 Akuma
    
    Hitboxes http://www.pedantic.org/~nate/HDR/
    "You don't know what you're talking about as much as I do." -- Unknown
  • deadfrogdeadfrog Joined: Joined: Posts: 6,787
    oh my god
  • PaskyPasky Ninja with pistol! Joined: Posts: 1,863
    fcs-pasky, don't know if this is too complicated for you =]

    but would it be possible to add a input display in the hud like this?

    screenshotjl.th.jpg



    also, would you be able to do some more reverse engineering?

    I was wondering if we can write values to memory address or registers to trigger the 2p to do a special move?

    Since you have a "Flash Kick: [not] ready" check, if we can program the 2p to do a Flash Kick as soon as it's ready, we can create a training mode to practice safe jump a reversal, etc.

    thumbsupy.gif

    A scrolling input display script already exists:

    http://fbarr.googlecode.com/files/ScrollingInputDisplay-v006.zip, read the readme.

    If I have time I'll ask the author if I can incorporate it or something at some point.

    As for reverse engineering the 2p to do a move, that would be extremely over complicated and annoying. Also, the lua library for mame-rr does not include anything for input from a user.

    luaengine.c - mame-rr - MAME Rerecording - Google Project Hosting
    static int doPopup(lua_State *L, const char* deftype, const char* deficon) {
    	const char *str = luaL_checkstring(L, 1);
    	const char* type = lua_type(L,2) == LUA_TSTRING ? lua_tostring(L,2) : deftype;
    	const char* icon = lua_type(L,3) == LUA_TSTRING ? lua_tostring(L,3) : deficon;
    
    	int itype = -1, iters = 0;
    	int iicon = -1;
    	static const char * const titles [] = {"Notice", "Question", "Warning", "Error"};
    	const char* answer = "ok";
    
    	while(itype == -1 && iters++ < 2)
    	{
    		if(!core_stricmp(type, "ok")) itype = 0;
    		else if(!core_stricmp(type, "yesno")) itype = 1;
    		else if(!core_stricmp(type, "yesnocancel")) itype = 2;
    		else if(!core_stricmp(type, "okcancel")) itype = 3;
    		else if(!core_stricmp(type, "abortretryignore")) itype = 4;
    		else type = deftype;
    	}
    	assert(itype >= 0 && itype <= 4);
    	if(!(itype >= 0 && itype <= 4)) itype = 0;
    
    	iters = 0;
    	while(iicon == -1 && iters++ < 2)
    	{
    		if(!core_stricmp(icon, "message") || !core_stricmp(icon, "notice")) iicon = 0;
    		else if(!core_stricmp(icon, "question")) iicon = 1;
    		else if(!core_stricmp(icon, "warning")) iicon = 2;
    		else if(!core_stricmp(icon, "error")) iicon = 3;
    		else icon = deficon;
    	}
    	assert(iicon >= 0 && iicon <= 3);
    	if(!(iicon >= 0 && iicon <= 3)) iicon = 0;
    
    #ifdef WIN32
    	{
    		static const int etypes [] = {MB_OK, MB_YESNO, MB_YESNOCANCEL, MB_OKCANCEL, MB_ABORTRETRYIGNORE};
    		static const int eicons [] = {MB_ICONINFORMATION, MB_ICONQUESTION, MB_ICONWARNING, MB_ICONERROR};
    		int ianswer = MessageBoxA(win_window_list->hwnd, str, titles[iicon], etypes[itype] | eicons[iicon]);
    		switch(ianswer)
    		{
    			case IDOK: answer = "ok"; break;
    			case IDCANCEL: answer = "cancel"; break;
    			case IDABORT: answer = "abort"; break;
    			case IDRETRY: answer = "retry"; break;
    			case IDIGNORE: answer = "ignore"; break;
    			case IDYES: answer = "yes"; break;
    			case IDNO: answer = "no"; break;
    		}
    
    		lua_pushstring(L, answer);
    		return 1;
    	}
    #else
    
    	char *t;
    #ifdef __linux
    	int pid; // appease compiler
    
    	// Before doing any work, verify the correctness of the parameters.
    	if (strcmp(type, "ok") == 0)
    		t = "OK:100";
    	else if (strcmp(type, "yesno") == 0)
    		t = "Yes:100,No:101";
    	else if (strcmp(type, "yesnocancel") == 0)
    		t = "Yes:100,No:101,Cancel:102";
    	else
    		return luaL_error(L, "invalid popup type \"%s\"", type);
    
    	// Can we find a copy of xmessage? Search the path.
    	
    	char *path = strdup(getenv("PATH"));
    
    	char *current = path;
    	
    	char *colon;
    
    	int found = 0;
    
    	while (current) {
    		colon = strchr(current, ':');
    		
    		// Clip off the colon.
    		*colon++ = 0;
    		
    		int len = strlen(current);
    		char *filename = (char*)malloc(len + 12); // always give excess
    		snprintf(filename, len+12, "%s/xmessage", current);
    		
    		if (access(filename, X_OK) == 0) {
    			free(filename);
    			found = 1;
    			break;
    		}
    		
    		// Failed, move on.
    		current = colon;
    		free(filename);
    		
    	}
    
    	free(path);
    
    	// We've found it?
    	if (!found)
    		goto use_console;
    
    	pid = fork();
    	if (pid == 0) {// I'm the virgin sacrifice
    	
    		// I'm gonna be dead in a matter of microseconds anyways, so wasted memory doesn't matter to me.
    		// Go ahead and abuse strdup.
    		char * parameters[] = {"xmessage", "-buttons", t, strdup(str), NULL};
    
    		execvp("xmessage", parameters);
    		
    		// Aw shitty
    		perror("exec xmessage");
    		exit(1);
    	}
    	else if (pid < 0) // something went wrong!!! Oh hell... use the console
    		goto use_console;
    	else {
    		// We're the parent. Watch for the child.
    		int r;
    		int res = waitpid(pid, &r, 0);
    		if (res < 0) // wtf?
    			goto use_console;
    		
    		// The return value gets copmlicated...
    		if (!WIFEXITED(r)) {
    			luaL_error(L, "don't screw with my xmessage process!");
    		}
    		r = WEXITSTATUS(r);
    		
    		// We assume it's worked.
    		if (r == 0)
    		{
    			return 0; // no parameters for an OK
    		}
    		if (r == 100) {
    			lua_pushstring(L, "yes");
    			return 1;
    		}
    		if (r == 101) {
    			lua_pushstring(L, "no");
    			return 1;
    		}
    		if (r == 102) {
    			lua_pushstring(L, "cancel");
    			return 1;
    		}
    		
    		// Wtf?
    		return luaL_error(L, "popup failed due to unknown results involving xmessage (%d)", r);
    	}
    

    So there is no way to grab input from users. You can only make popups that can show "Yes", "No", "Cancel", and "Ok", I could add the library myself to mame-rr and recompile it (adding more lua hotkeys while I'm at it), but it'd be pointless to do so when you can just use:

    macrolua - input playback and recording utility - Google Project Hosting (Use Automacro)

    It's the same shit Mr. Dhalsim (XSPR) is using in his T.R.U.S.T. program. Why make a character do a special move via hotkey, when you can just program his inputs and press play?

    Born2SPD:

    I haven't had time to absorb everything you said, I'm studying for finals this week, but I'll come back and take a look at some point.
    <Pasky> so you can go extra fast by just holding it?
    <bookah> turbo handjob
    <baklakiller> sure if had a penis
    <baklakiller> im a beginner gief
  • papasipapasi N Ken is the truth Joined: Posts: 1,568
    A scrolling input display script already exists

    this is so freaking cool man, why you guys know everything?

    screenshotpm.th.jpg

    damnit, someone just fix the buggy infinite-life cheat already ouchz.gif

    we almost have a better training mode than the console sf2.

    btw, if you were to incorporate that into HUD (which would be awesome), please do it mvc3 style instead of sf4 style (i.e. horizontal)

    questions:

    screenshotckt.jpg

    why gief has two numbers next to his move and ken only has one?
    what are the differences between these 2 numbers?
    As for reverse engineering the 2p to do a move, that would be extremely over complicated and annoying. Also, the lua library for mame-rr does not include anything for input from a user.

    but it'd be pointless to do so when you can just use:

    macrolua - input playback and recording utility - Google Project Hosting (Use Automacro)

    It's the same shit Mr. Dhalsim (XSPR) is using in his T.R.U.S.T. program. Why make a character do a special move via hotkey, when you can just program his inputs and press play?

    OK so XSPR explained macrolua to me



    so you can program 2p to do a dragon punch.

    but let's say you knock 2p out of a jump attack, how do you use macrolua to tell 2p to do dp at the reversal frame without reading the game state (i.e. dp [ready/not ready])?

    i hope you can really figure out how!


    [nvm: it's pretty straight forward i commented them out already. good job creating functions =]

    PS. may I suggest we remove (or have an option to disable) the hud highlighted in red?

    screenshotyn.th.jpg

    i dont think anyone is playing this in 2p mode, and when i'm doing the throw range image capture they are distracting]
    eltrouble "I doubt that ST will be on the main stream ever again."
    OhNuki: Real men play ST!!
    James Chen: there is something special about playing ST on a cab. It just feels so goooooood.
    Super Turbo Hitbox & safe jump guide http://www.strevival.com/hitbox/
  • oldschool_BRoldschool_BR Projectile spammer Joined: Posts: 2,442
    I use 2P mode to gather more data at the same time. I use the stick for a few attacks and the keyboard for some more. Anyway, I will say I rarely use anything but damage, timer and stun, so those numbers do not get used by me often.

    You never use 2P mode just cos you have no friends!
  • PaskyPasky Ninja with pistol! Joined: Posts: 1,863
    I use 2P mode to gather more data at the same time. I use the stick for a few attacks and the keyboard for some more. Anyway, I will say I rarely use anything but damage, timer and stun, so those numbers do not get used by me often.

    You never use 2P mode just cos you have no friends!

    Updated it, you can toggle the special move data now.
    <Pasky> so you can go extra fast by just holding it?
    <bookah> turbo handjob
    <baklakiller> sure if had a penis
    <baklakiller> im a beginner gief
  • deadfrogdeadfrog Joined: Joined: Posts: 6,787
    i went to bed and woke up and i still can't believe how awesome this is
  • blitzfublitzfu Cosmic Power Joined: Posts: 3,072
    Really great stuff, you guys are geniuses. Good job to Born2SPD for figuring out the "throw constant", now Akiba's data is a little easier to understand.

    I'm really amazed that each character has a factor that can increase/decrease the opponent's throw range. It just goes to show you that ST is a very complex, very well designed game.

    If anybody can figure out these 2 questions I have, it would be appreciated:

    1) Are the throw ranges measured in pixels?

    2) Why are some meaty normals so hard to reversal throw than others?

    I have an incredibly tough time reversal throwing Boxer's meaty cr Forward and Dictator's meaty cr Forward, even from point blank range. I don't really have a problem reversal throwing any other normals after wakeup, but it seems to me like these 2 crouching normals may have a property where they reduce the opponent's throw range or something. Similar to the "throw constant" mentioned above, possibly for a very short time during the hitting frames.
  • PaskyPasky Ninja with pistol! Joined: Posts: 1,863
    Really great stuff, you guys are geniuses. Good job to Born2SPD for figuring out the "throw constant", now Akiba's data is a little easier to understand.

    I'm really amazed that each character has a factor that can increase/decrease the opponent's throw range. It just goes to show you that ST is a very complex, very well designed game.

    If anybody can figure out these 2 questions I have, it would be appreciated:

    1) Are the throw ranges measured in pixels?

    2) Why are some meaty normals so hard to reversal throw than others?

    I have an incredibly tough time reversal throwing Boxer's meaty cr Forward and Dictator's meaty cr Forward, even from point blank range. I don't really have a problem reversal throwing any other normals after wakeup, but it seems to me like these 2 crouching normals may have a property where they reduce the opponent's throw range or something. Similar to the "throw constant" mentioned above, possibly for a very short time during the hitting frames.

    It may not be that their throw range is reduced or increase, but that some unknown "hitbox" for throws moves back when you do certain normals. How throws are determined is still somewhat of a mystery aside from knowing the range in numbers.

    The numbers I have displaying on the screen are not in pixels, although I guess I could make the calculation to translate it to pixels. The numbers displayed are the actual values the game uses to determine where the character is on the stage, not pixels.
    <Pasky> so you can go extra fast by just holding it?
    <bookah> turbo handjob
    <baklakiller> sure if had a penis
    <baklakiller> im a beginner gief
  • blitzfublitzfu Cosmic Power Joined: Posts: 3,072
    It may not be that their throw range is reduced or increase, but that some unknown "hitbox" for throws moves back when you do certain normals. How throws are determined is still somewhat of a mystery aside from knowing the range in numbers.

    Basically you're repeating what I said in different words. We may not know everything about how throws work in the game, but I wouldn't call it a "mystery". So much info has been fleshed out about how throws work in ST over the years, that I think we can say that we have a good grasp of throw knowledge.

    It's obvious that the "throw factor" does reduce/increase throw range depending on which character the opponent is facing. If the opponent's character is Ryu/Ken/Akuma/Fei, then throw range is not affected. But if it's anybody else, it's increased or reduced, and if the opponent is Zangief, then it's REALLY increased.

    This is why Honda is harder to tick with SPD or Typhoon. I've noticed that Gief or Hawk players will do less ticks vs Honda compared to other characters. This is so they're not pushed out too far in order to grab Honda. The reason for this is obviously Honda's throw factor being a negative number, meaning he decreases the opposing character's throw range by 1 unit (what their default throw range would be vs Ryu/Ken/Akuma/Fei since those 4 characters have a neutral factor).
  • PaskyPasky Ninja with pistol! Joined: Posts: 1,863
    Training mode cheat in the works, although it won't work with the lua script, it needs to be added to the xml cheat file because I have to do writes to the actual ROM to make a jump after the hit stun decrement loop, the lua engine doesn't have the ability to write to the decrypted CPU instructions memory addresses.

    Already tested the jump and it works great, it should refill both players health bars after the hit stun timer decrements all the way, haven't tested it with throws however, they work differently. Just need to hope that the memory address I'm jumping to doesn't get written to by the game, so far I haven't seen it change.

    EDIT:

    After some testing, it still has bugs, the stun meter is some how affected and can randomly stun so I have to disable stun.

    Also, I'm not gonna bother today to find the throw damage subroutine and modify it, so throwing will damage the dummies. I may possibly look into this further to fix the stun, but as of right now, this was a bitch to make to begin with, tracing through literally thousands of cpu instructions and setting breakpoints to find out when the hit stun timer loop ended was time consuming.

    Looping: [Z80 Assembler] Looping - Pastebin.com
    Not Looping: [Z80 Assembler] Not looping - Pastebin.com

    Wasn't fun...well in a weird way it was seeing how the hit stun decremented before the dummy is pushed back...but still

    For those interested in the actual workings:

    Basically I wrote a memory hook that jumps out of the original code, into my own code and then returns back, so ya....basic memory hook:

    Original game code:
    04C97C: addq.b #2, ($2,A6)
    04C980: rts // Return out of the hit stun timer counter
    

    Modified with a memory hook:
    04C97C: jmp $ffffd12.l //  This is our spiffy memory hook, jump the PC to the new memory location
    FFFFD12: addq.b  #2, ($2,A6)  // Do the overwritten instruction
    FFFFD16: move.b  #$90, $ff8479.l // Set P1's life to 144
    FFFFD1E: move.b  #$90, $ff860b.l // Set P1's Life bar to 144
    FFFFD26: move.b  #$90, $ff8879.l // Set P2's Life to 144
    FFFFD2E: move.b  #$90, $ff8a0b.l // Set P2's Life bar to 144
    FFFFD36: rts // Return out of the hit stun time counter and everythings back to normal
    

    AND BEHOLD:

    <Pasky> so you can go extra fast by just holding it?
    <bookah> turbo handjob
    <baklakiller> sure if had a penis
    <baklakiller> im a beginner gief
  • PaskyPasky Ninja with pistol! Joined: Posts: 1,863
    Training mode cheat:

    Downloads - ssf2thud - Heads Up Display for Super Street Fighter II Turbo - Google Project Hosting

    Only works with mame-rr/mame, not sure how to do ROM address hacks in FBA.

    Install:
    1. DO NOT UNZIP THE CHEAT.ZIP, LEAVE IT ZIPPED
    2. DO NOT UNZIP THE CHEAT.ZIP, LEAVE IT ZIPPED
    3. DO NOT UNZIP THE CHEAT.ZIP, LEAVE IT ZIPPED
    4. DO NOT UNZIP THE CHEAT.ZIP, LEAVE IT ZIPPED
    5. DO NOT UNZIP THE CHEAT.ZIP, LEAVE IT ZIPPED
    6. DO NOT UNZIP THE CHEAT.ZIP, LEAVE IT ZIPPED

    7. Place the cheat.zip in the same directory as mame.exe

    8. You have two options to run mame with cheats, either run mame from the command line like this: mame.exe -cheat.

    9. The 2nd option is to open mame-rr.ini and edit the line under 'Core Misc Options' that says 'cheat 0' and change it to 'cheat 1'. This is the better option because once you save this file you won't ever have to edit it again and mame will always run with the cheat option enabled.

    10. Press tab during the game to bring up the mame menu, go to cheats and turn it on or off.

    Stun does not work during the training mode cheat, unfortunately I haven't fixed that yet. Throws also still do damage in training mode, but this shouldn't be a problem, just hit the dummy again to refill it's life. Throw hit stun is also messed up.
    <Pasky> so you can go extra fast by just holding it?
    <bookah> turbo handjob
    <baklakiller> sure if had a penis
    <baklakiller> im a beginner gief
  • papasipapasi N Ken is the truth Joined: Posts: 1,568
    fcs-pasky, why are you so awesome? just tested it, works great! i actually dont like dizzy in training mode, perfect!

    on a side node, the original mame has all those [easy dragon punch] [easy spd] cheats, do you think you can get some insight from those and see if we can trigger 2p dummy to do reversal dp, etc?

    i see in your script you can actually write values to memory addresses (move p1 left 1 pixel)
    eltrouble "I doubt that ST will be on the main stream ever again."
    OhNuki: Real men play ST!!
    James Chen: there is something special about playing ST on a cab. It just feels so goooooood.
    Super Turbo Hitbox & safe jump guide http://www.strevival.com/hitbox/
  • PaskyPasky Ninja with pistol! Joined: Posts: 1,863
    See those values I'm monitoring in the HUD? All those "easy special" cheats do, is set them to the maximum value (e.g. flashkick to 0x06), so that when you press :u::k: the move instantly comes out without a charge. It doesn't make them do the special instantly because it still requires the final input (:f::p: for fireball, :b::k: for hurricane kick etc...)

    I told you, if you want a special, use input macro, set a hotkey with it and that will make them dp (after you've set it to dp)....

    I'll be writing my own input scroll display sometime next week.
    <Pasky> so you can go extra fast by just holding it?
    <bookah> turbo handjob
    <baklakiller> sure if had a penis
    <baklakiller> im a beginner gief
  • papasipapasi N Ken is the truth Joined: Posts: 1,568
    Yeah I get your point, we can use luamacro to do special moves, but the problem to solve is *when* to do it.

    How can we teach the dummy to do dp first thing after it got knock down?

    I guess that's a harder problem to solve. Maybe we can tackle that once we learn more about the source code / debugger.

    Now the mame training mode is better than the consoles (do you guys actually find any good use of the auto-block?)
    eltrouble "I doubt that ST will be on the main stream ever again."
    OhNuki: Real men play ST!!
    James Chen: there is something special about playing ST on a cab. It just feels so goooooood.
    Super Turbo Hitbox & safe jump guide http://www.strevival.com/hitbox/
  • PaskyPasky Ninja with pistol! Joined: Posts: 1,863
    I'll never go that far in to find the reversal flag and trigger a special on that frame...it's too annoying to dig through, I have other projects I work on in my free time too (Doing Cadash right now).

    You're just gonna have to deal with using T.R.U.S.T and have it load a save state where the dummy is knocked down and will dp in a pre-determined amount of frames if you wanna practice safe jumps (which i assume that's what you wanna do). That's what that program seems designed to do anyways.

    If I had the actual game source it'd be easy as hell, good luck getting that.

    Auto block is good for seeing which part of a combo you missed. It's not really necessary in ST.
    <Pasky> so you can go extra fast by just holding it?
    <bookah> turbo handjob
    <baklakiller> sure if had a penis
    <baklakiller> im a beginner gief
  • papasipapasi N Ken is the truth Joined: Posts: 1,568
    haha you get bored easily =]

    if you were to do the horizontal scrolling input display, please consider make the icons much smaller.
    the current set they have is too big, i barely see all my inputs for 1 SPD.

    another reason is that you might need to display 3+ buttons as the same time stacked together, so you'll need smaller icons anyway.

    damn the current vertical icons look so much like sf4 it's disgusting :)

    its nice to see why i'm getting green hands instead of spd, i pressed the punch just right before i hit up


    [PS. for those who don't know how to create mame-rr.ini, type "mame -createconfig" in the command prompt]
    eltrouble "I doubt that ST will be on the main stream ever again."
    OhNuki: Real men play ST!!
    James Chen: there is something special about playing ST on a cab. It just feels so goooooood.
    Super Turbo Hitbox & safe jump guide http://www.strevival.com/hitbox/
  • -Sesshomaru--Sesshomaru- Joined: Posts: 15
    Pasky, please add something to make ST to run in actually 60 fps, u know, no frame skipping, because speed 0 still skips some frames, when u finish the game, u can see how the CPU vs CPU at the ending credits run with no frame skipping, I suppose its like speed -1?
  • PaskyPasky Ninja with pistol! Joined: Posts: 1,863
    Pasky, please add something to make ST to run in actually 60 fps, u know, no frame skipping, because speed 0 still skips some frames, when u finish the game, u can see how the CPU vs CPU at the ending credits run with no frame skipping, I suppose its like speed -1?

    That's the way the actual game played at the arcades. FBA is terrible at keeping track of CPU cycles and it's timing is off (at least the version ggpo uses that is 2 years old), so sometimes you'll get 59.6 frames per second, 59.8, 59.9, mame is far more accurate and pretty close to the real board, if you're having frame skip issues it's probably because you have a slow pc.
    <Pasky> so you can go extra fast by just holding it?
    <bookah> turbo handjob
    <baklakiller> sure if had a penis
    <baklakiller> im a beginner gief
  • PaskyPasky Ninja with pistol! Joined: Posts: 1,863
    Something interesting I found.

    Even if you do it frame by frame, even with pianoing inputs, you won't always get a reversal. Lol, this fucken game and it's randomness, been searching for the reversal flag.
    <Pasky> so you can go extra fast by just holding it?
    <bookah> turbo handjob
    <baklakiller> sure if had a penis
    <baklakiller> im a beginner gief
  • oldschool_BRoldschool_BR Projectile spammer Joined: Posts: 2,442
    Something interesting I found.

    Even if you do it frame by frame, even with pianoing inputs, you won't always get a reversal. Lol, this fucken game and it's randomness, been searching for the reversal flag.
    I have tested that extensively in Kawaks and it never failed. Is it not some stuff MAME got wrong? As for reversals, I doubt there is a flag for it: it seems you simply can do some moves as soon as you recover and can not do others (grounded normals, basically).
  • PaskyPasky Ninja with pistol! Joined: Posts: 1,863
    I have tested that extensively in Kawaks and it never failed. Is it not some stuff MAME got wrong? As for reversals, I doubt there is a flag for it: it seems you simply can do some moves as soon as you recover and can not do others (grounded normals, basically).

    When I said flag, I didn't mean specifically, I meant the first possible frame a special can be executed after a knockdown. There has to be something that tells the game, "Ok, the special can be done now". There's also something that triggers the "Reversal attack" message.

    As far as timing in mame, I wouldn't trust Kawaks at all, Mame more accurately emulates the 68000 cpu. I'll test more later, but I'm almost positive I was hitting the reversal frame perfect and it was not coming out. It could be that issue ST has with the different speed settings that in order to compensate for the speed settings sometimes a frame can be skipped over, this is partly why input windows for moves can vary as well.
    <Pasky> so you can go extra fast by just holding it?
    <bookah> turbo handjob
    <baklakiller> sure if had a penis
    <baklakiller> im a beginner gief
  • oldschool_BRoldschool_BR Projectile spammer Joined: Posts: 2,442
    I see. All I know is that you can do any moves in most times, and grounded normals come later, which is possibly the explanation why they do not work as reversals*. Not sure if this may help you.

    To test reversals, I would usually input the command early, then emulate a 30 Hz turbo ("autofire") by having the button pressed at a frame step and depressed the next one. It always worked, even with turbo speed (internal frame skipping) on, which is known to be always the case for ST/X. I expected that often the frame when you have to input commands would get skipped, but it did not happen. But, well, emulation is not a real board.

    *sometimes they did, and then they would work for that whole round, only.
  • PaskyPasky Ninja with pistol! Joined: Posts: 1,863
    That's a terrible way to test reversals for accuracy.

    I use a frame counter and frame advance, which is 100% accurate.

    You can turn mame-rr's frame counter on with '.' by default (it's on by default when it starts).
    <Pasky> so you can go extra fast by just holding it?
    <bookah> turbo handjob
    <baklakiller> sure if had a penis
    <baklakiller> im a beginner gief
  • papasipapasi N Ken is the truth Joined: Posts: 1,568

    For those interested in the actual workings:

    Basically I wrote a memory hook that jumps out of the original code, into my own code and then returns back, so ya....basic memory hook:

    Original game code:
    04C97C: addq.b #2, ($2,A6)
    04C980: rts // Return out of the hit stun timer counter
    

    Modified with a memory hook:
    04C97C: jmp $ffffd12.l //  This is our spiffy memory hook, jump the PC to the new memory location
    FFFFD12: addq.b  #2, ($2,A6)  // Do the overwritten instruction
    FFFFD16: move.b  #$90, $ff8479.l // Set P1's life to 144
    FFFFD1E: move.b  #$90, $ff860b.l // Set P1's Life bar to 144
    FFFFD26: move.b  #$90, $ff8879.l // Set P2's Life to 144
    FFFFD2E: move.b  #$90, $ff8a0b.l // Set P2's Life bar to 144
    FFFFD36: rts // Return out of the hit stun time counter and everythings back to normal
    

    Just noticed you updated your post with the details. That's exactly those old school SNES game cheats are written!

    Nice work. I wouldn't worry about the stun, it's actually annoying in the training mode (well maybe if you are specifically testing for stun combos).

    So you didn't answer my question, what's the 2 numbers next to gief's move while everyone else only has 1 number?
    There has to be something that tells the game, "Ok, the special can be done now".

    I thought you have that already, what about those [sonic boom] [ready/not ready] you have in the script?
    There's also something that triggers the "Reversal attack" message.

    Yeah that made sense. I think there should be a state where the game marks the 2p as "knockdown", or something like that.
    eltrouble "I doubt that ST will be on the main stream ever again."
    OhNuki: Real men play ST!!
    James Chen: there is something special about playing ST on a cab. It just feels so goooooood.
    Super Turbo Hitbox & safe jump guide http://www.strevival.com/hitbox/
  • PaskyPasky Ninja with pistol! Joined: Posts: 1,863
    It's not just SNES cheats. The NES game genie would be a better example, a lot game genie cheats modified the actual NES ROM areas. That's why you see a lot of codes like "Start game with xx", because they modified static values inside the games ROM area when a new game was started.

    Say for example there was an instruction in say Super Mario Bros (assume $20FD is the address that contains the amount of lives you have remaining):
    6502 ASM:
    00:9625:DE FD 20  DEC $20FD // Decrement address $20FD's value by 1 when you die
    

    Let us assume that's the code the game uses to decrease your lives when you die. You could make an ASM cheat that tells it to instead:
    6502 ASM:
    00:9625:FE FD 20  INC $20FD  // Increment address $20FD's value by 1 when you die
    

    This would make your lives go higher each time you died, giving you infinite lives. Most cheat engines nowadays don't need to rely on ROM ASM hacks for simple things because instead you set the cheat engine to constantly write a value to $20FD instead, it's easier. You only get into ASM hacks when the memory write just won't work.

    Most cheat engines in emulators perform writes to RAM memory addresses in intervals specific to that emulator (think in the ms range, like a write every 30ms). This works perfectly fine for most games. So when you want infinite super, the cheat engine just writes a value of '0x30' every interval so you're super meter is always full. Same with the original health cheat, it only writes to the RAM of P1's life or P2's life address with a value of '0x90'

    Since this game is programmed at such a low level and has a weird way of calculating things, writing there causes anomalies due to the game relying on checking if that address was written to, to perform other calculations (such as hit stun). What I did was control when that memory address gets written to by changing how the game performs a routine. I have the cheat engine make a write to the games ROM address to change an instruction located in the ROM area and write new instructions within the games RAM area that is never used. This way, the life value is written to AFTER the hit stun calculations have already been performed and not by the cheat engine, but by the game itself!

    Normal operation of the game:
    • P2 gets hit
    • P2's life decreases
    • Hit stun is performed because the game detects a change in P2's life.

    Operation with RAM write cheat
    • Set P2's life to 144
    • P2 gets hit
    • P2's life remains 144, game detects no change
    • Hit stun is not performed, game thinks P2 was never hit

    Operation with the ROM Hack:
    • P2 gets hit
    • P2's life is decreased
    • Hit stun is performed
    • P2's life is reset back to 144
    So you didn't answer my question, what's the 2 numbers next to gief's move while everyone else only has 1 number?
    In my original first post (which is now edited) I explained that I wasn't sure what gief and hawks command throw 2nd number meant. I'm unsure how they work. The first number is the counter for the first 360, if that is '8' (going by memory, in class) the spd motion was 'accepted'. The 2nd number believe needs to be greater than 0 before the SPD can be executed. I think the 2nd numbers significance is only in the super move. Where a 2nd 360 is needed, perhaps there is another address I didn't find that is for the 2nd 360. Either way, I think the 2nd address doesn't increment until a 2nd 360 is performed. So in a nutshell...720 can't be performed until the 1st number has reached its peak value, and the 2nd number is greater than 0 (IF I RECALL CORRECTLY).
    I thought you have that already, what about those [sonic boom] [ready/not ready] you have in the script?

    No, that just checks the address that tells the game there is already a projectile on screen for that player.

    NOTE:

    I have an idea on how to fix it so that stun and everything else will function correctly. Basically to hook at the end of the stun counter to reset the life. Also to find out what triggers a round over and force the game to not execute it.

    So ya, hope I shed some light on that for you :P.
    <Pasky> so you can go extra fast by just holding it?
    <bookah> turbo handjob
    <baklakiller> sure if had a penis
    <baklakiller> im a beginner gief
  • djfrijolesdjfrijoles First ST player to ever moon a live stream baby ! Joined: Posts: 2,054
    nerd talk.


    Pasky I cant run training mode got damit. Dont make this shit so nerdy to where us cool kids cant run the shit.
    <garyangel> ceks,cani,robbiers,yito all mexico players dont know where kyouya
    <garyangel> (((((((((((((((
    <djfrijoles> kyouya is with his gf gary
    <Random.Jab.DP.Spamer> his gf is gary ?
  • PaskyPasky Ninja with pistol! Joined: Posts: 1,863
    It helps when you say why you can't. ***.
    <Pasky> so you can go extra fast by just holding it?
    <bookah> turbo handjob
    <baklakiller> sure if had a penis
    <baklakiller> im a beginner gief
  • djfrijolesdjfrijoles First ST player to ever moon a live stream baby ! Joined: Posts: 2,054
    cause its to nerdy. make an on/off button lol. like a microwave. see thats easy to use. a microwave. make it like a microwave
    <garyangel> ceks,cani,robbiers,yito all mexico players dont know where kyouya
    <garyangel> (((((((((((((((
    <djfrijoles> kyouya is with his gf gary
    <Random.Jab.DP.Spamer> his gf is gary ?
  • PaskyPasky Ninja with pistol! Joined: Posts: 1,863
    Press tab -> Go to cheats -> On/Off

    P.S. U dumb yo, ***
    <Pasky> so you can go extra fast by just holding it?
    <bookah> turbo handjob
    <baklakiller> sure if had a penis
    <baklakiller> im a beginner gief
  • djfrijolesdjfrijoles First ST player to ever moon a live stream baby ! Joined: Posts: 2,054
    lol I didnt have a cheats tab.
    <garyangel> ceks,cani,robbiers,yito all mexico players dont know where kyouya
    <garyangel> (((((((((((((((
    <djfrijoles> kyouya is with his gf gary
    <Random.Jab.DP.Spamer> his gf is gary ?
  • PaskyPasky Ninja with pistol! Joined: Posts: 1,863
    Run mame like this "mame.exe -cheat"

    or edit the mame-rr.ini file in the directory, scroll down to where it says cheat 0, and change it to cheat 1

    or you could....I don't know....READ INSTRUCTIONS

    ***
    <Pasky> so you can go extra fast by just holding it?
    <bookah> turbo handjob
    <baklakiller> sure if had a penis
    <baklakiller> im a beginner gief
  • djfrijolesdjfrijoles First ST player to ever moon a live stream baby ! Joined: Posts: 2,054
    yea i tried that with poopasi last night. hes a nerd too.

    nocheats.png
    <garyangel> ceks,cani,robbiers,yito all mexico players dont know where kyouya
    <garyangel> (((((((((((((((
    <djfrijoles> kyouya is with his gf gary
    <Random.Jab.DP.Spamer> his gf is gary ?
  • PaskyPasky Ninja with pistol! Joined: Posts: 1,863
    Im at class studying for a final, I'll message you on MSN later when I get back.
    <Pasky> so you can go extra fast by just holding it?
    <bookah> turbo handjob
    <baklakiller> sure if had a penis
    <baklakiller> im a beginner gief
  • MightyMarMightyMar Why you lose to me? Joined: Posts: 390
    Also, messing around, I found out exactly why sometimes I would not get moves even though I swore I input it correctly.

    As can obviously be seen by using pasky's hud display, ST's input system works by just incrementing a counter for a certain move every time you input the next expected direction for that move. You have to input the next direction within a variable timeframe. The first input needs to be input within probably around 7-15 frames. The other input windows after the first seem to be ~6 and more. Each type of special move keeps track of its own window separately. Super input windows are much larger. However, if you don't input the move within the time frame, the counter will reset to 0 for a frame and will wait for the first directional input again.

    This has repercussions. If you input the second part of a move exactly on the frame it gets reset to 0, it will not count towards inputting that current move! For example, if you hold toward, then input down then down-toward on the frame that the counter resets to 0, you will not get a dp input. With ryu you will just get a normal attack. If we assume a uniform distribution of the variable input window for the first directional input of a move to be between 7-15f, then there's an ~8.8% chance your move will just not come out if you've been holding down that direction. This applies to every single special move in the game.

    If you try to do a walk-up spd and you hold toward for longer than 7f, there's just a random chance you won't get it. If you're holding down to punish an enemy's recovery in anticipation of just easily closing out the match with rekkas, your rekkas will just randomly not come out. If you're holding back OR down-back for a while and then input cammy hooligan or fei chicken wing, it will just randomly not come out. If you're holding back with fei to block a jump-in attack and then input reverse dp, the game will just randomly not recognize that you even input the correct directions in the first place.

    The only way to avoid this situation is to make sure that the countdown for your move is completely timed out which can be accomplished by just holding any other direction than the first or neutral for at least 15f. If the countdown timer hasn't reset to 0, then you are still susceptible to your move just randomly not coming out. In fact, for a dp, if you tap toward, neutral, then toward within 6f you have a much higher chance of your dp not coming out.

    This system explains why you can't easily do qcfx3 to input super moves. It explains why if you do a 360/720 input with the correct timing but had input a few directions beforehand, you won't get the 360/720. ST uses a counter system per move and it doesn't actually keep track of a buffer of past input moves. If st just looked at a string of inputs, inputs like those should easily work.

    Note that for 360s/720s, the counter starts counting down for a possible 360 whenever you input or hold either 2468. This means if you're doing a tick setup, DO NOT HOLD one of those directions at the start or you will randomly not get your spd. Also, if you input something like 8426+p (needed by gief in the corner) off of crouching jabs while holding down-back, brushing "down" or "back" on your way to "up" will start the countdown and drastically narrow your input window for spd.

    Oh wow. Thanks for this info cause I always do holds for my inputs. Now I know not to do that anymore. I wonder how many other games carry on this directional reading script???
    "Step back loser! Make way for the winner!"
    "That was the worst strategy ever. Buy an official book!"

    Why You Lose To Me?
  • PaskyPasky Ninja with pistol! Joined: Posts: 1,863
    Oh my...what's this =O

    dizzy.png
    <Pasky> so you can go extra fast by just holding it?
    <bookah> turbo handjob
    <baklakiller> sure if had a penis
    <baklakiller> im a beginner gief
  • PaskyPasky Ninja with pistol! Joined: Posts: 1,863
    Dizzy meter added:

    mame2011051117023990.png

    An interesting thing I found, is stun actually goes to 34. I found this out by accident because I had the stun bar only going to 30 and it would actually draw beyond the border sometimes, it's very strange. It seems that either sometimes the game raises the dizzy threshold to 34 or that when the player is at 27~+ that dizzy damage is increased for moves so that it hits 34. You can see it go beyond 30 yourself by just jabbing with deejay versus, say ken. That's how I found it, most the time ken will dizzy before he reaches 30, but rarely it will go beyond 30 (highest I've seen is 33).


    So, since I'm not sure which it is, I made the stun meter x/34 and I added a black line in the stun bar that indicates where 30 is, since most hits seem to dizzy after reaching that point, however don't be surprised if it goes beyond it.
    <Pasky> so you can go extra fast by just holding it?
    <bookah> turbo handjob
    <baklakiller> sure if had a penis
    <baklakiller> im a beginner gief
  • mrdhalsimmrdhalsim Joined: Posts: 378
    Lookin nice!
  • papasipapasi N Ken is the truth Joined: Posts: 1,568
    looking very nice phagsky

    it reminds me of winamp v.1 with that color bar.

    waiting for the next version with horizontal scrolling display.
    the vertical ones you cannot see all the input for 720.
    eltrouble "I doubt that ST will be on the main stream ever again."
    OhNuki: Real men play ST!!
    James Chen: there is something special about playing ST on a cab. It just feels so goooooood.
    Super Turbo Hitbox & safe jump guide http://www.strevival.com/hitbox/
Sign In or Register to comment.