oBattle create event code:
instance_deactivate_all(true);
units = [];
turn = 0;
unitTurnOrder = [];
unitRenderOrder = [];
turnCount = 0;
roundCount = 0;
battleWaitTimeFrames = 30;
battleWaitTimeRemaining = 0;
battleText = "";
currentUser = noone;
currentAction = -1;
currentTargets = noone;
//Make targetting cursor
cursor =
{
activeUser : noone,
activeTarget : noone,
activeAction : -1,
targetSide : -1,
targetIndex : 0,
targetAll : false,
confirmDelay : 0,
active : false
};
//Make enemies
for (var i = 0; i < array_length(enemies); i++)
{
enemyUnits[i] = instance_create_depth(x+250+(i*10),y+68+(i*20),depth-10,oBattleUnitEnemy, enemies[i])
array_push(units, enemyUnits[i]);
}
//Make party
for (var i = 0; i < array_length(global.party); i++)
{
partyUnits[i] = instance_create_depth(x+70+(i*10),y+68+(i*15),depth-10,oBattleUnitPC, global.party[i])
array_push(units, partyUnits[i]);
}
//Shuffle turn order
unitTurnOrder = array_shuffle(units);
//Get render order
RefreshRenderOrder = function()
{
unitRenderOrder = [];
array_copy(unitRenderOrder,0,units,0,array_length(units));
array_sort(unitRenderOrder,function(_1, _2)
{
return _1.y - _2.y;
});
}
RefreshRenderOrder();
function BattleStateSelectAction()
{
if (!instance_exists(oMenu))
{
//Get current unit
var _unit = unitTurnOrder[turn];
//is the unit dead or unable to act?
if (!instance_exists(_unit)) or (_unit.hp <= 0)
{
battleState = BattleStateVictoryCheck;
exit;
}
//Select an action to perform
//BeginAction(_unit.id, global.actionLibrary.attack, _unit.id);
//if unit is player controlled:
if (_unit.object_index == oBattleUnitPC)
{
//Compile the action menu
var _menuOptions = [];
var _subMenus = {};
var _actionList = _unit.actions;
for (var i = 0; i < array_length(_actionList); i++)
{
var _action = _actionList[i];
var _available = true; //later we will replace this to check mp.
var _nameAndCount = _action.name; //later we will replace this
if (_action.subMenu == -1)
{
array_push(_menuOptions, [_nameAndCount, MenuSelectAction, [_unit, _action],_available]);
}
else
{
//create or add to a submenu
if (is_undefined(_subMenus[$ _action.subMenu]))
{
variable_struct_set(_subMenus, _action.subMenu,[[_nameAndCount,MenuSelectAction,[_unit,_action],_available]]);
}
else
{
array_push(_subMenus[$ _action.subMenu], [_nameAndCount, MenuSelectAction, [_unit, _action], _available]);
}
}
}
//turn sub menus into an array
var _subMenusArray = variable_struct_get_names(_subMenus);
for (var i = 0; i < array_length(_subMenusArray); i++)
{
//sort submenus if needed
//(here)
//add back option at the end of each submenu
//array_push(_subMenus[$ _subMenusArray[i]], ["Back", MenuGoBack -1, true]);
if (_action.subMenu == -1) array_push(_subMenus[$ _subMenusArray[i]], ["Back", MenuGoBack -1, true]);
//add submenu into main menu
//array_push(_menuOptions,[_subMenusArray[i], SubMenu, [_subMenus[$ _subMenusArray[i]]],true]);
if (_action.subMenu == -1) array_push(_menuOptions,[_nameAndCount, MenuSelectAction, [_unit, _action], _available]);
}
Menu(x+10, y+110, _menuOptions, , 74, 60)
}
else
{
//if unit is AI controlled:
var _enemyAction = _unit.AIscript();
if (_enemyAction != -1) BeginAction(_unit.id, _enemyAction[0], _enemyAction[1]);
}
}
}
function BeginAction(_user, _action, _targets)
{
currentUser = _user;
currentAction = _action;
currentTargets = _targets;
battleText = string_ext(_action.description,[_user.name]);
if (!is_array(currentTargets)) currentTargets = [currentTargets];
battleWaitTimeRemaining = battleWaitTimeFrames;
with (_user)
{
acting = true;
//play user animation if it is defined for that action and that user
if (!is_undefined(_action[$ "userAnimation"])) and (!is_undefined(_user.sprites[$ _action.userAnimation]))
{
sprite_index = sprites[$ _action.userAnimation];
image_index = 0;
}
}
battleState = BattleStatePerformAction;
}
function BattleStatePerformAction()
{
//if animation etc is still playing
if (currentUser.acting)
{
//when it ends, perform action effect if it exists
if (currentUser.image_index >= currentUser.image_number -1)
{
with (currentUser)
{
sprite_index = sprites.idle;
image_index = 0;
acting = false;
}
if (variable_struct_exists(currentAction, "effectSprite"))
{
if (currentAction.effectOnTarget == MODE.ALWAYS) or ( (currentAction.effectOnTarget == MODE.VARIES) and (array_length(currentTargets) <= 1) )
for (var i = 0; i < array_length(currentTargets); i++)
{
instance_create_depth(currentTargets[i].x,currentTargets[i].y,currentTargets[i].depth-1,oBattleEffect,{sprite_index : currentAction.effectSprite})
}
}
else //play at 0,0
{
var _effectSprite = currentAction.effectSprite
if (variable_struct_exists(currentAction,"effectSpriteNoTarget")) _effectSprite = currentAction.effectSpriteNoTarget;
instance_create_depth(x,y,depth-100,oBattleEffect,{sprite_index : _effectSprite});
}
}
currentAction.func(currentUser, currentTargets);
}
else //wait for delay and then end the turn
{
if (!instance_exists(oBattleEffect))
{
battleWaitTimeRemaining--
if (battleWaitTimeRemaining == 0)
{
battleState = BattleStateVictoryCheck;
}
}
}
}
function BattleStateVictoryCheck()
{
battleState = BattleStateTurnProgression;
}
function BattleStateTurnProgression()
{
battleText = ""; //reset battle text
turnCount++; //total turns
turn++;
//Loop turns
if (turn > array_length(unitTurnOrder) - 1)
{
turn = 0;
roundCount++;
}
battleState = BattleStateSelectAction;
}
battleState = BattleStateSelectAction;