Posts for p4wn3r

1 2
13 14 15 34 35
Experienced Forum User, Published Author, Player (42)
Joined: 12/27/2008
Posts: 873
Location: Germany
thatguy wrote:
Just the other day I read an article pinning all the blame for the current tragedy in Venezuela on the west, which had been supposedly working to undermine Venezuela's sovereignty and bring down the Chavista revolution - all the usual tropes of the far-left conspiracy theorist were there, at one point it even called one of the Venezuelan opposition leaders a Zionist. It was all a pretty disgusting denial of the inconvenient truth.
That is extremely common to hear in South America. You can actually understand where it comes from by noting that the whole place was developed initially as an agrarian colony for the world's powers, which did not care about the region's industrialization until they realized they would gain a lot of money putting corporations there. In any case, I agree that Latin America is full of psychotic socialist regimes that blame everything on private companies, but there is more than enough evidence of US sponsored coup d'etát's in the entire region since at least the 50's, which simply allowed foreign companies to come in paying almost no tax and making work conditions horrible for everyone. The choice is not easy. Anyway, there is also manipulation on the other side, too. If you read magazines like Veja, pretty much every news involve how worker unions are a nuisance to the economy, government employees are extremely inefficient and gain money for doing nothing, everything should be privatized, while controversial policies like budget cuts to health services and education are simply not mentioned.
Experienced Forum User, Published Author, Player (42)
Joined: 12/27/2008
Posts: 873
Location: Germany
The page you link to says:
Wikipedia wrote:
In the strict sense, a well-defined function associates one, and only one, output to any particular input. The term "multivalued function" is, therefore, a misnomer because functions are single-valued.
and
Wikipedia wrote:
We can treat arctan as a single-valued function by restricting the domain of tan x to −π/2 < x < π/2 – a domain over which tan x is monotonically increasing. Thus, the range of arctan(x) becomes −π/2 < y < π/2.
What am I missing?
Experienced Forum User, Published Author, Player (42)
Joined: 12/27/2008
Posts: 873
Location: Germany
Warp wrote:
After all, what does "arctan(1)" mean? It means "what is the value for which the tan of that value gives 1?" There are infinitely many such values.
Arctan is a function, and the definition of a function requires a domain and an image, and that for every value in the domain, there is exactly one value assigned to it in the image set. The remark that there is an infinite number of values whose tangent is 1 only proves that the algebraic property "what is the value for which the tan of that value gives 1?" is not sufficient to define a function. In practice, we impose further restrictions to make the function easier to work with. One convenient choice is to make arctan a continuous function, and like thatguy said, if you use the definition of arctan(x) "what is the value between -pi/2 and pi/2 for which the tan of that value gives x?", then there is no ambiguity, and the function is continuous on the entire real line, and it's also an odd function, which might help to carry out some simplifications.
Warp wrote:
Likewise "0/0" means "what is the value which, when multiplied by 0, gives 0?" Likewise there are infinitely many such values.
Division must have the property that only one value satisfies the algebraic requirement. Otherwise, it is not a function, and this remark again only points out that division by 0 cannot be a function. The main difference with respect to arctan is that, in 0/0, continuity cannot help you to define this operation at all. That's because we can prove that if, in some limit x->a, we have continuous functions f(x) -> 0 and g(x) -> 0, then this says nothing about the limit f(x)/g(x) when x -> a. It can be 0, infinity, any other value, or not exist at all.
Experienced Forum User, Published Author, Player (42)
Joined: 12/27/2008
Posts: 873
Location: Germany
The concept which you are arriving is this: https://en.wikipedia.org/wiki/Branch_point The explanation from complex analysis for multiple definitions of ii, and also of the complex square root x1/2 is that it is impossible to define the complex function log(z) continuous everywhere. Any definition of log(z) must have a branch cut, where you find discontinuities. The theory behind this is very rich. For example, if instead of functions you consider multifunctions, you can make the image continuous and end up with a Riemann surface. The uniformization theorem guarantees that these surfaces must have constant curvature, so up to topological complications, there are only three types of Riemann surfaces, which correspond to the three possible geometries: Euclidean, elliptic and hyperbolic.
Experienced Forum User, Published Author, Player (42)
Joined: 12/27/2008
Posts: 873
Location: Germany
I'm not sure I understand what you mean by "more precisely", both formulas you provided are correct. Certainly, the second formula is more general than the first, since it reproduces the first formula when m=n=0. There are many ways that you could rewrite the formula using properties of trigonometric functions. For example: eix = 1 - 2sin2(x/2) + 2i sin(x/2)cos(x/2) The way you write the formula depends mostly on your intentions in your proof/exposition. If the periodicity of sine and cosine is important, for example if you want to study the analytic properties of eix, by all means make it explicit. Most of the time the formula is introduced, people are only interested in how to evaluate expressions with a complex exponent, and for this case, the first identity suffices. But again, it's an aesthetic choice, both formulas are correct.
Experienced Forum User, Published Author, Player (42)
Joined: 12/27/2008
Posts: 873
Location: Germany
My current plan is the following, in order of priority 1) Replace BizHawk's build system. In Linux we don't have Visual Studio, only MonoDevelop, which is a dumbed down version of it. MonoDevelop simply doesn't have some features that you use to make the code compile everywhere, and besides I will have to add makefiles for some cores anyway. 2) Compile cores, waterbox and non-waterbox. 3) Implement some tools that don't work, like Cheats and Trace Logger (not TAStudio), they can work by replacing some stuff with cross-platform implementations. 4) Implement Lua. After this is done, my idea is to set up an overlay with all the BizHawk code, patched cores, etc.
Experienced Forum User, Published Author, Player (42)
Joined: 12/27/2008
Posts: 873
Location: Germany
That's a complicated question! xD I think it is the last version before ver. 2 was released. I am not sure which version I pulled because I disable that annoying thing that generates the Version.cs file from SVN because I hate working with branches with git-svn... Anyway, my version is rather different. I have merged the waterbox2 branch into master and mono-portable, to start getting the waterbox cores to work. I haven't moved my repo forward to the TASvideos repo yet, I'll do that after I get a waterbox core working.
Experienced Forum User, Published Author, Player (42)
Joined: 12/27/2008
Posts: 873
Location: Germany
Today I updated my computer and BizHawk's compilation failed again, because when I changed the packages before, I did not do it in a way that would preserve updates. I will see if I can get libgdiplus-5.4 in gentoo, at least, to make this problem go away. Anyway, if anyone wants to compile this on Linux, I have redone everything in a cleaner way, and the following installation will work on Gentoo, and survive updates. Note: I am not doing this for other distributions, their packages are much harder to maintain, and it takes much more time to update their repos anyway. Let's go. Create a file named /usr/local/portage/dev-dotnet/libgdiplus-5.4.ebuild:
Language: python

# Copyright 1999-2017 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 EAPI=6 inherit eutils DESCRIPTION="Library for using System.Drawing with mono" HOMEPAGE="http://www.mono-project.com" LICENSE="MIT" SLOT="0" KEYWORDS="amd64 ~arm64 ppc ppc64 x86 ~amd64-linux ~x86-linux ~x86-solaris" SRC_URI="https://github.com/mono/libgdiplus/archive/5.4.tar.gz" IUSE="cairo" RDEPEND=">=dev-libs/glib-2.2.3:2 >=media-libs/freetype-2.3.7 >=media-libs/fontconfig-2.6 >=media-libs/libpng-1.4:0 x11-libs/libXrender x11-libs/libX11 x11-libs/libXt >=x11-libs/cairo-1.8.4[X] media-libs/libexif >=media-libs/giflib-5.1.2 virtual/jpeg:0 media-libs/tiff:0 !cairo? ( >=x11-libs/pango-1.20 )" DEPEND="${RDEPEND}" src_configure() { ./autogen.sh } src_install () { default dotnet_multilib_comply local commondoc=( AUTHORS ChangeLog README TODO ) for docfile in "${commondoc[@]}"; do [[ -e "${docfile}" ]] && dodoc "${docfile}" done [[ "${DOCS[@]}" ]] && dodoc "${DOCS[@]}" prune_libtool_files }
After that, add the following line to /etc/portage/make.conf:
PORTDIR_OVERLAY="/usr/local/portage"
Generate the build manifest using:
sudo ebuild /usr/local/portage/dev-dotnet/libgdiplus/libgdiplus-5.4.ebuild manifest
Now, update libgdiplus with
sudo emerge -av libgdiplus
This should work correctly, it won't override your version with the buggy one at the main repository, and in case they bump it to a newer version that works, the local ebuild will be ignored.
Experienced Forum User, Published Author, Player (42)
Joined: 12/27/2008
Posts: 873
Location: Germany
My very old laptop: Intel(R) Core(TM)2 Duo CPU T6670 @ 2.20GHz
User Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0
Vector	Block	Result	Duration
12	3	correct	130.49ms
13	3	correct	225.50ms
14	3	correct	429.62ms
15	3	correct	871.80ms
16	3	correct	1743.33ms
12	4	correct	231.77ms
13	4	correct	447.34ms
14	4	correct	891.32ms
15	4	correct	1804.36ms
16	4	correct	3590.02ms
12	5	correct	461.84ms
13	5	correct	918.92ms
14	5	correct	1895.99ms
15	5	correct	3749.47ms
16	5	correct	7713.79ms
Status: Done.
User Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/604.1 (KHTML, like Gecko) Version/11.0 Safari/604.1 Epiphany/3.22.7
Vector	Block	Result	Duration
12	3	correct	747.70ms
13	3	correct	633.60ms
14	3	correct	937.30ms
15	3	correct	1802.90ms
16	3	correct	3560.40ms
12	4	correct	379.10ms
13	4	correct	760.40ms
14	4	correct	1515.70ms
15	4	correct	3031.60ms
16	4	correct	5967.70ms
12	5	correct	765.60ms
13	5	correct	1531.60ms
14	5	correct	3057.00ms
15	5	correct	6118.20ms
16	5	correct	12235.60ms
Status: Done.
Experienced Forum User, Published Author, Player (42)
Joined: 12/27/2008
Posts: 873
Location: Germany
Stovent wrote:
About legal stuff, what is legal and what is not in creating an emulator ?
First of all, IANAL (I am not a lawyer). If you are in the United States, there are precedents that declare emulation of someone's hardware to be legal. However, in most cases it's necessary to provide some firmware to be able to run any program in the emulator, and distributing it together with your program would constitute copyright infringement. So, you either had to reimplement this firmware yourself, or just ship the program without it, telling the user to obtain it. One possible issue is that some technology in the hardware you are emulating could be patented, and then the manufacturer could, in principle, ask you to stop distributing the software, or demand that you pay royalties to him in order to keep distributing the program. If that happens and the patent was registered in the U.S., you might be able to get away without spending too much by hiring a lawyer to ask a judge to dismiss the case to immediately dismiss the case under Alice, but there is no guarantee that the judge will comply with this request, as it is subject to interpretation. In practice, though, copyright laws and patent related affairs everywhere require that the owner of the rights pursue in legal litigation against anyone who infringes them. That means if you receive a letter from someone claiming infringement, it's never the government telling you to do something, it's always a private entity, and that makes a huge difference. So, in principle, if you receive a letter claiming infringement, you can always reply with another one saying that you're sorry they think their rights are being violated, but that you are not doing anything wrong for whatever reason, and state that you will "troll them back" in court if they move forward. Even simple cases take years to be decided in court, and are very expensive for the people stating the claim, so I really don't see any copyright holder pushing forward unless you are hurting their sales by a significant margin. Since you want to write an emulator for a very old system, I would say you are safe.
Experienced Forum User, Published Author, Player (42)
Joined: 12/27/2008
Posts: 873
Location: Germany
I am not very familiar with TCG2, I am playing it now to understand the mechanics, one annoying thing is that I can't use Gameshark codes to get the cards I want because cheats don't work yet on the Linux port of BizHawk. Someone (in this case, me) should fix this soon. But it seems like the glitch should work with Dark Golbat, when it knocks out the opponent's last Pokémon. I'll try to set things up and test this.
Experienced Forum User, Published Author, Player (42)
Joined: 12/27/2008
Posts: 873
Location: Germany
Gengar Lv40 is a promotional card, right? You need to have access to the black box to get it, so you would get it at the same time you could get Zapdos. I'll look at the card list for Pokemon TCG2 and see if I can find some abusable pokepowers.
Experienced Forum User, Published Author, Player (42)
Joined: 12/27/2008
Posts: 873
Location: Germany
It mostly depends on what you mean by "coding an emulator". It might seem pedantic, but when you start understanding how computers work, you will find out that they are divided on a large number of moving parts, and the skills needed to contribute to each of these parts may differ dramatically. In the case of emulators, you can divide them into essentially two parts: the backend (or core), which abstract the hardware of the machine it is emulating, and the frontend which does things closer to the user, like keeping a list of recent roms, loading and saving the program state, applying cheats, etc. If you want to contribute to the frontend, it's much simpler. An emulator frontend is just a GUI application that needs to do something that a simple game would do, like polling input from keyboard or joypads, emitting audio data, and rendering video. If you're interested in writing a backend, then you basically need to understand how the hardware you're trying to emulate works, and depending on performance constraints the entire architecture might change. For example, most game boy emulators use simple C functions to decode CPU instructions, while the PS3 emulator uses a process similar to just-in-time compilation, because the former approach is too slow. If you're starting now, I strongly advise you to not code an emulator from scratch. Say, if you just want to write an interpreter for some CPU, pick an open source one, and replace its interpreter code with yours. This will be much easier for you to test, and then later you can migrate this code to a program you write.
Experienced Forum User, Published Author, Player (42)
Joined: 12/27/2008
Posts: 873
Location: Germany
Nach wrote:
Warp, I find that shocking. Isn't the PS4 a modern piece of equipment? What browser engine is it using? What's the CPU arch? My 10 year old laptop can run the slowest test in <20 seconds. That's just mind boggling...
The PS4 browser uses WebKit and its JavaScriptCore engine, which is really fast. It is slow because, in newer firmwares, Sony disabled Javascript JIT in the browser, fearing that people could exploit it to run code remotely and jailbreak it.
Experienced Forum User, Published Author, Player (42)
Joined: 12/27/2008
Posts: 873
Location: Germany
Interesting glitch there. However, if it only applies to the Legendary Zapdos, it's only useful for a New Game+ run, since you only get this card after finishing the game. It might be that the programmers messed up when a card is knocked out by PokePower damage, though. By looking at the card list, Gengar has a PokePower that can knock out opponents, it might be a good idea to check if the glitch works with Gengar, too. EDIT: The glitch is real! Apparently, the problem is that, immediately before the game displays the Decision... screen, after you've won the match with Zapdos's Pokepower, it saves an invalid state in Continue Duel. I managed to do two curious things: the first, as shown in the video, is to battle an opponent with an empty arena, if you just finish your turn without attacking, you just win the game immediately. But by attacking the opponent, the game starts to think they have a pokemon and the duel gets completely glitched. The second thing is to do the Zapdos glitch when you pick up the last prize, if you do the glitch you will continue the duel with no prizes to pick. This doesn't look exploitable, though, since if you try to pick up a prize when there are none, the game just gives you the victory without any bugs. My feeling is that the game does this invalid save at the end whenever it is still your turn to play. Probably, when you issue an attack command, the game immediately changes to the opponent's turn, and if you win the match with an attack, this wrong save is avoided. However, by using a pokepower, it is still your turn, and the game performs the save. EDIT 2: My theory should be correct. I managed to do it with Gengar! The thing is, in order to use Gengar's Pokepower, the opponent needs to have more than one Pokemon, so the only thing we can do is get a duel with zero prizes. Is there any way to exploit this? EDIT 3: I finished testing, and unfortunately I have to conclude that the only way to exploit this glitch should be with Zapdos. The bug occurs when the duel finishes midturn. the only way to do this is by using PokePowers. If the duel finishes by any player running out of cards, the state you get with Continue Duel is perfectly valid, and no corruption should be possible. If the duel is finished by running out of prizes, the game handles correctly the case when zero prizes are on the field. Initially, I thought I could make the prize amount variable underflow to 255, but that's not possible, the game saves which prizes have been picked with a bitmask, and calculates the amount of prizes left by counting the number of 1's in the byte. The pokepowers that cause damage are those of Zapdos, Gengar and Machamp. Machamp's is useless because it happens during the attack phase and the invalid save doesn't happen (I tested). Gengar's pokepower needs more than one active pokemon to be used, so it can only glitch the prize amount. The final possibility without Zapdos is to lose the duel before the attack phase. Since running out of cards is no good, we need to KO one of our pokemon without an attack. Sadly, no Pokepower allows this. I even tried something very exotic, like putting Gengar against Machamp, and damaging it with Gengar's power to see if it would counter and kill me. Unfortunately, that doesn't happen. Machamp doesn't counter Pokepowers. So, unless I am missing some key mechanics here, the only way to exploit this glitch would be with Zapdos. Maybe it works in Pokemon TCG2, where you get the card before the end of the game?
Experienced Forum User, Published Author, Player (42)
Joined: 12/27/2008
Posts: 873
Location: Germany
I remember that, several seasons ago, when I was much more active in this site, people (and by people, I mean, of course, Warp said I was full of bullshit when I said I had met Bjarne Stroustrup in a random thread. This picture goes to clear any doubts :) This was in 2013, and my haircut has undergone several revisions since then...
Experienced Forum User, Published Author, Player (42)
Joined: 12/27/2008
Posts: 873
Location: Germany
I'll post a challenge that I had some fun doing, and actually has applications (in my work, at least). The original theory is found in this awesome paper. Consider a binary alloy. If you don't know what that is, it's the mixture of two solids. Let us call them A and B, where each of these solids has only one atomic element in its chemical composition. Although not a fancy topic like black holes and quantum gravity, most of the theory for alloys is very speculative and remains mostly unsolved. Anyway, the alloys which we can say something very nontrivial about are those with substitutional disorder, those that look like this: The idea is simple. A binary alloy with substitutional disorder maintains the crystal structure of the pure solids, the only disorder comes from different atomic species occupying random lattice sites. The only macroscopic property of the alloy is its composition, in the example it could be the ratio of black atoms to the total number. The objective of any model is to find out how the alloy's other properties (like conductivity or optical absorption) depend on its composition. For technical reasons, it is much more simple to calculate things in a system that is periodic, which the alloy clearly is not. So, in the example above, we would approximate it as a periodic system. For example, we could pick a 2x2 square, with black and white atoms at some positions, and repeat it indefinitely in both dimensions. We do this for all 2^4=16 possible 2x2 squares (yes, some of those are actually equivalent to each other, and I once had to develop a code to reduce the number of possibilities to test, it is a very hard problem for realistic crystal structures, so we should ignore it now), and calculate whatever we want in each of these 16 configurations. In the end, we do an average to obtain the value in the mixture. Let us denote the alloy composition (fraction of black atoms) by x. The property you have calculated in the i-th configuration has a value P_i. If we have the probability of occurrence x_i of the i-th configuration, which depends on x (that should be evident, if x is very close to 1, the probability of a configuration with lots of black atoms should be much higher than in the case where x is very close to 0), then we can calculate the average in the alloy at composition x as: P(x) = sum_i x_i(x) P_i The thing is, it is not so simple to calculate x_i(x). Some alloys really like mixing together, in this case the values of x_i would very close to random. Others are like water and oil and don't like to mix at all. In this case, the probability for mixed configurations would be very close to 0. The paper I linked to in the beginning of the post tells you how to calculate x_i(x). The idea is the following: you need to provide some energy to create a given configuration, which we call the formation energy E_i. If this energy is very large, the probability of the configuration occurring is very low, if this energy is small, the probability is high. Alloys also have a growth temperature T. It varies a lot depending on the alloy, some are as high as 1000 K, others as low as 100 C (you can cook them). If the growth temperature is very large, differences in energy shouldn't matter at all and the alloy should be completely random. Suppose the total number of atoms in any configuration is N (in the 2x2 square example, N=4), and consider that the i-th has n_i black atoms. The formula for calculating x_i(x) is (define b=1/kT, where k is Boltzmann's constant): x_i = (a^n_i)*exp(-b*E_i)/ (sum_j (a^n_j)*exp(-b*E_j)) (1) a is a positive non-dimensional constant. To find it, you must solve a polynomial equation (which is easy to do numerically), that you obtain by imposing the constraint sum_i x_i*n_i = N*x, (2) this just means that the average number of black atoms should equal the number specified in the composition x. Now, to the actual challenge, which is something that helped me a lot when I figured out (I can tell the story if you guys want): Using the system of equations (1) and (2), prove that, if you shift all energies by a linear function of the number of atoms, that is, E_i -> E_i + A + B*n_i, the probabilities x_i obtained from the equations are the same.
Experienced Forum User, Published Author, Player (42)
Joined: 12/27/2008
Posts: 873
Location: Germany
There is one very interesting proof of the infinitude of primes using sines, that I like very much, even though it is just a contrived way of writing Euclid's original proof. Suppose the number of primes is finite. Then, let x denote the product of sin(pi/p) for all primes p. Since p >= 2, then pi/p <= pi/2 and 0 < sin(pi/p) < 1. Therefore, we must have x > 0. Now, let K denote the product of all primes p. Certainly, K/p is an integer, and because the sine function has a period of 2pi, we have sin(pi/p) = sin(pi(1+2K)/p) So, we can rewrite x as x = prod_p sin(pi(1+2K)/p) Now, since our list contains every possible prime, there should be a prime on the list where (1+2K)/p is an integer. For this prime, the factor we should evaluate to compute x is sin(n*pi), with n integer, which is just 0. Therefore, x=0, contradicting our first observation that x>0. So, there is an infinite number of primes.
Experienced Forum User, Published Author, Player (42)
Joined: 12/27/2008
Posts: 873
Location: Germany
In my humble opinion, the policy is completely misguided with respect to the pallettes. The fact is, people do not watch TASes on a real gameboy, they watch them on their monitors, which uses a color encoding which is completely different from the gameboy screen. It is just common sense that if you take your beautiful wallpaper and print it, the end result will not be as vivid as it is when you look at it on the computer screen, that's just how different color spaces work. The idea that we should avoid applying corrections just because it is not the most immediate conversion to the image on a platform where the movie is not being watched makes no sense.
Experienced Forum User, Published Author, Player (42)
Joined: 12/27/2008
Posts: 873
Location: Germany
Nice work again! I am amazed that you managed to finish it so quickly. Yes vote for suggesting the vivid palette :P
Experienced Forum User, Published Author, Player (42)
Joined: 12/27/2008
Posts: 873
Location: Germany
Besides possible performance issues, we'd also have better code IMO. The biggest advantage of a pure C# Lua is cross-platform compatibility, and avoiding ridiculous memory leaks like those reported here. Sure, there's the overhead of rerouting calls, which might be greater than running the entire Lua interpreter inside the C# VM, but from a programmer's point of view, it's much easier to handle Lua inside C# because every table will get annihilated by the GC eventually, while if you call native code outside you have to kill them explicitly, which is not what people expect to do when they use C#.
Experienced Forum User, Published Author, Player (42)
Joined: 12/27/2008
Posts: 873
Location: Germany
Blazephlozard wrote:
https://cdn.discordapp.com/attachments/93936126816956416/329221900612141058/TCG1_4_Prize_Duels.lua https://cdn.discordapp.com/attachments/93936126816956416/329221906182045697/TCG1_6_Prize_Duels.lua
Yes! The cheating is done by reshuffling the deck until the card masters have two basics + two energies in the hand, and four basics + four energies in the first thirteen cards. I remember reverse engineering the game to find this out. Ah, this brings back memories... I think you should also be looking at the possibility that Mark ends up with no basic pokemon in his starting hand, and has to reshuffle the deck to get another one. This is very simple to get, if you have only a couple of basic pokemon in the deck, and you don't need many different pokemon to win the match. EDIT: You actually already do that, I didn't see it when I first looked at the script.
Blazephlozard wrote:
Right now I'm motivated by, as silly as it is, saving 10 seconds so that I beat your VBA real-time. If I have a better Water Club, better leaders, and save 1-2 deck edits, I think I can save that much.
Actually, this difference is simply a matter of different implementations of frames in VBA and Gambatte, the timing difference is not that great. If you watch the encode, the run is finished at around 23:10, which is very close to the time you obtained resynching it in BizHawk. It is not 21:40 by any means. The thing is, in VBA a frame is not necessarily 1/60th of a second, because the CPU can call the "halt" instruction and not do anything until a certain time has passed. VBA does not consider a new frame when that is happening, since the game would not accept any input, while Gambatte does consider it a new frame. Of course, if you did not consider that some frames are extra large, you'd get the video all wrong when you record it, so comparing the encode length is much more accurate. So, don't bother about this. Your run really is 1:30 faster.
Experienced Forum User, Published Author, Player (42)
Joined: 12/27/2008
Posts: 873
Location: Germany
From Blazephlozard's comments at the publication video:
Blazephlozard wrote:
It's all good, the horrid tutorial followed by menuing too fast for anyone to understand isn't cut out for moon I'm going to be doing another one actually, I'm writing a Lua script now that simulates RNG/shuffling to automatically check what frames might work much more thoroughly than I did manually, I'm hoping to go down to 4 deck edits
I might be able to help you with that. Back in the day, I had a C program (not a Lua script) that simulated the RNG. Unfortunately, I have formatted my hard drive several times since then, and I don't have it anymore, but it's really easy to find out what the game is doing. I see you have modified my Lua script, just use an emulator with decent debugging tools like BGB and set some breakpoints at the addresses it's reading, and you should be able to read the asm instructions and deduce everything. I might be able to redo this, it's not that hard, and the code not very long. Anyway, I eventually gave up because I was busy with other stuff and I could not figure out how many calls to the RNG the AI was making in the battle, but if you just want to improve your search, doing that is not really necessary. Before I gave up, I could consistently find frames to do crazy stuff like finding 20 consecutive heads on coin flips. Also, playing a bit of devil's advocate here, the movie was originally accepted before Vault, and was demoted to it just later, and it was not clear what criteria were applied to do that. I really appreciate the work you've put to optimize this game, I thought my submission would be rejected seven years ago, please continue working and don't worry about publication standards. There's a significant speedrunning community for this game, and if the movie is relevant to this community, it's all that matters :)
Experienced Forum User, Published Author, Player (42)
Joined: 12/27/2008
Posts: 873
Location: Germany
Hello, juef. BizHawk is a C# application, and thus is run on a virtual machine, so there is no linux executable in the usual ELF64 format. To run it, you need to install mono, and launch it from the terminal with "mono EmuHawk.exe", or create a launcher that does that when you click it. I can provide a launcher if needed, but this depends on the distribution and desktop environment you're using. EDIT: If you don't want to explicitly input the mono EmuHawk.exe command, I can provide a fast solution if you use GNOME. Create a file named EmuHawk in the directory you extracted the binary:
Language: bash

#!/bin/sh /usr/bin/mono ~/BizHawk/EmuHawk.exe "$@"
That will work if you extracted the files in a folder named BizHawk in your home folder. If not, change the path above. Give it execute permission by running chmod +x ~/BizHawk/EmuHawk Now, if you use GNOME, create a bizhawk.desktop file in ~/.local/share/applications with:
[Desktop Entry]
Name=BizHawk
Exec=/home/felipe/BizHawk/EmuHawk
StartupNotify=true
Terminal=false
Type=Application
Change your username/path in the Exec line (here it needs to be the absolute path, don't use ~), then reload the shell with Alt+F2, type r, then Enter. After that, you can search for BizHawk in the gnome shell and it will appear like any other app. That should work with Ubuntu Unity, too. For KDE and XFCE, I never used them, so maybe someone can give instructions in other replies.
Experienced Forum User, Published Author, Player (42)
Joined: 12/27/2008
Posts: 873
Location: Germany
Sappharad wrote:
Based on the fact that you're still deciding what to do, I'll wait until you've found an approach that you like. :-)
Well, I have tested things extensively now, and I think I'll stick to the single threaded approach. I don't think the code will lose much responsiveness without multi-threading, but sure, wait a little because things might still break.
Sappharad wrote:
Regarding other toolkit, this is why I mentioned the /BizHawk.Client.EtoHawk/ solution in my previous post. Eto Forms uses GTK on Linux. It provides a cross-platform UI API very similar to WinForms.
Well, these things hardly have a clear answer, but I suggested GTK because I am more familiar with it, and with the small experience I have with toolkits, it's the one that gave me less work across different platforms. I have never heard of Eto Forms, I'll take a look.
Sappharad wrote:
If you're interested in building a brand new cross platform UI, I'm willing to help. But the main reason I kept porting the WinForms one is because of all of the features. I just want to use BizHawk to play games and sometimes watch videos posted on the site, so I don't really have any personal interest in developing the TAS tools.
I see. I think the TAS tools are the selling point of the emulator, though. Without them, there isn't much incentive to use the other ones that offer better cross-platform support. EDIT: I successfully compiled gambatte (and blip_buf, which it depends on), and I loaded a ROM. Sound and video works, but input doesn't. I don't think it's because of me messing up with the keyboard input thread, because if I try to load a movie, it has no input either. Also, as expected from Sappharad's comments, TAStudio just crashes the program. EDIT 2: OK, here's a summary of what I have now. All input problems are solved. I can play games fine and watch movies. All pure C# cores, including NESHawk, are working. Gambatte and QuickNES are also working. I think the other cores should work too, I just need to set up a build environment for them. Some tools are not working. RAM Search, Cheats and Trace Logger don't work (call user32.dll, which doesn't exist in Linux), TAStudio and New Hex Editor don't work (need gdi32.dll). Lua doesn't work (the C# interface is Windows exclusive). I have just finished replacing all code that calls this with message boxes explaining it's not implemented. I'll try to get more cores compiled and release a binary if there's any interest. EDIT 3: After talking to natt and adelikat, I think it makes more sense to port the cores using the new waterbox system. Since that will take a while, here is the compiled program. Let me know if you find something that's not working.
1 2
13 14 15 34 35