########################################################################################
# This file is part of Spheres.
# Copyright (C) 2019 Jesusalva
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
########################################################################################
# Battle Module - Skills
from utils import dbgprint, Battle
from consts import (SK_SINGLE_DMG, SK_MULTI_DMG, SK_ATK_UP, SK_DEF_UP,
SK_SINGLE_HEAL, SK_MULTI_HEAL, SC_ATKUP, SC_DEFUP)
from battle.common import find_target, calc_dmg, attackall
def skill_core(token, mask, force, element):
global Battle
# Create a fake unit
dummy={
"name": "Dummy",
"unit_id": 1,
"max_hp": 1,
"hp": 1,
"atk": force,
"ele": element,
"status_effects": 0
}
# Handle the mask to determine the action
# TODO: SK_CLEAR_SC, SK_RESSURECTION
if mask & SK_SINGLE_DMG:
# Single Damage skill: 1 strength = 1 damage
target_id=find_target(token, "enemy")
dbgprint("Enemy selected: %d" % target_id)
target=Battle[token]["enemy"][target_id]
target["hp"]-=calc_dmg(token, dummy, target, dummy["atk"])
if mask & SK_MULTI_DMG:
# Multi Damage skill: 1 strength = 1 damage
attackall(token, dummy, "enemy")
if mask & SK_ATK_UP:
# Attack up skill: Add SC_ATKUP to all members (even dead ones)
for target in Battle[token]["party"]:
if not (target["status_effects"] & SC_ATKUP):
target["status_effects"]=target["status_effects"]|SC_ATKUP
if mask & SK_DEF_UP:
# Defense up skill: Add SC_DEFUP to all members (even dead ones)
for target in Battle[token]["party"]:
if not (target["status_effects"] & SC_DEFUP):
target["status_effects"]=target["status_effects"]|SC_DEFUP
# TODO: Is single heal the same as self heal?
if mask & SK_SINGLE_HEAL:
# Heal skill: 1 strength = 1% healing (FIXME?)
target_id=find_target(token, "party")
target=Battle[token]["party"][target_id]
target["hp"]+=int(target["max_hp"]*dummy["atk"]/100)
if (target["hp"] > target["max_hp"]):
target["hp"]=0+target["max_hp"]
if mask & SK_MULTI_HEAL:
# Heal skill: 1 strength = 1 HP (FIXME?)
dummy["atk"]*=-1
attackall(token, dummy, "party")
# Victory/Defeat checks are not handled here
# This doesn't returns anything, actually.
# Errors must be handled as Exceptions
return
def handle_skill(token, skill_id):
global Battle
# TODO
return