Experienced Forum User, Published Author, Active player
(288)
Joined: 10/8/2006
Posts: 356
Offset 18D, which for enemies contains experiened gained, contains the current experience you have for allies. The lowest 2 bytes of your current experience is therefore used.
Experienced Forum User, Published Author, Active player
(288)
Joined: 10/8/2006
Posts: 356
When an event is not executing, the RNG is normally updated 1 time per frame. I'd make use of the script by finding the frame on which a critical hit could happen, and then go back and try to hit the enemy on that frame. So you have to do some rerecording. If you wanted to find a critical hit some frames in advance, you could add that to the index used to find the random number (in the rt2 table) and subtract that number of frames from the recovery counter, and remember to add it to the 5-counter (updc) modulo 5.
The counter directly below the table of random numbers at the top shows how many times the RNG was used during the last frame.
You can't directly tell the number of RNG executions until the next critical without taking account which frames it's possible to attack on. You can only attack an enemy once every 5 frames. The number of RNG executions before it decides whether it's a critical hit also depends on some other calculations.
Anyway, I think that almost all of the information on the screen can be useful at times. You never know when it might come handy.
I briefly tried if I could find some critical opportunities with Mantis Ant, but it turned out that they were so rare that I'd have to wait for a long time to get them.
I wonder if I should have killed some rabites at the beginning to level my sword? I may have to charge up the sword to hurt the Mana Beast and I don't know if I'll have an opportunity to get easy weapon experience later on.
Experienced Forum User, Published Author, Active player
(288)
Joined: 10/8/2006
Posts: 356
I've documented it in an earlier post. Here, "Random" means generating a random number, measured in 256ths. The RNG offset is at 0x3f0 and the 15 byte table is at 0x3f1. To make a random number, the byte at the current offset is added to the byte before it and stored in the byte before it. This is the random number. Then the offset is increased.
I don't have access to the game's code right now, so this is based on previous posts and the script.
Slow lowers hit rate by 1/16.
Hit rate is halved when recovering after action.
Mini lowers target's defense by 3/4.
Attack succeeds if hit rate is greater than (1+Random)*Evade/2.
Force = Attack*(1+(Charge level+Mana Sword Power)/4). If the attacker is small, force is always 1.
If hit rate is greater than Random*101, Power = (Mana power squared+Force)*(1+Random/16), otherwise Power = Hit rate*Force/100.
If evade rate is greater than Random*100, DefPower = Defense+Random*Defense/16, otherwise DefPower = Evade*Defense/80
Critical hits are possible when fully recovered, or with moon energy. These double the attack power.
If target is sleeping, the critical rate doubles. The woman's rate is then increased by 5 and the man and sprite's hit rates are increased by 10. If the result is then greater than Random*256, the hit will be critical.
If the attacker is recovering, Power becomes (1-Frames left/((99-Agility)/2+80))*(Power/2).
Damage equals Power - DefPower. The target is woken up. Status is only inflicted if damage was done and target is not protected against anything it would be inflicted with.
I found a bug in my script, it says rt[z-1] where it should have been rt2[z-1] in one place, and likewise for rt[z] instead of rt2[z].
You can probably try to calculate in in advance, but the values used will be outdated, and you have to take into account other uses of the random number generator.
Damage can be manipulated by waiting more frames before attacking or attacking more times, or getting enemies to attack you.
Experienced Forum User, Published Author, Active player
(288)
Joined: 10/8/2006
Posts: 356
Here's a WIP I made until the beginning of the dwarf caves last year.
I avoid getting in the way of a rabite in the forest by making sure it doesn't get loaded due to there already being 3 on the screen. I also run behind the first house in the town instead of down. My boss fight is shorter due to accumulating hits while the boss is recovering. I haven't explored the possibility of making it even shorter by getting critical hits since my damage/critical calculator wasn't done yet when I fought him. Remember to enable multitap 5 before playing this movie.
http://dehacked.2y.net/microstorage.php/info/1232620366/hhssom.smv
Another important thing I did was to time cutting the grass properly according to the 5-frame rule.
Experienced Forum User, Published Author, Active player
(288)
Joined: 10/8/2006
Posts: 356
You always go back outside when you die at Frost Gigas. This is controlled by 7ECF0B, which is set to 3 when fighting him.
This is the script that's executed when you die.
07FF:
CA988B hold
CA988C ifbetween 0B 0 0 jump 07FE
CA9891 ifbetween 0B 1 1 jump 07FD
CA9896 ifbetween 0B 3 3 jump 066F
CA989B ifbetween 0B 4 4 jump 0025
CA98A0 inc FF
CA98A2 call 0748
CA98A4 tint dark 1F1F1F
CA98A8 wait 20
CA98AA call 07C7
CA98AC set 00 0
CA98AF path 0075
CA98B1 text "<Open> Sadly, no trace of "
CA98C6 call 07FB
CA98C8 text "\
was ever found..."
CA98DB wait key
CA98DD text "<Close>"
CA98DE reset
At the very beginning of the game, 7ECF0B is set to 0, and when you die, the ghost tells you to wake up. When you're fighting the Mantis Ant, it's set to 1, and Jema helps you if you die. If set to 4, you're in the training cave, and Jehk asks what's wrong with you.
Script 66F, which is called when 7ECF0B is 3, is as follows:
066F:
CA8DFC call 0748
CA8DFE tint dark 1F1F1F
CA8E02 wait 20
CA8E04 call 07C7
CA8E06 path 0200
CA8E08 inc F8
CA8E0A text "<Open> ...SCRAM..!"
CA8E18 wait 10
CA8E1A text "<Close>"
CA8E1B dec F8
CA8E1D call 0748
CA8E1F face talker south
CA8E22 setchrvar talker.190 00
CA8E26 setchrvar talker.191 00
CA8E2A heal talker
CA8E2C update talker
CA8E2E sound 02 07 00 88
CA8E33 updatehp
CA8E34 wait 10
CA8E36 jump 0636
Experienced Forum User, Published Author, Active player
(288)
Joined: 10/8/2006
Posts: 356
Fortunately, most games clear all RAM on start. But there are probably games that update the RNG during idle time, and those will desync right away because of timing differences between the emulator and the NES.
Experienced Forum User, Published Author, Active player
(288)
Joined: 10/8/2006
Posts: 356
Most soundcards can only record from one source at a time. You have to either record yourself playing the game first and then overlay your voice afterwards, or record a movie in the emulator of you playing the game while you record your voice, then play back the emulator movie to get the sound from the game to overlay on top of it.
Experienced Forum User, Published Author, Active player
(288)
Joined: 10/8/2006
Posts: 356
actualy the moment you use your public ip adress, it will go to the ISP router to make the request
let's say that your server have the public adress and your laptop have a private one ,if your tracert the packet it will be something like that:
laptop>router>isprouter>server
That would be the case if the router was operating normally with the ISP connected to the WAN port, but if it's acting as a switch, it should just forward the data to the port that's connected to the device with the MAC address specified as the destination, regardless of the IP address.
As for the metric, I think you're talking about a different kind of metric. The metric parameter used with the route add command controls how it will select which route to use, it's not the TTL metric.
Experienced Forum User, Published Author, Active player
(288)
Joined: 10/8/2006
Posts: 356
Try putting the server's IP instead of the router's IP. It should then send data with the server's IP as destination to the server. I couldn't find a way to leave the gateway field blank.
route -p add (Server's IP) mask 255.255.255.255 (Server's IP) if (LAN interface)
The traffic should not go to the ISP if it's sent to the server's MAC address, I think, which should be the case here.
The other route command isn't needed, since the correct route exists by default. The route to the server overrides the default route, since it's metric is 1 (since it wasn't specified).
Experienced Forum User, Published Author, Active player
(288)
Joined: 10/8/2006
Posts: 356
Shouldn't the router remember the MAC address of each connected PC, and pass traffic to the correct PC automatically? I don't see why it would pass the traffic to the ISP unless the ISP is selected as the gateway.
But perhaps the server itself needs to be selected as the gateway instead of the router if it's routing capabilities have been disabled. I don't think you can add a route without specifying a gateway using the add route command.
Experienced Forum User, Published Author, Active player
(288)
Joined: 10/8/2006
Posts: 356
Go into the card's properties and select TCP/IPv4 and click on Properties, and select "Use the following IP address", then enter the IP address you want to use for the card. Then go into the command prompt and type:
netsh interface ipv4 show interface
This tells you the interface index of the network card where the cable is connected. Then type:
route -p add (Server's IP) mask 255.255.255.255 (Router's IP) if (Interface index)
If the server's IP changes, you can delete the old route using the following command and then add it again:
route -p delete (Server's IP)
Experienced Forum User, Published Author, Active player
(288)
Joined: 10/8/2006
Posts: 356
My LUA script already does the job of automatically skipping the dialogue for you. It does this by checking RAM location D0, and when it's 83 it presses the B button on the controller controlling the character who started the dialogue.
It can be downloaded here: http://hhs.comze.com
Experienced Forum User, Published Author, Active player
(288)
Joined: 10/8/2006
Posts: 356
Bisqwit wrote:
Feh, readibility would be nice. Also, what is the character encoding you are supposing? The exact byte values of your characters matter to a great deal I suppose and converting the characters into bytes, depends on the character encoding used. I can make an educated guess, but it would be better if it came from the horse's mouth.
It's Windows-1252. The hex code for the ASM file is as follows.
64 62 20 31 39 31 2C 30 2C 32 2C 22 57 B8 31 20
AB 33 C0 B9 1E 22 2C 30 2C 22 41 3B C8 74 22 2C
38 2C 22 50 99 F7 F1 4A 58 78 22 2C 31 38 2C 22
49 E2 F0 40 3D E9 22 2C 33 2C 22 72 E7 B0 24 AA
5A B4 22 2C 39 2C 22 CD 21 C3 50 99 B1 22 2C 37
2C 22 F7 F1 4A 58 78 E7 33 DB 50 8B F7 99 B1 22
2C 31 30 2C 22 F7 F1 50 8A C2 22 2C 31 32 2C 22
30 AA 58 85 C0 75 F0 57 4F 8A 22 2C 34 2C 22 86
22 2C 35 2C 22 88 22 2C 34 2C 22 46 3B F7 72 F4
5F B0 20 AA 58 EB BE 22
Here's the original, more readable (and longer) version, in MASM.
.model tiny
.code
org 256
mov di,512
push di
mov ax,2031h
stosw
xor ax,ax
nbrloop:
mov cx,30
primeloop:
inc cx
cmp cx,ax
jz samenbr
push ax
cwd
div cx
dec dx
pop ax
js notprime
samenbr:
dec cx
loop primeloop
nextnbr:
inc ax
cmp ax,1001
jb nbrloop
mov al,36
stosb
pop dx
mov ah,9
int 21h
ret
notprime:
push ax
cwd
mov cl,7
div cx
dec dx
pop ax
js nextnbr
xor bx,bx
push ax
mov si,di
div10lp:
cwd
mov cl,10
div cx
push ax
mov al,dl
or al,48
stosb
pop ax
test ax,ax
jnz div10lp
push di
revnbrlp:
dec di
mov al,[si]
xchg al,[di]
mov [si],al
inc si
cmp si,di
jb revnbrlp
pop di
mov al,32
stosb
pop ax
jmp nextnbr
end
Experienced Forum User, Published Author, Active player
(288)
Joined: 10/8/2006
Posts: 356
In IE, one could just enter the URL javascript:alert(document.body.contentEditable=true), then paste the code into the window and then enter javascript:alert(document.body.innerHTML=document.body.innerText).
Experienced Forum User, Published Author, Active player
(288)
Joined: 10/8/2006
Posts: 356
I don't think my entry got accepted, so I'll just post it here. It's in NASM and is 152 bytes long.
db 191,0,2,"W¸1 «3À¹",0,"A;Èt",8,"P™÷ñJXx",18,"Iâð@=é",3,"rç°$ªZ´",9,"Í!ÃP™±",7,"÷ñJXxç3ÛP‹÷™±",10,"÷ñPŠÂ",12,"0ªX…ÀuðWOŠ",4,"†",5,"ˆ",4,"F;÷rô_° ªXë¾"
The compiled DOS program, in hex, is 95 bytes:
BF 00 02 57 B8 31 20 AB 33 C0 B9 1E 00 41 3B C8
74 08 50 99 F7 F1 4A 58 78 12 49 E2 F0 40 3D E9
03 72 E7 B0 24 AA 5A B4 09 CD 21 C3 50 99 B1 07
F7 F1 4A 58 78 E7 33 DB 50 8B F7 99 B1 0A F7 F1
50 8A C2 0C 30 AA 58 85 C0 75 F0 57 4F 8A 04 86
05 88 04 46 3B F7 72 F4 5F B0 20 AA 58 EB BE
Experienced Forum User, Published Author, Active player
(288)
Joined: 10/8/2006
Posts: 356
I have no idea how that happened. I haven't seen anything like it before.
Here are some things that I made last winter, which may be useful. It's a data dumper and a LUA script for Snes9x.
http://hhs.comze.com
Experienced Forum User, Published Author, Active player
(288)
Joined: 10/8/2006
Posts: 356
Mark my words, this is dead serious. This matter is nothing to joke around with. Everyone should take a deep breath and think about how much they want to be in this business, because the sacrifice will be huge and irreversible. Once you start making up new words, it really puts your life in perspective. There's no going back after this.
Experienced Forum User, Published Author, Active player
(288)
Joined: 10/8/2006
Posts: 356
Well, obviously it would have to be tailored for each game. Since you're only dealing with 2 different engines in this case, it should be easy. In Mega Man 3-6 (and many other Capcom games), RAM location $CF holds the mask for the channels that are currently playing sound effects, and I don't know about Mega Man 1-2 but there is probably a similar variable somewhere. The emulator can then output the channel or not depending on the bits that are set.