Fractiwi is an open-source exploration game with turn-based combat. Inspired by the Shin Megami Tensei franchise and Yume Nikki fangames.
The HOWTOPLAY.md
file contains a brief summary of the gameplay as well as more detailed information about game mechanics.
- Godot Game Engine, using gdscript
All types of contributations (art, programming, music) are greatly appreciated! Even if you have no programming experience, you can contact alfaroeric127@gmail.com to propose ideas or transfer assets to be implemented in the game. If you are familiar with Godot, follow the instructions below for the specific content you are creating.
- Create a folder with the name of your room (using snake_case) in
res://main/world/room/
- Create an inherited scene of
res://main/world/room/Room.tscn
- Make any changes and save the scene to your folder. Keep the name of this scene as Room.tscn. Your room is now ready to be loaded in game!
- Ensure your props and TileMaps are set on the appropriate collision layers (visible in the Project Settings)
- No node should be on the player collision layer
- There is no strict requirement for what or where you place any nodes, but all beds should be placed as a child of
Props/Interactable/Terminals
- Make sure any bed's
Room
variable is set to the root of your scene
- Instance an enemy from
res://main/world/enemy/
- Set the enemy's
Creature
variable to an array of creatures of your choice fromres://main/battle/creature/
- Keep
Anim Name
to the name of the animation you want to be looping on your enemy - Configure any other variables with sensible values
- Compare your music files with others in-game to make sure it isn't too loud or quiet. A range of -15 to -8 db is recommended
- Reimport any music files with
loop
enabled - Attach music files to the room's
Music
variable
- Create a folder with the name of your creature (using all lower case, using spaces instead of underscores) in
res://main/battle/creature/
- Create an inherited scene of
res://main/battle/creature/Creature.tscn
- Set its
Creature Name
variable to match the name of the folder but capitalized (eye worm -> Eye Worm) - Set its stats to any integer value above 0
- If wanted, set its
Def Offinity
to a dictionary (String : String) with affinities as keys and a resistance as values Affinities:"phys", "fire", "water", "elec", "wind", "light", "dark", "flesh"
Resistances:"resist", "repel", "absorb", "null", "weak"
- Do the same with
Off Affinity
, but replace the value with an integer value in the range of [180, 110] or [-110, -180] for negative boosts. The middle digit and the sign represent the actual value seen in game (ie. -180 -> -8, 140 -> 4). Keep your value in multiples of tens - Instance skills from
res://main/battle/skill/
and place them into the appropriate skill nodes of the creature - If this creature will learn skills at certain level ups, place them in order as children of
UnlearnedSkills
and configure theSkill Levels
array to hold every integer level at which this creature will learn a skill - Attach any ai script from
res://main/battle/ai/
toAI
. The default ai script will choose skills to use at random
- Extend
res://main/battle/ai/ai.gd
script and place this new script within a new folder underres://main/battle/ai/
- Overwrite the
do_turn
function with the logic your ai implements
func do_turn(same: Array, opposite: Array, controller: Creature) -> Array:
# opposite: array of opposing party creatures
# same: array of team party creatures
# controller: the creature calling this function
# return array 0: tag of current action, "Skill" or "Pass" in most cases
# return array 1: reference to skill of creature if tag is "Skill"
# return array 2: an array of the targets of the skill if tag is "Skill"
# example:
return ["Skill", controller.get_node("Skills/Active/Cleave"), [opposite[0]]
- Attach this script to any creature's
AI
node
Distributed under the GNU General Public License v2.0. See LICENSE.md for more information.