Posts for Hâthor


Experienced Forum User, Published Author, Player (104)
Joined: 1/4/2013
Posts: 117
Location: Belgium
Thanks for this! Ok, it's your job but it's not something simple and you take time to make it. So.... :)
Experienced Forum User, Published Author, Player (104)
Joined: 1/4/2013
Posts: 117
Location: Belgium
When I use the lua function:
stylus.set(x,y,true)
Emulator closed without saying anything. When I run the _dev.exe, I can see that an error message is written in the console but it close too faster; I don't have time to read. I tried on versions 0.9.9, 0.9.8, 0.9.7 and it is the same (all 32bit). Either I miss something, or it's a bug.
Experienced Forum User, Published Author, Player (104)
Joined: 1/4/2013
Posts: 117
Location: Belgium
Not as I know. I just made something "viewable"; I don't think it can be used for an official publication. antd has posted a low res (240p) movie.
Experienced Forum User, Published Author, Player (104)
Joined: 1/4/2013
Posts: 117
Location: Belgium
A big Yes! I love Labyrinth 3! Nice Work :)
Experienced Forum User, Published Author, Player (104)
Joined: 1/4/2013
Posts: 117
Location: Belgium
Cool ! Alors dolphin... J'ai fait 2 captures:
  • Mode fenêtré paramètre par défaut
  • Mode fullscreen avec les paramètres suivants:
A nouveau, je pousse mémé dans les orties mais bon, faut bien essayer :D. A noter qu'il est important de passer en fullscreen si on veut une capture HD. La résolution interne n'est utilisée que dans un cadre de calcul. Dolphin sépare l'audio et la vidéo; mais c'est vraiment pas une difficulté supplémentaire On va simplement fusionner les fichiers vidéos et les compresser comme dit précédemment. On peut ne pas écrire les paramètres audio vu qu'il n'y en a pas! Ensuite, on va compresser le fichier audio (*.wav). Là aussi, vous avez du choix: mp3, ogg, wma,... Petite préférence pour l'ogg, toujours :). Du coup, nous voilà en présence de nos 2 flux. Il suffit d'utiliser un autre merveilleux logiciel mkvmerge de la suite mkvtoolnix. Disponible en ligne de commande et interface graphique sous Windows, Mac et Linux. En ligne de commande:
mkvmerge video.mkv audio.ogg -o all.mkv
Note: Il n'est absolument pas obligatoire que le format de la vidéo soit du mkv, n'importe quel flux vidéo fonctionne. Et le tour est joué! Si vous avez des sous-titres et/ou un fichier de chapitres (autre avantage du mkv), vous pouvez les ajouter également à ce moment-là. Voici mes essais. Je m'excuse pour les desynchros audios mais dolphin est juste une horreur sur mon PC :p. C'est ajustable après coup (delay / timecode /...); il est même possible de remplacer l'intégralité du fichier audio grâce aux outils de mkvtoolnix. Basse résolution (fenêtré) Link to video Haute résolution, 1 pass Link to video Haute résolution, 2 pass Link to video Tailles respectives: 8.9Mo - 22.7Mo - 12.4Mo On remarque que les paramètres utilisés pour la double pass on non seulement gardé une excellente qualité mais on plus, on a un poids réduit pratique pour les petites connexions. Mais... 3 fois plus de temps d'encodage[/i]
Experienced Forum User, Published Author, Player (104)
Joined: 1/4/2013
Posts: 117
Location: Belgium
Pourquoi faire simple quand on peut faire compliqué.... -_-' Je vais faire quelques tests de mon côté aussi. EDIT Bon, il nous fait la totale, audio séparé ET fichier splitté :D. ffmpeg est capable d'utiliser un fichier audio spécifique mais il y a plus simple pour moi, les détails arrivent bientôt.
Experienced Forum User, Published Author, Player (104)
Joined: 1/4/2013
Posts: 117
Location: Belgium
Ok, sers-toi, j'ai écris pour ça! :) En ce qui concerne Dolphin, qui n'a pas de moyen interne de capturer (et ça, c'est très moche); en tout cas, je n'en ai pas trouvé. Je ne vois qu'une solution: Pareil, on bidouille les options graphiques pour avoir un résultat satisfaisant. J'opterais pour passer le jeu en fullscreen et ensuite => FRAPS. Grosse config inside. Je peux vraiment pas tester, Dolphin rame à mort sur mon PC :( (Ok pour lagaryth, j'ignorais son existence. je dormirai moins bête :D)
Experienced Forum User, Published Author, Player (104)
Joined: 1/4/2013
Posts: 117
Location: Belgium
J'ai jamais vraiemnt travaillé avec Dolphin, mais je regarderai si ça peut t'aider. Je ne connaissais pas lagarith. Je parle de x264 (qui est en fait le pendant libre de h264) parce que c'est LE codec le plus utilisé de par ses multiples atouts (compatibilité, performance, qualité), ça n'exclu bien évidemment pas d'utiliser vos codecs préférés ! Petite astuce que tu parles d' a/v hack. Le mkv a le très gros avantage de pouvoir contenir plusieurs flux audios et/ou vidéos dans un même fichier. Les sous-titres sont également un flux à part. En d'autres termes, il est possible d'avoir un film multilingue avec sous-titres désactivables dans un seul mkv (ce qui n'est pas le cas du mp4).
Experienced Forum User, Published Author, Player (104)
Joined: 1/4/2013
Posts: 117
Location: Belgium
I never said it was fully optimized. The fact is that the character is really hard to handle; he moves like a boat. I reached a point where I didn't see anything improvable. I decided to submit it, and I started to work on something else (a low% and another game). A thing is absolutely sure, I'll work back on it. I simply need to look at the game from another point of view, it'll help me to discover some new things. And as mklip suggested, I'm totally open to ideas that can help me to improve myself and what I've done.
Experienced Forum User, Published Author, Player (104)
Joined: 1/4/2013
Posts: 117
Location: Belgium
Ouep, je pense que c'est un peu au feelling du coup. A toi de voir lequel des 2 te plait le mieux :). Je ne crois pas qu'un ému mérite d'être "supprimé" ne serait que pour des raisons de compatibilités de fichiers. D'ou le mot magique: "Deprecated" :D (déprécié). Au passage, elle est géniale ta signature feeuzz =)
Experienced Forum User, Published Author, Player (104)
Joined: 1/4/2013
Posts: 117
Location: Belgium
Si si, ça fait megadrive :D. C'est la saturn qui est en dev (avec d'autres d'ailleurs). Maintenant la vrai question est de savoir si c'est aussi fiable que Gens mais j'ai envie de dire que oui, vu que c'est releasé.
Experienced Forum User, Published Author, Player (104)
Joined: 1/4/2013
Posts: 117
Location: Belgium
Franchement chapeau, c'est bien fait et ultra complet ! Niveau encoding, je partage ce que j'ai testé / utilisé: Pour un encodage rapide et pas trop dégeu, on peut utiliser le "Record AVI"de l'émulateur quand il a de bons codecs (et ça malheureusement, il faut faire des essais pour ce qui vous convient). Pour Bizhawk par exemple, je mets ces paramètres pour avoir ce résultat: Link to video Je rescale l'image parce que la SNES, c'est petit d'origine :p; du mkv pour le format de sortie. Pourquoi mkv? Parce que ça prends moins de place qu'un mp4 à qualité égale :) On voit que le codec utilisé est x264 (le meilleur) pour la vidéo et vorbis (de l'ogg) pour l'audio. Notez 2 choses importantes:
  • Aucun souci si l'émulateur n'est pas à 50/60 fps, la vidéo le sera elle.
  • Bizhawk offre la possibilité de capturer l'OSD ce qui n'est pas le cas de tous. Par OSD, j'entend les fps, le nombre de rerecord, les éventuelles infos supplémentaires affichées par scripts,...
Maintenant, si je prends le cas de PSXjin qui est beaucoup plus rustique et ne propose pas de vrai bons codecs. A nouveau pour quelque chose de rapide et simple, je mets l'émulateur dans la résolution que je souhaite et je capture l'appli avec OBS. C'est plié :p. Et si on veut une vrai vidéo HD tout propre? Là, ça se complique. Premièrement, il faut se renseigner sur les options graphiques de l'émulateur et faire des essais. On a parfois des options de lissage des textures qui donnent de beaux résultats! (et parfois de la merde aussi, soyons franc). Récapitulatif des résolutions format 4/3, chère à nos vieilles consoles:
  • 640 x 480 => 480p
  • 960 x 720 => 720p
  • 1440 x 1080 => 1080p
Quand on a un image satisfaisante, on peut capturer. Là, on va choisir les options "non compressées" et un .avi comme conteneur. Attention /!\ ça prend beaucoup de place, c'est comme si on prenait un screenshot à chaque frame, comptez 2Go les 10secondes en 720p (+/-). Si ffmpeg existe en tant que "encoder" possible, utilisez-le ! Il est performant et présente l'avantage de ne pas splitter sur la durée mais seulement en cas de changement de résolution. Moi pour l'exemple, je vais prendre un cas assez extrême, des fichiers splités. Dernière précision, choisissez un nom sans espace ou autre caratère bizarre. Très franchement, je trouve que c'est une manoeuvre plus simple sous Linux donc je ne parlerai pas de ce qui est possible sous Windows vu que j'en sais trop rien. J'ai capturé le start screen de mario world en 1440 x 1080 et j'ai obtenu 4 fichiers pour un total de 5.8Go. C'est énorme! On va compresser ça. Pour se faire, j'utilise un utilitaire en ligne de commande qui se nomme "mencoder". Lui et son pendant mplayer sont des outils géniaux qui peuvent tout faire. Dumper de l'audio, extraire des sous-titres,etc... On se place dans le dossier où sont nos fichiers vidéos qu'on aura pris soin d'isoler de tout les reste.
cd /home/moi/mondossier
et on lance la commande suivante:
mencoder -oac copy -ovc copy -forceidx -o output.avi `ls *.avi`
Traduit, ça donne: Je lance mencoder avec les paramètres -oac (pour output audio codec) copy (on ne change rien au format original); -ovc (pareil mais pour video); -forceidx (on force la reconstruction de l'index de l'avi, c'est plus sûr); -o pour donner un nom à nontre fichier final et enfin le truc tordu `ls *.avi` (les espèces d'apostrophes qui n'en sont pas! -backticks `- font en sorte que ce qui est dedans soit interprété comme une commande; ici je liste les fichier *.avi et cette liste sera utilisé comme paramètre par mencoder; en gros ça évite de taper le nom de tout les fichiers un par un). Et voilà ce qui apparait Un joli fichier qui fait exactement la taille de tout les autres! Compressons maintenant. Retour à ffmpeg avec la commande suivante:
ffmpeg -i output.avi -vcodec libx264 -preset slow -crf 22 -acodec libvorbis -aq 192 -threads 0 final.mkv -movflags +faststart
Relativement simple à comprendre: tout ce qui est entre -vcodec et -acodec concerne la vidéo, entre -acodec et -threads concerne l'audio. L'option -threads 0 fait en sorte que le boulot soit équitablement répartit entre les différents coeurs/cpu. Si vous souhaitez plus d'infos sur les paramètres d'x264 et de libvorbis, il faut farfouiller le net. Ce sont des codecs très complexes mais qui offrent les meilleurs résultats! (Notez que pour le son, le meilleur codec est AAC, réservez-le pour des films par exemples vu qu'il supporte le 5.1; l'ogg est largement suffisant pour nous même sur une console newgen) Il y a juste un avertissement qui nous conseille d'utiliser la commande avconv au lieu de ffmpeg; la syntaxe et le résultat sont identiques. On notera l'option -movflags +faststart qui optimise la vidéo pour une lecture sur le web. Absolument pas obligatoire si vous l'uploadez sur youtube, ils le font pour vous. Le résultat de cet encodage: Link to video Mon fichier pèse 3.1Mo, une broutille contre les 5.8Go de tout à l'heure. Et le résultar est très correcte. Et si vous êtes maso et obstiné par la qualité? Vous pouvez opter pour du multi-pass. C'est à dire qu'on va faire un premier encodage rapide qui sert juste à évaluer et le second qui fait l'encodage proprement dit.
ffmpeg -y -i output.avi -vcodec libx264 -preset veryslow -b 3000k -pass 1 -an -f matroska /dev/null && ffmpeg -i output.avi -vcodec libx264 -preset veryslow -b:v 3000k -pass 2 -acodec libvorbis -aq 256 -threads 0 final_2.mkv
On voit que la commande divise en 2 (par le &&) la première pass est jetée (/dev/null en sortie) et la seoncde fois, on obtient le fichier final_2.mkv. Remarquez aussi qu'on encode le son uniquement lors de la 2ème pass, d'où le -na (no audio) dans la première commande. Le fichier obtenu pèse 7,3Mo dans mon cas, on ne verra pour ainsi dire pas de différence mais dans le cas d'un shmup, ça peut être flagrant. Link to video Vous pouvez bien évidemment jouer sur les paramètres pour faire varier le poids du fichier, la qualité,... Il y a des tonnes d'options possibles, je me suis contenté de l'essentiel afin de rester simple et compréhensible (enfin j'espère :D) Voilà, c'est tout ce que je sais. Je précise que je n'ai pas la science infuse mais je pense que c'est un bon début et j'espère avoir un peu éclaircit vos lanternes :). Happy encoding. PS: Youtube réencodant, il est possible que le résultat soit différent de ce que j'ai obtenu réellement. EDIT: Quelques infos en plus sur la commande d'encodage single-pass.
Experienced Forum User, Published Author, Player (104)
Joined: 1/4/2013
Posts: 117
Location: Belgium
Et puis tu verras que c'est assez génial de trouver une valeur qu'on cherche :D. Quelques petits éléments qui te faciliteront la tâche:
  • Une valeur sur 1 byte signé (ça veut dire que tu peux voir des nombres négatifs)
  • Supérieure à 0 (logique)
  • Inférieure à 20 (au pif, vu la console, je doute qu'il y ait 100 hp)
Tu devrais avoir une liste assez courte de valeur. Tu fais un state avant de prendre des dégâts, tu "frameadvance" (du verbe frameadvancer) jusqu'aux dit dégats en observant les valeurs que tu as restreintes. Celle qui changera sera probablement les HP :) Tu peux ensuite ajouter l'adresse dans le ram watch et/ou l'afficher à l'écran avec un script. PS: Pour ma part, je préférerais Bizhawk à Gens mais c'est toi qui voit.
Experienced Forum User, Published Author, Player (104)
Joined: 1/4/2013
Posts: 117
Location: Belgium
Thanks for first feedback :) I didn't add the video link in the submission because it doesn't reflect exactly the TAS and graphics are quite ugly; it's just a capture of psxjin made with OBS. Anyway, thanks Priam and Patashu for having post the link.
Experienced Forum User, Published Author, Player (104)
Joined: 1/4/2013
Posts: 117
Location: Belgium
If you have time to patch the RAM watch/search, you'll be a god! It isn"t able to display or search floating values, such a pain :/ I found psxjin more friendly but I love the feature of psx to the display this so wonderful ps1 bios. To be honest and if you want to become a Chuck Norris, I think a good mix between both psxrr and psxjin will boost ps1 TAS :) Is there any pxm-pjm file converter? If no, I'll try to code one. Nice work already done!
Experienced Forum User, Published Author, Player (104)
Joined: 1/4/2013
Posts: 117
Location: Belgium
mklip2001 wrote:
Seriously, the acting is on the level of pornography quality, and Lord Mei-Oh looks like he is the hero of Demon Sword :-)
Joe wrote:
I have to agree that the voice acting is absolutely terrible aside from the main protagonist which is only less terrible by comparison. The 90s had some very bargain basement video game voice acting, especially console games like this. I'm guessing they just had some programmers recording all the lines in a day and couldn't afford even Z grade professionals.
You're lucky to not watch the french version, trust me :p. You can watch an example here. Even if you don't understand, it's just a joke to heard :D. Like Sephyross says, "You play Tenchu for it's atmosphere, fortunatly not for voice acting".
Experienced Forum User, Published Author, Player (104)
Joined: 1/4/2013
Posts: 117
Location: Belgium
I made one, I posted it in the related thread. There is a small difference with the pjm movie, It doesn't show the score screen after the level 10 (psxjin crashed while I was capturing). So, I had to capture the part where I go to the record screen and mix them together.
Experienced Forum User, Published Author, Player (104)
Joined: 1/4/2013
Posts: 117
Location: Belgium
For those who are interrested, here's a lua script you can use to convert an unsigned DWord (32bits | 4bytes) to an IEEE 754 floating point.
LibHex = {}

local Vars = {}
Vars["char"] = ""
Vars["value"] = ""

Vars["ExponentOffset"] = 0
Vars["sign"] = 0
Vars["exponent"] = 0
Vars["mantissa"] = 0
Vars["temp"] = ""

LibHex.ToBin = function(hexString)
	Vars["char"] = ""
	Vars["value"] = ""	
	
	if(string.len(hexString) < 8) then
		hexString = string.gsub(string.format("%8s", hexString)," ","0")
	end
	
	for i = 1, string.len(hexString) do
	
		Vars["char"] = string.sub(hexString, i, i)
		
		if(Vars["char"] == "0") then
			Vars["value"] = Vars["value"] .. "0000"
			
		elseif(Vars["char"] == "1") then
			Vars["value"] = Vars["value"] .. "0001"
			
		elseif(Vars["char"] == "2") then
			Vars["value"] = Vars["value"] .. "0010"
			
		elseif(Vars["char"] == "3") then
			Vars["value"] = Vars["value"] .. "0011"
			
		elseif(Vars["char"] == "4") then
			Vars["value"] = Vars["value"] .. "0100"
			
		elseif(Vars["char"] == "5") then
			Vars["value"] = Vars["value"] .. "0101"
			
		elseif(Vars["char"] == "6") then
			Vars["value"] = Vars["value"] .. "0110"
			
		elseif(Vars["char"] == "7") then
			Vars["value"] = Vars["value"] .. "0111"
			
		elseif(Vars["char"] == "8") then
			Vars["value"] = Vars["value"] .. "1000"
			
		elseif(Vars["char"] == "9") then
			Vars["value"] = Vars["value"] .. "1001"
			
		elseif(Vars["char"] == "A") then
			Vars["value"] = Vars["value"] .. "1010"
			
		elseif(Vars["char"] == "B") then
			Vars["value"] = Vars["value"] .. "1011"
			
		elseif(Vars["char"] == "C") then
			Vars["value"] = Vars["value"] .. "1100"
			
		elseif(Vars["char"] == "D") then
			Vars["value"] = Vars["value"] .. "1101"
			
		elseif(Vars["char"] == "E") then
			Vars["value"] = Vars["value"] .. "1110"
			
		elseif(Vars["char"] == "F") then
			Vars["value"] = Vars["value"] .. "1111"
			
		else
			Vars["value"] = error("Unrecognize")
		end
		
	end
	
	return Vars["value"]
	
end

LibHex.BinToFloat = function (binaryString)

	Vars["ExponentOffset"] = 127
	
	Vars["exponent"] = 0
	Vars["mantissa"] = 1
	Vars["temp"] = ""
	
	if(string.sub(binaryString, 1, 1) == "0") then
		Vars["sign"] = 1
	else
		Vars["sign"] = -1
	end
	
	Vars["temp"] =  string.sub(binaryString, 2, 9) --getting binary exponent value
	for i = 1,8 do --computing it
		Vars["exponent"] = Vars["exponent"] + tonumber(string.sub(Vars["temp"],i , i)) * math.pow(2,8-i)
	end
	Vars["exponent"] = Vars["exponent"] - Vars["ExponentOffset"]
	
	if(Vars["exponent"] == Vars["ExponentOffset"] * -1) then --denormalized number
		Vars["exponent"] = -126
		Vars["mantissa"] = 0
	end
	
	Vars["temp"] = string.sub(binaryString, 10) --getting binary exponent value
	for i = 1, string.len(Vars["temp"]) do --computing it
		Vars["mantissa"] = Vars["mantissa"] + tonumber(string.sub(Vars["temp"], i, i)) * math.pow(2, i * -1)
	end
	
	if(Vars["exponent"] == Vars["ExponentOffset"]) then
		if(Vars["mantissa"] == 0) then
			return math.huge --Infinity
		else
			return math.huge * 0 --NaN (Not a Number)
		end
	end
	
	return Vars["sign"] * math.pow(2, Vars["exponent"]) * Vars["mantissa"]
end

LibHex.ToFloat = function (hexString)
	return LibHex.BinToFloat(LibHex.ToBin(hexString))
end

local x

--[[while true do

	x = memory.readdwordsigned(0xABA0E)
	x = string.format("%X",x)
	x = LibHex.ToFloat(x)
	gui.text(0, 25, string.format("Truc: %s\n", x))

	emu.frameadvance()
end]]
Note, when this is a denormalized number, you have to use %s instead of %f because there are really small numbers and lua seems to trunc after 6 digits.
Experienced Forum User, Published Author, Player (104)
Joined: 1/4/2013
Posts: 117
Location: Belgium
That's clearer now. Tanks Patashu ! :)
Experienced Forum User, Published Author, Player (104)
Joined: 1/4/2013
Posts: 117
Location: Belgium
I was wondering something... How are you determinate DataType? I'm looking for those values (and the velocity) on a psx game and I didn't found anything for the moment. Could it be possible that those values are floating point instead of integer? What kind of datatype a playstation use for this? Word or Dword? (Byte is clearly too small) Many thanks in advance for help
Experienced Forum User, Published Author, Player (104)
Joined: 1/4/2013
Posts: 117
Location: Belgium
And here's a full movie. I'm writing docs for submission (my first one). I hope you enjoy it :). Link to video
Experienced Forum User, Published Author, Player (104)
Joined: 1/4/2013
Posts: 117
Location: Belgium
Last WIP. This time, we beat the level 9. Link to video You can also download the *.pjm file here. Hope you enjoy. Every comments are welcomed :) Note about some points:
  • Level 3: I choose using a mine because the explosion makes the bear move... Which can is unexpected as it's shown in the cutscene :D (and I'm not shuriken is faster)
  • Level 8: I take some damage to force the guard moving and fall. I didn't found a better way to deal with him. And I don't know why he don't fall opposite to my first try in this level.
  • Level 9: Onikage gets 100% parry chance if you do the same twice consecutively. I've had to deal with it. Furthermore, if he jump over the low wall behind him, the fight will be very harder and takes seriously more time :/. And it's worst if he falls in the stairs.
EDIT Found an enhanced versions of the tricks mentionned by Alaktorn (the double-jump) tonight. In fact, you can jump infintly while you don't hit the ground! Awesome !!!! Possible use in the level 5 and 7. I need to check if I can get faster. It will be very cheaty if we can find a way to get higher with this "Infinite Air Jump" :p *dreaming*
Experienced Forum User, Published Author, Player (104)
Joined: 1/4/2013
Posts: 117
Location: Belgium
Je travail actuellement sur le TAS de Tenchu: Stealth Assassin (Playstation) et j'ai d'autres projets en tête. Je précise quand même que je ne suis pas (pas encore du moins) un grand génie du TAS mais je me débrouille :). (Au passage, je suis ouvert à tout type de conseils/remarques) http://www.twitch.tv/hathor86
Experienced Forum User, Published Author, Player (104)
Joined: 1/4/2013
Posts: 117
Location: Belgium
ALAKTORN wrote:
by the way, I found this out a while ago but I thought you already knew but I guess not, you can place a mine on the ground at the same time a boss attacks you, the mine will explode and the boss will be hit full force by it, but you only take damage for the boss’s attack and not the mine, I think this should be helpful against some bosses (maybe Onikage in level 9)
You can also make the mine explode by hitting it with an attack (I didn't test all but it's sure for the crouch attack); it's possible to make it explode and receive no damages (but the ennemy will take full damages). I knew this trick (I accidentally use it in the level 7, brings some entertainment^^) but doest it really safe time? In certain way, yes as you aren't bump by the explosion, in another way, time is spent for placing it + recovery... Maybe I'll have to use it versus the last boss. To be tested :)
Experienced Forum User, Published Author, Player (104)
Joined: 1/4/2013
Posts: 117
Location: Belgium
A cool level 9. Happy with the way I managed the grappling hook. Link to video