[–] 12 points 1 week ago

As someone with over 400 hours, expect the whole experience to be puddle deep. Granted, I last played in 2024, so my opinion is a number of updates behind, but from what I've seen up until then, the core of the game didn't change and nothing pointed to it changing.

The gist of it: every planet is procedurally generated and everything feels empty and lifeless, even when the planet has lifeforms. There are some cool looking planets, but they rarely have anything interesting on the ground. On-foot exploration is rarely rewarding in any sense. Points of Interest have some minimal distance between them and nothing besides your compass pointing towards the nearest one, with any building or settlement that has one of the 3 alien races in them being little more than a pit stop. There's very little variation in the POIs you can come across. Hell, even a town that you get to become a "mayor" feels like a big nothingburger.

You don't really "command" a fleet, especially because space combat is super basic and boring. At one point, you just get a big freighter for free and that's it. You can get other ships to join your fleet, but they don't do anything while in space proper, they just look pretty while there. You can send these extra ships on missions, then wait several hours for said missions to conclude. You'll likely forget you even sent them, not to mention upgrading your small ship to jump from star system to star system is much, much, much easier than upgrading your freighter - you need to explore derelict freighters, essentially "space dungeons" that are very annoying and slow, to get upgrades for your freighter.

The game has a "story", but it's pretty bland and not worth the time. Any quests the game offers can be abandoned and picked up again at any time and, when you do, they don't ask you to travel back, they just point to a nearby place or star. Hell, I remember there was an exploit that you could pile up several pirate bounty quests (you're tasked with killing a pirate in space), move to a star system over 2k light years away, reset all of them - which would cause them to ask you to kill a pirate in the system you're currently in - then fly out and kill one pirate for the prize of ALL of the quests. No idea if this has been fixed.

All in all, the game won't crush you, but the repetition and tedium might. Frankly, I recommend you try a pirate version first. If, 8h in, you feel like going further, buy it.

  • source
  • [–] 1 point 2 weeks ago* (last edited 2 weeks ago)

    Happened to every slot, even weapons with worse attack (got 64 ATK tentacle something equipped in place of a 400 ATK ban hammer twice), body slot often equipped green items with half the bonuses, same for legs. Ring, necklace, ward, helmet, they all got changed to something worse at one point or another

    Also, please revert the font back, reading some numbers is a mess right now - 2 and 8 look awful

  • source
  • parent
  • context
  • [–] 35 points 2 weeks ago (7 children)

    Open browsing is letting anyone read what the site has.

    My suspicion on why, is because AI bots and crawlers can just read the contents of the posts and send it back to whoever prompted, thus "stealing" clicks that would otherwise go into reddit proper and generate ad money

  • source
  • [–] 1 point 2 weeks ago (2 children)

    That does not explain at all "how to compromise a significant enough number of machines that never connect to the internet and whose firmware/code is audited by several parties and institutions before being compiled and installed on them", but I'll indulge you

    • Brazilian urns are not "closed source". As I stated in other comments, the source is open, entities can audit it before and after elections and universities have permanent access to the code.
    • The voting machines never connect to the internet. They don't even have a RJ45 slot.
    • The "prove this has not been tampered with" is a possible problem, but given how the installation of the software happens, with human oversight of multiple parties, chances of that happening are reduced.
    • For counting, after a check that everything went ok, the urns are locked and taken back to electoral tribunals, where the removable disks (USB) are read in a separate machine, which are then transmitted to the central processing system. There is a possibility of a "disk swipe" here and I don't know if there are any systems to check against that possibility.
    • There is a possibility of MITM attacks during data transmission, but checking back whether the file was correctly received (checksum) is trivial. His worries are again on "a system no one but a very select few can see". This is not the case for the Brazilian system, all involved systems are audited before, during and after elections, including by political parties. It doesn't fix the "average person won't understand how it works" problem, tho.
    • That Scottish case was funny for the fact that the result was a fucking spreadsheet
    • I fully disagree with him that it's easier to cast doubt on electronic voting than paper voting, see that "pencil lead under the nail" trick for filling blank votes or nullifying otherwise valid votes.
    • Voting from your own device is a stupid idea and thankfully it's not even being considered here

    All in all, of the problems Tom raised, only 2 are really valid for Brazil (prove the installed system wasn't tampered with, prove there was no USB disk swipe) and both are dealt with with multi-party oversight, which is the same thing used to protect the validity of paper voting.

  • source
  • parent
  • context
  • [–] 5 points 2 weeks ago (4 children)

    I might sound like a caveman stuck in 1995, but... Aren't forms just "send this info back to the server"? If your form points to an appropriate page you own (fill-the-form.php -> validate-form.php -> success.php), there's no 3rd party involved.

  • source
  • parent
  • context
  •  

    Elements of Ultima VII were inspired by game developer Origin Systems' conflicts with competitor (and later owner) Electronic Arts. Origin Systems' corporate slogan was "We Create Worlds", while the main antagonist of the story – the Guardian – is presented as a "Destroyer of Worlds". The three evil "Generators" created by the Guardian in the game take the physical shapes of the contemporary Electronic Arts logo: a cube, a sphere, and a tetrahedron. Elizabeth and Abraham, two apparently benevolent characters who later turn out to be murderers, have the initials "E" and "A".[10] Electronic Arts would acquire Origin later that same year, on September 25, 1992.

    EA, destroyer of worlds since 1992

    Elements of Ultima VII were inspired by game developer Origin Systems' conflicts with competitor (and later owner) Electronic Arts. Origin Systems' corporate slogan was "We Create Worlds", while the main antagonist of the story – the Guardian – is presented as a "Destroyer of Worlds". The three evil "Generators" created by the Guardian in the game take the physical shapes of the contemporary Electronic Arts logo: a cube, a sphere, and a tetrahedron. Elizabeth and Abraham, two apparently benevolent characters who later turn out to be murderers, have the initials "E" and "A".[10] Electronic Arts would acquire Origin later that same year, on September 25, 1992.
     

    This is a follow up to my previous post here - https://programming.dev/post/46041021 - For those that want a tldr: I'm making a php site for myself writing nearly everything by hand. The only external library I'm using is Parsedown.

    After a good time working on my site, I'm happy to announce that I've officially shared it with my friends^[I won't share it here as the site is tied to a different online persona of mine]! The site isn't really "ready" yet, but it's very usable and readable, so that's good!

    As for code quality? Well... It's kinda awful. Instead of this:

    class User {
      $login = new String();
      $email = new String();
      ...
    }
    

    I'm using named arrays (hashes)^[Kinda funny how associative arrays have soe many different names in other languages: hash, dictionary, map] everywhere:

    class User {
      $columns = array( 'login' => '',
      'email' => '',
      ...
    }
    

    "But WHY???", you might be asking. Well, to facilitate the creation of the database from zero! Here's an example of my trick:

    abstract class Common {
     /**
      a bunch of different, generic select and update functions
    */
    }
    class Users extends Common{
    $cols = array('uid'=> 'primary key auto_increment',
        'vc1_login'=> 'unique not null',
        'vc1_display_name'=> '',
        'vc2_password'=> 'not null',
        'dat_created_at'=> 'not null',
        'bol_enabled'=> 'default 1',
        ...
    }
    

    With this, the $key part of the hash doubles as the column name and their default/new values are always the details needed for the creation of their respective columns. I also treat the ::class as part of the table name. With a few functions, I can easily recreate the database from zero, something which I've tested a few times now and can confirm that it works great! Also, with key pairs, making generic SQL functions becomes very easy with foreach() loops of the $cols hash. Example:

    abstract class Common {
    public function selectColumns($columns, $table = '', $where='1', $orderby = '') {
            $conn = connectDb(); //static function outside class
            if ($table == '') {$table = $this::class;}
            $coll = '';
            foreach ($columns as $cols) {
                $coll .= $cols.', ';
            }
            $coll = substr($coll,0,-2);
            $stmt = $conn->prepare("SELECT ".$coll." FROM `T_".$table."` WHERE ".$where." ".$orderby.";");
            $stmt->execute();
            return $stmt->fetchAll(PDO::FETCH_ASSOC); 
    //Fetch_Assoc is used so I'm forced to always use the $key in the returned array
        }
    
    // This function will attempt to update all non-empty pairs of a given object
    public function updateColsUid(){
            $conn = conectaBanco();
            $sql = "UPDATE `T_".$this::class."` SET ";
            $keys = array('uid' => $this->cols['uid']);
            foreach ($this->cols as $key => $value) {
                if (($value != '') and ($key != 'uid')) {
                    $sql .= " `". $key. "` = :" . $key . " ,";
                    $keys[$key] = $value;
                }
            }
            $sql = substr($sql,0,-1);
            $sql .= " WHERE `uid` = :uid;";
            $stmt = $conn->prepare($sql);
            $stmt->execute($keys);
            return $stmt->rowCount();
        }
    

    The biggest problem with this is that if I ever remove, add or rename any of these $keys, it'll be a fucking chore to update code that references it. I'll look into using proper variables for each column in the future, especially as a database creation is something you usually only do once. On the plus side, this is the most portable php site I've ever did (1 out of 1, but whatever)

    Anyway, current functionality includes creating an account, modifying some aspects^[I want to note that there was a bunch of validation that I initially didn't think of doing, but luckily had a couple of "Wait, what if..." moments. One of those was to properly escape a user's username and display name, otherwise, when echo'ing it, <b>Bob</b> would show as Bob. While the fields probably wouldn't be enough to fit anything malicious (fitting something malicious inside a varchar100 would be a real feat, ngl), it's better to close this potential hole.] of it (profile description, display name (which is html escaped, so no funny business here), signature), logging in, letting the admin make new posts, letting anyone logged in comment on existing posts, comment moderation.

    I also keep track of every page visitors are going to, saving these to the database (user agent, IP, page visited) - this will be the table that will fill up faster than any other, but might also allow me to catch eventual bots that ignore robots.txt - supposing I can figure them out.

    Initially, I was planning on having each post select from a list of existing categories (category N -> N posts), but after some thought, decided against that and came up with a working alternative. Posts now have a single column where categories are manually written in, separated by commas. I later retrieve them with select distinct, explode() the string into an array and finally remove duplicates with array_unique(), making it easy for visitors, and for me, to get all the unique and valid categories.

    One thing I'm doing that I'm not sure whether it's good, neutral or bad design/architecture, is using the same site that has the form to also validate/insert data, as in: instead of having newpost.php and validate_and_insert_post.php files doing separate jobs, my newpost.php is the page has the form and also receives the form in order to validate and insert into the database.

    The whole thing's currently sitting at 220kb, unzipped, counting the leftover files that I'm no longer using. The fact that I can deploy this literally anywhere with a working php 8+ server without typing any terminal commands makes me very happy.

     

    cross-posted from: https://programming.dev/post/46365352

    Podcast longo, quase 2 horas, de Atila Lamarino com João Magalhães, falando sobre o "colonialismo dos dados", como as big techs estão dominando o mundo. A intro é bem longa, pra contextualizar bem o podcast pra quem tá mais por fora das notícias de tecnologia.

    Uma das frases soltas que achei muito interessante, "No ano de nosso senhor 2025, eu preciso estudar a Companhia das Índias Orientais pra entender como as big techs hoje estão funcionando"

    Outra coisa interessante que conversam é como Whatsapp virou, efetivamente, parte da infraestrutura de comunicação do Brasil, e por isso é praticamente impossível conseguir colocar qualquer alternativa no lugar.

    view more: ‹ prev next ›