forge/blade/action/v2.py (97 lines of code) (raw):

from pdb import set_trace as T from forge.blade.action import action from forge.blade.lib import utils, enums import numpy as np class Arg: def __init__(self, val, discrete=True, set=False, min=-1, max=1): self.val = val self.discrete = discrete self.continuous = not discrete self.min = min self.max = max self.n = self.max - self.min + 1 class ActionV2: def edges(self, world, entity, inclusive=False): return [Pass, Move, Attack]#, Ranged] class Pass(action.Pass): priority = 0 @staticmethod def call(world, entity): return def args(stim, entity, config): return [()] @property def nArgs(): return 1 class Move(action.Move): priority = 1 def call(world, entity, rDelta, cDelta): r, c = entity.pos rNew, cNew = r+rDelta, c+cDelta if world.env.tiles[rNew, cNew].state.index in enums.IMPASSIBLE: return if not utils.inBounds(rNew, cNew, world.shape): return if entity.freeze > 0: return entity._pos = rNew, cNew entID = entity.entID r, c = entity.lastPos world.env.tiles[r, c].delEnt(entID) r, c = entity.pos world.env.tiles[r, c].addEnt(entID, entity) def args(stim, entity, config): rets = [] for delta in ((0, 0), (0, 1), (1, 0), (0, -1), (-1, 0)): r, c = delta #r, c = Arg(r), Arg(c) rets.append((r, c)) return rets @property def nArgs(): return len(Move.args(None, None)) class Attack(action.Attack): def inRange(entity, stim, N): R, C = stim.shape R, C = R//2, C//2 #R, C = entity.pos rets = [] for r in range(R-N, R+N+1): for c in range(C-N, C+N+1): for e in stim[r, c].ents.values(): rets.append(e) return rets def l1(pos, cent): r, c = pos rCent, cCent = cent return abs(r - rCent) + abs(c - cCent) def call(world, entity, targ, damageF, freeze=False): if entity.entID == targ.entID: entity._attack = None return #entity.targPos = targ.pos #entity.attkPos = entity.lastPos #entity.targ = targ damage = damageF(entity, targ) assert type(damage) == int if freeze and damage > 0: targ._freeze = 3 return #return damage def args(stim, entity, config): return [Melee, Range, Mage] #return Melee.args(stim, entity, config) + Range.args(stim, entity, config) + Mage.args(stim, entity, config) class Melee(action.Melee): priority = 2 def call(world, entity, targ): damageF = world.config.MELEEDAMAGE Attack.call(world, entity, targ, damageF) def args(stim, entity, config): return Attack.inRange(entity, stim, config.MELEERANGE) class Range(action.Range): priority = 2 def call(world, entity, targ): damageF = world.config.RANGEDAMAGE Attack.call(world, entity, targ, damageF) def args(stim, entity, config): return Attack.inRange(entity, stim, config.RANGERANGE) class Mage(action.Mage): priority = 2 def call(world, entity, targ): damageF = world.config.MAGEDAMAGE dmg = Attack.call(world, entity, targ, damageF, freeze=True) def args(stim, entity, config): return Attack.inRange(entity, stim, config.MAGERANGE)