Envision, Create, Share

Welcome to HBGames, a leading amateur game development forum and Discord server. All are welcome, and amongst our ranks you will find experts in their field from all aspects of video game design and development.

Strange Battle Error! (PLEASE MOVE)

UPDATED 17 MARCH:
Hi I am using Xideorw's Action Battle System (XAS) ABS for RPG Maker Xp. The Script is only for XP! It works very well. But suddenly 1 day when I fought an enemy (all enemies btw) a strange error message poped up:

errorbattle.png


This is very strange since I haven't changed anything. Before this error it worked without problem. And later (I hade changed a BGM Maybe, nothing more!) this strange error came up. I tried to change some lines in "Game_Battler3" in scripts, but I did get lost.

Ps. I have added the "Scopes" skills that were error on but this still doesn't help! I have added Items and weapons and tried to change the script in the Scope line(s) but I still cant get it working!

LOOK HOW THE ERROR POPS UP: http://www.youtube.com/watch?v=pKJGcNqKeZg

This is the line of code in the Game_Battler 3 script I got the error in:

Code:
    # If skill scope is for ally with 1 or more HP, and your own HP = 0,

    # or skill scope is for ally with 0, and your own HP = 1 or more

    if ((skill.scope == 3 or skill.scope == 4) and self.hp == 0) or

       ((skill.scope == 5 or skill.scope == 6) and self.hp >= 1)

      # End Method

      return false

    end

HOW DO I CHANGE SO I DON'T GET THAT ERROR?

PLEASE HELP ME, anyone who are familliar with the XAS ABS! Do I need to change something in the "Game_Battler3" script to make XAS ABS work?


/Thanks ~9robin3

EDIT: OK, I fixed it! I copied everything over into a new project and it's a sucess! But the only conclusion I made is that the old(er) XAS ABS Script (That I am using) have some bugs, because as long as you don't erase any 'skill' your game works fine, but when you erase any you get this error I occured!
 
I'm not familiar at all with XAS ABS but it seems that someone or something is trying to use an item or a skill and this item/skill doesn't exist.
"Scope" is a variable in the Item and Skill classes used for targeting purpose.
 
Alright so what do you suggest I do? There ís a line of code in the Game_Battler 3 script:

Code:
    # If skill scope is for ally with 1 or more HP, and your own HP = 0,

    # or skill scope is for ally with 0, and your own HP = 1 or more

    if ((skill.scope == 3 or skill.scope == 4) and self.hp == 0) or

       ((skill.scope == 5 or skill.scope == 6) and self.hp >= 1)

      # End Method

      return false

    end

SIMPLE: HOW DO I CHANGE SO I DON'T GET THAT ERROR?
 
As I'm quite familiar with Scope problems, let me try to be of some assistance here...

First, you want to figure out what went wrong. Having the complete method in here wouldn't hurt, but I'd only look if there's been a 'skill' variable previously defined - probably as a method call argument. If it's the latter, your method probably gets called with an argument that isn't allowed. So, to find out what you need to fix, put this line above your conditional:
Code:
print skill
Then go from there.

One thing I can imagine caused this is that you're using a VX script with XP, or vice versa... (never cared for battle systems, so yeah... I dunno what that XAS is). VX and XP use different scope sets as far as I know, so the script would essentially check for scope values that never get passed. I doubt it's that though really... more likely is that whoever scripted said XAS system wasn't too careful about it and has a bug somewhere. Try to narrow it down with print commands as far as you can.

Also, we see your name on the area on the left...
 
BlueScope":1vwsnl14 said:
As I'm quite familiar with Scope problems, let me try to be of some assistance here...

First, you want to figure out what went wrong. Having the complete method in here wouldn't hurt, but I'd only look if there's been a 'skill' variable previously defined - probably as a method call argument. If it's the latter, your method probably gets called with an argument that isn't allowed. So, to find out what you need to fix, put this line above your conditional:
Code:
print skill
Then go from there.

One thing I can imagine caused this is that you're using a VX script with XP, or vice versa... (never cared for battle systems, so yeah... I dunno what that XAS is). VX and XP use different scope sets as far as I know, so the script would essentially check for scope values that never get passed. I doubt it's that though really... more likely is that whoever scripted said XAS system wasn't too careful about it and has a bug somewhere. Try to narrow it down with print commands as far as you can.

Also, we see your name on the area on the left...

Thank You! No XAS is for XP (and only!) sorry what do you mean by narrowing it down?
And where shall I put that "print skill"?

/Thank You again
 
Like I said, put it directly above your conditional:
Code:
    print skill

    print skill.scope

    # If skill scope is for ally with 1 or more HP, and your own HP = 0,

    # or skill scope is for ally with 0, and your own HP = 1 or more

    if ((skill.scope == 3 or skill.scope == 4) and self.hp == 0) or

       ((skill.scope == 5 or skill.scope == 6) and self.hp >= 1)

      # End Method

      return false

    end
This will stop the game two times to output two things: First, 'skill', which should already contain something like '@scope = something', and then that scope variable again, in case it's too hard to spot in a bigger array. So yeah, that's exactly how you're narrowing down things: you output different things while running a script to find out where your undefined/erroneous part is. For example, if it outputs 'skill' fine, but exits out when you try to output 'skil.scope', that means your container 'skill' is fine, but it doesn't contain the variable 'scope' (which would be a pity). Seriously, that shouldn't be your problem though, as your error states a different thing. Sounds like skill SHOULD be a container, but tries to call a method of a class. To figure that out, having the whole method would be very useful ;) (as I said before)
 
BlueScope":3mbl18nw said:
Like I said, put it directly above your conditional:
Code:
    print skill

    print skill.scope

    # If skill scope is for ally with 1 or more HP, and your own HP = 0,

    # or skill scope is for ally with 0, and your own HP = 1 or more

    if ((skill.scope == 3 or skill.scope == 4) and self.hp == 0) or

       ((skill.scope == 5 or skill.scope == 6) and self.hp >= 1)

      # End Method

      return false

    end
This will stop the game two times to output two things: First, 'skill', which should already contain something like '@scope = something', and then that scope variable again, in case it's too hard to spot in a bigger array. So yeah, that's exactly how you're narrowing down things: you output different things while running a script to find out where your undefined/erroneous part is. For example, if it outputs 'skill' fine, but exits out when you try to output 'skil.scope', that means your container 'skill' is fine, but it doesn't contain the variable 'scope' (which would be a pity). Seriously, that shouldn't be your problem though, as your error states a different thing. Sounds like skill SHOULD be a container, but tries to call a method of a class. To figure that out, having the whole method would be very useful ;) (as I said before)


I really hoe you have patience here, cause I AM a completly noob. I have putted that line of code OVER the Skill.Scope part. What I dont understand is WHERE ELSE I shall put it, or what it means. I don't force you to DO IT FOR me, but If I know what it all means then maybe I can fix it.

Still I have added the Print Skill over the Skill.Scope part: I still get an error, but this time it looks like this:

errornil.png


After this error message the original ERROR pops up again (that is shown in the beginning of this topic!)



~I am a scripting noob! Plz help
 
You don't need to put your code anywhere else than where you put it. Your problem is that your method assumes a container 'skill' being defined, but instead of a hash (i.e. {@name => "Skill", @scope => 1}), it is nil (aka empty). Therefore, checking for skill.scope returns you an error, as there is no key with that name in the hash like in my example.

At this point, you should really post the complete method ^^ (probably me asking for the third time is a charm ;) ), being whatever encloses the script you posted in the first post. That means something like this:
Code:
def funnymethod

  ...

  # If skill scope is for ally with 1 or more HP, and your own HP = 0,

  # or skill scope is for ally with 0, and your own HP = 1 or more

  if ((skill.scope == 3 or skill.scope == 4) and self.hp == 0) or

     ((skill.scope == 5 or skill.scope == 6) and self.hp >= 1)

    # End Method

    return false

  end

  ...

end

Of course, the complete script wouldn't hurt either... as the next thing I'd ask you is what calls that method ^^


By the way, this belongs into RGSS Support ;)
And also, that video is just awesome! ^^
 
Ok Thank You very much! And also thank you for being patient with me, cause I am a scripting noob xD

OK HERE IS THE WHOLE SCRIPT: It is Game_Battler 3 Script. It was because of this allready existing script that I didn't changed AT ALL I was very confused.

Code:
#==============================================================================

# ** Game_Battler (part 3)

#------------------------------------------------------------------------------

#  This class deals with battlers. It's used as a superclass for the Game_Actor

#  and Game_Enemy classes.

#==============================================================================

 

class Game_Battler

  #--------------------------------------------------------------------------

  # * Determine Usable Skills

  #     skill_id : skill ID

  #--------------------------------------------------------------------------

  def skill_can_use?(skill_id)

    # If there's not enough SP, the skill cannot be used.

    if $data_skills[skill_id].sp_cost > self.sp

      return false

    end

    # Unusable if incapacitated

    if dead?

      return false

    end

    # If silent, only physical skills can be used

    if $data_skills[skill_id].atk_f == 0 and self.restriction == 1

      return false

    end

    # Get usable time

    occasion = $data_skills[skill_id].occasion

    # If in battle

    if $game_temp.in_battle

      # Usable with [Normal] and [Only Battle]

      return (occasion == 0 or occasion == 1)

    # If not in battle

    else

      # Usable with [Normal] and [Only Menu]

      return (occasion == 0 or occasion == 2)

    end

  end

  #--------------------------------------------------------------------------

  # * Applying Normal Attack Effects

  #     attacker : battler

  #--------------------------------------------------------------------------

  def attack_effect(attacker)

    # Clear critical flag

    self.critical = false

    # First hit detection

    hit_result = (rand(100) < attacker.hit)

    # If hit occurs

    if hit_result == true

      # Calculate basic damage

      atk = [attacker.atk - self.pdef / 2, 0].max

      self.damage = atk * (20 + attacker.str) / 20

      # Element correction

      self.damage *= elements_correct(attacker.element_set)

      self.damage /= 100

      # If damage value is strictly positive

      if self.damage > 0

        # Critical correction

        if rand(100) < 4 * attacker.dex / self.agi

          self.damage *= 2

          self.critical = true

        end

        # Guard correction

        if self.guarding?

          self.damage /= 2

        end

      end

      # Dispersion

      if self.damage.abs > 0

        amp = [self.damage.abs * 15 / 100, 1].max

        self.damage += rand(amp+1) + rand(amp+1) - amp

      end

      # Second hit detection

      eva = 8 * self.agi / attacker.dex + self.eva

      hit = self.damage < 0 ? 100 : 100 - eva

      hit = self.cant_evade? ? 100 : hit

      hit_result = (rand(100) < hit)

    end

    # If hit occurs

    if hit_result == true

      # State Removed by Shock

      remove_states_shock

      # Substract damage from HP

      self.hp -= self.damage

      # State change

      @state_changed = false

      states_plus(attacker.plus_state_set)

      states_minus(attacker.minus_state_set)

    # When missing

    else

      # Set damage to "Miss"

      self.damage = "Miss"

      # Clear critical flag

      self.critical = false

    end

    # End Method

    return true

  end

  #--------------------------------------------------------------------------

  # * Apply Skill Effects

  #     user  : the one using skills (battler)

  #     skill : skill

  #--------------------------------------------------------------------------

  def skill_effect (user, skill)

    # Clear critical flag

    self.critical = false

   print skill

    print skill.scope

    # If skill scope is for ally with 1 or more HP, and your own HP = 0,

    # or skill scope is for ally with 0, and your own HP = 1 or more

    if ((skill.scope == 3 or skill.scope == 4) and self.hp == 0) or

       ((skill.scope == 5 or skill.scope == 6) and self.hp >= 1)

      # End Method

      return false

    end

    # Clear effective flag

    effective = false

    # Set effective flag if common ID is effective

    effective |= skill.common_event_id > 0

    # First hit detection

    hit = skill.hit

    if skill.atk_f > 0

      hit *= user.hit / 100

    end

    hit_result = (rand(100) < hit)

    # Set effective flag if skill is uncertain

    effective |= hit < 100

    # If hit occurs

    if hit_result == true

      # Calculate power

      power = skill.power + user.atk * skill.atk_f / 100

      if power > 0

        power -= self.pdef * skill.pdef_f / 200

        power -= self.mdef * skill.mdef_f / 200

        power = [power, 0].max

      end

      # Calculate rate

      rate = 20

      rate += (user.str * skill.str_f / 100)

      rate += (user.dex * skill.dex_f / 100)

      rate += (user.agi * skill.agi_f / 100)

      rate += (user.int * skill.int_f / 100)

      # Calculate basic damage

      self.damage = power * rate / 20

      # Element correction

      self.damage *= elements_correct(skill.element_set)

      self.damage /= 100

      # If damage value is strictly positive

      if self.damage > 0

        # Guard correction

        if self.guarding?

          self.damage /= 2

        end

      end

      # Dispersion

      if skill.variance > 0 and self.damage.abs > 0

        amp = [self.damage.abs * skill.variance / 100, 1].max

        self.damage += rand(amp+1) + rand(amp+1) - amp

      end

      # Second hit detection

      eva = 8 * self.agi / user.dex + self.eva

      hit = self.damage < 0 ? 100 : 100 - eva * skill.eva_f / 100

      hit = self.cant_evade? ? 100 : hit

      hit_result = (rand(100) < hit)

      # Set effective flag if skill is uncertain

      effective |= hit < 100

    end

    # If hit occurs

    if hit_result == true

      # If physical attack has power other than 0

      if skill.power != 0 and skill.atk_f > 0

        # State Removed by Shock

        remove_states_shock

        # Set to effective flag

        effective = true

      end

      # Substract damage from HP

      last_hp = self.hp

      self.hp -= self.damage

      effective |= self.hp != last_hp

      # State change

      @state_changed = false

      effective |= states_plus(skill.plus_state_set)

      effective |= states_minus(skill.minus_state_set)

      # If power is 0

      if skill.power == 0

        # Set damage to an empty string

        self.damage = ""

        # If state is unchanged

        unless @state_changed

          # Set damage to "Miss"

          self.damage = "Miss"

        end

      end

    # If miss occurs

    else

      # Set damage to "Miss"

      self.damage = "Miss"

    end

    # If not in battle

    unless $game_temp.in_battle

      # Set damage to nil

      self.damage = nil

    end

    # End Method

    return effective

  end

  #--------------------------------------------------------------------------

  # * Application of Item Effects

  #     item : item

  #--------------------------------------------------------------------------

  def item_effect(item)

    # Clear critical flag

    self.critical = false

    # If item scope is for ally with 1 or more HP, and your own HP = 0,

    # or item scope is for ally with 0 HP, and your own HP = 1 or more

    if ((item.scope == 3 or item.scope == 4) and self.hp == 0) or

       ((item.scope == 5 or item.scope == 6) and self.hp >= 1)

      # End Method

      return false

    end

    # Clear effective flag

    effective = false

    # Set effective flag if common ID is effective

    effective |= item.common_event_id > 0

    # Determine hit

    hit_result = (rand(100) < item.hit)

    # Set effective flag is skill is uncertain

    effective |= item.hit < 100

    # If hit occurs

    if hit_result == true

      # Calculate amount of recovery

      recover_hp = maxhp * item.recover_hp_rate / 100 + item.recover_hp

      recover_sp = maxsp * item.recover_sp_rate / 100 + item.recover_sp

      if recover_hp < 0

        recover_hp += self.pdef * item.pdef_f / 20

        recover_hp += self.mdef * item.mdef_f / 20

        recover_hp = [recover_hp, 0].min

      end

      # Element correction

      recover_hp *= elements_correct(item.element_set)

      recover_hp /= 100

      recover_sp *= elements_correct(item.element_set)

      recover_sp /= 100

      # Dispersion

      if item.variance > 0 and recover_hp.abs > 0

        amp = [recover_hp.abs * item.variance / 100, 1].max

        recover_hp += rand(amp+1) + rand(amp+1) - amp

      end

      if item.variance > 0 and recover_sp.abs > 0

        amp = [recover_sp.abs * item.variance / 100, 1].max

        recover_sp += rand(amp+1) + rand(amp+1) - amp

      end

      # If recovery code is negative

      if recover_hp < 0

        # Guard correction

        if self.guarding?

          recover_hp /= 2

        end

      end

      # Set damage value and reverse HP recovery amount

      self.damage = -recover_hp

      # HP and SP recovery

      last_hp = self.hp

      last_sp = self.sp

      self.hp += recover_hp

      self.sp += recover_sp

      effective |= self.hp != last_hp

      effective |= self.sp != last_sp

      # State change

      @state_changed = false

      effective |= states_plus(item.plus_state_set)

      effective |= states_minus(item.minus_state_set)

      # If parameter value increase is effective

      if item.parameter_type > 0 and item.parameter_points != 0

        # Branch by parameter

        case item.parameter_type

        when 1  # Max HP

          @maxhp_plus += item.parameter_points

        when 2  # Max SP

          @maxsp_plus += item.parameter_points

        when 3  # Strength

          @str_plus += item.parameter_points

        when 4  # Dexterity

          @dex_plus += item.parameter_points

        when 5  # Agility

          @agi_plus += item.parameter_points

        when 6  # Intelligence

          @int_plus += item.parameter_points

        end

        # Set to effective flag

        effective = true

      end

      # If HP recovery rate and recovery amount are 0

      if item.recover_hp_rate == 0 and item.recover_hp == 0

        # Set damage to empty string

        self.damage = ""

        # If SP recovery rate / recovery amount are 0, and parameter increase

        # value is ineffective.

        if item.recover_sp_rate == 0 and item.recover_sp == 0 and

           (item.parameter_type == 0 or item.parameter_points == 0)

          # If state is unchanged

          unless @state_changed

            # Set damage to "Miss"

            self.damage = "Miss"

          end

        end

      end

    # If miss occurs

    else

      # Set damage to "Miss"

      self.damage = "Miss"

    end

    # If not in battle

    unless $game_temp.in_battle

      # Set damage to nil

      self.damage = nil

    end

    # End Method

    return effective

  end

  #--------------------------------------------------------------------------

  # * Application of Slip Damage Effects

  #--------------------------------------------------------------------------

  def slip_damage_effect

    # Set damage

    self.damage = self.maxhp / 10

    # Dispersion

    if self.damage.abs > 0

      amp = [self.damage.abs * 15 / 100, 1].max

      self.damage += rand(amp+1) + rand(amp+1) - amp

    end

    # Subtract damage from HP

    self.hp -= self.damage

    # End Method

    return true

  end

  #--------------------------------------------------------------------------

  # * Calculating Element Correction

  #     element_set : element

  #--------------------------------------------------------------------------

  def elements_correct(element_set)

    # If not an element

    if element_set == []

      # Return 100

      return 100

    end

    # Return the weakest object among the elements given

    # * "element_rate" method is defined by Game_Actor and Game_Enemy classes,

    #    which inherit from this class.

    weakest = -100

    for i in element_set

      weakest = [weakest, self.element_rate(i)].max

    end

    return weakest

  end

end

 

Remember that it worked just fine for me the first week maybe, then randomly I got this error.

Now what shall I do? What calls the method?
 
Well, let's do this step by step so you learn something from it... first, here's your method:
[rgss]  def skill_effect (user, skill)
    # Clear critical flag
    self.critical = false
   print skill
    print skill.scope
    # If skill scope is for ally with 1 or more HP, and your own HP = 0,
    # or skill scope is for ally with 0, and your own HP = 1 or more
    if ((skill.scope == 3 or skill.scope == 4) and self.hp == 0) or
       ((skill.scope == 5 or skill.scope == 6) and self.hp >= 1)
      # End Method
      return false
    end
    # Clear effective flag
    effective = false
    # Set effective flag if common ID is effective
    effective |= skill.common_event_id > 0
    # First hit detection
    hit = skill.hit
    if skill.atk_f > 0
      hit *= user.hit / 100
    end
    hit_result = (rand(100) < hit)
    # Set effective flag if skill is uncertain
    effective |= hit < 100
    # If hit occurs
    if hit_result == true
      # Calculate power
      power = skill.power + user.atk * skill.atk_f / 100
      if power > 0
        power -= self.pdef * skill.pdef_f / 200
        power -= self.mdef * skill.mdef_f / 200
        power = [power, 0].max
      end
      # Calculate rate
      rate = 20
      rate += (user.str * skill.str_f / 100)
      rate += (user.dex * skill.dex_f / 100)
      rate += (user.agi * skill.agi_f / 100)
      rate += (user.int * skill.int_f / 100)
      # Calculate basic damage
      self.damage = power * rate / 20
      # Element correction
      self.damage *= elements_correct(skill.element_set)
      self.damage /= 100
      # If damage value is strictly positive
      if self.damage > 0
        # Guard correction
        if self.guarding?
          self.damage /= 2
        end
      end
      # Dispersion
      if skill.variance > 0 and self.damage.abs > 0
        amp = [self.damage.abs * skill.variance / 100, 1].max
        self.damage += rand(amp+1) + rand(amp+1) - amp
      end
      # Second hit detection
      eva = 8 * self.agi / user.dex + self.eva
      hit = self.damage < 0 ? 100 : 100 - eva * skill.eva_f / 100
      hit = self.cant_evade? ? 100 : hit
      hit_result = (rand(100) < hit)
      # Set effective flag if skill is uncertain
      effective |= hit < 100
    end
    # If hit occurs
    if hit_result == true
      # If physical attack has power other than 0
      if skill.power != 0 and skill.atk_f > 0
        # State Removed by Shock
        remove_states_shock
        # Set to effective flag
        effective = true
      end
      # Substract damage from HP
      last_hp = self.hp
      self.hp -= self.damage
      effective |= self.hp != last_hp
      # State change
      @state_changed = false
      effective |= states_plus(skill.plus_state_set)
      effective |= states_minus(skill.minus_state_set)
      # If power is 0
      if skill.power == 0
        # Set damage to an empty string
        self.damage = ""
        # If state is unchanged
        unless @state_changed
          # Set damage to "Miss"
          self.damage = "Miss"
        end
      end
    # If miss occurs
    else
      # Set damage to "Miss"
      self.damage = "Miss"
    end
    # If not in battle
    unless $game_temp.in_battle
      # Set damage to nil
      self.damage = nil
    end
    # End Method
    return effective
  end
[/rgss]

You can see it's called with def skill_effect(user, skill) - that means, whenever you call the method, you have to have those two arguments set right, or otherwise, you get an error like yours. Now, the method that calls it isn't in the script part you provided, but you can check for yourself where it's called: Just right-click on any script in the list and select 'Search' (or press shift+ctrl+F, I think), and input this:
Code:
skill_effect(
And yes, the open bracket is intentional. You should get a few results, which you could post in here, which might solve it already (for example, skill_effect(@actor, nil) would, as the 'nil' is the faulty part here. Why? Because nil, while perfectly fine as an argument normally, isn't a valid argument in this case, because the called method isn'T prepared for that to happen).
 
OK, Here are the search results for 'Skill_Effect ('

Game_Battler 3:Line 103
Code:
def skill_effect (user, skill)

This is the only result I get. And this is the method that you call "funny method" (that allready exist within this script when you start a new project).

(Also probably this is way to advanced for me to fix..)
I serisously dont know what to do. The errors came up when i DELETED some skills, but thy're restored now.
 
If that would really be the only result, you wouldn't get an error, as that method would never be called. Remember to search in your whole project, not just in Game_Battler 3 (there really is no "Game_Battler 3", only a "Game_Battler" that for some stupid reason got divided into parts so noone can efficiently work with it... note how all of them start with the same line: class Game_Battler, not Game_Battler 3 or something). Like I said, you can search in your whole project by right-clicking a script in your list and select Search (the list being the element on the left - if you search from the right-click command in your active script on the right, you'll only get search results within that one script, which is what I think happened).
 
I have right-clicked on any script and used find and inputed 'skill_effect' as you said! But I only get 1 result

Also the Game_Battler script IS divided into three, just start a new project and see for your self!

errorscriptbattler.png


-So if I just delete Skill_Effect will it work? Or shall I put these 3 scripts together?
 
It's the same thing to leave them as they are or put them in a single section, nothing else would change, 9robin3, it wouldn't help you at all.

Have you tried to look at XAS scripts to see if the problem is originated there?
 
kyonides":2m2ar43r said:
It's the same thing to leave them as they are or put them in a single section, nothing else would change, 9robin3, it wouldn't help you at all.

Have you tried to look at XAS scripts to see if the problem is originated there?

No I haven't looked in any other XAS script than the ones that is following when downloading XAS_Original project.
I have copied EVERYTHING from there so it should work as XAS_Original works.

Maybe this is fixed in the newest vesrion of XAS ABS. I will check that ofc.

//Thanks!
 
Ok I really need help. I will post a downlkoad link of this PROJECT and so you can look whats wrong in it. Remember I am learning scripting so I appriciate help so I can learn more ;)
 

Thank you for viewing

HBGames is a leading amateur video game development forum and Discord server open to all ability levels. Feel free to have a nosey around!

Discord

Join our growing and active Discord server to discuss all aspects of game making in a relaxed environment. Join Us

Content

  • Our Games
  • Games in Development
  • Emoji by Twemoji.
    Top