Refactor source files and add berries
This commit is contained in:
1 parent
6135243641
commit
3546f3b5a7
103 files changed
+2598
-1171
No files matched your search
@@ -1,7 +1,7 @@
|
||||
import { CommandPhase } from "../battle-phases";
|
||||
import BattleScene, { Button } from "../battle-scene";
|
||||
import { getPokeballName, PokeballType } from "../pokeball";
|
||||
import { addTextObject, TextStyle } from "../text";
|
||||
import { getPokeballName, PokeballType } from "../data/pokeball";
|
||||
import { addTextObject, TextStyle } from "./text";
|
||||
import { Command } from "./command-ui-handler";
|
||||
import { Mode } from "./ui";
|
||||
import UiHandler from "./uiHandler";
|
||||
|
||||
@@ -0,0 +1,301 @@
|
||||
import { default as Pokemon } from '../pokemon';
|
||||
import { getLevelTotalExp, getLevelRelExp } from '../data/exp';
|
||||
import * as Utils from '../utils';
|
||||
import { addTextObject, TextStyle } from './text';
|
||||
import { getGenderSymbol, getGenderColor } from '../data/gender';
|
||||
import { StatusEffect } from '../data/status-effect';
|
||||
import BattleScene from '../battle-scene';
|
||||
|
||||
export default class BattleInfo extends Phaser.GameObjects.Container {
|
||||
private player: boolean;
|
||||
private lastName: string;
|
||||
private lastStatus: StatusEffect;
|
||||
private lastHp: integer;
|
||||
private lastMaxHp: integer;
|
||||
private lastHpFrame: string;
|
||||
private lastExp: integer;
|
||||
private lastLevelExp: integer;
|
||||
private lastLevel: integer;
|
||||
|
||||
private nameText: Phaser.GameObjects.Text;
|
||||
private genderText: Phaser.GameObjects.Text;
|
||||
private ownedIcon: Phaser.GameObjects.Image;
|
||||
private statusIndicator: Phaser.GameObjects.Sprite;
|
||||
private levelContainer: Phaser.GameObjects.Container;
|
||||
private hpBar: Phaser.GameObjects.Image;
|
||||
private levelNumbersContainer: Phaser.GameObjects.Container;
|
||||
private hpNumbersContainer: Phaser.GameObjects.Container;
|
||||
private expBar: Phaser.GameObjects.Image;
|
||||
|
||||
constructor(scene: Phaser.Scene, x: number, y: number, player: boolean) {
|
||||
super(scene, x, y);
|
||||
this.player = player;
|
||||
this.lastName = null;
|
||||
this.lastStatus = StatusEffect.NONE;
|
||||
this.lastHp = -1;
|
||||
this.lastMaxHp = -1;
|
||||
this.lastHpFrame = null;
|
||||
this.lastExp = -1;
|
||||
this.lastLevelExp = -1;
|
||||
this.lastLevel = -1;
|
||||
|
||||
// Initially invisible and shown via Pokemon.showInfo
|
||||
this.setVisible(false);
|
||||
|
||||
const box = this.scene.add.image(0, 0, `pbinfo_${player ? 'player' : 'enemy'}`);
|
||||
box.setOrigin(1, 0.5);
|
||||
this.add(box);
|
||||
|
||||
this.nameText = addTextObject(this.scene, player ? -115 : -124, player ? -15.2 : -11.2, '', TextStyle.BATTLE_INFO);
|
||||
this.nameText.setOrigin(0, 0);
|
||||
this.add(this.nameText);
|
||||
|
||||
this.genderText = addTextObject(this.scene, 0, 0, '', TextStyle.BATTLE_INFO);
|
||||
this.genderText.setOrigin(0, 0);
|
||||
this.genderText.setPositionRelative(this.nameText, 0, 2);
|
||||
this.add(this.genderText);
|
||||
|
||||
if (!this.player) {
|
||||
this.ownedIcon = this.scene.add.image(0, 0, 'icon_owned');
|
||||
this.ownedIcon.setVisible(false);
|
||||
this.ownedIcon.setOrigin(0, 0);
|
||||
this.ownedIcon.setPositionRelative(this.nameText, 0, 11.5);
|
||||
this.add(this.ownedIcon);
|
||||
}
|
||||
|
||||
this.statusIndicator = this.scene.add.sprite(0, 0, 'statuses');
|
||||
this.statusIndicator.setVisible(false);
|
||||
this.statusIndicator.setOrigin(0, 0);
|
||||
this.statusIndicator.setPositionRelative(this.nameText, 0, 11.5);
|
||||
this.add(this.statusIndicator);
|
||||
|
||||
this.levelContainer = this.scene.add.container(player ? -41 : -50, player ? -10 : -5);
|
||||
this.add(this.levelContainer);
|
||||
|
||||
const levelOverlay = this.scene.add.image(0, 0, 'overlay_lv');
|
||||
this.levelContainer.add(levelOverlay);
|
||||
|
||||
this.hpBar = this.scene.add.image(player ? -61 : -71, player ? -1 : 4.5, 'overlay_hp');
|
||||
this.hpBar.setOrigin(0);
|
||||
this.add(this.hpBar);
|
||||
|
||||
this.levelNumbersContainer = this.scene.add.container(9.5, 0);
|
||||
this.levelContainer.add(this.levelNumbersContainer);
|
||||
|
||||
if (this.player) {
|
||||
this.hpNumbersContainer = this.scene.add.container(-15, 10);
|
||||
this.add(this.hpNumbersContainer);
|
||||
|
||||
const expBar = this.scene.add.image(-98, 18, 'overlay_exp');
|
||||
expBar.setOrigin(0);
|
||||
expBar.setScale(0, 1);
|
||||
this.add(expBar);
|
||||
|
||||
this.expBar = expBar;
|
||||
}
|
||||
}
|
||||
|
||||
initInfo(pokemon: Pokemon) {
|
||||
this.nameText.setText(pokemon.name);
|
||||
this.lastName = pokemon.name;
|
||||
|
||||
const nameSizeTest = addTextObject(this.scene, 0, 0, pokemon.name, TextStyle.BATTLE_INFO);
|
||||
const nameTextWidth = nameSizeTest.displayWidth;
|
||||
nameSizeTest.destroy();
|
||||
|
||||
this.genderText.setText(getGenderSymbol(pokemon.gender));
|
||||
this.genderText.setColor(getGenderColor(pokemon.gender));
|
||||
this.genderText.setPositionRelative(this.nameText, nameTextWidth, 0);
|
||||
|
||||
if (!this.player) {
|
||||
const speciesOwned = !!pokemon.scene.gameData.getDefaultDexEntry(pokemon.species)?.entry?.caught;
|
||||
this.ownedIcon.setVisible(speciesOwned);
|
||||
if (!pokemon.scene.gameData.getPokemonDexEntry(pokemon).caught)
|
||||
this.ownedIcon.setTint(0x808080);
|
||||
}
|
||||
|
||||
this.hpBar.setScale(pokemon.getHpRatio(), 1);
|
||||
if (this.player)
|
||||
this.setHpNumbers(pokemon.hp, pokemon.getMaxHp());
|
||||
this.lastHp = pokemon.hp;
|
||||
this.lastHpFrame = this.hpBar.scaleX > 0.5 ? 'high' : this.hpBar.scaleX > 0.25 ? 'medium' : 'low';
|
||||
this.lastMaxHp = pokemon.getMaxHp();
|
||||
|
||||
this.setLevel(pokemon.level);
|
||||
this.lastLevel = pokemon.level;
|
||||
|
||||
if (this.player) {
|
||||
this.expBar.setScale(pokemon.levelExp / getLevelTotalExp(pokemon.level, pokemon.species.growthRate), 1);
|
||||
this.lastExp = pokemon.exp;
|
||||
this.lastLevelExp = pokemon.levelExp;
|
||||
}
|
||||
}
|
||||
|
||||
updateInfo(pokemon: Pokemon, instant?: boolean): Promise<void> {
|
||||
return new Promise(resolve => {
|
||||
if (!this.scene) {
|
||||
resolve();
|
||||
return;
|
||||
}
|
||||
|
||||
if (this.lastName !== pokemon.species.name) {
|
||||
this.nameText.setText(pokemon.name);
|
||||
this.lastName = pokemon.name;
|
||||
|
||||
const nameSizeTest = addTextObject(this.scene, 0, 0, pokemon.name, TextStyle.BATTLE_INFO);
|
||||
const nameTextWidth = nameSizeTest.displayWidth;
|
||||
nameSizeTest.destroy();
|
||||
|
||||
this.genderText.setPositionRelative(this.nameText, nameTextWidth, 0);
|
||||
}
|
||||
|
||||
if (this.lastStatus !== (pokemon.status?.effect || StatusEffect.NONE)) {
|
||||
this.lastStatus = pokemon.status?.effect || StatusEffect.NONE;
|
||||
|
||||
if (this.lastStatus !== StatusEffect.NONE)
|
||||
this.statusIndicator.setFrame(StatusEffect[this.lastStatus].toLowerCase());
|
||||
this.statusIndicator.setVisible(!!this.lastStatus);
|
||||
|
||||
if (!this.player && this.ownedIcon.visible)
|
||||
this.ownedIcon.setAlpha(this.statusIndicator.visible ? 0 : 1);
|
||||
}
|
||||
|
||||
const updatePokemonHp = () => {
|
||||
const duration = !instant ? Utils.clampInt(Math.abs((this.lastHp) - pokemon.hp) * 5, 250, 5000) : 0;
|
||||
this.scene.tweens.add({
|
||||
targets: this.hpBar,
|
||||
ease: 'Sine.easeOut',
|
||||
scaleX: pokemon.getHpRatio(),
|
||||
duration: duration,
|
||||
onUpdate: () => {
|
||||
if (this.player && this.lastHp !== pokemon.hp) {
|
||||
const tweenHp = Math.ceil(this.hpBar.scaleX * pokemon.getMaxHp());
|
||||
this.setHpNumbers(tweenHp, pokemon.getMaxHp())
|
||||
this.lastHp = tweenHp;
|
||||
}
|
||||
|
||||
const hpFrame = this.hpBar.scaleX > 0.5 ? 'high' : this.hpBar.scaleX > 0.25 ? 'medium' : 'low';
|
||||
if (hpFrame !== this.lastHpFrame) {
|
||||
this.hpBar.setFrame(hpFrame);
|
||||
this.lastHpFrame = hpFrame;
|
||||
}
|
||||
},
|
||||
onComplete: () => {
|
||||
resolve();
|
||||
}
|
||||
});
|
||||
if (!this.player)
|
||||
this.lastHp = pokemon.hp;
|
||||
this.lastMaxHp = pokemon.getMaxHp();
|
||||
};
|
||||
|
||||
if (this.player && (this.lastExp !== pokemon.exp || this.lastLevel !== pokemon.level)) {
|
||||
const originalResolve = resolve;
|
||||
resolve = () => this.updatePokemonExp(pokemon).then(() => originalResolve());
|
||||
}
|
||||
|
||||
if (this.lastHp !== pokemon.hp || this.lastMaxHp !== pokemon.getMaxHp()) {
|
||||
updatePokemonHp();
|
||||
return;
|
||||
} else if (!this.player && this.lastLevel !== pokemon.level) {
|
||||
this.setLevel(pokemon.level);
|
||||
this.lastLevel = pokemon.level;
|
||||
}
|
||||
|
||||
resolve();
|
||||
});
|
||||
}
|
||||
|
||||
updatePokemonExp(battler: Pokemon, instant?: boolean): Promise<void> {
|
||||
return new Promise(resolve => {
|
||||
const levelUp = this.lastLevel < battler.level;
|
||||
const relLevelExp = getLevelRelExp(this.lastLevel + 1, battler.species.growthRate);
|
||||
const levelExp = levelUp ? relLevelExp : battler.levelExp;
|
||||
let ratio = relLevelExp ? levelExp / relLevelExp : 0;
|
||||
if (this.lastLevel >= 100) {
|
||||
if (levelUp)
|
||||
ratio = 1;
|
||||
instant = true;
|
||||
}
|
||||
let duration = this.visible && !instant ? ((levelExp - this.lastLevelExp) / relLevelExp) * 1650 : 0;
|
||||
if (duration)
|
||||
this.scene.sound.play('exp');
|
||||
this.scene.tweens.add({
|
||||
targets: this.expBar,
|
||||
ease: 'Sine.easeIn',
|
||||
scaleX: ratio,
|
||||
duration: duration,
|
||||
onUpdate: () => {
|
||||
if (this.player && this.lastHp !== battler.hp) {
|
||||
const tweenHp = Math.ceil(this.hpBar.scaleX * battler.getMaxHp());
|
||||
this.setHpNumbers(tweenHp, battler.getMaxHp());
|
||||
this.lastHp = tweenHp;
|
||||
}
|
||||
|
||||
const hpFrame = this.hpBar.scaleX > 0.5 ? 'high' : this.hpBar.scaleX > 0.25 ? 'medium' : 'low';
|
||||
if (hpFrame !== this.lastHpFrame) {
|
||||
this.hpBar.setFrame(hpFrame);
|
||||
this.lastHpFrame = hpFrame;
|
||||
}
|
||||
},
|
||||
onComplete: () => {
|
||||
if (!this.scene) {
|
||||
resolve();
|
||||
return;
|
||||
}
|
||||
if (duration)
|
||||
this.scene.sound.stopByKey('exp');
|
||||
if (ratio === 1) {
|
||||
this.lastLevelExp = 0;
|
||||
this.lastLevel++;
|
||||
this.scene.sound.play('level_up');
|
||||
this.setLevel(this.lastLevel);
|
||||
this.scene.time.delayedCall(500, () => {
|
||||
this.expBar.setScale(0, 1);
|
||||
this.updateInfo(battler, instant).then(() => resolve());
|
||||
});
|
||||
return;
|
||||
} else {
|
||||
this.lastExp = battler.exp;
|
||||
this.lastLevelExp = battler.levelExp;
|
||||
}
|
||||
resolve();
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
setLevel(level: integer) {
|
||||
this.levelNumbersContainer.removeAll(true);
|
||||
const levelStr = level.toString();
|
||||
for (let i = 0; i < levelStr.length; i++)
|
||||
this.levelNumbersContainer.add(this.scene.add.image(i * 8, 0, 'numbers', levelStr[i]));
|
||||
this.levelContainer.setX((this.player ? -41 : -50) - 8 * Math.max(levelStr.length - 3, 0));
|
||||
}
|
||||
|
||||
setHpNumbers(hp: integer, maxHp: integer) {
|
||||
if (!this.player || !this.scene)
|
||||
return;
|
||||
this.hpNumbersContainer.removeAll(true);
|
||||
const hpStr = hp.toString();
|
||||
const maxHpStr = maxHp.toString();
|
||||
let offset = 0;
|
||||
for (let i = maxHpStr.length - 1; i >= 0; i--)
|
||||
this.hpNumbersContainer.add(this.scene.add.image(offset++ * -8, 0, 'numbers', maxHpStr[i]));
|
||||
this.hpNumbersContainer.add(this.scene.add.image(offset++ * -8, 0, 'numbers', '/'));
|
||||
for (let i = hpStr.length - 1; i >= 0; i--)
|
||||
this.hpNumbersContainer.add(this.scene.add.image(offset++ * -8, 0, 'numbers', hpStr[i]));
|
||||
}
|
||||
}
|
||||
|
||||
export class PlayerBattleInfo extends BattleInfo {
|
||||
constructor(scene: Phaser.Scene) {
|
||||
super(scene, Math.floor(scene.game.canvas.width / 6) - 10, -72, true);
|
||||
}
|
||||
}
|
||||
|
||||
export class EnemyBattleInfo extends BattleInfo {
|
||||
constructor(scene: Phaser.Scene) {
|
||||
super(scene, 140, -141, false);
|
||||
}
|
||||
}
|
||||
@@ -1,9 +1,9 @@
|
||||
import BattleScene, { Button } from "../battle-scene";
|
||||
import { addTextObject, TextStyle } from "../text";
|
||||
import { addTextObject, TextStyle } from "./text";
|
||||
import UI, { Mode } from "./ui";
|
||||
import * as Utils from "../utils";
|
||||
import MessageUiHandler from "./message-ui-handler";
|
||||
import { getStatName, Stat } from "../pokemon-stat";
|
||||
import { getStatName, Stat } from "../data/pokemon-stat";
|
||||
|
||||
export default class BattleMessageUiHandler extends MessageUiHandler {
|
||||
private levelUpStatsContainer: Phaser.GameObjects.Container;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import BattleScene, { Button } from "../battle-scene";
|
||||
import { Biome, biomeLinks, getBiomeName } from "../biome";
|
||||
import { addTextObject, TextStyle } from "../text";
|
||||
import { Biome, biomeLinks, getBiomeName } from "../data/biome";
|
||||
import { addTextObject, TextStyle } from "./text";
|
||||
import { Mode } from "./ui";
|
||||
import UiHandler from "./uiHandler";
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { CommandPhase } from "../battle-phases";
|
||||
import BattleScene, { Button } from "../battle-scene";
|
||||
import { addTextObject, TextStyle } from "../text";
|
||||
import { addTextObject, TextStyle } from "./text";
|
||||
import { toPokemonUpperCase } from "../utils";
|
||||
import { PartyUiMode } from "./party-ui-handler";
|
||||
import UI, { Mode } from "./ui";
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import BattleScene, { Button } from "../battle-scene";
|
||||
import { addTextObject, TextStyle } from "../text";
|
||||
import { addTextObject, TextStyle } from "./text";
|
||||
import { Mode } from "./ui";
|
||||
import UiHandler from "./uiHandler";
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import BattleScene, { Button } from "../battle-scene";
|
||||
import { addTextObject, TextStyle } from "../text";
|
||||
import { Type } from "../type";
|
||||
import { addTextObject, TextStyle } from "./text";
|
||||
import { Type } from "../data/type";
|
||||
import { Command } from "./command-ui-handler";
|
||||
import { Mode } from "./ui";
|
||||
import UiHandler from "./uiHandler";
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
import BattleScene from "../battle-scene";
|
||||
import { Modifier } from "../modifier";
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import BattleScene, { Button } from "../battle-scene";
|
||||
import { ModifierTier, ModifierType, ModifierTypeOption } from "../modifier-type";
|
||||
import { getPokeballAtlasKey, PokeballType } from "../pokeball";
|
||||
import { addTextObject, TextStyle } from "../text";
|
||||
import { ModifierTier, ModifierType, ModifierTypeOption } from "../modifier/modifier-type";
|
||||
import { getPokeballAtlasKey, PokeballType } from "../data/pokeball";
|
||||
import { addTextObject, TextStyle } from "./text";
|
||||
import AwaitableUiHandler from "./awaitable-ui-handler";
|
||||
import { Mode } from "./ui";
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { CommandPhase, SummonMissingPhase } from "../battle-phases";
|
||||
import BattleScene, { Button } from "../battle-scene";
|
||||
import { PlayerPokemon, PokemonMove } from "../pokemon";
|
||||
import { addTextObject, TextStyle } from "../text";
|
||||
import { addTextObject, TextStyle } from "./text";
|
||||
import { Command } from "./command-ui-handler";
|
||||
import MessageUiHandler from "./message-ui-handler";
|
||||
import { Mode } from "./ui";
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
import BattleScene, { Button } from "../battle-scene";
|
||||
import PokemonSpecies, { allSpecies } from "../pokemon-species";
|
||||
import { Species } from "../species";
|
||||
import { TextStyle, addTextObject } from "../text";
|
||||
import PokemonSpecies, { allSpecies } from "../data/pokemon-species";
|
||||
import { Species } from "../data/species";
|
||||
import { TextStyle, addTextObject } from "./text";
|
||||
import { Mode } from "./ui";
|
||||
import * as Utils from "../utils";
|
||||
import MessageUiHandler from "./message-ui-handler";
|
||||
import { DexEntryDetails, StarterDexUnlockTree } from "../game-data";
|
||||
import { Gender, getGenderColor, getGenderSymbol } from "../gender";
|
||||
import { pokemonPrevolutions } from "../pokemon-evolutions";
|
||||
import { DexEntryDetails, StarterDexUnlockTree } from "../system/game-data";
|
||||
import { Gender, getGenderColor, getGenderSymbol } from "../data/gender";
|
||||
import { pokemonPrevolutions } from "../data/pokemon-evolutions";
|
||||
|
||||
export type StarterSelectCallback = (starters: Starter[]) => void;
|
||||
|
||||
|
||||
@@ -3,11 +3,11 @@ import { Mode } from "./ui";
|
||||
import UiHandler from "./uiHandler";
|
||||
import * as Utils from "../utils";
|
||||
import { PlayerPokemon } from "../pokemon";
|
||||
import { Type } from "../type";
|
||||
import { TextStyle, addTextObject } from "../text";
|
||||
import Move, { MoveCategory } from "../move";
|
||||
import { getPokeballAtlasKey } from "../pokeball";
|
||||
import { getGenderColor, getGenderSymbol } from "../gender";
|
||||
import { Type } from "../data/type";
|
||||
import { TextStyle, addTextObject } from "./text";
|
||||
import Move, { MoveCategory } from "../data/move";
|
||||
import { getPokeballAtlasKey } from "../data/pokeball";
|
||||
import { getGenderColor, getGenderSymbol } from "../data/gender";
|
||||
|
||||
enum Page {
|
||||
PROFILE,
|
||||
|
||||
@@ -0,0 +1,85 @@
|
||||
export enum TextStyle {
|
||||
MESSAGE,
|
||||
WINDOW,
|
||||
BATTLE_INFO,
|
||||
PARTY,
|
||||
SUMMARY,
|
||||
SUMMARY_RED
|
||||
};
|
||||
|
||||
export function addTextObject(scene: Phaser.Scene, x: number, y: number, content: string, style: TextStyle, extraStyleOptions?: Phaser.Types.GameObjects.Text.TextStyle) {
|
||||
let styleOptions: Phaser.Types.GameObjects.Text.TextStyle;
|
||||
let shadowColor: string;
|
||||
let shadowSize = 6;
|
||||
|
||||
switch (style) {
|
||||
case TextStyle.WINDOW:
|
||||
styleOptions = {
|
||||
fontFamily: 'emerald',
|
||||
fontSize: '96px',
|
||||
color: '#484848',
|
||||
padding: {
|
||||
bottom: 6
|
||||
}
|
||||
};
|
||||
shadowColor = '#d0d0c8';
|
||||
break;
|
||||
case TextStyle.MESSAGE:
|
||||
styleOptions = {
|
||||
fontFamily: 'emerald',
|
||||
fontSize: '96px',
|
||||
color: '#f8f8f8',
|
||||
padding: {
|
||||
bottom: 6
|
||||
}
|
||||
};
|
||||
shadowColor = '#6b5a73';
|
||||
break;
|
||||
case TextStyle.BATTLE_INFO:
|
||||
styleOptions = {
|
||||
fontFamily: 'emerald',
|
||||
fontSize: '72px',
|
||||
color: '#404040'
|
||||
};
|
||||
shadowColor = '#ded6b5';
|
||||
shadowSize = 4;
|
||||
break;
|
||||
case TextStyle.PARTY:
|
||||
styleOptions = {
|
||||
fontFamily: 'pkmnems',
|
||||
fontSize: '66px',
|
||||
color: '#f8f8f8',
|
||||
padding: {
|
||||
bottom: 6
|
||||
}
|
||||
};
|
||||
shadowColor = '#707070';
|
||||
break;
|
||||
case TextStyle.SUMMARY:
|
||||
styleOptions = {
|
||||
fontFamily: 'emerald',
|
||||
fontSize: '96px',
|
||||
color: '#ffffff'
|
||||
};
|
||||
shadowColor = '#636363';
|
||||
break;
|
||||
case TextStyle.SUMMARY_RED:
|
||||
styleOptions = {
|
||||
fontFamily: 'emerald',
|
||||
fontSize: '96px',
|
||||
color: '#f89890'
|
||||
};
|
||||
shadowColor = '#984038';
|
||||
break;
|
||||
}
|
||||
|
||||
if (extraStyleOptions)
|
||||
styleOptions = Object.assign(styleOptions, extraStyleOptions);
|
||||
|
||||
const ret = scene.add.text(x, y, content, styleOptions);
|
||||
ret.setScale(0.1666666667);
|
||||
ret.setShadow(shadowSize, shadowSize, shadowColor);
|
||||
ret.setLineSpacing(5);
|
||||
|
||||
return ret;
|
||||
}
|
||||
Reference in new issue
Block a user