How to Use Twitch Leecher for Single Video Downloads

While working on my Highlights of Qudans Winning Tekken World Tour 2017 video, I searched for a way to download videos from Twitch and found a program called Twitch Leecher, and the recommendation from its use on Lifewire, here: How to Download Twitch VOD Videos. It was extremely useful, so I’d like to share the main that part helped me along with some pictures in case that helps someone else. The version I am using for at the time of this post is 1.4.2. After the program is downloaded, open it up and click the Search button on the top menu. Go to the Urls tab.

Copy/paste the URL of the desired video(s) and then click Search from the buttons on the bottom.

A loading screen will appear and then a thumbnail of the video to be downloaded with a button to do that.

Click the download button, and then you can enter your file information, such as quality, destination, file name, etc.

Click download, and it will be added. You can switch on over to see the Download, using the Downloads button in the top button set. You will see download information and a progress bar, along with a button at the bottom to open the download folder.

That is the gist of what I needed. I could have done more than one at a time, but I was getting a feel for how to use the program first. It’s good to know for possible future projects.

Highlights of Qudans Winning Tekken World Tour 2017

Transcription:

Hi everyone, I’m Cathy. This past Sunday, Qudans, the best Devil Jin player in the world, also proved himself to be the best player in the Tekken World Tour where he faced off against both JDCR and SAINT, players for the team EchoFox. They are very, very good players, so that was no small feat I can assure you.

Qudans is one of the best from the Tekken 5 era. At some point, he injured his wrists, and he also went into the military service. In fact, I was reading some tweets and one person on Twitter said that, that was how he injured his wrists. And here all these years I thought it was because of-while he was playing Tekken. Admittedly, I don’t know. I never asked him myself. But, he didn’t play at the level that he’s at now for quite some time, so seeing him back was really cool. Devil Jin is my favorite character ever, and he is also a very difficult character to play as, so watching someone at the highest level conceivable to me play and win is really special to watch. I was very happy to see that win.

He made good use of hellsweeps, electrics, and demon steel pedal, and especially the Rage Art. So, I’m going to go ahead and share a few of my favorite highlights with you from watching the final matches of the tournament.

In the first round of the first match against JDCR, for the top 8, Qudans made use of Devil Jin’s Rage Art, at the exact right moment to win that particular round. Let’s take a look.

[Highlight start]

Aris: …huge here, he’s got the Rage Drive, yeah, he’s going to use it, big damage, not quite – oh, he might die.

Mark: Is that going to hit?

Aris: He might die. Ohhh!

Mark: Oh my Gosh.

Aris: It didn’t even touch him. He went over it. Wow. Unbelievable, okay…

[Highlight end]

In fact, this same thing happened with the last round of the match too, followed by an exciting hug over to Knee, so let’s watch that.

[Highlight start]

Aris: This is an outrage! Ohhh!

Mark: Oh and the rage art! Is that going to do it?

Aris: Ohhh!

Mark: Oh, he’s killed him.

Aris: What the, I can’t believe it! I can’t believe it!
Mark: Oh my gosh, and he hugs Knee right afterwards.

Aris: I cannot believe my eyes!

Mark: I feel like this was your reaction the last time…

[Highlight end]

Afterwards, he moved onto SAINT and lost that set, but I do have a few highlights I want to share for you.

Funnily enough, in the first round of the first match, he again won with a Rage Art. Here it is.

[Highlight start]

Aris: Is it going to pay off?

Mark: Oh, the trade.

Aris: The trade. He got the combo, nice work.

Mark: This guy likes the Rage Art.

Aris: So aware. Yeah, it gives him a moment to think about what he’s done. Nice work. Man, he does…

[Highlight end]

There was also an excellent comeback in round two of the second match.

[Highlight start]

Mark: Wow, look at all this damage here, and-uh oh, fighting back.

Aris: He’s going to need a miracle comeback though. The wall is in his favor.

Mark: Went for the mid again.

Aris: Oh my god, is that a teabag?

Mark: No, he’s buffering a low block for a potential mix-up here. Oh, he did not want to get hit by that. That is going to be big damage.

Aris: Oh my God…

Mark: Oh no, he missed the wall, but he still got it.

Aris: Oh! He got him.

Mark: What a comeback from Qudans…

[Highlight end]

After the overall loss, Qudans had to play against JDCR again, and he beat Dragunov a couple of times. And then at the third match, JDCR picked Heihachi after being cheered on by the crowd to do so and so then JDCR and Qudans played in the Forgotten Realm stage. The first round finished with a strong combo from Qudans with a Rage Drive to Heaven’s Door, that almost finished it, so a while rising 2 near the wall did the rest. It was really cool to watch. So, let’s take another look.

[Highligh start]

Mark: He could go downstairs. That should be it.

Aris: Yeah, he’s going to kill. Nice…

[Highlight end]

Heaven’s Door is my favorite move so watching the top player in the world do it is a lot of fun all the time. I mean, I love watching anyone do it so to see it at that level is really amazing.

And finally, he had a rematch with SAINT to finish it all up. There was another excellent comeback in the first found of the reset.

[Highlight start]

Mark: …could be the move that changes it as well.

Aris: Mm-hmm.

Mark: The down, forward 2.

Aris: That direction, the tracking on that side, it could be a big factor. Hellsweep.

Mark: And that is always a common factor here with the Mishimas, especially with Devil Jin.

Aris: He’s going to need such a miracle. He’s going to need such a miracle.

Mark: Oh my God, he got him.

Aris: Not much more of a miracle left.

Mark: Oh, no, and I don’t think he hit a button at all.

Aris: Ohhh! He got him. I can’t believe it. What? I mean, he-

Mark: Qudans…

[Highlight end]

And here’s a part where he finishes with a Heaven’s Door in the fourth round on the second match of the reset.

[Highligh start]

Mark: Oh my gosh, he’s going to get it. He’s going to get it. Oh my gosh…

[Highlight end]

And then, let’s take a look at the final moments into the win and led to another exciting Qudans standing up and hugging Knee.

[Highlight start]

Aris: Oh!

Mark: Oh! He got it

Aris: He got it! Qudans is your global champion.

Mark: And they torso touched…

[Highlight end]

So, yay! Pretty cool. And then before I go, I want to share some analysis with you from my friend Newton on Twitter.

Watching the Qudans matches from the Tekken World Tour finals and seeing how many Rage Arts he landed just goes and proves my point about how strong Devil Jin’s Rage Art is. Other Rage Arts have to actively absorb something or land as a whiff punish, but Devil Jin’s simply crushes, so he has a less chance of dying mid Rage Art.

Not just that, it is also a super evasive Rage Art, which means armor frames aside, he can use it to straight up crush some stuff, which comes in really handy in pinch situations like that jack df+1212 string Qudans crushed.

Devil Jin’s Rage Art also has the distinction of actually hitting Xiaoyu in AOP~d and completely ignoring Dragunov’s df+4 pushback which makes a lot of Rage Arts whiff. In my opinion, the best i20 RA in the game.

So, that’s from Newton. That’s interesting to me because I don’t play competitively, but I used Devil Jin’s Rage Art all the time when I was playing Treasure Battle. It was fun, yeah, go, do your thing.

Anyway, the win was really special. Qudans had not been to the U.S. in ten years for competitive Tekken play. So, way to go, congratulations Qudans. Thank you for giving me the chance to watch someone with my favorite character at such a high level. I really do appreciate it. So, that’s a wrap for this video. Thanks for watching and/or listening and/or reading. Bye.


If you appreciate any of the work that went into making this video, please consider giving a tip to my PayPal account:
https://www.paypal.me/sonkitty

Simple Tool: LT and GT Replace

This page replaces “<" and ">” with “&lt;” and “&gt;”. I found myself doing it in my blog posts and thought it would be a good, simple exercise to do in my portfolio space and could be used by myself or others in the future.

Enter code here:


Updated code will display here:

The jQuery code itself doing the replacing:

<script>
(function($) {
	$("#btnReplace").click(function() {
		var str = $("#PutCodeHere").val();
		str = str.replace(/</g, "&lt;").replace(/>/g, "&gt;");
		str = str.replace( /\r?\n/g, "\r\n" );
		$("#Replaced").text(str);
	});
})( jQuery );
</script>

Source for figuring out what I needed found here:
https://stackoverflow.com/questions/20964811/replace-amp-to-lt-to-and-gt-to-gt-in-javascript

Passing Form Data from a jQuery Ajax Call to a CFC Function and Returning It

One of the bigger upgrades I did at my job some years ago was to pass form data using jQuery into a CFC, validating it, and then returning any necessary validations or allowing a user to proceed the next step. I used two functions to prepare the data before sending it to a CFC.

Here are the necessary script files:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>

json2.js can be downloaded here:
https://github.com/douglascrockford/JSON-js

The two functions:

<script>
	$.fn.serializeObject = function()
	{
	    var o = {};
	    var a = this.serializeArray();
	    $.each(a, function() {
	        if (o[this.name] !== undefined) {
	            if (!o[this.name].push) {
	                o[this.name] = [o[this.name]];
	            }
	            o[this.name].push(this.value || '');
	        } else {
	            o[this.name] = this.value || '';
	        }
	    });
	    return o;
	};
	
	var PrepJSON = function(frmObj) {
		var o = {};
		o = JSON.stringify(frmObj.serializeObject());
		return o;
	};
</script>

The serializeObject function was found here: https://stackoverflow.com/a/5181003 and the JSON stringify part here: https://stackoverflow.com/questions/1184624/convert-form-data-to-javascript-object-with-jquery?page=1&tab=votes#comment4948246_1184624

With those called earlier in an application, we can now tell a submit button to ready our form data before passing it into a CFC using jQuery’s Ajax call.

<script>
$(function() {
	$("#btnSubmit").click(function() {
		//Create variable to store form object
		var frmObj = $("#myForm");

		//Store json string of form data
		var frmData = PrepJSON(frmObj);

		//Call CFC to process the form.
		$.ajax({
			type: 'POST',
			url: "CFCUpdate.cfc?method=ProcessForm"
			,data: ({ frmData: frmData })
			,success: function(data) {
				//Next step goes here.
			  }
			  ,error: function (xhr, textStatus, errorThrown){}	
		});
		return false;
	});
});
</script>

The CFC itself that we are calling:

<cffunction name="ProcessForm" access="remote" output="false" returntype="string" returnformat="plain">

	<cfargument name="frmData" required="yes" type="string">
	<cfset var formStruct = {} />

	<cfset formStruct = DeserializeJSON(arguments.frmData)>

	<!--- Do any necessary processing here--->

	<cfreturn "OK">
</cffunction>

Make sure you have debugging off so that none of it returns through the CFC string. I put something along the lines of the following in any relevant application.cfm or Application.cfc files.

<cfif LCase(Right(script_name,3)) is "cfc">
	<cfsetting showdebugoutput="no">
</cfif>

At a point in time, I thought I might need to return and update the form data as well and encountered a few issues. Since then, I have actually not had a situation where I need to return the entirety of form data and reflect an update, but since I went through the trouble of learning it and logging it at work, I may as well note it on this website as well for any visitors and as possible reference for if I do ever need it after all.

Get the jQuery Field plugin here: https://pengoworks.com/workshop/jquery/field/field.plugin.htm

Here, you’ll see a few changes from our function earlier that I will highlight:

$(function() {
	$("#btnSubmit").click(function() {
		//Create variable to store form object
		var frmObj = $("#myForm");

		//Store json string of form data
		var frmData = PrepJSON(frmObj);

		//Call CFC to process the form.
		$.ajax({
			type: 'POST',
			url: "CFCUpdate.cfc?method=ProcessFormv1
			,data: ({ frmData: frmData })
			,dataType: "json"
			,success: function(data) {
				frmObj.formHash(data);
			  }
			  ,error: function (xhr, textStatus, errorThrown){}	
		});

		return false;
	});
});

This is the function in our CFC where we will update at least one form value. I am changing the return type and return format from “plain” to “json” to demonstrate a point.

<cffunction name="ProcessFormv1" access="remote" output="false" returnType="struct" returnFormat="json">
	<cfargument name="frmData" required="yes" type="string">
	<cfset var formStruct = {} />

	<cfset formStruct = DeserializeJSON(arguments.frmData)>

	<cfset formStruct.myField1 = "I've been updated!">

	<cfreturn formStruct>
</cffunction>

I do not have ColdFusion for my portfolio web space, so you’re going to have to take my word for the following. The above has a problem. In CF8, it would eliminate leading zeroes from a text input. That seems to be resolved in CF10, but another problem remains. If you put in a considerably long number, such as 1245678901234567890123, when the application puts the form data back, that number would look like 1.245678901234568e+21, and we don’t want that!

The solution I found was the JSONUtil project: http://jsonutil.riaforge.org/. I downloaded the project and put the two CFCs into my CFC directory. With that done, here is an updated function:

<cffunction name="ProcessFormv2" access="remote" output="false" returnType="string" returnFormat="plain">
	<cfargument name="frmData" required="yes" type="string">
	<cfset var formStruct = {} />

	<cfset formStruct = DeserializeJSON(arguments.frmData)>									
	
	<cfset formStruct.myField1 = "I've been updated!">
	
	<cfset JUtil = CreateObject('component','JSONUtil')>
	<cfset formString = JUtil.serializeToJSON(formStruct,"false","true")>			

	<cfreturn formString>
</cffunction>

Other issues that one may encounter though I could not reproduce them at a later point is date formats returning with “\/” as in 11\/\08\/2017 instead of 11/08/2017. You can add the following under the assumption you would never need \/ in a string:

<cfset formString = Replace(formString,"\/","/","ALL")>

If you see a debugging message that says something like “Cannot use ‘in’ operator to…”, this might solve your problem. It happened within the jQueryField plugin.

Find this piece of code in jquery.field.js:

// if we're setting values, set them now
} else if( n in map ){

Change it to:

// if we're setting values, set them now
} else if (map.hasOwnProperty(n)) {

I used that as my solution based on what I found here: Javascript’s hasOwnProperty() Method Is More Consistent Than The IN Operator.

All of these items together allow us to pass form data back and forth as needed and is especially helpful with web application development, such as allowing validation before a form is submitted.

If you appreciate any of the work that went into making this post, please consider giving a tip to my PayPal account or supporting me on Patreon.

Using the DataTables Plugin

My work involves showing many tables, so I use a jQuery plugin called DataTables quite a bit. For the example I want to show you, we need jQuery, jQuery UI, DataTables, and the Buttons extension for DataTables. Additionally, I will share standard custom styling I’ve done in CSS.

These are the scripts and CSS files we will be using for reference that are NOT my customization. Most links were found using the download tools on the DataTables website. The jQuery smoothness CSS file is from the Google Hosted Libraries.

<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/buttons/1.4.2/css/buttons.dataTables.min.css"/t>
<link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.6/themes/smoothness/jquery-ui.css" type="text/css" media="all" /t>
<link rel="stylesheet" href="https://cdn.datatables.net/1.10.16/css/dataTables.jqueryui.min.css" type="text/css" media="all" /t>
<script src="//code.jquery.com/jquery-1.12.4.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jszip/2.5.0/jszip.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.32/vfs_fonts.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.32/pdfmake.min.js"></script>
<script src="https://cdn.datatables.net/1.10.16/js/jquery.dataTables.min.js"></script>
<script src="https://cdn.datatables.net/1.10.16/js/dataTables.jqueryui.min.js"></script>
<script type="text/javascript" src="https://cdn.datatables.net/buttons/1.4.2/js/dataTables.buttons.min.js"></script>
<script type="text/javascript" src="https://cdn.datatables.net/buttons/1.4.2/js/buttons.colVis.min.js"></script>
<script type="text/javascript" src="https://cdn.datatables.net/buttons/1.4.2/js/buttons.flash.min.js"></script>
<script type="text/javascript" src="https://cdn.datatables.net/buttons/1.4.2/js/buttons.html5.min.js"></script>
<script type="text/javascript" src="https://cdn.datatables.net/buttons/1.4.2/js/buttons.print.min.js"></script>

Now, the script to make the DataTable:

<script>
$(document).ready(function() {
	var table = $('#example').DataTable({
	"bJQueryUI": true,
	"bPaginate": true,
	"aLengthMenu": [[20, 50, -1], [20, 50, "All"]],
	"iDisplayLength": 20,
		buttons: [
    			{
        			extend: 'copyHtml5'
    			},
    			{
        			extend: 'excelHtml5',
        			title: 'VGCharacterst'
    			},
    			{
        			extend: 'pdfHtml5',
        			title: 'VGCharacterst'
    			},
		"print"
		]
	});

table.buttons().container().insertBefore( "#" + TableID + "_filter" );
</script>

The code starting with “var table = $(‘#example’).DataTable({“ is to indicate the example DataTable should use jQuery UI, have pages, show pages of lengths 20, 50, and All with 20 being the default length, and then use the Buttons extension. The code afterwards makes the buttons visible on the page.

Here is what the table looks like with the CSS from my own default work folder pages but not any custom DataTables styling yet:

For the ways my work uses DataTables, that is too much padding because we display more information than that, and it’s harder to separate the rows. I want it to be tighter all-around but not so tight as to have zero padding anywhere.

Here is the CSS that will change the appearance as wanted:

/* Odd stripes (including sort 1 column)*/
.dataTables_wrapper .odd {
	background-color: #fff;	
}

/* Even stripes (including sort 1 column) */
.dataTables_wrapper .even {
	background-color: #f0f0f0;
}

/* Border for table and width */
.dataTables_wrapper table {
	border-spacing: 0;
	border-collapse: collapse;	
	border: 1px solid #afafaf;
	width: 100%;	
}

/* Hover color as a light blue */
.dataTables_wrapper table tbody tr:hover td {
	background: #A4CAEF;
}

/* Show x rows width and float to the left */ 
.dataTables_length {
	width: 35%;
	float: left;
}

/* Show x rows and search box padding and bottom margin */
.dataTables_length, .dataTables_filter {
	padding: 10px 0px 0px 10px;
	margin-bottom: 7px;
}

/* Showing x of x placement (lower left with some padding) */
.dataTables_info, .dataTables_wrapper .dataTables_info {
	width: 45%;
	float: left;
	padding: 5px;	
}

/* Adds some padding to bottom for pagination buttons */
.dataTables_wrapper .ui-buttonset { padding: 10px; }

/* Removes padding on wrapper above/below table */
.dataTables_wrapper .ui-toolbar { padding: 0; }

/* Removes noticeable border for table lacking a footer */ 
table.dataTable.no-footer { border-bottom: 0; }

/* Bolds Show blank entries and showing 1 of x  in wrapper. */
.dataTables_wrapper .ui-widget-header  {
	font-weight: bold;
}

/* Floats the search filter to the left so it's in the middle-ish area instead of too far to the right */
.dataTables_wrapper .dataTables_filter {
	float: left; 
	text-align: left;
}

/* Lowers padding on table header cells  */
table.dataTable thead th {
	padding: 2px 2px 2px 4px;
}

/* Hides the sorting icon */ 
.DataTables_sort_icon { display: none; }

/* Removes bottom border along bottom of a given row, lower padding on table body cells  */
table.dataTable tbody td {
	border: 0;
	padding: 2px 2px 2px 4px;
}

/* Places buttons in upper right with some padding */
div .dt-buttons {
	margin-top: 0;
	margin-left: 10px;
	float: right;
	padding: 10px 2px 10px 4px;	
}

/* Removes spacing between buttons */
div .dt-buttons a { margin-left: -10px; }

Here is the page with the custom styling done and a screenshot below:
http://www.cathygreunkeweb.com/demos/DataTables.php

I eventually created a function upon seeing how frequently my work used DataTables. Sometimes they would be paginated, and sometimes not, and sometimes I wanted a custom filename, but using buttons*, jQuery UI, and having a preferred length were common.

My function, a little modified for the example:

<script>
	var StandardDT = function(TableID,bPaginate,FileName) {
		
		bPaginate = (typeof bPaginate === "undefined") ? true : bPaginate;
		FileName = (typeof FileName === "undefined") ? "" : FileName;
		
		var oTable= $("#" + TableID + "").DataTable({ 
			"bJQueryUI": true,
			"bPaginate": bPaginate,
			"aLengthMenu": [[20, 50, -1], [20, 50, "All"]],
			"iDisplayLength": 20,
		        buttons: [
		            {
	        	        extend: 'copyHtml5'
		            },		
		            {
	        	        extend: 'excelHtml5',
	                	title: 'FileName'
		            },
		            {
	        	        extend: 'pdfHtml5',
	                	title: 'FileName'
		            },
				"print"
	        ]
		});

		oTable.buttons().container().insertBefore( "#" + TableID + "_filter" );
	}
</script>

Then in a script placed after the table is created:

<script>
$(document).ready(function() {
	StandardDT("example",true,"VGCharacters");
});
</script>

*Buttons – Much of my work uses a retired extension called Table Tools that do a similar thing, shows buttons allowing copy/export/print. The code was written some years before the Buttons extension used here existed. In the interest of showing an active extension, I have learned and shown modified work here.

Using a JSON string prepared in ColdFusion for Autocomplete use in jQuery

The below post was originally written in September 2012 for my Tumblr. I still use this set of tools for auto-complete when creating questionnaires for my current employer and later used it for internal  uses to auto-fill entries in some of their tools and one of our clients for an entry form their vendors use.

The goal was to use jQuery UI’s Autocomplete widget and the source for what would fill in such entries was a query result set, namely a list of questions.

The next day, I decided that I wanted Autocomplete restricted to strings that started with what was being entered but to still be case insensitive.

The process went as follows:

-Use AJAX to call a CFC that would query the questions

-Return the list in an acceptable JSON structure for use in Javascript/jQuery.

-Place that array as the source for Autocomplete

-Set up Autocomplete to my specific requirements

Here is our basic ajax call. We make the result a variable since that given result is what we will be passing to Autocomplete.

var arrQst = $ajax({
	url: "path/Filename.cfc?method=GetQuestions"
	,async: false
	,type: 'POST'
}).responseText;

Here is our CFC function:

<cffunction
	name="GetQuestions"
	access="remote"
	returntype="string"
	returnformat="plain"
	output="false"
	hint="I return a list of questions">
	
	<cfquery name="qryQuestions" datasource="master">
		Select Question
		From tblQuestion
	</cfquery>
	
	<cfloop query="qryQuestions">
		<cfset returnStruct = StructNew() />
		<cfset returnStruct["value"] = qryQuestions.qst />
		<cfset ArrayAppend(result,returnStruct)/>
	</cfloop>
	
	<cfreturn serializeJSON(result) />

</cffunction>

The part after the query is the part of interest to us. That is what puts the results into a JSON structure that our jQuery will understand.

Here is our HTML input

<input type="text" name="inputstring" id="inputstring">

Here is our jQuery for Autocomplete:

function split( val ) {
	return val.split( /,\s*/ );
}
function extractLast( term ) {
	return split( term ).pop();
}

$("#inputstring#")
// don't navigate away from the field on tab when selecting an item
.bind( "keydown", function( event ) {
	if ( event.keyCode === $.ui.keyCode.TAB &&
			$( this ).data( "autocomplete" ).menu.active ) {
		event.preventDefault();
	}
}).autocomplete({
	minLength: 1,
	source: function(request,response) {
		var StringList = jQuery.parseJSON(arrQst);
                var matches = $.map( StringList, function(q) {
		//Check this pattern, starts with what is entered, 
                       //case insensitive
		var patt = new RegExp("^" + request.term, "i");
		//variable to hold if pattern matches
		var isMatch = patt.test(q.value);
		
		//if so return the string
		if(isMatch == true) {
			return q;
		}
	});
		response (matches);
	},
	focus: function() {
		// prevent value inserted on focus
		return false;
	},
	select: function(event, ui) {
		var terms = split( this.value );
		// remove the current input
		terms.pop();
		// add the selected item
		terms.push( ui.item.value );
		this.value = terms;
		return false;				   
	}
});

There were some extra steps that I must have researched nearly a year ago with the split and extractLast, from an older project, so I won’t be going over them. Here, the part of interest to us is what’s under source. There, we go over our array, check it against a regular expression to determine if the beginning what is being entered matches the values being checked in the array. We disregard case though. That way, if our user enters “the long…,” it will bring up any string that starts with those letters.

And voila, fantastic Autocomplete functionality, should be quite useful for increased productivity.

Tekken 7 Review

Greetings, all. I’m Cathy also known as Cat to some people. I’m going to review Tekken 7. If you’re unfamiliar with me, I’m a huge fan of Devil Jin and Jin Kazama. In fact, I mostly play these games for those characters. I do not play at a competitive level and mostly practice and fight the CPU in modes provided by the games. I will approach the game from this viewpoint, and a very large chunk of it will be about the story.

In fact, that’s where we’ll start. I am not going to shy from spoilers, so if you care about that, stop watching now. The story presented to us throughout the trailers over the years is Kazumi asking some figure, we later learn to be a guest character, Akuma from the Street Fighter fighting game series, to kill Heihachi if she can’t. He’s going to do all these terrible things, he being Heihachi, and the trailers build up this big final showdown between Heihachi and Kazuya with Jin not at all present. Kazumi aside, Tekken players have seen this story before, and it ended with Jin being a big factor-by that, I mean Tekken 4.

Well, in the case of Tekken 7, we got the story that was advertised. I’ll say that. And I had a lot of complaints about Tekken 6 not being that, because that was going to be some big showdown between Jin and Kazuya and instead, we got an entire mode dedicated to two crappy expansion characters. Of note, Alisa is one of my mains, but my head-canon of her is extremely different from Namcanon. I even change her name to Melissa to indicate she’s my version of Alisa.

I think the story mode was handled better in that I got to be some different characters as opposed to stuck with two expansion characters. Overall, I still prefer the Tekken 5 approach best. In that game, characters get prologue art, a cut scene or two I call interludes with other characters they meet at the tournament, of relevance to them, and then an ending.

The story itself is really bad. Let’s start with the voice-over telling us repeatedly throughout the story that fighting is about who’s left standing, nothing else. That’s it? Nothing about training? Nothing about learning through failure to be better? And while we’re at it, “left standing” and “still alive” can mean two different things, but the context of the climactic moment in this game is Kazuya kills Heihachi, which would mean that main theme of the story then is that in order to fight, you should kill the person so you are the only person left standing. I don’t think that’s a good message. And I think even if the message were that the game seems to confuse fighting with winning and to me, they’re not the same thing.

Another bad component of the story is the Jin hunt. There are a lot of characters who should be going after Jin in some capacity: Kazuya, Raven, Miguel, Hwoarang. Nina was having the Mishima Zaibatsu search for him, but when Heihachi showed up and took the Mishima Zaibatsu from her, his logic went that in order to expose Kazuya, he needs Jin and my initial reaction that was, “No, you don’t.” And then the story proceeds with them not getting Jin and exposing Kazuya anyway, so that pretty much confirmed exactly what I thought. And do not get me started on Lars. Oh, nope, it’s too late, we have to do this. If you don’t know me, Lars is my most hated character ever. He goes after Jin under the pretense of, “We have to put everything on Jin. Now my initial reaction was, “I don’t know what he means. What, like execute him, put him on trial? What?” And by the way, no, he doesn’t.

So let me see if I have this straight. This turd from the last game, last mainline story game, went and took over half of the Tekken Force, as part of some rebellion to the hostile world take-over and then after he gets exactly what he wants in Tekken 6, he still think she needs Jin, that Jin can solve the entire world’s problem because Jin was the entire world’s problem. Now I have always had a problem with the fact that Tekken 6 includes this “over half” line of the Tekken Force because I don’t actually believe some half-baked expansion character can do that and this now half-baked plot point only further convinces me. But anyway, Jin’s like, “yeah, the solution for everything is for me to kill Kazuya because I have the Devil’s blood.”

Now, they could have made this work better with instead of saying, “We need Jin for reasons that don’t make sense, actually, we don’t want Jin’s body in the wrong hands because the likes of Kazuya or the UN may not simply kill him but try experiment on him, and he’s dangerous because Devil.” Oh, and you do not save people from tyranny by killing one person.

I really wish I could be done talking about Lars, I hate him so much, but this story is so, so bad. I hated playing Scenario Campaign, and I especially hated the contrived drama of Alisa’s shutdown as some dramatic death and the ridiculous excuse for a friendship these two had and all of this awfulness is shown as, “yeah, we really did that, and we’re sticking by it.” Alisa could be so much more and better without him. But anyway, back to that annoying butt-head. The story also says that the only reason Heihachi fathered this turd was to prove that he did not have the devil gene. The story also says Heihachi dropped Kazuya off a cliff to prove it to him that Kazuya had the devil gene. Otherwise, the fall would kill Kazuya. So, based on the game’s own logic presented in its own story mode, Lars should be dead because Heihachi would have killed him in trying to prove he did not have the devil gene and yet…what a failure.

The narration is by a man who lost his family to the war, and one of the reviews I skimmed said the deadpan narration was comical though perhaps not intended to be so. I mainly found the opening funny because I wondered what story I walked into that started talking about a son’s love for his father. Anyway, I kept wondering if he’d be Gigas or something, but no, and overall, I don’t think I cared for it. The story mode focuses on the Mishima family so a lot of characters do not make the cut for having a presence here, yet nameless here does.

Can you believe that I’m still not done in telling you how bad this story is? So, as mentioned earlier, Kazumi asked Akuma to kill Heihachi and, we later find out, Kazuya too. Akuma, he’s in this story even though a lot of other Tekken characters aren’t, goes to do that, defeats Kazuya, and given that he was asked to kill him, said he was there to kill him, guess what he did not do? He did not check to see if Kazuya was dead, meaning he did not kill him. He just left!

I feel disappointed that Kazumi really was dead because that means we have five Mishima characters throughout the series (Heihachi, Kazuya, Jin, Jinpachi and now Kazumi), and the only woman among them is the one who is so definitively dead, her role in the story is actually a flashback even though she was the arcade boss.

I’m almost done on the story part. After you beat the story mode, you can get endings for other characters by playing their episodes. On the one hand, this made unlocking their endings really easy. On the other hand, most of these endings were not very good and even if they had good points, they were generally pretty short, presumably because of time and effort dedicated to the awfulness of the Mishima story. Devil Jin appears in his own and Hwoarang’s episodes. Jin appears in Miguel’s. I knew going into this game that I couldn’t think of any version of the story that would satisfy me after the debacle of Tekken 6 so my main bar was some good Jin and Devil Jin footage and there was so little of it, I’m overall disappointed.

Onward, to everything else.

Arcade Battle is only 5 matches and left me confused with the ending of Akuma flexing his power and then getting a Game Over screen, thought I’d done something wrong. I haven’t really looked back since playing the story mode. Treasure Battle is similar to past Ghost Battle modes, but you do not get to pick from three different opponents and you do have to deal with these gimmicks like turbo battle, double damage, aerial combo and Special Matches against certain characters. They are Kazumi, Heihachi, Devil Kazuya, Jin Kazama, and Akuma. After awhile, these gimmicks are mildly annoying and if I’m not in the mood, I will exit. Rare items are too rare. After awhile, you’re mostly earning money and just waiting around to hit the 2,000 battle mark to unlock everything at once. I mainly wanted Jin’s Tekken 6 coat and since I’m not very good at using him, I tried Katarina and Lucky Chloe some, that also took a long time.

The practice mode is great. It has the usual elements and maybe past games had this feature, and I didn’t notice but you can practice at specific points in the stages that have wall, balcony and/or floor breaks. I’ve done a lot of practicing. I think because I didn’t play Tag 2 much and my mind struggles a lot since November 9th of last year, it helps alleviate stress and maybe one day, I’ll be able to do those electrics every time or almost. I can say that I’ve been doing them more often and even got up to 3 at once.

New game-play mechanics include a Rage Art and Rage Drive. I love using Rage Arts. I usually don’t even try for a Rage Drive but if I keep practicing, maybe I’ll work them in. Devil Jin starts with a hellsweep, but the one or two times I focused on trying it in a Treasure Battle match, it didn’t go well and I guess I gave up on it. I saw this really powerful Rage Drive combo with a Katarina player on Twitter and tried to learn it. I never did, but I learned the first part, and she has since become one of my mains. Hopefully, I’ll remember to go back to trying it. My mains this time around include Devil Jin, Jin Kazama, Katarina, and Alisa. To a degree, you could include Lucky Chloe though I admit, it was mostly for manipulating the CPU. I picked up at least one combo. And you know, I wanted to add more mains, but when you start dedicating time to specific characters to learn more. well, it feels like there’s only so much room in my brain for them sometimes. I missed Xiaoyu and Lili so played them a little but when I do a rotation of my main characters in Treasure Battle, I don’t even think of trying them. Maybe I will, now that I’ve written this review.

That was quite a tangent but back to mechanics. Bound is gone, and now we have um, a tailspin move, and I don’t remember on Tekken Zaibatsu if the “s” stood for “spin” or for “screw,” and the game itself doesn’t seem to actually say, so, but it’s a spinning move. And the spin can be used in combos. There are also, some moves have new properties called Power Crush, like Jin and Devil Jin have had Corpse Thrust for at least since Tekken 5, no, even longer um, but that is now a Power Crush move. Um, and for someone like me, that was extremely helpful against the CPU in Treasure Battle. The game lacks other usual modes from past games like Survival and Team Battle. Um, I liked Team Battle so I miss it. Survival’s nice too, I mainly like miss Team Battle though.

Customizations are again not as good as what Tekken 6 offered. My Alisa customization in Tekken 6 wore a blue best over a long-sleeved black shirt, not an option. She wore shorts with her Battle Boots. You can get the Battle Boots this time but if you want to use them, they are with the bikini bottom. Again for all the tops like in Tag 2, you cannot pick say a specific pair of gloves you want with a shirt or jacket. Gloves either come with it or they don’t. The hair options regress even more because I can no longer get the bushy ponytail I used to be reminiscent of Leona from King of Fighters for Alisa. For me, that is a significant part of my vision for the customization I want so that was a loss. I’m thinking about making a video of how backwards customization has gone for another time.

Another thing that’s gone is replays. They’d be a few seconds to show what happened at the end of the match, and you could use that time to pick a button for a specific win pose if you wanted. You can still try to get a win pose you want, but the time frame is much tighter, and I miss the actual replays themselves as well.

The game has this cool feature that offers a jukebox where you can customize what music you listen to in the game. You can use tracks from past games, and that’s really great. I tend to turn the music off because I concentrate better with none at all in Practice, and then just don’t bother turn it back on a lot of time but when I do have it on, I don’t like some of the Tekken 7 tracks, so I’m glad I had this feature to set them to other ones.

Moving on, I really, really love that technology has come to a point where we can all so easily share things, especially on PS4. I can show off my customizations and clip some random funny thing that happened. I’ve even used it to analyze what I might be missing in practice through like a frame-by-frame replay.

Quick remark on customizations. Before Patch 1.03, you could get some really dark black colors on your people and then after the update, many of them turn to a lighter gray that I know myself and others did not like at all. That it was so hard, it was hard to see sometimes, like in actual matches, but I find it hard to believe that it couldn’t be better handled.

Anyway, back to sharing. I can see if my PS4 friends liked the things I shared on Twitter. Another perk of technology sharing is being able to watch so much top-level Tekken play so easily, thanks to YouTube and Twitch.

So, all in all, I found some things to enjoy this game, and I do intend to keep playing. Um, but I do kind of feel, that with the long wait, um, and even with my, what I felt, tempered expectations, of kind of saying, I didn’t like Tekken 6, I didn’t like these things, I know that these things can happen again, and trying to ready myself for what it could be, I’m still disappointed that so many things changed and not for the better. And I do hope that eventually, if this series continues, um, we can go back to a better place, similar to what we had before instead of feeling like the series is slowly stripping away some of the, a lot of the things that we took for granted um, in enjoying what Namco, not gave us, but you know, they put forth for us to buy. And so, you know, hopefully things will get better. Well, let me re-phrase that because I am not an optimistic or hopeful person when it comes to Tekken. Um, it’ll be nice if that ever happens. I’ll say that. I do not expect it to happen and it is, I do hope, that things do not keep getting worse. At the very least, I can say that.

So anyway, thanks for listening and/or watching my video. Bye-bye.


Affiliate Link:
Amazon.com: Tekken 7 for PlayStation 4

If you appreciate any of the work that went into making this video, please consider giving a tip to my PayPal account:
https://www.paypal.me/sonkitty

The Fifth Season – Book Review

The below post was originally written in November 2016 for my Tumblr and has been copied and back-dated here to match that.

Spoiler warning: I will talk about really big and important spoilers in this book.

This book was so interesting. I read it because it won a Hugo award and some of the writers I follow on Twitter said it was really good when that happened. Plus, it was on sale a few weeks ago. Anyway, it starts by inviting the reader to begin with the end of the world, the world being a place called the Stillness. One of the book’s characters causes something terrible to happen, intentionally destroying a city in the process. That’s only the beginning consequence though, compared to happen to the rest of the Stillness and not meaning much to you, right away, in light of a tragic event happening in your life at this time too.

Yes, that’s right: you are a character in the book. You have whole chapters dedicated to what you’re going through, telling you what you’re doing and how you feel, where you’re going and your purpose in that trek: the search for your daughter who might still be alive with the husband who killed your three-year-old son. Your chapters are between those about Damaya and Syenite. You know these two though the reader doesn’t know you know them at first. You know them because they were you at earlier points in your life, and those things they went through culminate into what you’re experiencing at this stage of your life.

Now we’re going to switch, reader, so that so you are not the second-person character in the book, Essun, but back to being my reader. Essun is an orogene, and it took a long while for me to check and realize the book had a glossary to state more explicitly what that means. Orogenes use orogeny. Orogeny is the “ability to manipulate thermal, kinetic, and related forms of orogeny to address seismic events.” Orogenes are dangerous and oppressed. They are used and denied human status with much effort into controlling them. Stills, people without orogeny, outnumber and fear them, sometimes killing them in their prejudice or calling on others to rein them in and take them somewhere else.

Instead of the more common “Mother Earth” reference of our own world, this one has “Father Earth,” and “evil earth” is a phrase used to exclaim or express frustration. The people still swear with a word like “fuck,” but they do so along with “rust.” In the chapter that Damaya meets her Guardian, Schaffa, he tells her, “You’re a gift of the Earth – but Father Earth hates us, never forget, and his gifts are neither safe nor free.” This earth in the Stillness is a dangerous place where people fight to survive, based on their teachings from stonelore, telling them how to manage until the next Fifth Season. On and on it goes, manipulating the orogenes all the while.

Like many other media items I review for this blog, The Fifth Season contains some ableism regarding mental health, including a casual use of “crazy,” as Essun thinks and decides things, using the word as a descriptor. On a more serious level, Essun considers that a man, her husband, Jija, that killed his own child, might not fit the label of “sane” and that in her trauma of not thinking for two days, she might not either. Trauma can affect a person’s mental health, such as PTSD, so her acknowledging it has some merit, but it still might fall into the trap that “crazy” equals “bad.” I’m conflicted and uncertain because I know some people on Twitter I follow and respect use “crazy” for themselves in a way to reclaim it. The part relating to Jija is more overt in being a problem.

In March earlier this year, a 4-year-old girl named Leiliana Wright died in Grand Prairie, Texas. She was killed due to abuse from her mother and mother’s boyfriend. She is not the only abused child to die in Texas, and right now, the state I live in is in a crisis where CPS is underfunded. Children are hurt or dying. I bring this information up because I want to point out the harsh and upsetting truth that child abuse is real and common enough for the number in Texas to reach into the thousands. It shouldn’t be, but it is. Essun’s urge to question Jija’s sanity stems from the wrong belief that we can lay blame on a person’s mental health condition instead of the actions they committed and the sum of all the system in place of her world amounting him dehumanizing his own children the instant he learns they are orogenes. Oppression is deliberate and in a system perpetuating the belief that orogenes are dangerous, deadly non-human beings, killing one, even if that one is a person’s child, is in fact, the system at play, working as intended. It is morally wrong, and the immoral action is not the product of mental illness. Even if it were, people commit immoral actions without having mental illness all the time. In the end, sane or not, Jija still killed his son.

The novel explores systemic oppression at length, from questioning the history that’s been erased to showing how orogenes are treated by others, to how Essun, throughout different periods of her life, has felt, trapped by it. For instance, in the chapter where the reader is introduced to Syenite, she must meet with Alabaster, the highest-ranked, ten-ringed orogene. Each chapter concludes with some written work as part of the world-building, such as a proverb or part of the stonelore rules. The chapter introducing Syenite and Alabaster ends with a blurb about telling “them,” presumably referring to orogenes, they can be great someday, that they must be perfect to be respected on the same level as everyone else, making them bend over backwards for what they can never achieve.

The book does not offer a resolution to Essun’s driving purpose of trying to find her daughter and instead has her stop for a bit in one place and meet up with the very man who set the whole season in motion at the book’s beginning. To be honest, I didn’t even realize that, fully realize it, until I was trying to decide if I would buy the sequel or not. I did buy that, by the way, though I don’t think I’ll be reviewing it. This book was good, so I recommend it, assuming you have an interest in the science fiction and fantasy genre and its sequel.


Affiliate Link:
Buy The Fifth Season on Amazon.com.

Or, if you appreciate any of the work that went into making this book review, please consider giving a tip to my PayPal account:
https://www.paypal.me/sonkitty