1
0
Fork 0

Add lighting scroll

This commit is contained in:
Timothy Warren 2022-01-13 14:56:38 -05:00
parent d8654e5db5
commit 5b5f49bf6b
5 changed files with 55 additions and 5 deletions

View File

@ -1,8 +1,11 @@
white = (0xFF, 0xFF, 0xFF)
black = (0x0, 0x0, 0x0)
red = (0xFF, 0x0, 0x0)
player_atk = (0xE0, 0xE0, 0xE0)
enemy_atk = (0xFF, 0xC0, 0xC0)
needs_target = (0x3F, 0xFF, 0xFF)
status_effect_applied = (0x3F, 0xFF, 0x3F)
player_die = (0xFF, 0x30, 0x30)
enemy_die = (0xFF, 0xA0, 0x30)

View File

@ -50,3 +50,31 @@ class HealingConsumable(Consumable):
self.consume()
else:
raise Impossible(f"Your health is already full.")
class LightningDamageConsumable(Consumable):
def __init__(self, damage: int, maximum_range: int):
self.damage = damage
self.maximum_range = maximum_range
def activate(self, action: actions.ItemAction) -> None:
consumer = action.entity
target = None
closest_distance = self.maximum_range + 1.0
for actor in self.engine.game_map.actors:
if actor is not consumer and self.parent.gamemap.visible[actor.x, actor.y]:
distance = consumer.distance(actor.x, actor.y)
if distance < closest_distance:
target = actor
closest_distance = distance
if target:
self.engine.message_log.add_message(
f"A lightning bolt stikes the {target.name} with a loud thunder, for {self.damage} damage!"
)
target.fighter.take_damage(self.damage)
self.consume()
else:
raise Impossible("No enemy is close enough to strike.")

View File

@ -1,6 +1,7 @@
from __future__ import annotations
import copy
import math
from typing import Optional, Tuple, Type, TypeVar, TYPE_CHECKING, Union
from render_order import RenderOrder
@ -70,6 +71,12 @@ class Entity:
self.parent = gamemap
gamemap.entities.add(self)
def distance(self, x: int, y: int) -> float:
"""
Return the distance between the current entity and the given (x,y) coordinate.
"""
return math.sqrt((x - self.x) ** 2 + (y - self.y) ** 2)
def move(self, dx: int, dy: int):
# Move the entity by a given amount
self.x += dx

View File

@ -1,5 +1,5 @@
from components.ai import HostileEnemy
from components.consumable import HealingConsumable
from components import consumable
from components.fighter import Fighter
from components.inventory import Inventory
from entity import Actor, Item
@ -19,7 +19,7 @@ orc = Actor(
name="Orc",
ai_cls=HostileEnemy,
fighter=Fighter(hp=10, defense=0, power=3),
inventory=Inventory(capacity=0)
inventory=Inventory(capacity=0),
)
troll = Actor(
char="T",
@ -27,12 +27,19 @@ troll = Actor(
name="Troll",
ai_cls=HostileEnemy,
fighter=Fighter(hp=16, defense=1, power=4),
inventory=Inventory(capacity=0)
inventory=Inventory(capacity=0),
)
health_potion = Item(
char="!",
color=(127, 0, 255),
name="Health Potion",
consumable=HealingConsumable(amount=4)
consumable=consumable.HealingConsumable(amount=4),
)
lightning_scroll = Item(
char="~",
color=(255, 255, 0),
name="Lightning Scroll",
consumable=consumable.LightningDamageConsumable(damage=20, maximum_range=5),
)

View File

@ -66,7 +66,12 @@ def place_entities(
y = random.randint(room.y1 + 1, room.y2 - 1)
if not any(entity.x == x and entity.y == y for entity in dungeon.entities):
entity_factories.health_potion.spawn(dungeon, x, y)
item_chance = random.random()
if item_chance < 0.7:
entity_factories.health_potion.spawn(dungeon, x, y)
else:
entity_factories.lightning_scroll.spawn(dungeon, x, y)
def tunnel_between(start: Tuple[int, int], end: Tuple[int, int]) -> Iterator[Tuple[int, int]]: