/* * Pixel Dungeon * Copyright (C) 2012-2015 Oleg Dolya * * Shattered Pixel Dungeon * Copyright (C) 2014-2015 Evan Debenham * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see */ package com.shatteredpixel.shatteredpixeldungeon.actors.buffs; import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.Char; import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator; import java.text.DecimalFormat; import java.util.HashSet; public class Buff extends Actor { public Char target; { actPriority = 3; //low priority, at the end of a turn } //determines how the buff is announced when it is shown. //buffs that work behind the scenes, or have other visual indicators can usually be silent. public enum buffType {POSITIVE, NEGATIVE, NEUTRAL, SILENT}; public buffType type = buffType.SILENT; public HashSet> resistances = new HashSet>(); public HashSet> immunities = new HashSet>(); public boolean attachTo( Char target ) { if (target.immunities().contains( getClass() )) { return false; } this.target = target; target.add( this ); if (target.buffs().contains(this)){ if (target.sprite != null) fx( true ); return true; } else return false; } public void detach() { fx( false ); target.remove( this ); } @Override public boolean act() { diactivate(); return true; } public int icon() { return BuffIndicator.NONE; } public void fx(boolean on) { //do nothing by default }; public String desc(){ return ""; } //to handle the common case of showing how many turns are remaining in a buff description. protected String dispTurns(float input){ return input == 1 ? Messages.get(Buff.class, "1moreturn") : Messages.get(Buff.class, "#moreturns", new DecimalFormat("#.##").format(input)); } //creates a fresh instance of the buff and attaches that, this allows duplication. public static T append( Char target, Class buffClass ) { try { T buff = buffClass.newInstance(); buff.attachTo( target ); return buff; } catch (Exception e) { return null; } } public static T append( Char target, Class buffClass, float duration ) { T buff = append( target, buffClass ); buff.spend( duration ); return buff; } //same as append, but prevents duplication. public static T affect( Char target, Class buffClass ) { T buff = target.buff( buffClass ); if (buff != null) { return buff; } else { return append( target, buffClass ); } } public static T affect( Char target, Class buffClass, float duration ) { T buff = affect( target, buffClass ); buff.spend( duration ); return buff; } //postpones an already active buff, or creates & attaches a new buff and delays that. public static T prolong( Char target, Class buffClass, float duration ) { T buff = affect( target, buffClass ); buff.postpone( duration ); return buff; } public static void detach( Buff buff ) { if (buff != null) { buff.detach(); } } public static void detach( Char target, Class cl ) { detach( target.buff( cl ) ); } }