def validTarget(ent, targ, rng): if targ is None or not targ.alive: return False if lInf(ent, targ) > rng: return False wild = min(ent.status.wilderness, targ.status.wilderness) if abs(combat.level(ent.skills) - combat.level(targ.skills)) > wild: return False return True
def inRange(entity, stim, config, N): R, C = stim.shape R, C = R // 2, C // 2 rets = set([entity]) 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(): minWilderness = min(entity.status.wilderness.val, e.status.wilderness.val) selfLevel = combat.level(entity.skills) targLevel = combat.level(e.skills) #if abs(selfLevel - targLevel) <= minWilderness: rets.add(e) rets = list(rets) return rets
def call(env, entity, style, targ): #Can't attack if either party is immune if entity.status.immune > 0 or targ.status.immune > 0: return #Check if self targeted if entity.entID == targ.entID: return #Check wilderness level wilderness = min(entity.status.wilderness, targ.status.wilderness) selfLevel = combat.level(entity.skills) targLevel = combat.level(targ.skills) if (env.config.WILDERNESS and abs(selfLevel - targLevel) > wilderness and entity.isPlayer and targ.isPlayer): return #Check attack range rng = style.attackRange(env.config) start = np.array(entity.base.pos) end = np.array(targ.base.pos) dif = np.max(np.abs(start - end)) #Can't attack same cell or out of range if dif == 0 or dif > rng: return #Execute attack entity.history.attack = {} entity.history.attack['target'] = targ.entID entity.history.attack['style'] = style.__name__ targ.attacker = entity dmg = combat.attack(entity, targ, style.skill) if style.freeze and dmg > 0: targ.status.freeze.update(env.config.FREEZE_TIME) return dmg
def packet(self): data = {} data['constitution'] = self.constitution.packet() data['melee'] = self.melee.packet() data['range'] = self.range.packet() data['mage'] = self.mage.packet() data['defense'] = self.defense.packet() data['fishing'] = self.fishing.packet() data['hunting'] = self.hunting.packet() data['cooking'] = self.cooking.packet() data['smithing'] = self.smithing.packet() data['level'] = combat.level(self) return data
def update(self, obs): '''Computes a count-based exploration map by painting tiles as agents walk over them''' for entID, agent in self.realm.realm.players.items(): r, c = agent.base.pos skillLvl = (agent.skills.fishing.level + agent.skills.hunting.level) / 2.0 combatLvl = combat.level(agent.skills) if skillLvl == 10 and combatLvl == 3: continue self.values[r, c, 0] = skillLvl self.values[r, c, 1] = combatLvl
def log(self, ent) -> None: '''Logs agent data upon death This function is called automatically when an agent dies. Logs are used to compute summary stats and populate the dashboard. You should not call it manually. Instead, override this method to customize logging. Args: ent: An agent ''' quill = self.quill blob = quill.register('Population', self.realm.tick, quill.HISTOGRAM, quill.LINE, quill.SCATTER) blob.log(self.realm.population) blob = quill.register('Lifetime', self.realm.tick, quill.HISTOGRAM, quill.LINE, quill.SCATTER, quill.GANTT) blob.log(ent.history.timeAlive.val) blob = quill.register('Skill Level', self.realm.tick, quill.HISTOGRAM, quill.STACKED_AREA, quill.STATS, quill.RADAR) blob.log(ent.skills.range.level, 'Range') blob.log(ent.skills.mage.level, 'Mage') blob.log(ent.skills.melee.level, 'Melee') blob.log(ent.skills.constitution.level, 'Constitution') blob.log(ent.skills.defense.level, 'Defense') blob.log(ent.skills.fishing.level, 'Fishing') blob.log(ent.skills.hunting.level, 'Hunting') blob = quill.register('Equipment', self.realm.tick, quill.HISTOGRAM, quill.SCATTER) blob.log(ent.loadout.chestplate.level, 'Chestplate') blob.log(ent.loadout.platelegs.level, 'Platelegs') blob = quill.register('Exploration', self.realm.tick, quill.HISTOGRAM, quill.SCATTER) blob.log(ent.history.exploration) quill.stat('Population', self.realm.population) quill.stat('Lifetime', ent.history.timeAlive.val) quill.stat('Skilling', (ent.skills.fishing.level + ent.skills.hunting.level) / 2.0) quill.stat('Combat', combat.level(ent.skills)) quill.stat('Equipment', ent.loadout.defense) quill.stat('Exploration', ent.history.exploration)
def __init__(self, realm, pos, iden): super().__init__(realm, pos, iden, 'Hostile', Neon.RED, -3) self.dataframe.init(Static.Entity, iden, pos) self.vision = int(max(self.vision, 1 + combat.level(self.skills) // 10)) self.dataframe.init(Static.Entity, self.entID, self.pos)
def packet(self): data = super().packet() data['level'] = combat.level(self) return data