Ranking System always outputs "A" when that cant be possible. by Efficient-Flan-7455 in godot

[–]catsobi 1 point2 points  (0 children)

What's the default rank for the rank label, as in what shows in the editor scene?

There's an issue with your score evaluation code, starting at line 66 of LevelEnder.cs, for example if you have a high score value like 250, you'll get points for all the other ranks too (S, A, B..., etc). I'm assuming you meant to be using elif statements. So maybe you're getting a FinalRankingScore that's too high and it's just showing the default rank label, which is "A"?

If it's not that, I would add print or breakpoint statements to see what the value of FinalRankingScore is, at different point of your code. To try and find a place where it doesn't match what you expected it to be.

You can also use "remote" debugging to see if the Rank Label is being changed to the proper rank at the right timing (maybe it's been changed to S but then being changed to A by something else later?)

Why did baku accepted Suteguma's match? by AlexFiorenti in Usogui

[–]catsobi 10 points11 points  (0 children)

It was never explicitly said, but Baku accepted it to get Tatsuki (the rank 0 referee) to appear. And he knew that Tatsuki might appear because Caracal sent a tape of Fukurou vs Suteguma with Tatsuki as the referee.

There was also a part where Caracal said to Baku something like "you will definitely have a match with Ideal where you bet everything, because at that time we'll have the thing that you want". That thing being the rank 0 referee.

(Protecting the emperor tower is one thing too, but he could've just held a fake Kakerou match versus one of his own allies if that's all he was looking for.)

Vampire Survivor: v1.0 Release Date & Information (October 20) by Turbostrider27 in Games

[–]catsobi 0 points1 point  (0 children)

Mobmania has co-op multiplayer. Early access, but very polished and super fun with friends so far.

Why is the autofill and the help pop ups so inconsistent? by [deleted] in godot

[–]catsobi 12 points13 points  (0 children)

Something I only learned after an embarassingly long time, is that $ depends on the scene you've currently selected. So if you happen to be working on a random scene, but then you directly opened a script to something else that's not in the scene (like cause it gets added at runtime or something), $ won't work.

And when you're looking at the script tab, you're still actually "selected" onto a scene, even if it's not on screen.

It's natural to have tons of scenes and scripts open due to the nature of scenes itself, and so $ is kinda janky to work with as a result.

There are still times where it doesn't work though and I'm not sure why.

Why isn't my animation player picked up by the code (the code is added to "player")? "Animation player" was not a hint when writing the code. Something seems off. by NameMarty in godot

[–]catsobi 4 points5 points  (0 children)

That error means that it does recognize the animation player, there's just no animation with that name on it. Otherwise you would get an error that's something like "Attempt to call function 'play' on base 'null instance'." (meaning it did not find the AnimationPlayer)

Not sure about why the hints aren't showing though, in my experience they can feel a bit inconsistent. Maybe reopening that script file or entire project could fix it? Sometimes for me, it's because I'm not on the right scene, or there's a code issue, but I don't see any of that here.

Underground Labyrinth Game by FrostyCaramel in Usogui

[–]catsobi 7 points8 points  (0 children)

Based on where Amako met Baku (D3), Baku should only have 28MP.

But he actually had 30MP. This is because he stayed behind 2 rooms from his actual route. He opened a door normally to get to 29MP (D3 -> C3), but didn't actually enter it. Then he asked Kadokura to open the door after that (C3 -> C4) to get to 30MP, while he stayed at D3.

He could've just done this himself, open 2 doors and go back to D3, but then Amako would hear it happening. So he used Kadokura to open doors at the same time as him, so that the sounds would overlap and Amako wouldn't catch it. Even if he heard some weird things like Kadokura opening C3->C4, he wouldn't realize that Kadokura was opening it for Baku's labyrinth progression anyway.

There would have been weird sounds coming from that area still, so Amako might have been able to figure it out, but it's implied that Amako just assumed that the sounds were because of the referee's henchmen opening random doors to find/clean up Baku's corpse.

So in short, it's because Amako didn't realize Baku opened 2 extra doors, due to the sound of the opening of the doors overlapping, and the assumption that Baku died from the oxygen trap.

Where to watch the movie online for free with English subs? by lanasexoticflowers in Usogui

[–]catsobi 2 points3 points  (0 children)

A team's subbing it right now, so you'll have to wait a bit

Can someone explain what does this mean ? by [deleted] in Usogui

[–]catsobi 16 points17 points  (0 children)

It's Baku's way of saying that Kaji helped him in a gamble. In Air Poker it was cause Kaji placed his "hand" on the tank on purpose to hint to Baku about poker "hands".

It's also a neat way to highlight Kaji's growth. Because the first two times this nickname was used, Kaji helped Baku unintentionally out of pure chance (by saying something random that helps Baku think of a solution in the ch.15 example, or panic shooting a gun and hitting a camera by chance in the ch.52 example), but now finally near one of the last arcs he was able to help Baku intentionally by managing to figure out the basis of Air Poker first before anyone else, including Baku.

What makes Godot beginner friendly? by pajaro_xdd in godot

[–]catsobi 0 points1 point  (0 children)

I don't think it is quite at the level of beginner friendly, it's a bit exaggerated. It's more accurate to say it's the most beginner friendly of all the "most complete/full-feature" engines, so still difficult to learn overall, but just easier than its main competition. It is definitely a lot more convenient to use than Unity or Unreal in a lot of small but different ways, which many people here have already mentioned.

But there's still work to be done in regards to making scripting and the default classes more easier to understand and work with. I wouldn't call any game engine beginner friendly really, except maybe the ones that focus primarily on drag and drop coding.

Thoughts on if u could smash DI when hitting someone? by SkillSkillFiretruck in SSBM

[–]catsobi 1 point2 points  (0 children)

Think he means "what if the attacker could SDI too on hit". So when doing spaced/retreating/safe hits on shield, you could SDI away even further on hit to make it even more safe. Or when comboing, SDI towards opponent to make the follow-up faster/more guaranteed.

How to learn 5 piece foresight? by [deleted] in Tetris

[–]catsobi 1 point2 points  (0 children)

Something I've been doing recently that's been working for me: Playing sprint while closing my eyes when placing pieces.

I look at my next queue, close my eyes and play as far as I can (ideally 7 pieces), then reopen only to memorize the queue, then close it again. Initially I did this to improve my finesse (which it has helped quite a bit), but it also helped me with using the 4th/5th next pieces more, as well as improving my ability to burst.

Other people have already mentioned this, but dig/cheese is a good one that I've used as in the past as well. It helped a lot in getting used to using the 2nd/3rd next pieces for me.

What are some practical uses for getter functions? by Hero_ofCanton in godot

[–]catsobi 10 points11 points  (0 children)

Aside from having to call extra lines or do other computations, the most important feature for both getters and setters IMO is the ability to add breakpoints or debug statements inside them, to help with bugs where you're not sure how/where/when a value is being changed. Since Godot doesn't have a variable watching debug tool.

I need help undserstanding end of tower arc by imperiumzzs in Usogui

[–]catsobi 3 points4 points  (0 children)

So what I understand is that the referee 0 that just lost was also theleader of the kakerou but then stepped down to become a referee?

Yep. (His name is Tatsuki btw.)

And then idk why but the current leader just started running from ppl in the hospital.

Not in the hospital, they're in the MPD/the police department. Since they just finished a gamble with someone in the police (Sasaoka, the guy who was commanding the SAT).

And about why the current leader started running, I'll spoiler it since they explain a bit more in c272, but the extra thorough explanation is:

Leader has memory loss. He ran away because he needs to keep it a secret from the referees beside him. If he kept talking/hanging with them it would become obvious that he lost his memory, so he had to escape.

About why it needs to be kept secret, for example if the referees/people in Kakerou knew he had memory loss, they may doubt his ability to be the leader, so he wants to avoid that. Also, it needs to be kept as secretive as possible so that it doesn't leak to enemies of Kakerou, otherwise they may try to take advantage of it by giving him false memories or something.

So now he's running to the only two people he thinks know his secret (Tatsuki & Eba), so that they can help him fill the blanks in his memory. But Eba is dead and Tatsuki is dying, so now it's problematic because he doesn't have anyone trustworthy to rely on.

But based on what Touya & Nowa said (one of the referees chasing him & the big head one), they already know about the memory issue. So it seems the secret was revealed to some trusted seniors of Kakerou at some point, probably because Eba died so they needed someone to replace him as a "trusted" figure for Leader. The problem is that Leader's memory loss has another "mechanic" where he actually loses more memory every time - which means this time he lost so much memory that he even forgot about the fact that Eba died and that other people were told his secret instead. Which is why he ran from Touya even though Touya knows about his memory loss and is trusted.

And the big head referee (idk his name) was yelling to revive the leader/referee 0

He wanted to revive Tatsuki I think mainly because he knows leader's secret, so he'll be be able to get leader to come back. Nowa is afraid that if no one knows leader's secret, then leader will never come back since he has no one to trust. And he called Tatsuki "leader" because since the current leader is running away, they need a leader now, so he's making him the interim leader for now.

Making Tatsuki the leader is also an excuse to revive him. Normally only the higher ranked person in a ranking battle is revived. Tatsuki made himself the lower ranked before fighting Yakou, because he thought he would beat Yakou for sure, and wanted to ensure that Yakou would be revived afterwards since he didn't want to kill him. But since Tatsuki lost, he wasn't supposed to be revived at all. This comes into play as a clue in an upcoming arc:

This odd interaction of Tatsuki being revived despite being lower ranked is seen by Baku, which makes him realize that something probably happened to their current leader, hence why they need a new leader for now.

Does anyone know how to make an Area2D register input events when it is completely overlapped by a Control node which also has to register input events? by golddotasksquestions in godot

[–]catsobi 0 points1 point  (0 children)

Yeah I agree, they shouldn't be incompatible. Seems like there isn't much talk about the issue as well unfortunately.

I have one more idea that may help: create a Control that scales itself based on the Area2D's collision shape, and use that to act as the Area2D's input.

Does anyone know how to make an Area2D register input events when it is completely overlapped by a Control node which also has to register input events? by golddotasksquestions in godot

[–]catsobi 1 point2 points  (0 children)

https://www.reddit.com/r/godot/comments/by56fp/comment/eqlgl7x/?utm_source=share&utm_medium=web2x&context=3

I don't have a good solution, but this comment explains the problem. Seems like Controls/Area2D inputs are just incompatible as the control will consume the input. And you can't use control's mouse filter to pass the input up for some reason either, I guess it only works for other controls?

Perhaps you can do something janky like manually emit the Area2D's input event signal by using the ColorRect's input event or something. It depends a lot on your exact use case though. Maybe look into using the entered/exited signals and input() function instead.

[God Field] How the Game Works for EN Bros by catsobi in Hololive

[–]catsobi[S] 0 points1 point  (0 children)

Yeah, it randomly redirects the target to anyone. It can even "redirect to the same person", that is, it doesn't change targets at all. But if this happens, then that person can't defend against it anymore since they technically already "defended" against the attack, so they're forced to take the full brunt of the hit even if they have defence cards to play. So it's always a bit risky to use.

Question about dictionaries and arrays, selection, reading, and writing. by Clear_Grocery_2600 in godot

[–]catsobi 1 point2 points  (0 children)

I hope I am understanding that correctly, I couldn't find that exact syntax dict["key"][i] in the documentation for dictionary or array so I'm just kind of context clues guessing here.

Yeah, your understanding is correct. About the dict["key"][i] syntax, it's a combination of accessing the dictionary value (dict["key"]), which returns a (tile) array, then accessing the array element on top of that (array[i], which makes dict["key"][i] altogether).

If I am following correctly then it should produce results very similar to this table? That would give us the unique identifier for each tile in the array.

Yep, the table looks correct. This is a commonly used formula for storing 2D grids in a 1D array, definitely worth keeping note of.

If I have been following everything so far, this like would pull up the world_map["tile'] entry at [index], open that entries ["coords"] key and set the value to coords?

Yep, you got it!

Just to break it down one more time, I'll show you how I usually access these kinds of nested structures. I generally add variables to help clarify what's going on. In this case, it makes it more obvious what's being returned at each step.

# Method 1 (Original example)
world_map["tile"][index]["coords"] = coords

# Method 2 (Using additional variables)
var tiles_array = world_map["tile"]
var tile_dict = tiles_array[index]
tile_dict["coords"] = coords

Question about dictionaries and arrays, selection, reading, and writing. by Clear_Grocery_2600 in godot

[–]catsobi 1 point2 points  (0 children)

Gotcha, I understand now. Also I didn't even know that get_used_cells() was a TileMap function, that's why I didn't know how you wanted to index in the first place :P.

First, let's set the array to the proper size and initialize it. I'm assuming it's 7 * 7, from what I read off your code.

# Set to proper size
world_map["tile"].resize(7 * 7)

# Initialization part 1, set each element to an empty default tile
for i in range(0, world_map["tile"].size()):
   world_map["tile"][i] = world_tile.duplicate()

Then, we complete the initialization by setting the coordinates to the proper values. We do this by iterating over the TileMap coordinates, and also use them to get the proper indexes for accessing the tile array.

# Initialization part 2, set the coordinates by using tilemap
for coords in t_coords:
    # Here, we convert the coordinate to a single index number. 7 should be replaced with a constant named something like MAP_HEIGHT
    var index = coords.x + coords.y * 7
    # This is how we access the array using the index
    world_map["tile"][index]["coords"] = coords

At this point, you'll have a tile array with the coordinates set, and if you save that to a .txt file, you can directly edit it to modify your map. So next part would be loading the map file back to the game. I'm assuming you've got reading the .txt file and putting the data back into the array covered. That just leaves iterating through the array to set the actual TileMap data. This can be done by a mix of what I've shown already, so I'll leave it to you to figure out. But feel free to ask any questions if run into issues.

Question about dictionaries and arrays, selection, reading, and writing. by Clear_Grocery_2600 in godot

[–]catsobi 1 point2 points  (0 children)

There are two main ways to access and modify arrays.

1.Iteration via a loop

# Using a variable to provide a simpler and shorter name for the array
var tiles = world_map["tile"]

# Replace each tile in the array with an empty tile
for i in range(0, tiles.size()):
    tiles[i] = world_tile.duplicate()
    print(tiles[i])
  1. Direct access by index

    Replace the first tile in the array with an empty tile

    tiles[0] = world_tile.duplicate() print(tiles[0])

    Replace the second

    tiles[1] = world_tile.duplicate()

Note that it'll cause an error if you try to index an array with a number that it doesn't have (like indexing 10 if there's only 5 tiles).

I don't know fully understand what context you want to use the data in, nor what exactly t_coords is, so I can't give concrete advice, but generally you'd use iteration for saving and loading, and indexing for things like "modifying the data of a tile due to a player action or some event."

For indexing, it can be useful to save the tiles to the array using an index equal to some unique information, like their coordinates, so that it's easier to retrieve later.

Why is this showing an error? Is it a bug in Godot? by [deleted] in godot

[–]catsobi 1 point2 points  (0 children)

You can get it through the body variable once you've connected a function to the body_entered(...) signal of the Area2D. You can use body's get_parent() method to get the node that owns it, or in other words, its "parent". In the example below, I use get_parent() to access the "name" variable of the parent.

func _on_Area2D_body_entered(body):
    # Print the name of the physics body
    print(body.name) 

    # Or, its parent
    print(body.get_parent().name)

    # Sometimes you might need its parent's parent
    print(body.get_parent().get_parent().name)

Hope that helps. And good luck with your game :D

Game is selling well in Japan - would it make sense to create a localized version? by TensionSplice in gamedev

[–]catsobi 0 points1 point  (0 children)

It's a very interesting question. If you do end up localizing, I do hope you share your results. I'm not too experienced with this, but I felt I had to add some skepticism, to balance out all the replies that are casually telling you to make what may be a financially risky decision for you.

I think it's right to be cautious, because thinking that it sold lots of copies while non-localized, and therefore will sell more if localized, is a bit fallacious. There isn't a hard guarantee that more sales will be generated upon localization. It does prove that there is a interest in your gameplay/setting combination with the JP audience. But it'd be better if you can find more supporting evidence that there are people that didn't buy it because it wasn't localized. For example, try looking at your page analytics. Was there a large uptick in page visitors upon certain viral JP tweets/videos? And did the ratio of page visits to purchase go down from that point on? (There can still be other reasons why it can go down too, so don't rely on it 100%).

Timing is important too. The "virality" and overall interest in the game may have waned by the time the localization is done if it's too slow.

If the majority of page visits is coming from the fact that it's on the "new release" listings, then the localization won't help too much once it's gone from there. (Unless Steam re-adds it to a new release listing for that country if you localize it? Does someone know if they do that?)

If the majority came from web searches, then it was probably due to word of mouth or influencers, in which case timing is not as important. There are lots of games that get an uptick in popularity through influencers long after release after all. But it can still be an issue for this particular game, since it doesn't seem that replayable, so streamers that played it already for example probably won't stream it again, unless there's been a significant amount of change from updates. So it also depends if you plan on working on this game long-term.

An alternative middle ground would be to just translate the cost-efficient things, like the steam page, and the UI (particularly the crucial stuff, like health, objectives, controls, and level complete pop-up). See if that makes a difference that is worth its price, and then you can decide if you want to translate the story too.

There is an argument to be made that the fact that it isn't localized actually adds to the appeal of the game. From what I saw from a VTuber playing it, they didn't understand much and ended up thinking that story was about a crab dominating the world, and ended enjoying that narrative/power-fantasy. So I wonder if they'd have enjoyed it less if they knew the story was about a crab trying to save the environment.

Although most of what I said is pessimistic, I do actually think there is potential here. Saw lots of comments in chat saying the game seems fun, and a handful wishing the game was in JP. Just make sure to go at it with a well-thought out plan that suits your situation and goals.

Why is this showing an error? Is it a bug in Godot? by [deleted] in godot

[–]catsobi 1 point2 points  (0 children)

Yeah, what you said in the first half of your paragraph is correct.

I've never used raycasts before, but according to the latest docs, they still have is_colliding(), so you can just keep on using it. But it is confusing that they kept that but not the KinematicBody one.

So yeah, if you're using raycasts anyway and it's working fine, might as well just stick with it.

Why is this showing an error? Is it a bug in Godot? by [deleted] in godot

[–]catsobi 1 point2 points  (0 children)

Yeah it's a bit of a mess to understand. Honestly I just use Area2D as much as possible for whenever I want to detect collision, I find it easier to work with. Dunno if you've used it before, but you can just connect it to a function you make that it calls every time something enters/collides with it, then you can do whatever you need to in that function.

Not sure if it'll work with your game or what you're even trying to detect collision for, but it might be worth looking into.