combat

package
v0.0.0-...-4bf0284 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 24, 2025 License: BSD-3-Clause Imports: 30 Imported by: 0

Documentation

Index

Constants

View Source
const (
	LightningBoltSound int = 19
)
View Source
const TownCenterX = 11
View Source
const TownCenterY = 10

Variables

This section is empty.

Functions

func RenderCombatTile

func RenderCombatTile(screen *ebiten.Image, imageCache *util.ImageCache, options ebiten.DrawImageOptions)

func RenderCombatUnit

func RenderCombatUnit(screen *ebiten.Image, use *ebiten.Image, options ebiten.DrawImageOptions, count int, enchantment data.UnitEnchantment, timeCounter uint64, imageCache *util.ImageCache)

Types

type Army

type Army struct {
	Player   *playerlib.Player
	ManaPool int
	// when counter magic is cast, this field tracks how much 'counter magic' strength is available to dispel
	CounterMagic int
	Units        []*ArmyUnit
	Auto         bool
	Fled         bool

	Enchantments []data.CombatEnchantment
}

func (*Army) AddEnchantment

func (army *Army) AddEnchantment(enchantment data.CombatEnchantment) bool

func (*Army) AddUnit

func (army *Army) AddUnit(unit CombatUnit)

must call LayoutUnits() some time after invoking AddUnit() to ensure * the units are laid out correctly

func (*Army) GetPower

func (army *Army) GetPower() int

a number that mostly represents the strength of this army

func (*Army) HasEnchantment

func (army *Army) HasEnchantment(enchantment data.CombatEnchantment) bool

func (*Army) IsAI

func (army *Army) IsAI() bool

func (*Army) LayoutUnits

func (army *Army) LayoutUnits(team Team)

func (*Army) RemoveEnchantment

func (army *Army) RemoveEnchantment(enchamtent data.CombatEnchantment)

func (*Army) RemoveUnit

func (army *Army) RemoveUnit(remove *ArmyUnit)

type ArmyUnit

type ArmyUnit struct {
	Unit   CombatUnit
	Facing units.Facing
	Moving bool
	X      int
	Y      int
	// Health int
	MovesLeft fraction.Fraction

	Spells       spellbook.Spells
	SpellCharges map[spellbook.Spell]int
	CastingSkill float32
	Casted       bool

	Model *CombatModel

	Team Team

	RangedAttacks int

	Attacking bool
	Defending bool

	MovementTick uint64
	MoveX        float64
	MoveY        float64
	CurrentPath  pathfinding.Path

	LastTurn int

	// enchantments applied to the unit during combat, usually by a spell
	Enchantments []data.UnitEnchantment

	// ugly to need this, but this caches paths computed for the unit
	Paths map[image.Point]pathfinding.Path
}

func (*ArmyUnit) AddEnchantment

func (unit *ArmyUnit) AddEnchantment(enchantment data.UnitEnchantment)

func (*ArmyUnit) ApplyAreaDamage

func (unit *ArmyUnit) ApplyAreaDamage(attackStrength int, damageType units.Damage, wallDefense int) int

apply damage to each individual figure such that each figure gets to individually block damage. this could potentially allow a damage of 5 to destroy a unit with 4 figures of 1HP each

func (*ArmyUnit) ApplyDamage

func (unit *ArmyUnit) ApplyDamage(damage int, damageType units.Damage, armorPiercing bool, wallDefense int) int

apply damage to lead figure, and if it dies then keep applying remaining damage to the next figure

func (*ArmyUnit) CanCast

func (unit *ArmyUnit) CanCast() bool

func (*ArmyUnit) CanFollowPath

func (unit *ArmyUnit) CanFollowPath(path pathfinding.Path) bool

func (*ArmyUnit) CanTraverseWall

func (unit *ArmyUnit) CanTraverseWall() bool

true if this unit can move through a tile with a wall tile

func (*ArmyUnit) CauseFear

func (unit *ArmyUnit) CauseFear() int

return how many units should become afraid

func (*ArmyUnit) ComputeDefense

func (unit *ArmyUnit) ComputeDefense(damage units.Damage, armorPiercing bool, wallDefense int) int

func (*ArmyUnit) ComputeMeleeDamage

func (unit *ArmyUnit) ComputeMeleeDamage(fearFigure int) (int, bool)

func (*ArmyUnit) ComputeRangeDamage

func (unit *ArmyUnit) ComputeRangeDamage(tileDistance int) int

given the distance to the target in tiles, return the amount of range damage done

func (*ArmyUnit) Figures

func (unit *ArmyUnit) Figures() int

number of alive figures in this unit

func (*ArmyUnit) GetAbilityValue

func (unit *ArmyUnit) GetAbilityValue(ability data.AbilityType) float32

func (*ArmyUnit) GetDefense

func (unit *ArmyUnit) GetDefense() int

func (*ArmyUnit) GetEnchantments

func (unit *ArmyUnit) GetEnchantments() []data.UnitEnchantment

func (*ArmyUnit) GetMeleeAttackPower

func (unit *ArmyUnit) GetMeleeAttackPower() int

func (*ArmyUnit) GetMovementSpeed

func (unit *ArmyUnit) GetMovementSpeed() int

func (*ArmyUnit) GetPower

func (unit *ArmyUnit) GetPower() int

roughly represents the strength of this unit, used for strategic combat

func (*ArmyUnit) GetRangedAttackPower

func (unit *ArmyUnit) GetRangedAttackPower() int

func (*ArmyUnit) GetRealm

func (unit *ArmyUnit) GetRealm() data.MagicType

func (*ArmyUnit) GetResistance

func (unit *ArmyUnit) GetResistance() int

func (*ArmyUnit) GetResistances

func (unit *ArmyUnit) GetResistances(enchantments ...data.UnitEnchantment) int

func (*ArmyUnit) GetToHitMelee

func (unit *ArmyUnit) GetToHitMelee() int

func (*ArmyUnit) GetWeaponBonus

func (unit *ArmyUnit) GetWeaponBonus() data.WeaponBonus

func (*ArmyUnit) HasAbility

func (unit *ArmyUnit) HasAbility(ability data.AbilityType) bool

func (*ArmyUnit) HasEnchantment

func (unit *ArmyUnit) HasEnchantment(enchantment data.UnitEnchantment) bool

func (*ArmyUnit) Heal

func (unit *ArmyUnit) Heal(amount int)

func (*ArmyUnit) InitializeSpells

func (unit *ArmyUnit) InitializeSpells(allSpells spellbook.Spells, player *playerlib.Player)

func (*ArmyUnit) ResetTurnData

func (unit *ArmyUnit) ResetTurnData()

func (*ArmyUnit) TakeDamage

func (unit *ArmyUnit) TakeDamage(damage int)

func (*ArmyUnit) ToDefend

func (unit *ArmyUnit) ToDefend() int

type CardinalDirection

type CardinalDirection int
const (
	DirectionNorth CardinalDirection = iota
	DirectionEast
	DirectionSouth
	DirectionWest
)

type CombatDrawFunc

type CombatDrawFunc func(*ebiten.Image)

type CombatEndScreen

type CombatEndScreen struct {
	CombatScreen *CombatScreen
	Result       CombatEndScreenResult
	UnitsLost    int
	Fame         int
	// when fighting in a city, citizens and buildings may be lost
	PopulationLost int
	BuildingsLost  int
	Cache          *lbx.LbxCache
	ImageCache     util.ImageCache
	UI             *uilib.UI
	State          CombatEndScreenState
}

func MakeCombatEndScreen

func MakeCombatEndScreen(cache *lbx.LbxCache, combat *CombatScreen, result CombatEndScreenResult, unitsLost int, fame int, populationLost int, buildingsLost int) *CombatEndScreen

func (*CombatEndScreen) Draw

func (end *CombatEndScreen) Draw(screen *ebiten.Image)

func (*CombatEndScreen) MakeUI

func (end *CombatEndScreen) MakeUI() *uilib.UI

func (*CombatEndScreen) Update

func (end *CombatEndScreen) Update() CombatEndScreenState

type CombatEndScreenResult

type CombatEndScreenResult int
const (
	CombatEndScreenResultWin CombatEndScreenResult = iota
	CombatEndScreenResultLoose
	CombatEndScreenResultRetreat
)

type CombatEndScreenState

type CombatEndScreenState int
const (
	CombatEndScreenRunning CombatEndScreenState = iota
	CombatEndScreenDone
)

type CombatEvent

type CombatEvent interface {
}

type CombatEventCastEnchantment

type CombatEventCastEnchantment struct {
	Enchantment data.CombatEnchantment
	Caster      *playerlib.Player
}

type CombatEventCreateLightningBolt

type CombatEventCreateLightningBolt struct {
	Target   *ArmyUnit
	Strength int
}

FIXME: kind of ugly to need a specific event like this for one projectile type

type CombatEventMessage

type CombatEventMessage struct {
	Message string
}

type CombatEventNextUnit

type CombatEventNextUnit struct {
}

type CombatEventSelectTile

type CombatEventSelectTile struct {
	SelectTile func(int, int)
	Spell      spellbook.Spell
	Selecter   Team
}

type CombatEventSelectUnit

type CombatEventSelectUnit struct {
	SelectTarget func(*ArmyUnit)
	CanTarget    func(*ArmyUnit) bool
	Spell        spellbook.Spell
	Selecter     Team
	SelectTeam   Team
}

type CombatLandscape

type CombatLandscape int
const (
	CombatLandscapeGrass CombatLandscape = iota
	CombatLandscapeWater
	CombatLandscapeDesert
	CombatLandscapeMountain
	CombatLandscapeTundra
)

type CombatLogEvent

type CombatLogEvent struct {
	Turn         int
	Text         string
	AbsoluteTime time.Time
}

type CombatModel

type CombatModel struct {
	SelectedUnit  *ArmyUnit
	DefendingArmy *Army
	AttackingArmy *Army
	Tiles         [][]Tile
	// when the user hovers over a unit, that unit should be shown in a little info box at the upper right
	HighlightedUnit *ArmyUnit
	OtherUnits      []*OtherUnit
	Projectiles     []*Projectile

	Events chan CombatEvent

	TurnAttacker int
	TurnDefender int

	// track how many units were killed on each side, so experience
	// can be given out after combat ends
	DefeatedDefenders int
	DefeatedAttackers int

	// track how many units were killed when fleeing, so the number
	// can be reported after combands ends
	DiedWhileFleeing int

	Turn        Team
	CurrentTurn int

	Log      []CombatLogEvent
	Observer CombatObservers

	// cached location of city wall gate
	CityWallGate image.Point

	// incremented for each unit that is inside the town area (when fighting in a town)
	CollateralDamage int
}

func MakeCombatModel

func MakeCombatModel(cache *lbx.LbxCache, defendingArmy *Army, attackingArmy *Army, landscape CombatLandscape, plane data.Plane, zone ZoneType, events chan CombatEvent) *CombatModel

func (*CombatModel) AddEnchantment

func (model *CombatModel) AddEnchantment(player *playerlib.Player, enchantment data.CombatEnchantment) bool

func (*CombatModel) AddLogEvent

func (model *CombatModel) AddLogEvent(text string)

func (*CombatModel) AddProjectile

func (model *CombatModel) AddProjectile(projectile *Projectile)

func (*CombatModel) ApplyImmolationDamage

func (model *CombatModel) ApplyImmolationDamage(defender *ArmyUnit, immolationDamage int)

func (*CombatModel) ApplyMeleeDamage

func (model *CombatModel) ApplyMeleeDamage(attacker *ArmyUnit, defender *ArmyUnit, damage int)

func (*CombatModel) ApplyWallOfFireDamage

func (model *CombatModel) ApplyWallOfFireDamage(defender *ArmyUnit)

func (*CombatModel) CanMoveTo

func (model *CombatModel) CanMoveTo(unit *ArmyUnit, x int, y int) bool

func (*CombatModel) CheckDispel

func (model *CombatModel) CheckDispel(spell spellbook.Spell, caster *playerlib.Player) bool

returns true if the spell should be dispelled (due to counter magic, magic nodes, etc)

func (*CombatModel) ChooseNextUnit

func (model *CombatModel) ChooseNextUnit(team Team) *ArmyUnit

choose a unit from the given team such that * the unit's LastTurn is less than the current turn

func (*CombatModel) ComputeWallDefense

func (model *CombatModel) ComputeWallDefense(attacker *ArmyUnit, defender *ArmyUnit) int

if defender is in city wall but attacker is outside, then defense is

1 if defender is not adjacent a wall
3 if defender is adjacent to a wall

func (*CombatModel) ContainsWallTower

func (model *CombatModel) ContainsWallTower(x int, y int) bool

a wall tower is a wall with two sides

func (*CombatModel) CreateEarthToMud

func (model *CombatModel) CreateEarthToMud(centerX int, centerY int)

makes a 5x5 square of tiles have mud on them

func (*CombatModel) DoneTurn

func (model *CombatModel) DoneTurn()

func (*CombatModel) FindEmptyTile

func (model *CombatModel) FindEmptyTile() (int, int, error)

func (*CombatModel) FindPath

func (model *CombatModel) FindPath(unit *ArmyUnit, x int, y int) (pathfinding.Path, bool)

return a valid path that the given unit can take to reach tile position x, y * this caches the path such that the next call to FindPath() will return the same path without computing it

func (*CombatModel) FinishTurn

func (model *CombatModel) FinishTurn(team Team)

one side finished its turn

func (*CombatModel) GetArmy

func (model *CombatModel) GetArmy(unit *ArmyUnit) *Army

func (*CombatModel) GetArmyForPlayer

func (model *CombatModel) GetArmyForPlayer(player *playerlib.Player) *Army

func (*CombatModel) GetCityGateCoordinates

func (model *CombatModel) GetCityGateCoordinates() (int, int)

func (*CombatModel) GetObserver

func (model *CombatModel) GetObserver() CombatObserver

func (*CombatModel) GetOppositeArmyForPlayer

func (model *CombatModel) GetOppositeArmyForPlayer(player *playerlib.Player) *Army

func (*CombatModel) GetOtherArmy

func (model *CombatModel) GetOtherArmy(unit *ArmyUnit) *Army

func (*CombatModel) GetUnit

func (model *CombatModel) GetUnit(x int, y int) *ArmyUnit

func (*CombatModel) Initialize

func (model *CombatModel) Initialize(allSpells spellbook.Spells)

func (*CombatModel) InsideAnyWall

func (model *CombatModel) InsideAnyWall(x int, y int) bool

func (*CombatModel) InsideCityWall

func (model *CombatModel) InsideCityWall(x int, y int) bool

func (*CombatModel) InsideTown

func (model *CombatModel) InsideTown(x int, y int) bool

func (*CombatModel) InsideWallOfDarkness

func (model *CombatModel) InsideWallOfDarkness(x int, y int) bool

func (*CombatModel) InsideWallOfFire

func (model *CombatModel) InsideWallOfFire(x int, y int) bool

return true if x,y is within the bounds of the enclosed wall of fire space

func (*CombatModel) IsAIControlled

func (model *CombatModel) IsAIControlled(unit *ArmyUnit) bool

func (*CombatModel) IsCityWallGate

func (model *CombatModel) IsCityWallGate(x int, y int) bool

func (*CombatModel) IsEnchantmentActive

func (model *CombatModel) IsEnchantmentActive(enchantment data.CombatEnchantment, team Team) bool

func (*CombatModel) IsTeamAlive

func (model *CombatModel) IsTeamAlive(team Team) bool

func (*CombatModel) NextTurn

func (model *CombatModel) NextTurn()

func (*CombatModel) NextUnit

func (model *CombatModel) NextUnit()

func (*CombatModel) RemoveUnit

func (model *CombatModel) RemoveUnit(unit *ArmyUnit)

func (*CombatModel) UpdateProjectiles

func (model *CombatModel) UpdateProjectiles(counter uint64) bool

type CombatObserver

type CombatObserver interface {
	ThrowAttack(attacker *ArmyUnit, defender *ArmyUnit, damage int)
	PoisonTouchAttack(attacker *ArmyUnit, defender *ArmyUnit, damage int)
	LifeStealTouchAttack(attacker *ArmyUnit, defender *ArmyUnit, damage int)
	StoningTouchAttack(attacker *ArmyUnit, defender *ArmyUnit, damage int)
	DispelEvilTouchAttack(attacker *ArmyUnit, defender *ArmyUnit, damage int)
	DeathTouchAttack(attacker *ArmyUnit, defender *ArmyUnit, damage int)
	DestructionAttack(attacker *ArmyUnit, defender *ArmyUnit, damage int)
	StoneGazeAttack(attacker *ArmyUnit, defender *ArmyUnit, damage int)
	DeathGazeAttack(attacker *ArmyUnit, defender *ArmyUnit, damage int)
	DoomGazeAttack(attacker *ArmyUnit, defender *ArmyUnit, damage int)
	FireBreathAttack(attacker *ArmyUnit, defender *ArmyUnit, damage int)
	LightningBreathAttack(attacker *ArmyUnit, defender *ArmyUnit, damage int)
	ImmolationAttack(attacker *ArmyUnit, defender *ArmyUnit, damage int)
	MeleeAttack(attacker *ArmyUnit, defender *ArmyUnit, damageRoll int)
	CauseFear(attacker *ArmyUnit, defender *ArmyUnit, fear int)
	WallOfFire(defender *ArmyUnit, damage int)
	UnitKilled(unit *ArmyUnit)
}

type CombatObservers

type CombatObservers struct {
	Observers []CombatObserver
}

func (*CombatObservers) AddObserver

func (observer *CombatObservers) AddObserver(add CombatObserver)

func (*CombatObservers) CauseFear

func (observer *CombatObservers) CauseFear(attacker *ArmyUnit, defender *ArmyUnit, fear int)

func (*CombatObservers) DeathGazeAttack

func (observer *CombatObservers) DeathGazeAttack(attacker *ArmyUnit, defender *ArmyUnit, damage int)

func (*CombatObservers) DeathTouchAttack

func (observer *CombatObservers) DeathTouchAttack(attacker *ArmyUnit, defender *ArmyUnit, damage int)

func (*CombatObservers) DestructionAttack

func (observer *CombatObservers) DestructionAttack(attacker *ArmyUnit, defender *ArmyUnit, damage int)

func (*CombatObservers) DispelEvilTouchAttack

func (observer *CombatObservers) DispelEvilTouchAttack(attacker *ArmyUnit, defender *ArmyUnit, damage int)

func (*CombatObservers) DoomGazeAttack

func (observer *CombatObservers) DoomGazeAttack(attacker *ArmyUnit, defender *ArmyUnit, damage int)

func (*CombatObservers) FireBreathAttack

func (observer *CombatObservers) FireBreathAttack(attacker *ArmyUnit, defender *ArmyUnit, damage int)

func (*CombatObservers) ImmolationAttack

func (observer *CombatObservers) ImmolationAttack(attacker *ArmyUnit, defender *ArmyUnit, damage int)

func (*CombatObservers) LifeStealTouchAttack

func (observer *CombatObservers) LifeStealTouchAttack(attacker *ArmyUnit, defender *ArmyUnit, damage int)

func (*CombatObservers) LightningBreathAttack

func (observer *CombatObservers) LightningBreathAttack(attacker *ArmyUnit, defender *ArmyUnit, damage int)

func (*CombatObservers) MeleeAttack

func (observer *CombatObservers) MeleeAttack(attacker *ArmyUnit, defender *ArmyUnit, damageRoll int)

func (*CombatObservers) PoisonTouchAttack

func (observer *CombatObservers) PoisonTouchAttack(attacker *ArmyUnit, defender *ArmyUnit, damage int)

func (*CombatObservers) RemoveObserver

func (observer *CombatObservers) RemoveObserver(remove CombatObserver)

func (*CombatObservers) StoneGazeAttack

func (observer *CombatObservers) StoneGazeAttack(attacker *ArmyUnit, defender *ArmyUnit, damage int)

func (*CombatObservers) StoningTouchAttack

func (observer *CombatObservers) StoningTouchAttack(attacker *ArmyUnit, defender *ArmyUnit, damage int)

func (*CombatObservers) ThrowAttack

func (observer *CombatObservers) ThrowAttack(attacker *ArmyUnit, defender *ArmyUnit, damage int)

func (*CombatObservers) UnitKilled

func (observer *CombatObservers) UnitKilled(unit *ArmyUnit)

func (*CombatObservers) WallOfFire

func (observer *CombatObservers) WallOfFire(defender *ArmyUnit, damage int)

type CombatScreen

type CombatScreen struct {
	Events              chan CombatEvent
	Drawer              CombatDrawFunc
	ImageCache          util.ImageCache
	Cache               *lbx.LbxCache
	Mouse               *mouse.MouseData
	AttackingWizardFont *font.Font
	DefendingWizardFont *font.Font
	EnchantmentFont     *font.Font
	WhitePixel          *ebiten.Image
	UI                  *uilib.UI
	DebugFont           *font.Font
	HudFont             *font.Font
	InfoFont            *font.Font
	WhiteFont           *font.Font
	DrawRoad            bool
	// order to draw tiles in such that they are drawn from the top of the screen to the bottom (painter's order)
	TopDownOrder []image.Point

	Coordinates ebiten.GeoM
	// ScreenToTile ebiten.GeoM
	MouseState MouseState

	CameraScale float64

	Counter uint64

	MouseTileX int
	MouseTileY int

	// if true then the player should select a tile to cast a spell on
	/*
	   SelectTile func(int, int)
	*/
	DoSelectTile bool

	// if true then the player should select a unit to cast a spell on
	DoSelectUnit bool

	Model *CombatModel
}

func MakeCombatScreen

func MakeCombatScreen(cache *lbx.LbxCache, defendingArmy *Army, attackingArmy *Army, player *playerlib.Player, landscape CombatLandscape, plane data.Plane, zone ZoneType) *CombatScreen

player is always the human player

func (*CombatScreen) CastEnchantment

func (combat *CombatScreen) CastEnchantment(player *playerlib.Player, enchantment data.CombatEnchantment, castedCallback func())

func (*CombatScreen) CreateAirElemental

func (combat *CombatScreen) CreateAirElemental(player *playerlib.Player, x int, y int)

func (*CombatScreen) CreateBanishProjectile

func (combat *CombatScreen) CreateBanishProjectile(target *ArmyUnit)

func (*CombatScreen) CreateCracksCallProjectile

func (combat *CombatScreen) CreateCracksCallProjectile(target *ArmyUnit)

func (*CombatScreen) CreateDeathSpellProjectile

func (combat *CombatScreen) CreateDeathSpellProjectile(target *ArmyUnit)

func (*CombatScreen) CreateDemon

func (combat *CombatScreen) CreateDemon(player *playerlib.Player, x int, y int)

func (*CombatScreen) CreateDisintegrateProjectile

func (combat *CombatScreen) CreateDisintegrateProjectile(target *ArmyUnit)

func (*CombatScreen) CreateDispelEvilProjectile

func (combat *CombatScreen) CreateDispelEvilProjectile(target *ArmyUnit)

func (*CombatScreen) CreateDispelMagicProjectile

func (combat *CombatScreen) CreateDispelMagicProjectile(target *ArmyUnit)

func (*CombatScreen) CreateDisruptProjectile

func (combat *CombatScreen) CreateDisruptProjectile(x int, y int)

func (*CombatScreen) CreateDoomBoltProjectile

func (combat *CombatScreen) CreateDoomBoltProjectile(target *ArmyUnit)

func (*CombatScreen) CreateEarthElemental

func (combat *CombatScreen) CreateEarthElemental(player *playerlib.Player, x int, y int)

func (*CombatScreen) CreateFireBoltProjectile

func (combat *CombatScreen) CreateFireBoltProjectile(target *ArmyUnit)

func (*CombatScreen) CreateFireElemental

func (combat *CombatScreen) CreateFireElemental(player *playerlib.Player, x int, y int)

func (*CombatScreen) CreateFireballProjectile

func (combat *CombatScreen) CreateFireballProjectile(target *ArmyUnit)

func (*CombatScreen) CreateFlameStrikeProjectile

func (combat *CombatScreen) CreateFlameStrikeProjectile(target *ArmyUnit)

func (*CombatScreen) CreateHealingProjectile

func (combat *CombatScreen) CreateHealingProjectile(target *ArmyUnit)

func (*CombatScreen) CreateHolyWordProjectile

func (combat *CombatScreen) CreateHolyWordProjectile(target *ArmyUnit)

func (*CombatScreen) CreateIceBoltProjectile

func (combat *CombatScreen) CreateIceBoltProjectile(target *ArmyUnit)

func (*CombatScreen) CreateLifeDrainProjectile

func (combat *CombatScreen) CreateLifeDrainProjectile(target *ArmyUnit)

func (*CombatScreen) CreateLightningBoltProjectile

func (combat *CombatScreen) CreateLightningBoltProjectile(target *ArmyUnit, strength int)

func (*CombatScreen) CreateMagicVortex

func (combat *CombatScreen) CreateMagicVortex(x int, y int)

func (*CombatScreen) CreatePhantomBeast

func (combat *CombatScreen) CreatePhantomBeast(player *playerlib.Player, x int, y int)

func (*CombatScreen) CreatePhantomWarriors

func (combat *CombatScreen) CreatePhantomWarriors(player *playerlib.Player, x int, y int)

func (*CombatScreen) CreatePsionicBlastProjectile

func (combat *CombatScreen) CreatePsionicBlastProjectile(target *ArmyUnit)

func (*CombatScreen) CreateRecallHeroProjectile

func (combat *CombatScreen) CreateRecallHeroProjectile(target *ArmyUnit)

func (*CombatScreen) CreateResistElementsProjectile

func (combat *CombatScreen) CreateResistElementsProjectile(target *ArmyUnit)

func (*CombatScreen) CreateStarFiresProjectile

func (combat *CombatScreen) CreateStarFiresProjectile(target *ArmyUnit)

func (*CombatScreen) CreateSummoningCircle

func (combat *CombatScreen) CreateSummoningCircle(x int, y int)

func (*CombatScreen) CreateWarpLightningProjectile

func (combat *CombatScreen) CreateWarpLightningProjectile(target *ArmyUnit)

func (*CombatScreen) CreateWarpWoodProjectile

func (combat *CombatScreen) CreateWarpWoodProjectile(target *ArmyUnit)

func (*CombatScreen) CreateWebProjectile

func (combat *CombatScreen) CreateWebProjectile(target *ArmyUnit)

func (*CombatScreen) CreateWordOfDeathProjectile

func (combat *CombatScreen) CreateWordOfDeathProjectile(target *ArmyUnit)

func (*CombatScreen) CreateWordOfRecallProjectile

func (combat *CombatScreen) CreateWordOfRecallProjectile(target *ArmyUnit)

func (*CombatScreen) DoAllUnitsSpell

func (combat *CombatScreen) DoAllUnitsSpell(player *playerlib.Player, spell spellbook.Spell, targetKind Targeting, onTarget func(*ArmyUnit), canTarget func(*ArmyUnit) bool)

create projectiles on all units immediately, no targeting required

func (*CombatScreen) DoSummoningSpell

func (combat *CombatScreen) DoSummoningSpell(player *playerlib.Player, spell spellbook.Spell, onTarget func(int, int))

func (*CombatScreen) DoTargetTileSpell

func (combat *CombatScreen) DoTargetTileSpell(player *playerlib.Player, spell spellbook.Spell, onTarget func(int, int))

FIXME: take in a canTarget function to check if the tile is legal

func (*CombatScreen) DoTargetUnitSpell

func (combat *CombatScreen) DoTargetUnitSpell(player *playerlib.Player, spell spellbook.Spell, targetKind Targeting, onTarget func(*ArmyUnit), canTarget func(*ArmyUnit) bool)

let the user select a target, then cast the spell on that target

func (*CombatScreen) Draw

func (combat *CombatScreen) Draw(screen *ebiten.Image)

func (*CombatScreen) DrawHealthBar

func (combat *CombatScreen) DrawHealthBar(screen *ebiten.Image, x int, y int, unit *ArmyUnit)

draw a horizontal bar that represents the health of the unit mostly green if healthy (>66% health) yellow if between 33% to 66% health otherwise red

func (*CombatScreen) DrawHighlightedTile

func (combat *CombatScreen) DrawHighlightedTile(screen *ebiten.Image, x int, y int, matrix *ebiten.GeoM, minColor color.RGBA, maxColor color.RGBA)

func (*CombatScreen) DrawWall

func (combat *CombatScreen) DrawWall(screen *ebiten.Image, x int, y int, tilePosition func(float64, float64) (float64, float64), animationIndex uint64)

func (*CombatScreen) GetCameraMatrix

func (combat *CombatScreen) GetCameraMatrix() ebiten.GeoM

func (*CombatScreen) InvokeSpell

func (combat *CombatScreen) InvokeSpell(player *playerlib.Player, spell spellbook.Spell, castedCallback func())

func (*CombatScreen) MakeUI

func (combat *CombatScreen) MakeUI(player *playerlib.Player) *uilib.UI

func (*CombatScreen) NormalDraw

func (combat *CombatScreen) NormalDraw(screen *ebiten.Image)

func (*CombatScreen) ProcessEvents

func (combat *CombatScreen) ProcessEvents(yield coroutine.YieldFunc)

func (*CombatScreen) ScreenToTile

func (combat *CombatScreen) ScreenToTile(x float64, y float64) (float64, float64)

func (*CombatScreen) ShowUnitInfo

func (combat *CombatScreen) ShowUnitInfo(screen *ebiten.Image, unit *ArmyUnit)

func (*CombatScreen) TileIsEmpty

func (combat *CombatScreen) TileIsEmpty(x int, y int) bool

func (*CombatScreen) Update

func (combat *CombatScreen) Update(yield coroutine.YieldFunc) CombatState

func (*CombatScreen) UpdateAnimations

func (combat *CombatScreen) UpdateAnimations()

func (*CombatScreen) UpdateMouseState

func (combat *CombatScreen) UpdateMouseState()

type CombatState

type CombatState int
const (
	CombatStateRunning CombatState = iota
	CombatStateAttackerWin
	CombatStateDefenderWin
	CombatStateAttackerFlee
	CombatStateDefenderFlee
	CombatStateNoCombat
)

func DoStrategicCombat

func DoStrategicCombat(attackingArmy *Army, defendingArmy *Army) (CombatState, int, int)

predicts the outcome of a battle just by comparing the relative power level of each army

func (CombatState) String

func (state CombatState) String() string

type CombatUnit

type CombatUnit interface {
	HasAbility(data.AbilityType) bool
	HasItemAbility(data.ItemAbility) bool
	GetAbilityValue(data.AbilityType) float32
	GetDefense() int
	GetResistance() int
	AdjustHealth(int)
	GetAbilities() []data.Ability
	GetBanner() data.BannerType
	GetRangedAttackDamageType() units.Damage
	GetRangedAttackPower() int
	GetMeleeAttackPower() int
	GetMaxHealth() int
	GetHitPoints() int
	GetWeaponBonus() data.WeaponBonus
	GetEnchantments() []data.UnitEnchantment
	HasEnchantment(data.UnitEnchantment) bool
	GetCount() int
	GetHealth() int
	GetToHitMelee() int
	GetKnownSpells() []string
	GetRangedAttacks() int
	GetCombatLbxFile() string
	GetCombatIndex(units.Facing) int
	GetCombatRangeIndex(units.Facing) int
	GetMovementSound() units.MovementSound
	GetRangeAttackSound() units.RangeAttackSound
	GetAttackSound() units.AttackSound
	GetName() string
	GetMovementSpeed() int
	CanTouchAttack(units.Damage) bool
	IsFlying() bool
	IsHero() bool
	IsUndead() bool
	GetRace() data.Race
	GetRealm() data.MagicType
	GetSpellChargeSpells() map[spellbook.Spell]int
}

type DarknessSide

type DarknessSide int
const (
	DarknessSideSouth DarknessSide = iota
	DarknessSideEast
	DarknessSideNorth
	DarknessSideWest
)

type FireSide

type FireSide int
const (
	FireSideSouth FireSide = iota
	FireSideEast
	FireSideNorth
	FireSideWest
)

type MouseState

type MouseState int
const (
	CombatClickHud MouseState = iota
	CombatMoveOk
	CombatMeleeAttackOk
	CombatRangeAttackOk
	CombatNotOk
	CombatCast
)

type OtherUnit

type OtherUnit struct {
	Animation *util.Animation
	X         int
	Y         int
}

represents a unit that is not part of the army, for things like magic vortex, for things like magic vortex

type Projectile

type Projectile struct {
	Target    *ArmyUnit
	Animation *util.Animation
	Explode   *util.Animation
	Effect    ProjectileEffect
	X         float64
	Y         float64
	Speed     float64
	Angle     float64
	TargetX   float64
	TargetY   float64
	Exploding bool
}

type ProjectileEffect

type ProjectileEffect func(*ArmyUnit)

type Targeting

type Targeting int
const (
	TargetFriend Targeting = iota
	TargetEnemy
	TargetEither
)

type Team

type Team int
const (
	TeamAttacker Team = iota
	TeamDefender
	TeamEither
)

func (Team) String

func (team Team) String() string

type Tile

type Tile struct {
	// a unit standing on this tile, if any
	Unit *ArmyUnit
	Lbx  string
	// index of grass/floor
	Index int
	// tree/rock on top, or -1 if nothing
	ExtraObject TileTop
	Mud         bool
	// whether to show fire on this tile
	Fire *set.Set[FireSide]
	// whether to show wall of darkness on this tile
	Darkness *set.Set[DarknessSide]

	Wall *set.Set[WallKind]

	// true if this tile is inside the wall of fire/darkness
	InsideTown     bool
	InsideFire     bool
	InsideDarkness bool
	InsideWall     bool
}

type TileAlignment

type TileAlignment int
const (
	TileAlignMiddle TileAlignment = iota
	TileAlignBottom
)

type TileDraw

type TileDraw func(*ebiten.Image, *util.ImageCache, *ebiten.DrawImageOptions, uint64)

type TileTop

type TileTop struct {
	Drawer    TileDraw
	Lbx       string
	Index     int
	Alignment TileAlignment
}

type UnitPosition

type UnitPosition int
const (
	UnitPositionMiddle UnitPosition = iota
	UnitPositionUnder
)

type WallKind

type WallKind int
const (
	WallKindNone WallKind = iota
	WallKindNorth
	WallKindEast
	WallKindSouth
	WallKindWest
	WallKindGate
)

type ZoneType

type ZoneType struct {
	// fighting in a city
	City *citylib.City

	AncientTemple bool
	FallenTemple  bool
	Ruins         bool
	AbandonedKeep bool
	Lair          bool
	Tower         bool
	Dungeon       bool

	// one of the three node types
	ChaosNode   bool
	NatureNode  bool
	SorceryNode bool
}

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL