Posts for jlun2

Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
SuperMonkeypotato wrote:
jlun2 wrote:
I forgot to post, but the 2nd minigame with Ron seems to be RNG based during Ron's turn. He had different throw distances than the videos linked. Not sure how much time can it saved, but just posting it here.
I noticed that RNG constantly changes throughout his throw, so if you are able to control the distance he throws first throw, then you could manipulate his subsequent throws by changing the frame you throw.
Ok, tried some things: Pressing Up immediately on this minigame will knock Harry down once the gnome lands. This appears slower than pressing A,B,A then Up. I made some tests, using only 1 single Up press Start: 13201 Press Up - 13504 Press A, Up - 13474 Press A,B, Up - 13474 Press A,B,A, Up - 13478 Press A,B,A,B Up - 13484 Press A,B,A,B,A, Up - 13448 Press A,B,A,B,A,B Up - 13424 Press A,B,A,B,A,B,A Up - 13442 Press A,B,A,B,A,B,A,B Up - 13444 The fastest start to finish with Harry seems to be pressing A,B,A,B,A,B then UP. I'm going to try if throwing higher so it doesn't hop makes it even faster. Edit: Holding UP more seems to take longer. Also holding UP so that the gnome doesn't bounce seems to take far too long as well. Also this is probably not what you had in mind about new glitches, but this happened: http://imgur.com/ibT6Dnk Edit2: Nothing related to the TAS, but the furtherest distance I got was 2057:http://imgur.com/YvIO7CJ
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Nice improvement, but by now the gameplay is pretty much almost non-existent. I can't really say I was "entertained" due to the mostly incomprehensible run, so I voted no, but please do not take offense on that or anything. I still think runs like this should be published for record keeping, but in terms of entertainment its rather hard to grasp what's going on.
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Thanks! Also, every now and then, for the latest BizHawk version, the hotkeys for poking and freezing a RAM watch/search address, control+P and control+F doesn't seem to work after a while. It works initially however. Anyone else have this problem? Edit: Closing, then reopening both seems to make it work again.
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
I'm not sure if this is related to BizHawk or the individual GBA cores, but for some reason, in Keitai Denjuu Telefang 2 - Speed, the chest here http://imgur.com/a/n5Y1p On the area to the right of the first village, whenever I use vba-next core, freezing the address in IWRAM associated with said chest's item (0x358C or 0x360C, may hop around elsewhere), it changes the item along with the sprite that shows up too. On mgba, it changes the item obtained, but the sprite remains the same as the original item in the chest. In other words, freezing the same value, on the same occasion, but on different cores give different (visual) results. Anyone else have this happened?
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Hey, since this is published now, if any of the TASers ever update the submission text, can they please post here so me (and likely others who follow this thread) can get notified?
Post subject: Re: 1.11.9 Released
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
adelikat wrote:
Version 1.11.9 has been released! Changelog: http://tasvideos.org/Bizhawk/ReleaseHistory.html#Bizhawk11191 Downloads: https://github.com/TASVideos/BizHawk/releases/tag/1.11.9.1 This release fixes mGBA memory domain reading. There is some nice additions to NESHawk including VS support! Also, as usual, lot's of improvements to TAStudio as well.
Sorry, but is it just me or is the download link dead? Edit: Ok, downloaded from http://tasvideos.org/Bizhawk/ReleaseHistory.html#Bizhawk11191 Edit2: Ok, for real, this is what I did. 1. Open BizHawk 1.11.9.1 2. Open the Rom Keitai Denjuu Telefang 2 - Speed (Japan).gba 3. Load this savestate https://drive.google.com/file/d/0B-2O13fpsnI4ZlNlZ3ZZOC1sYUk/view?usp=sharing (either drag it or place it on folder) 4. Press "A" to start the battle 5. Press "A" to get into battle: 6. Click the menu bar -> GBA -> GPU Viewer 7. Click the "sprites" under "available widgets, then click "refresh" button. You should get this: It doesn't occur when the trainer occurs; only once the monster is summoned. No idea why. Edit3: Works fine on VBA-next, so it's mgba core. Edit4: Viewing tiles in the mgba emulator itself (not BizHawk) seems fine. Hm.
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Masterjun wrote:
Or you just save the script file in UTF-8 encoding and later open the created file in UTF-8 encoding, too. Sounds easier doesn't it? Btw, in Lua 5.3 you can insert a specific UTF-8 encoding of a Unicode character into a string by using the escape \u{XXX} where XXX are one or more hexadecimal digits. It also provides a native utf8 library with for example utf8.char().
Oh thanks! And the reason I'm doing this is because I want to output certain stats of a japanese game into a text file so I can copy paste it to another site.
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Sorry to bother again, but how do I save a text file as unicode encoding? Right now, if I had a line such as
local file = io.open("test.txt", "w+")
io.output(file)
io.write("(ドーン)")
io.close(file)
Opening back the test.txt file gives (???). How do I save the text file using lua as unicode encoded? Edit: I did it. At the beginning of the file write this:
io.write("\239\187\191")
This saves as UTF-8. Open a new text file in notepad or whatever and copy paste the unicode character. Now save that as UTF-8. Open in a hex editor and see how it looks like. It should appear after the bytes "EF BB BF". In my case, ドーン corresponds to. "E3 83 89 E3 83 BC E3 83 B3". Change every byte to decimal, and escape them as /ddd where d is a digit. For instance, "E3 83 89 E3 83 BC E3 83 B3" becomes "\227\131\137\227\131\188\227\131\179". Do that for every single unicode character you wish to encode. So the code for instance would now look like this
local file = io.open("test.txt", "w+")
io.output(file)
io.write("\239\187\191(\227\131\137\227\131\188\227\131\179)")
io.close(file)
This outputs a txt file that shows (ドーン).
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
SuperMonkeypotato wrote:
Yes, the first fight will require 3 crits without healing, unless you grab the Wiggenweld Grand before the fight. It is in the window going on the first left turn going to the fight. That is the only other thing that I can think of, the only thing that is bad about it is that it doesn't advance RNG during the fight, so you have plan it properly.
Sorry for the silence, but I noticed something about the RNG. The RNG address you found, when frozen to a specific value, gives different outcomes than when changed to said value, but not frozen. Example: Right before the knight boss, I frozed the RNG at 6407 (little endian). The knight attacks Ron and hits 36 damage. I reload the savestate, and this time, change the value back to 6407, before the knight attacks. This time, I don't freeze it at 6407. The knight then hits Ron at 34 damage instead. Both times this was at the first turn, when the Knight strikes first. This also affects criticals; freezing the RNG address at a value may give a crit but does not when it's at the same value, but allowed to advance. Probably something else also affects hits. Edit: Oh, and I also froze the values around the RNG, and this still occurs.
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
https://dolphin-emu.org/blog/2016/12/01/dolphin-progress-report-november-2016/
The biggest news of the month regarding Wii emulation has nothing to do with Dolphin. The vehicle for many of our hardware tests and much, much more, The Homebrew Channel, has gone open source. In its heyday, it was stuffed to the brim with anti-reverse engineering code to prevent nefarious entities from selling the free program. Unfortunately, some of those tricks were also designed to prevent Dolphin from running it. This isn't due to a dislike of Dolphin; in recent years, we've even been tipped off to what we'd need to do to get past the anti-Dolphin checks. On the 22nd of November, Marcan of Hackmii.com released the Homebrew Channel as an open source application, removed the anti-emulation hooks, and fixed a few bugs in Dolphin so that it could run properly! Nearly a decade after its inception, the homebrew channel is finally emulated! Admittedly, it has very little use for Dolphin, but, it is extremely cool to have. Some packed Wii homebrew elfs (such as Not64, openTTD) will only run in Dolphin from the homebrew channel currently. This is due to Dolphin being unable to detect them as Wii homebrew.
I know the anti-emulation hooks were removed, but how did it work and why did it worked? Just curious, since it seems like there's something that makes the emulator noticeablely different enough from the console to be detectable.
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
I just found this https://en.wikipedia.org/wiki/Intergalactic_travel#Time_dilation https://www.youtube.com/watch?v=N7gGbTBJLgw&t=32m53s So if you can travel billions of years into the future like that, how long would it take travelling near light speed to witness the potential end of the universe? Would the ship even survive that? Edit: Online results gave https://m.reddit.com/r/askscience/comments/xc0u4/will_humans_be_able_to_witness_the_end_of_the/ Which doesn't answer it, and https://www.quora.com/If-I-travel-at-light-speed-do-I-instantly-reach-the-end-of-times which also never mentions it, since it keeps considering "at light speed" rather than approaching light speed.
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
I believe I found where enemy HP addresses are stored. For some reason, just like the first game, it's mirrored several locations in System Bus, but only changing certain addresses in WRAM actually affects it. Unlike the original game however, it seems the location of the "real" address moves around every battle in WRAM. Actually, it appears to be the same 3 addresses. Just that the enemies from the same spot may use either 3. Example mirror address in WRAM 0x0572 Example mirror address in System Bus 0xC572, 0xE572 At least now I know the first boss has 100 HP now. Edit:"Real" addresses in WRAM 0x5082, 0x5069, 0x5050
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
I forgot to post, but the 2nd minigame with Ron seems to be RNG based during Ron's turn. He had different throw distances than the videos linked. Not sure how much time can it saved, but just posting it here.
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Found some glitches: http://imgur.com/a/vb42z Talking + First encounter, and grabbing a wizard card just as Floo Powder cutscene starts. Edit: Skip Hagrid getting you out of Knock turn Alley by pausing then unpausing. Edit 2: It appears the first boss may need 3 critical hits to defeat without healing. The RNG values seems to never decrement outside looping, so it may be possible to check all near values for RNG to see if 3 crits are close.
Post subject: Harry Potter and the Chamber of Secrets
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
This was requested, and apparently there's a route of it for a TAS, so I'll use this thread to put some findings here. Known glitches: *New game stat smuggle https://www.youtube.com/watch?v=DyDmD-ocSPs *Getting Ron to the last boss https://www.youtube.com/watch?v=Dv4hFya5wsE *Burrow cutscene skip https://www.youtube.com/watch?v=R40BX0YzPY0 *Nick cutscene skip https://www.youtube.com/watch?v=wD78ZgszSBs *McGonagall cutscene skip https://www.youtube.com/watch?v=Ta_Rjz2cOo8 *Cutscene thing https://www.youtube.com/watch?v=GjufoyTP8b8 *Pausing before a cutscene still messes things up (opening menus causes softlock) *If the enemy is faster than you, you can skip their turn by attempting to run, fail, then press "A" on their turn. Turboing allows you to even skip your partners turn. Addresses: System Bus: CD54 - Unsigned 2 byte big endian - Message countdown (0 allows you to press A) CE4B to 0xCE56 - Binary, Flags for Folio Bruti unlocks FFD0 - Game state? Similar to the prequel, changing to certain values gives a CHEAT menu. https://tcrf.net/Harry_Potter_and_the_Chamber_of_Secrets_(Game_Boy_Color)#CHEAT_menus FFD8 - Unsigned 1 byte, Map ID WRAM: 0B56 - Unsigned 2 byte - First minigame timer 0E3E - Unsigned 2 byte little? endian - RNG 0C36 - Unsigned 1 byte - Counter to next enemy spawn 06AE - Unsigned 1 byte - Hitsplat digit color (can be either 1's or 10's digit) 0692 - Unsigned 1 byte - Hitsplat digit number corresponding to above 065E - Unsigned 1 byte - Hitsplat digit color (can be either 1's or 10's digit) 063E - Unsigned 1 byte - Hitsplat digit number corresponding to above 05EA - Unsigned 1 byte - Hitsplat digit color (can be either 1's or 10's digit) 0606 - Unsigned 1 byte - Hitsplat digit number corresponding to above 5050 - Hp1 NPC. Also exists in 0572 WRAM, and C572, E572 in System Bus, but changing them don't seem to do anything. Note: Digit colors can be used for scripts to detect if a crit or miss has landed. Crits are red colored with value of 2, and miss has value of 3. To get the actual number, use either 0BCA, 061A in WRAM instead. The X/Y addresses seems to be all over the place. A simple search for Y in system bus gave: C2D8, C2DC, C2E6, CABB, CABD, CD74, CDBB, E2D8, E2DC, E2E6, EABB, EABD, ED74, EDBB. Changing any one of them all work for some reason. For partners maybe? Edit: Thanks for SuperMonkeypotato for providing details on routes, some addresses, glitches, etc. Download hpcs.lua
Language: lua

memory.usememorydomain("System Bus") local addresses = { --WRAM npc_top_id = 0x504B, npc_top_max_hp = 0x504C, npc_top_cur_hp = 0x5050, npc_mid_id = 0x5064, npc_mid_max_hp = 0x5065, npc_mid_cur_hp = 0x5069, npc_bottom_id = 0x507D, npc_bottom_max_hp = 0x507E, npc_bottom_cur_hp = 0x5082, --System Bus x = 0xC2D4, y = 0xC2D7, rng = 0x0E3E, message_countdown = 0xCD54, folio_bruti_start = 0xCE4B, folio_bruti_end = 0xCE56, frame = 0xFFC3, second = 0xFFC4, minute = 0xFFC5, game_state = 0xFFD0, area = 0xFFD8 } local drawtext = gui.drawText function text(x, y, message, font) local font = (font == nil) and 10 or font drawtext(x, y, message,nil,nil,font,nil,nil) end local npc_offset = 0x19 function display_battle() --[[ Game states for battle: 25 using cards 26 choose action (spell, thing, item, run, folio bruti) 27 choose spell 28 choose spell version 29 choose item 30 using an item 31 run 32 pack rat? 33 npc attacking 34 select npc + attack 35 win screen 36 select team mate 39 scabbers attack 47 card attack ]]-- local line = "" local start_adr = addresses.npc_top_id local offset = 10 for i = 0,2 do local id = memory.read_u8(start_adr+(npc_offset*i),"WRAM") local max_hp = memory.read_s16_le(start_adr+(npc_offset*i)+1,"WRAM") local current_hp = memory.read_s16_be(start_adr+(npc_offset*i)+4,"WRAM") line = "E"..(i+1).." ".." ID:"..id.." HP:"..current_hp.."/"..max_hp text(0,offset,line) offset = offset + 10 end end while true do local x = string.format('%.6f',memory.read_u24_le(addresses.x)/4096.0) local y = string.format('%.6f',memory.read_u24_le(addresses.y)/4096.0) local game_state = memory.read_u8(addresses.game_state) text(0,50,"State "..memory.readbyte(addresses.game_state)) text(0,60,"RNG"..memory.read_u16_le(addresses.rng,"WRAM")) text(0,80,memory.readbyte(addresses.minute)..":"..memory.readbyte(addresses.second)..":"..memory.readbyte(addresses.frame)) if game_state >= 25 or game_state <= 47 then display_battle() else text(0,30,"X"..x.."Y"..y) text(0,40,"MSG"..memory.read_s16_be(addresses.message_countdown)) end emu.frameadvance() end
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
MUGG wrote:
So NPC clipping is looking useless in Mountain Village as well. That was the last promising place. I'm feeling safe about starting TAS v2 now, just waiting for Bizhawk 1.11.9.
I remembered you posted about 1.11.8.2's RAM watch/lua being broken. It seems to work in the interim build at the moment for both cores, if that's the problem. 🙂
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Just posting this here: Post #444142
FatRatKnight wrote:
An unexpected (but also minor) one came up near the end, when the game skipped the HP increase text on level up. I have no clue how it happened, but it did save a few more seconds (and looks funny) ...
At around frame 279000, the TAS crashes the game under FCEUX 2.2.3 now. Curious if this glitch has something to do with a well-timed interrupt and some timing changes between FCEUX 2.1.3 and 2.2.3
I wonder how BizHawk and console behaves in that case?
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Not related to the TAS, but helps a lot to beat the game quickly Download telefang2 hotkeys.lua
Language: lua

memory.usememorydomain("IWRAM") --function for checking an input with how many frames to delay function inputdelay(inputs, delay) local is = input.get() local start = false if inputs ~= nil and (is[tostring(inputs)] ~=nil) then --console.log(is) --debugging while (delay > 0) do emu.frameadvance() delay = delay -1 end start = true return start end return start end --Check if power or speed version; they have addresses in different places function version() if memory.read_u32_le(0x0000A8,"ROM") == 0x574F5032 then return "Power" elseif memory.read_u32_le(0x0000A8,"ROM") == 0x45505332 then return "Speed" else return "NA" end end local Speed = { Player_X = 0x4CF8, Player_Y = 0x4CFC, State = 0x042C, Recruit = 0x4102 } local Power = { Player_X = 0x4D08, Player_Y = 0x4D0C, State = 0x043C, Recruit = 0x4112 } while true do local Addresses local x local y while version() ~= "NA" do Addresses = (version() == "Power" and Power or Speed) if inputdelay("C",30) then memory.writebyte(Addresses.State,7) --Instant recruit elseif inputdelay("V",30) then memory.writebyte(Addresses.State,8) --Instant win (5 for xp, 8 for item interface) end if (joypad.getimmediate().L == true) then if (joypad.getimmediate().Left == true) then x = memory.read_u32_le(Addresses.Player_X)-65536*3 elseif (joypad.getimmediate().Right == true) then x = memory.read_u32_le(Addresses.Player_X)+65536*3 else x = memory.read_u32_le(Addresses.Player_X) end if (joypad.getimmediate().Down == true) then y = memory.read_u32_le(Addresses.Player_Y)+65536*3 elseif (joypad.getimmediate().Up == true) then y = memory.read_u32_le(Addresses.Player_Y)-65536*3 else y = memory.read_u32_le(Addresses.Player_Y) end memory.write_u32_le(Addresses.Player_X,x) memory.write_u32_le(Addresses.Player_Y,y) end gui.text(0,20,"For keyboard: C:Recruit V: Win") gui.text(0,40,"For joypad: Hold L: Walk thru walls") gui.drawText(0,140,"Recriut (ID):"..memory.readbyte(Addresses.Recruit),null,null,10,null,null) emu.frameadvance() end end
Basically allows to skip battles, recruit anyone, and walk through walls. Still need to make the recruit part better so it won't freeze out of battle + recruit denjuu 2 & 3, not just 1. Edit 2: Here's another lua file that has nothing to do with the TAS, but can generate tables of the battles for wikis: Download telefang2 table.lua
Language: lua

memory.usememorydomain("IWRAM") --function for checking an input with how many frames to delay function inputdelay(inputs, delay) local is = input.get() local start = false if inputs ~= nil and (is[tostring(inputs)] ~=nil) then --console.log(is) --debugging while (delay > 0) do emu.frameadvance() delay = delay -1 end start = true return start end return start end --Check if power or speed version; they have addresses in different places function version() if memory.read_u32_le(0x0000A8,"ROM") == 0x574F5032 then return "Power" elseif memory.read_u32_le(0x0000A8,"ROM") == 0x45505332 then return "Speed" else return "NA" end end local Speed = { Enemy = {0x41F2,0x422A,0x4262}, Boss = 0x2888 } local Power = { Enemy = {0x4202,0x423A,0x4272}, Boss = 0x2898 } --IDs to Picture Book numbers local Picture_Book = { [0] = 15,[1] = 16,[2] = 17,[3] = 176,[4] = 177,[5] = 18,[6] = 19,[7] = 20,[8] = 21,[9] = 22, [10] = 23,[11] = 24,[12] = 25,[13] = 26,[14] = 27,[15] = 28,[16] = 29,[17] = 30,[18] = 31,[19] = 32, [20] = 37,[21] = 38,[22] = 39,[23] = 40,[24] = 33,[25] = 34,[26] = 35,[27] = 36,[28] = 41,[29] = 42, [30] = 43,[31] = 44,[32] = 45,[33] = 46,[34] = 47,[35] = 48,[36] = 49,[37] = 178,[38] = 179,[39] = 180, [40] = 50,[41] = 51,[42] = 52,[43] = 53,[44] = 54,[45] = 55,[46] = 56,[47] = 57,[48] = 58,[49] = 59, [50] = 60,[51] = 61,[52] = 62,[53] = 63,[54] = 64,[55] = 65,[56] = 66,[57] = 67,[58] = 68,[59] = 69, [60] = 70,[61] = 71,[62] = 72,[63] = 73,[64] = 74,[65] = 75,[66] = 76,[67] = 77,[68] = 78,[69] = 79, [70] = 80,[71] = 81,[72] = 82,[73] = 83,[74] = 84,[75] = 85,[76] = 86,[77] = 87,[78] = 181,[79] = 182, [80] = 183,[81] = 184,[82] = 185,[83] = 186,[84] = 187,[85] = 88,[86] = 89,[87] = 90,[88] = 188,[89] = 189, [90] = 190,[91] = 191,[92] = 192,[93] = 193,[94] = 91,[95] = 92,[96] = 93,[97] = 94,[98] = 194,[99] = 195, [100] = 95,[101] = 96,[102] = 97,[103] = 98,[104] = 99,[105] = 100,[106] = 101,[107] = 102,[108] = 103,[109] = 196, [110] = 197,[111] = 104,[112] = 105,[113] = 106,[114] = 107,[115] = 108,[116] = 109,[117] = 110,[118] = 111,[119] = 112, [120] = 113,[121] = 114,[122] = 115,[123] = 116,[124] = 117,[125] = 118,[126] = 119,[127] = 120,[128] = 121,[129] = 122, [130] = 123,[131] = 124,[132] = 125,[133] = 198,[134] = 199,[135] = 126,[136] = 127,[137] = 128,[138] = 129,[139] = 130, [140] = 131,[141] = 132,[142] = 133,[143] = 134,[144] = 135,[145] = 136,[146] = 137,[147] = 138,[148] = 139,[149] = 140, [150] = 141,[151] = 142,[152] = 143,[153] = 144,[154] = 145,[155] = 146,[156] = 147,[157] = 148,[158] = 149,[159] = 150, [160] = 151,[161] = 152,[162] = 153,[163] = 154,[164] = 155,[165] = 156,[166] = 157,[167] = 158,[168] = 159,[169] = 160, [170] = 161,[171] = 162,[172] = 163,[173] = 164,[174] = 165,[175] = 166,[176] = 167,[177] = 168,[178] = 169,[179] = 170, [180] = 0,[181] = 1,[182] = 2,[183] = 3,[184] = 4,[185] = 5,[186] = 6,[187] = 7,[188] = 8,[189] = 9, [190] = 10,[191] = 11,[192] = 12,[193] = 13,[194] = 14,[195] = 171,[196] = 172,[197] = 173,[198] = 174,[199] = 175} --Attack names local Attacks = { [0] = "????",[1] = "Spark",[2] = "Falling Star",[3] = "Pillar of Fire",[4] = "Small Fire",[5] = "Will-o\'-the-Wisp",[6] = "Flame Shot",[7] = "Raging Fire",[8] = "Fire Wheel",[9] = "Disk Cutter", [10] = "Wheel",[11] = "Chainsaw",[12] = "Drill",[13] = "Rocket Punch",[14] = "Twin Drill",[15] = "Rotation Cutter",[16] = "Spiral Cutter",[17] = "Waterfall",[18] = "Soap Ball",[19] = "Water Drop", [20] = "Water Gun",[21] = "Wave Crash",[22] = "Squall",[23] = "Icicle Trap",[24] = "Watersprout",[25] = "Rock Claw",[26] = "Boulder Roll",[27] = "Sand Vortex",[28] = "Boulder Ball",[29] = "Boulder Avalanche",[30] = "Shake-Out", [31] = "Falling Rocks",[32] = "Small Quake",[33] = "Vaccum Cutter",[34] = "Shock Wave",[35] = "Whirlwind",[36] = "Gust",[37] = "Flap",[38] = "Tornado",[39] = "Gale", [40] = "Kamaitachi",[41] = "Ion Ball",[42] = "Positive Electricity",[43] = "Electric Claw",[44] = "Discharge",[45] = "Electric Shock",[46] = "Electric Arrow",[47] = "Big Electric Current",[48] = "Electric Field",[49] = "Claw", [50] = "Iron Claw",[51] = "Scales",[52] = "Ring",[53] = "Bite",[54] = "Beak",[55] = "Kicking",[56] = "Continuous Kicking",[57] = "Sabre",[58] = "Tail",[59] = "Suddenness (1)", [60] = "Suddenness (2)",[61] = "Jump",[62] = "Tentacle",[63] = "Numb Tentacle",[64] = "Body Blow",[65] = "Spit Spray",[66] = "Headbutt",[67] = "Suddenness (3)",[68] = "Horn",[69] = "Iron Horn", [70] = "Wing",[71] = "Thorn",[72] = "Rush",[73] = "Drain",[74] = "Bloodsuck",[75] = "Strike",[76] = "Razor Punch",[77] = "Hammer Punch",[78] = "Lick",[79] = "Needle", [80] = "Suddenness (4)",[81] = "Scissors",[82] = "Petal",[83] = "Feather Sabre",[84] = "Feather Knife",[85] = "Acupuncture",[86] = "Poison Sting",[87] = "Numbing Sting",[88] = "Hoof",[89] = "Suddenness (5)", [90] = "Suddenness (6)",[91] = "Whiplash",[92] = "Electric Wire",[93] = "Digestive Fluids",[94] = "Melting Fluids",[95] = "Stab",[96] = "Continuous Stab",[97] = "Ice Rock",[98] = "Big Wave",[99] = "Whirling Tides", [100] = "Ice Bullet",[101] = "Blizzard",[102] = "Big Water Pressure",[103] = "Big Tsunami",[104] = "Ion Beam",[105] = "Small Bolt",[106] = "Plasma Laser",[107] = "Lightning Strike",[108] = "Thunder Storm",[109] = "Mega Bolt", [110] = "Electric Hell",[111] = "Ibo Ibo Missile",[112] = "Gatling Gun",[113] = "Rapid-Fire Missile",[114] = "Bazooka",[115] = "Drill Missile",[116] = "Homing Missile",[117] = "Bombing",[118] = "Wave Attack",[119] = "Aura Wave", [120] = "Sandstorm",[121] = "Big Stream Pressure",[122] = "Vacuum Hole",[123] = "Hurricane",[124] = "Black Hole",[125] = "Heat Beam",[126] = "Small Burn",[127] = "Small Flame",[128] = "Flamethrower",[129] = "Fire Breath", [130] = "Big Burn",[131] = "Suddenness (7)",[132] = "Bomb Rock",[133] = "Small Rock",[134] = "Sand Prison",[135] = "Mega Quake",[136] = "Mega Rock",[137] = "Meteor Drop",[138] = "Diamond Rain",[139] = "Mushroom Bomb", [140] = "Egg Bomb",[141] = "Bomb",[142] = "Wave Beam",[143] = "Beam Light",[144] = "Blaster",[145] = "Suicide Attack",[146] = "String Discard",[147] = "Adhesive Liquid",[148] = "Smokescreen",[149] = "Flash", [150] = "Dust Cloud",[151] = "Recovery",[152] = "Big Recovery",[153] = "Shout",[154] = "Stare",[155] = "Glare",[156] = "Quick Step",[157] = "Speed Up",[158] = "Charging",[159] = "Big Charging", [160] = "Ultrasonic",[161] = "Curse Song",[162] = "Iron Defense",[163] = "Venom",[164] = "Poison Gas",[165] = "Numb Gas",[166] = "Cure",[167] = "Alarm Clock",[168] = "Roar",[169] = "Hot Wind", [170] = "Shrill Voice",[171] = "Cold Air",[172] = "Sleep Gas",[173] = "Lullaby",[174] = "Meditate",[175] = "Denma Barrier",[176] = "Persist",[177] = "Support",[178] = "Defense",[179] = "Shield", [180] = "Blessing",[181] = "Contemplate",[182] = "Hide",[183] = "Dive",[184] = "Skin Thicken",[185] = "Avoid",[186] = "Spore Shed",[187] = "Tongue Sticking Out",[188] = "Provoke",[189] = "Denma Seal", [190] = "Denma Drain",[191] = "Twister Song",[192] = "Energy Break",[193] = "Mega Break",[194] = "Count Down",[195] = "Strawberry Kiss",[196] = "Injection Plug",[197] = "Deflation Spiral",[198] = "Hot Bath",[199] = "Nove Smasher"} --List of Denjuu by names, sorted by Index local Denjuu = { [0] = "[[Muscovy (Basic)]]",[1] = "[[Muscovy (Natural)]]",[2] = "[[Muscovy (Aquatic)]]",[3] = "[[Major (Basic)]]",[4] = "[[Major (Grassland)]]",[5] = "[[Fraby (Basic)]]",[6] = "[[Fraby (Mountain)]]",[7] = "[[Fraby (Sky)]]",[8] = "[[Kagu (Basic)]]",[9] = "[[Kagu (Natural)]]", [10] = "[[Purchera (Basic)]]",[11] = "[[Purchera (Sky)]]",[12] = "[[Purchera (Forest)]]",[13] = "[[Mentalis (Basic)]]",[14] = "[[Mentalis (Natural)]]",[15] = "[[Mentalis (Forest)]]",[16] = "[[Mentalis (Grassland)]]",[17] = "[[Karinota (Basic)]]",[18] = "[[Karinota (Grassland)]]",[19] = "[[Karinota (Mountain)]]", [20] = "[[Chukar (Basic)]]",[21] = "[[Chukar (Natural)]]",[22] = "[[Chukar (Mountain)]]",[23] = "[[Chukar (Aquatic)]]",[24] = "[[Laperouse (Basic)]]",[25] = "[[Laperouse (Natural)]]",[26] = "[[Laperouse (Desert)]]",[27] = "[[Laperouse (Grassland)]]",[28] = "[[Anpipitto (Basic)]]",[29] = "[[Anpipitto (Sky)]]", [30] = "[[Anpipitto (Desert)]]",[31] = "[[Ruficors (Basic)]]",[32] = "[[Ruficors (Grassland)]]",[33] = "[[Ruficors (Aquatic)]]",[34] = "[[Cotta (Basic)]]",[35] = "[[Cotta (Natural)]]",[36] = "[[Cotta (Desert)]]",[37] = "[[Rupicola (Basic)]]",[38] = "[[Rupicola (Grassland)]]",[39] = "[[Rupicola (Sky)]]", [40] = "[[Willcock (Basic)]]",[41] = "[[Willcock (Natural)]]",[42] = "[[Willcock (Forest)]]",[43] = "[[Skrippa (Basic)]]",[44] = "[[Skrippa (Aquatic)]]",[45] = "[[Cabot (Basic)]]",[46] = "[[Cabot (Natural)]]",[47] = "[[Makyuretto (Basic)]]",[48] = "[[Makyuretto (Natural)]]",[49] = "[[Makyuretto (Grassland)]]", [50] = "[[Makyuretto (Forest)]]",[51] = "[[Coronet (Basic)]]",[52] = "[[Coronet (Aquatic)]]",[53] = "[[Coronet (Grassland)]]",[54] = "[[Tataupa (Basic)]]",[55] = "[[Tataupa (Desert)]]",[56] = "[[Tataupa (Forest)]]",[57] = "[[Chigomozu (Basic)]]",[58] = "[[Chigomozu (Natural)]]",[59] = "[[Koikaru (Basic)]]", [60] = "[[Koikaru (Natural)]]",[61] = "[[Koikaru (Forest)]]",[62] = "[[Pewee (Basic)]]",[63] = "[[Pewee (Natural)]]",[64] = "[[Pewee (Aquatic)]]",[65] = "[[Pewee (Mountain)]]",[66] = "[[Chapmani (Basic)]]",[67] = "[[Chapmani (Natural)]]",[68] = "[[Hyuming (Basic)]]",[69] = "[[Hyuming (Natural)]]", [70] = "[[Hyuming (Mountain)]]",[71] = "[[Pamirio (Basic)]]",[72] = "[[Pamirio (Natural)]]",[73] = "[[Pamirio (Sky)]]",[74] = "[[Pamirio (Desert)]]",[75] = "[[Mistashi (Basic)]]",[76] = "[[Mistashi (Forest)]]",[77] = "[[Mistashi (Aquatic)]]",[78] = "[[Parrotto (Basic)]]",[79] = "[[Parrotto (Natural)]]", [80] = "[[Nebularia (Basic)]]",[81] = "[[Nebularia (Natural)]]",[82] = "[[Granti (Basic)]]",[83] = "[[Granti (Nautral)]]",[84] = "[[Granti (Desert)]]",[85] = "[[Penelope (Basic)]]",[86] = "[[Penelope (Aquatic)]]",[87] = "[[Penelope (Mountain)]]",[88] = "[[Ardea (Basic)]]",[89] = "[[Ardea (Natural)]]", [90] = "[[Ardea (Forest)]]",[91] = "[[Cerator (Basic)]]",[92] = "[[Cerator (Natural)]]",[93] = "[[Cerator (Mountain)]]",[94] = "[[Alpina (Basic)]]",[95] = "[[Alpina (Natural)]]",[96] = "[[Alpina (Aquatic)]]",[97] = "[[Alpina (Sky)]]",[98] = "[[Isuka (Basic)]]",[99] = "[[Isuka (Grassland)]]", [100] = "[[Bicolour (Basic)]]",[101] = "[[Bicolour (Natural)]]",[102] = "[[Hermit (Basic)]]",[103] = "[[Hermit (Natural)]]",[104] = "[[Hermit (Desert)]]",[105] = "[[Hermit (Grassland)]]",[106] = "[[Phoebe (Basic)]]",[107] = "[[Phoebe (Aquatic)]]",[108] = "[[Phoebe (Desert)]]",[109] = "[[Blossom (Basic)]]", [110] = "[[Blossom (Mountain)]]",[111] = "[[Rabricol (Basic)]]",[112] = "[[Rabricol (Natural)]]",[113] = "[[Rabricol (Aquatic)]]",[114] = "[[Demerus (Basic)]]",[115] = "[[Demerus (Natural)]]",[116] = "[[Demerus (Desert)]]",[117] = "[[Sparsa (Basic)]]",[118] = "[[Sparsa (Natural)]]",[119] = "[[Sparsa (Forest)]]", [120] = "[[Purprea (Basic)]]",[121] = "[[Purprea (Sky)]]",[122] = "[[Purprea (Grassland)]]",[123] = "[[Etopirika (Basic)]]",[124] = "[[Etopirika (Natural)]]",[125] = "[[Etopirika (Forest)]]",[126] = "[[Regulus (Basic)]]",[127] = "[[Regulus (Desert)]]",[128] = "[[Regulus (Sky)]]",[129] = "[[Akretto (Basic)]]", [130] = "[[Akretto (Natural)]]",[131] = "[[Akretto (Grassland)]]",[132] = "[[Akretto (Mountain)]]",[133] = "[[Seiran (Basic)]]",[134] = "[[Seiran (Mountain)]]",[135] = "[[Tectus (Basic)]]",[136] = "[[Tectus (Natural)]]",[137] = "[[Serrata (Basic)]]",[138] = "[[Serrata (Sky)]]",[139] = "[[Serrata (Forest)]]", [140] = "[[Kaya (T2)]]",[141] = "[[Beebalm (T2)]]",[142] = "[[Easydog (T2)]]",[143] = "[[Ruscus (T2)]]",[144] = "[[Ryuuguu (T2)]]",[145] = "[[Kanzou (T2)]]",[146] = "[[Ornithogalum (T2)]]",[147] = "[[Teletel (T2)]]",[148] = "[[Dendel (T2)]]",[149] = "[[Suguri (T2)]]", [150] = "[[Suguline (T2)]]",[151] = "[[Saiguliger (T2)]]",[152] = "[[Punica (T2)]]",[153] = "[[Punisto (T2)]]",[154] = "[[Oshe (T2)]]",[155] = "[[Barriarm (T2)]]",[156] = "[[Bashou (T2)]]",[157] = "[[Gentiana (T2)]]",[158] = "[[Gonum (T2)]]",[159] = "[[Gust (T2)]]", [160] = "[[Storm (T2)]]",[161] = "[[Tsunonasu (T2)]]",[162] = "[[Gigagigearth (T2)]]",[163] = "[[Liriope (T2)]]",[164] = "[[Lirimonarch (T2)]]",[165] = "[[Waratah (T2)]]",[166] = "[[Enteiou (T2)]]",[167] = "[[Gumi (T2)]]",[168] = "[[Gymnos (T2)]]",[169] = "[[Gymbaron (T2)]]", [170] = "[[Gymzyrus (T2)]]",[171] = "[[Gymzatan (T2)]]",[172] = "[[Angios (T2)]]",[173] = "[[Angigorgo (T2)]]",[174] = "[[Angipower (T2)]]",[175] = "[[Angioros (T2)]]",[176] = "[[Fungus (T2)]]",[177] = "[[Fungwar (T2)]]",[178] = "[[Funboost (T2)]]",[179] = "[[Funblade (T2)]]", [180] = "[[Rex (Basic)]]",[181] = "[[Rex (Natural-1)]]",[182] = "[[Rex (Desert)]]",[183] = "[[Rex (Forest)]]",[184] = "[[Rex (Natural-2)]]",[185] = "[[Doon (Basic)]]",[186] = "[[Doon (Natural-1)]]",[187] = "[[Doon (Sky)]]",[188] = "[[Doon (Aquatic)]]",[189] = "[[Doon (Natural-2)]]", [190] = "[[Gyuun (Basic)]]",[191] = "[[Gyuun (Natural-1)]]",[192] = "[[Gyuun (Aquatic)]]",[193] = "[[Gyuun (Forest)]]",[194] = "[[Gyuun (Natural-2)]]",[195] = "[[Diablos (Basic)]]",[196] = "[[Diablos (Natural-1)]]",[197] = "[[Diablos (Mountain)]]",[198] = "[[Diablos (Grassland)]]",[199] = "[[Diablos (Natural-2)]]"} while true do local Addresses while version() ~= "NA" do Addresses = (version() == "Power" and Power or Speed) if inputdelay("C",30) then local file = io.open("test.txt", "w+") io.output(file) --Write the top part first io.write("{|class=\"wikitable sortable\"\n! colspan=\"14\" | ID: "..memory.readbyte(Addresses.Boss).."\n|-\n! colspan=\"2\" | Name\n! colspan=\"4\" | Attacks\n! ID\n! Picture Book\n! Level\n! HP\n! Speed\n! Attack\n! Defence\n! Special\n") for i = 1,3 do --[[Offsets in decimal i+1 = LeveL i+3 = HP (Maximum) i+5 = Speed i+6 = Attack i+7 = Defence i+8 = Denma/Spec i+22 = Attack 1 i+30 = Attack 2 i+38 = Attack 3 i+46 = Attack 4 --]] if memory.readbyte(Addresses.Enemy[i]+1) > 0 then io.write("|-\n| "..Denjuu[memory.readbyte(Addresses.Enemy[i])].."<br>\n| Pic\n| "..Attacks[memory.readbyte(Addresses.Enemy[i]+22)].."\n| "..Attacks[memory.readbyte(Addresses.Enemy[i]+30)].."\n| "..Attacks[memory.readbyte(Addresses.Enemy[i]+38)].."\n| "..Attacks[memory.readbyte(Addresses.Enemy[i]+46)].."\n| "..memory.readbyte(Addresses.Enemy[i]).."\n| "..Picture_Book[memory.readbyte(Addresses.Enemy[i])].."\n| "..memory.readbyte(Addresses.Enemy[i]+1).."\n| "..memory.readbyte(Addresses.Enemy[i]+3).."\n| "..memory.readbyte(Addresses.Enemy[i]+5).."\n| "..memory.readbyte(Addresses.Enemy[i]+6).."\n| "..memory.readbyte(Addresses.Enemy[i]+7).."\n| "..memory.readbyte(Addresses.Enemy[i]+8).."\n") console.log("Done!\n") end end io.write("|}") io.close(file) emu.frameadvance() end emu.frameadvance() end emu.frameadvance() end
I can change this to the TASVideos wiki format later I guess.
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
What's a "good" way to assign values on the fly depending on the rom? Right now, this game has 2 versions: Power and Speed. The addresses for the former are basically the same as Speed version, but everything is +0x10 position-wise. Right now, I'm hopping back and forth between the 2 games, so I made while loops that check if one of the values in ROM say "SPEED/POWER", then copying the display code twice: Example:
Language: lua

while true do while version() == "Speed" do gui.text(0,45,"BOSS: "..memory.readbyte(Speed.Boss).." State: "..memory.readbyte(Speed.State)) gui.text(0,250,"MAP: "..memory.readbyte(Speed.Map).."("..string.format('%.6f',memory.read_u32_le(Speed.Player_X)/65536.0)..","..string.format('%.6f',memory.read_u32_le(Speed.Player_Y)/65536.0)..")") gui.text(0,265,"$: "..memory.read_u32_le(Speed.Money)) emu.frameadvance() end while version() == "Power" do gui.text(0,45,"BOSS: "..memory.readbyte(Power.Boss).." State: "..memory.readbyte(Power.State)) gui.text(0,250,"MAP: "..memory.readbyte(Power.Map).."("..string.format('%.6f',memory.read_u32_le(Power.Player_X)/65536.0)..","..string.format('%.6f',memory.read_u32_le(Power.Player_Y)/65536.0)..")") gui.text(0,265,"$: "..memory.read_u32_le(Power.Money)) emu.frameadvance() end emu.frameadvance() end
Is there a way such that I can make this more compact rather than copy-paste twice? Naively wrapping it into version() instead simply moves this code into that function, which doesn't solve it.
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Now I'm really curious how the 100%/completionist route would be like in a TAS. Also completely unrelated to the TAS, but over here https://youtu.be/HnxXJ5bT2SM?t=452 To the right of this block/floor, is a tiny wall and some chasm or whatever. I always wondered what's there exactly. I don't have the game on this computer atm, so can someone please use moonjump/free camera view and take a pic of that section? ☺️
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
ThunderAxe wrote:
Check out this site: http://datacrystal.romhacking.net Is an open wiki in which everyone can contribuite with info about ROM hacking for specifics games, and this includes editing tools, ROM addresses, RAM addresses, ROM hacking tutorials, etc. Everyone can contribute. If it's about TASing, we already have this forum and the main site for TASing info about specifics games, so I think there is no need for a new site after all.
Too bad it needs yet another account; From a simple glance on my list of passwords, I already have 30+ accounts on a variety of wikis/fansites/games/etc. This is a mess for me.
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Ok, since the submission notes never mentioned what does a kill screen in Tetris even do, a search gave these: https://www.youtube.com/watch?v=sTuGa60wt6A Also, this video for the NSTC version: https://www.youtube.com/watch?v=76DAwK3cL9w claims the following:
Meet Tetris's kill screen, Level 29! ... except in this game, I'm God. Take that, kill screen! Go shove your 1G without any good rotation system up your own arse! This is a hacked game played using savestates and rerecords and all that shit. Granted the leveling there in the original version too. I've done fairly close to this unassisted, and have lasted in Lv29+ for some time...
I'm not sure if rotation is disabled, or the pieces fall too fast to rotate in real time, but that's what I found so far.
Experienced Forum User, Published Author, Skilled player (1709)
Joined: 9/17/2009
Posts: 4952
Location: ̶C̶a̶n̶a̶d̶a̶ "Kanatah"
Alyosha wrote:
There is plenty of high level information about how the system works, so getting it into a usable state should be pretty easy. Unfortunately I can't find any info about low level things like cycle timing, so for now this will be high level emulation only and lack the real hard core accuracy of NESHawk and AtariHawk.
Sorry to derail, but how do people find this information? Are the high level specification(s) just posted online by devs or something? How about low level things? I recall reading that it has to be reverse engineered, but how? Given the physical console, how do people gleam this type of info? Not to mention if that's all that needs to be done (get console, get info, implement it) how come newer console emulation-wise it's relatively poor? Sorry if this sounds very noob-ish.