X39.io
A fancy world of magic, unicorns and a raging lazy dev

[BotW] Seriously Nintendo fanboys ... the fuck is it with you?
by X39


Somebody not liking your game as much as you do through your fanboy glasses does not means they hate it...

they just do not use your fanboy-glasses and see the problems which also exist.

Example?

BotW is a good and solid game. It makes fun, got a beautiful world etc. etc.

However!!! It has design flaws which are unavoidable and probably annoyed most of the people playing the game.

Want examples?

The weapon durability system is horseshit... if weapons would "just" break and you could repair them if you bring them to a smith, probably ppl would be more ok with it. At last, it is a neat addition but executed horrible in a way that annoys and is not an addition to the gameplay.

Cooking is fun, but not in BotW. Yes it is neat for the first few times you do it but then you notice a big bummer: You lack a ton of quality of life (from now just refered to as QOL) features. Starting at the simplest: you cannot easily repeat your last cooking or make a bunch with the same. Just crafting eg. a potion feels cumbersome due to you being in need of having the right stuff in your inventory (which is fine) but you cannot see if you even got the right category of items. Due to the interface design, it simply does not feels right when you continue playing and need to cook to get health items, potions etc. it feels like you waste your time as this could be more simple. A simple book for example that opens up and allows to recraft anything you like. Picking ingredients would still be simple, but should be limited to what actually can be used in the current recipe

Motion Control shrines are just awful! It does not feels right to be in need of precise movement when you always can 100% freely move and rotate your object. They feel completly unnatural and anybody thinking they are "nice addition" is right, just that the execution is so wrong. Examples? There are shrines where you have to move a hammer with motion controls. So far so good right? But the hammer just has to swing from the left to the right, hitting a large ball. This however is deadly hard simply because the moment you start moving your joycon, the game moves the hammer. When you then rotate the hammer, the ball will fall off the ledge simply because your hammer is rotated slightly. This feels awful and youre happy when youre done with it. No challenge just pure anger about a broken mechanic.

The defensive mechanics like Shield Parry or jump-avoid are also completly horrible. The timing spot is way to short to get it off reliably, the enemies do not announce their attacks good enough to visually feel it, ... There is simply so much wrong with this mechanic... not to mention that the moment there is more then one enemy, you are simply fucked because all of theese things will not work anymore. So even if you by magic sit through hours to learn to parry correctly, it is no usable skill simply because the enemy behind you will just straigth hit you without a chance to parry or actually see that he is there.

could continue days with this! And it is awful that you fanboys do not want to notice this.

Do theese things hinder me from playing the game? Fuck no. But they exist! Everybody touching the game will experience them, everybody will get annoyed by them (you too) and everybody normal will not enjoy theese things as much as they could.

Theese are the reasons, why BotW should not be even considered as a Game of the Year ...

but they also do not make the game a bad one ... it is just not a perfect game.

In case somebody is in need of Full-Width TreeViewItem background highlighting
by X39


The Style:


                    <Style x:Key="FullRowTVI" TargetType="{x:Type TreeViewItem}">
                        <Setter Property="Background" Value="Transparent"/>
                        <Setter Property="HorizontalContentAlignment" Value="{Binding Path=HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
                        <Setter Property="VerticalContentAlignment" Value="{Binding Path=VerticalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
                        <Setter Property="Padding" Value="1,0,0,0"/>
                        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="{x:Type TreeViewItem}">
                                    <ControlTemplate.Resources>
                                        <ss:StaggeredThicknessConverter Left="True" Length="19" x:Key="TVIStaggeredThicknessConverter" EndType="{x:Type TreeView}"/>
                                    </ControlTemplate.Resources>
                                    <Grid>
                                        <Grid.ColumnDefinitions>
                                            <ColumnDefinition MinWidth="19" Width="Auto"/>
                                            <ColumnDefinition Width="Auto"/>
                                            <ColumnDefinition Width="*"/>
                                        </Grid.ColumnDefinitions>
                                        <Grid.RowDefinitions>
                                            <RowDefinition Height="Auto"/>
                                            <RowDefinition/>
                                        </Grid.RowDefinitions>
                                        <Border Name="Bd" Background="{TemplateBinding Background}" BorderBrush="Transparent" BorderThickness="0" Padding="0" Grid.ColumnSpan="3">
                                            <Rectangle HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
                                        </Border>
                                        <ToggleButton x:Name="Expander" IsChecked="{Binding Path=IsExpanded, RelativeSource={RelativeSource TemplatedParent}}" ClickMode="Press" Margin="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type TreeViewItem}}, Converter={StaticResource TVIStaggeredThicknessConverter}}">
                                            <ToggleButton.Style>
                                                <Style TargetType="ToggleButton">
                                                    <Setter Property="Focusable" Value="False"/>
                                                    <Setter Property="Template">
                                                        <Setter.Value>
                                                            <ControlTemplate TargetType="ToggleButton">
                                                                <Grid Width="15" Height="13" Background="Transparent">
                                                                    <Path x:Name="ExpandPath" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="1,1,1,1" Fill="#444" Data="M 4 0 L 8 4 L 4 8 Z"/>
                                                                </Grid>
                                                                <ControlTemplate.Triggers>
                                                                    <Trigger Property="IsChecked" Value="True">
                                                                        <Setter Property="Data" TargetName="ExpandPath" Value="M 0 4 L 8 4 L 4 8 Z"/>
                                                                    </Trigger>
                                                                </ControlTemplate.Triggers>
                                                            </ControlTemplate>
                                                        </Setter.Value>
                                                    </Setter>
                                                </Style>
                                            </ToggleButton.Style>
                                        </ToggleButton>
                                        <Border Grid.Column="1" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}">
                                            <ContentPresenter x:Name="PART_Header" ContentSource="Header" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"/>
                                        </Border>
                                        <ItemsPresenter x:Name="ItemsHost" Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="3"/>
                                    </Grid>
                                    <ControlTemplate.Triggers>
                                        <Trigger Property="IsExpanded" Value="false">
                                            <Setter TargetName="ItemsHost" Property="Visibility" Value="Collapsed"/>
                                        </Trigger>
                                        <Trigger Property="HasItems" Value="false">
                                            <Setter TargetName="Expander" Property="Visibility" Value="Hidden"/>
                                        </Trigger>
                                        <MultiTrigger>
                                            <MultiTrigger.Conditions>
                                                <Condition Property="HasHeader" Value="false"/>
                                                <Condition Property="Width" Value="Auto"/>
                                            </MultiTrigger.Conditions>
                                            <Setter TargetName="PART_Header" Property="MinWidth" Value="75"/>
                                        </MultiTrigger>
                                        <MultiTrigger>
                                            <MultiTrigger.Conditions>
                                                <Condition Property="HasHeader" Value="false"/>
                                                <Condition Property="Height" Value="Auto"/>
                                            </MultiTrigger.Conditions>
                                            <Setter TargetName="PART_Header" Property="MinHeight" Value="19"/>
                                        </MultiTrigger>
                                        <Trigger Property="IsSelected" Value="true">
                                            <Setter TargetName="Bd" Property="Background" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
                                            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/>
                                        </Trigger>
                                        <MultiTrigger>
                                            <MultiTrigger.Conditions>
                                                <Condition Property="IsSelected" Value="true"/>
                                                <Condition Property="IsSelectionActive" Value="false"/>
                                            </MultiTrigger.Conditions>
                                            <Setter TargetName="Bd" Property="Background" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
                                            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
                                        </MultiTrigger>
                                        <Trigger Property="IsEnabled" Value="false">
                                            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                                        </Trigger>
                                    </ControlTemplate.Triggers>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                    <Style TargetType="{x:Type TreeView}">
                        <Setter Property="ItemContainerStyle" Value="{StaticResource FullRowTVI}"/>
                    </Style>```

The Converter:

using System; using System.Globalization; using System.Windows; using System.Windows.Data; using System.Windows.Media;

/// <summary>
/// Adds up the left margin of the upper visual tree up to the point where the <see cref="Type"/> is no longer matching starting at 0.
/// Expects the <see cref="DependencyObject"/> as value, will simply return value if passed value is not of <see cref="Type"/> <see cref="DependencyObject"/>
/// <see cref="UnsetOnNullConverter.ConvertBack(Object, Type, Object, CultureInfo)"/> will always return <see cref="System.Windows.DependencyProperty.UnsetValue"/>.
/// </summary>
public class StaggeredThicknessConverter : IValueConverter
{
    /// <summary>
    /// The length that should be added each time.
    /// </summary>
    public double Length { get; set; }

    /// <summary>
    /// Type that will be searched for. Continues to count until null or this.
    /// If not set, will count until different parent is encountered.
    /// </summary>
    public Type EndType { get; set; }

    /// <summary>
    /// Sets wether the top part of <see cref="Thickness"/> should be affected.
    /// </summary>
    public bool Top { get; set; }
    /// <summary>
    /// Sets wether the bottom part of <see cref="Thickness"/> should be affected.
    /// </summary>
    public bool Bot { get; set; }
    /// <summary>
    /// Sets wether the left part of <see cref="Thickness"/> should be affected.
    /// </summary>
    public bool Left { get; set; }
    /// <summary>
    /// Sets wether the right part of <see cref="Thickness"/> should be affected.
    /// </summary>
    public bool Right { get; set; }

    /// <summary>
    /// Converts a value
    /// </summary>
    /// <param name="value">The value produced by the binding source.</param>
    /// <param name="targetType">The type of the binding target property.</param>
    /// <param name="parameter">The converter parameter to use.</param>
    /// <param name="culture">The culture to use in the converter.</param>
    /// <returns>A converted value. If the method returns null, the valid null value is used.</returns>
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (!(value is DependencyObject obj))
        {
            return value;
        }
        var actingtype = obj.GetType();
        Type objtype;
        double leftmargin = 0;

        while((objtype = (obj = VisualTreeHelper.GetParent(obj)).GetType()).IsEquivalentTo(actingtype) || (this.EndType != null && !objtype.IsEquivalentTo(this.EndType)))
        {
            if (objtype.IsEquivalentTo(actingtype))
            {
                leftmargin += this.Length;
            }
        }
        return new Thickness(
            this.Left ? leftmargin : 0,
            this.Top ? leftmargin : 0,
            this.Right ? leftmargin : 0,
            this.Bot ? leftmargin : 0);
    }

    /// <summary>
    /// Converts a value.
    /// </summary>
    /// <param name="value">The value that is produced by the binding target.</param>
    /// <param name="targetType">The type to convert to.</param>
    /// <param name="parameter">The converter parameter to use.</param>
    /// <param name="culture">The culture to use in the converter.</param>
    /// <returns>A converted value. If the method returns null, the valid null value is used.</returns>
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return DependencyProperty.UnsetValue;
    }
}

python bullshittery - today: raw strings
by X39


dir = r"C:\somepath\log\"

results in SyntaxError: EOL while scanning string literal

lovely

Just killed my debian setup by accident ...
by X39


just took 8 hours to restore everything to a state where it was before (ok ... also fixed problems like reverse-dns lookup being wrong etc. :3)

anyways ... everything up running again

So ... you want to install a custom OS on your android phone ...
by X39


First of all: Congratulations! You chose a path full of pain, violence and incompetent idiots who do competent stuff ...

Want an example? Well ... if you are not by any chance using a mainstream-mainstream device (eg. Galaxy S4) you are fucked. Plan to buy at least one 64GB SD-Card as you most likely wont find any version of TWRP (the most common tool used for backup etc.) compatible with your phone AND up to date so that you can directly transfer to your PC.

Alternativly buy a USB-OTG cable, again it takes time for it to arrive on amazon or for you to find in your local electronics market ...

But what to do if you want to flash right now?

Well ... Skip Backup ... because for some reason those mind-dead developers thought it would be a great idea to write a comprehensive guide on how to build it on your own ... just ... that you cannot understand anything of it unless you ever build anything on your own.

Chances are you already did build something using make and eg. gcc, congratulations, the guide still is complete utter shit for you unless you did so for android :)

So you seek out again for the internet for more help...

New guide, new luck. This time, it tells you it is a step by step guide for people who have little to no experience in buidling android but want to LEARN how to do it ...

that LEARN already is a great indicator what is following ... a comprehensive guide how to do exactly nothing on a linux system ...

majority of those ppl facing problems here will be neither using LINUX nor they have ANY experience or ANY interest in learning how to build shit! FOR FUCK SAKE YOU MORONS ... you do stuff normal people want to use. You write guides for developers that are trying to get into that field. You do literally EVERYTHING to prevent ppl from using your shit clean thus they get frustrated and for fuck sake i exactly know that you hate those people for asking after they did not understood your "very comprehensive non-step-by-step guide to LEARN"

so ... here is what you have to do to actually avoid questions like that ...

  1. Write an actual step by step guide For some reason ... the knowledge about what a step by step guide is and why it is needed got lost somewhere in the eternal void of the internet ... so here is quickly a reminder: Step by Step guide can be done by setting up a new system (eg. in a VM, my comprehensive guide is: use apt to install it faggots) and then writing down EVERY interaction one does! Every mouse click, every input hell even if you move windows it can get important for the user (before you actually do this: DO NOT ... ppl tend to know how to handle windows). Also ... do not expect people to have your system, expect the major system to be used! The majority of people uses MS WINDOWS not any unix variant so fucking write your step by step guide from that perspective ... you only can build using linux? Then fucking write that down! Tell people they shall check out a step by step guide about how to install linux in a VM ...
  2. Fire whoever was responsible for the old guide Seriously ... whoever is too stupid to do the most simple thing in the world but rather writes down garbage for people who would ask for such things in IRC channels or EMAIL lists ... is not supposed to do any public relations shit.
  3. Clean up your pages simple example? Needed TWRP and lineageos for my SM-T560... there are multiple variants of this tablet out there, lineageos has no way to check for the modelnum whilst TWRP lists a magic SM-T560NU ... the dump idiot now thinks "ohhh thats mine!" but he is wrong like usual as the NU variant is qualcomm based ... incompatible stuff ya know ... so add more manifacturer info ... for fuck sake PLEASE how hard is it?! your whole page contains useless info but adding those things you need at build time anyways you cannot add?

If you follow theese 3 tiny steps, you are one step closer to actually being useful ...

Now here is my comprehensive guide to fix that whole shit for any tablet:

  1. Ignore those fuckheads and backup manually, either by your tablets manufacturer tool (giving you some crypting garbage backup you cannot use) or by downloading every file via eg. adb or another tool of your choice (google file transfer android and it should show up plenty)
  2. Make sure you actually backed up everything, no going back from here
  3. Try to find the right lineageos release for your phone ... use google to get the matching name for your modelnumber (do not just check the box as that is most likely not the full describor and there are differences in the models)
  4. Follow the actually really good guide of lineageos for your device (in case you need to get out of the download mode: PRESS ALL KEYS FOR ~5 SECONDS)
  5. Avoid using heimdall as it is a garbage tool (use odin)
  6. Burn your smartphone/tablet because nothing works
  7. Sleep a night
  8. Realize you slept over due to phone being still in recovery mode
  9. Repeat step 1-6 until it works
  10. Congratulations: you forgot to add google apps

I like trains - Today: Useful error messages
by X39


'malloc': 'void *(std::size_t)' differs in levels of indirection from 'void *(std::size_t)'